Zdůvodnění
Dne 2026-10-16 byl primární checkout tohoto repozitáře o 779 commitů za origin/master a obsahovalo necommitnuté změny, které nikdo nedokázal přiřadit. Jeho sdílený server — ten, ke kterému se přes MCP připojuje každá relace připojená k primáru — odpovídal na dotazy k plánu z tohoto stromu, takže přehled čtrnácti „otevřených“ úkolů byl naplánován proti plánu, v němž už bylo třináct z nich hotových. Lokální master, který worktree create poté použil jako základ každé nové větve, byl zpožděn úplně stejně. Každý povrch byl připraven, každá kontrola zelená a nic nikde neříkalo „tento strom není trunk“.
Server, který poskytuje zastaralý strom, není zastaralý server: jeho verze je aktuální, jeho lease platný, jeho peery připojené. Zastaralost je fakt o checkoutu a nebyla v žádném údaji. To je vada, kterou toto pravidlo uzavírá: vzdálenost se měří, uvádí všude, kde se odpověď poskytuje, a posuzuje se proti deklarovanému číslu.
Model spolupráce, který vlastník stanovil 2026-10-16 — vždy aktuální, záchrana před resetem, časté release — je zaznamenán jednou, v ADR 0167 a v pravidle, které jej nese, a ADR 0156 (navržené) jmenuje aktuálnost jako jeden z faktů, s nimiž se relace připojuje ke clusteru. Toto pravidlo není druhým vyjádřením ani jednoho z nich. Je to měření, o které se oba opírají, a kontrola, která znemožňuje přehlédnout zastaralý checkout.
Požadované chování
Vzdálenost se odvozuje, nikdy neuchovává. worktree::trunk::measure počítá pomocí rev-list --count commity vzdáleného trunku, které checkoutu HEAD chybějí (behind), a commity HEAD, které vzdálenému trunku chybějí (ahead), a totéž pro lokální branch trunku. Vzdálený trunk je nakonfigurovaný upstream trunku, jinak remote, jehož HEAD trunk jmenuje, jinak první remote nesoucí branch toho jména. Nic se nefetchuje a nic se nezapisuje: odpověď platí k poslednímu fetch a čas onoho fetch (FETCH_HEAD) je její součástí.
Posuzuje se podle politiky a jen podle politiky. checkout.trunk_distance deklaruje warn_behind a fail_behind. Na prvním prahu nebo za ním je checkout lagging; na druhém nebo za ním stale. Vzdálenost bez deklarovaného prahu je unjudged, trunk bez remote-tracking branche je unmeasured; ani jedno se nikdy nehlásí jako current a žádný čtenář nedodává číslo, které politika nenapsala.
Hlásí se všude, kde se strom servíruje. majordomus worktree trunk (worktree.trunk, majordomus_worktree_trunk) na ni odpoví samostatně a při zastarání skončí s exit 10; majordomus worktree status ji vytiskne a vrátí (trunk_distance); server.status (serve status, majordomus_server, /api/v1/server) ji nese jako trunk; instrukce MCP initialize uvádějí zaostávající, zastaralou nebo neposouzenou vzdálenost ve větě, kterou každý klient čte při každém připojení; doctor ji vykreslí pod clone/trunk.
Zastaralé selhává. Doctor selže na zastaralém checkoutu — a s ním commit hook, který doctor spouští — a varuje u zaostávajícího s příkazy, které ho zaktualizují. Probíhající merge počítá commity, které přináší, takže commit, který zastaralou branch zaktualizuje, se nikdy neodmítne kvůli stromu, který nahrazuje. Lokální trunk repozitáře linked worktree je k posunutí jiného checkoutu, takže se v linked worktree hlásí jako varování (clone/local-trunk) a nikdy nezpůsobí selhání commitů toho worktree.
Aktualizovat bez ztráty čehokoli. Špinavý checkout se před přesunem zachrání: git stash create vytvoří commit nepotvrzeného stavu bez doteku stromu, git update-ref refs/rescue/<checkout>-<timestamp> <sha> jej uchová a nesledované soubory se zkopírují vedle; teprve potom se checkout trunku posune fast-forwardem (nebo resetuje na vzdálený trunk) a feature větev sloučí vzdálený trunk místo přepsání toho, co bylo pushnuto. Typovaný majordomus worktree update, který to dělá a odmítá, dokud v checkoutu stojí proces, je další řez; dokud nepřistane, nápravou, kterou každé čtení jmenuje, je posloupnost, kterou člověk spouští.
Důkaz
test/cases/3176_a_checkout_serves_the_current_trunk.sh: fixture remote předběhl svůj klon;worktree statushlásí přesné vzdálenosti pro checkout a lokální trunk, posouzenéstalea po fast-forwarducurrent; doctor hlásí FAILclone/trunk, dokud je zastaralý, a projde, jakmile je aktuální; probíhající merge se počítá jako přítomný; klon bez remote jeunmeasured.- Jednotkové testy
apps/majordomus-cli/src/worktree/trunk.rsa doctestyjudge,TrunkThresholdsaCheckoutPolicydrží každou větev posouzení.