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
0of4
Moves
plan.transitionWhat 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
| Level | Code | Message | Reproduce |
|---|---|---|---|
| WARN | scope_conflict | shares apps/majordomus-cli/src/http with I2488; they may not run concurrently | majordomus plan validate |
| WARN | scope_conflict | shares apps/majordomus-cli/src/ui with I2652; they may not run concurrently | majordomus plan validate |