Skip to content
Cockpit0.29.0
A snapshot: read at commit 707a04c7ce8 on 2026-10-18T00:06:01Z by majordomus 0.29.0. Nothing on this page is read again. See it live

I2487

A screen is streamed, and one stream tells an open page which readings changed

Where it stands

devtask.issue
Readiness
ready no dependency and no gate holds it; nobody has started it
Status
READY
Can start
startable
Milestone
Milestone status
ACTIVE
Wave
2
Waiting on
none
Holds back
none
Behind it in all
0
Evidence
0 of 4
A move writes the repository: it stamps one field of this issue's record and appends one event to the ledger, and a commit will carry both.
The same moves from a terminal

majordomus plan start I2487

majordomus plan verify I2487

majordomus plan done I2487

What it is

Objective
Send a screen as it becomes known and keep it current without polling: the shell and every panel whose reading is at hand are written at once, a panel whose first reading is pending follows on the same response, and after that one WebSocket subscription tells the page which readings changed.
Why
ADR 0142, part 2. After I2486 a screen no longer waits for a source it has read before, but a first reading is still waited for whole, and an open page learns of a change by reading itself again on a timer (60 s, or the catch-up re-read). The owner asked for a streamed UI. ADR 0033 made /events a WebSocket with a cursor and refused a second event channel, and the UI-performance batch's live-stream slice gave it paged replay, a heartbeat and a gap check, so the stream to build on exists.
Now
A response is written whole with its Content-Length (http/server.rs respond; chunking is switched off). The UI's script polls ?fragment every 60 s and, after I2486, re-reads a screen that is catching up. /events carries execution events only, and the UI opens no socket.
Wanted
The router can answer with a body written in parts. A UI screen writes its head, shell and every panel whose reading is at hand first; a panel whose reading is pending is written when it arrives, in document order, so the page is complete without a script and no reader waits for the slowest source to see the rest. capability::readings publishes a typed event when a reading changes (source, input digest, state of the repository), on the event model of ADR 0033; the UI's script holds one subscription per page, with the cursor and gap check the live-stream slice defined, and replaces the panels that name a changed source with the server's rendering of them. The 60 s poll and the catch-up re-read are removed. A page without the script, or without the socket, is still complete and says when it was read.
Done when
unknown: the record declares no `completion`
Risk
unknown: the record declares no `risk`

Acceptance

  • The first bytes of a screen whose slowest source is pending arrive before that source answers, and the response ends with that panel in its place
  • With scripts off, every screen is complete HTML once the response ends
  • A change of a reading reaches a subscribed page as one typed event naming the source, and the page replaces the panels that cite it without reading the whole screen again
  • A subscriber that fell behind is told so and reads the screen again; it is never left showing a value it was not told had changed
  • The UI's script holds no timer that reads a screen again
Validation
bin/majordomus plan validatecargo test --lib http::cargo test --lib ui::MJ_TEST_JOBS=2 bash test/run.sh 1097_a_screen_is_streamed
Evidence required
streamed_response_testsreading_changed_event_testsa_screen_is_streamed_case_1097browser_probe_no_poll
Evidence present
unknown: the record carries no `evidence` entries

Scope

Touches
apps/majordomus-cli/src/httpapps/majordomus-cli/src/uiapps/majordomus-cli/src/capability/readings.rsshare/ui/ui.jsdocs/MAJORDOMUS_UI.mdtest/cases.ai/repo/project/issues/I2487.yaml
Not
unknown: the record declares no `non_scope`
Depends on
Priority
p1
Profile
implementation
Parallel safe
false
Owner
unknown: the record declares no `owner`

The work so far

Branches
none
Merged
none
Commits
0
Trunk
master
Sessions
none
Created
2026-10-12
Updated
2026-10-12
Started
unknown: the record declares no `started_at`
Verified
unknown: the record declares no `verified_at`
Completed
unknown: the record declares no `completed_at`

Synchronisation

Adapter
scripts/github-sync
Repository
unknown: the derived plan's header carries no repository
External issue
unknown: a live GitHub state; this executable makes no network call, so only `scripts/github-sync --check` can answer it
State there
unknown: a live GitHub state; this executable makes no network call, so only `scripts/github-sync --check` can answer it

Findings

LevelCodeMessageReproduce
WARNscope_conflictshares apps/majordomus-cli/src/http with I2488; they may not run concurrentlymajordomus plan validate
WARNscope_conflictshares apps/majordomus-cli/src/ui with I2652; they may not run concurrentlymajordomus plan validate