○zaručeno
Drift a rekonciliacezákladnímaintainerzapisuje stav
Politika se změnila, ale projekce ne. Generovaný soubor byl upraven ručně. Záznam úlohy popisuje commit, který větev už neobsahuje. Každé z toho je neviditelné, dokud se něco dále po proudu nezačne chovat podivně.
watch: hlásí drift napříč politikou, projekcemi, stavem, rozsahem, záznamy a retencí
update: --dry-run ukáže, co by regenerace změnila, dřív než to změní
setup: policy-drifted
given:
- 'installed and generated, then the policy was edited without regenerating'
steps:
- id: detect
run: ['watch']
note: 'the projection no longer matches the policy it was rendered from'
expect:
exit: 11
stdout_contains: ['DRIFT']
- id: regenerate
run: ['update']
note: 'the projections are rendered again from the edited policy'
expect:
exit: 0
stdout_contains: ['CLAUDE.md']
- id: clean
run: ['watch']
note: 'nothing disagrees any more'
expect:
exit: 0
stdout_contains: ['watch: 0 drift']
- id: what-happened
run: ['history']
note: 'the ledger says what changed and when'
expect:
exit: 0
stdout_contains: ['projections.updated']
then:
- 'drift is a deterministic disagreement between policy, projection and git, reported by name'
Každý nález nese příkaz, který jej reprodukuje, a produkují jej tatáž pravidla jako selhání — jeden slovník, jeden registr, jiná otázka.
Scénář
Provedeno proti skutečnému nástroji v repozitáři připraveném pomocí policy-drifted, při každém generování tohoto webu. To, co následuje, není popis toho, co by se mělo stát; je to to, co se stalo.
dáno
- ·nainstalováno a vygenerováno, pak byla politika upravena bez regenerace
kdy
- 1
majordomus watch - 2
majordomus update - 3
majordomus watch - 4
majordomus history
pak
- ·drift je deterministický nesoulad mezi politikou, projekcí a gitem, hlášený jménem
Co nástroj udělal
Důkazy o běhu, ze kterého byla tato stránka vygenerována: pass, kroků: 4. Výstup je normalizovaný: cesta k repozitáři, časová razítka, identifikátory a doby trvání jsou zástupné hodnoty, nic dalšího se neupravuje.
Testováno v test/cases/94_use_cases.sh, který spouští každý scénář a odmítne krok, jehož zaznamenaný výstup není tím, co vyprodukoval.
-
projekce už neodpovídá politice, ze které byla vykreslena
OK knowledge graph — buildable here: 98 node(s), 58 edge(s), compiled into a temporary file and removed; no stored index to go stale
OK layout .ai/manifest.yaml — schema ai-repository/v1
OK layout .ai/repo/scope.yaml — version 1; 14 in pathspec(s); every key is one the schema declares
OK layout .ai/local/ — ignored, and nothing under it is tracked
OK layout .ai/ — every section the manifest names exists; the layer is readable without the tool
INFO checkpoint - — no active task
OK records ledger.jsonl — every line is a well-formed event
OK policy 39 key(s) — every policy value the code reads is declared, with no reader-side default
OK bootstrap 3 projection(s) — each points at .ai/README.md, carries no rule of its own and names only rules in force
OK catalogue 0 use case(s), 0 application(s) — every command, doctrine, claim, responsibility, category, setup and cross-reference resolves, both directions
OK context .ai/ — 19 context document(s) carry the contract; ids unique, references resolve, no final document superseded, no cycle [reproduce: majordomus context validate]
DRIFT policy .ai/repo/policy.yaml — policy or profiles changed after the last update of AGENTS.md CLAUDE.md GEMINI.md [reproduce: majordomus update --dry-run]
INFO adr .ai/repo/adrs/ — no decisions; nothing to validate
OK records decisions.md — every entry is attributable
INFO project .ai/repo/project — no canonical project model here; nothing to validate
OK command surface — 30 public command(s), reconciled against the dispatch table [reproduce: majordomus doctor]
OK command coverage — every public command is exercised and refuted [reproduce: bash test/run.sh 31_command_coverage]
OK resolver handovers — no record for this worktree and branch (absence, not a stale match) [reproduce: majordomus handover --resolve]
OK lifecycle activity — 0 episode(s) opened here; too few to judge whether the writers stopped
OK knowledge wiring — the close path and the compaction adapter call the deriver
OK knowledge deriver — no episode has closed here; nothing to judge
INFO project .ai/repo/project — no canonical project model here; nothing to validate
OK projection AGENTS.md — content matches its stamp
OK projection CLAUDE.md — content matches its stamp
OK projection GEMINI.md — content matches its stamp
OK context builder — 21 lines, budget 300 [reproduce: majordomus context]
OK capture share/schemas/majordomus/capture/capture.v1 — 2 file(s) describe majordomus.capture/v1 at the path the identifier derives: the record as JSON Schema, the document as protobuf
OK capture .ai/local/prompts — ignored and untracked
OK capture .ai/local/prompts — no records yet; the archive is empty
OK capture .ai/local/prompts — every prompt is present as all three: the record, the Markdown and the YAML
OK prompts .ai/local/prompts — the archive and every record in it are readable by their owner only
OK prompts .ai/local/prompts — no records yet; the archive is empty
OK prompt 4 asset(s) — front matter valid, every token known
OK records open-questions.md — every entry parses
OK retention ledger — 1 lines, cap 5000
OK retention handovers — 0 files, cap 200
OK retention checkpoints — 0 files, cap 500
OK retention sessions — 0 records, cap 500
INFO project .ai/repo/project — no canonical project model here; nothing to validate
OK rules .ai/repo/rules/vendor/majordomus — every file matches the manifest (1 (1.0.0-alpha.4))
OK rules 61 rule(s) — resolve in one deterministic order; vendored baseline plus project rules, no override — 51 carry a validator, 10 are normative text this tool does not check
OK rules blocking — all 44 blocking rule(s) carry a validator
OK schema rules — 61 rule(s) resolve in one order: the vendored baseline in manifest order, then the project's, as a dependency graph
OK schema share/kinds.yaml — 36 kind(s); every one that carries metadata declares a schema
OK schema share/schemas — 53 schema(s), each valid JSON and each applied — by a kind, through an allow-list the tool reads, by a validator that names it, or as a generated document's contract (15)
INFO scope - — no active task
OK session .ai/local/session-contexts — ignored and untracked
OK session .ai/local/session-contexts — no working contexts yet; the store is empty
INFO skill .ai/repo/skills/ — no skills; nothing to validate
INFO state - — no active task
· budget watch — <timed against the policy budget>
INFO state - — no active task
watch: 1 drift finding(s)
- exit 11
- stdout_contains /DRIFT/
-
projekce se znovu vykreslí z upravené politiky
update AGENTS.md
update CLAUDE.md
update GEMINI.md
generated 3 target(s) from policy b9bd9c808ea9; each carries its own stamp
- exit 0
- stdout_contains /CLAUDE.md/
-
nic už není v rozporu
OK knowledge graph — buildable here: 98 node(s), 58 edge(s), compiled into a temporary file and removed; no stored index to go stale
OK layout .ai/manifest.yaml — schema ai-repository/v1
OK layout .ai/repo/scope.yaml — version 1; 14 in pathspec(s); every key is one the schema declares
OK layout .ai/local/ — ignored, and nothing under it is tracked
OK layout .ai/ — every section the manifest names exists; the layer is readable without the tool
INFO checkpoint - — no active task
OK records ledger.jsonl — every line is a well-formed event
OK policy 39 key(s) — every policy value the code reads is declared, with no reader-side default
OK bootstrap 3 projection(s) — each points at .ai/README.md, carries no rule of its own and names only rules in force
OK catalogue 0 use case(s), 0 application(s) — every command, doctrine, claim, responsibility, category, setup and cross-reference resolves, both directions
OK context .ai/ — 19 context document(s) carry the contract; ids unique, references resolve, no final document superseded, no cycle [reproduce: majordomus context validate]
OK policy policy+profiles — match the last update (<hash12>)
INFO adr .ai/repo/adrs/ — no decisions; nothing to validate
OK records decisions.md — every entry is attributable
INFO project .ai/repo/project — no canonical project model here; nothing to validate
OK command surface — 30 public command(s), reconciled against the dispatch table [reproduce: majordomus doctor]
OK command coverage — every public command is exercised and refuted [reproduce: bash test/run.sh 31_command_coverage]
OK resolver handovers — no record for this worktree and branch (absence, not a stale match) [reproduce: majordomus handover --resolve]
OK lifecycle activity — 0 episode(s) opened here; too few to judge whether the writers stopped
OK knowledge wiring — the close path and the compaction adapter call the deriver
OK knowledge deriver — no episode has closed here; nothing to judge
INFO project .ai/repo/project — no canonical project model here; nothing to validate
OK projection AGENTS.md — content matches its stamp
OK projection CLAUDE.md — content matches its stamp
OK projection GEMINI.md — content matches its stamp
OK context builder — 21 lines, budget 300 [reproduce: majordomus context]
OK capture share/schemas/majordomus/capture/capture.v1 — 2 file(s) describe majordomus.capture/v1 at the path the identifier derives: the record as JSON Schema, the document as protobuf
OK capture .ai/local/prompts — ignored and untracked
OK capture .ai/local/prompts — no records yet; the archive is empty
OK capture .ai/local/prompts — every prompt is present as all three: the record, the Markdown and the YAML
OK prompts .ai/local/prompts — the archive and every record in it are readable by their owner only
OK prompts .ai/local/prompts — no records yet; the archive is empty
OK prompt 4 asset(s) — front matter valid, every token known
OK records open-questions.md — every entry parses
OK retention ledger — 2 lines, cap 5000
OK retention handovers — 0 files, cap 200
OK retention checkpoints — 0 files, cap 500
OK retention sessions — 0 records, cap 500
INFO project .ai/repo/project — no canonical project model here; nothing to validate
OK rules .ai/repo/rules/vendor/majordomus — every file matches the manifest (1 (1.0.0-alpha.4))
OK rules 61 rule(s) — resolve in one deterministic order; vendored baseline plus project rules, no override — 51 carry a validator, 10 are normative text this tool does not check
OK rules blocking — all 44 blocking rule(s) carry a validator
OK schema rules — 61 rule(s) resolve in one order: the vendored baseline in manifest order, then the project's, as a dependency graph
OK schema share/kinds.yaml — 36 kind(s); every one that carries metadata declares a schema
OK schema share/schemas — 53 schema(s), each valid JSON and each applied — by a kind, through an allow-list the tool reads, by a validator that names it, or as a generated document's contract (15)
INFO scope - — no active task
OK session .ai/local/session-contexts — ignored and untracked
OK session .ai/local/session-contexts — no working contexts yet; the store is empty
INFO skill .ai/repo/skills/ — no skills; nothing to validate
INFO state - — no active task
· budget watch — <timed against the policy budget>
INFO state - — no active task
watch: 0 drift finding(s)
- exit 0
- stdout_contains /watch: 0 drift/
-
ledger říká, co se změnilo a kdy
<time> projections.updated - <head> targets=3
<time> projections.updated - <head> targets=3
- exit 0
- stdout_contains /projections.updated/
Proč to nástroj ví
Řetězec od této stránky ke kódu: případ užití jmenuje příkazy, pravidla a tvrzení; každé pravidlo se dispatchuje z registru a každé tvrzení jmenuje test, který ho dokazuje; scénář výše provedl příkazy. Nic v tomto řetězci není text o záměru.
Pravidla, díky nimž platí
- ✕blokující Integrita projekcíKaždý vygenerovaný instrukční soubor existuje, shoduje se s razítkem, které nese, a po ruční úpravě se nikdy tiše nepřepíše.
- ✕blokující Integrita politikyPolitika a každý profil lze zpracovat, deklarují verzi 1 a nenesou žádný klíč, který schéma nedefinuje.
- ✕blokující Integrita ledgeruKaždý řádek ledgeru jen pro připojování je dobře utvořená událost; jediný trvalý záznam, který nelze nijak jinak rekonstruovat, zůstává čitelný.
- ✕blokující Limity uchováváníLedger, předávky, checkpointy a záznamy relací zůstávají pod limity, které stanoví politika, takže trvalý stav neroste bez omezení.
Uplatněné záruky
Související případy užití
Vypočteno z toho, co sdílejí: tvrzení, pravidla, příkazy, kategorie, aplikace. Tento seznam nikdo neudržuje.
- Udržet každý bootstrap poskytovatele tenký, vygenerovaný a v rozpočtuZnovu vygenerovat AGENTS.md, CLAUDE.md a další soubory poskytovatelů z jedné politiky a dokázat, že jsou orazítkovány, ukazují na vrstvu, zůstávají pod limitem řádků a vyhodnotí každou referenci.
- Převzít repozitář, který už má vlastní pravidlaNainstalujte dozorovou vrstvu do repozitáře s ručně psaným CLAUDE.md tak, aby nástroj nepřevzal vlastnictví souboru, který napsal někdo jiný.
- Přečíst si, co se stalo, a držet ledger v mezíchPřečte ledger jen pro připojování jako provozní historii, filtrovanou podle úlohy a události, zvaliduje každý řádek a nejstarší řádky přesune do archivu místo smazání.
- Rozšiřte, co spustitelný soubor poskytuje, přidáním souboru, nikdy jeho přebuildovánímPřidejte do .ai/ pravidlo, prompt nebo uzel znalostí a nechte je objevit se jako zdroj MCP, HTTP route a položka reference, se stejným binárním souborem.
- Zaznamenat rozhodnutí, aby ho příští worker našelZapište, co se rozhodlo a proč, jako stav, a pak to znovu najděte bez čtení konverzace.
Okamžiky, na které to odpovídá
-
→ otevřel CLAUDE.md a AGENTS.md a našel dvě různé sbírky pravidel pro jeden repozitář Každý provider čte svůj ručně upravovaný soubor, nic je nepropojuje a to, který kontrakt platí, závisí na tom, který nástroj je právě otevřený.
-
→ našel úlohu "in progress", které se tři týdny nikdo nedotkl Stav, který byl napsán, a ne spočítán, platí v okamžiku zápisu a odtud tiše zastarává.
-
→ našel pět worktrees a nedokázal říct, na kterých ještě záleží Izolace se vytváří levně, ale špatně se o ní uvažuje: nic nezaznamenává, k čemu worktree sloužil ani zda jeho práce přistála.
-
→ změnili politiku na jednom místě a zjistili, že na třech dalších platí stará Rozhodnutí se aktualizuje u zdroje, vygenerované kopie dál servírují předchozí verzi a nic neohlásí rozdíl.
-
→ měl zelený pipeline nad vygenerovanými soubory, které už neodpovídaly svým zdrojům Testy prověřují kód a neříkají nic o commitnutých výstupech z něj odvozených, takže build je zelený a artefakty špatné.