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.

Co už si nárokuje cestu, se ověří dřív, než se na ní začne stavět

Co už si nárokuje cestu, se ověří dřív, než se na ní začne stavět

majordomus://rule/project.work-is-claimed-before-it-is-built@1aktivní koordinaceproces

odkazuje na

Nic. Tento objekt nedeklaruje žádný odkaz.

Zdůvodnění

Dne 2026-09-09 pracovalo v tomto repozitáři osm relací a dvě z nich nezávisle postavily subsystém release — stejnou cestu modulu, stejnou skupinu příkazů, stejný generovaný changelog — po několik hodin. Obě volaly majordomus_announce. Žádné oznámení neexistovalo, když ta druhá začínala. Nástěnka peerů je paměť procesu: říká, kdo pracuje teď, a nic neříká o větvi pushnuté hodinu předtím, než proces začal. Trvalý signál tu byl celou dobu a nikdo se na něj nepodíval — origin/int/land-all už před začátkem obou relací nesla apps/majordomus-cli/src/release/. Git odpověď znal; protokol se ho jen nikdy nezeptal.

Dva návrhy, které dorazí na stejnou cestu, nejsou konflikt při merge, který se vyřeší spojením dvou diffů. Je to volba mezi dvěma hotovými kusy práce a ten, který prohraje, vznikl zbytečně — hodiny času jedné relace strávené nad otázkou, na kterou by dotaz git odpověděl, ještě než práce začala.

Požadované chování

Než implementujete cokoli, co vytváří nový modul, skupinu příkazů, druh dokumentu nebo generovaný artefakt, zeptejte se, co si už tyto cesty nárokuje: scripts/collision-check --new <paths> čte každou lokální i vzdálenou větev kvůli verzi těchto cest, která se liší od báze, ne jen větve aktivní právě teď. Oznamte až poté, co jsou cesty volné nebo co byla kolize přečtena a pochopena — majordomus_announce říká, kdo pracuje teď, collision-check říká, co už bylo postaveno.

Kontrola čte commitnuté refy, lokální i vzdálené. Práce v indexu nebo necommitnutá je pro ni neviditelná, stejně jako identifikátor, který relace právě chce alokovat, ale ještě nepushla — dvě relace, které si ve stejné minutě přečíslují ADR navzájem, je přesně to, co sken větví nevidí. Obě poloviny tedy nejsou zaměnitelné: scripts/collision-check odpovídá, co bylo pushnuto, majordomus_announce odpovídá, co se právě píše, a ohlášený záměr by měl jmenovat alokované identifikátory stejně jako cesty.

U identity rozhodnutí se už nic z toho neptá ručně, protože ruční ptaní bylo to, co selhalo: 2026-09-11 si tři větve nárokovaly ADR 0044 a dvě 0043 a tři samostatné relace napsaly pokaždé stejný průzkum, aby tomu unikly. majordomus adr next je ten průzkum — každý ref, každý tag, pracovní strom každého sourozeneckého worktree a nástěnka peerů, každý hlásí, co si nárokoval, a řekne to, když se k němu nelze dostat — a alokuje nad nejvyšší dosaženou značkou, ne do díry, protože díra je identita, která byla vzata a stažena, nebo vzata a ještě nezapsána. Číslo, které vám dá, oznamte, než ho napíšete.

Druhá polovina toho není rada. majordomus adr check odmítne identitu, kterou tato větev přidává a u které jiný ref už nese jiné rozhodnutí, jmenujíc oba dokumenty a oba refy; doctor provádí stejné zkoumání a doctor je hook pre-commit. To činí toto pravidlo dodržitelným pro identity: tvrzení, které žilo jen v nepushnuté větvi, bylo nepozorovatelné, dokud nebyla větev pushnuta, což je předpoklad, který nikdo nemohl splnit. ADR 0053 je zdůvodnění; test/cases/271_adr_allocation.sh je důkaz.

Chování při selhání

