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.

Identita se přiděluje nad hladinou nejvyššího dosaženého čísla a kolize se odmítne na větvi

Identita se přiděluje nad hladinou nejvyššího dosaženého čísla a kolize se odmítne na větvi

majordomus://adr/adr-0053navrženo koordinacegovernance

odkazuje na

odkazuje na něj

53. Identita se přiděluje nad horní hranicí a kolize se na větvi odmítne

Kontext

V noci na 2026-09-11 si tři větve tohoto repozitáře nárokovaly identitu rozhodnutí 0044 a dvě 0043. Každý duplikát způsobí, že majordomus generate --strict vyloučí všechny nárokující této identity a odmítne celý strom, a chyba, kterou vypíše, pojmenuje identitu, ne obě relace, které ji zabraly — takže se vada projeví při merge, hodiny od obou příčin, třetí osobě, která musí rozhodnout, který ze dvou hotových dokumentů zahodit.

Tři samostatné relace si té noci každá ručně napsaly týž průzkum, aby našly cestu ven — každý ref, každý worktree, nástěnku — nezávisle a správně. Nic jej nenabízelo. Průzkum už v tomto nástroji existoval, uvnitř mj_adr_next_id, dosažitelný jen navržením rozhodnutí; nikdo se nemohl zeptat, aniž by zároveň zapsal soubor.

Repozitář pro to už má pravidlo, project.work-is-claimed-before-it-is-built, které říká nárokovat si identifikátor, než se na něm staví. Toto pravidlo nešlo dodržet tak, jak bylo napsáno. scripts/collision-check, mechanismus, který jmenuje, čte commitnuté refy; relace, které se srazily, nepushly. Nástěnka peerů, kterou próza pravidla jmenuje jako druhou polovinu, je pamětí procesu a nic z ní identity nečetlo. Pravidlo, jehož předpoklad je v okamžiku použití nepozorovatelný, je třída vad, kterou tento repozitář existuje odstranit.

Rozhodnutí

Přidělování je monotónní. majordomus adr next vydá o jedno víc, než je nejvyšší identita, kterou kdy cokoli zabralo, a nikdy nerecykluje díru v posloupnosti. Díra znamená, že identita byla zabrána a stažena, nebo zabrána a dosud nezapsána; žádný průzkum nerozliší ani jedno od čísla, které nikdo nikdy nepoužil. 0034 je trvalým příkladem — není na žádné větvi, v žádném tagu ani v žádném pracovním stromu a cituje ho ADR 0035 masteru i docs/ENTRY_AUDIT.md. Mezera se proto hlásí jako spotřebovaná, nikoli volná, přičemž čtenáři se jako důkaz uvede, co ji cituje. Hledání citací je důkaz, nikdy mechanismus: díra je spotřebovaná, ať se cokoli, co ji cituje, najde, či nikoli, a právě to drží pravidlo rozhodnutelné.

Průzkum jmenuje své zdroje a svůj jmenovatel. Čtyři, a každý hlásí, co si nárokoval: tento pracovní strom, každý sourozenecký worktree tak, jak stojí na disku, každý ref (větve, tagy, sledované remote refs a HEAD každého propojeného worktree, v jednom git log --all --no-renames --diff-filter=A) a nástěnka peerů sdíleného serveru. Nástěnka je jediný zdroj, který ví o identitě, kterou se relace rozhodla převzít a nikam ji nezapsala — tak byla 0034 rezervována pro feature/peer-board-survives-restart, aniž existovala jako soubor. Zdroj, který nebylo možné oslovit, to říká; nikdy se tiše nevynechá ze jmenovatele, protože důvodem, proč tři relace napsaly každá svůj vlastní průzkum, bylo, že žádná zdejší odpověď žádný nenesla.

Kolize je odmítnuta na branchi, v době commitu. majordomus adr check nyní klade ostatním refům otázku, na kterou žádný jednotlivý strom o sobě odpovědět nedokáže: pro každou identitu, kterou tento strom oproti základu přidává, nese jiný ref odlišný dokument na tomto místě? Pojmenuje oba dokumenty, oba refy a příkaz, který najde volné číslo. doctor provádí stejné zkoumání a doctor je pre-commit hook, takže odmítnutí přistane tam, kde je ještě levné na ně reagovat. Kontrola CI adr-collision spouští tentýž příkaz; existuje jeden soupis identit rozhodnutí, nikoli dva.

