peer-blackboard — The peer blackboard is one projection, pushed live to every surface
One capability computes the blackboard from the records that exist; a change of the board or the journal is pushed over one WebSocket to every page that follows it, with the monitor's cursor for resume; /ui, /cockpit and the home page read the same frames; the published site carries a public-safe snapshot labelled as one.
PLANNED 0 of 9 issues done
- ready
- 1
- blocked
- 8
- active
- 0
- verify
- 0
- done
- 0
- cancelled
- 0
Problem
Who is working on what is already recorded — the board of every checkout (peers.list, gathered per ADR 0044), the mesh journal (sessions, claims, reviews, handovers per ADR 0067) and the monitor's folded signals (ADR 0133) — but no surface shows it as one picture and none shows it live. /cockpit/peers renders peers.list once and never changes; /ui has no peers screen; /cockpit/monitor polls the whole monitor every five seconds; the only WebSocket, /events, carries executions and nothing else; and nothing between the board, the journal and the socket says that anything changed. The unmerged ADR 0162 draft proposed a board channel for the kiosk alone and was never implemented.
Outcome
One capability computes the blackboard from the records that exist; a change of the board or the journal is pushed over one WebSocket to every page that follows it, with the monitor's cursor for resume; /ui, /cockpit and the home page read the same frames; the published site carries a public-safe snapshot labelled as one.
Current state
peers.list, mesh.state and monitor.stream answer separately; /cockpit/peers is static; /cockpit/monitor polls; socket.js follows executions only.
Desired state
blackboard.snapshot answers on every interface; a board or journal change reaches a connected page in under a second on this machine; every surface that shows peers reads that one projection.
Scope
- apps/majordomus-cli/src/commands/blackboard.rs
- apps/majordomus-cli/src/capability/builtin/blackboard.rs
- apps/majordomus-cli/src/http
- apps/majordomus-cli/src/ui
- apps/majordomus-cli/src/cockpit
- share/cockpit
- share/ui
- docs/BLACKBOARD.md
- test/cases
Out of scope
- A second peer registry, a message store or a broker; a peer message kind is added to the journal only when reviews and handovers are shown not to carry what peers send each other
- A public WebSocket into a private mesh, or credentials in a published bundle
- Presence for a provider (OpenAI Dots included) that exposes no supported, authenticated event source
Acceptance criteria
- blackboard.snapshot answers the same projection over the command line, HTTP and MCP, with completeness, sources, workers, conflicts, reviews, handovers, typed relations and signals
- A board or journal change is pushed to a connected page over one WebSocket that resumes from the monitor's cursor and resynchronises when the cursor cannot be served
- /ui/peers, the /ui home panel, /cockpit/peers and the home page read the same frames, and say live, reconnecting, offline or snapshot truthfully
- The published site shows a public-safe snapshot of the blackboard with its revision, and no private path, message body or scope
Validation
- majordomus plan validate
- bash test/run.sh 3380_the_blackboard_is_one_projection
Risks
- The monitor rereads the whole journal on every page; pushing it on every change multiplies that cost by the subscribers unless one computation is shared by all of them.
- A worker's board session and its own mesh session are two records; joining them by anything weaker than an identifier invents a person.
Issues
Each one is an execution contract with its own acceptance criteria, validation command and required evidence. The wave column is the layer of the dependency graph it sits in.
| issue | status | wave | depends on | title |
|---|---|---|---|---|
| I2980 | READY | 0 | — | The blackboard is one projection answered on every interface |
| I2981 | BLOCKED | 1 | I2980 | A board or journal change is pushed over one WebSocket |
| I2982 | BLOCKED | 2 | I2981 | The monitor page is pushed over the live channel, and says when it polls |
| I2983 | BLOCKED | 3 | I2982 | /ui/peers shows the blackboard and is read again when it changes |
| I2984 | BLOCKED | 4 | I2983 | The published site shows a public-safe blackboard, labelled as the snapshot it is |
| I2985 | BLOCKED | 4 | I2983 | The Observatory's cooperation scene draws the blackboard, not a second join of the journal |
| I2998 | BLOCKED | 4 | I2983 | /cockpit/peers renders the blackboard and follows it live |
| I2999 | BLOCKED | 4 | I2983 | From /ui/peers an operator answers a review, takes a handover or releases a claim, through its capability |
| I3073 | BLOCKED | 4 | I2983 | The home page and the docs explain the peer blackboard: live on a runtime, a labelled snapshot on the published site |
The graph
flowchart LR
I2980["I2980<br/>The blackboard is one projection answered on every interface"]:::ready
I2981["I2981<br/>A board or journal change is pushed over one WebSocket"]:::blocked
I2982["I2982<br/>The monitor page is pushed over the live channel, and says when it polls"]:::blocked
I2983["I2983<br/>/ui/peers shows the blackboard and is read again when it changes"]:::blocked
I2984["I2984<br/>The published site shows a public-safe blackboard, labelled as the snapshot it is"]:::blocked
I2985["I2985<br/>The Observatory's cooperation scene draws the blackboard, not a second join of the journal"]:::blocked
I2998["I2998<br/>/cockpit/peers renders the blackboard and follows it live"]:::blocked
I2999["I2999<br/>From /ui/peers an operator answers a review, takes a handover or releases a claim, through its capability"]:::blocked
I3073["I3073<br/>The home page and the docs explain the peer blackboard: live on a runtime, a labelled snapshot on the published site"]:::blocked
I2980 --> I2981
I2981 --> I2982
I2982 --> I2983
I2983 --> I2984
I2983 --> I2985
I2983 --> I2998
I2983 --> I2999
I2983 --> I3073
classDef done stroke:#16a34a,fill:#dcfce7,color:#14532d,stroke-width:2px
classDef active stroke:#2563eb,fill:#eff6ff,color:#1e3a8a,stroke-width:2px
classDef verify stroke:#7c3aed,fill:#f5f3ff,color:#4c1d95,stroke-width:2px
classDef ready stroke:#0891b2,fill:#ecfeff,color:#164e63,stroke-width:2px
classDef planned stroke:#0891b2,fill:#ecfeff,color:#164e63,stroke-width:2px
classDef blocked stroke:#b45309,fill:#fffbeb,color:#78350f,stroke-width:2px
classDef cancelled stroke:#6b7280,fill:#f9fafb,color:#374151,stroke-width:2px
classDef superseded stroke:#6b7280,fill:#f9fafb,color:#374151,stroke-width:2pxLinked from this diagram (9)
- I2980 The blackboard is one projection answered on every interface
- I2981 A board or journal change is pushed over one WebSocket
- I2982 The monitor page is pushed over the live channel, and says when it polls
- I2983 /ui/peers shows the blackboard and is read again when it changes
- I2984 The published site shows a public-safe blackboard, labelled as the snapshot it is
- I2985 The Observatory's cooperation scene draws the blackboard, not a second join of the journal
- I2998 /cockpit/peers renders the blackboard and follows it live
- I2999 From /ui/peers an operator answers a review, takes a handover or releases a claim, through its capability
- I3073 The home page and the docs explain the peer blackboard: live on a runtime, a labelled snapshot on the published site
Canonical record: .ai/repo/project/milestones/peer-blackboard.yaml. Read it back with majordomus plan show peer-blackboard.