scripts/collision-check skončí s kódem 11, když je cesta nárokována kolizí, a jmenuje nárokující větve, jejich poslední commit a jak dávno přistál; kód 0 znamená, že na jmenovaných cestách nic nekoliduje; kód 12 znamená, že nemohl měřit — mělký repozitář, base nebo head, které se nevyřeší, nebo žádná jiná větev než base, se kterou porovnávat — a nikdy se nečte jako „nic si to nenárokuje“; kód 2 je chyba použití. U cesty, kterou base nemá, se větev nesoucí stejné bajty (záchranná kopie), sdílející commit, který cestu přidal (práce postavená na té druhé), nebo bajtově shodná na jiných cestách, které head přidává (kopie téže práce, která se od té doby rozešla), vypíše a není kolizí; kolizí je jen cesta přidaná nezávisle na obou stranách s odlišným obsahem. Cesta deklarovaná merge=derived se při merge znovu vygeneruje a počítá se, neposuzuje.

Pravidlo zůstává jako zvyk jen doporučením — spustit kontrolu před implementací — ale už to není jen zvyk. Kontrola collision-check (scripts/ci/collision-gate) se na ni ptá u každého pull requestu, nad každou cestou, kterou pull request přidává, a kolizi odmítne. Kolize cesty je někdy správné přijmout záměrně — dvě implementace, které stojí za srovnání, nebo opuštěný branch, který není na vás mazat — a nic zde to nedokáže rozhodnout mechanicky, takže rozhodnutí zůstává tam, kam patří: člověk označí pull request collision:accepted a kolize se recenzentovi přesto vypíše.

Polovina s identifikátorem je přesto hlídána kontrolou, protože tam úsudek neexistuje: dvě rozhodnutí na jednom čísle nejsou nikdy záměrná. majordomus adr check skončí s kódem 10 a jmenuje oba dokumenty, oba refy a majordomus adr next; doctor to hlásí jako selhání adr a commit odmítne.

Ověření

scripts/collision-check je kontrola cest a do 2026-09-13 ji nic nespouštělo: šablony bootstrapu providerů ji jmenovaly a žádný hook, recept ani workflow ji nevolal. Nyní ji volá kontrola collision-check v .ai/repo/ci/gates.yaml, při každém plánu úlohy structure, která dělá checkout s fetch-depth 0. test/cases/566_the_collision_guard_has_a_caller.sh ji dokazuje proti fixtuře repozitáře s holým originem v podobě, jakou má CI (odpojený merge commit): nová cesta, kterou jiná nesloučená větev přidává jinak, je odmítnuta a větev je jmenována; cesta, kterou přidává jen pull request, projde; vlastní větev pull requestu, pushnutá větev, na níž je postaven, a rescue kopie se stejnými bajty nejsou kolize; sloučená větev držící starší verzi souboru není nárokující strana; a mělký či jednovětvový klon skončí s kódem 12, nikoli 0.

Pro identity rozhodnutí existuje verdikt místo zvyku: test/cases/271_adr_allocation.sh dokazuje oba směry — strom, který přečísluje rozhodnutí na identitu, kterou už nese jiný ref, odmítne adr check i doctor, a strom, který vezme to, co adr next označí za volné, projde — a kontrola adr-collision v .ai/repo/ci/gates.yaml spouští stejný příkaz v CI.

Odkud to pochází

kanonický soubor
.ai/repo/rules/project/work-is-claimed-before-it-is-built.v1.md
identity
project.work-is-claimed-before-it-is-built@1
dostupné také jako
Zdroj MCP majordomus://rule/project.work-is-claimed-before-it-is-built@1 · majordomus entity show rule/project-work-is-claimed-before-it-is-built-1 · GET /api/v1/entity?uri=majordomus://rule/project.work-is-claimed-before-it-is-built@1
v Cockpitu
/cockpit/objects/rule/project-work-is-claimed-before-it-is-built-1

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.