Zdůvodnění
Úkoly a milníky na GitHubu jsou projekcí plánu na trunku. Přistání, které změní záznam plánu nebo cokoli, z čeho se vykreslení záznamu odvozuje, nechá GitHub pozadu přesně o tuto změnu, dokud scripts/github-sync --apply neproběhne ze špičky trunku.
Do 2026-10-12 byl tento běh věcí člověka. project.github-projection-gated to říkal výslovně, docs/INTEGRATION.md svěřil krok „tomu, kdo executor obsluhuje“ a .ai/repo/ci/github.yaml mu dal třicet minut, po jejichž uplynutí scripts/ci/github-check hlavní větev odmítne. Návrh byl ke své mezeře upřímný: tentýž odstavec říkal, že job při každém pushi do mastera by ruční krok odstranil, a označil to za otevřenou volbu vlastníka.
2026-10-12 se za tuto mezeru zaplatilo. Série přistání až do 81178f5362 změnila I2460 na I2478; relace obsluhující executor pokračovala dalším přistáním; okno uplynulo; běh 38278173940 validate zbarvil master do červena na kontrole github-projection. Nic ve stromu nebylo špatně. Krok, který provádí jen člověk, se neprovedl, a kontrola, která ho posuzovala, za sebou neměla žádného aktéra. Příkaz vlastníka téhož dne: úkoly, milníky a záměry jsou sladěny s repozitářem a pro budoucnost se to vynucuje.
To je tvar, který .github/workflows/version.yml odstranil pro verzi: soudce, který funguje, a zapisovač, který běží jen tehdy, když si na něj někdo vzpomene.
Požadované chování
- Aktérem je přistání. Workflow běží při každém pushi do výchozí větve, bez filtru cest, a podle plánu, aby se selhaný nebo zrušený běh zkusil znovu. Jeho model je
.ai/repo/ci/github.yaml; soubor workflow nenese žádný trigger, oprávnění ani fázi, které model nedeklaruje. - Zeptat se, aplikovat, dokázat, v tomto pořadí.
scripts/github-sync --checkříká, co je dlužno. Když něco dlužno je,scripts/github-sync --applyto zapíše ascripts/ci/github-checkpak posoudí trunk přesně jako validate. Čisté první čtení je vlastním důkazem a nic se nezapisuje. - Jen špička trunku. Workflow nemá žádný spouštěč, který by pull request dosáhl, checkoutuje výchozí větev a před aplikací se ptá remote na její špičku. Běh, který trunk předběhl, neaplikuje nic: přistání, které jej posunulo, zahájilo vlastní běh.
- Spustitelný soubor, nebo nic. Každá fáze odmítne běžet, když
MAJORDOMUS_BINžádný spustitelný soubor nejmenuje. Shellový záložní režim adaptéru četl model 2026-10-12 jinak (318 nálezů driftu proti 26) a aplikace z takového čtení přepisuje záznamy, které se nezměnily. - Nejmenší oprávnění.
issues: writeacontents: read, deklarováno jednou pro celý workflow, a žádná úloha je nerozšiřuje. - Po jednom, nikdy zrušeno. Jedna skupina souběžnosti,
cancel-in-progress: false: zrušený apply je remote zapsaný jen napůl. - Omezeno. Úloha deklaruje limit a každý krok deklaruje menší, takže krok, který se zasekne, ohlásí sám sebe, místo aby byl zabit i s úlohou.
- Text člověka se nepřepisuje. Workflow nikdy nepředává
--forcea nikdy nezapisuje baseline driftu. Oblast, kterou někdo upravil, běh shodí a čeká na člověka. - Záložní postup je záložní postup. Když workflow selže, člověk spustí
scripts/github-sync --applyz čisté špičky výchozí větve se spustitelným souborem.apply.windowomezuje, jak dlouho to smí trvat, než kontrola trunk odmítne. Žádný postup, runbook ani instrukce agentovi nejmenuje ruční aplikaci jako krok, který běžně následuje po přistání.
Chování při selhání
Běh, který nemůže přečíst remote, nemůže sestavit spustitelný soubor, má mutaci odmítnutou GitHubem (exit 13) nebo nechá kontrolu s nálezem, je neúspěšný běh workflow github-projection a jmenuje krok. Trunk pak zaostává do dalšího běhu nebo do ručního použití člověkem a scripts/ci/github-check ho odmítne, jakmile apply.window projde, s pojmenovaným příkazem, jako dřív.
test/cases/1097_the_projection_is_applied_at_landing.sh selže, když se workflow a model rozcházejí v kterémkoli z výše uvedených bodů.
Ověření
test/cases/1097_the_projection_is_applied_at_landing.sh čte workflow a model a drží jedno vůči druhému: spouštěče, absenci filtru cest a jakéhokoli spouštěče pull requestem, oprávnění, skupinu souběhu, meze a pořadí tří příkazů. Poté vyjme skripty jednotlivých kroků z workflow a spustí je proti skriptovanému adaptéru a lokálnímu remote: bez spustitelného souboru se k adaptéru nedostane žádný, při dlužném driftu se aplikuje špička a checkout, který trunk předběhl, neaplikuje nic. Každé tvrzení bylo 2026-10-12 rozbito mutací workflow nebo modelu a hlavička případu je vypisuje.
test/cases/1038_a_head_is_judged_against_what_it_changes.sh drží okno, kterým je fallback ohraničen, a test/cases/26_ci_wiring.sh zavazuje každý workflow mít model.
Co zde nedokazuje žádný případ, je běh na samotném GitHubu: že token workflow je přijat pro každý zápis, který adaptér provádí. To se pozoruje při prvním přistání po tomto pravidle, ve vlastním logu běhu.