Přeskočit na obsah

Tato stránka byla automaticky přeložena z angličtiny, jediného jazyka, ve kterém se tento web píše. Číst originál.

Jak Majordomus odvozuje své povrchy

jak do sebe systém zapadá: kanonický stav, objevování, typované registry, odvozené modely, governance a důkazy a každý povrch z nich promítnutý — co se píše, objevuje, odvozuje, pozoruje a usuzuje, schopnost a pravidlo vystopované od začátku do konce, matice generování, audit tvrzení s odkazy na soubory a zbývající architektonický dluh

Vykresleno z docs/SURFACES.md — stejného Markdownu, který ukazuje GitHub.

Majordomus je řídicí rovina, která žije uvnitř repozitáře, který řídí. Tento dokument jej vysvětluje jako jeden systém, ne jako seznam funkcí. Fakta se zapisují, objevují nebo pozorují. Stávají se typovanými modely. Tyto modely se validují a kontrolují proti důkazům. Pak se z nich odvozuje každé rozhraní, které člověk nebo agent používá: příkazová řádka, HTTP API, dokument OpenAPI, Swagger UI, MCP, Cockpit a tento web.

Většina z následujícího je už někde jinde popsána, po jednom subsystému: CAPABILITIES.md pokrývá model operací, DYNAMICITY.md pokrývá, kde fakt žije, DEVELOPMENT_RUNTIME.md pokrývá, kde žije sémantika, DOCTRINE.md pokrývá pravidla a důkaz, EVIDENCE.md pokrývá zaznamenaná provedení, GITHUB_PAGES_ARCHITECTURE.md pokrývá web, MESH.md pokrývá objevování a PLANNING.md pokrývá plán. Tento dokument je propojuje a otevřeně říká, kde kód zatím nedělá to, co chce návrh.

Jak číst tvrzení. Každé strukturální tvrzení bylo ověřeno proti kódu a proti běžícímu exekutoru na commitu, na němž byl tento dokument napsán. Tvrzení nesou štítky v hranatých závorkách, například [C4], které ukazují do auditu tvrzení. Audit uvádí soubor a řádek, nebo příkaz, který každé z nich dokládá. Některá prohlášení jsou upřesněna slovem:

  • částečné: implementována je jen část tvrzení;
  • neimplementováno: nic ve stromě to nedělá;
  • dluh: repozitář o mezeře ví. Je uvedena v Architekturním dluhu.

Nejsou zde žádná čísla o obsahu repozitáře (project.no-counts-in-prose). Všude, kde na počtu záleží, je uveden příkaz, který ho změří.

Obsah

  1. Invariant
  2. Dva programy sdílejí jedno jméno
  3. Kde je pravda: pět druhů faktů
  4. Objevování a čím se liší od odvozování
  5. Typované registry, kanonická id a zobrazovaná jména
  6. Schémata: od typu v Rustu k OpenAPI a MCP
  7. Povrchy jsou projekce
  8. Generační pipeline
  9. Správa: doktrína, pravidlo, politika, ADR
  10. Existence pravidla není totéž co vynucování pravidla
  11. Důkazy, čerstvost a drift tvrzení
  12. Publikace: sestaveno, nasazeno, ověřeno
  13. Doctor a drift: detekovat, opravit, regenerovat
  14. Testy, které drží povrchy pohromadě
  15. Relace, kontext, předávka, plánování, prostředí
  16. Mesh a nástěnka peerů
  17. Návody
  18. Co se negeneruje
  19. Nulová registrace: ideál a jeho výjimky
  20. Proč na generování záleží a teze

Přílohy: A mapa architektury, B mapa ploch, C matice generování, D mapy správy a meshe, E audit tvrzení, F architektonický dluh.

1. Invariant

Fakt jednou objevit a namodelovat a z něj odvodit každé rozhraní.

Toto je mechanismus, který brání rozcházení rozhraní. Repozitář, který se popisuje na několika místech, nashromáždí popisy, které si odporují: README, referenci API, seznam nástrojů pro agenta, dashboard, web. Každý může být v den psaní správný a každý zastarává vlastním tempem. Majordomus se tomu vyhýbá tím, že drží jedinou deklaraci a ostatní popisy z ní generuje. Kde popis generovat nelze, kontroluje ho proti deklaraci.

Repozitář tento invariant jmenuje několikrát. Je to project.interfaces-are-projections a project.rust-canonical-declaration v .ai/repo/rules/project/. Pro operace je to ADR 2, ADR 4 a ADR 5 a pro vývojovou sémantiku ADR 40. Záleží na tom, jak daleko ho kód skutečně ctí:

  • Operace (schopnosti) jej dodržují nejlépe. Nástroje a zdroje MCP, trasy HTTP, dokument OpenAPI, cíle měření výkonu, generovaná reference a stránky registru webu se sestavují průchodem jednoho registru [C1, C5, C6, C7].
  • Příkazová řádka je deklarována podruhé, v clap. Kontroluje se proti registru, neodvozuje se z něj [C8, C9].
  • Cockpit je částečný. Jeho generické stránky schopností, objektů a grafů řídí registr. Jeho stránky oblastí a samotné oblasti jsou psány ručně [C12, C13].
  • Vývojová sémantika (úlohy, relace, předávky, checkpointy, přidělování ADR) stále převážně vlastní shellový kód pod lib/. Pro mutující polovinu neexistuje žádná schopnost a soubor ratchetu eviduje tento dluh [C30].

2. Dva programy sdílejí jedno jméno

majordomus jsou dva spustitelné soubory. Tento fakt se snadno přehlédne a závisí na něm každá další sekce.

