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
- Invariant
- Dva programy sdílejí jedno jméno
- Kde je pravda: pět druhů faktů
- Objevování a čím se liší od odvozování
- Typované registry, kanonická id a zobrazovaná jména
- Schémata: od typu v Rustu k OpenAPI a MCP
- Povrchy jsou projekce
- Generační pipeline
- Správa: doktrína, pravidlo, politika, ADR
- Existence pravidla není totéž co vynucování pravidla
- Důkazy, čerstvost a drift tvrzení
- Publikace: sestaveno, nasazeno, ověřeno
- Doctor a drift: detekovat, opravit, regenerovat
- Testy, které drží povrchy pohromadě
- Relace, kontext, předávka, plánování, prostředí
- Mesh a nástěnka peerů
- Návody
- Co se negeneruje
- Nulová registrace: ideál a jeho výjimky
- 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.
| Program | Vstup | Implementace | Vlastní |
|---|---|---|---|
| nástroj shell | bin/majordomus | lib/*.sh, odesílané podle příkazu | start, check, finish, context, handover, session, doctor, update, adr, zápisy plánu, dispečer doktrín |
| spustitelný soubor v Rustu | bin/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 faktu | Příklady | Kdo to vytváří nebo mění | Autorita | Můž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 commitu | kanonické | je kanonický stav | dalším commitem, který ho upraví |
| objeveno | index 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 git | tak autoritativní jako jeho vstupy; nikdy se neukládá jako samostatná pravda | ne | přepočítáno při každém čtení; index nese otisk a sdílený server jej přestaví, když se strom pohne |
| odvozeno | docs/generated/**, site/data/**, site/content/**, spravovaný blok .gitattributes, AGENTS.md/CLAUDE.md, stav úkolu, vlny, stavy důkazů pravidel | generátory (majordomus generate, scripts/generate-site-data, scripts/gitattributes, majordomus update), nebo čistá funkce při čtení | žádné vlastní: je to projekce | ne; 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áno | ná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 record | jen pro povědomí; ledger je výjimka, protože je commitnut | ne; 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 |
| odhadnuto | shoda záměru v devcontext, odvozené tělo předávky, implikované zvýšení releasu, navržené ADR z adr propose | deterministická heuristika, nikdy volání modelu | nejnižší; vždy označeno | ne; 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/deriveuvá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ěIntentMatchjedeclared()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. Zapisujeproposeda 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 vBTreeMapa iteruje podle id [C4]. - Deklarativní objekty. Id je
<kind>.<identity>a identita pochází z pravidla identity daného druhu:id@versionpro pravidlo (project.english-only@1), číslo pro ADR (adr-0044). Zdroj MCP jemajordomus://<kind>/<identity>. - Pravidla se uvádějí jako
id@versionvdepends_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.rsselže, když tvrzení jmenuje příkaz, který clap nemá, nebo takový, který jen seskupuje jiné příkazy. Běží vtests/projections.rsi vcapabilities 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::parityji kontroluje a kontrolaprojection-closure(scripts/ci/projection-check) selže na příkazu, který žádný důvod neuvádí [C9].capabilities projectionsuvádí obě množiny živě: příkazy jen pro CLI jakounbackeda příkazy bez důvodu jakounclassified.
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 (--findingsse stanefindings_only) a voláctx.execute(id, input)poregistry.by_cli; - textový renderer.
--format jsonvypíše výstup schopnosti beze změny;--format textje vlastní příkazu. Některá sémantika ukončení žije jen v rendereru:rules report --checktam končí kódem 10, ne v handleru; - položka v
cli::EXAMPLES, jediné ručně psané konstantěCommandExamples.cli::validateodmítne spustitelný příkaz bez příkladu atests/cli_examples.rsspouš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í zregistry.modules(), seskupené podlemodule_areaproduktového modelu, plusindex.kinds()agraph::ids(), vše v kanonickém pořadí [C12]. - Psáno ručně. Tabulka tras je
matchvcockpit/mod.rs. Seznam oblastí (Přehled, Schopnosti, Mesh, …) jenav::areas()a komentář modulu uvádí důvod. Stránky oblastí žádají o schopnost jejím doslovným id, napříkladask(ctx, "health.report", …)neboask(ctx, "mesh.status", …)[C13]. Věta vCAPABILITIES.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.jsvolá skutečnou routu schopnosti zdata-mj-method/data-mj-path;palette.jsa pohledy grafů čtou/api/v1/*. Nic v prohlížeči nepočítá připravenost, stav ani důkaz. Kontroladevelopment-semanticsodmítne jakýkoli odkaz na.ai/repo,.ai/localnebo spustitelný soubormajordomusuvnitř stromů Cockpitu [C14].
7.8 Srovnání povrchů
CLI (majordomus-cli) | HTTP API | MCP | Cockpit | |
|---|---|---|---|---|
| Deklarováno v | clap, ručně, kontrolováno proti CliExposure | odvozeno z HttpExposure | odvozeno z McpExposure | směrovací tabulka a oblasti ručně; obecné stránky odvozeny |
| Dosahuje | schopnosti, které si nárokují cestu v CLI, plus lokální příkazy | každá schopnost s expozicí HTTP | každá schopnost s vystavením jako nástroj nebo zdroj; každý deklarativní objekt jako zdroj | každá schopnost (obecná stránka); vybrané oblasti |
| Vstup | příznaky mapované ručně v runneru | parametry dotazu převedené podle schématu, nebo tělo JSON | arguments validováno proti inputSchema | formulář pro spouštění generovaný ze vstupního schématu |
| Výstup | --format json (hodnota schopnosti) nebo text (renderer) | hodnota JSON, typované chyby | structuredContent plus text | HTML nad toutéž hodnotou |
| Vlastní logika | renderery, některé exit kódy, lokální příkazy (serve, generate, worktree create) | jen transport | pouze transport; přehrání oznámení v mostu | pouze prezentace |
| Změřit | capabilities projections (unbacked) | GET /api/v1 | tools/list, resources/list | GET /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 dodocs/generated/asite/data/registry/z jednohoplan(). Stejný plán běží pro zápis i pro--check. Jeho cíle jsou enumGenerateTargetvcli.rsa výstupní manifest (docs/generated/artifacts.json) vypisuje každý artefakt s jeho zdrojem, schématem a hashem.scripts/generate-site-dataje shellová polovina. Hashuje deklarovaný seznam vstupů (INPUTS) podLC_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/*.mddosite/content/docs/[C16].- Existují dva zapisovatelé generovaných stromů,
src/generate.rsa shellový generátor, a oba zapisují obsah webu (dluh F-14).
8.2 Čerstvost se vynucuje při commitu a v CI
.githooks/pre-commitspouštíbin/majordomus doctor, ochranu worktree ascripts/pages current. Ten poslední příkaz porovnágenerate-site-data --fingerprintssource_hashvsite/data/generated/source.jsona 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-checkspouštígenerate-site-data --checka kontrolageneration-convergesspouští generate a potégenerate --check: generátor musí být pevný bod [C18]. .gitattributesoznačí každou odvozenou cestumerge=derived.scripts/merge-derivedponechá „naši“ verzi a vypíše, že soubor je nyní zastaralý, takže merge nikdy neslučuje projekci ručně; derive ji poté regeneruje.doctorshodí 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:--checksouhlasí s tím, co by zápis vyprodukoval, odhalí manipulaci a nikdy nezapisuje.test/cases/98_cli_reference.shporovnává dvě generace pomocícmp.test/cases/28_no_hardcoded_values.shtvrdí, že pořadí vstupu nezávisí na locale.test/cases/12b_site_data_transactional.shtvrdí, že neúspěšný běh zanechá artefakty bajtově shodné.test/cases/51_derived_artifacts_committed.shtvrdí, žederive-checkprojde 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.
| Pojem | Co to je zde | Kde | Životní cyklus |
|---|---|---|---|
| pravidlo | soubor 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ína | dva 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 politikou | DOCTRINE.md; site/content-src/method/ | odvozeno z pravidel |
| policy | konfigurace nástroje jednoho repozitáře: rozpočty kontextu, verification.finish_requires, sekce předávek, zapojení vynucování pro hooky | .ai/repo/policy.yaml | upravuje se ručně; projekce poskytovatelů se generují příkazem majordomus update |
| ADR | záznam rozhodnutí: schema: adr/v1, status (proposed, accepted, superseded nebo rejected), vzájemné supersedes/superseded_by, typované odkazy related, provenance.origin | jeden soubor na rozhodnutí pod .ai/repo/adrs/, pojmenovaný číslem a slugem | adr 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ínka | Co to zde dokazuje | Implementováno? |
|---|---|---|
| deklarováno | soubor pod .ai/repo/rules/ | ano |
| naparsováno | lib/rules.sh a src/rules/mod.rs to čtou; neznámé klíče jsou chyby | ano (dva čtenáři) |
| platné | vyřešení odmítne chybějící závislosti, cykly a duplicitní identity; loader odmítne napůl deklarovaný blok | ano |
| validátor existuje | rules report označí pojmenovaný validátor present; chybějící činí pravidlo dangling | ano, pro odeslaná pravidla |
| zapojeno | doctor prochází řetěz dispatcheru kvůli doktrínám; rule-proof-check odmítne pojmenovanou cestu, která není ve stromu | ano |
| kontrola se provádí | kontrola v gates.yaml, jejíž runs: pokrývá jmenovanou cestu | odvozeno z runs: (§9) |
| prošlo | zaznamenané ú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 jmenujetestsa žádný validátor. Revidované pravidlo jmenuje větureviewed_becausea nic z toho. Spustitelný důkaz vždy vyhrává.scripts/ci/rule-proof-check, kontrolarule-proof, odmítne nefunkční cestu rovnou a ratchetuje blokující pravidla, která v.ai/repo/rule-proof-baseline.txtnejmenují nic [C25]. - Nález je třída, kterou stav nepodporuje.
danglingje nález pro jakoukoli třídu. U blokujícího pravidla jsou nálezyunproven,failingaunrunnable.gated,reviewedanot runjsou 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íFailingpředNotRun. 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-green11. 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:
| Kontrola | Otázka | Kontrola |
|---|---|---|
scripts/generate-site-data --check | existují jmenované cesty? má každé tvrzení stránku? | core-check |
scripts/ci/claim-proof-check | pojmenovává pojmenovaný test tvrzení zpět? (ratchet) | claim-proof |
scripts/evidence-check | jaký 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:
| Stav | Co to zakládá | Kde |
|---|---|---|
| sestaveno | scripts/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án | krok .github/workflows/pages.yml, build |
| nasazeno | scripts/site-deploy --skip-build pushne gh-pages; GitHub pak spustí vlastní build Pages, který čte scripts/pages built | krok 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 kontrola | krok public |
| ověřeno, jako kontrola | scripts/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
| Sloveso | Nástroj | Zapisuje? |
|---|---|---|
| detekce | majordomus 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-check | ne |
| znovu vygenerovat | majordomus 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 |
| repair | majordomus-cli worktree repair a worktree migrate (ověřeno otiskem), just derive-merge-driver | ano, 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ě
| Test | Co porovnává |
|---|---|
test/cases/76_capabilities_projections.sh | capabilities 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.rs | skuteč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.rs | projekce 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.sh | ID 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.sh | tagy 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.sh | shellový 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 podEXCLUDED. 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í aover_budgetse 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.
- 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
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 | Čte | Výsledek |
|---|---|---|
majordomus start / check --overlap (lib/start.sh mj_report_overlap) | rozsahy úloh .ai/local/state/current.yaml ostatních worktree, podle obsažení cest | INFO overlap řádků; exit 0 |
peers::claims_meet | claimy oznámené na nástěnce | překryv ohlášený vedle peera |
scope_conflict plánu | deklarované rozsahy úkolů v rámci vlny | WARN; ú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.
| Povrch | Nástěnka peerů | Mesh |
|---|---|---|
| CLI | žádné pro peers.list | mesh identity, mesh doctor (schopnosti); mesh status, mesh nodes (lokální vykreslení) |
| HTTP | GET /api/v1/peers, POST /api/v1/peers/announce | GET /api/v1/mesh, /mesh/nodes, /mesh/identity, /mesh/doctor; POST /api/v1/mesh/register |
| MCP | majordomus_peers, majordomus_announce | majordomus_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
| Krok | Kde | Automaticky nebo ručně |
|---|---|---|
vstupní typ RulesReportInput, výstupní typ, BenchmarkCases | src/capability/builtin/rules.rs | ručně (typy) |
capability! s id: "rules.report", mcp("majordomus_rules") plus zdroj majordomus://rules, get("/api/v1/rules"), cli: ["rules", "report"] | builtin/rules.rs | ručně, jednou |
| Schémata JSON | CanonicalSchema::of | automaticky |
Nástroj MCP majordomus_rules s readOnlyHint | mcp/surface.rs | automaticky |
GET /api/v1/rules?class=&state=&namespace=&findings_only= | http/router.rs | automaticky |
OpenAPI operationId: rules.report, tag rules, x-majordomus-cli: rules report, příklady z případů | http/openapi.rs | automaticky |
| Vstup do Swagger UI | /swagger | automaticky |
clap RulesCommand::Report, přepínače --state --class --namespace --findings --check | cli.rs | ručně |
runner: příznaky na vstup, by_cli, execute; textový renderer; --check skončí s 10 | commands/rules.rs | ručně |
příklad rules-report-json | cli::EXAMPLES v cli.rs | ručně |
uzavření: tvrzení rules report se rozliší na spustitelný příkaz clap | capability/closure.rs | automatická kontrola |
/cockpit/capabilities/rules.report s formou runneru | cockpit/pages.rs capability | automaticky |
docs/generated/capabilities.md, docs/generated/modules/rules.md, registry.json | fáze A | automaticky |
/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
- Zdroj.
.ai/repo/rules/project/conventional-commits.v2.md,class: blocking, sx-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ý. - Kontrola.
commit-policyv.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. - Důkaz mutací.
test/cases/274_commit_policy.shpř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-baselinea že selže--strict. - Důkazy. Kniha drží lokální úspěšný běh
suite:274_commit_policy. Cesta kontroly pravidla je jako důkazunrunnable, protože žádný runner nezaznamenává verdikt kontroly, takže stav pravidla jegated: mechanismus je ukázán, ne výsledek. - Povrchy.
bin/majordomus-cli rules show project.conventional-commits,GET /api/v1/rules/rule?rule=project.conventional-commits, MCPmajordomus_rulea generická stránka Cockpitu prorules.show. Stránky/doctrines/webu se generují z registru doktrín (doctrines.jsonve 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í:
- Napište vstupní a výstupní typy pomocí
serdeaJsonSchema, plusBenchmarkCasespro vstup (nebo deklarujte výjimku z měření výkonu). Ručně. - Napište jeden blok
capability!s jeho vystavením. Nový modul potřebuje takémodule!a řádek vcompose_modules!. Ručně. - 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í.
- 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žkucli::LOCAL. Ručně, a kontrolujecli::validate,tests/cli_examples.rs, uzavřenost a parita. - Vyhrazená oblast Cockpitu potřebuje větev routy, funkci stránky a položku
areas(). Ručně. Generická stránka nepotřebuje nic. - Zvláštní třídy cest v
.ai/repo/ci/gates.yamljmenují konkrétní soubory (commit, design, pravidla). Nový builtin soubor už pokrývá třídarust; nový adresář subsystému může potřebovat třídu. Ručně a ne zdokumentováno jako krok. - Spusťte
scripts/derivea projekce commitněte. Generování je automatické; jejich staging je ruční. - 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í“
| Krok | Existuje dnes? |
|---|---|
zapsat .ai/repo/rules/project/<name>.v1.md s class: blocking a x-majordomus.tests | ano: formát, loader a validace existují |
nechat rule-proof-check jej odmítnout, pokud nejmenuje žádný důkaz | ano |
| kontrola, která spojuje každou schopnost s behaviorálním testem | ne. 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že | bylo by nové |
| graf důkazů, vazba pravidla na kontrolu | automaticky, 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ýsledek | neimplementová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:
- 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/. - 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.
- 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.yamla 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. - 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ý.
- Generování brání jednomu repozitáři hromadit nekompatibilní popisy sebe sama. Platí to všude, kde existuje
--checknebo 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ů
| Koncept | CLI | MCP | API | Cockpit | Dokumenty |
|---|---|---|---|---|---|
| capabilities | majordomus-cli capabilities list / describe / projections / validate | majordomus_capabilities, majordomus_capability, majordomus_projections | /api/v1/capabilities, /capability, /capabilities/projections | /cockpit/capabilities | docs/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/object | sekce webu specifické pro druh |
| pravidla a důkaz | rules report / show / proves | majordomus_rules, majordomus_rule, majordomus_rule_proves | /api/v1/rules, /rules/rule, /rules/proves | pouze obecná stránka | DOCTRINE.md, /doctrines/ (bez stavu důkazu) |
| evidence | evidence show / claim / proves / record | majordomus_evidence, majordomus_evidence_claim, majordomus_evidence_test | /api/v1/evidence, /evidence/claim, /evidence/test (record je jen CLI: zapisuje) | pouze obecná stránka | EVIDENCE.md, /evidence/ (napsaný graf tvrzení) |
| plan | shell majordomus plan … | majordomus_plan*, majordomus_plan_transition | /api/v1/plan*, POST /plan/transition | obecné stránky | PLANNING.md, /plan/, docs/PLAN_STATUS.md |
| kontext | shell context; devcontext compile / explain / policy | majordomus_devcontext*, majordomus_continuity | /api/v1/devcontext*, /continuity | /cockpit/continuity | CONTEXT.md, CONTINUITY.md |
| prostředí | env status / explain / banner / export (vykreslení) | majordomus_environment, majordomus_environment_explain | /api/v1/environment, /environment/explain | overview | ENVIRONMENT.md |
| worktrees | worktree topology / status / inspect / migrate … | majordomus_worktrees, … | /api/v1/worktrees* | /cockpit/worktrees | WORKTREES.md |
| peers | žádné | majordomus_peers, majordomus_announce | /api/v1/peers, /peers/announce | žádné | MCP.md |
| mesh | mesh identity / doctor / status / nodes | majordomus_mesh* | /api/v1/mesh* | /cockpit/mesh | MESH.md |
| kontroly a dokončení | shell check, finish | majordomus_gates, majordomus_completion | /api/v1/gates, /gates/completion | obecné stránky | CI.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í.
| Entita | Napsáno | Objeveno | Odvozeno | CLI | API | MCP | Cockpit | Dokumenty |
|---|---|---|---|---|---|---|---|---|
| vestavěná schopnost | blok capability!, typy | složeno, nikoli objeveno | schémata, trasa, nástroj, operace, cíle měření, reference | jen s CliExposure a ručně psaným příkazem | ano | ano | obecná stránka | generovaná reference, /registry/ |
| deklarativní objekt | soubor .ai/** | třídy sources.yaml do indexu | schopnost zdroje, <kind>.<identity> | – | /api/v1/object | zdroj | /cockpit/object | podle druhu |
| pravidlo | soubor pravidla | efektivní množina: vendor plus projekt | režim vynucování, stav důkazu | rules … | ano | ano | obecné | DOCTRINE.md, /doctrines/ |
| ADR | soubor ADR | index | platnost odkazů, hrany grafu | shell adr | jako objekt | zdroj | stránka objektu | objektový zdroj; žádná vlastní routa webu |
| claim | docs/CLAIMS.yaml | – | stav důkazů vůči knize, graf tvrzení | evidence … | ano | ano | obecné | docs/claims/, /guarantees/ |
| běh důkazů | – (zaznamenáno) | – | stav čerstvosti | evidence record zapisuje | read | read | obecné | – |
| úkol a milník | YAML pod .ai/repo/project/ | index | stav, DAG, vlny, konflikty | shell plan | plan.* | plan.* | obecné | /plan/, PLAN_STATUS.md |
| epizoda relace | zapisují jej hooky a příkazy shellu | index (uzavřené záznamy) | kostra předávky, briefing | shell | continuity.state, session_domain.* | ano | /cockpit/continuity | /sessions/ |
| sestavený kontext | – | graf a index | výběr, rozpočet | devcontext | ano | ano | – | – |
| prostředí | adaptér .envrc, soubory toolchainu | sondy, git, soubory | snapshot | env | ano | ano | overview | ENVIRONMENT.md |
| worktree | – | git worktree list | postavení, očekávaná cesta | worktree | ano | ano | /cockpit/worktrees | WORKTREES.md |
| peer | oznámení | připojení MCP | překryv | – | ano | ano | – | – |
| uzel meshe | deklarace | providers | přítomnost, štítek důvěry | částečně | ano | ano | /cockpit/mesh | MESH.md |
| dokument | docs/*.md a jeho řádek indexu | index (druh document) | front matter stránky, odkazy | – | jako objekt | zdroj | stránka objektu | /docs/<slug>/ |
| navigace | site/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 poskytovatele | policy.yaml, šablony | – | AGENTS.md, CLAUDE.md | shell 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ůkazy | Verdikt |
|---|---|---|---|
| C1 | jedno capability! staví id, schémata, provenienci, klasifikované provedení a případy | apps/majordomus-cli/src/capability/handler.rs:439-482 | ověřeno |
| C2 | schémata pocházejí ze schemars přes CanonicalSchema::of | src/capability/schema.rs:102-119 | ověřeno |
| C3 | komponenty OpenAPI sdílejí jeden jmenný prostor a kolize se odmítá | schema.rs:234, :278 | ověřeno |
| C4 | vystavení 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 |
| C5 | nástroje a zdroje MCP se počítají z vystavení | src/mcp/surface.rs:4, :263, :332 | ověřeno |
| C6 | koordinační nástroje jsou deklarované schopnosti a nějaký kód je zná jménem | builtin/peers.rs (peers.list, peers.announce); src/mcp/protocol.rs:312; src/mcp/bridge.rs | ověřeno |
| C7 | trasy HTTP se překládají přes registr; OpenAPI operationId je id | src/http/router.rs:774-786; src/http/openapi.rs:81, :110 | ověřeno |
| C8 | tvrzení o CLI se kontroluje proti clap v obou směrech | src/capability/closure.rs; tests/projections.rs:24; capabilities validate | ověřeno |
| C9 | příkazy jen pro CLI nesou strukturní důvod, kontrolovaný kontrolou | src/cli/local.rs:43-66, :137; scripts/ci/projection-check; capabilities projections ukazuje unclassified prázdné | ověřeno |
| C10 | Swagger je shell načítající /openapi.json s assety z unpkg | src/http/swagger.rs:6, :52, :74 | ověřeno |
| C11 | Runnery CLI, renderery a příklady jsou psány ručně | src/cli.rs:1987 (EXAMPLES); src/commands/rules.rs:369 (by_cli) | ověřeno |
| C12 | Obecné stránky Cockpitu a katalogy v postranním panelu se odvozují | src/cockpit/pages.rs:673, :928; src/cockpit/nav.rs:1-5 | ověřeno |
| C13 | Trasy 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, :2584 | ověřeno; odporuje CAPABILITIES.md |
| C14 | stromy Cockpitu nesmějí odkazovat na vrstvu ani spustitelný soubor | scripts/development-semantics-check; DEVELOPMENT_RUNTIME.md „Enforcement“ | ověřeno |
| C15 | derive spouští fáze A až D; žádná fáze nečte svůj vlastní výstup | scripts/derive:6-21, :72-105 | ověřeno; komentář v hlavičce vynechává fázi D |
| C16 | generátor webu je transakční, hashuje deklarované vstupy a odmítne neindexovaný dokument | scripts/generate-site-data (INPUTS, .mj-stage, „není v žádné tabulce“ u :1279) | ověřeno |
| C17 | pre-commit spouští doctor, hlídač worktree a pages current | .githooks/pre-commit; scripts/pages:76, :106, :515 | ověřeno |
| C18 | generování je pevný bod a bajtově shodné | .ai/repo/ci/gates.yaml generation-converges; tests/projections.rs:318, :380 | ověřeno |
| C19 | jedno kanonické pořadí, kontrolované | src/order.rs:141; scripts/ci/order-check; .ai/repo/order-baseline.txt | ověřeno |
| C20 | stránky dokumentace se generují z indexu docs/README.md | scripts/generate-site-data (index awk; project_doc) | ověřeno |
| C21 | pages-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-218 | ověřeno |
| C22 | doctor detekuje a neopravuje | lib/doctor.sh (hlavička jen pro čtení; žádné --fix v bin/majordomus ani lib/) | ověřeno |
| C23 | deset stavů pravidla, vítězí nejslabší část | src/rules/mod.rs:466-492, :1160-1182; DOCTRINE.md „Graf důkazů“ | ověřeno |
| C24 | režim určuje tvar bloku; spustitelný důkaz má přednost | DOCTRINE.md „Tři režimy vynucování“; src/rules/mod.rs enforcement_of | ověřeno; komentář modulu stále říká „dva režimy vynucování“ (rules/mod.rs:28) |
| C25 | rule-proof-check zamítá visící cesty a ratchetuje nedoložená pravidla | scripts/ci/rule-proof-check:1-45; kontrola rule-proof v gates.yaml | ověřeno |
| C26 | nálezy podle třídy; Failing se řadí před NotRun, takže může být maskováno | src/rules/mod.rs:1000-1023 s :466-492 a :1169-1176 | ověřeno čtením; nepozorováno v datech |
| C27 | vazba pravidlo-kontrola se odvozuje z runs: | src/rules/mod.rs:876-916 | ověřeno |
| C28 | čerstvost se odvozuje z výsledku, git diffu a digestu | src/rules/mod.rs (odvození stavu běhu); EVIDENCE.md | ověřeno |
| C29 | CI 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 record | ověřeno |
| C30 | mutující vývojové příkazy nemají schopnost a ratchet to eviduje | .ai/repo/development-semantics-baseline.txt (backing:*) | ověřeno |
| C31 | plan.transition a recover.orphans zapisují do repozitáře a jsou vystaveny přes HTTP a MCP | builtin/plan.rs:643-672; builtin/recover.rs:445-465; živé openapi.json má POST /api/v1/plan/transition | ověřeno (z deklarací; nebyl vydán žádný zápis) |
| C34 | přijetí se odmítá jen u extrahovaných ADR | lib/adr.sh:207-213 | ověřeno |
| C40 | nástěnka peerů nevynucuje nic | dokumentace modulu src/peers.rs | ověřeno |
| C41 | přítomnost je vázána na relaci; nástěnka se sbírá po checkoutu | src/http/mcp.rs:34, :190; builtin/peers.rs:15, :112 | ověřeno |
| C42 | mesh: 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: false | ověřeno |
| C43 | čítač check --overlap se ztratí v subshellu pipeline | lib/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 |
| C44 | devcontext je schopnost v CLI, HTTP a MCP | builtin/devcontext.rs:102; capabilities projections | ověřeno |
| C45 | deklarované selektory versus odvození záměru; rozpočet tokenů | src/devcontext/model.rs:232, :1092, :1100; select.rs:758 | ověřeno |
| C46 | stav plánu odvozen; konflikty rozsahů varovány a serializovány | lib/project.awk:294; src/plan.rs:554; PLANNING.md | ověřeno |
| C47 | sekce předávky vyžadované politikou; odvozená těla z ledgeru a gitu | .ai/repo/policy.yaml:34; lib/derive.sh:255 | ověřeno |
| C48 | služba se při TCP spojení tváří jako dostupná | src/environment/probe.rs:82 | ověř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ácenoplan.transitionarecover.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í.
| Id | Cat. | Dluh | Kde |
|---|---|---|---|
| F-1 | M | Strom clap je druhá deklarace CLI; kontroluje se uzavřeností a paritou, neodvozuje se | apps/majordomus-cli/src/cli.rs; src/capability/closure.rs; src/quality/parity.rs |
| F-2 | M | Příklady CLI jsou jedna ručně psaná konstanta | src/cli.rs:1987 (EXAMPLES) |
| F-3 | M | Běhy CLI mapují příznaky na vstup ručně a některá sémantika exit kódů žije jen v rendereru | src/commands/*.rs, například commands/rules.rs (--check) |
| F-4 | E | Mnoho 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-5 | E | Žádná oblast Cockpitu pro důkaz pravidla, důkazy ani nástěnku peerů; jen obecná stránka schopnosti | src/cockpit/mod.rs:161-201 |
| F-6 | V | CI 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 run | docs/EVIDENCE.md:296; .github/workflows/validate.yml; rules report coverage.recorded |
| F-7 | V | Verdikty 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řípad | src/rules/mod.rs:876-916; .ai/repo/ci/gates.yaml |
| F-8 | F | Žá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-9 | F | RuleState ř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ález | src/rules/mod.rs:466-492, :1169-1176, :1000-1023 |
| F-10 | N | Stránky /evidence/ a záruk na webu vykreslují autorská tvrzení a stav, ne naměřený důkaz | site/templates/evidence.html:3; scripts/generate-site-data (graf tvrzení) |
| F-11 | M | názvy komponent OpenAPI sdílejí jeden jmenný prostor a kolize se řeší přejmenováním; žádná dřívější kontrola ani kontrolní seznam | src/capability/schema.rs:272-288 |
| F-12 | T | CLI JSON rovné hodnotě HTTP se netestuje na každou schopnost; HTTP rovné MCP se testuje na vzorku | tests/http_serve.rs:202, :254 |
| F-13 | F | check --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ětve | lib/start.sh:111-123; lib/check.sh:283-287 |
| F-14 | D | Dva 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-15 | D | Dva enginy kontextu: shellový briefing a devcontext | lib/context.sh; src/devcontext/ |
| F-16 | F | Kontrola aktuálnosti v pre-commit přeskočí polovinu registru, když není sestaven exekutor | scripts/pages:106-118 |
| F-17 | D | Dva plánovací enginy držené v rovnosti testem; zápisy plánu vlastní shell s výjimkou plan.transition | lib/project.awk; src/plan.rs; test/cases/99_plan_capabilities.sh; lib/plan.sh |
| F-18 | F | Služby prostředí se čtou jako dostupné jen podle TCP spojení | src/environment/probe.rs:82; src/environment/render.rs |
| F-19 | N | Mě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-20 | P | CAPABILITIES.md říká, že žádná schopnost se v Cockpitu nejmenuje; stránky oblastí ano | docs/CAPABILITIES.md (seznam projekcí); src/cockpit/pages.rs |
| F-21 | P | CAPABILITIES.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ány | docs/CAPABILITIES.md (tabulka modelů); src/about.rs:40; src/mcp/protocol.rs:312; builtin/plan.rs:643-672; builtin/recover.rs:465 |
| F-22 | P | ADR 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-23 | P | Komentář modulu rules říká „two enforcement modes“; jsou tři plus deklarativní výchozí | src/rules/mod.rs:28 |
| F-24 | P | Dokumenty 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.md | docs/MESH.md; src/mesh/config.rs:28; docs/GITHUB_PAGES_ARCHITECTURE.md; .gitignore; scripts/derive:6-21 |
| F-25 | P | „Doktrína“ znamená odesílané pravidlo v DOCTRINE.md a vrstvu principů na stránkách metody | docs/DOCTRINE.md; site/content-src/method/; scripts/lib/method.jq |
| F-26 | F | Přijetí ADR jako „akt osoby“ je vynucováno jen pro extrahované záznamy; napsaný soubor lze upravit na accepted | lib/adr.sh:207-213 |
| F-27 | F | project.no-counts-in-prose nemá mechanickou kontrolu nad docs/*.md; jen posouzení | .ai/repo/rules/project/no-counts-in-prose.v1.md |
| F-28 | F | Pokrytí případů užití počítá nástroj MCP jako spustitelný a podložený důkazy, když ho případ užití jen jmenuje | lib/usecase.sh:805-811 |
| F-29 | N | Žádná kontrola nespojuje každou veřejnou schopnost s behaviorálním testem a zaznamenaným úspěšným během | §17.6 |
| F-30 | E | Aktiva Swagger UI pocházejí z CDN; jediný povrch, který nefunguje offline | src/http/swagger.rs:52, :74 |
| F-31 | M | Oblasti 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-32 | M | gates.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-33 | V | Provedení nejsou trvalá a živý proud provedení a slovník trvalé knihy jsou disjunktní | DEVELOPMENT_RUNTIME.md mezery 4 a 7 |