Přeskočit na obsah

Tato stránka byla automaticky přeložena z angličtiny, jediného jazyka, ve kterém se tento web píše. Číst originál.

Necommitovaná práce peera je součástí jeho claimu a commit, který ji nese, se odmítne

Necommitovaná práce peera je součástí jeho claimu a commit, který ji nese, se odmítne

majordomus://adr/adr-0063navrženo koordinace

63. Nezačleněná práce peera je součástí jeho nároku a commit, který ji nese, se odmítne

Kontext

2026-09-14 pracovaly tři relace Claude v jednom checkoutu catharsis-as-a-service na main. Nástěnka byla přečtena a fungovala tak, jak byla navržena: majordomus context vypsalo

PŘEKRYV jiný worker si nárokuje půdu, kterou si nárokuje tato úloha: p3 si nárokuje templates/components/illustrations.html, uvnitř vašeho templates … claim není zámek; domluvte se s ním, než oba zapíšete

O půl hodiny později commit ba9cb4c — napsaný relací, která nic z toho nenapsala — nesl rozpracované přejmenování jiné relace: čtyři šablony už používající přejmenovanou CSS třídu a stylesheet, který stále deklaroval pravidlo, které přejmenování odstranilo. Dostal se do origin/master a CI prošlo, protože validátor, který by nekonzistenci zachytil, byl v tu chvíli necommitnutý soubor patřící relaci, jejíž práce byla právě commitnuta pod ním. Zotavení znamenalo tři zprávy mezi relacemi a ruční audit, které cesty komu patří.

Nic v nástroji to nemohlo odmítnout. Oba existující mechanismy porovnávají deklarované řetězce: check --overlap čte rozsahy current.yaml jiných worktrees a porovnává obsažení cest, a nástěnka peerů porovnává oznámená tvrzení. Žádný nečte pracovní strom. A rozhodující detail je, že autor těch úprav — tato relace — nikdy nezavolal majordomus_announce vůbec: cesty, které byly pohlceny, nebyly nárokovány nikde, nikým, a přesto byly zjevně rozpracované pro všechno, co se podívalo na git status. scripts/collision-check existuje pro zrcadlový případ a v hlavičce to říká: „nástěnka peerů je paměť procesu — říká, kdo pracuje teď, a nic neříká o branchi, kterou někdo pushnul před hodinou“. Toto je třetí případ: ne pushnutá branch, ne oznámení, ale špinavý soubor na disku, který sdílejí dva procesy.

Rozhodnutí

Tvrzení pracovníka zahrnuje cesty, které změnil a necommitnul. Nástěnka nese pro každého peera množinu cest necommitnuté práce jeho checkoutu — pozorovanou z git status --porcelain, obnovovanou, když peer ohlásí a když kontroluje. Pozorovanou, ne deklarovanou: to je polovina, kterou nelze zapomenout, protože je to to, co pracovník skutečně dělá.

Pozorování nevyžaduje oznámení. Relace, která se nikdy neohlásila, přesto přispívá svými necommitnutými cestami na nástěnku. Incident, který toto rozhodnutí vynutil, neměl oznámení na žádné straně, a mechanismus, který chrání jen zdvořilé, není mechanismus.

Commit, který nese cestu, již změnil a necommitoval jiný živý peer, je odmítnut s exit 15 a jmenuje peera a cesty. To je první odmítnutí v této oblasti — check --overlap končí z návrhu s 0 a majordomus.scope-integrity odmítá jen cesty mimo váš vlastní rozsah. Odmítnutí při commitu je tam, kde je informace ještě levná: po push stojí revert, zprávu a cizí odpoledne.

Únik je výslovný, po cestách a zaznamenaný. --carry <path> záměrně commitne rozpracovaný soubor peera — dokončit něčí práci je legitimní a někdy nutné — a ledger zaznamená, že byl převzat, a od koho. Přepínač, který vypne celou kontrolu, se nenabízí.

Rozhoduje živost a mrtvý peer nic netvrdí. Vlastní živost nástěnky činí necommitovanou práci peera nárokovatelnou; položka relace, která zmizela, nikdy nic neodmítne. Peeři se sbírají napříč repozitářem podle ADR 0044, takže stejný checkout a sourozenecký worktree jsou stejná otázka.

Zamítnuté alternativy

Zamykat soubory. Zámek přečká proces, který ho vzal, a tento repozitář už změřil, co ho opuštěný stav stojí — 192 běžících serverů, 64 worktrees, z nichž 47 bylo špinavých. Odmítnutí nepotřebuje úklid: když je peer pryč, nic neodmítá.

Odmítat jen oznámené cesty. Incident žádné oznámení neměl. Odmítání podle deklarací odměňuje workera, který deklaruje, a nechrání nikoho před tím, kdo zapomene — a zapomenutí je normální případ, ne výjimečný.

Varovat důrazněji. Nástěnka už varovala, přesně citovanými slovy výše, a commit přesto proběhl. Varování, které bylo vytištěno a ignorováno, není důkazem, že bylo příliš tiché.

Přimět každou relaci, aby si vzala vlastní worktree. Je to lepší uspořádání, ale tohle neřeší: worktree je volba, kterou relace dělá na začátku, a tři relace v jednom checkoutu je to, co se skutečně stalo. Odmítnutí nestojí nic, je-li uspořádání už čisté.

Důsledky

Nástěnka získá množinu cest na peera, obnovovanou při announce a při check — jeden git status na obnovení, na checkoutu, který peer už má otevřený.

majordomus commit získává odmítnutí a únik pro jednotlivou cestu a ledger získává záznam každého přenosu.

Workera nyní může zastavit zapomenutý špinavý soubor peera. To je kompromis: cena odmítnutí při commitu proti ceně nekonzistentního commitu na chráněné větvi, kterou tento repozitář už dvakrát zaplatil.

Odkud to pochází

kanonický soubor
.ai/repo/adrs/0063-a-peer-s-uncommitted-work-is-part-of-its-claim-and-a-commit-.md
identity
adr-0063
dostupné také jako
Zdroj MCP majordomus://adr/adr-0063 · majordomus entity show adr/adr-0063 · GET /api/v1/entity?uri=majordomus://adr/adr-0063
v Cockpitu
/cockpit/objects/adr/adr-0063

Tato stránka je generována z výše uvedeného souboru pomocí scripts/generate-site-data; úprava stránky nic nemění, úprava souboru změní všechna rozhraní. Výše uvedené vztahy jsou hrany docs/generated/graph.json, které spustitelný program zapisuje ze stejného indexu.

Prohledává názvy a popisy všech stránek, které tento web publikuje.