Co to znamená
AGENTS.md, CLAUDE.md, GEMINI.md a každý další cíl, který deklaruje projections[] politiky, jsou cache dvou vstupů: .ai/repo/policy.yaml se svými profily a šablony poskytovatele (.ai/repo/providers/<provider>.tmpl, jinak share/providers/<provider>.tmpl distribuce). Zapisuje je majordomus generate providers spustitelného souboru v Rustu; majordomus generate --check, které CI spouští při každém pushi, je odvodí znovu, porovná bajt po bajtu, nic nezapíše a skončí s exit 10 se jmény každého souboru, který se liší nebo chybí. Pravidlo ručně napsané do AGENTS.md proto neprojde merge.
Princip
apps/majordomus-cli/src/policy.rs čte politiku stejným čtečkou podmnožiny YAML jako shellový nástroj a hashuje soubor politiky následovaný profily v pořadí podle jména, což je přesně to, co hashuje mj_policy_cat shellového nástroje. apps/majordomus-cli/src/providers.rs vyplní {{DEFAULT_PROFILE}}, {{CHECKPOINT_DEFAULT}} a {{POLICY_SHA}}, cíl v režimu souboru opatří razítkem jmenujícím hash politiky a hash obsahu a cíl v režimu regionu vloží mezi značky majordomus:begin a majordomus:end hostitelského dokumentu a zbytek hostitele nechá být. Výstup jsou stejné bajty, které zapisuje update shellového nástroje, takže doctor, watch a update --dry-run přijmou cíl zapsaný v Rustu a generate --check přijme cíl zapsaný shellem.
Deklarace, kterou nelze vytvořit, se odmítne s důvodem a nic se nezapíše: cíl mimo repozitář, poskytovatel bez šablony kdekoli, token, který politika nemůže vyplnit (šablona žádající {{PROFILE_TABLE}}), hodnota, kterou politika nenastavuje, a cíl always_loaded nad context.always_loaded_budget_lines.
Jak to vidět
apps/majordomus-cli/target/debug/majordomus generate providers --check # OK generated AGENTS.md — matches the registry
printf '\nMy own rule.\n' >> AGENTS.md
apps/majordomus-cli/target/debug/majordomus generate providers --check # exit 10: AGENTS.md (differs)
apps/majordomus-cli/target/debug/majordomus generate providers # rewrites AGENTS.md to the very bytes it hadCo nepokrývá
update shellového nástroje stále existuje jako vstupní bod s --dry-run, --diff a --force; je to interaktivní zapisovač a kontrolou je generate v Rustu. Oba čtou stejné vstupy a zapisují stejné bajty, což test/cases/93_rust_provider_projections.sh dokazuje v obou směrech; když ten případ selže, dva renderery se rozešly. Blokové tokeny shellového nástroje ({{PROFILE_TABLE}}, {{FINISH_CONTRACT}}, {{REQUIRED_SECTIONS}}) spustitelný soubor v Rustu nevykresluje: žádná dodaná šablona je nepoužívá a šablona, která ano, se odmítne se jménem tokenu.
Proč existuje
Soubory providerů jsou jedinou projekcí, kterou čte každý AI pracovník před čímkoli jiným, a až dosud je s jejich razítkem porovnával jen doctor shellového nástroje; CI spouštělo generate --check pro dokument OpenAPI a referenci, ale ne pro ně. Doktrína repozitáře, že soubory providerů jsou adaptéry .ai/ a nikdy zdroj (pravidlo project.interfaces-are-projections, ADR 0001), je nyní vynucována tam, kde na tom záleží: zastaralý nebo ručně upravený bootstrap shodí sestavení.