Veřejná tvář produktu — domovská stránka, stránky /features/, matice schopností — říká, co Majordomus dělá. Každý fakt na ní je odvozen z repozitáře, který popisuje: jaké schopnosti existují, která rozhraní je vystavují, kolik objektů každého druhu vrstva drží, na které provozní okamžiky funkce odpovídá, co je zaručeno a co je jen doporučeno. Člověk píše, které části produktu tvoří jednu kapitolu a v jakém pořadí. Chování tak, jak je implementováno a testováno; kde se tento dokument a spustitelný soubor rozcházejí, dokument je špatně a mění se ve stejném commitu. Rozhodnutí je ADR 23; pravidlo je project.product-surface-derived; vlastní kontrakt adresáře je .ai/repo/features/README.md.
Druh
.ai/repo/features/<id>.md one product feature schema: feature/v1
Název souboru je id je slug je trasa: features/worktrees.md je majordomus product show worktrees, majordomus://feature/worktrees, GET /api/v1/product/feature?id=worktrees a /features/worktrees/. Funkci nic neregistruje. Zdrojová třída feature v .ai/repo/knowledge/sources.yaml objevuje každý soubor pod tímto adresářem přes index správy verzí, druh feature v share/kinds.yaml říká, jak se čte, a share/schemas/majordomus/feature/feature.v1.schema.json rozhoduje, zda je platný.
Co je napsáno a co odvozeno
Soubor funkce drží odkazy a redakční rozhodnutí a nic jiného. Schéma nastavuje additionalProperties: false, takže odvozený klíč jako surfaces:, route: nebo počet je odmítnut při validaci, místo aby mu bylo tiše věřeno.
| V souboru | Z toho odvozeno |
|---|---|
modules — moduly schopností spustitelného souboru | schopnosti, nástroje MCP, routy HTTP a cesty příkazové řádky za funkcí |
commands — veřejné příkazy shell nástroje | povrch příkazové řádky a fáze a příznak jen pro čtení u každého příkazu |
kinds — druhy objektů vrstvy | kolik objektů každého druhu tento repozitář drží |
rules, claims | třída každého pravidla, zda ho nástroj vynucuje, stav každého tvrzení |
docs, adrs, use_cases | názvy, stavy a trasy, které jim web dává |
cockpit, web | oblasti Cockpitu a přípojné body webové topologie |
areas, audiences — vlastní taxonomie katalogu why | provozní okamžiky, které jmenují kterýkoli z mechanismů funkce |
headline, summary, short_title, status, weight, featured, tags, related | nic: to jsou redakční rozhodnutí |
Rozhraní, přes která je funkce vystavena, se odvozují a nikdy nedeklarují: cli, když modul, který jmenuje, má cestu v příkazové řádce nebo jmenuje shellový příkaz, api, když modul má HTTP routu, mcp, když modul má nástroj nebo zdroj nebo funkce jmenuje druh, cockpit, když jmenuje oblast nebo modul s jednou, docs, když jmenuje dokument. Funkce proto nemůže tvrdit povrch, který registr nemá.
Jeden model, každé rozhraní
apps/majordomus-cli/src/product.rs řeší každý odkaz proti indexu, registru schopností, registru příkazů, katalogu why a topologii webu a je jediným místem, kde se cokoli z toho rozhoduje. apps/majordomus-cli/src/capability/builtin/product.rs nad ním deklaruje šest schopností s capability!, takže příkazová řádka, trasy HTTP, operace OpenAPI, nástroje a zdroje MCP a generovaná reference jsou projekce jedné deklarace (ADR 2, docs/CAPABILITIES.md).
| Odpověď | Příkazová řádka | HTTP | MCP |
|---|---|---|---|
| každá funkce | majordomus product list | GET /api/v1/product/features | majordomus_features, majordomus://product |
| jedna funkce | majordomus product show <id> | GET /api/v1/product/feature | majordomus_feature, majordomus://feature/<id> |
| domény | majordomus product domains | GET /api/v1/product/domains | majordomus_product_domains, majordomus://product/domains |
| matice | majordomus product matrix | GET /api/v1/product/matrix | majordomus_product_matrix |
| poskytovatelé | majordomus product providers | GET /api/v1/product/providers | majordomus_providers |
| odmítnutí | majordomus product validate | GET /api/v1/product/validate | majordomus_product_validate |
Domény: tvar produktu nad funkcí
Doména je jedna z mála věcí, které produkt ovládá — kontext, koordinace, governance, důkazy, dokončení a povrchy, jak je tento repozitář deklaruje — uvedená jednou v .ai/repo/features/domains/<id>.md (druh domain, schéma domain/v1) s názvem, jednovětým headline, jednovětým problem a weight, které řadí každý výpis domén (ADR 104).
Funkce pojmenovává přesně jednu doménu ve vlastním poli domain a doména nic nevypisuje: její členové jsou stabilní funkce, které ji pojmenovávají, a jejich sjednocení povrchů, odlišná tvrzení, případy užití, pravidla a schopnosti za nimi a okamžiky, na které odpovídají, se odvozují, nikdy nepíší. product validate odmítne doménu, která neexistuje (s nejbližším kandidátem), stabilní funkci, která žádnou nepojmenovává, zatímco nějaká je deklarována, a stabilní funkci pod doménou, která není stabilní; doména, kterou nepojmenovává žádná stabilní funkce, je varování a nikde se neukazuje.
Oblasti katalogu why nejsou domény a nejsou jimi nahrazeny. Oblast je tam, kde provoz bolí, funkce může sloužit několika a momenty, diagnóza a postranní panel Cockpitu se řadí podle oblasti. Doména je tam, kde produkt odpovídá, a funkce má právě jednu.
Hranice veřejné projekce
majordomus generate site zapisuje site/data/registry/product.json a product-graph.json. Datová sada není serializovaný model: PUBLIC_FEATURE_FIELDS a PUBLIC_DOMAIN_FIELDS v apps/majordomus-cli/src/site.rs jsou seznamy povolených a každé pole se kopíruje podle jména. Pole přidané do modelu se na publikovanou stránku nedostane, dokud ho někdo nepřidá do toho seznamu, což je smysl — náhodné vyloučení není hranice a pole, které nikdo nepovolil, se nepublikuje.
Co to drží venku, se tvrdí, ne předpokládá: Markdown tělo funkce, absolutní cesty, cokoli mimo repozitář. Test je apps/majordomus-cli/tests/product.rs, který sestaví dataset nad fixture a odmítne klíč, který nikdo nezapsal do allow-listu, tělo, kořenovou cestu fixture a dočasný adresář; scripts/generate-site-data artefakt odmítne ještě jednou, než z něj cokoli vykreslí.
Co s tím web dělá
scripts/generate-site-data validuje dataset — schéma je majordomus-site-product/v1, publikované jako share/schemas/generated/site-product.schema.json — a zapisuje jednu stránku pro každou funkci, která není koncept, pod site/content/features/, s vlastním Markdownem funkce jako tělem. Šablony čtou dataset a nic nejmenují:
| Cesta | Šablona | Co vykresluje |
|---|---|---|
/ | site/templates/index.html | kapitoly (funkce, které se deklarují jako zvýrazněné, v pořadí podle váhy), rozhraní, matice, graf, poskytovatelé, druhy a doktrína |
/features/ | features-section.html | každá funkce, která není koncept, jako karta, seskupená podle domény, kterou uvádí, v pořadí vah domén, přičemž funkce, kterou nedrží žádná zobrazená doména, je uvedena zvlášť; rozhraní, graf, poskytovatelé |
/features/<id>/ | feature.html | drobečková navigace jeho doménou, jeho slibem, jeho vlastní prózou, pak vše odvozené z jeho referencí: proč existuje, jak funguje, kde sedí, jeho rozhraní, jeho důkazy, jak ho používat, odkud stránka pochází a související funkce |
/features/matrix/ | features-matrix.html | funkce vůči rozhraním a moduly, příkazy a druhy vůči funkcím, které je jmenují, a kolik z každé funkce je prokázáno |
Funkce v seznamu se kreslí jedním partialem, site/templates/partials/feature-card.html: její název odkazující na její stránku, její stav, její jednovětý nadpis, rozhraní, kterých dosahuje, kolik tvrzení jmenuje a kolik z nich jmenuje test, který je rozhoduje, a kolik případů užití ji ukazuje v použití. Bere funkci z datové sady i člena domény stejně; počet, který data nenesou, se vynechá, a nula, kterou nesou, se řekne slovy. Související funkce na stránce funkce pocházejí ze vztahů, které datová sada drží — funkce, které jmenuje a které jmenují ji, ostatní členové její domény a funkce, které s ní sdílejí případ užití nebo tvrzení — každá karta říká které. scripts/site-check (kontrola features) drží index a stránky k datové sadě: každá veřejná funkce je jednou kartou na /features/, ve skupině své domény; každá karta na webu jmenuje veřejnou funkci a odkazuje na její stránku; funkce s doménou ji nese ve své drobečkové navigaci; a šablony, které funkce kreslí, žádnou nevybírají ručně a netisknou žádné vlastní číslo. test/cases/810_a_feature_is_explored_under_its_domain.sh přidá jeden soubor funkce do kopie tohoto repozitáře, sestaví web tak, jak to dělá build, najde kartu funkce pod její doménou a její stránku pod stopou domény, pak soubor odstraní a nenajde nic zbylého.
site/data/marketing.toml je jediný ručně psaný soubor: pozicovací věty a popisky tlačítek, držený v řádkovém rozpočtu, nenese žádné číslo ani tvrzení o schopnostech. Trasy, které se přesunuly, jsou deklarovány jednou v site/data/nav.toml pod [[redirects]] a stávají se aliasy Zola na stránce, na kterou ukazují.
Terminál na domovské stránce
Stránka ukazuje nástroj za běhu a každý přepis na ní je běh, který se stal.
scripts/generate-site-data zapisuje site/data/generated/terminal.json spojením dvou datových sad, které už zapsal: lifecycle.json, uspořádaný životní cyklus, který nástroj deklaruje, a catalogue.json, jejichž use_cases[].evidence.steps[] nesou příkazový řádek, exit stav a stdout každého scénáře případu užití, který stejný běh provedl. Výstup byl při zachycení redigován — lib/usecase.sh nahrazuje cestu repozitáře, hodiny, identifikátory a verze nástrojů zástupnými značkami — takže přepis nejmenuje žádný stroj a na jiném se reprodukuje bajt po bajtu.
Nic v datové sadě, generátoru ani šabloně nejmenuje příkaz:
| Pole | Jak se rozhoduje |
|---|---|
| pořadí záložek | vlastní pořadí životního cyklu |
| který běh ilustruje krok | mezi úspěšnými kroky scénářů toho příkazu: ten, který uspěl před odmítnutým, pak nejdelší tělo, pak případ užití a id kroku |
| který panel se otevře první | ten s nejvíce výstupu |
| co je v odmítnutích | každý zaznamenaný krok příkazu životního cyklu, který skončil nenulově, deduplikovaný podle příkazu, stavu a těla, seřazený podle životního cyklu |
| věta vedle odmítnutí | první řádek FAIL, který běh vypsal, jinak jeho poslední řádek, až po příkaz pro reprodukci |
Do generování jsou zabudována dvě odmítnutí. Krok životního cyklu, který nespustil žádný scénář, ho nechá selhat, protože stránka, která tiše vynechá fázi, tvrdí životní cyklus, kterým nikdo nechodí; a korpus bez jediného zaznamenaného odmítnutí ho nechá selhat, protože sekce, která říká, že nástroj odmítá, nesmí být prázdná. Kontrola terminal v scripts/site-check pak čte sestavené HTML oběma směry: každý panel, který dataset drží, je na stránce, každý panel na stránce je běh, každý spárovaný podle příkazového řádku, exit stavu a řádku verdiktu, a každý panel odkazuje na scénář, ve kterém byl zaznamenán.
Důsledek, který stojí za vyslovení: domovská stránka nemůže ukazovat nástroj, jak dělá něco, co nedělá, a nemůže dál ukazovat něco, co přestalo nastávat. Příkaz, který přestane odmítat, zmizí ze stránky při příštím generování, a ručně upravený přepis selže v kontrole, ne u čtenáře.
Příběh domovské stránky a co se ukazuje vyhledávačům
Domovská stránka je argument s pořadím a pořadí jsou data: site/data/homepage.toml vypisuje id sekcí, které stránka vykresluje — hero, recognise, map, how, refuses, surfaces, proof, install. Vypráví se nejdřív přehled: co to je, co se bez toho pokazí, co to řídí, jak jím prochází jedna úloha, důkaz, že „hotovo“ lze odmítnout, jak jedna deklarace dosáhne každého rozhraní, důkazy a jak začít. Referenční materiál — přepisy životního cyklu, úplný katalog způsobů selhání, každé zaznamenané odmítnutí, schopnost na všech jejích površích — zůstává na stránce za rozbalením, ne v jejím prvním čtení. O pořadí se v site/templates/index.html nerozhoduje nic.
| Sekce | Co ukazuje | Odkud pochází |
|---|---|---|
hero | pozicování, jeden instalační příkaz a produkt: výzva, která otevře první rozhraní, jež člověk otevře, vedle jeho pohledu čteného z vlastního plánu tohoto projektu | marketing.toml, distribution.json, web.json, build.json snapshots, plan.json, roadmap.json |
recognise | tři selhání, každé problem domény; vybrané okamžiky za rozbalením | homepage.toml problems, domény product.json, katalog Why |
map | domény produktu jako rozbalovací celky: selhání, na které každá odpovídá, její funkce, její počty | product.json domén (ADR 0104), přes partials/domain-map.html |
how | životní cyklus úlohy v jeho pořadí; zaznamenaný běh každého kroku za rozbalovacím blokem | terminal.json |
refuses | výzva projitá krok za krokem, její první verdikt řádek po řádku a každé další zaznamenané odmítnutí za rozbalovacím prvkem | challenge.json, terminal.json |
surfaces | deklarace po rozhraní, velikost modelu, poskytovatelé, jedna schopnost na každém povrchu | product.json, registry.json |
proof | každé tvrzení počítané podle deklarovaného stavu, co podporuje zaznamenaný běh, odkud stránka pochází, co není sestaveno | docs/CLAIMS.yaml, product.json evidence, manifesto.toml |
install | příkazy instalace, dalšího kroku a ověření | distribution.json |
Hero produkt otevírá, místo aby jej popisoval. Který produkt, v šabloně napsáno není: je to první z rozhraní, která člověk otevírá — stabilní funkce, které webová topologie dává povrchu interface, v jejich vlastním pořadí — a výzva vede na jeho publikovanou kopii přesně tehdy, když ji publikace drží (pravidlo, kterým se už řídí seznam surfaces), jinak na stránku, která říká, jak ji otevřít. Pohled vedle výzvy počítá úkoly tohoto projektu podle stavů plánu a kreslí milníky, které probíhají; do 2026-10-13 na tomto místě byl přepis terminálu, který je nyní vyprávěn v refuses, kde o něm stránka argumentuje.
Dlouhý výklad, který domovská stránka dříve nesla sekci po sekci, je /method/argument/, přesunut doslova, takže žádná věta z manifesto.toml se nepřestala vykreslovat.
Web je indexován jednou deklarovanou politikou. [indexing] unlisted v site/data/nav.toml pojmenovává sekce, jejichž stránky detailu jsou doklady — úkoly a milníky plánu, schopnosti a moduly registru, uzavřené relace. Tyto stránky zůstávají publikované a odkazované; nesou robots noindex (templates/base.html) a jsou vynechány z sitemap.xml (templates/sitemap.xml), zatímco indexová stránka každé sekce zůstává indexována.
scripts/ci/homepage-check to všechno drží, v obou směrech, pod blokujícím pravidlem project.homepage-tells-a-declared-story a scripts/site-check hlásí své nálezy, takže domovská stránka nebo sitemap, které se rozejdou se svou deklarací, se odmítnou dřív, než je build Pages publikuje. test/cases/333_homepage_narrative.sh dokazuje každou kontrolu tím, že ji rozbije.
Váha domovské stránky je deklarována ve stejném souboru jako [budget]: skripty a stylesheety, které načítá z webu, a data grafu, která nese inline. Domovská stránka nenačítá žádný runtime grafu: její mapa jsou domény jako nativní rozbalovací bloky a složený graf produktu je na /features/, publikovaný na /graphs/product.json a stahovaný, až se kresba poprvé dostane do zorného pole; žádná stránka nenačítá runtime Mermaid, pokud nenese diagram. Stejná kontrola hlásí aktuální váhu při každém buildu, takže zvýšení rozpočtu je revidovaná změna homepage.toml, nikdy tichá. Držena jsou i slova: homepage.toml [promises] deklaruje slova schopností, která smějí ručně psané marketing.toml a manifesto.toml používat jen s tvrzením (bezobslužně, autonomně, automatický merge či release a podobně), každé s id tvrzení, které ho povoluje, a kontrola selže u slova, jehož tvrzení chybí, není zaručeno nebo není podpořeno zaznamenaným během, a u jména funkce, kterou model produktu nenazývá stabilní.
Přidání sekce domovské stránky: napište ji do index.html s id, vložte toto id tam, kam patří, do homepage.toml v order, a dejte jí odkaz nebo odvozený údaj. Vyřazení detailních stránek sekce ze seznamu: přidejte její název do [indexing] unlisted.
Co je odmítnuto
- Odkaz, který se na nic nerozřeší. Zpráva pojmenovává soubor, klíč a nejbližšího kandidáta, což z ní dělá opravu, ne vyšetřování.
- Odvozený klíč v souboru funkce —
surfaces,route, počet, seznam okamžiků. - Funkce
featured, která nenístable; funkcestable, která nejmenuje žádný mechanismus ani dokument nebo jejíž tělo postrádá## What it doesa## What it does not do. - Zastaralý dataset:
majordomus generate --checkselže na stromě, jehožproduct.jsonneodpovídá repozitáři, takže úvodní stránka nemůže popisovat spustitelný soubor, který tento repozitář nemá. - Šablona, generátor nebo navigační soubor, který ručně jmenuje funkci, modul, příkaz, providera nebo počet. Rozhoduje o tom
scripts/site-check.
Modul schopností, veřejný příkaz nebo druh objektu, který žádná stabilní funkce nejmenuje, není odmítnut. majordomus product validate to hlásí jako mezeru a zobrazuje se v Sloupec povrchu říká, kde je funkce dosažitelná. Neříká, co z ní platí, a tabulka shody, která odpovídá jen na první otázku, svádí čtenáře předpokládat druhou. Proto každý řádek nese také proven z claims: kolik z tvrzení, která funkce jmenuje, je zaručeno a jmenuje případ, který je rozhoduje, z kolika jich jmenuje vůbec. Obě čísla jsou odvozená — tvrzení ze souboru funkce, případ z test: každého tvrzení v docs/CLAIMS.yaml — a tvrzení, jehož test je -, tedy plánovaný nebo zamítnutý, nenese žádné, místo pomlčky, kterou by čtenář mohl zaměnit za důkaz. Stejné pole dosáhne každé stránky funkce vedle tvrzení, které rozhoduje, takže důkaz je na jedno přečtení, ne na tři.
matice, protože věc, kterou produkt dělá a stránka produktu ji nezmiňuje, je přesně to, co tento model existuje, aby zviditelnil. Uzavření je jeden odkaz v jednom souboru.
Přidání funkce
cp .ai/repo/features/worktrees.md .ai/repo/features/<id>.md
$EDITOR .ai/repo/features/<id>.md # id, headline, summary, the references, the body
git add .ai/repo/features/<id>.md # discovery reads the version-control index
majordomus product validate # schema, references, floors
just derive # the dataset, the pages and the generated docs follow
test/cases/97_product_features.sh dělá přesně to a vrací to zpět, čímž dokazuje, že na funkci odpovídá příkazová řádka, HTTP, MCP, dataset webu a graf, dokud existuje, a žádné z nich, jakmile zmizí.