Různé znamená různé jméno souboru. Dva refy držící stejnou cestu jsou úprava a úprava se řeší mergem; dva refy držící 0044-cooperation-is-… a 0044-the-model-catalogue-is-… jsou volba mezi dvěma hotovými kusy práce. Odmítá se jen to druhé.

project.work-is-claimed-before-it-is-built zůstává advisory. Jeho polovina s identifikátory je nyní mechanicky rozhodnutelná a hlídaná kontrolou; polovina s cestami není a nesmí být — dvě implementace, které dorazí do jednoho modulu, je někdy správná věc přijmout záměrně a nic to nemůže rozhodnout mechanicky. Povýšit celé pravidlo, protože polovina je vynutitelná, by přinutilo nástroj odmítnout úsudek, který patří člověku.

Zamítnuté alternativy

Registr přidělených identit. Soubor vypisující, která čísla jsou obsazena. Je to druhý inventář něčeho, co strom už uvádí, zastará v okamžiku, kdy se branch opustí, a dvě relace, které ho upravují, kolidují přesně jako kolidovaly nad ADR — vada, jen přesunutá.

Recyklace mezer. Přidělit 0034, protože tam žádný soubor není. Tak to dělá naivní průzkum, tím se dva správné průzkumy téhož důkazu rozcházejí a rozbilo by to citaci ADR 0035. Řídká posloupnost nestojí nic.

Nový skript vedle adr check. scripts/ci/adr-collision-check byl nasnadě a byl by druhým čtenářem adresáře rozhodnutí, který by se od prvního rozcházel. Zkoumání patří do příkazu, který už vlastní integritu ADR, kde ke stejnému kódu míří adr check, doktrína adr-integrity, pre-commit hook i kontrola CI.

Druhé místo síťového volání pro nástěnku. SECURITY.md, project.no-network-no-eval a test/cases/08_no_forbidden_constructs.sh každé jmenuje lib/context.sh jako jedinou deklarovanou výjimku a drží ji u jejího tvaru v obou směrech. Načtení nástěnky bylo v tom souboru vyčleněno do mj_peer_board a voláno z alokátoru: jedno místo volání, dva volající.

Blokování na tvrzení na nástěnce. Nástěnku čte alokátor, ne kontrola. Kontrola, jejíž verdikt závisí na tom, které procesy jsou právě připojeny, není v CI reprodukovatelná a project.blocking-checks-cheap žádá, aby blokující kontrola byla deterministická. Nástěnka informuje alokaci; o odmítnutí rozhodují refy.

Důsledky

Shellový nástroj nemá vlastní identitu peera — čte nástěnku přes HTTP a nástěnka odpovídá relacím, ne příkazům — takže relace, která ohlásí přidělení a poté spustí adr next, je přeskočena přes vlastní nárok. To stojí jednu identitu z řídké posloupnosti a je to bezpečný směr; výstup říká, že horní mez pochází z nároku na nástěnce, aby ji čtenář poznal.

Cena průzkumu je jedno ls-tree základny na běh a jedno git log nad adresářem rozhodnutí — zde naměřeno na pětinu sekundy přes každý ref a celou historii (git for-each-ref | wc -l říká, kolik to je) — a druhé z nich běží jen tehdy, když tento strom skutečně přidává identitu. Proti tomu, co adr check už utratí parsováním záznamů, to není měřitelné; MJ_TIMING=1 majordomus adr check to na kterémkoli stromě řekne.

Kontrola nyní selže na větvi, která přečísluje rozhodnutí na identitu, kterou už jiná větev publikovala. To je zamýšlená cena: alternativou je totéž selhání, později, proti generate --strict, kdy už obě relace nejsou rozlišitelné.

--no-renames je v průzkumu refů nosné. Detekce přejmenování je ve výchozím stavu zapnutá a rozhodnutí s upraveným slugem přijde jako R, ne A; bez příznaku průzkum podceňoval vlastní refy tohoto stromu a alokátor, který podceňuje, je horší než žádný alokátor. majordomus adr next vypíše, co každý zdroj tvrdil, takže selhání je vidět, ne odvozeno.

Odkud to pochází

kanonický soubor
.ai/repo/adrs/0053-an-identity-is-allocated-above-the-high-water-mark-and-a-collision-is-refused-on-the-branch.md
identity
adr-0053
dostupné také jako
Zdroj MCP majordomus://adr/adr-0053 · majordomus entity show adr/adr-0053 · GET /api/v1/entity?uri=majordomus://adr/adr-0053
v Cockpitu
/cockpit/objects/adr/adr-0053

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.