every-surface-follows-what-changed — Every surface follows what changed in the repository by push, and a surface that does not says so
Executions are a monitor source; the Observatory is told over /events; a write by any client reaches the workspace; every live surface states its transport in ADR 0158's words; a follower converges after loss; a kiosk keeps following for days.
PLANNED 0 of 8 issues done
- ready
- 5
- blocked
- 3
- active
- 0
- verify
- 0
- done
- 0
- cancelled
- 0
Problem
docs/MONITOR.md says executions are not a monitor source yet; on master /events carries executions only, /ui refreshes on a 60 s timer (share/ui/ui.js), and the Observatory asks /api/v1/observatory/events with a cursor on an interval (share/ui/observatory.js). Each surface words its liveness differently, and an intent proposed from a terminal reaches an open /ui/idd only on that timer. Proposed in ADR 0216 (Every live surface follows one channel with named follow streams, and nothing polls where a stream exists) (proposed; it carries no authority until the owner accepts it). Sources: chatgpt-majordomus:c294#3, chatgpt-majordomus:c294#7, chatgpt-majordomus:c260#8, chatgpt-majordomus:c208#73, chatgpt-majordomus:c260#0, chatgpt-majordomus:c232#6.
Outcome
Executions are a monitor source; the Observatory is told over /events; a write by any client reaches the workspace; every live surface states its transport in ADR 0158's words; a follower converges after loss; a kiosk keeps following for days.
Current state
Verified on master 707a04c7ce8: apps/majordomus-cli/src/monitor has the executor, github and mesh sources; apps/majordomus-cli/src/http/events.rs serves executions; share/ui/observatory.js polls by cursor and words REPLAY, SNAPSHOT, RESYNCED, LIVE and STALE for itself. In flight, not on master: PR #1178 (observatory-stream.js) and 5a's follow channel I2980-I2983.
Desired state
Each criterion of every-surface-follows-what-changed is carried by one issue here and proven by the case its issue's evidence_required names, on the one /events channel.
Scope
- apps/majordomus-cli/src/monitor
- apps/majordomus-cli/src/execution/store.rs
- apps/majordomus-cli/src/http/events.rs
- apps/majordomus-cli/src/mesh/journal.rs
- share/ui
- share/cockpit
- apps/majordomus-cli/src/ui/view.rs
- apps/majordomus-cli/src/cockpit/view.rs
- docs/MONITOR.md
- docs/MAJORDOMUS_UI.md
Out of scope
- Web Push notifications outside the browser
- Live state on the published site
Acceptance criteria
- An execution started from the CLI appears in majordomus monitor and on an open /cockpit/monitor
- The Observatory says LIVE only while a socket is delivering
- An intent proposed from a terminal reaches an open /ui/idd without a reload
- A fault-injection case ends every follower equal to a fresh snapshot
Validation
- majordomus plan validate
- majordomus intent explain every-surface-follows-what-changed
Risks
- I3220 needs I2981's crate::change, and I3218's pushed half joins when I2981 lands; neither id can be a depends_on until its record reaches master, so the coordinator holds I3220 until then
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 |
|---|---|---|---|---|
| I3218 | READY | 0 | — | The execution ledger is a source of the monitor, so a run started anywhere is followed everywhere |
| I3219 | READY | 0 | — | The Observatory is told what happened over the live channel, and asks only when it cannot be told |
| I3220 | READY | 3 | I2783 | An intent proposed or an issue moved by any client reaches an open intent workspace without a reload |
| I3221 | BLOCKED | 1 | I3219 | Every live surface says in ADR 0158's words whether it is live, reconnecting, stale, polling, a snapshot or a replay |
| I3222 | READY | 0 | — | A follower whose frames are lost, delayed or reordered, or whose peer is partitioned, ends equal to a fresh snapshot |
| I3231 | BLOCKED | 1 | I3219 | The Observatory shows its own stream health: lag, dropped frames, resyncs and frame rate |
| I3232 | READY | 0 | — | A kiosk left running for days shifts its marks against burn-in and recovers from a lost drawing context |
| I3431 | BLOCKED | 4 | I3220 | A record a process outside the server writes (a knowledge record reaching the index, a ledger line or a captured prompt) reaches an open view within one heartbeat, without a reload |
The graph
flowchart LR
I3218["I3218<br/>The execution ledger is a source of the monitor, so a run started anywhere is followed everywhere"]:::ready
I3219["I3219<br/>The Observatory is told what happened over the live channel, and asks only when it cannot be told"]:::ready
I3220["I3220<br/>An intent proposed or an issue moved by any client reaches an open intent workspace without a reload"]:::ready
I3221["I3221<br/>Every live surface says in ADR 0158's words whether it is live, reconnecting, stale, polling, a snapshot or a replay"]:::blocked
I3222["I3222<br/>A follower whose frames are lost, delayed or reordered, or whose peer is partitioned, ends equal to a fresh snapshot"]:::ready
I3231["I3231<br/>The Observatory shows its own stream health: lag, dropped frames, resyncs and frame rate"]:::blocked
I3232["I3232<br/>A kiosk left running for days shifts its marks against burn-in and recovers from a lost drawing context"]:::ready
I3431["I3431<br/>A record a process outside the server writes (a knowledge record reaching the index, a ledger line or a captured prompt) reaches an open view within one heartbeat, without a reload"]:::blocked
I3219 --> I3221
I3219 --> I3231
I3220 --> I3431
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 (8)
- I3218 The execution ledger is a source of the monitor, so a run started anywhere is followed everywhere
- I3219 The Observatory is told what happened over the live channel, and asks only when it cannot be told
- I3220 An intent proposed or an issue moved by any client reaches an open intent workspace without a reload
- I3221 Every live surface says in ADR 0158's words whether it is live, reconnecting, stale, polling, a snapshot or a replay
- I3222 A follower whose frames are lost, delayed or reordered, or whose peer is partitioned, ends equal to a fresh snapshot
- I3231 The Observatory shows its own stream health: lag, dropped frames, resyncs and frame rate
- I3232 A kiosk left running for days shifts its marks against burn-in and recovers from a lost drawing context
- I3431 A record a process outside the server writes (a knowledge record reaching the index, a ledger line or a captured prompt) reaches an open view within one heartbeat, without a reload
Canonical record: .ai/repo/project/milestones/every-surface-follows-what-changed.yaml. Read it back with majordomus plan show every-surface-follows-what-changed.