everything-is-followed-in-one-stream — Everything that happens in the repository is followed in one stream
majordomus monitor is the one stream: a typed, cursor-paged feed of signals from every source, with the heartbeat noise folded away and what is addressed to the reader marked and listed first, served by the running server over HTTP, MCP and the command line (with --follow), shown live in the Cockpit, printed at every session start, named by the provider bootstrap, documented and released.
ACTIVE 3 of 8 issues done
- ready
- 3
- blocked
- 2
- active
- 0
- verify
- 0
- done
- 3
- cancelled
- 0
Problem
A worker that wants to know what is happening around it reads six surfaces with six cursors: the mesh journal (where about 95% of events are identical session re-projections on every heartbeat), the board, the executor trail, the executions, and GitHub's pull requests and checks through gh. Nothing joins them, nothing says which of it is addressed to the reader, and every session that needs it hand-rolls a jq loop over majordomus mesh events and gh pr list. Sessions miss reviews and handovers addressed to them for hours because nothing they read shows them.
Outcome
majordomus monitor is the one stream: a typed, cursor-paged feed of signals from every source, with the heartbeat noise folded away and what is addressed to the reader marked and listed first, served by the running server over HTTP, MCP and the command line (with --follow), shown live in the Cockpit, printed at every session start, named by the provider bootstrap, documented and released.
Current state
No monitor command, module or capability exists (origin/master 890e112d04, 0.20.0). mesh.events, peers, integration.events and executions.events each answer their own page; the CLI renders mesh events one by one, unfiltered.
Desired state
One read capability, monitor, answers a page of signals after an opaque cursor across mesh, board, executor and executions (and GitHub when reachable, as a reported source state otherwise); majordomus monitor --follow streams it; /cockpit/monitor shows it live; the start briefing and majordomus context say what happened since the last look.
Scope
- .ai/repo/adrs
- .ai/repo/project
- .ai/repo/providers
- apps/majordomus-cli/src/monitor
- apps/majordomus-cli/src/capability/builtin
- apps/majordomus-cli/src/commands
- apps/majordomus-cli/src/cli
- apps/majordomus-cli/src/cockpit
- apps/majordomus-cli/tests
- lib
- docs
- site
- test/cases
- README.md
- AGENTS.md
- CLAUDE.md
Out of scope
- Writing anything: the monitor reads; acting on a signal stays with the capability that owns the act
- A second journal or event store: every signal is derived from a source that already records it
- Push notifications to systems outside the repository (Slack, mail); a notifier subscribes to the stream later
Acceptance criteria
- One capability answers a page of signals from mesh, board, executor trail and executions after an opaque cursor, and the next page after the answer's cursor repeats nothing
- A session_opened that only re-projects an unchanged session is counted as suppressed and never shown; a new session or a changed intent is shown
- Signals addressed to the reader are marked for_you and listed first in a briefing
- majordomus monitor --follow streams new signals and --count/--until let a script wait for one and exit
- An unreachable source is reported with its reason, never answered as empty
- The Cockpit shows the stream live, and the start briefing and majordomus context print what happened since the last look
- The provider bootstrap names the command; docs/MONITOR.md, the README and a blog article describe it; the release carries it
Validation
- bin/majordomus plan validate
- cargo test --lib monitor
- cargo test --test monitor_stream
- MJ_TEST_JOBS=4 bash test/run.sh 1050 1051 1052 1053 1054
- majordomus generate --check
Evidence required
- monitor_capability
- fold_suppresses_reprojection
- follow_terminates
- absent_source_reported
- cockpit_monitor_page
- session_start_monitor_line
- released_and_deployed
Risks
- A stream that shows everything is as unread as six that show their own: the fold and for_you are the feature, not the joining.
- GitHub is network: it must never make a local page slow or an absent network look like a quiet repository.
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 |
|---|---|---|---|---|
| I2400 | DONE | 0 | — | A signal model and a fold join every source the server already records |
| I2401 | DONE | 1 | I2400 | monitor is one read capability with three projections |
| I2402 | READY | 2 | I2401 | majordomus monitor follows the stream from a terminal and a script |
| I2403 | DONE | 1 | I2400 | Pull requests, checks and deploys reach the stream when GitHub is reachable |
| I2404 | READY | 2 | I2401 | The Cockpit shows the stream live |
| I2405 | READY | 2 | I2401 | Every session is told what happened since its last look |
| I2406 | BLOCKED | 3 | I2402, I2404 | The stream is documented where a reader looks |
| I2407 | BLOCKED | 4 | I2402, I2404, I2405, I2406 | The monitor is released and deployed |
The graph
flowchart LR
I2400["I2400<br/>A signal model and a fold join every source the server already records"]:::done
I2401["I2401<br/>monitor is one read capability with three projections"]:::done
I2402["I2402<br/>majordomus monitor follows the stream from a terminal and a script"]:::ready
I2403["I2403<br/>Pull requests, checks and deploys reach the stream when GitHub is reachable"]:::done
I2404["I2404<br/>The Cockpit shows the stream live"]:::ready
I2405["I2405<br/>Every session is told what happened since its last look"]:::ready
I2406["I2406<br/>The stream is documented where a reader looks"]:::blocked
I2407["I2407<br/>The monitor is released and deployed"]:::blocked
I2400 --> I2401
I2400 --> I2403
I2401 --> I2402
I2401 --> I2404
I2401 --> I2405
I2402 --> I2406
I2402 --> I2407
I2404 --> I2406
I2404 --> I2407
I2405 --> I2407
I2406 --> I2407
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)
- I2400 A signal model and a fold join every source the server already records
- I2401 monitor is one read capability with three projections
- I2402 majordomus monitor follows the stream from a terminal and a script
- I2403 Pull requests, checks and deploys reach the stream when GitHub is reachable
- I2404 The Cockpit shows the stream live
- I2405 Every session is told what happened since its last look
- I2406 The stream is documented where a reader looks
- I2407 The monitor is released and deployed
Canonical record: .ai/repo/project/milestones/everything-is-followed-in-one-stream.yaml. Read it back with majordomus plan show everything-is-followed-in-one-stream.