ProgramVstupImplementaceVlastní
nástroj shellbin/majordomuslib/*.sh, odesílané podle příkazustart, check, finish, context, handover, session, doctor, update, adr, zápisy plánu, dispečer doktrín
spustitelný soubor v Rustubin/majordomus-cli (spouštěč, který v případě potřeby sestaví)apps/majordomus-cli/registr schopností, serve, mcp, generate, rules, evidence, devcontext, mesh, env, worktree, Cockpit

U příkazu, který nezná, vás shellový nástroj odkáže na spustitelný soubor v Rustu. Registr, a tedy každý odvozený povrch, patří spustitelnému souboru v Rustu. Cokoli vlastní jen lib/, nedosáhne na žádnou trasu HTTP, žádný nástroj MCP ani stránku Cockpitu, pokud jeho soubory nečte schopnost v Rustu. DEVELOPMENT_RUNTIME.md je změřený inventář této hranice a scripts/development-semantics-check vynucuje její ratchet.

3. Kde je pravda: pět druhů faktů

Zdrojem pravdy je sledovaný strom. Vrstva .ai/ je pojmenována .ai/manifest.yaml a klasifikována .ai/repo/knowledge/sources.yaml. Zdroje v Rustu pod apps/majordomus-cli/src/capability/builtin/ deklarují operace a share/ drží druhy, schémata a slovníky. Všechno ostatní je jedno z následujícího:

Druh faktuPříkladyKdo to vytváří nebo měníAutoritaMůže přepsat kanonický stav?Jak se zneplatňuje
ručně psanésoubor pravidla, ADR, policy.yaml, blok capability!, docs/*.md, site/data/nav.toml, záznam úkolu, tělo předávkyčlověk, nebo agent jednající za něj, v commitukanonickéje kanonický stavdalším commitem, který ho upraví
objevenoindex objektů .ai/**, topologie worktree v gitu, efektivní množina pravidel, verze nástrojů ve snímku prostředíspustitelný soubor, který při každém běhu čte sledované soubory a gittak autoritativní jako jeho vstupy; nikdy se neukládá jako samostatná pravdanepřepočítáno při každém čtení; index nese otisk a sdílený server jej přestaví, když se strom pohne
odvozenodocs/generated/**, site/data/**, site/content/**, spravovaný blok .gitattributes, AGENTS.md/CLAUDE.md, stav úkolu, vlny, stavy důkazů pravidelgenerátory (majordomus generate, scripts/generate-site-data, scripts/gitattributes, majordomus update), nebo čistá funkce při čtenížádné vlastní: je to projekcene; ruční úprava je zamítnuta nebo nahlášena (razítko generate --check, update)hash vstupu nebo bajtové porovnání (scripts/derive-check, pre-commit scripts/pages current)
pozorovánonástěnka peerů, uzly meshe, služba odpovídající na portu, probíhající provedení, zaznamenaný běh testu v ledgeru důkazůběžící proces: sdílený server, poskytovatel mesh, majordomus evidence recordjen pro povědomí; ledger je výjimka, protože je commitnutne; project.mesh-is-observation-not-authority to říká o meshi a nástěnka peerů „nevynucuje nic“TTL a časový limit relace pro přítomnost; kontroly digestu a diffu registru důkazů pro běhy
odhadnutoshoda záměru v devcontext, odvozené tělo předávky, implikované zvýšení releasu, navržené ADR z adr proposedeterministická heuristika, nikdy volání modelunejnižší; vždy označenone; extrahované ADR, které tvrdí accepted, neprojde validacípřepočteno; jistota je obsažena v hodnotě

Plynou z toho dva důsledky a zbytek tohoto dokumentu na nich závisí.

  • Odvozený výstup se nikdy nevrací jako vstup. scripts/derive uvádí, že žádná fáze nečte svůj vlastní výstup [C15]. Generátor datové sady v shellu vynechává vlastní dokumenty ze svého seznamu vstupů [C16].
  • Pozorování se nikdy nestane oprávněním. Tvrzení peera je pouze poradní. Verdikt důvěry uzlu mesh mění štítky, ne oprávnění [C40, C42].

4. Objevování a čím se liší od odvozování

Objevování je výčet řízený deklarací. Spustitelný soubor v Rustu najde kořen repozitáře. Přečte manifest, načte druhy a schémata (share/kinds.yaml, share/schemas/ a doplňky repozitáře pod .ai/repo/knowledge/) a pak vyčte soubory přes třídy sources.yaml, ve výchozím stavu z indexu správy verzí (--discovery vcs). Každý soubor se stane typovaným objektem nebo diagnostikou se stabilním kódem. Nečitelný manifest nebo soubor druhů je chyba. Objekt, který neprojde validací, je vyloučen, index hlásí degraded a povrchy dál obsluhují; --strict degradovaný index odmítne. CAPABILITIES.md („Lifecycle and failure policy“) to popisuje a test/cases/76_capabilities_projections.sh přidá druh definovaný repozitářem a ověří, že se objeví na každém povrchu.

Odvozování je jiné. Odhaduje relevanci nebo záměr. Žije na několika pojmenovaných místech a samo se označuje:

  • Výběr devcontext. Každý selektor kromě IntentMatch je declared() a nese jistotu 1.0. Shoda záměru hodnotí podíl výrazů záměru nalezených v názvu, popisu, identitě nebo štítcích objektu, nikdy v jeho těle [C45].
  • Odvozená těla předávek. Sestavují se z gitu, knihy a otevřených otázek a končí patičkou, která říká, že je nenapsal žádný model [C47].
  • adr propose. Zapisuje proposed a odmítá jakýkoli jiný stav. Přijetí je akt člověka [C34].

Žádný povrch nespouští jazykový model, aby vytvořil fakt.

5. Typované registry, kanonická id a zobrazované názvy

Každá adresovatelná věc má kanonickou identitu, která není jejím zobrazovaným názvem.

  • Schopnosti. Id je namespace.local (rules.report). Název ("Každé pravidlo proti důkazu, který pro ně existuje") je zobrazovaný text. Registr odmítá duplicitní id, názvy nástrojů MCP, URI zdrojů MCP, trasy HTTP a cesty CLI, ukládá záznamy v BTreeMap a iteruje podle id [C4].
  • Deklarativní objekty. Id je <kind>.<identity> a identita pochází z pravidla identity daného druhu: id@version pro pravidlo (project.english-only@1), číslo pro ADR (adr-0044). Zdroj MCP je majordomus://<kind>/<identity>.
  • Pravidla se uvádějí jako id@version v depends_on. Nová verze je nový soubor (conventional-commits.v2.md).
  • Worktrees se identifikují podle své větve. Cesta <repo>-wt/<branch> se odvozuje z gitu a nikdy neregistruje (WORKTREES.md).
  • Peeři dostávají pozici na nástěnce (p1, p2), která se při znovupřipojení přiděluje znovu. Není to identita: trvalou polovinou identity peera je checkout, který nese (ADR 44).

Kanonické je i řazení. apps/majordomus-cli/src/order.rs definuje jedno úplné uspořádání: skupina, pořadí, popisek porovnávaný přirozeně, pak identita. scripts/ci/order-check odmítá komparátory ignorující velikost písmen mimo něj, klíče řazení, které se vykreslují, a nepřipnuté shellové sort. Také ratchetuje zbývající místa řazení v crate v .ai/repo/order-baseline.txt [C19].

6. Schémata: od typu v Rustu k OpenAPI a MCP

Řetězec schémat spustitelné schopnosti je skutečný kód a člověk každý jeho kus píše jen jednou:

flowchart TD
  ty["Rust input and output types<br>serde + schemars JsonSchema derive<br>doc comments become descriptions"]
  cs["CanonicalSchema::of<br>schemars::schema_for, $schema removed,<br>rustdoc translated to CommonMark"]
  mcp["MCP tool inputSchema and outputSchema<br>for_mcp: inline, $defs kept"]
  oas["OpenAPI 3.1 operation<br>for_openapi: $defs hoisted into components,<br>refs rewritten; a clash of names is refused"]
  sw["Swagger UI<br>loads /openapi.json, embeds nothing"]
  gen["docs/generated/openapi.json and openapi.yaml<br>site /docs/api/"]
  ty --> cs
  cs --> mcp
  cs --> oas
  oas --> sw
  oas --> gen

CanonicalSchema::of::<T>() volá schemars::schema_for! [C2]. Názvy komponent OpenAPI pocházejí z titulu schématu. Ten jmenný prostor je plochý, takže dva různé typy se stejným titulem selžou openapi::document s „schema component … is defined twice with different content“ [C3]. Oprava je přejmenovat typ; nic na to před tím bodem neupozorní (dluh F-11).

Deklarativní druh začíná o krok dříve. Jeho schéma dokumentu žije pod share/schemas/majordomus/<kind>/. Popis .proto tam generuje JSON Schema, allow-list front matteru pod share/allow/ a požadavky na sekce (DEVELOPMENT_RUNTIME.md, „The derivation chain“). Neznámé klíče front matteru jsou chyby (project.unknown-keys-are-errors).

7. Povrchy jsou projekce

7.1 Jedna deklarace

Spustitelná schopnost je jeden blok capability! v apps/majordomus-cli/src/capability/builtin/<module>.rs. Vypisuje id, kind, title, description, input, output, stability, exposure, tags, cache, benchmark a handler. Makro také klasifikuje dostupnost, viditelnost a politiku provádění z druhu a vystavení a případy měření výkonu bere z BenchmarkCases vstupního typu [C1]. exposure nastavuje každý povrch explicitně: Exposure { mcp, http, cli }. None znamená, že schopnost tam není vystavena, a nic vystavení nedovozuje [C4]. Moduly se skládají pomocí module! a compose_modules! v builtin/mod.rs.

Dva modifikátory po makru deklarují to, co druh sám říct nemůže. .cancellable() označuje schopnost, jejíž běh lze zrušit. .writes_repository() označuje schopnost, která zapisuje sledovaný záznam. Dvě schopnosti obsluhované přes HTTP a MCP ho dnes nesou, plan.transition a recover.orphans; vypíšete je hledáním .writes_repository() pod builtin/ [C31].

7.2 MCP

src/mcp/surface.rs o sobě říká „Nothing is declared here“. compute_tools() bere každou schopnost s expozicí mcp.tool. compute_resources() bere každou schopnost s expozicí mcp.resource a každý deklarativní objekt je jednou [C5]. Nástroj nese kanonická vstupní a výstupní schémata, _meta.majordomus.id a readOnlyHint odvozené z druhu. Volání se rozřeší přes by_mcp_tool a běží přes sdílený executor.

Nástroje, jimiž se agenti koordinují, jsou běžné deklarované schopnosti: majordomus_announce je peers.announce, majordomus_peers je peers.list a majordomus_capabilities je capabilities.list. Nejsou to ručně psané nástroje. Tři kusy kódu o nich přesto vědí jménem: text instrukcí initialize, most stdio-na-HTTP (který po opětovném připojení přehraje oznámení) a handler peers.announce (který odmítne volajícího, který není MCP) [C6].

7.3 HTTP API

Router vyřeší trasu schopnosti pomocí registry.by_http(method, path). Pro GET naváže parametry dotazu, převedené podle typu ze schématu; pro POST naparsuje tělo JSON. Zavolá executor a mapuje chyby na 400, 404, 422 a 500 [C7]. Router přidává chování transportu a nedrží žádnou obchodní logiku: převody, mapování chyb, odmítání cross-origin požadavků jiných než GET, index tras na /api/v1 a cache dokumentu OpenAPI pro každou generaci. Jeho trasy mimo schopnosti jsou infrastruktura: /, /openapi.json, /swagger, /mcp, WebSocket /events, /cockpit/** a generované statické mounty jako /docs/ (WEB.md). Žádná ručně psaná trasa peerů neexistuje: /api/v1/peers je peers.list.

7.4 OpenAPI

src/http/openapi.rs sestavuje OpenAPI 3.1 ze stejného registru. operationId je id schopnosti a tagy jsou moduly. Příklady parametrů jsou vlastní případy měření schopnosti, takže pole, které žádný případ nenastavuje, nemá příklad. Rozšíření x-majordomus-* nesou id, druh, stabilitu, provenienci, měření, cache, MCP a CLI; infrastrukturní trasy jsou pod x-majordomus.infrastructure [C7]. Mapy jsou seřazené a nenesou časové razítko. Živý dokument a docs/generated/openapi.json jsou tentýž výpočet.

7.5 Swagger UI

src/http/swagger.rs vykreslí jednu statickou HTML skořápku, která míří SwaggerUIBundle na /openapi.json. Jednotkový test ověřuje, že skořápka nevkládá paths, openapi ani components. Vlastní JavaScript a CSS UI se načítají z připnutého swagger-ui-dist na unpkg, takže toto je jediný povrch, který není offline [C10]. Je to čistá projekce UI.

7.6 Příkazový řádek: dvakrát deklarován a zkontrolován

Strom clap v apps/majordomus-cli/src/cli.rs se píše ručně. Je to záměr: clap vlastní parsování, nápovědu, výchozí hodnoty a množiny hodnot („Jediná projekce, která se může rozjet“ v CAPABILITIES.md). CliExposure schopnosti je proto tvrzení o příkazu deklarovaném jinde a toto tvrzení se kontroluje v obou směrech:

  • capability/closure.rs selže, když tvrzení jmenuje příkaz, který clap nemá, nebo takový, který jen seskupuje jiné příkazy. Běží v tests/projections.rs i v capabilities validate [C8].
  • cli::LOCAL (src/cli/local.rs) uvádí důvod pro každý příkaz, který žádná schopnost nenárokuje. Existují právě čtyři strukturální důvody: životní cyklus procesu, zapisuje do repozitáře, místní k relaci, nebo vykresluje pojmenovanou schopnost pro terminál. Existuje také forma aliasu. quality::parity ji kontroluje a kontrola projection-closure (scripts/ci/projection-check) selže na příkazu, který žádný důvod neuvádí [C9]. capabilities projections uvádí obě množiny živě: příkazy jen pro CLI jako unbacked a příkazy bez důvodu jako unclassified.

Co příkaz CLI stále bere ručně [C11]:

  • varianta clap a větev dispatch v commands/mod.rs;
  • runner v commands/<name>.rs, který mapuje flagy na vstupní JSON (--findings se stane findings_only) a volá ctx.execute(id, input) po registry.by_cli;
  • textový renderer. --format json vypíše výstup schopnosti beze změny; --format text je vlastní příkazu. Některá sémantika ukončení žije jen v rendereru: rules report --check tam končí kódem 10, ne v handleru;
  • položka v cli::EXAMPLES, jediné ručně psané konstantě CommandExamples. cli::validate odmítne spustitelný příkaz bez příkladu a tests/cli_examples.rs spouští každý příklad proti sestavené binárce.

Shellové doplňování není clap_complete. commands/completion.rs odpovídá z grafu příkazů, který skládá strom clap, share/commands.yaml shellového nástroje a workflow (COMMANDS.md).

7.7 Cockpit

Cockpit (src/cockpit/) je HTML vykreslované na serveru v Rustu; žádný šablonový engine neexistuje. Cesta /cockpit je důležitější než kterákoli funkce, proto tato sekce odděluje to, co se odvozuje, od toho, co se píše:

  • Odvozeno. /cockpit/capabilities/<id> je jedna obecná stránka pro každou schopnost s formulářem pro spuštění vytvořeným ze vstupního schématu. /cockpit/object?uri= vykreslí libovolný objekt; /cockpit/graphs/<id> vykreslí libovolné odvození. Katalogy v postranním panelu pocházejí z registry.modules(), seskupené podle module_area produktového modelu, plus index.kinds() a graph::ids(), vše v kanonickém pořadí [C12].
  • Psáno ručně. Tabulka tras je match v cockpit/mod.rs. Seznam oblastí (Přehled, Schopnosti, Mesh, …) je nav::areas() a komentář modulu uvádí důvod. Stránky oblastí žádají o schopnost jejím doslovným id, například ask(ctx, "health.report", …) nebo ask(ctx, "mesh.status", …) [C13]. Věta v CAPABILITIES.md, že „nic v něm nejmenuje schopnost“, tedy není přesná (dluh F-20).
  • Frontend není autorita. JavaScript pod share/cockpit/ dělá jen prezentaci a požadavky. runner.js volá skutečnou routu schopnosti z data-mj-method/data-mj-path; palette.js a pohledy grafů čtou /api/v1/*. Nic v prohlížeči nepočítá připravenost, stav ani důkaz. Kontrola development-semantics odmítne jakýkoli odkaz na .ai/repo, .ai/local nebo spustitelný soubor majordomus uvnitř stromů Cockpitu [C14].

7.8 Srovnání povrchů

CLI (majordomus-cli)HTTP APIMCPCockpit
Deklarováno vclap, ručně, kontrolováno proti CliExposureodvozeno z HttpExposureodvozeno z McpExposuresměrovací tabulka a oblasti ručně; obecné stránky odvozeny
Dosahujeschopnosti, které si nárokují cestu v CLI, plus lokální příkazykaždá schopnost s expozicí HTTPkaždá schopnost s vystavením jako nástroj nebo zdroj; každý deklarativní objekt jako zdrojkaždá schopnost (obecná stránka); vybrané oblasti
Vstuppříznaky mapované ručně v runneruparametry dotazu převedené podle schématu, nebo tělo JSONarguments validováno proti inputSchemaformulář pro spouštění generovaný ze vstupního schématu
Výstup--format json (hodnota schopnosti) nebo text (renderer)hodnota JSON, typované chybystructuredContent plus textHTML nad toutéž hodnotou
Vlastní logikarenderery, některé exit kódy, lokální příkazy (serve, generate, worktree create)jen transportpouze transport; přehrání oznámení v mostupouze prezentace
Změřitcapabilities projections (unbacked)GET /api/v1tools/list, resources/listGET /cockpit

Pokrytí je nerovnoměrné. Méně schopností má cestu v CLI než trasu v HTTP. peers.list, plan.*, objects.*, health.report a environment.status nemají vlastní projekci v CLI; příkazy env jsou vykreslení v CLI zaznamenaná v cli::LOCAL. Spusťte majordomus-cli capabilities projections --format json a porovnejte pole cli a http (dluh F-4).

8. Generační pipeline

8.1 Generátory, v pořadí

scripts/derive je jeden příkaz, který aktualizuje každou commitnutou projekci. Jeho fáze běží v tomto pořadí [C15]:

flowchart TD
  build["build step<br>cargo build, or MAJORDOMUS_BIN"]
  a["stage A: majordomus generate --strict<br>code-only projections: openapi, registry, cli,<br>capabilities.md, modules/*.md, share/allow, provider bootstraps"]
  b["stage B: scripts/generate-site-data<br>site/data/generated, site/content, docs/SITE_CLAIMS.md,<br>docs/PLAN_STATUS.md, docs/PAGES_STATUS.md"]
  c["stage C: majordomus generate<br>projections over the index stage B changed:<br>site/data/registry, benchmarks, artifacts manifest"]
  d["stage D: scripts/gitattributes<br>the merge=derived block, from the artifact manifest<br>and the published content tree"]
  check["scripts/derive-check<br>generate --check, generate-site-data --check,<br>gitattributes --check: 0 current, 10 stale, 15 refused"]
  build --> a --> b --> c --> d
  d -.-> check
  • majordomus generate (src/generate.rs) zapisuje do docs/generated/ a site/data/registry/ z jednoho plan(). Stejný plán běží pro zápis i pro --check. Jeho cíle jsou enum GenerateTarget v cli.rs a výstupní manifest (docs/generated/artifacts.json) vypisuje každý artefakt s jeho zdrojem, schématem a hashem.
  • scripts/generate-site-data je shellová polovina. Hashuje deklarovaný seznam vstupů (INPUTS) pod LC_ALL=C, zapisuje do staging adresáře a výsledky přesouvá na místo, takže neúspěšný běh nic nezmění. Promítá docs/*.md do site/content/docs/ [C16].
  • Existují dva zapisovatelé generovaných stromů, src/generate.rs a shellový generátor, a oba zapisují obsah webu (dluh F-14).

8.2 Čerstvost se vynucuje při commitu a v CI

  • .githooks/pre-commit spouští bin/majordomus doctor, ochranu worktree a scripts/pages current. Ten poslední příkaz porovná generate-site-data --fingerprint s source_hash v site/data/generated/source.json a poté spustí generate --check [C17]. Pokud spustitelný soubor není sestaven, registrová polovina kontroly se přeskočí se zprávou místo selhání (dluh F-16).
  • V CI core-check spouští generate-site-data --check a kontrola generation-converges spouští generate a poté generate --check: generátor musí být pevný bod [C18].
  • .gitattributes označí každou odvozenou cestu merge=derived. scripts/merge-derived ponechá „naši“ verzi a vypíše, že soubor je nyní zastaralý, takže merge nikdy neslučuje projekci ručně; derive ji poté regeneruje. doctor shodí klon, který ovladač neregistroval.

8.3 Jak se dokument stane stránkou

Každý dokument je registrován jedním řádkem v první tabulce docs/README.md. Shellový generátor tyto řádky čte a vytváří /docs/<slug>/. Generuje front matter: titulek z prvního nadpisu, popis z řádku, váhu z pozice řádku. Přepisuje odkazy a odmítne každé docs/*.md, které není v žádné tabulce [C16]. Navigace webu (site/data/nav.toml) se píše ručně a scripts/ci/nav-check ověřuje, že šablony navbaru a patičky z ní vycházejí. Nic nepřidává dokument do navigace automaticky. To je záměr: soubor říká, že navbar není sitemap.

8.4 Generátor a renderer

Generátor mění kanonický vstup na commitnutý nebo servírovaný artefakt a posuzuje se podle --check: majordomus generate, scripts/generate-site-data, majordomus update, scripts/gitattributes. Renderer mění hodnotu, která už existuje, na prezentaci a nedrží žádný fakt: textový renderer CLI, stránka Cockpitu, šablona Zola, banner prostředí (src/environment/render.rs, „čistý pohled bez discovery“). Když renderer počítá něco, co by měl vlastnit generátor, stává se druhou implementací. Kontrola development-semantics říká, že to mechanicky rozhodnout neumí, a tak to dělá recenzent.

8.5 Generátory se testují

  • tests/projections.rs: každá deklarovaná projekce existuje a žádná není sirotek; změna typu nebo popisu dosáhne MCP, OpenAPI i reference; generované artefakty jsou při dvojím generování bajtově totožné a nenesou absolutní cestu [C18].
  • tests/generate_check.rs: --check souhlasí s tím, co by zápis vyprodukoval, odhalí manipulaci a nikdy nezapisuje.
  • test/cases/98_cli_reference.sh porovnává dvě generace pomocí cmp. test/cases/28_no_hardcoded_values.sh tvrdí, že pořadí vstupu nezávisí na locale. test/cases/12b_site_data_transactional.sh tvrdí, že neúspěšný běh zanechá artefakty bajtově shodné. test/cases/51_derived_artifacts_committed.sh tvrdí, že derive-check projde a že žádný odvozený soubor nevkládá aktuální commit.

9. Governance: doktrína, pravidlo, politika, ADR

Tento repozitář definuje čtyři pojmy takto. Definice pocházejí z DOCTRINE.md, souborů pravidel a .ai/repo/policy.yaml.

PojemCo to je zdeKdeŽivotní cyklus
pravidlosoubor Markdown s front matter: id, version, title, statement, status (active nebo deprecated), class (blocking nebo advisory), depends_on a volitelný blok x-majordomus jmenující validátor, testy nebo reviewed_because.ai/repo/rules/project/ plus vendorovaný balíček v .ai/repo/rules/vendor/majordomus/ (připnutý hashem)upraveno v commitu; nový význam je nový soubor verze; žádný krok přijetí
doktrínadva významy v tomto repozitáři (dluh F-25). V DOCTRINE.md je doktrína pravidlo, jehož blok x-majordomus jmenuje validátor, který volá shellový dispečer (mj_doctrine_dispatch), a registr doktrín se odvozuje ze sady pravidel. Na stránkách metody webu je „doktrína“ vrstva principů nad politikouDOCTRINE.md; site/content-src/method/odvozeno z pravidel
policykonfigurace nástroje jednoho repozitáře: rozpočty kontextu, verification.finish_requires, sekce předávek, zapojení vynucování pro hooky.ai/repo/policy.yamlupravuje se ručně; projekce poskytovatelů se generují příkazem majordomus update
ADRzáznam rozhodnutí: schema: adr/v1, status (proposed, accepted, superseded nebo rejected), vzájemné supersedes/superseded_by, typované odkazy related, provenance.originjeden soubor na rozhodnutí pod .ai/repo/adrs/, pojmenovaný číslem a slugemadr propose zapisuje proposed; přijetí je akt člověka, vynucený jen pro záznamy, jejichž původ je extracted [C34]

Řetěz od pravidla k důkazům je:

flowchart TD
  rule["rule file<br>class, depends_on, x-majordomus"]
  mode["enforcement mode, from the block's shape<br>dispatched: validator / gated: tests / reviewed: reason"]
  val["validator<br>mj_validate_name in lib/, run by the dispatcher<br>at the commands enforced_by names"]
  gate["CI gate<br>.ai/repo/ci/gates.yaml: id, job, runs, path classes"]
  test["behavioural case or crate test<br>test/cases/*.sh, apps/majordomus-cli/tests/*.rs"]
  ledger["recorded execution<br>.ai/repo/evidence/ledger.json"]
  state["proof state per rule<br>crate::rules, rules report"]
  surf["surfaces<br>CLI rules report, GET /api/v1/rules,<br>majordomus_rules, generic Cockpit page"]
  rule --> mode
  mode --> val
  mode --> test
  test --> gate
  val --> test
  test --> ledger
  ledger --> state
  gate --> state
  state --> surf

Jedno spojení v tom řetězu je odvozeno, ne deklarováno. gates.yaml neříká, která pravidla kontrola dokazuje. crate::rules skenuje řádek runs: každé kontroly (čtečka řádků, ne typovaný parser) a naváže cestu pojmenovanou pravidlem na kontrolu ve třech případech: příkaz je ta cesta; cesta je testovací případ a příkaz spouští test/run.sh; nebo cesta je test crate a příkaz obsahuje rust-check [C27]. Kontrola sady se předpokládá jako spouštějící každý případ; nic nekontroluje, že případ skutečně vybrala (dluh F-7).

10. Existence pravidla není totéž co jeho vynucování

Pravidlo může být v kterékoli z osmi podmínek a každá je jiné tvrzení. Tabulka mapuje každou podmínku na to, co repozitář dnes skutečně dokáže ukázat.

PodmínkaCo to zde dokazujeImplementováno?
deklarovánosoubor pod .ai/repo/rules/ano
naparsovánolib/rules.sh a src/rules/mod.rs to čtou; neznámé klíče jsou chybyano (dva čtenáři)
platnévyřešení odmítne chybějící závislosti, cykly a duplicitní identity; loader odmítne napůl deklarovaný blokano
validátor existujerules report označí pojmenovaný validátor present; chybějící činí pravidlo danglingano, pro odeslaná pravidla
zapojenodoctor prochází řetěz dispatcheru kvůli doktrínám; rule-proof-check odmítne pojmenovanou cestu, která není ve stromuano
kontrola se provádíkontrola v gates.yaml, jejíž runs: pokrývá jmenovanou cestuodvozeno z runs: (§9)
prošlozaznamenané úspěšné provedení, za které se vstupy pravidla nepohnulyčástečné: zaznamenávají se jen lokální běhy; CI nezaznamenává nic (dluh F-6)
důkazy zachyceny.ai/repo/evidence/ledger.json, spojeno při každém čteníčástečné: stejné omezení

Strojově čitelná podoba tohoto žebříčku je graf důkazů pravidel (crate::rules, majordomus-cli rules report | show | proves, GET /api/v1/rules, MCP majordomus_rules). Dává každému pravidlu jeden z deseti stavů: proven, inputs unchanged, stale, gated, failing, not run, reviewed, unrunnable, dangling, unproven. Stav pravidla je nejslabší z jeho částí [C23].

  • Režimy vynucování plynou z tvaru bloku [C24]. Odesílané pravidlo jmenuje validator. Kontrolované pravidlo jmenuje tests a žádný validátor. Revidované pravidlo jmenuje větu reviewed_because a nic z toho. Spustitelný důkaz vždy vyhrává. scripts/ci/rule-proof-check, kontrola rule-proof, odmítne nefunkční cestu rovnou a ratchetuje blokující pravidla, která v .ai/repo/rule-proof-baseline.txt nejmenují nic [C25].
  • Nález je třída, kterou stav nepodporuje. dangling je nález pro jakoukoli třídu. U blokujícího pravidla jsou nálezy unproven, failing a unrunnable. gated, reviewed a not run jsou slabší stavy: počítají se, ale nálezy nejsou [C26].
  • Na samotný graf důkazů se nic nekontroluje. Žádný skript, kontrola ani workflow nespouští rules report --check (dluh F-8).
  • Selhávající běh lze skrýt. Stav pravidla je max() přes jeho testy a enum řadí Failing před NotRun. Blokující pravidlo s jedním selhávajícím případem a jedním případem, který nikdy neběžel, proto hlásí not run, což není nález. Čtení kódu to ukazuje; v datech to pozorováno nebylo (dluh F-9) [C26].

project.never-reported-is-not-green ukazuje celý problém v jednom pravidle. Jeho výrok zní „kontrola, která nehlásila, je neznámá, nikdy ne úspěšná“. Je to class: advisory, nemá blok x-majordomus a říká, že se rozhoduje „posudkem a záznamem, ne kontrolou“. Graf důkazů je hlásí jako unproven a to není zjištění, protože poradní pravidlo nedluží důkaz. Pravidlo existuje, jeho myšlenky utvářely evidence-check (viz EVIDENCE.md) a mechanicky vynucováno není. Graf říká přesně to.

Chcete-li to změřit sami:

$ bin/majordomus-cli rules report --format json | jq '.states, .coverage'
$ scripts/ci/rule-proof-check
$ bin/majordomus-cli rules show project.never-reported-is-not-green

11. Důkazy, čerstvost a drift tvrzení

Ledger. .ai/repo/evidence/ledger.json drží poslední zaznamenané provedení každého testu. Každý záznam uvádí id testu, runner, zdroj, výsledek, sekundy, commit, stav pracovního stromu, digest sha256 vlastního zdroje testu, čas, původ (local, ci nebo release) a příkaz, který jej reprodukuje. majordomus evidence record jej zapisuje z reportu, který běh už vytvořil. Nedrží žádnou historii ani výstup (EVIDENCE.md).

Čerstvost se odvozuje při každém čtení [C28]:

  • běh, který neprošel, je failing;
  • když git nedokáže udělat diff, běh je stale, protože nevědět není důkaz;
  • když se zdroj testu nebo soubor pravidla změnil po zaznamenaném commitu, nebo digest již nesouhlasí, běh je stale;
  • když se nezměnilo nic jiného než samotná kniha, běh je proven;
  • jinak je běh inputs unchanged, tedy žádná známá invalidace, ale není to důkaz proti tomuto commitu.

Tvrzení. docs/CLAIMS.yaml váže každé veřejné tvrzení ke zdroji, implementaci a testu, s ručně psaným status ze slovníku deklarovaného v témže souboru. Každé tvrzení má stránku pod docs/claims/. Tři čtenáři kontrolují drift:

KontrolaOtázkaKontrola
scripts/generate-site-data --checkexistují jmenované cesty? má každé tvrzení stránku?core-check
scripts/ci/claim-proof-checkpojmenovává pojmenovaný test tvrzení zpět? (ratchet)claim-proof
scripts/evidence-checkjaký je stav důkazu každého tvrzení proti knize? (ratchet při ztraceném nebo staženém důkazu)evidence-check, vždy zapnuto

Jak důkaz poctivě dosáhne Cockpitu a webu. Stavy důkazů pravidel a tvrzení se poskytují jako schopnosti (rules.*, evidence.*) přes CLI, HTTP a MCP a každá má obecnou stránku schopnosti v Cockpitu. Cockpit nemá žádnou vyhrazenou oblast pravidel, důkazů ani peerů. Stránka webu /evidence/ vykresluje data/generated/claims-graph.json, který je sestaven z CLAIMS.yaml: ukazuje psané vazby mezi tvrzeními, zdroji a testy, ne výsledky ledgeru. Jeho stránky záruk ukazují psané status, ne změřený důkaz [C29]. CI důkazy také nezaznamenává: EVIDENCE.md říká „dnes ten krok nespouští nic“ [C29]. Důkaz funkce tedy dosahuje API a MCP jako odvozený stav. Na stránku, kterou člověk prochází, zatím nedosahuje jako cokoli víc než mechanismus (dluh F-6, F-10).

12. Publikace: sestaveno, nasazeno, ověřeno

Web je projekce a „publikovaný“ se může říkat třem různým stavům:

StavCo to zakládáKde
sestavenoscripts/pages build otiskem dokáže, že potvrzená data jsou aktuální, a pak spustí site-build --no-data; neaktuální strom je odmítnut, nikoli přegenerovánkrok .github/workflows/pages.yml, build
nasazenoscripts/site-deploy --skip-build pushne gh-pages; GitHub pak spustí vlastní build Pages, který čte scripts/pages builtkrok publish a krok, který čte build GitHubu
ověřeno veřejněscripts/pages verify --commit $GITHUB_SHA polluje živý /build.json (zapsaný příkazem scripts/site-build s commitem, hashem zdroje a otisky). Je continue-on-error: report, ne kontrolakrok public
ověřeno, jako kontrolascripts/ci/pages-check, kontrola pages-live: publikovaný commit je na masteru, žádná publikace není dlužná mimo okno deploye, živý web obsluhuje to, co drží gh-pages, a build GitHubu neskončil chybou. Je to at-finish, takže se na to ptá finish.ai/repo/ci/gates.yaml [C21]

To je v praxi project.never-reported-is-not-green. Job nasazení, který hlásí cancelled, protože příliš dlouho čekal na CDN, není důkazem, že se nic nepublikovalo, takže na otázku se odpovídá čtením toho, co web servíruje.

13. Doctor a drift: zjistit, opravit, znovu vygenerovat

SlovesoNástrojZapisuje?
detekcemajordomus doctor (shell, jen pro čtení): stavy projekcí poskytovatelů (absent, region_absent, malformed, unstamped, hand_edited, ok), řetězec zapojení doktríny, zapojení hooků a merge driveru, rozpočet vždy načítaného souboru a pevně zapsané počty. majordomus-cli worktree doctor, mesh doctor, capabilities validate, scripts/derive-checkne
znovu vygenerovatmajordomus generate, scripts/derive, majordomus update (soubory poskytovatelů; nejdřív vykreslí každý cíl a odmítne přepsat ruční úpravu bez --force)ano, jen odvozené soubory
repairmajordomus-cli worktree repair a worktree migrate (ověřeno otiskem), just derive-merge-driverano, místní stav nebo konfigurace

doctor nemá --fix [C22]. Každý nález jmenuje příkaz, který jej opraví. Nález, který žádný nejmenuje, kontrola finding-reproduce odmítne. Čerstvost site/ a docs/generated/ doctor nekontroluje; kontrolují ji pre-commit pages current a derive-check.

14. Testy, které drží povrchy pohromadě

TestCo porovnává
test/cases/76_capabilities_projections.shcapabilities validate prochází pro registr, MCP, HTTP a OpenAPI; jedna schopnost (objects.get) je vysledována k nástroji, trase, operationId a řádku reference; počet operací OpenAPI se rovná počtu vystavení HTTP; poškozený generovaný soubor způsobí, že generate --check skončí s exit 10; žádné řádky closed == false; deklarativní pravidlo a druh definovaný repozitářem dosáhnou každého povrchu
apps/majordomus-cli/tests/http_serve.rsskutečný socket: mcp_and_http_answer_the_same_capability_with_the_same_result pro objects.get, objects.search a capabilities.describe; the_release_analysis_is_one_value_on_every_surface; každá routa odpovídá svým případům měření výkonu
apps/majordomus-cli/tests/projections.rsprojekce existují bez osiřelých, včetně stromu clap; mutace typu zasáhne každou projekci; generování je bajt po bajtu identické
test/cases/91_canonical_architecture.shID registry.json se rovnají živému describe; pokrytí měřením výkonu je úplné; mnoho požadavků MCP nemění startovní čítače
test/cases/92_openapi_reference.shtagy OpenAPI se rovnají modulům; příklady se rovnají benchmarkovým případům
test/cases/46_cross_surface.shúkoly plánu, stav READY a hrany se shodují napříč CLI, diagramem Mermaid a projekcí GitHub. Toto je plán, nikoli schopnosti
test/cases/99_plan_capabilities.shshellový engine plánu a src/plan.rs dávají bajtově shodné odpovědi

Rovnost hodnot napříč HTTP a MCP se testuje na vzorku schopností, negeneruje se pro každou. Žádný test netvrdí, že --format json z CLI se rovná hodnotě HTTP u každé schopnosti vystavené v CLI (dluh F-12).

15. Relace, kontext, předávka, plánování, prostředí

Každé z nich sleduje stejný vzor: psaný nebo zaznamenaný stav, odvození a projekce. Vlastník každého odvození se liší a tam je dluh.

Relace: trvalý záznam plus pomíjivá přítomnost. Epizoda relace patří relaci poskytovatele. Dokud je otevřená, zaznamenává se pod .ai/local/state/sessions-open/ a uzavřená se zapíše do .ai/repo/sessions/ jako sledovaný záznam. To je trvalá polovina, zapisovaná lib/session.sh a lib/capture.sh a spouštěná hooky poskytovatele v .claude/settings.json (start relace, konec, compact a odeslání promptu). Přítomnost je nástěnka peerů, držená v paměti sdíleným serverem a ztracená s procesem (§16). CONTINUITY.md uvádí oddělení: „Soubor epizody nezaznamenává žádný proces, nástěnka peerů nezaznamenává žádnou epizodu.“ Typovaná doména relací v Rustu (src/session/) čte; shell stále zapisuje (ADR 47, ADR 52).

Kompilace kontextu: dva enginy.

  • majordomus context (lib/context.sh) je briefing. Má pevné sekce v pořadí autority (git, peeři, úloha, profil, kontextové dokumenty, otázky, rozhodnutí, checkpoint, předávka, soubory, historie, prompt), rozpočet řádků z politiky (context.builder_budget_lines) a deklarované pořadí vypouštění. Git, úloha, profil a otevřené otázky se nikdy nevypouštějí a každá vypuštěná sekce je uvedena pod EXCLUDED. Je deterministický a nevolá se žádný model.

  • devcontext.compile (src/devcontext/) je kompilátor Rustu. Je to schopnost, takže dosáhne na CLI, HTTP i MCP [C44]. Algoritmus:

    • objevování: semínka, průchod složeným grafem s váhami hran násobenými podél každé cesty, účinné cesty rozsahu (včetně deklarovaného scope úkolu), governance, záznamy relací a lokální předávky a checkpointy a nevyřešené odkazy;
    • relevance: práh (DEFAULT_FLOOR) a limit hloubky (DEFAULT_MAX_DEPTH);
    • autorita: úrovně seřazené Task, Governance, Source, Decision, Knowledge, History;
    • čerstvost: lokální záznam, jehož odchylka od gitu je nedůvěryhodná, má relevanci sníženou na polovinu a dostane diagnostiku stale_record, a zastaralé či nahrazené objekty se vylučují;
    • rozpočet: tokeny odhadnuté jako bajty dělené BYTES_PER_TOKEN, first fit v pořadí podle úrovně, pak relevance, pak URI; seedy a objekty politiky nebo rozsahu se nikdy nezahazují a over_budget se hlásí, pokud samy překročí rozpočet [C45].

    Odvozuje se pouze shoda záměru (§4). Dva enginy pro jeden koncept jsou dluh F-15.

Předávka. Povinné sekce pocházejí z politiky (handover.required_sections: Objective, Current State, Next Action) a chybějící nebo prázdná sekce je odmítnuta. Identitní pole front matteru (větev, hlava, worktree, změněné soubory, …) se vždy počítají a tělo, které se jedno pokusí napsat, je odmítnuto. S --derive se každá sekce generuje z knihy, gitu a otevřených otázek pomocí mj_derive_sec_<slug> v lib/derive.sh [C47]. --resolve vybere nejnovější předávku pro stejný worktree a větev, poté pro stejnou větev, nikdy napříč repozitářem, a označí její divergenci od gitu.

Plánování. Milníky a úkoly jsou psané YAML pod .ai/repo/project/. Stav se odvozuje a nikdy neukládá: klíč status je chyba validace. Validace sestaví DAG závislostí s detekcí cyklů a pak vlny provádění; dva připravené úkoly v jedné vlně, jejichž rozsahy se navzájem obsahují, vyvolají WARN scope_conflict a serializují se [C46]. lib/project.awk je autoritativní engine. src/plan.rs ho zrcadlí a případ 99 ho drží byte-identický; plan.* ho zpřístupňuje přes HTTP a MCP a plan.transition zapisuje jeden záznam přes model (dluh F-17). docs/PLAN_STATUS.md generuje stage B.

RepositoryEnvironment. environment::RepositoryEnvironment (majordomus/repository-environment/v1) je jeden typovaný snapshot: projekt, repozitář, VCS, toolchainy, vrstva, workflow, provideři a služby, s položkou původu pro každou hodnotu. environment.status a environment.explain jsou schopnosti (HTTP, MCP). Příkazy env a banner shellu jsou jeho vykreslení; banner „je čistý pohled bez discovery“. Jedno omezení je poctivé uvést: služba se kreslí jako dostupná, když uspěje TCP connect, a nic víc [C48] (dluh F-18).

16. Mesh a nástěnka peers

Existují dva odlišné mechanismy a třetí neexistuje.

Nástěnka peerů (src/peers.rs, ADR 44) drží relace, které na tomto repozitáři pracují právě teď. Je to jedna nástěnka v paměti na sdílený server; peers.list sbírá nástěnku každého checkoutu čtením leasů ostatních checkoutů a jedním dotazem na každý a hlásí complete a boards. Peer je připojen přes relaci MCP a relace HTTP MCP vyprší po SESSION_IDLE_TIMEOUT. majordomus_announce připojí claim (intent, scope) ke spojení. Nástěnka „nic nevynucuje“ a peer, který se znovu připojí, na ní ztratí své místo [C41].

Mesh (src/mesh/, ADR 50, docs/MESH.md) objevuje běžící instance Majordomus napříč stroji. Jeho implementovaní poskytovatelé jsou UDP multicast, UDP broadcast a HTTP rendezvous (POST /api/v1/mesh/register), každý je implementací MeshProvider, která manageru jen předává bajty. Manager ověřuje obálky podepsané Ed25519 jednou cestou do jednoho MeshRegistry, omezeného MAX_NODES, s přítomností z PRESENCE_TTL a záznamy uchovávanými po RETENTION. Důvěra (deny_unknown ve výchozím stavu) záznamy označuje a nic neuděluje. Mesh je vypnutý, pokud ho nezapne commitnutá deklarace, a deklarace tohoto repozitáře (.ai/repo/mesh/majordomus.yaml) říká enabled: false [C42]. Řídicí věta zní „Discovery creates awareness, not authority.“

Co neexistuje, aby to nikdo nehledal: nástěnka oddělená od nástěnky peerů; objevování přes Tailscale, mDNS nebo DNS-SD (jmenováno jen jako možní budoucí poskytovatelé); jakákoli replikace žurnálu, odkazů nebo nároků mezi stroji na masteru; stránka Cockpitu pro nástěnku peerů. ADR 50 je záměrně drží odděleně: „Nástěnka peerů zůstává jediným povrchem spolupráce.“

Překryv rozsahu je odvozen a poradní. Překryv počítají tři mechanismy a žádný nic nezamyká:

MechanismusČteVýsledek
majordomus start / check --overlap (lib/start.sh mj_report_overlap)rozsahy úloh .ai/local/state/current.yaml ostatních worktree, podle obsažení cestINFO overlap řádků; exit 0
peers::claims_meetclaimy oznámené na nástěncepřekryv ohlášený vedle peera
scope_conflict plánudeklarované rozsahy úkolů v rámci vlnyWARN; úkoly jsou serializovány

check --overlap čte jen záznamy úloh, ne nástěnku ani větve. Má také vadu, kterou lze reprodukovat: smyčka běží na pravé straně roury, takže její čítač nálezů se ztratí, a tiskne „žádný jiný worktree nemá claim na překrývající se cestu“ hned po výpisu překryvů [C43] (dluh F-13). Commit odmítne skutečně rozsah samotné úlohy, kontrolovaný v finish a hookem pre-push.

PovrchNástěnka peerůMesh
CLIžádné pro peers.listmesh identity, mesh doctor (schopnosti); mesh status, mesh nodes (lokální vykreslení)
HTTPGET /api/v1/peers, POST /api/v1/peers/announceGET /api/v1/mesh, /mesh/nodes, /mesh/identity, /mesh/doctor; POST /api/v1/mesh/register
MCPmajordomus_peers, majordomus_announcemajordomus_mesh, majordomus_mesh_nodes, majordomus_mesh_identity, majordomus_mesh_doctor, majordomus_mesh_register
Cockpitžádná oblast (jen generická stránka schopnosti)/cockpit/mesh, z mesh.status a mesh.nodes

17. Návody krok za krokem

17.1 Jedna schopnost přes každý povrch: rules.report

KrokKdeAutomaticky nebo ručně
vstupní typ RulesReportInput, výstupní typ, BenchmarkCasessrc/capability/builtin/rules.rsručně (typy)
capability! s id: "rules.report", mcp("majordomus_rules") plus zdroj majordomus://rules, get("/api/v1/rules"), cli: ["rules", "report"]builtin/rules.rsručně, jednou
Schémata JSONCanonicalSchema::ofautomaticky
Nástroj MCP majordomus_rules s readOnlyHintmcp/surface.rsautomaticky
GET /api/v1/rules?class=&state=&namespace=&findings_only=http/router.rsautomaticky
OpenAPI operationId: rules.report, tag rules, x-majordomus-cli: rules report, příklady z případůhttp/openapi.rsautomaticky
Vstup do Swagger UI/swaggerautomaticky
clap RulesCommand::Report, přepínače --state --class --namespace --findings --checkcli.rsručně
runner: příznaky na vstup, by_cli, execute; textový renderer; --check skončí s 10commands/rules.rsručně
příklad rules-report-jsoncli::EXAMPLES v cli.rsručně
uzavření: tvrzení rules report se rozliší na spustitelný příkaz clapcapability/closure.rsautomatická kontrola
/cockpit/capabilities/rules.report s formou runnerucockpit/pages.rs capabilityautomaticky
docs/generated/capabilities.md, docs/generated/modules/rules.md, registry.jsonfáze Aautomaticky
/registry/capabilities/rules-report/, /docs/cli/rules/report/fáze B (scripts/generate-site-data)automaticky

K reprodukci: bin/majordomus-cli capabilities describe rules.report, curl -s localhost:8742/openapi.json | jq '.paths["/api/v1/rules"].get.operationId'.

17.2 Jedno pravidlo od souboru k důkazům: project.conventional-commits

  1. Zdroj. .ai/repo/rules/project/conventional-commits.v2.md, class: blocking, s x-majordomus: tests: [test/cases/274_commit_policy.sh, scripts/ci/commit-policy]. Jmenuje testy a žádný validátor, takže jeho režim je kontrolovaný.
  2. Kontrola. commit-policy v .ai/repo/ci/gates.yaml, runs: scripts/ci/commit-policy. Soudce uvnitř je schopnost commit exekutoru; kontrola vybere rozsah a ratchetuje dluh v .ai/repo/commit-policy-baseline.txt.
  3. Důkaz mutací. test/cases/274_commit_policy.sh přidá commit, který není conventional, a ověří, že příkaz i kontrola skončí s exit kódem 10, že nový dluh selže po --write-baseline a že selže --strict.
  4. Důkazy. Kniha drží lokální úspěšný běh suite:274_commit_policy. Cesta kontroly pravidla je jako důkaz unrunnable, protože žádný runner nezaznamenává verdikt kontroly, takže stav pravidla je gated: mechanismus je ukázán, ne výsledek.
  5. Povrchy. bin/majordomus-cli rules show project.conventional-commits, GET /api/v1/rules/rule?rule=project.conventional-commits, MCP majordomus_rule a generická stránka Cockpitu pro rules.show. Stránky /doctrines/ webu se generují z registru doktrín (doctrines.json ve fázi B) a nezobrazují stav knihy.

17.3 Jedna doktrína: majordomus.use-case-coverage

Je vendorován v .ai/repo/rules/vendor/majordomus/rules/use-case-coverage.v1.md. Jeho blok jmenuje validator: use_case_coverage, enforced_by: [doctor, check, finish], policy_key: use_cases_covered, exit_code: 10 a test (test/cases/94_use_cases.sh). Dispatcher spouští mj_validate_use_case_coverage (lib/usecase.sh) vždy, když běží některý z těchto příkazů, podle politiky pokrytí v policy.yaml. finish vybírá doktríny podle verification.finish_requires a seznam tohoto repozitáře use_cases_covered neuvádí, takže zde je doktrína vynucována při doctor a check, ale ne při finish. Graf důkazů hlásí validátor present a případ not run.

17.4 Jeden příklad meshe

Mesh je v tomto repozitáři implementován a zakázán, takže poctivým živým příkladem je odmítnutí:

$ curl -s localhost:8742/api/v1/mesh | jq '{active, reason}'
$ curl -s localhost:8742/api/v1/mesh/nodes | jq .count

První odpovídá active: false s důvodem „deklarace meshe je vypnutá“; druhá odpovídá nulou uzlů. test/cases/130_mesh.sh a apps/majordomus-cli/tests/mesh.rs zkouší mesh v jednorázových fixture repozitářích, ne na tomto.

17.5 Přidání funkce: co se skutečně děje

Pro novou operaci jen pro čtení:

  1. Napište vstupní a výstupní typy pomocí serde a JsonSchema, plus BenchmarkCases pro vstup (nebo deklarujte výjimku z měření výkonu). Ručně.
  2. Napište jeden blok capability! s jeho vystavením. Nový modul potřebuje také module! a řádek v compose_modules!. Ručně.
  3. Ujistěte se, že žádný titul schématu nekoliduje s názvem jiné komponenty, jinak generování OpenAPI selže. Ručně; nic na to dřív neupozorní.
  4. Pokud má cestu v CLI: přidejte variantu clap, větev dispatche, runner s mapováním argumentů, textový renderer a položku CommandExamples. Pokud je jen pro CLI, přidejte položku cli::LOCAL. Ručně, a kontroluje cli::validate, tests/cli_examples.rs, uzavřenost a parita.
  5. Vyhrazená oblast Cockpitu potřebuje větev routy, funkci stránky a položku areas(). Ručně. Generická stránka nepotřebuje nic.
  6. Zvláštní třídy cest v .ai/repo/ci/gates.yaml jmenují konkrétní soubory (commit, design, pravidla). Nový builtin soubor už pokrývá třída rust; nový adresář subsystému může potřebovat třídu. Ručně a ne zdokumentováno jako krok.
  7. Spusťte scripts/derive a projekce commitněte. Generování je automatické; jejich staging je ruční.
  8. Následují MCP, HTTP, OpenAPI, Swagger, obecná stránka Cockpitu, cíle měření výkonu, reference a stránky registru. Automaticky.

CAPABILITIES.md říká, že nová schopnost je „jeden blok capability! … nic jiného“. To platí jen pro schopnost bez cesty v CLI a bez vyhrazené stránky.

17.6 Přidání pravidla: „každá veřejná schopnost má spustitelné ověření“

KrokExistuje dnes?
zapsat .ai/repo/rules/project/<name>.v1.md s class: blocking a x-majordomus.testsano: formát, loader a validace existují
nechat rule-proof-check jej odmítnout, pokud nejmenuje žádný důkazano
kontrola, která spojuje každou schopnost s behaviorálním testemne. Blízké části: pokrytí měřením výkonu (každá vystavená schopnost má cíl měření na každém transportu; čas, ne správnost), scripts/ci/command-furnished (veřejné příkazy mají fixtures a případy), scripts/ci/surface-coverage (povrchy mají testy podle přítomnosti souboru), pokrytí případů užití (vyžadováno pro příkazy; nástroje MCP jsou jen doporučené a „pojmenováno“ se počítá jako „spustitelné“)
kontrola v gates.yaml, která tuto kontrolu spouští, a mutační případ dokazující, že selžebylo by nové
graf důkazů, vazba pravidla na kontroluautomaticky, jakmile runs: kontroly jmenuje skript
zaznamenané úspěšné provedenílokální záznam existuje; záznam z CI ne
stránka Cockpitu nebo webu ukazující výsledekneimplementováno (§11)

18. Co se negeneruje

Generování končí tam, kde začíná úsudek. Následující je kanonický lidský vstup a stroj neodvozuje nic, co by jej mohlo nahradit:

  • intent: akceptační kritéria úkolu, výsledek milníku, rozsah úlohy, cíl předávky;
  • rozhodnutí: kontext, rozhodnutí a důsledky ADR a jeho přijetí;
  • rules: tvrzení, třída a volba mezi validátorem, testem nebo posouzeným důvodem;
  • policy: rozpočty, požadavky na dokončení, co smí mesh;
  • próza: tento dokument a každý docs/*.md;
  • deklarace vkusu: skupiny navigace, designové tokeny, oblasti Cockpitu.

Stroj odvozuje to, co se z toho dá přepočítat: stav, vlny, stavy důkazů, schémata, route, reference, web, briefingy a kostry předávek.

19. Nulová registrace: ideál a jeho výjimky

Ideálem je, že přidání faktu nevyžaduje jeho registraci nikde jinde. Platí to pro: deklarativní objekty (soubor ve třídě sources.yaml), projekce schopností do MCP, HTTP, OpenAPI, Swaggeru a obecné stránky Cockpitu, dokumenty na webu (jeden řádek indexu, který generátor vynucuje), poskytovatele meshe a odvozeniny grafu v postranním panelu Cockpitu.

Současné výjimky jsou všechny zaznamenány a každá je kontrolována nebo držena ratchetem, nikoli tichá: strom clap, cli::EXAMPLES, CLI renderery, cli::LOCAL, směrovací tabulka a oblasti Cockpitu, site/data/nav.toml, třídy cest gates.yaml a shellové příkazy v share/commands.yaml. Příloha F je vypisuje s odkazy na soubory.

20. Proč na generování záleží a teze

Repozitář, který paralelně spouští agenty, píše sám o sobě rychleji, než kdokoli čte. Kdyby měl každý povrch vlastní popis, každý merge by byl příležitostí k rozporu a nikdo by si ho nevšiml, dokud by agent nezačal jednat podle špatného. Generování, běh --check a ratchet mění tento rozpor v selhávající příkaz.

Teze, každá vyslovená jen tak silně, jak dovolují důkazy výše:

  1. Majordomus je model nativní pro repozitář a jeho povrchy jsou z něj odvozeny. Platí to pro operace a deklarativní objekty. Pro příkazovou řádku (kontrolovanou, ne odvozenou) a Cockpit (generické stránky odvozené, oblasti ručně) platí jen částečně a zatím neplatí pro měnící vývojovou sémantiku, kterou vlastní lib/.
  2. Povrchy jsou projekce jedné typované reality. HTTP, OpenAPI, Swagger a MCP jsou projekce a testy ukazují, že HTTP a MCP vracejí u vzorkovaných schopností stejné hodnoty. CLI a Cockpit přidávají renderery, které nedrží žádná fakta; zda renderer začal počítat, rozhoduje recenzent, ne kontrola.
  3. Pravidla záleží, když jejich vztah k validátorům, provádění a důkazům může zkoumat stroj. Zde může: graf důkazů odvozuje stav každého pravidla z pravidla, stromu, gates.yaml a ledgeru. To, co graf může ukázat, je stále omezeno tím, co je zaznamenáno, a dnes to znamená jen lokální běhy a žádné verdikty kontrol.
  4. Mesh činí distribuovanou práci viditelnou. Není to magická orchestrace. Nástěnka peerů a registr meshe pozorují; nároky jsou pouze doporučující; překryv se hlásí, nezamyká; a mesh je v tomto repozitáři vypnutý.
  5. Generování brání jednomu repozitáři hromadit nekompatibilní popisy sebe sama. Platí to všude, kde existuje --check nebo kontrola pevného bodu. Kde próza popisuje kód bez kontroly, rozchází se: F-20 až F-24 níže jsou příklady nalezené při psaní tohoto dokumentu.

Příloha A: mapa architektury

flowchart TD
  subgraph canonical["canonical: tracked, authored"]
    codeN["capability! blocks<br>apps/majordomus-cli/src/capability/builtin"]
    layerN[".ai/** objects<br>rules, ADRs, policy, plan, sessions, use cases"]
    shareN["share/: kinds, schemas, commands, events"]
    proseN["docs/*.md, site/content-src, nav.toml"]
    shellN["lib/*.sh: shell tool semantics"]
  end
  subgraph discovery["discovery"]
    manifestN["manifest and sources.yaml"]
    indexN["index of typed objects<br>fingerprinted"]
  end
  subgraph model["typed models"]
    registryN["CapabilityRegistry<br>builtin plus declarative, frozen"]
    rulesN["rule proof graph"]
    planN["plan model: status, DAG, waves"]
    envN["RepositoryEnvironment"]
    devctxN["devcontext selection"]
  end
  subgraph observed["observed, in process"]
    peersN["peer board"]
    meshN["MeshRegistry"]
    execN["executions"]
  end
  ledgerN["evidence ledger<br>.ai/repo/evidence/ledger.json"]
  gatesN["gates.yaml and scripts/ci"]
  executorN["one executor"]
  subgraph surfaces["projections"]
    mcpS["MCP"]
    httpS["HTTP API"]
    oasS["OpenAPI"]
    swS["Swagger UI"]
    cliS["CLI, checked by closure"]
    cockS["Cockpit"]
    genS["docs/generated"]
    siteS["site data and pages"]
  end
  codeN --> registryN
  shareN --> manifestN
  layerN --> manifestN --> indexN --> registryN
  indexN --> rulesN
  indexN --> planN
  ledgerN --> rulesN
  gatesN --> rulesN
  registryN --> executorN
  rulesN --> executorN
  planN --> executorN
  envN --> executorN
  devctxN --> executorN
  peersN --> executorN
  meshN --> executorN
  execN --> executorN
  executorN --> mcpS
  executorN --> httpS
  executorN --> cockS
  executorN --> cliS
  registryN --> oasS --> swS
  registryN --> genS --> siteS
  proseN --> siteS
  shellN --> layerN

Příloha B: mapa povrchů

KonceptCLIMCPAPICockpitDokumenty
capabilitiesmajordomus-cli capabilities list / describe / projections / validatemajordomus_capabilities, majordomus_capability, majordomus_projections/api/v1/capabilities, /capability, /capabilities/projections/cockpit/capabilitiesdocs/generated/capabilities.md, /registry/
objektyžádné (mezera)majordomus_get, majordomus_list, majordomus_search, jeden zdroj na objekt/api/v1/object, /objects, /search/cockpit/objects, /cockpit/objectsekce webu specifické pro druh
pravidla a důkazrules report / show / provesmajordomus_rules, majordomus_rule, majordomus_rule_proves/api/v1/rules, /rules/rule, /rules/provespouze obecná stránkaDOCTRINE.md, /doctrines/ (bez stavu důkazu)
evidenceevidence show / claim / proves / recordmajordomus_evidence, majordomus_evidence_claim, majordomus_evidence_test/api/v1/evidence, /evidence/claim, /evidence/test (record je jen CLI: zapisuje)pouze obecná stránkaEVIDENCE.md, /evidence/ (napsaný graf tvrzení)
planshell majordomus plan …majordomus_plan*, majordomus_plan_transition/api/v1/plan*, POST /plan/transitionobecné stránkyPLANNING.md, /plan/, docs/PLAN_STATUS.md
kontextshell context; devcontext compile / explain / policymajordomus_devcontext*, majordomus_continuity/api/v1/devcontext*, /continuity/cockpit/continuityCONTEXT.md, CONTINUITY.md
prostředíenv status / explain / banner / export (vykreslení)majordomus_environment, majordomus_environment_explain/api/v1/environment, /environment/explainoverviewENVIRONMENT.md
worktreesworktree topology / status / inspect / migrate …majordomus_worktrees, …/api/v1/worktrees*/cockpit/worktreesWORKTREES.md
peersžádnémajordomus_peers, majordomus_announce/api/v1/peers, /peers/announcežádnéMCP.md
meshmesh identity / doctor / status / nodesmajordomus_mesh*/api/v1/mesh*/cockpit/meshMESH.md
kontroly a dokončeníshell check, finishmajordomus_gates, majordomus_completion/api/v1/gates, /gates/completionobecné stránkyCI.md

