39. Liveness jsou čtyři pravidla, poradní, dokud je sken nedokáže rozhodnout
Kontext
2026-09-10 operátor předal repozitáři dokument nazvaný Agent Liveness and Anti-Stall Doctrine: deset tvrdých pravidel plus sekce o neinteraktivním provádění, dlouho běžících příkazech, dohledu nad delegáty, obnově po zaseknutí a idempotenci. Vzešel z konkrétní iritace. Relace v tomto repozitáři přestávají postupovat, když jejich terminálová záložka není zaostřená, a pokračují ve chvíli, kdy se stiskne klávesa.
Tato polovina byla ověřena dřív, než se cokoli zapsalo. Claude Code 2.1.267 byl ten den nejnovější publikovanou verzí a používanou verzí. Issues 36418, 38932 a 46691 v anthropics/claude-code popisují toto chování, shodují se, že poller, který spotřebovává zprávu dokončeného delegáta, je svázán s renderovací smyčkou terminálového UI, a všechny jsou zavřeny bez opravy — 36418 jako duplikát 25068, další dvě botem pro zastaralost. Nejnovější živá reprodukce v těch vláknech je na Linuxu pod tmux, takže nejde o artefakt iTerm2 ani macOS. Upgrade to nspraví, protože není na co upgradovat.
Upstreamovou vadu neopravujeme my a tento repozitář není místem, kde ji sledovat. Naše je zobecnění, které stojí za zapsání nezávisle na dodavateli, který ho vyvolal: prezentační vrstva byla učiněna nosnou pro sémantiku provádění a worker zde může takový tvar vytvořit kterýkoli den v týdnu.
Rozhodnutí
Doktrína přistává jako čtyři objekty pravidel, všechny advisory, plus tento záznam.
Čtyři, nikoli jedno. Dokument je jeden argument, ale není to jedno pravidlo. Objekt pravidla zde nese jediné normativní statement, proti kterému může recenzent poměřit změnu, a dokument obsahuje čtyři oddělitelná, která selhávají nezávisle a vynucují se různými prostředky:
| Pravidlo | Co řídí | Oddíly doktríny |
|---|---|---|
project.execution-state-is-authoritative | co může worker považovat za stav světa | tvrdá pravidla 1, 6, 7, 8, 10; Execution Principle |
project.every-wait-is-bounded | co je třeba zařídit před čekáním | tvrdá pravidla 3, 4, 5, 9; Dlouho běžící příkazy |
project.commands-run-non-interactively | jak se příkaz vyvolá | tvrdé pravidlo 2; Neinteraktivní provádění |
project.recovery-is-idempotent | co se děje po přerušení | Zotavení z uvíznutí; Idempotence |
Sloučení do jednoho pravidla by dalo výrok příliš široký na to, aby proti němu šlo rozhodovat jakoukoli konkrétní změnu, což je selhání, před kterým project.optional-complexity varuje z opačné strany. První je důvodem pro ostatní tři a ty na něm výslovně závisejí, takže argument přežije rozdělení jako graf závislostí, ne jako próza.
„Liveness“ není nové podstatné jméno ve smyslu, který project.no-new-nouns zakazuje. Toto pravidlo odmítá nové věci — agenty, persony, role, úrovně, registry. Liveness zde nepojmenovává žádný objekt: žádné id pravidla ho neobsahuje, nic v docs/CONCEPTS.md nezíská položku, nepřibývá žádný příkaz ani druh. Objevuje se jen v titulu tohoto záznamu jako jméno tématu, které tato čtyři sdílejí. Každé id pravidla je věta o chování, ve stylu, který repozitář už používá.
Nyní poradní, později blokující. project.rule-is-a-doctrine vyžaduje, aby vynucované pravidlo neslo blok x-majordomus a funkci mj_validate_<name>. Žádné ze čtyř ji dosud nemá, takže žádné si nesmí nárokovat blocking — pravidlo, jehož třída tvrdí vynucování, které neexistuje, je tvar, který project.never-reported-is-not-green odmítá ve směru CI, a bylo by nepoctivé jej tu připustit ze stejného důvodu.
Dvě ze čtyř mají zřejmou mechanickou podobu a měly by se stát blokujícími, jakmile bude existovat:
project.commands-run-non-interactively— prohledáníscripts/,test/,lib/a.github/workflows/kvůli ponechaným pagerům, editorům, celoobrazovkovým monitorům, REPL a promptům bez příznaku pro odpověď.test/cases/08_no_forbidden_constructs.shuž hledá zakázané konstrukce a sem to patří.project.every-wait-is-bounded— prohledání kvůli blokujícímu příkazu bez timeoutu a spawnu bez podmínky dokončení.
Zbylé dvě nejsou mechanicky rozhodnutelné. execution-state-is-authoritative se týká toho, z čeho worker usuzuje, a nic v tomto nástroji nemůže pozorovat renderovací smyčku jiného programu. recovery-is-idempotent lze zkontrolovat až po škodě. Obě zůstávají poradní a rozhoduje o nich revize, kterou repozitář pro pravidla takového druhu už přijímá — no-new-nouns i portable-shell jsou dnes částečně drženy revizí.
Důsledky
Efektivní sada pravidel získává čtyři aktivní projektová pravidla. Nic se nevynucuje, co se nevynucovalo dřív, takže touto změnou nelze rozbít žádnou existující branch a žádný ratchet se nehýbe.
Navazující práce jsou dva výše jmenované skeny. Dokud neexistují, dvě pravidla, která je chtějí, to říkají ve svých vlastních sekcích Failure behaviour, místo aby předstírala, a tento záznam je tím, co pozdější worker čte, aby věděl, že mezera byla zvolena, ne přehlédnuta.
Upstreamové zaseknutí se zde nesleduje. Má-li být znovu nahlášeno, patří do nového úkolu proti anthropics/claude-code s reprodukcí na 2.1.267, protože tři existující jsou uzavřeny a zamčeny.
Dodatek, 2026-09-30: obě prohledání existují a dvě pravidla, která je chtěla, jsou blokující
Navazující úkol, který tento záznam nechal otevřený, je hotov. scripts/liveness-check čte každý sledovaný shellový soubor kvůli třem tvarům — síťovému volání bez limitu (unbounded-network), procesu na pozadí, jehož dokončení nic nezaznamená (unsupervised-spawn), a podpříkazu gitu, který stránkuje do terminálu (pager-blocks) — s kontrolou always: true v úloze structure a jeho dluhem zpřísňovaným v .ai/repo/liveness-baseline.txt; test/cases/08_no_forbidden_constructs.sh prohledává devět interaktivních konstrukcí na pozici příkazu a každou z nich umístí do fixtury, aby dokázal, že ji prohledávání najde.
Takže project.commands-run-non-interactively a project.every-wait-is-bounded jsou verze 2 a blocking, každé jmenuje sken, který o něm rozhoduje. Počet blokujících pravidel se změnil ze 113 na 115 ze 141 a žádný strom nezčervenal: oba skeny už běžely a už byly čisté.
Zbylé dvě zůstávají advisory z důvodu uvedeného výše a každá to nyní říká ve svém vlastním reviewed_because, ne jen v tomto záznamu — execution-state-is-authoritative, protože žádný zde program nepozoruje smyčku vykreslování jiného, recovery-is-idempotent, protože nic nedokáže zjistit, že opakování se chystalo zduplikovat vedlejší efekt. test/cases/121_liveness_doctrine.sh drží toto rozdělení z obou stran: zvýšené pravidlo se nesmí snížit zpět, dokud jeho sken existuje, a revidované pravidlo se nesmí zvýšit, dokud o něm rozhoduje jen revize.