I1992 — Selhaná přestavba nespotřebuje žádnou změnu: další požadavek ji zopakuje
Když selže přestavba obrazu repozitáře dlouho běžícího serveru, ponechat zaznamenanou změnu nespotřebovanou, aby další požadavek načtení zopakoval (omezeně, ne při každém požadavku), místo aby se obsluhovala předchozí generace, dokud se git náhodou znovu nepohne.
HOTOVO vlna 0 · p2 · profil implementation · bezpečné souběžně
Součást development-runtime — The runtime has a development surface.
Cíl
Když selže přestavba obrazu repozitáře dlouho běžícího serveru, ponechat zaznamenanou změnu nespotřebovanou, aby další požadavek načtení zopakoval (omezeně, ne při každém požadavku), místo aby se obsluhovala předchozí generace, dokud se git náhodou znovu nepohne.
Proč
Nalezeno při uzavírání flaku případu 545 (fix/ci-flakes-545-and-multicast 79ecdbb944, dávka B3 #788): Live::reload (apps/majordomus-cli/src/live.rs, větev Err v `match built`) zapisuje `state.stamp = taken`, když App::load selže, takže razítko, pod kterým se selhané načtení pořídilo, se nyní čte jako aktuální. Přechodné selhání — proces gitu zachycený uprostřed zápisu, index.lock, napůl uložený manifest — proto způsobí, že server commit, který ho spustil, mine, a každá odpověď (HTTP, MCP, Cockpit) drží starý head s čerstvě vypadajícím observed_at až do nějakého nesouvisejícího posunu. Komentář tam uvádí důvod (neopakovat selhávající načtení při každém požadavku); cenou té volby je commit, který se tiše nevidí. Případ 545 nyní dotazuje nový head a při selhání vypíše řádek serveru „would not load“, takže výskyt jmenuje tuto cestu.
Aktuální stav
Selhání App::load nastaví razítko generace na razítko, pod nímž bylo převzato: změna je spotřebována a žádný požadavek nezkouší načtení znovu, dokud se řídicí soubory gitu znovu nepohnou.
Cílový stav
Selhané načtení nechá razítko generace, jak bylo, a zaznamená vedle něj selhání (razítko a okamžik); požadavek, jehož razítko se rovná selhanému, zkusí načtení znovu, jakmile od selhání uplynul omezený interval, a uvnitř něj je obsloužen předchozí generací (s uvedeným selháním). Razítko, které se znovu posune, zkouší ihned. Varování jmenuje opakování.
Rozsah
- apps/majordomus-cli/src/live.rs
- apps/majordomus-cli/tests
- test/cases
Mimo rozsah
- Soubory sledované razítkem (WORKTREE_FILES, COMMON_FILES)
- Pravidlo uprostřed rebuildu: požadavek, který dorazí během rebuildu, je stále obsloužen stávající generací
Závislosti
Žádné. Tento úkol je kořenem grafu.
Kritéria přijetí
- Načtení, které selže a pak by uspělo, bez dalšího pohybu repozitáře, se po intervalu zopakuje a další odpověď nese novou hlavu
- Načtení, které stále selhává, se zkouší nejvýše jednou za interval, ne jednou na požadavek
- Případ 545 stále prochází; po odstranění opakování nový test selže
Validace
- bin/majordomus plan validate
- cargo test --manifest-path apps/majordomus-cli/Cargo.toml --lib live::
- MJ_TEST_JOBS=4 bash test/run.sh 545_every_answer_says_when_it_was_observed
Požadované důkazy
- failed_load_is_retried_test
Důkazy
| pokrývá | typ | command | výsledek | u commitu |
|---|---|---|---|---|
| failed_load_is_retried_test | test | cargo test --locked --manifest-path apps/majordomus-cli/Cargo.toml --lib live:: | test result: ok. 15 passed; 0 failed (běh 2026-10-14 mezi 07:40Z a 07:58Z na master ce5959db59) | ce5959d |
Časová osa
- zahájeno
- 2026-10-14T07:59:03Z
- ověřeno
- —
- dokončeno
- 2026-10-14T07:59:09Z
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/I1992.yaml. Načtěte ho zpět pomocí majordomus plan show I1992.