Pro ověření libovolného řádku spusťte bin/majordomus-cli capabilities projections --format json.

Příloha C: matice generování

„Odvozeno“ znamená vytvořeno generátorem nebo vypočteno při čtení. Pomlčka znamená, že entita na tomto povrchu není.

EntitaNapsánoObjevenoOdvozenoCLIAPIMCPCockpitDokumenty
vestavěná schopnostblok capability!, typysloženo, nikoli objevenoschémata, trasa, nástroj, operace, cíle měření, referencejen s CliExposure a ručně psaným příkazemanoanoobecná stránkagenerovaná reference, /registry/
deklarativní objektsoubor .ai/**třídy sources.yaml do indexuschopnost zdroje, <kind>.<identity>–/api/v1/objectzdroj/cockpit/objectpodle druhu
pravidlosoubor pravidlaefektivní množina: vendor plus projektrežim vynucování, stav důkazurules …anoanoobecnéDOCTRINE.md, /doctrines/
ADRsoubor ADRindexplatnost odkazů, hrany grafushell adrjako objektzdrojstránka objektuobjektový zdroj; žádná vlastní routa webu
claimdocs/CLAIMS.yaml–stav důkazů vůči knize, graf tvrzeníevidence …anoanoobecnédocs/claims/, /guarantees/
běh důkazů– (zaznamenáno)–stav čerstvostievidence record zapisujereadreadobecné–
úkol a milníkYAML pod .ai/repo/project/indexstav, DAG, vlny, konfliktyshell planplan.*plan.*obecné/plan/, PLAN_STATUS.md
epizoda relacezapisují jej hooky a příkazy shelluindex (uzavřené záznamy)kostra předávky, briefingshellcontinuity.state, session_domain.*ano/cockpit/continuity/sessions/
sestavený kontext–graf a indexvýběr, rozpočetdevcontextanoano––
prostředíadaptér .envrc, soubory toolchainusondy, git, souborysnapshotenvanoanooverviewENVIRONMENT.md
worktree–git worktree listpostavení, očekávaná cestaworktreeanoano/cockpit/worktreesWORKTREES.md
peeroznámenípřipojení MCPpřekryv–anoano––
uzel meshedeklaraceproviderspřítomnost, štítek důvěryčástečněanoano/cockpit/meshMESH.md
dokumentdocs/*.md a jeho řádek indexuindex (druh document)front matter stránky, odkazy–jako objektzdrojstránka objektu/docs/<slug>/
navigacesite/data/nav.toml–navigační lišta a patička–––Katalogy v postranním panelu Cockpitu jsou odvozené; oblasti jsou ručně psanéweb
bootstrap poskytovatelepolicy.yaml, šablony–AGENTS.md, CLAUDE.mdshell update–––docs/generated/providers.md

Příloha D: mapy governance a meshe

flowchart TD
  pol["policy.yaml<br>finish_requires, budgets, hook wiring"]
  vend["vendored rules<br>.ai/repo/rules/vendor/majordomus"]
  proj["project rules<br>.ai/repo/rules/project"]
  eff["effective rule set<br>additive, no override"]
  disp["doctrine dispatcher<br>lib/doctrine.sh, at doctor, check, finish, watch"]
  gy["gates.yaml<br>gates and path classes"]
  ci["validate.yml<br>planner selects gates by changed paths"]
  rpc["rule-proof-check<br>dangling refused, unproven ratcheted"]
  proofG["rule proof graph<br>ten states"]
  adr["ADRs<br>proposed, accepted by a person"]
  vend --> eff
  proj --> eff
  eff --> disp
  pol --> disp
  eff --> rpc
  gy --> ci
  eff --> proofG
  gy --> proofG
  adr -.-> proj
flowchart TD
  decl["mesh declaration<br>.ai/repo/mesh/majordomus.yaml, enabled false"]
  prov["providers<br>multicast, broadcast, rendezvous"]
  mgr["manager<br>one verification path, signatures, skew, trust label"]
  reg["MeshRegistry<br>presence TTL, retention, bound"]
  caps["mesh capabilities<br>status, nodes, identity, doctor, register"]
  board["peer board<br>per shared server, gathered across checkouts"]
  pcap["peers.list, peers.announce"]
  decl --> prov
  prov --> mgr --> reg --> caps
  board --> pcap

Obě mapy jsou záměrně oddělené. Z registru meshe dnes do nástěnky peers nic neproudí.

Příloha E: audit tvrzení

Odkazy míří na strom v commitu, na kterém byl tento dokument napsán. Rozsah jako :439-482 udává řádky. Příkaz v posledním sloupci je ten, který můžete spustit.

#TvrzeníDůkazyVerdikt
C1jedno capability! staví id, schémata, provenienci, klasifikované provedení a případyapps/majordomus-cli/src/capability/handler.rs:439-482ověřeno
C2schémata pocházejí ze schemars přes CanonicalSchema::ofsrc/capability/schema.rs:102-119ověřeno
C3komponenty OpenAPI sdílejí jeden jmenný prostor a kolize se odmításchema.rs:234, :278ověřeno
C4vystavení je explicitní pro každý povrch; registr odmítá duplicity a prochází v pořadísrc/capability/model.rs:706, :755, :799, :807; registry.rs:86-170 (duplicitní id, název MCP, URI MCP, trasa HTTP, cesta CLI)ověřeno
C5nástroje a zdroje MCP se počítají z vystavenísrc/mcp/surface.rs:4, :263, :332ověřeno
C6koordinační nástroje jsou deklarované schopnosti a nějaký kód je zná jménembuiltin/peers.rs (peers.list, peers.announce); src/mcp/protocol.rs:312; src/mcp/bridge.rsověřeno
C7trasy HTTP se překládají přes registr; OpenAPI operationId je idsrc/http/router.rs:774-786; src/http/openapi.rs:81, :110ověřeno
C8tvrzení o CLI se kontroluje proti clap v obou směrechsrc/capability/closure.rs; tests/projections.rs:24; capabilities validateověřeno
C9příkazy jen pro CLI nesou strukturní důvod, kontrolovaný kontrolousrc/cli/local.rs:43-66, :137; scripts/ci/projection-check; capabilities projections ukazuje unclassified prázdnéověřeno
C10Swagger je shell načítající /openapi.json s assety z unpkgsrc/http/swagger.rs:6, :52, :74ověřeno
C11Runnery CLI, renderery a příklady jsou psány ručněsrc/cli.rs:1987 (EXAMPLES); src/commands/rules.rs:369 (by_cli)ověřeno
C12Obecné stránky Cockpitu a katalogy v postranním panelu se odvozujísrc/cockpit/pages.rs:673, :928; src/cockpit/nav.rs:1-5ověřeno
C13Trasy a oblasti Cockpitu se píší ručně; stránky oblastí jmenují id schopnostísrc/cockpit/mod.rs:161-201; nav.rs:93; pages.rs:131, :135, :2580, :2584ověřeno; odporuje CAPABILITIES.md
C14stromy Cockpitu nesmějí odkazovat na vrstvu ani spustitelný souborscripts/development-semantics-check; DEVELOPMENT_RUNTIME.md „Enforcement“ověřeno
C15derive spouští fáze A až D; žádná fáze nečte svůj vlastní výstupscripts/derive:6-21, :72-105ověřeno; komentář v hlavičce vynechává fázi D
C16generátor webu je transakční, hashuje deklarované vstupy a odmítne neindexovaný dokumentscripts/generate-site-data (INPUTS, .mj-stage, „není v žádné tabulce“ u :1279)ověřeno
C17pre-commit spouští doctor, hlídač worktree a pages current.githooks/pre-commit; scripts/pages:76, :106, :515ověřeno
C18generování je pevný bod a bajtově shodné.ai/repo/ci/gates.yaml generation-converges; tests/projections.rs:318, :380ověřeno
C19jedno kanonické pořadí, kontrolovanésrc/order.rs:141; scripts/ci/order-check; .ai/repo/order-baseline.txtověřeno
C20stránky dokumentace se generují z indexu docs/README.mdscripts/generate-site-data (index awk; project_doc)ověřeno
C21pages-live je kontrola při dokončení; pages verify ve workflow je continue-on-error.ai/repo/ci/gates.yaml:381-385; .github/workflows/pages.yml:213-218ověřeno
C22doctor detekuje a neopravujelib/doctor.sh (hlavička jen pro čtení; žádné --fix v bin/majordomus ani lib/)ověřeno
C23deset stavů pravidla, vítězí nejslabší částsrc/rules/mod.rs:466-492, :1160-1182; DOCTRINE.md „Graf důkazů“ověřeno
C24režim určuje tvar bloku; spustitelný důkaz má přednostDOCTRINE.md „Tři režimy vynucování“; src/rules/mod.rs enforcement_ofověřeno; komentář modulu stále říká „dva režimy vynucování“ (rules/mod.rs:28)
C25rule-proof-check zamítá visící cesty a ratchetuje nedoložená pravidlascripts/ci/rule-proof-check:1-45; kontrola rule-proof v gates.yamlověřeno
C26nálezy podle třídy; Failing se řadí před NotRun, takže může být maskovánosrc/rules/mod.rs:1000-1023 s :466-492 a :1169-1176ověřeno čtením; nepozorováno v datech
C27vazba pravidlo-kontrola se odvozuje z runs:src/rules/mod.rs:876-916ověřeno
C28čerstvost se odvozuje z výsledku, git diffu a digestusrc/rules/mod.rs (odvození stavu běhu); EVIDENCE.mdověřeno
C29CI nezaznamenává žádné důkazy; stránka důkazů webu ukazuje autorský graf tvrzenídocs/EVIDENCE.md:296; site/templates/evidence.html:3; .github/workflows/validate.yml nemá krok evidence recordověřeno
C30mutující vývojové příkazy nemají schopnost a ratchet to eviduje.ai/repo/development-semantics-baseline.txt (backing:*)ověřeno
C31plan.transition a recover.orphans zapisují do repozitáře a jsou vystaveny přes HTTP a MCPbuiltin/plan.rs:643-672; builtin/recover.rs:445-465; živé openapi.json má POST /api/v1/plan/transitionověřeno (z deklarací; nebyl vydán žádný zápis)
C34přijetí se odmítá jen u extrahovaných ADRlib/adr.sh:207-213ověřeno
C40nástěnka peerů nevynucuje nicdokumentace modulu src/peers.rsověřeno
C41přítomnost je vázána na relaci; nástěnka se sbírá po checkoutusrc/http/mcp.rs:34, :190; builtin/peers.rs:15, :112ověřeno
C42mesh: jeden registr, poskytovatelé jen předávají bajty výš, vypnuto deklaracísrc/mesh/provider.rs:155; registry.rs:39-45; .ai/repo/mesh/majordomus.yaml:12; živé GET /api/v1/mesh dává active: falseověřeno
C43čítač check --overlap se ztratí v subshellu pipelinelib/start.sh:111-123, lib/check.sh:283-287, lib/common.sh:21; reprodukováno: majordomus check --overlap vypíše překryvy, pak vypíše „no other worktree claims an overlapping path“ověřeno, reprodukováno
C44devcontext je schopnost v CLI, HTTP a MCPbuiltin/devcontext.rs:102; capabilities projectionsověřeno
C45deklarované selektory versus odvození záměru; rozpočet tokenůsrc/devcontext/model.rs:232, :1092, :1100; select.rs:758ověřeno
C46stav plánu odvozen; konflikty rozsahů varovány a serializoványlib/project.awk:294; src/plan.rs:554; PLANNING.mdověřeno
C47sekce předávky vyžadované politikou; odvozená těla z ledgeru a gitu.ai/repo/policy.yaml:34; lib/derive.sh:255ověřeno
C48služba se při TCP spojení tváří jako dostupnásrc/environment/probe.rs:82ověřeno

Zmírněno při psaní. Několik tvrzení bylo po kontrole oslabeno:

  • „Nic v Cockpitu nejmenuje schopnost“: nepravda (C13).
  • „Žádný druh nezapisuje do repozitáře“ (CAPABILITIES.md) a vlastní popis povrchů, že server „nikdy nezapisuje do repozitáře“ (about.rs:40, mcp/protocol.rs:312): vyvráceno plan.transition a recover.orphans (C31).
  • „Přidání schopnosti je jeden blok a nic jiného“: pravda jen bez cesty CLI nebo vyhrazené stránky Cockpitu (§17.5).
  • „Důkaz funkce dosáhne Cockpitu a dokumentace“: dosáhne API, MCP a obecných stránek jako stav, ne jako vyhrazená stránka (§11).
  • „Rovnost napříč povrchy je testována“: vzorkováno, negenerováno (§14).
  • „Kontrola dokazuje pravidlo“: odvozeno z runs: a žádný verdikt kontroly není zaznamenán (§9, §10).

Příloha F: dluh architektury

Každá položka je formulována tak, aby se z ní mohl stát úkol. Kategorie jsou: M registrováno ručně, D duplikováno, N neodvozeno, E nevystaveno na každém relevantním povrchu, T netestováno, V bez důkazů, F nevynuceno úplně, P próza, která se s kódem rozchází.

IdCat.DluhKde
F-1MStrom clap je druhá deklarace CLI; kontroluje se uzavřeností a paritou, neodvozuje seapps/majordomus-cli/src/cli.rs; src/capability/closure.rs; src/quality/parity.rs
F-2MPříklady CLI jsou jedna ručně psaná konstantasrc/cli.rs:1987 (EXAMPLES)
F-3MBěhy CLI mapují příznaky na vstup ručně a některá sémantika exit kódů žije jen v rendererusrc/commands/*.rs, například commands/rules.rs (--check)
F-4EMnoho schopností nemá cestu v CLI (peers.list, plan.*, objects.*, health.report, environment.status); žádná politika neříká, které vynechání jsou záměrnácapabilities projections --format json; DEVELOPMENT_RUNTIME.md mezera 9
F-5EŽádná oblast Cockpitu pro důkaz pravidla, důkazy ani nástěnku peerů; jen obecná stránka schopnostisrc/cockpit/mod.rs:161-201
F-6VCI nezaznamenává žádné důkazy, takže každý stav důkazu spočívá na lokálních během a většina pravidel čte not rundocs/EVIDENCE.md:296; .github/workflows/validate.yml; rules report coverage.recorded
F-7VVerdikty kontrol se nikdy nezaznamenávají; vazba pravidla na kontrolu se odvozuje z runs: řádkovým skenem a u kontroly typu sada se předpokládá, že spouští každý případsrc/rules/mod.rs:876-916; .ai/repo/ci/gates.yaml
F-8FŽádná kontrola nespouští rules report --check, takže zjištění pravidla neshodí CI přes graf důkazůscripts/, .ai/repo/ci/gates.yaml, .github/workflows/
F-9FRuleState řadí Failing před NotRun; blokující pravidlo s jedním selhávajícím a jedním nikdy nespuštěným případem hlásí not run, což není nálezsrc/rules/mod.rs:466-492, :1169-1176, :1000-1023
F-10NStránky /evidence/ a záruk na webu vykreslují autorská tvrzení a stav, ne naměřený důkazsite/templates/evidence.html:3; scripts/generate-site-data (graf tvrzení)
F-11Mnázvy komponent OpenAPI sdílejí jeden jmenný prostor a kolize se řeší přejmenováním; žádná dřívější kontrola ani kontrolní seznamsrc/capability/schema.rs:272-288
F-12TCLI JSON rovné hodnotě HTTP se netestuje na každou schopnost; HTTP rovné MCP se testuje na vzorkutests/http_serve.rs:202, :254
F-13Fcheck --overlap ztrácí počet nálezů v podshellu pipeline a vypíše protichůdný řádek „žádný jiný worktree“; čte jen záznamy úloh, ne nástěnku peerů ani větvelib/start.sh:111-123; lib/check.sh:283-287
F-14DDva zapisovatelé generovaných stromů: src/generate.rs a scripts/generate-site-data (stránky registru a CLI webu zapisuje shell)src/generate.rs; scripts/generate-site-data; DEVELOPMENT_RUNTIME.md mezera 8
F-15DDva enginy kontextu: shellový briefing a devcontextlib/context.sh; src/devcontext/
F-16FKontrola aktuálnosti v pre-commit přeskočí polovinu registru, když není sestaven exekutorscripts/pages:106-118
F-17DDva plánovací enginy držené v rovnosti testem; zápisy plánu vlastní shell s výjimkou plan.transitionlib/project.awk; src/plan.rs; test/cases/99_plan_capabilities.sh; lib/plan.sh
F-18FSlužby prostředí se čtou jako dostupné jen podle TCP spojenísrc/environment/probe.rs:82; src/environment/render.rs
F-19NMěnicí vývojové sémantiky (adr, checkpoint, decision, finish, handover, init, migrate, question, rules, session, start, update, usecase) nemají schopnost, takže nemají cestu přes HTTP, MCP ani Cockpit.ai/repo/development-semantics-baseline.txt
F-20PCAPABILITIES.md říká, že žádná schopnost se v Cockpitu nejmenuje; stránky oblastí anodocs/CAPABILITIES.md (seznam projekcí); src/cockpit/pages.rs
F-21PCAPABILITIES.md říká, že žádný druh nezapisuje do repozitáře, a about.rs i instrukce MCP říkají, že server nikdy nezapisuje; plan.transition a recover.orphans zapisují sledované soubory a jsou poskytoványdocs/CAPABILITIES.md (tabulka modelů); src/about.rs:40; src/mcp/protocol.rs:312; builtin/plan.rs:643-672; builtin/recover.rs:465
F-22PADR 4 a CAPABILITIES.md ukazují starý, krátký seznam compose_modules!.ai/repo/adrs/0004-canonical-architecture-and-performance-truth.md; docs/CAPABILITIES.md („Registr“)
F-23PKomentář modulu rules říká „two enforcement modes“; jsou tři plus deklarativní výchozísrc/rules/mod.rs:28
F-24PDokumenty meshe říkají druh mesh; kód a deklarace používají mesh-declaration. GITHUB_PAGES_ARCHITECTURE.md označuje site/content za gitignorované; je commitnuté. Hlavička scripts/derive vynechává fázi D a docs/PAGES_STATUS.mddocs/MESH.md; src/mesh/config.rs:28; docs/GITHUB_PAGES_ARCHITECTURE.md; .gitignore; scripts/derive:6-21
F-25P„Doktrína“ znamená odesílané pravidlo v DOCTRINE.md a vrstvu principů na stránkách metodydocs/DOCTRINE.md; site/content-src/method/; scripts/lib/method.jq
F-26FPřijetí ADR jako „akt osoby“ je vynucováno jen pro extrahované záznamy; napsaný soubor lze upravit na acceptedlib/adr.sh:207-213
F-27Fproject.no-counts-in-prose nemá mechanickou kontrolu nad docs/*.md; jen posouzení.ai/repo/rules/project/no-counts-in-prose.v1.md
F-28FPokrytí případů užití počítá nástroj MCP jako spustitelný a podložený důkazy, když ho případ užití jen jmenujelib/usecase.sh:805-811
F-29NŽádná kontrola nespojuje každou veřejnou schopnost s behaviorálním testem a zaznamenaným úspěšným během§17.6
F-30EAktiva Swagger UI pocházejí z CDN; jediný povrch, který nefunguje offlinesrc/http/swagger.rs:52, :74
F-31MOblasti a trasy Cockpitu se píší ručně a nové stránky oblastí pojmenovávají id schopnostísrc/cockpit/nav.rs:93; src/cockpit/mod.rs:161-201
F-32Mgates.yaml třídy cest, které jmenují konkrétní soubory, se musí při růstu subsystému upravovat ručně; nic to nedokumentuje jako krok.ai/repo/ci/gates.yaml (třídy)
F-33VProvedení nejsou trvalá a živý proud provedení a slovník trvalé knihy jsou disjunktníDEVELOPMENT_RUNTIME.md mezery 4 a 7

Prohledává názvy a popisy všech stránek, které tento web publikuje.