Zdůvodnění
Dne 2026-10-12 byla v 09:43Z otagována verze v0.21.0, release pipeline publikovala jejích šest archivů a v 10:23Z vložila na publikovaný web releases/latest.json jmenující 0.21.0, což je to, co rozlišuje instalátor. Domovská stránka vedle instalačního příkazu nadále nabízela 0.20.0 a odkazovala na jeho poznámky k vydání, dokud záznam release nedorazil do masteru — záznam přichází přes pull request, který release otevře po publikaci a který potřebuje vlastní plnou validaci, hodinu či dvě. Dva povrchy jednoho webu odpovídaly na otázku „který release je nejnovější“ ze dvou zdrojů a po každém release se na hodiny rozcházely. Nikdo si nevšiml, protože každá kontrola četla vždy jeden povrch: kontrola instalátoru četla latest.json, smoke test release čekal na latest.json, site-check držel stránky u záznamů stromu, z něhož byly sestaveny, a každá z nich byla pravdivá.
ADR 0131 už zařídilo, že metadata odcházejí před záznamem, a že je deploy masteru zachová. Neumožnilo však stránkám je následovat: vykreslovaly projekci záznamu (site/data/registry/distribution.json a pole release, které nesla data webu), takže publikace posunula jeden povrch a ostatní nechala být.
Požadované chování
- Jedno odvození.
scripts/site-buildodvozuje release, který web nabízí, jako novější ze dvou čtení jednoho faktu: nejnovějšího záznamu release stromu, který sestavuje (jeho projekcesite/data/registry/distribution.json), areleases/latest.json, které publikovaná větev už servíruje, čteného z git refu (origin/gh-pages) a nikdy nestahovaného po síti při renderu. Výsledek, s tím, které čtení zvítězilo, a commitem publikované větve, který přečetlo, zapíše dobuild.jsonjakorelease;/build.jsonjej servíruje. Je-li novější publikovaný release, jeho dva dokumenty se zkopírují do sestavení, takže metadata, která sestavení servíruje, jsou release, který jeho stránky nabízejí. - Čte ho každý povrch. Stránka, která jmenuje nejnovější release, čte
offered(nastavené jednou vbase.htmlzbuild.release) a nic jiného. Data webu nenesou žádný vlastní release:project.jsonuvádí verzi stromu, což je jiný fakt. - Záznam zůstává archivní projekcí. Záznam releasu nese to, co je známo až po publikaci — digesty, atestace, čas publikace — takže nemůže přistát před tagem a tag na něj nečeká. Changelog a historie instalační příručky jsou jeho projekce a následují ho; uvádějí releasy, které existují, a nikdy žádný nenabízejí před ním.
- Odmítnuto před pushem.
scripts/site-checkodmítne build, jehož nabídka na homepage (data-releasena pásu důvěry a na odznacích v navigaci a hero),/build.jsona servírovaný/releases/latest.jsonjmenují různé releasy, a strom, jehož dvě commitnuté projekce posledního releasu —latestvdistribution.jsonasite/static/releases/latest.json— si odporují: předsloučená polovina, rozhodnutelná ze stromu. Čtení záznamu je nejvyšší stabilní záznam, který není stažen (Releases::latest_stable); žádný povrch nevypisuje soubory záznamů, aby našel „nejnovější“. - Měří se po nasazení.
scripts/pages release-livečte nabídku živé domovské stránky,/build.json,/releases/latest.jsona nejnovější release na GitHubu. Jedna verze je úspěch. Neshoda mladší neždeploy.release_window(.ai/repo/ci/pages.yaml) po releasu na GitHubu je publikace v běhu a projde, s upozorněním; starší selže. Web nabízející verzi, kterou GitHub nepublikoval, selže ihned. Čtení, které nelze provést, je exit 12, nikdy úspěch.
Chování při selhání
scripts/site-buildkončí s10, když publikovaná branch servírujereleases/latest.json, který není dokumentemrelease/v1jmenujícím vlastní tag, nebo soubor tagu, který se od něj liší.scripts/site-checkselže (sekce 17b,release) při jakékoli neshodě v bodě 4.scripts/pages release-liveskončí kódem10po uplynutí okna nebo u nabídky předstihující GitHub,12když chybí údaj. V.github/workflows/pages.ymlje to krokthe release it offers, poté co web poskytuje nasazený commit; vscripts/ci/pages-checkje to oddíl 5 kontrolypages-live, na kterou se ptáfinish(at-finish) a naplánované běhy pages se ptají každých třicet minut a při selhání nasazují.scripts/site-deployvaruje, když ponechává publikovaná metadata nad starším buildem: stránky onoho buildu nabízejí starší release až do dalšího buildu.
Ověření
test/cases/1087_the_site_offers_the_release_it_published.sh: odvození vybere publikovaný release před starším záznamem a záznam před starší nebo chybějící publikací, zkopíruje publikované dokumenty a odmítne vadný; každá šablona čte jedno odvození; scripts/pages release-live proti webu file:// a gh na PATH projde jeden release, projde čerstvou neshodu v rámci okna a selže, když každý ze tří povrchů postupně pojmenuje po jeho uplynutí jiný release, když web nabízí, co GitHub nepublikoval, a vrátí 12, když GitHub nelze přečíst. test/cases/352 drží nabídku u releasu, který existuje; test/cases/1041 drží cestu metadat z ADR 0131.