roster registered:true outlives the process; gate blackboard_open on poll freshness
Elazar directive relayed by coder-mars-cc 2026-09-05: roster registered:true asserts liveness it cannot back. A row exists forever once created, so registered:true survives the process, and both blackboard_open (admission gate) and send (delivery target) accept it silently. Live case: bb-coder-mars-cc-mtnvvv7h-qqil1u named audit-mars-ca, 5 of 6 wrote, the entry can never complete. MEASURED CORRECTION to the report: audit-mars-ca is not long-gone - last_poll_at 2026-09-05 04:14:51Z, 25 minutes stale at measurement, while every live mars agent polled within 1s. The row was honest at open time by any month-scale test, so the discriminator has to be minutes, not days. Fix, two parts. (1) Derive a live boolean from last_poll_at freshness wherever the hub reports registration - roster, online, and aro_list registered map - rather than from row existence. Do NOT expire or delete roster rows: they carry ARO membership, mailbox forwards and cursors, and deleting them loses all three. (2) blackboard_open REFUSES, not flags, a respondent whose last_poll_at is stale, naming each stale agent and its poll age, because that call hard-blocks on the answer. Suggested threshold: reuse the existing LLMMSG_STUCK_POLL_FRESH_S semantics, default 300s - the shim polls every few seconds, so 300s is generous and would have caught this at 25 minutes. pinned=0 on this row; pinned agents must stay exempt. See memory wake-registration-is-not-liveness: last_poll_at is the honest field, not last_seen.
Activity
-
was: Elazar directive relayed by coder-mars-cc 2026-09-05: roster.registered asserts liveness it cannot back. A row exists forever once created, so registered:true survives the process, and both blackboard_open (admission gate) and send (delivery target) accept it silently. Live case: bb-coder-mars-cc-mtnvvv7h-qqil1u named audit-mars-ca, 5 of 6 wrote, the entry can never complete. MEASURED CORRECTION to the report: audit-mars-ca is not long-gone - last_poll_at 2026-09-05 04:14:51Z, 25 minutes stale at measurement, while every live mars agent polled within 1s. So the row was honest at open time by any month-scale test; the discriminator has to be minutes, not days. Fix, two parts: (1) derive a boolean from last_poll_at freshness wherever the hub reports registration - roster, online, aro_list's registered map - rather than from row existence; do NOT expire or delete roster rows, they carry ARO membership, mailbox forwards and cursors, and deleting them loses all three. (2) blackboard_open REFUSES (not flags) a respondent whose last_poll_at is stale, naming each stale agent and its poll age, because that call hard-blocks on the answer. Suggested threshold: reuse the existing LLMMSG_STUCK_POLL_FRESH_S semantics, default 300s - the shim polls every few seconds, so 300s is generous and would have caught this at 25 min. Note pinned=0 on the row; pinned agents must stay exempt. Existing memory: wake-registration-is-not-liveness (last_poll_at is the honest field, not last_seen).