23. Funkce produktu jsou objekty vrstvy a vstupní stránka je jejich projekce
Kontext
Úvodní stránka webu byla jediným povrchem tohoto repozitáře, který stále ručně uváděl, co produkt dělá. Její sekce byly zapsány do šablony a marketingového souboru: které schopnosti zmínit, na kterých rozhraních jsou dostupné, co říct o Cockpitu, které příkazy ukázat. Každý jiný povrch — příkazová řádka, HTTP routy, dokument OpenAPI, MCP, Cockpit, generovaná reference, registrové stránky samotného webu — se už stal projekcí jedné deklarace na schopnost (ADR 2, ADR 4, ADR 5) a jednoho souboru na objekt vrstvy (ADR 7, ADR 8, ADR 18). Úvodní stránka byla posledním inventářem vedeným vedle registru, který popisovala.
Cena byla ta, kterou tento repozitář všude jinde odmítá. Schopnost přidaná do executable se objevila v referenci API, v Cockpitu a na registračních stránkách v den, kdy vznikla, a na homepage v den, kdy si někdo vzpomněl. Modul, který získal nástroj MCP, nezměnil kartu, která říkala „příkazový řádek a HTTP“. Okamžik přidaný do katalogu why byl na homepage jen proto, že ta jediná sekce už byla učiněna projekcí. Nic nemohlo říct, zda je věta na homepage stále pravdivá, a propast mezi produktem a jeho veřejnou tváří rostla přesně ve směru, který nikdo neměřil.
Dvě věci o domovské stránce nelze odvodit a napětí mezi nimi a zbytkem bylo to, co potřebovalo rozhodnutí. Které části produktu tvoří pro návštěvníka jeden příběh — že worktrees, nároky na rozsah a oznámení peerů jsou jedna kapitola zvaná koordinace — je redakční seskupení, které nedrží žádný registr. A které kapitoly domovská stránka ukazuje, v jakém pořadí a pod jakým nadpisem, je prezentační rozhodnutí. Vše ostatní, co stránka o kapitole říká — které rozhraní ji vystavují, kolik schopností, nástrojů a rout za ní stojí, které objekty vrstvy zahrnuje, na které provozní okamžiky odpovídá, co je zaručeno a co je jen poradní — je fakt, který už nějaký registr vlastní.
Rozhodnutí
Funkce produktu je jeden deklarativní objekt vrstvy. Druh feature se připojí k share/kinds.yaml se svým JSON Schema vedle ostatních; třída zdroje feature v sources.yaml repozitáře objeví každý soubor pod .ai/repo/features/; manifest jmenuje sekci. To nevyžadovalo žádný kód pro objevování, parsování, validaci, identitu, index ani zdroj MCP majordomus://feature/<id>: je to mechanismus, kterým prochází každý druh.
Soubor funkce drží odkazy a redakční rozhodnutí, nic odvoditelného. Odkazy jmenují, z čeho se funkce skládá, každý proti registru, který jej vlastní: moduly schopností spustitelného souboru, veřejné příkazy shell nástroje, druhy objektů vrstvy, pravidla, dokumenty, rozhodnutí, tvrzení, případy užití, oblasti Cockpitu, povrchy webové topologie. Redakční pole jsou ta, která nelze nic odvodit: titulek, shrnutí, pořadí, zda ji úvodní stránka uvádí, a provozní oblasti a publika katalogu why, kterým slouží — vlastní taxonomie katalogu, použité znovu, ne deklarované podruhé. Schéma odvozený klíč odmítne: není surfaces, route, počet ani seznam okamžiků ve zdrojovém souboru.
Každý fakt, který plocha o funkci říká, se odvozuje na jednom místě. apps/majordomus-cli/src/product.rs vyřeší každou referenci proti registru, indexu, katalogu a topologii a odvodí, co nikdo nenapsal: rozhraní, jimiž je funkce vystavena (cli, když modul má cestu příkazové řádky nebo funkce jmenuje shellový příkaz, api, když modul má trasu HTTP, mcp, když modul má nástroj či zdroj nebo funkce jmenuje druh, cockpit, když jmenuje oblast nebo modul, docs, když jmenuje dokument), nástroje, trasy a cesty za ní, spočtené objekty jejích druhů, pravidla s jejich třídou a zda je nástroj vynucuje, tvrzení s jejich stavem, momenty, které jmenují kterýkoli z jejích mechanismů, a funkce, které ji jmenují. Reference, která se nevyřeší na nic, je chyba jmenující soubor, klíč a nejbližšího kandidáta; stránka, která na nic neodkazovala, je to, čemu toto odmítnutí brání.
Model je modul schopnosti, promítnutý všude. product.features, product.feature, product.matrix, product.providers a product.validate jsou deklarovány jednou pomocí capability!, takže příkazová řádka, HTTP routy, operace OpenAPI, nástroje a zdroje MCP, stránky Cockpitu i generovaná reference jsou odvozeniny jedné deklarace, podle ADR 2. Matice funkcí proti rozhraním a každého modulu, příkazu a druhu proti funkcím, které je jmenují, je jednou z těchto odpovědí; modul, který žádná funkce nejmenuje, je varování, které validace hlásí a matice ukazuje, nikdy řádek, který potichu chybí.
Poskytovatelé se objevují, nevypisují se. Množina poskytovatelů, pro které má nástroj adaptér, je množina šablon, které distribuce dodává pod share/providers/; co s každým tento repozitář dělá — bootstrapy, které jeho politika vykresluje, konfigurace klienta v jeho kořeni, hooky, které jeho politika zapojuje — se čte z politiky a ze stromu. Odkud nástroj dodavatele čte svou projektovou konfiguraci MCP, je kontrakt, který tento repozitář nemůže objevit a uvádí ho jednou, ve spustitelném souboru, vedle ostatních konstant protokolu.
Web je čtenář. majordomus generate site zapisuje site/data/registry/product.json a product-graph.json ze stejných schopností, přes allow-list polí, která smí veřejná stránka nést. Domovská stránka vykresluje své kapitoly z vybraných funkcí v pořadí podle váhy, svou matici, poskytovatele, telemetrii a graf z této datové sady a nepojmenovává žádnou vlastní funkci, modul, příkaz, druh, poskytovatele ani počet; scripts/site-check odmítne šablonu, generátor nebo navigační soubor, který to dělá. Jediný ručně psaný soubor, site/data/marketing.toml, drží pozicionační věty a popisky tlačítek a je držen na rozpočtu řádků a bez čísel a tvrzení o schopnostech.
Zamítnuté alternativy
features.toml v datovém adresáři webu, jeden záznam na funkci s zapsanými povrchy. Nejrychlejší věc k vybudování a druhý inventář, který tento repozitář odmítá pro pravidla, druhy, schopnosti a okamžiky. V den napsání by byl správný a při prvním modulu, který získá trasu, špatný, a nic by si toho nevšimlo.
Odvodit kapitoly úplně, jednu na modul schopností. Modul je implementační hranice, ne příběh, který návštěvník čte: worktrees, oznámení peerů a nároky na rozsah jsou tři moduly a jedna kapitola a příkazy shellového nástroje nejsou modul vůbec. Stránka s jednou kartou na modul by byla úplná, pravdivá a nečitelná. Seskupení je redakční a předstírat opak by schovalo rozhodnutí do odvození.
Rozšíření docs/RESPONSIBILITIES.yaml do modelu produktu. Je to to nejbližší, co repozitář měl — ručně vedený křížový odkaz spojený s vlastní tabulkou README podle názvu řádku — a patří jen shellovému nástroji. Kdyby nesl moduly, druhy, rozhodnutí a plochy, svázalo by to veřejnou tvář produktu s prózou jedné tabulky a polovinu programu by nepopsalo nikde.
Umístění redakčních polí do deklarací module! v Rustu. Funkce zasahuje moduly, shellové příkazy a druhy; žádná jediná deklarace není místem, kde říct, co má návštěvník o všech třech číst jako první, a marketingový titulek uvnitř popisovače schopnosti by se dostal do dokumentu OpenAPI a MCP, kde nic neznamená.
Čtení povrchů ze souboru funkce pro pohodlí. Je to celá vada v jednom poli: surfaces: [cli, api, mcp] napsané člověkem je tvrzení a registr už odpověď zná.
Důsledky
Přidat funkci znamená přidat jeden soubor a spustit just derive. Pak se objeví v příkazové řádce, HTTP API, dokumentu OpenAPI, MCP, odvozeném grafu, Cockpitu, stránkách /features/, matici a — pokud je zvýrazněná — na domovské stránce, aniž by se upravilo cokoli dalšího, což test/cases/97_product_features.sh dokazuje tím, že to udělá a vrátí zpět.
Přidání schopnosti do modulu, který funkce už pojmenovává, změní odvozené povrchy, počty a odkazy funkce při příštím spuštění generate a generate --check odmítne strom, který je nespustil: domovská stránka nemůže popisovat spustitelný soubor, který tento repozitář nemá. Přidání modulu, veřejného příkazu nebo druhu, který žádná funkce nepojmenovává, je hlášeno jako mezera pomocí product validate a zobrazeno v matici; přiřazení k funkci je jeden odkaz v jednom souboru a toto přiřazení je redakční akt, který model žádá, a nic víc.
Cenou je trojice druhů, kterou je třeba držet v souladu, a přísnější sestavení: překlep v odkazech funkce nyní selže v product validate a generování webu místo vykreslení mírně špatné karty. Zpráva jmenuje soubor, klíč a opravu, což z toho dělá opravu, ne vyšetřování. Snímky obrazovky, které kapitola Cockpitu ukazuje, pokud nějaké ukazuje, zůstávají zachyceným důkazem, ne odvozením, a vyžaduje se po nich jen to, aby jmenovaly trasy, které topologie má.