Co se změnilo ve verzi 2 a proč
Verze 1 byla poradní a přesně řekla proč ve svém vlastním Failure behaviour: „nic nevidí necommitnutou polovinu kromě toho, kdo se dívá, a právě proto je odpovědnost zapsána, a ne vynucována kontrolou.“
Tento předpoklad byl pravdivý, když byl napsán, a už pravdivý není. Topologie worktree už počítá necommitnutou práci každého registrovaného worktree a jeden git rev-list --branches --not --remotes pojmenovává každý commit, který nikdy neopustil tento disk. Nikdy nechybělo měření — chybělo rozhodnutí: jedno slovo nad celým repozitářem, na místě, kde už něco odmítá.
Měření stálo za to hned v den, kdy se stalo možným. Dne 2026-09-16 tento repozitář držel devět hrotů branchí, jejichž commity nedosáhly na žádný remote, nejstarší čtyři dny starý, a šedesát čtyři pracovních stromů nesoucích necommitnuté soubory, zatímco všechny kontroly byly zelené. Nic z toho nešlo ohlásit žádným příkazem, takže nic z toho nebylo ničím nálezem.
Verze 2 je tedy blokující a rozhoduje o tom convergence.report: každé držení — pracovní strom s necommitnutými soubory, větev s commity, stash — nese dispozici (integrated, published, local_only, uncommitted) a poslední dvě znamenají, že práce existuje jen na jednom disku. Otázka no-stale-topology invariantu dokončení čte tento verdikt, místo aby jmenovala příkaz, který by člověk mohl spustit.
To, co verze 2 záměrně nedělá, je mazání čehokoli. Toto pravidlo se týká dohledatelnosti práce a nápravou každého jeho nálezu je commit nebo push, nikdy odstranění. Redukci vlastní project.accumulation-is-measured@2 a už říká, že worktree nebo branch, jejíž práce není pushnutá, se nikdy neodstraní.
Zdůvodnění
Dne 2026-09-10 běželo osm workerů najednou, když sdílený účet dosáhl limitu útraty. Všech osm se zastavilo ve stejné vteřině, uprostřed věty. Pět jich už pushlo větev a otevřelo pull request a nic neztratilo. Tři měli hodiny práce, která existovala jen jako změněné soubory ve worktree: dvacet sedm souborů opravených případů, dvacet dva souborů modelu workflow plus záznam rozhodnutí a dvě opravy enginu. Nic z toho nebylo commitnuto. Nic z toho nebylo vidět nikomu kromě workera, který to vytvořil, a ten už neexistoval.
Bylo to obnoveno proto, že to někdo záměrně hledal, po jednom worktree, a každý commitnul jako checkpoint. Ta obnova byla štěstí převlečené za pečlivost: nic v uspořádání ty stromy nedělalo dohledatelnými a nic by neupozornilo na jejich ztrátu. Pozdější pracovník uklízející disk by je smazal jako opuštěné.
Rozlišení, na kterém záleží: zastavení pracovníka není rollback. Transakce, která se přeruší, nechá svět, jak jej našla, a proto je přerušení bezpečné. Pracovník, který se zastaví, zanechá pracovní strom — skutečnou práci v neznámém stavu, kterou nikdo nevlastní. Rozpracovaný stav je normálním výsledkem přerušení, ne výjimečným, a přerušení je normální: limity, timeouty, pády, zavřený notebook.
Je to tentýž fakt, který repozitář už uvádí o větvích, jež nikdy nedorazí na remote — práce na jednom disku se nedá integrovat a je od ztráty jeden disk daleko. Chybělo jen to, že to platí i v rámci jednoho odpoledne, na pracovní strom, a že riziko nese ten, kdo práci rozdal.
Požadované chování
Práce se commituje v posledním okamžiku, kdy byla koherentní, ne v okamžiku, kdy byla dokončena. Checkpoint commit, který otevřeně říká, že je neprověřený, má větší cenu než čistý strom, který existuje jen na jednom disku.
Pracovník, který rozdělí práci dál, odpovídá za její checkpointování. Dlouho běžící práce se checkpointuje a pushuje průběžně, ne na konci, a když se pracovník nečekaně zastaví, jeho worktree se prozkoumá a zachová dříve, než se s ním udělá cokoli jiného — zejména dříve, než se uvolní jakýkoli disk.
Checkpoint je tak označen. Říká, že je nerevidovaný a neověřený, aby ten, kdo ho převezme, s ním zacházel jako s konceptem k posouzení, ne jako s prací, za kterou se někdo postavil. Kdo ho obnoví, přečte diff a každou část ponechá, opraví nebo zamítne a checkpoint nahradí skutečnými commity dřív, než se nabídne k revizi.
Strom přerušeného workera se klasifikuje, nikdy nepředpokládá. Worktree, jehož větev je plně mergnutá, může stále obsahovat psané soubory, které nebyly nikdy commitnuty; absence unikátních commitů není absence práce.
Chování při selhání
convergence.report zamítá tvrzení, ne práci: držba, jejíž dispozice je local_only nebo uncommitted, činí repozitář nesbližným (unconverged) a otázka no-stale-topology invariantu dokončení selže s pojmenovanými držbami a příkazem, který by každou z nich dostal z ohrožení. Nic se nemaže, nic se necommituje za pracovníka a žádná větev se nedotýká — nález je, že práce je někde, kde ji vidí jen jeden disk, a nápravou je push nebo commit, který udělá pracovník.
Repozitář, ve kterém nelze verdikt přečíst, hlásí unknown místo pass: měření, které nešlo provést, není čisté měření.
Ověření
convergence.report— verdikt na příkazovém řádku (majordomus convergence), přes HTTP, na MCP i v Cockpitu, z jednoho čtení topologie worktree, commitů, k nimž žádný remote nedosahuje, a seznamu stash.test/cases/383_convergence_is_enforced.sh— behaviorální případ proti fixture repozitáři: větev, která nedosáhne na žádný remote, a nesledovaný soubor jsou každé ohlášeny jako ohrožené se svým nápravným krokem; push a commit tentýž repozitář zkonvergují; a invariance hotovo odpovíno-stale-topologyz verdiktu, ne z věty o příkazu.- Nález
clonezdoctorstále hlásí větve, jejichž commity nedosáhnou na žádný remote; verdikt je tentýž fakt pro celý repozitář, včetně poloviny — necommitnutých souborů — kterou dosud nic nevidělo.