Zdůvodnění
Poskytovatel byl před tímto pravidlem znám na třech místech a žádné z nich nebyla data. Jeho titul a klientská konfigurace, kterou čte, byly tabulkou zkompilovanou do programu; scratch kořeny, pod nimiž vytváří checkouty, byly seznamem zkompilovaným do topologie worktree; a množina poskytovatelů byla ručně jmenována v tuctu dokumentů — README, návrhový dokument, průvodce MCP, titulek funkce, shrnutí případu užití — z nichž každý byl správný v den napsání a chybný v den, kdy byl přidán poskytovatel (ADR 0024). Pravidlo o číslech, project.no-counts-in-prose, existuje, protože počet v próze je zastaralý ve chvíli, kdy se změní to, co počítá; seznam jmen má stejnou vlastnost a stejný lék.
Jedna deklarace vedle šablon a jedna generovaná tabulka, na kterou ukazuje každý dokument, je tvar, který už má všechno ostatní v tomto repozitáři: schopnosti mají docs/generated/capabilities.md, příkazová řádka má docs/generated/cli.md, artefakty mají svůj manifest. Ručně psaný seznam poskytovatelů v dokumentu je druhá deklarace téhož faktu a druhá deklarace je designová vada (docs/CAPABILITIES.md, ADR 0004).
Požadované chování
- Jedna deklarace.
share/providers.yamldeklaruje pro každého providera titulek, pod nímž ho člověk zná, soubor, z něhož čte konfiguraci klienta MCP v rozsahu projektu, a scratch kořeny, pod nimiž vytváří checkouty. Množina providerů jsou šablony podshare/providers/; deklarace bez šablony je chyba a šablona bez deklarace varování, obojí hlásímajordomus product validate. - Každá projekce čte deklaraci.
majordomus product providers, nástroj MCPmajordomus_providers,GET /api/v1/product/providers, karty poskytovatelů na webu, scratch kořeny topologie worktree adocs/generated/providers.{md,json,yaml}se z ní odvozují. Žádný zdrojový soubor nenese titul poskytovatele, konfigurační soubor ani scratch kořen jako literál. - Dokumenty ukazují, nevypisují. Dokument, který musí říct, kteří poskytovatelé existují, jmenuje
docs/generated/providers.md. Řádek, který jmenuje tři a více deklarovaných poskytovatelů, je seznam a soubor, který jej nese, musí ukazovat na generovanou tabulku; záznamy okamžiku — rozhodnutí, tvrzení, changelog — jsou vyňaty, protože říkají, co platilo, když byly napsány. - Přidání providera je data a šablona. Záznam v
share/providers.yaml, šablona vedle něj a — když toto repozitář přes něj promítá bootstrap — projekce v.ai/repo/policy.yamls cílem podmerge=derived. Pakscripts/derive. Nic dalšího se neupravuje.
Chování při selhání
scripts/ci/providers-check je kontrola: selže na deklaraci bez šablony nebo šabloně bez deklarace, na promítnutém bootstrapu, který merge driver nepokrývá, na promítnutí politiky přes providera, který neexistuje, a na dokumentu, který vyjmenovává providery ručně, aniž by odkazoval na generovanou tabulku; s dostupným spustitelným souborem selže také tehdy, když jsou docs/generated/providers.* zastaralé, a bez něj selže scripts/derive-check. Kontrola běží v úloze structure pro změny pod share/, docs/, .ai/, crate a generovanými artefakty.
Ověření
scripts/ci/providers-check na tomto stromě a majordomus generate --check providers. apps/majordomus-cli/tests/product.rs dokazuje, že tabulka poskytovatelů jsou šablony, které distribuce dodává, ozdobené politikou; testy služby worktree dokazují, že scratch kořeny jsou rozbalené deklarace.