Zdůvodnění
scripts/github-sync --check končí exit 11 při driftu od dne, kdy byl napsán. Nikdo ho nikdy nezavolal.
scripts/ci/core-check spouštěl --plan a --render adaptéru, které dokazují, že projekci lze z kanonického modelu vytvořit. Zda ji remote přijal, se nikdy neptal. Projekce se tak aplikovala jednou, 2026-09-04, a pak chátrala — změřeno při 867f3a9, 200 zjištění driftu proti 15 milníkům a 184 úkolům, z nichž 181 byly kanonické záznamy, které na GitHubu nikdy neexistovaly. Každý build byl po celou dobu zelený a .ai/repo/project/README.md dál tvrdil, že úkoly a milníky na GitHubu pocházejí z majordomus plan.
Poučné je, který povrch zůstal poctivý. Všech osm projektovaných milníků bylo synchronizovaných, protože milníků je málo a ručně se jich dotýkalo. Povrch, na který se člověk dívá, byl povrch, který se stále shodoval, a právě proto si toho pět dní nikdo nevšiml.
To je vlastní uvedený režim selhání tohoto repozitáře — tvrzení, jehož důkazem je skript, který existuje, místo kontroly, která běží — uplatněný na jediný subsystém, jehož celým smyslem je zabránit tomu, aby si dva záznamy téže práce odporovaly.
Změněno na místě, 2026-10-10
Do tohoto dodatku pravidlo odmítalo behind, state, milestone a closed při každém běhu, ať šlo o běh čehokoli. Adaptér promítá jen trunk a nic ho automaticky neaplikuje, takže pull request, který upravoval projektovaný záznam, byl odmítnut za jedinou věc, kterou před mergem nemohl udělat: #855 změnil jeden řádek I1900 a #820 uzavřel osm záznamů a ani jeden nemohl zezelenat na vlastním headu. Kdyby některý přistál, trunk by byl odmítán, dokud by někdo ručně neaplikoval. Dodatek přidává jednu třídu, pending, a omezuje ji z obou stran; nic dalšího, co pravidlo odmítalo, se neodmítá méně.
Upravuje verzi 1 místo vydání verze 2, protože pravidlo v otevřeném pull requestu (#831, project.a-failed-read-is-not-an-empty-answer) závisí na tomto @1 a závislost, která se nevyřeší, zastaví aplikaci celé množiny. Verze 2 nesoucí tento text následuje, jakmile je ten pull request na trunku.
Upraveno na místě, 2026-10-12
Do tohoto dodatku zněl poslední řádek požadovaného chování „Aplikace projekce zůstává záměrným lidským aktem. CI dokazuje shodu; úkoly nevytváří.“ Dne 2026-10-12 okno uplynulo se zpožděním I2460 až I2478, protože člověk, jehož to byl akt, přešel k dalšímu přistání, a master byl odmítnut (běh validate 38278173940 na 81178f5362). Vlastník nařídil, aby aplikace následovala po přistání. Řádek nyní pojmenovává pravidlo, které říká, kdo aplikuje, project.the-projection-is-applied-at-landing@1; nic, co toto pravidlo odmítá, se neodmítá méně a okno stále omezuje, jak pozdě smí být trunk. Změněno ve verzi 1 z důvodu, který uvádí výše uvedený dodatek.
Požadované chování
- Kontrola čte remote a při driftu selže. Běží při každé změně, která může pohnout kanonickým modelem nebo adaptérem, což vybírá CI model podle třídy cest, ne tím, že to někdo přidá do seznamu kroků.
- Stavy, které znamenají nový drift nebo ohrožení textu člověka, se odmítají od prvního běhu a nemají žádnou toleranci:
behind,edited,conflict,unmanaged,state,milestone,closed. - Head se posuzuje proti tomu, co mění, ne proti živému stavu GitHubu. Ze stavů, které aplikace zapisuje (
behind,state,milestone,closed), jsou pending, hlásí se a neodmítají, pro záznamy, které head změnil od svého merge base s větví, do níž se slučuje, a na trunku pro záznamy, které se změnily v přistání mladším než okno deklarované v.ai/repo/ci/github.yaml. Záznam se změnil, když se liší jeho soubor nebo jeho vykreslení, protože stav se odvozuje. Po uplynutí okna se trunk odmítne. Ostatní stavy nejsou nikdy pending a není jím ani žádný stav na záznamu, který head nezměnil. - Změna, kterou nelze změřit, se nepředpokládá ani tak, ani onak: bez základu, který by se dal dohledat, bez merge base, při mělkém klonu nebo bez deklarovaného okna kontrola řekne, který z těchto případů nastal, a odmítne to, co odmítala před dodatkem.
- Nevyřízený objem projekce, která se přestala aplikovat, se drží západkou proti commitnuté základní hodnotě, místo aby se tiše tolerovalo. Číslo smí klesat a nikdy stoupat a jeho zápis je záměrný akt, jako už je u
.ai/repo/claim-proof-baseline.txt. - Záznam, který head přidal, není backlog.
missingje čekající, hlášený a neodmítaný, pro záznam, jehož soubor není v merge base headu, a na trunku pro záznam přidaný v přistání mladším než deklarované okno: nic ho zatím neprojektovalo a apply přistání ho vytvoří. Záznam, který chybí a který head nepřidal, drží ratchet jako dřív, stejně jakoadoptu každého záznamu. Pozměněno ve verzi 1 dne 2026-10-13: pull request, který přidal 54 záznamů, na vlastním headu hlásil „chybí 73 záznamů, nad základním stavem 19“ a nemohl tam zezelenat, tatáž zeď, kterou výše uvedený dodatek odstranil pro záznam, který head upravuje. - Kontrola, která nedosáhne na vzdálený systém — žádný
gh, žádný token, žádné oprávnění — končí jako nepoužitelná a řekne které, a nikdy neskončí čistě. Kontrola projekce, která tiše přeskakuje, znovu zavádí přesně tu vadu, kterou měla odstranit. - Tato kontrola dokazuje shodu a nic neaplikuje. Kdo aplikuje, je
project.the-projection-is-applied-at-landing@1: přistání, prostřednictvím workflow, které tuto kontrolu spouští po aplikaci; aplikace člověkem je záložní cesta.
Chování při selhání
scripts/ci/github-check končí kódem 10 a vypíše jeden řádek na odmítnutý stav, každý s pojmenováním záznamů a příkazu, který jej reprodukuje, a jeden řádek na stav v západce s uvedením počtu a základní hodnoty. Končí kódem 12, když nemůže číst remote, s uvedením důvodu. Čekající záznam je jeden řádek PENDING pojmenovávající záznamy a commit, od něhož se měří, započítaný odděleně od nálezů v posledním řádku a nikdy není exit statusem; na trunku po oknu jsou tytéž záznamy odmítnutým řádkem, který pojmenovává scripts/github-sync --apply.
Ověření
test/cases/97_github_gate.sh dokazuje každou polovinu proti fixture remote, bez sítě: záznam, jehož kanonický text se posunul, neprojde kontrolou, záznam přidaný do modelu a nikdy nepromítnutý neprojde ratchetem, backlog na své základní hodnotě projde a kontrola je deklarována v .ai/repo/ci/gates.yaml pro třídy cest, které mohou posunout kteroukoli stranu.
test/cases/1038_a_head_is_judged_against_what_it_changes.sh dokládá stavy pending na fixtuře se základem, headem a dvěma přistáními. Pro přidaný záznam: je pending na headu i na mladém přistání, chybějící záznam, který head nepřidal, je odmítnut vedle něj, a po okně je odmítnut kmen. Dvě mutace kontroly byly provedeny 2026-10-13 a každá případ shodila: seznam přidaných záznamů ponechaný prázdný a každý chybějící záznam označený za přidaný.
test/cases/45_github_projection.sh dokazuje šest stavů, které kontrola čte.
test/cases/1038_a_head_is_judged_against_what_it_changes.sh dokazuje třídu pending proti skriptovanému gh: záznam, který hlavička změnila, je pending a běh skončí s 0, záznam, který nezměnila, je vedle toho odmítnut, záznam, jehož vykreslení se změnilo kvůli nedotčenému souboru, je pending, přistání uvnitř okna je pending na trunku a totéž přistání za oknem je odmítnuto s nápravou, a základ nebo okno, které nelze přečíst, se odmítne.