Skip to content

Add passive Group overdue Mail summary - #183

Merged
ChesterRa merged 9 commits into
ChesterRa:mainfrom
chriscoveries:overdue-mail-summary-20261029
Oct 30, 2026
Merged

ChesterRa merged 9 commits into
ChesterRa:mainfrom
chriscoveries:overdue-mail-summary-20261029

Conversation

@chriscoveries

Copy link
Copy Markdown
Contributor

Implements the passive overdue-Mail summary requested in #179, so operators can find overdue Mail across a Group without consuming individual Inboxes.

Adds inbox_summary IPC and cccc inbox-summary --cutoff <RFC3339> under the existing user/Foreman Group-wide Inbox permission. The response reports per-Actor awaiting and overdue counts, the oldest awaiting Mail timestamp, the cutoff, and a separate server observation time. The cutoff is inclusive (original Mail timestamp <= cutoff) and must be no later than the returned observation time. Stopped and disabled Actors remain eligible.

Awaiting is scoped to the recipient's current generation. Reads, eligible replies, and accepted or ambiguous delivery of the Mail itself clear awaiting status; notice delivery does not. Queries return metadata without advancing read cursors or starting Actors. The summary reuses the incremental Inbox projection and indexes unresolved Mail; warm polls do not scan history, including when a pending read marker remains. The IPC standard documents the contract.

Validation at 90d50842fb89b243ef6da586b914e3152b64d9b4:

  • Full fork CI passed, including Linux, Windows and macOS jobs. Real-daemon IPC/CLI coverage includes permissions, cutoff equality, stopped/disabled Actors, reads, replies, generation changes and compaction. A daemon worker test distinguishes accepted Mail delivery from notice delivery.
  • Reducer controls cover ambiguous delivery and malformed/future timestamps. Pending-read recovery controls check warm-poll scan/rebuild counters and unchanged cursor/marker bytes.
  • An independent stage ran the exact fork-built binary against an isolated copy of real Group Mail state. The summary matched the offline oracle for the tested recipient, including the original oldest timestamp and cutoff equality. User/Foreman access, Peer refusal, stopped/disabled inclusion, passive cursor preservation and same-ID generation reset passed. The daemon shut down cleanly and the temporary copy was removed after review. Delivery and reply settlement were covered separately by the daemon tests above.

Stage environment: Debian GNU/Linux 13 (trixie), Linux 6.12.101+deb13-cloud-amd64, x86_64; 8 guest-visible CPUs reporting Intel Xeon Processor (Skylake, IBRS, no TSX) and MemTotal 15,995,720 kB. The tested binary was built with Rust 1.88.0 for x86_64-unknown-linux-gnu.

@ChesterRa
ChesterRa merged commit 9e320f3 into ChesterRa:main Oct 30, 2026
7 checks passed
ChesterRa added a commit that referenced this pull request Oct 30, 2026
Prepare v0.4.46. The version, changelog, release notes and the three README
highlights cover the work since v0.4.45, including changelog entries that
five earlier commits left out: native sessions, subtask progress,
`effective_scope` in `actor_list`, the OpenCode V2 migration and the more
compact Web chat. The README highlights link the release notes on the
documentation site, so the link also works where `docs/` is not shipped, as
in the standalone archive.

Keep the Mail summary merged from #183 from making cold Inbox projections
quadratic. As merged, each read in a cold rebuild walked the Mail before it,
which also slowed the existing `inbox_peek`, `list_unread` and `inbox_read`:
with 8,000 alternating Mail and read pairs in a synthetic debug run, a cold
`list_unread` took 8.1 s, against 0.24 s before the merge. Each read boundary
is now resolved once, when its event's position is recorded, and pending
Mail through the latest boundary is dropped as a prefix; the same run takes
0.36 s. Tests also cover that repeat notices still skip broadcast Mail and
still reach targeted Mail.

When the Web server and the daemon report different versions, the Web shows
a dismissible notice with both versions and guidance, and a `cccc daemon
start`, `cccc web` or `cccc --headless` that reuses a daemon of another
version prints a diagnostic without replacing it. When the running daemon has
no Waiting for you, the Web says so and keeps the counts unknown rather than
zero; its recovery steps name the running daemon, since restarting only the
Web can leave it in place.

While the task board is searched, a card whose match is not near the start
of its title or summary quotes the matched words from the task's title,
notes, outcome or hidden handoff. Moving a card now changes only its status,
and opening a task loads its current details first, so edits made elsewhere
are not overwritten. Touch gestures on a card's handle stay with dragging.

Also:
- Keys pressed while an input method composes Chinese or Japanese text stay
  with the input method instead of picking an item from an open @ or / menu.
- Bold, italic and strikethrough text that ends in full-width punctuation
  now renders in Chinese and Japanese messages, and the page declares its
  interface language in `<html lang>`.
- Reply progress tells a cancelled request apart from a replied one.
- On narrow screens the message box names a send mode other than plain Send,
  and the menu says how to make Send + reply available when it cannot be
  used.
- Loading notices, recipient status symbols and the search reply button
  follow the interface language.
- The offer to turn on system notifications is easier to notice, and a
  viewport change no longer moves the focus from an open dialog to the
  message box.
- Launch tests without a subcommand let the Web listener choose its port.

Validation: Rust formatting, workspace Clippy and tests in isolated CCCC and
provider homes (3315 passed); Web check, 3559 tests and build; Python checks
and 116 tests; packaged Linux smoke in isolated homes with desktop and phone
rendering and served Web assets matching the build; cargo check of the
merged PR commit.
@chriscoveries
chriscoveries deleted the overdue-mail-summary-20261029 branch November 3, 2026 17:02
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants