Zdůvodnění
ADR 0141 dalo UI na veřejný web jako snímek: majordomus web report ui-snapshot přečte UI jednou na publikovaném commitu a zapíše je jako soubory, sestaví jej úloha workflow pro pages a úloha nasazení je umístí na mount UI. ADR uvedlo, co vynechalo: žádnou veřejnou sondu mountu po nasazení.
Audit 2026-10-12 odhalil, k čemu toto opomenutí vedlo. Každá kontrola publikace četla něco jiného. scripts/pages verify četla /build.json, které pojmenovává commit webu a složené povrchy, ne snapshot. verify-docs a verify-rustdoc četly své vlastní povrchy. scripts/ci/pages-check, kontrola pages-live, která běží při každém finish a v třicetiminutovém plánu, kladla pět otázek a žádná se netýkala UI. A skutečnost, že publikace vůbec snapshot obsahuje, byla zapsána na jediném místě, v kroku .github/workflows/pages.yml, takže jiná cesta nasazení o ní nevěděla: scripts/site-deploy spuštěné člověkem vyprázdní publikovaný branch a zkopíruje site/public, do kterého build webu snapshot nikdy nevloží, a publikoval tak web, jehož připojení UI odpovídalo 404 při zelených všech kontrolách.
Tři selhání vyplynula z jedné příčiny, z povrchu, který existuje jen tam, kde běžel jeho producent, a jemuž nic navazujícího nebylo podřízeno:
- Chybí. Nasazení, které nespustilo krok workflow, mount zahodí.
- Starší. Snímek ponechaný v
site/publicz dřívějšího buildu, nebo CDN, která stále odpovídá předchozími soubory, servíruje UI čtené na jiném commitu vedle stránek, které jmenují nový. UI je první obrazovka produktu; čtenář nemá jak poznat, že je z minulého týdne. - Krátký. Producent je záměrně omezený a zaznamenává, co vynechal a co jej zastavilo. Napůl zkopírovaný strom nebo záznam, který neříká, co čtení ukončilo, vypadá stejně jako celý, dokud se nezeptáte na stránky, které záznam uvádí.
Vztah kontrolovaný v jedné fázi a v další nikým nevlastněný je nejopakovanější vada tohoto repozitáře (project.the-crate-reference-is-published je stejné zjištění o referenci crate). Fáze po producentovi je nyní vlastněna.
Požadované chování
- Deklarováno jednou.
.ai/repo/ci/pages.yamljmenuje poddeploy.snapshotskaždý povrch, který publikace drží a který build webu nesestavuje: servírovaný povrch, jehož je snímkem, kam jej zapisuje jeho producent, producenta a atribut, kterým jeho stránky uvádějí svůj commit. Mount se tam nezapisuje; je to mount topologie pro daný povrch (docs/generated/web.json), protože publikace drží snímek tam, kde proces servíruje originál.scripts/pages snapshotsje jediné čtení položky a workflow, deploy, probe i kontrola procházejí jím. - Čte se u commitu, který je publikován. Snímek, který deploy publikuje, uvádí ve svém
surface.jsoncommit, který uvádějí stránky webu. Hlava trunku v rámci okna deploye je to, čemu je web podroben (scripts/ci/pages-check, oddíly 1 a 3); UI je podrobeno commitu webu, a tedy témuž oknu, nikdy volnějšímu vlastnímu. - Žádná cesta nasazení bez něj.
scripts/site-deployodmítne web, jehož strom nemá na svém mountu deklarovaný snímek, nese snímek čtený z jiného commitu nežHEADnebo nese deklaraci, která jmenuje jiný mount, než na kterém stojí. Odmítnutí jmenuje producenta a umístění.--release-metadatanení nasazením webu — přidává dva soubory k tomu, co větev už servíruje — a nevyžaduje se. - Ověřeno tam, kde se s tím čtenář setká.
scripts/pages verify-uise ptá veřejného webu:surface.jsonsnímku odpoví, pojmenuje commit a mount, na kterém je poskytován; úvodní stránka odpoví a její banner uvádí tentýž commit;snapshot.jsonodpoví, pojmenuje týž commit a řekne, co ukončilo čtení a které stránky byly vynechány; a každá stránka, kterou tento záznam uvádí, odpoví 200. Počet dotazovaných stránek omezuje--max-pages, rovnoměrně rozprostřený přes seznam, a verdikt uvádí, kolik jich bylo zkoumáno, kolik ne, kolik jich snímek sám vynechal a co jej zastavilo. - Přerušení se uvádí, nikdy neskrývá. Snapshot, který se zastavil na limitu nebo rozpočtu, je úspěch, který to říká. Ten, jehož záznam neuvádí, co ukončilo čtení, nebo nevypisuje, co vynechal, je selhání: „každá stránka“ a „stránky, na které byl čas“ se musí dát rozlišit jen z veřejných bajtů.
- Kontrola, ne poznámka. Workflow pages spouští sondu po nasazení, jakmile web poskytuje commit, a krok není
continue-on-error.scripts/ci/pages-checkse jí ptá na publikovaný commit jako oddílu 2c; UI, které chybí, patří jinému commitu nebo není celé, je exit10, a to, které nešlo posoudit, je exit12s uvedenou polovinou ve verdiktovém řádku, nikdy ne úspěch. - První obrazovka je rozhodnutá. Údaje, kterými první obrazovka UI vede, jsou to, podle čeho návštěvník produkt čte, a proces, který čte snapshot, není server: nedrží žádnou nástěnku peerů a nespouští žádný mesh. Obrazovka tedy vede jen tím, o čem tento proces může rozhodnout. Jeho údaj o zdraví je verdikt
repositoryzhealth.report, nejhorší z dimenzí, které nejsou dimenzemi obsluhujícího procesu (PROCESS_DIMENSIONS: server, jeho nástěnka, jeho runtime meshe), a tam, kde neběží žádný runtime meshe, údaj o meshi to říká a nepočítá žádné stroje. První obrazovka, která v některém z těchto údajů ukazuje odznak neznámého nebo zdroj, který neodpověděl, je nález sondy, vlastního případu snapshotu, a tedy nasazení.
Chování při selhání
scripts/pages snapshotsskončí12, když deklarovaný povrch nemá mount v topologii nebo záznam nejmenuje svůj artefakt, producenta a značku.scripts/site-deployskončí s10aREFUSEpro každý případ položky 3 a pro model, který je přítomen a nelze jej přečíst; nic se nepushuje.scripts/pages verify-uiskončí kódem10, když web odpověděl a UI chybí, je z jiného commitu nebo není celé — na stderr jeden řádekFAILza zjištění, každý zakončený příkazem, který ho ukáže znovu — a kódem12, když web nikdy neodpověděl nebo nešlo přečíst žádný commit, vůči kterému by se UI posuzovalo.scripts/pages verify-uitaké končí kódem10, když úvodní stránka vede nerozhodnutým údajem; řádekFAILpojmenovává každý údaj.- V
.github/workflows/pages.ymlje to krokthe UI it publishes; selhání shodí nasazení. Vscripts/ci/pages-checkje to sekce 2c kontrolypages-live, na kterou se ptáfinish(at-finish) a plánovaný běh stránek se ptá každých třicet minut a při selhání nasazuje.
Ověření
test/cases/2983_the_published_ui_is_the_trunks.sh, bez spustitelného souboru v Rustu a bez sítě: položka modelu rozliší svůj mount z topologie a workflow sestaví a nahraje to, co říká; verify-ui proti lokálně servírovanému webu projde snapshotem přečteným na commitu, s --commit i bez něj, a odmítne jmenovitě zastaralý built_from, chybějící surface.json, uvedenou stránku, která chybí, záznam z jiného běhu, banner jiného commitu a záznam, který neuvádí, co ukončilo jeho čtení; uvede, co přerušený snapshot vynechal a na co se --max-pages neptal, a vrátí 12 pro web, který neodpovídá; pages-check projde čtením UI na publikovaném commitu a skončí kódem 10 pro commit jiný i pro žádný; scripts/site-deploy odmítne web bez snapshotu, s cizím commitem i s umístěným špatně a publikuje HEAD. test/cases/180 a test/cases/96 drží kontrolu a nasazení nad celým webem, který jeden nese; test/cases/1092 a test/cases/1093 drží producenta.