Zaznamenat důkazy proti aktivní úloze: jeden závazek, který deklarovala, splněný, nebo jedna validační kontrola modelu CI, která podala zprávu.
majordomus evidence --covers <token> [--type <kind>] (--command <cmd> | --artifact <ref>) [--result <r>] [--json]
majordomus evidence --gate <id> --exit <status> [--command <cmd>] [--result <r>] [--json]
majordomus evidence <show|claim|proves|record|stamp> [options]
Třetí forma patří druhému programu. Každý argument, který tento příkaz přijímá, je volba, takže slovo na první pozici nikdy není jeho vlastní: show, claim, proves, record a stamp jsou podpříkazy spustitelného souboru v Rustu, který drží knihu toho, co proběhlo (EVIDENCE.md), a launcher mu je předá se všemi argumenty beze změny — včetně --repo na kterékoli straně příkazu. Jejich návratové kódy jsou kódy spustitelného souboru a nepotřebují aktivní úlohu. Která slova to jsou, se čte z vlastní deklarace spustitelného souboru (docs/generated/cli.yaml v checkoutu, help evidence <word> dodaného spustitelného souboru v nainstalovaném stromu), takže majordomus evidence --help vypíše přesně ty podpříkazy, které tato instalace dosáhne. Slovo, které nemá žádný z programů, se zde odmítne s kódem 2. Zbytek této sekce je o prvních dvou formách.
Obě formy zaznamenávají různé druhy faktů a nikdy nejsou jedním voláním. Povinnost je slib, který úloha dala; kontrola je to, co o stromu řekla validační pipeline. Řádek, který by se tvářil jako obojí, by se nedal číst jako ani jedno, takže zadání --covers a --gate zároveň skončí kódem 2.
scope úlohy říká, kam smí pracovník zapisovat; její requires říká, co pracovník dluží, než bude dostupný výsledek completed. Tokeny jsou deklarovány v share/obligations.yaml — implementation, tests, docs, generated, rules, commit, push, target, pages, deploy, verify — každý jmenuje příkaz, který jej splácí, a tam, kde je fakt lokální, pathspecs, nad nimiž se berou jeho důkazy.
Čtyři z nich se zde nikdy nezaznamenávají. commit, push, target a pages jmenují fakta, která nástroj dokáže zjistit — čistý strom, remote-tracking ref, který dosáhne hlavy, kmen, který ji dosáhne, publikovaný web, který ji servíruje — a check a finish je rozhodují živě na HEAD, místo aby po pracovníkovi chtěly jejich přepis. Zaznamenat takový token nemá žádný účinek: zjištěný závazek se splácí tím, že je pravdivý, a odmítá se tím, že je nepravdivý. Kde to checkout nemůže rozhodnout (žádný remote, žádná zaznamenaná výchozí větev, web, který nikdy neodpověděl), token se vrací k zaznamenanému řádku a nález říká, o který šlo. deploy a verify zůstávají zaznamenávány ručně a share/obligations.yaml jednou řádkou říká proč: nasazení je fakt o stroji, který tento repozitář nikdy neoslovuje.
--command nebo --artifact je povinné: vyprávění není důkaz. Token, který slovník nedeklaruje, skončí s 2; token, který aktivní úloha nikdy neslíbila, skončí s 15, protože zaznamenávat důkazy pro něco, o co nikdo nežádal, je způsob, jak checklist roste o položky, které nikdo nechtěl.
Zapisuje: řádek task.evidence do knihy, nesoucí povinnost, způsob jejího splnění, příkaz nebo artefakt a hash sledovaných souborů, které povinnost jmenuje. Nezapisuje se nic jiného; kniha je už jen pro připisování, uspořádaná a kontrolovaná na integritu a její obálka už nese hlavu, větev a relaci.
Právě ten hash je podstatou. Důkaz splácí závazek, jen dokud se přepočtený hash jeho vstupů rovná zaznamenanému, takže změna kteréhokoli souboru, který závazek jmenuje, důkaz odebere, místo aby jej nechala být — táž otázka aktuálnosti, kterou klade vlastní source_hash webu, položená výsledku testu. Závazek, jehož fakt je vzdálený (push, integrace, publikace, nasazení), nemá žádné vstupy a je vázán na commit, v němž byl pořízen, posuzovaný exact | advanced | diverged | different_context jako každý jiný zdejší záznam.
check a finish vyhodnocují každou povinnost při každém běhu přes doktrínu majordomus.obligation-closure, takže zastaralý důkaz je vidět dřív, než na něm někdo staví; odmítnut je jen výsledek completed. Worker, který hlásí blocked, je upřímný, a jeho odmítnutí by ho naučilo tvrdit raději completed.
Zaznamenání kontroly
--gate jmenuje kontrolu z .ai/repo/ci/gates.yaml, modelu CI tohoto repozitáře, a --exit stav, který ohlásila; 0 je úspěch. Kontrola, kterou model nedeklaruje, končí kódem 2, stejně jako --exit, které není číslo.
majordomus evidence --gate rust-check --exit 0 --command 'scripts/rust-check --ci'
Zapisuje: řádek task.gate do knihy, nesoucí kontrolu, její návratový kód a hash souborů, které ji vybírají. Ty soubory se odvozují z modelu, nedeklarují se: sjednocení cest každé třídy, která kontrolu pojmenovává, a vše pro kontrolu, kterou vybírá každý plán, protože kontrola, kterou vybírá každý plán, je kontrola, kterou může zneplatnit jakákoli změna. Změňte jeden z nich a běh přestane kontrolu splňovat — zacommitováno či ne, protože sada změn, nad níž se úloha posuzuje, zahrnuje její pracovní strom.
check a finish vyhodnotí každou kontrolu, kterou vybere vlastní sada změn úlohy, přes doktrínu majordomus.completion-gates, a každou hlásí v jednom slovníku:
| status | význam |
|---|---|
pass | proběhlo nad těmito vstupy a skončilo s kódem 0 |
fail | běželo nad těmito vstupy a neběželo |
stale | běžela a soubory, které ji vybírají, se od té doby změnily |
blocked | něco, bez čeho nemůže běžet, neprošlo |
queued | plán jej vybere a žádný běh dosud nehlásil |
exempt | nic, co tato změna udělala, to nemůže učinit pravdivým ani nepravdivým |
unknown | nelze ho zde vůbec posoudit — model, který se nenaparsuje, čtečka, která není sestavena, chyby nebo žádná odpověď, žádné jq |
fail, stale, blocked a unknown odmítnou výsledek completed: completed je tvrzení, že verdikt je znám, a verdikt, který nešlo přečíst, jej nemůže podpořit. Každý jiný výsledek je přijat i nad kterýmkoli z nich, označený „not refused“, a check hlásí, aniž by odmítal. Repozitář, který nedeklaruje žádný model CI, nemá žádnou kontrolu, o které by mohl být verdikt neznámý, a nic neodmítá. queued se hlásí jménem, nikdy se nepřijme jako pass a nikdy se neodmítne: verdikt, který nikdy nepřišel, a verdikt, který řekl pass, jsou různé skutečnosti, a 2026-09-10 nesl trunk tohoto repozitáře přes noc tři vady rozbíjející branch, protože vypadaly stejně (majordomus.never-reported-is-not-green).
Celý verdikt — každá kontrola, plán, který ji vybral, které závazky změna implikuje, a dvaadvacet otázek invariantu hotovo se zdrojem, který každou zodpověděl — je jeden dokument, gates.completion, čtený stejně příkazovou řádkou, HTTP API, MCP i Cockpitem:
majordomus-cli run gates.completion --input '{}' --format json | jq '.output.questions'Závěrečné otázky
Tři z těchto otázek jsou ty, které si člověk klade, když relace končí, a pracovník není jejich zdrojem (project.a-closing-question-is-answered-by-measurement). Každá se čte ze záznamu, který drží daný fakt, měřeno od začátku úlohy:
| otázka | ptá se | čteno z | když to není pass |
|---|---|---|---|
no-new-debt | není zaznamenaný dluh větší než při zahájení úlohy? | položky každého .ai/repo/*-baseline.txt v commitu, na kterém úloha začala, a v pracovním stromu | fail, jmenuje každý základ, který vzrostl, a o kolik |
nothing-accumulated | zmizela znovu každá větev a worktree, které od té doby vznikly? | reflogy gitu: kdy začala každá lokální branch a každý připojený worktree | queued, s uvedením toho, co zbývá, a se součty nyní |
backlog-not-grown | byl od té doby uzavřen každý otevřený pull request? | zaznamenané pozorování forge (majordomus prs refresh) | queued, s jejich očíslováním; unknown, když forge nebyl od zahájení úlohy pozorován |
Jsou to čtení repozitáře, ne jednoho pracovníka: git neříká, kdo větev vytvořil, takže větev, kterou vytvořila jiná relace od začátku úlohy, se počítá. Čtení, které nešlo provést, je unknown a říká proč; nikdy to není pass. majordomus check pojmenovává každou dosud dluženou otázku jako id=status na jejím řádku done, takže odpověď na „je vše hotovo a nezanechalo to repozitář větší, než ho našlo?“ je jeden příkaz, ne vzpomínka; důkazy za každým slovem jsou v questions dokumentu výše.