basquetWi + New ticket
llmmsg-srv MSG-332

wasteNot-adjacent: hub blackboard kind (independent-write brainstorm alternative)

Done high clcoder-llmmsgsrv-cc

New brainstorm kind: opt-in, independent-write coordination, replacing DM fan-out for the questions that don't need reaction. Two live trials this session validated it (coder02-terra-cc, 4 lanes/filesystem; pm-llmmsgsrv-cc, 4-agent panel on real Postgres-role questions for Elazar) — this epic captures what those trials proved and specs the hub-native build. SPEC, derived from the trials: 1. Storage: v2.sqlite table (new, e.g. blackboard_entries + blackboard_responses), not a filesystem dir. Server-set write timestamp on each response row — this is the fix for the one real weakness the first trial surfaced: file-per-agent self-reported ordering is unverifiable after the fact ('I wrote before reading' is agent-honesty, not provable). A DB row with a server clock is. 2. Additive, not a replacement: existing brainstorm (DM fan-out, close_quorum) stays for reactive cases — agents genuinely needing to see and respond to each other. Blackboard is for independent-judgment questions only. Both trials were explicitly non-reactive; neither trial tested the reactive case, so don't assume this generalizes there. 3. Opener creates an entry, names the expected respondent set, hub does ONE notify per respondent (batched respecting ARRAY_BLAST_MAX=4 — a panel over 4 needs multiple notify batches, same as any other multi-recipient send). 4. Respondents write once. Hub does not expose other respondents' answers to a respondent who has not yet written their own — enforce independence structurally at read-time, not just by instruction (the second trial only had voluntary compliance; a real adversarial case wouldn't). 5. Completion: hub closes the entry and notifies the OPENER exactly ONCE, when the full expected set has written — same close_quorum shape existing brainstorm already has. CRITICAL DESIGN CONSTRAINT, learned live this session by getting corrected by Elazar mid-trial: the hub must NOT push a per-response event to the opener as each respondent writes. That recreates the exact N-multiplier cost blackboard exists to remove, just moved one hop downstream (agent-to-agent chatter becomes opener-to-human chatter). Only the single completion (or timeout) event reaches the opener. 6. Timeout/escalation, same shape as the existing brainstorm-never-hang rule: an entry not complete after N minutes (default 4, Elazar-set this session) triggers ONE straggler DM from the hub (or the opener, TBD which layer) asking status, not a broadcast. If that gets no reply, fall to the fleet's agent-liveness diagnostic (ask bin-venus-cc for the current canonical script/path — do not hardcode a name that may have moved) to distinguish idle/compacting/wedged/dead before treating it as a real block. 7. Real validation from trial 1: forced independence produced a genuine find (a lane read the actual INSERT function and found zero array validation, reframing the whole question) that a DM thread's first-responder framing would likely have suppressed. Worth keeping as the design's stated rationale, not just the cost argument. Trial artifacts: /data-venus/terra/brainstorm/2026-09-02-terra136/ (trial 1), /data-venus/llmmsg-srv/blackboard/2026-09-02-pgroles-q1q2/ (trial 2, real Postgres-role decision for Elazar, 4/4 responded, unanimous, useful result — proof this works on live decision-relevant questions, not just synthetic ones).

Activity

  • wi-cli-venus created · 6w ago
  • wi-cli-venus statusChanged · 6w ago
    Broken into 5 children: MSG-333 schema, MSG-334 routes, MSG-335 notify, MSG-336 timeout, MSG-337 verification. Starting on MSG-333.
  • wi-cli-venus note · 4w ago
    SHIPPED - closing this subtree on live evidence, not recollection. Hub/shim at 2.59.12 (blackboard landed 2.57.0). The blackboard tool surface is present and callable on the shim right now: blackboard_open, blackboard_write, blackboard_read, blackboard_amend, blackboard_decline, blackboard_extend, blackboard_add_respondent, blackboard_drop_respondent. That covers MSG-333 (schema), MSG-334 (routes + read-time independence gate), MSG-335 (batched + exactly-once completion notify), MSG-336 (timeout/straggler/liveness) and MSG-341 (shim trio). Closing 332-336 and 341. WHAT IS NOT CLOSED, and why these stay open as their own rows rather than reopening the epic: MSG-378 (straggler nudge reaches only the silent agent, never the opener who can unblock it), MSG-381 (post-close read is roster-gated, so any registered agent holding an entry_id reads every body), MSG-339, MSG-340, MSG-343, MSG-356, MSG-357, MSG-382. Those are defects IN a shipped feature, which is a different queue from unbuilt work - leaving the epic inProgress to carry them made a delivered capability read as unfinished for weeks. Status hygiene note, the reason this sat: these rows were inProgress against coder-llmmsgsrv-cc, an agent now absent from the roster. inProgress against an absent assignee reads as stalled work when it is either DONE or UNSTAFFED, and nothing in the tracker distinguishes those.
  • wi-cli-venus completed · 4w ago
    completed
epic
6w ago by wi-cli-venus
4w ago
2026-09-12 00:48