Architektonická rozhodnutí repozitáře jako objekty: co se rozhodlo, proč, co to stálo a odkud záznam pochází. V sekci vrstvy adrs.
Rozhodnutí je soubor .ai/repo/adrs/<NNNN>-<slug>.md — YAML front matter splňující share/schemas/majordomus/adr/adr.v1.schema.json nad tělem nesoucím # Context, # Decision a # Consequences. Nic jej neregistruje: třída zdroje adr v .ai/repo/knowledge/sources.yaml jej objeví nad sledovaným stromem, což je táž deklarace, kterou indexuje spustitelný soubor v Rustu. Kontrakt viz SCHEMAS.md.
majordomus adr list [--status <status>] [--json] every decision: id, status, date, title
majordomus adr show <id> [--json] the path, then the file as written
majordomus adr next [--json] the next free identity, and every source surveyed
majordomus adr propose "<title>" [--from <ref>]... write a new decision, status proposed
[--tag <tag>]... [--supersedes <id>]
majordomus adr check [--json] validate every decision and every reference
majordomus adr affected [--base <ref>|--staged|--worktree] [--json] the decisions a change set touches
-
listvypíše jeden řádek na každé objevené rozhodnutí, včetně neplatných;--statusfiltruje na jedno zproposed,accepted,superseded,rejected. -
showvypíše cestu relativní k repozitáři na prvním řádku a pod ní soubor. Id, které není rozhodnutí, skončí kódem12a pojmenujeadr list. -
nextodpovídá, jaká je další volná identita, a říká, na co se při rozhodování podíval. Čtyři zdroje, z nichž každý hlásí, kolik identit si nárokoval: tento pracovní strom, každý sourozenecký worktree tak, jak je na disku (autorsky napsané a dosud necommitnuté je skutečný nárok), každý ref — větve, tagy, remote-tracking refy aHEADkaždého propojeného worktree, v jednomgit log --all --no-renames --diff-filter=A— a nástěnka peerů sdíleného serveru, která je jediným zdrojem, jenž ví o identitě, kterou se relace rozhodla vzít a nikam ji nezapsala. Zdroj, který nebylo možné oslovit, se hlásí jako nedostupný a nikdy se mlčky nevypouští ze jmenovatele. Alokace je monotónní: o jedna nad nejvyšší identitou, kterou kdy cokoli nárokovalo, nikdy do mezery. Mezera znamená, že identita byla vzata a stažena, nebo vzata a dosud nezapsána, a nic nepozná jedno či druhé od čísla, které nikdo nikdy nepoužil —0034tohoto repozitáře není na žádné větvi, v žádném tagu ani v žádném pracovním stromu aADR 0035ji cituje. Mezery se proto uvádějí jako spotřebované, s tím, co je cituje, pojmenovaným jako důkaz pro čtenáře. Shellový nástroj nemá vlastní identitu peera, takže relace, která ohlásila alokaci a pak se ptá, je přeskočena přes svůj vlastní nárok; výstup říká, kdy horní hranice pochází z nároku na nástěnce.proposealokuje přes stejný průzkum. -
proposezapisujestatus: proposeda nic jiného. Neexistuje způsob, jak zapsataccepted:--statusskončí s15a jmenuje důvod, protože nástroj, který umí zapsataccepted, mění vlastní odvození v pravdu repozitáře a pozdější čtenář nepozná, která rozhodnutí skutečně učinil člověk. Identita se přiděluje pod zámkem nad adresářem sekce, takže dva worktree navrhující ve stejný okamžik dostanou dvě identity. Reference--fromje<type>:<value>s typem jedním zdecision,session,commit,issue,file,test; cestafile:nebotest:, která neexistuje, skončí s2. Odkazovaný důkaz činí záznamprovenance.origin: extracteda extrahovaný záznam bez důkazu se odmítne jako pouhé tvrzení.--supersedeszapisuje obě poloviny vztahu, takže řetězec lze projít z obou konců. -
relatedje druhá polovina odkazů záznamu a je autorská, nikoli zapisovanápropose:rule:<id>,claim:<id>,file:<path>,test:<path>— co rozhodnutí uvedlo v platnost, na rozdíl odprovenance.derived_from, což je to, odkud pochází. Každý je validován tam, kde podle svého typu cíl žije, a extraktor z něj udělá hranu grafu (declares,supports,references,tested_by), takže opačný směr — které rozhodnutí uvedlo toto pravidlo v platnost — jeknowledge edges, a ne druhý seznam, který by někdo udržoval v souladu. -
checkvaliduje každý záznam proti seznamu povolených klíčů generovanému ze schématu (žádný neznámý klíč),schema: adr/v1, uzavřené množině stavů,id, jehož číslo se rovná prefixu názvu souboru, a povinným sekcím těla; a napříč množinou: duplicitní identity, záznamsupersededbezsuperseded_by, jednostranné nahrazení a odkaz, který se nikam nepřeloží. Při jakémkoli selhání skončí kódem10. -
checkklade i otázku, na kterou žádný jednotlivý strom o sobě odpovědět nemůže: pro každou identitu, kterou tento strom oproti základu přidává (origin/master,origin/main,master,main, v tomto pořadí;MJ_ADR_BASEpřepíše a je pak jediným kandidátem), nese jiný ref odlišný dokument na téže identitě? Odlišný název souboru je konkurenční nárok a odmítne se se jmenováním obou dokumentů, refů, které nesou ten druhý, amajordomus adr next; stejný název souboru na dvou refech je úprava a řeší se sloučením. Verdikt vždy uvádí svůj předmět — kolik identit bylo přidáno a proti čemu se měřily — a když se základ nevyřeší, říká, že ostatní refy nebyly prozkoumány, místo aby skončil čistě, aniž by cokoli řekl.doctorprovádí totéž zkoumání adoctorje pre-commit hook, takže kolize se odmítne na větvi, a ne až při merge, kde bygenerate --strictvyloučil každého žadatele a jmenoval jen identitu.ADR 0053je zdůvodnění. -
affectedčte sadu změn — ve výchozím stavu pracovní strom protiHEAD,--stagedpro index,--base <ref>pro<ref>..HEADplus pracovní strom — a jmenuje každé rozhodnutí, jehož vlastní soubor se změnil nebo jehožrelatedjmenuje cestu, které se změna dotýká (odkaz na adresář pokrývá vše pod ním). Každá položka je poznámka k reviziWARNa exit kód zůstává0: zda rozhodnutí stále platí poté, co se pohnul kód, který řídí, je úsudek, který nástroj činit nesmí. Je to obrácená otázka, na kterou odpovídá graf — co rozhodlo o tomto souboru? — položená ze sady změn, a ne ze záznamu.
doctor a watch spouštějí stejné zkoumání přes doktrínu majordomus.adr-integrity. Práh pro zaznamenání rozhodnutí vůbec je pravidlo majordomus.decision-threshold, o kterém rozhoduje revizor: nástroj validuje záznamy a hlásí, čeho se změna dotýká, a nikdy netvrdí, že ví, že diff ztělesňoval rozhodnutí.
$ majordomus adr propose "The registry is the one canonical declaration" --from file:docs/CAPABILITIES.md
proposed: adr-0011 The registry is the one canonical declaration
.ai/repo/adrs/0011-the-registry-is-the-one-canonical-declaration.md
status is "proposed"; accepting it is a person editing that field.
$ majordomus adr check
examined 11 decision(s) in .ai/repo/adrs/
every identity unique, every status known, every reference resolves