Goal
Land the inbox_items substrate, an event→inbox promotion job, a hand-tuned v0 priority scorer, dedupe/merge, and explain_priority provenance — the layer the read-only Overseer will consume.
Spec
docs/plans/2026-06-03-overseer-build-sequence.md Step 2.5 (primary)
docs/plans/2026-06-03-overseer-contracts.md §3 (inbox item model), §1 (attention_candidate promotion gate), §11 (provenance for Overseer speech)
docs/plans/2026-06-03-overseer-prioritization.md §5 (scoring loop, v0 simplifications), "Foundational formulas (sketch)"
- Upstream alignment: in discussion Voice roadmap: picker -> provider abstraction -> local stack -> fleet command centre tiann/hapi#691 tiann named the control-plane attention events as "permission requests, blocked sessions, completions"; the public reply committed to "building the priority model (permission > blocked > completion) first." The v0 scorer defaults must encode exactly that ordering.
Acceptance
Out of scope
Dependencies
Suggested PR breakdown
1-2 PRs: inbox schema migration; promotion job + v0 scorer; explain_priority.
Risks
- Filter quality has no obvious bootstrap: the salience model starts with zero feedback signal and the first weeks it will get prioritization wrong. Mitigations: conservative defaults (under-surface rather than over-surface), explicit operator feedback commands (prioritization §5), short-term human-curated category weights.
Goal
Land the
inbox_itemssubstrate, an event→inbox promotion job, a hand-tuned v0 priority scorer, dedupe/merge, andexplain_priorityprovenance — the layer the read-only Overseer will consume.Spec
docs/plans/2026-06-03-overseer-build-sequence.mdStep 2.5 (primary)docs/plans/2026-06-03-overseer-contracts.md§3 (inbox item model), §1 (attention_candidatepromotion gate), §11 (provenance for Overseer speech)docs/plans/2026-06-03-overseer-prioritization.md§5 (scoring loop, v0 simplifications), "Foundational formulas (sketch)"Acceptance
inbox_itemstable (per contracts §3) + a join/index path fromevents.idtoinbox_items.source_event_ids.attention_candidate = 1per the taxonomy.base_priorityper event_type + linear aging. No salience learning; no per-operator weights (schema designed for them, not active).permission_request/approval_requested>blocked>needs_decision>completed(withoperator_action_required) > everything else — matching the maintainer's stated control-plane priority model (discussion Voice roadmap: picker -> provider abstraction -> local stack -> fleet command centre tiann/hapi#691). The ordering is config-driven so it can be tuned, but ships with this default.dedupe_keycollapses repeated emissions into one inbox item, aggregatingsource_event_ids;event_linksgraph walked for root-cause merging (5 workersblocked_bythe same upstream → one fleet-level inbox item).explain_priority(item_id)computes and stores the reason-for-priority string (event IDs, aging contribution, time-criticality bumps) at scoring time, so the Overseer recites the reasoning rather than reverse-engineering it.Out of scope
Dependencies
Suggested PR breakdown
1-2 PRs: inbox schema migration; promotion job + v0 scorer;
explain_priority.Risks