Skip to content

Passive Group-scoped overdue Mail summary #179

Closed

Description

@chriscoveries

On a Group's Mail view, an operator can currently see unread Mail per Actor but has no single read that answers "which Actors still have direct Mail awaiting them past an age cutoff, how many, and where is the oldest?"

The proposed primitive is one Group-scoped read, mail_overdue_summary, taking group_id and required positive after_seconds, returning per-Actor awaiting_count, overdue_count, oldest_overdue_at, oldest_source_event_id, unaged_count, plus evaluated_at. It reuses the existing awaiting predicate (read cursor, reply, accepted/ambiguous delivery) and NoticeState source resolution, so "awaiting" means the same thing as production notices. It does not deliver, page, or change state. Overdue age starts at the Mail source timestamp. Rows are only Actors with an overdue or unaged item; all current non-internal Actors including stopped/disabled are eligible. Access follows existing Group transport and inbox authorization; a peer's own-inbox permission does not grant other Actors' rows. No background sampler, no new permission, no cross-Group aggregation.

Thank you to the maintainer for the #166 direction (passive Group observation) and #165 (production NoticeState path). Related: #162, #171. We will not ask cccc to implement escalation, reminders, or foreman policy in core.

How we checked

On our staging instance (cccc 0.4.44; KVM guest, 8 vCPU Intel Skylake, 15 GiB RAM, Debian 13), with real Group data and a 900-second cutoff:

  • Three real direct Mail items were unread, unreplied and had no accepted or ambiguous delivery. They were 7 to 11 days old, and one was addressed to a stopped Actor.
  • inbox_peek lists them one recipient at a time. The Mail view shows unread badges and a filter.
  • Nothing gives the Group-level answer: there is no caller cutoff, no per-Actor overdue count and no oldest item.
  • Nothing was sent or read during the check.

Activity

  1. ChesterRa commented on Oct 27, 2026

    @ChesterRa
    Owner

    Thanks for narrowing this to the passive, Group-scoped read discussed in #166, and for checking it against real waiting Mail. This looks useful; a PR within that scope would be welcome.

    Please keep the existing user/foreman permission for a Group-wide Inbox view, current-generation awaiting semantics, and eligibility for stopped and disabled Actors. Age should come from the original Mail timestamp, independently of notice delivery or Actor restarts.

    Please reuse the existing incremental projection, without adding a full-history scan on each poll, notifications, or background sampling. IPC and CLI are enough for this external-tool use case; no default MCP tool is needed.

    I would leave out unaged_count for now unless you have a concrete source-timestamp case it needs to represent. Please define the cutoff boundary and exercise the real daemon path for permissions, read/replied/delivered Mail, stopped Actors, and generation changes. Tests should distinguish delivery of the Mail itself from delivery of its notice. The IPC standard should document the resulting contract.

    Escalation, reminders, and foreman policy can stay outside core, as you propose.

  2. chriscoveries commented on Nov 3, 2026

    @chriscoveries
    ContributorAuthor

    Implemented in #183 (merged 2026-10-30, released in v0.4.46). Closing. Thank you for scoping it so clearly.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions