STATE-WP-0093: per-recipient broadcast receipts and standing notices (T01-T06).
All checks were successful
CI Smoke / host-smoke (push) Successful in 0s
CI Smoke / container-smoke (push) Successful in 2s
Build and Publish Multi-Context Image / build-and-push (push) Successful in 53s

Founder approved T01 on 2026-09-22 (D2, D3, D6 as recommended).
- T02: message_receipts table; kind/expires_at/supersedes_id on
  agent_messages; migration d7e8f9a0b1c2 archives existing broadcasts,
  leaves direct messages untouched, reversible.
- T03: reader-aware mark-read (unattributed broadcast mark-read is a
  metered, deprecated no-op), delivery receipts on the scoped unread inbox,
  POST /messages/{id}/ack, news/standing kinds, expiry, supersede, broadcast
  archive no longer stamps read_at, reply writes the replier's receipt.
- T04 (state-hub part): Codex MCP reader param and acknowledge_notice;
  hub-core part handed off (message 69fc387c).
- T05: GET /messages/notices, standing_notices in /state/summary,
  dashboard standing-notices panel.
- T06: 17 new tests; full suite green.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>

Assistant: claude-code
Assistant-Model: opus
Assistant-Process: 63291@bnt-lap001
Assistant-Session: 8bd77868-ca68-4f49-bb1e-d539ecc0d703
This commit is contained in:
tegwick 2026-09-22 00:26:33 +02:00
parent 740068fcf1
commit ef541f58cf
18 changed files with 1256 additions and 52 deletions

View file

@ -9,6 +9,7 @@ def test_codex_server_has_only_repository_coordination_tools() -> None:
"get_domain_summary",
"get_messages",
"mark_message_read",
"acknowledge_notice",
"add_progress_event",
"record_decision",
"update_task_status",
@ -17,3 +18,18 @@ def test_codex_server_has_only_repository_coordination_tools() -> None:
def test_codex_server_uses_distinct_server_identity() -> None:
assert codex_server.mcp.name == "dev-hub-codex"
def test_mark_message_read_passes_reader(monkeypatch) -> None:
calls = []
monkeypatch.setattr(
codex_server, "_request", lambda method, path, body=None: calls.append((method, path, body)) or {}
)
codex_server.mark_message_read("abc", reader="state-hub")
codex_server.mark_message_read("abc")
codex_server.acknowledge_notice("abc", "state-hub")
assert calls == [
("PATCH", "/messages/abc/read?reader=state-hub", {}),
("PATCH", "/messages/abc/read", {}),
("POST", "/messages/abc/ack", {"agent": "state-hub"}),
]