I2486 — Žádná obrazovka nečeká na zdroj: stránka ukazuje poslední čtení s jeho stářím, načtené znovu za zády čtenáře
Odstranit z cesty požadavku UI každý handler, volání gitu a čtení souboru: executor drží nejnovější čtení každého zdroje, o který stránka požádala, obrazovka se z těchto čtení vykreslí okamžitě a worker čte zdroj znovu na pozadí, kdykoli čtení neodpovídá repozitáři v jeho aktuálním stavu.
HOTOVO vlna 1 · p0 · profil implementation · běží samostatně
Součást development-runtime — The runtime has a development surface.
Cíl
Odstranit z cesty požadavku UI každý handler, volání gitu a čtení souboru: executor drží nejnovější čtení každého zdroje, o který stránka požádala, obrazovka se z těchto čtení vykreslí okamžitě a worker čte zdroj znovu na pozadí, kdykoli čtení neodpovídá repozitáři v jeho aktuálním stavu.
Proč
Vlastník dne 2026-10-12 řekl, že UI „is tragically slow“ a má se vyřešit „architecturally“. Změřeno na buildu dávky UI-performance (c66f49e406, debug, load 20): /ui 2,2–2,5 s při každém požadavku, protože health.report (2,4 s, sondy, necachovatelné) je v jeho prvním vykreslení; první požadavek po startu nebo změně 5,6–8,1 s pro roadmap, evidence a governance, protože cache klíčovaná stavem repozitáře je právě tehdy prázdná; /ui/panels/delivery 75,7 s. Stránka stojí tolik co její nejpomalejší zdroj a žádná cache to nezmění. ADR 0142 zaznamenává rozhodnutí.
Aktuální stav
Obrazovka se ptá svých zdrojů přes ctx.execute a čeká na všechny (ui/source.rs ask_all). Zdroj v cache odpoví hned, dokud repozitář stojí; zdroj bez cache a první čtení po jakékoli změně spustí handler na požadavku.
Cílový stav
capability::readings keeps, per source and input, what it last answered, when, how long it took and in which state of the repository. Context::read hands that over: at once when it is of the repository as it is now, with a worker reading it again behind the caller once it is older than a second; after at most 50 ms, marked stale and refreshing, when the repository has moved, and then every other source read lately is read again too; after waiting for the first reading when there is none, said as pending past a minute. One worker per source, four at once in all, above the executor's own cache and single flight. execute is unchanged and exact. ui::source asks for readings; an answer carries its standing (age, current/stale/pending, refreshing); a source line says a reading's age once it is older than five seconds and says when it predates the last change; a line whose reading is catching up carries data-catching-up and the page's script reads the screen again after 0.4 s, doubling to 6.4 s, until none is left. The first reader of the UI starts one background pass over SCREENS and PANELS. MAJORDOMUS_CAPABILITY_CACHE=off makes a reading run its handler; MAJORDOMUS_READING_PATIENCE_MS sets the patience, and wait makes every read exact.
Rozsah
- apps/majordomus-cli/src/capability/readings.rs
- apps/majordomus-cli/src/capability/executor.rs
- apps/majordomus-cli/src/capability/handler.rs
- apps/majordomus-cli/src/capability/mod.rs
- apps/majordomus-cli/src/ui
- apps/majordomus-cli/src/http/router.rs
- apps/majordomus-cli/tests/executor.rs
- share/ui/ui.js
- docs/MAJORDOMUS_UI.md
- docs/CLI.md
- test/cases/1096_no_screen_waits_for_a_source.sh
- .ai/repo/adrs/0142-no-screen-waits-for-a-source.md
- .ai/repo/rules/project/no-screen-waits-for-a-source.v1.md
- .ai/repo/project/issues/I2486.yaml
Závislosti
Co na tom čeká
- I2487PŘIPRAVENO Obrazovka se streamuje a jeden stream říká otevřené stránce, které údaje se změnily
- I2488PŘIPRAVENO HTTP stack se volí měřením: stejné routy a několik set otevřených streamů na tiny_http a na axum
- I2489HOTOVO Obrazovka překračující rozpočet shodí build: limity latence UI jsou politika měření výkonu a bench --check je vynucuje
- I2652HOTOVO UI ukazuje, co znalostní báze drží: kandidáty čekající na revizi a zda deriver stále zapisuje, čteno a nikdy na tom nic nevykonáno
Kritéria přijetí
- Zdroj pomalejší než trpělivost volajícího a nikdy nepřečtený se předá jako čekající dříve, než jeho handler skončí, a volající, který pak počká, se připojí ke stejnému čtení: jeden běh handleru
- Zdroj, který byl přečten, se předá bez spuštění svého handleru ve vlákně volajícího, jakkoli je handler pomalý, a čte se znovu za volajícím, jakmile je čtení starší než sekunda
- Po přesunu repozitáře se pomalý zdroj předá tak, jak byl, označený jako zastaralý a obnovující se, v mezích trpělivosti; volající, který počká, dostane aktuální čtení; zdroj nedávno přečtený a nevyžádaný se přečte znovu
- Zdroj, který selže nebo zpanikaří, je čtení, které to říká, se stářím, a čte se znovu
- Obrazovka, jejíž zdroj dohání, označí řádek toho zdroje atributem data-catching-up a řekne, jak je údaj starý; obrazovka s aktuálními zdroji ne
- Žádná obrazovka pod src/ui nevolá handler: mimo ui/source.rs a testy tam nic nevolá execute
- S MAJORDOMUS_READING_PATIENCE_MS=0 obsluhovaná obrazovka po změně repozitáře odpoví, aniž by čekala na své zdroje, a po dohnání čtení ukáže změněnou hodnotu
Validace
- bin/majordomus plan validate
- cargo test --test executor
- cargo test --lib ui::
- MJ_TEST_JOBS=2 bash test/run.sh 1096_no_screen_waits_for_a_source
Požadované důkazy
- readings_executor_tests
- ui_standing_unit_tests
- no_screen_waits_case_1096
- ui_latency_before_after
Důkazy
| pokrývá | typ | command | výsledek | u commitu |
|---|---|---|---|---|
| readings_executor_tests | test | cargo test --manifest-path apps/majordomus-cli/Cargo.toml --test executor | test result: ok. 17 passed; 0 failed, na stromu shodném s masterem 3442ce68c5; šest z nich jsou testy čtení: čekající, okamžitě, zastaralé při posunu, selhání a panic, omezení workeři a priorita | 3442ce6 |
| ui_standing_unit_tests | test | cargo test --manifest-path apps/majordomus-cli/Cargo.toml --lib ui::source && cargo test --manifest-path apps/majordomus-cli/Cargo.toml --lib ui::view | ui::source 8 prošlo, ui::view 17 prošlo, 0 selhalo, na stromu shodném s master 3442ce68c5: řádek zdroje říká stáří čtení a zda předchází změně | 3442ce6 |
| no_screen_waits_case_1096 | test | bash test/run.sh 1096_no_screen_waits_for_a_source | ok 1096_no_screen_waits_for_a_source, on a tree equal to master 3442ce68c5: no file under src/ui calls execute, and a served screen after a commit says it is catching up and then shows the new commit | 3442ce6 |
| ui_latency_before_after | ruční | časování curl proti sestavením release servírujícím jeden klon, základ c66f49e406 proti změně (pull request 1041) | za tepla, každá obrazovka: 0,12-0,92 s předtím, 2-12 ms potom; první požadavek po commitu: plán rozvoje, důkazy a governance 1,2-4,2 s předtím, 55-140 ms potom na hostiteli s Linuxem; /ui 1,2-1,55 s předtím, 3-162 ms potom na Macu při zátěži 21, nejpomalejší jednotlivý vzorek 330 ms. Změřeno 2026-10-12, neopakováno na 3442ce68c5; Cockpit stále počítá při požadavku a není součástí tohoto | 3442ce6 |
Časová osa
- zahájeno
- 2026-10-13T12:45:05Z
- ověřeno
- 2026-10-13T12:45:29Z
- dokončeno
- 2026-10-13T12:47:30Z
Tato tři pole, důkazy výše a stav závislostí jsou vše, z čeho se stav skládá. Neexistuje žádné pole stavu, které by s nimi mohlo být v rozporu.
Kanonický záznam: .ai/repo/project/issues/I2486.yaml. Zpětně ho přečtete pomocí majordomus plan show I2486.