Forenzní zjištění, změřené 2026-09-10 v linked worktree v feature/development-runtime-model, odvětveném z origin/master v 08e4bb252, proti serveru, který si tento worktree sám sestavil a spustil. Je to fáze 01 balíku Cockpit IDE / control-plane a nic neimplementuje: zjišťuje, co existuje, dokazuje to spuštěním a říká, jaká je nejmenší bezpečná další fáze.
Architektura, proti které se měří, je ADR 0040 a DEVELOPMENT_RUNTIME.md: jeden kanonický runtime — registr schopností spustitelného souboru v Rustu — a každý povrch jeho konzumentem. Tento dokument je důkazem za tímto rozhodnutím a plánem, který z něj plyne.
Každé tvrzení zde vzniklo příkazem a příkaz je ukázán. Kde se číslo objeví bez příkazu, je to vada tohoto dokumentu.
Zjištění v jednom odstavci
Cockpit je věrná projekce registru, v němž je téměř nic vývojového. Jediné schopnosti, které cokoli mohou měnit, jsou executions.start, executions.cancel a peers.announce, a dokument OpenAPI, který server poskytuje, má přesně tyto tři operace jiné než GET. Každý příkaz vývojového životního cyklu žije ve druhém programu, bin/majordomus, a každý jeho uzel v grafu příkazů je odepřen každému strojovému povrchu. Cockpit proto nelze udělat IDE přidáním stránek: za stránkami není co volat. První fáze práce není UI, ale vybavit runtime měnícím vývojovým povrchem, který bude Cockpit spotřebovávat.
Tři další vady jsou nosné a byly nalezeny spuštěním systému, ne čtením: majordomus run se provádí ve vlastním procesu a běžící server ho nevidí, takže rovina provádění, kterou ukazuje Cockpit, a rovina provádění, kterou používá člověk, jsou disjunktní; server, který servíruje kód, jenž už na disku neexistuje, o sobě hlásí ready; a /cockpit/worktrees trvá 18,3 s, zatímco každá jiná stránka 1–4 ms.
1. Předběžná kontrola správy
Balík vyžaduje, aby se procvičily vlastní mechanismy repozitáře a aby se ty rozbité zaznamenaly, ne obešly.
| Krok | Příkaz | Výsledek |
|---|---|---|
| kontrakt | číst README.md, AGENTS.md, CLAUDE.md, .ai/README.md | ok — AGENTS.md nese své generované razítko z .ai/repo/policy.yaml |
| efektivní pravidla | majordomus rules list --json | ok — vendorovaná základna plus vlastní pravidla tohoto repozitáře se vyřeší v jednom pořadí; tato větev přidává jedno |
| kontext | majordomus context | ok — hluboko v rozpočtu řádků, working_tree clean, v tu chvíli žádná aktivní úloha |
| kontext s rozsahem | majordomus context resolve docs/DEVELOPMENT_RUNTIME.md | ok — rozlišuje se samotné na ai.layer; docs/ je mimo .ai/ a dostane jen kořenový řetěz |
| topologie worktree | majordomus-cli worktree | ok — canonical, kontejner …-wt, trunk master |
| kontrola kolizí | scripts/collision-check --new <paths> | ok — nic jiného si nenárokuje docs/DEVELOPMENT_RUNTIME.md, docs/COCKPIT_IDE_AUDIT.md, ADR ani pravidlo |
| životní cyklus úlohy | majordomus start "…" --scope … | ok — t-20260910222833-6506, profil implementation |
| překryv | hlásí start, majordomus check --overlap | čtyři další větve nárokují cesty, které nárokuje tato úloha: readme-integrated-surfaces (docs, site), canonical-order (docs, site, scripts, .ai/repo/rules/project, .ai/repo/ci), doctor-passes-from-a-release (docs, site), the-subset-is-a-subset (docs) |
| check | majordomus check | ok — nálezy hlášeny, žádný selhávající |
| session | majordomus session status | v tomto worktree žádný otevřený |
| handover | majordomus handover --resolve | žádné — absence, ne zastaralá shoda |
| nástěnka peerů | tímto workerem neoznámeno | řádek flotily to pokrývá; §3 zaznamenává, co mi nástěnka nemohla říct |
Dvě vady preflightu, obě skutečné, žádná neobejitá:
P1 — MAJORDOMUS_SHARE rozbíjí push hook, nejen commit hook. Proměnná se exportuje do každého shellu v tomto repozitáři a ukazuje na share/ primárního checkoutu. Commit pod env -u MAJORDOMUS_SHARE uspěl; git push ve stejném skriptu ji nepřenesl a pre-push hook zamítl:
majordomus: MAJORDOMUS_SHARE names ~/dev/prismatic-majordomus/share, the
distribution of ~/dev/prismatic-majordomus — another worktree of this
repository, not this one … Run with: env -u MAJORDOMUS_SHARE
error: failed to push some refs to 'github.com:korczis/prismatic-majordomus.git'
Diagnostika je výborná a náprava je jeden příznak, ale past je v tom, že proměnná je zděděná, takže každý hook je hod mincí podle toho, jak byl příkaz vyvolán. Oprava patří k hookům, ne k tomu, aby si ji pamatoval každý worker.
P2 — základ auditu je sám už historický. origin/master bylo 08e4bb252, když byl tento worktree vytvořen, a 06fa25891, když audit skončil zhruba o čtyřicet minut později. Jakýkoli plán, který tento dokument navrhuje, musí předpokládat, že se master pohybuje během fáze, která jej implementuje.
2. Současná kanonická architektura, předmět po předmětu
Úplný soupis po jednotlivých konceptech — kanonický vlastník, úložiště, schéma, objevování, konzumenti, cesta mutace, události, testy, dokumenty a drift — je v DEVELOPMENT_RUNTIME.md a neopakuje se zde. Tento oddíl zaznamenává jen to, co ten soupis neobsahuje: subjekty vstupu a projekce, které balíček pojmenovává, a rozdělení na dva programy, které vysvětluje většinu zbytku.
Rozdělení, které vysvětluje zbytek
bin/majordomus (shell, lib/**) vlastní vývojový životní cyklus — start, check, finish, session, context, checkpoint, handover, evidence, decision, question, plan, adr, usecase, rules, doctrine, knowledge, history, search. bin/majordomus-cli (Rust) vlastní registr schopností a každou jeho projekci. Každý program odmítne příkazy toho druhého podle názvu:
$ ./bin/majordomus worktree create feature/development-runtime-model
majordomus: unknown command: worktree
majordomus: worktree is a command of the Rust executable, not of this tool; run: bin/majordomus-cli worktree
Diagnostika je přesná, což je smysl: rozdělení je záměrné a zdokumentované a je to stále důvod, proč Cockpit nedosáhne na životní cyklus. Povrch poskytovaný Rust exekutorem může promítat jen to, co Rust exekutor zná.
3. Provoz systému
Spuštěno podporovanou cestou repozitáře, v tomto worktree, proti vlastnímu sestavení tohoto worktree. Server primárního checkoutu zůstal nedotčen.
Start, opětovné použití a flotila
$ ./bin/majordomus-cli serve status # before
standing absent
desired 127.0.0.1:8741 version 0.5.0
repository 4ca83e493da37139e9b0324377ab2c20 (this is a linked worktree)
$ ./bin/majordomus-cli serve ensure
ready http://127.0.0.1:62354 pid 44871 version 0.5.0 (started by this call)
0.45s total
$ ./bin/majordomus-cli serve ensure # again
ready http://127.0.0.1:62354 pid 44871 version 0.5.0
0.03s total
Start je idempotentní a opětovné použití stojí 30 ms. Dvě strukturní pozorování ze stejného výstupu:
- Jeden server na checkout, ne na repozitář.
desiredje127.0.0.1:8741pro každý checkout, takže první získá port a každý linked worktree sklouzne na efemérní (tento dostal 62354). Id repozitáře je sdílené; server ne. Dokument, který říká „jeden sdílený server na repozitář“, popisuje primární checkout. - Flotila je většinou mrtvá.
serve statusvypisuje každý checkout, který kdy viděl. Téměř všechny jsouabsent, ty, které ještě obsluhují, jsou většinououtdated, a seznam obsahuje dávno zmizelé scratch stromy pod/private/tmp/classify-*a/private/tmp/force-merge-*. Nic registr neuklízí.
Třída zastaralého serveru, měřená z obou stran
$ ./bin/majordomus-cli serve status
outdated ~/dev/prismatic-majordomus (master) http://127.0.0.1:8741 peers 5
the executable it was started from … has been replaced since
(it is serving code that is no longer on disk)
outdated …/feature/swagger-offline http://127.0.0.1:60204 peers 0
outdated …/feature/the-cockpit-shows-the-board http://127.0.0.1:53226 peers 0
outdated …/fix/stale-runtime-is-loud http://127.0.0.1:8799 peers 0
outdated …/fix/worktrees-page-is-fast http://127.0.0.1:8792 peers 0
the server published no version, so it is older than this executable (0.5.0)
$ curl -s http://127.0.0.1:8741/api/v1/server # the outdated server, asked directly
HTTP 200 standing: ready
Zastaralost je vidět jen zvenčí. Čtečka leasu v čerstvém spustitelném souboru pozná, že běžící binárka byla nahrazena; běžící server hlásí sám sebe jako ready a jeho kořenový dokument nenese žádný HEAD ke kontrole. Peeři byli po celý tento audit připojeni k tomuto serveru, každý z nich čte projekci kódu, který už neexistuje. To je nejnebezpečnější jednotlivá třída v auditu, protože každé měření, které kdokoli přes ten server provede, je tiše špatně — včetně, jak zjistil koordinátor této flotily, měření expozice schopností.
Povrchy
Každý níže uvedený požadavek byl učiněn proti http://127.0.0.1:62354.
| Požadavek | Stav | Typ | Velikost | Čas |
|---|---|---|---|---|
GET / | 200 | application/json | 2 345 B | 0.6 ms |
GET / s Accept: text/html | 200 | text/html | — | — |
GET /cockpit | 200 | text/html | 25 913 B | 21.6 ms |
GET /cockpit/capabilities | 200 | text/html | 59 528 B | 1,8 ms |
GET /cockpit/executions | 200 | text/html | 17 599 B | 1.4 ms |
GET /cockpit/worktrees | 200 | text/html | 78 098 B | 18 291.9 ms |
GET /cockpit/graphs/composed | 200 | text/html | 1 192 144 B | 39.3 ms |
GET /openapi.json | 200 | application/json | 783 220 B | 13.6 ms |
GET /swagger | 200 | text/html | 6 382 B | 0.5 ms |
GET /docs/ | 503 | application/json | 251 B | 0.4 ms |
GET /api/v1/capabilities | 200 | application/json | 1 247 611 B | 7,8 ms |
GET /api/v1/health | 200 | application/json | 2 737 B | 0.5 ms |
GET /api/v1/live, /api/v1/ready | 200 | application/json | — | — |
GET /api/v1/peers, /api/v1/executions, /api/v1/plan/status | 200 | application/json | — | — |
GET /api/v1/does-not-exist | 404 | application/json | 138 B | 0.4 ms |
Content negotiation na / funguje. Tělo 404 je vzor toho, co má chyba říkat:
{"error":{"code":"not_found","message":"no route GET /api/v1/does-not-exist; the routes are listed at /openapi.json"}}
Dva nálezy: /docs/ je 503 v každém checkoutu, který web nesestavil, protože plocha se obsluhuje z target/web/docs, což je výstup buildu. A sondy health jsou na /api/v1/live a /api/v1/ready, ne pod /api/v1/health/…; health.live a health.ready jsou jediné dvě vestavěné schopnosti bez vystavení přes MCP, na čemž se shodují dokument OpenAPI i registr.
Kanonické API, měřené přes svůj vlastní dokument
$ python3 -c "…json.load(open('openapi.json'))…"
openapi 3.1.0 | info.version 0.5.0
non-GET operations: [('/api/v1/executions/cancel','post'),
('/api/v1/executions/start','post'),
('/api/v1/peers/announce','post')]
Jedna operace na cestu a jediné, které mutují, jsou tři, které registr deklaruje jako příkazy. Dokument OpenAPI je věrnou projekcí registru a to, co věrně promítá, je runtime bez vývojových mutací.
MCP
$ POST /mcp initialize
protocol 2025-06-18 | server {'name':'majordomus','version':'0.5.0'} | caps ['resources','tools']
Mcp-Session-Id: 44871-1-15feeba0
$ POST /mcp notifications/initialized → HTTP 202
$ POST /mcp tools/list → every tool the registry exposes
$ POST /mcp resources/list → every resource, in one page, no cursor
$ POST /mcp resources/read majordomus://adr/adr-0040
read ok | text/markdown | "--- schema: adr/v1 id: adr-0040 …"
$ POST /mcp tools/call majordomus_plan_status → isError false, a full status document
$ POST /mcp tools/call majordomus_plan_done → {"code":-32602,"message":"unknown tool: majordomus_plan_done"}
Povrch MCP je úplný a správný nad tím, co registr drží — včetně nového ADR této větve, servírovaného jako zdroj minuty po napsání. Poslední řádek je architektura v jedné chybové hlášce: pro přechod plánu neexistuje nástroj, protože pro něj neexistuje schopnost.
Peery
Nástěnka je vázaná na spojení a ukázalo se to náhodou: sonda MCP výše se objevila jako p1 / phase01-probe / http / attached: true a po zavření spojení sondy se počet vrátil na 0. Oznámení patří spojení, přesně jak varuje AGENTS.md; worker, který se znovu připojí, si ponechá práci a ztratí své místo.
Co může Cockpit už měnit
Cockpit není jen pro čtení a tvar jeho cesty zápisu je invariant, který funguje, nikoli porušení. Nese přesně tři akce a každá je schopnost druhu command vyvolaná přes vlastní deklarovanou trasu: spustit schopnost jako provedení a zrušit ho (share/cockpit/executions.js) a formulář generického runneru, který se generuje ze vstupního schématu schopnosti a může proto řídit jakoukoli příkazovou schopnost — dnes jen peers.announce, na /cockpit/capabilities/peers.announce.
Žádná stránka nenese ručně psaný <form method="post">; tlačítka deklarují data-mj-start, data-mj-cancel-route a data-mj-effect a prohlížeč čte trasu ze stránky, místo aby ji konstruoval. cockpit/mod.rs rovnou odmítá každou trasu Cockpitu jinou než GET a změna stavu z jiného původu je odmítnuta a pokryta testem.
Mutační povrch Cockpitu je tedy přesně mutační povrch runtimu, což je pravidlo, které uvádí ADR tohoto auditu. Problém není zapisovací cesta Cockpitu; je v tom, že mutační povrch runtimu neobsahuje žádnou vývojovou sémantiku, ke které by se dostal.
Executions — vada disjunktních rovin
$ curl /api/v1/executions → 0 count / 0 remembered
$ ./bin/majordomus-cli run objects.verify & # while polling the server every second
t+1s server sees: 0 count, 0 active, 0 remembered
(run finished at t+1s)
run exit=0 → "OK read — 976 current, 0 drifted"
$ curl /api/v1/executions → 0 count / 0 remembered
$ curl /api/v1/peers → 0
Dřívější běh vyprodukoval pojmenované, úspěšné provedení — x-20260910T222800Z-2adbdce0 health.report — a server nikdy neviděl ani to.
majordomus run nepoužívá běžící server. Sestaví registr ve vlastním procesu, provede tam, streamuje na vlastní terminál a skončí. Úložiště provedení serveru je jiná rovina v jiném procesu. Důsledky pro IDE jsou přesné: /cockpit/executions může vždy ukázat jen práci spuštěnou přes tento server příkazem executions.start; vše, co vývojář skutečně spouští, je pro něj neviditelné; a živý kanál docs/EXECUTIONS.md, který funguje — GET /events vrací 101 Switching Protocols a streamuje rámce — je oknem do roviny, do které téměř nic nezapisuje.
V kombinaci s už zaznamenanou netrvalostí (an execution lives in the process that accepted it) historie provedení, kterou IDE potřebuje, dnes neexistuje nikde.
Registr, generování a zdraví
$ ./bin/majordomus-cli capabilities validate → validate: 0 failure(s)
$ ./bin/majordomus-cli generate --check → generate --check: in sync
$ curl /api/v1/health → status "warn", 7 ok / 1 warn
$ ./bin/majordomus doctor (via the pre-commit hook)
→ doctor: 0 failure(s)
WARN budget doctor — 51055 ms, budget 3000 ms
WARN clone unpushed — 48 branches
Řetěz generování je poctivý: ADR této větve dvakrát odmítl, než jej přijal, jednou kvůli nepodporované konstrukci YAML a jednou kvůli špatné úrovni nadpisu, a obě odmítnutí jmenovala soubor a důvod. doctor hlásí nula selhání a trvá 51–74 sekund proti rozpočtu 3 sekund — sedmnáctkrát až pětadvacetkrát přes, při každém commitu.
4. Matice mezer
Jeden stav na schopnost, ze slovníku balíčku: canonical+implemented+verified, implemented but duplicated, documented only, planned, partially implemented, broken, absent. „Verified“ vyžaduje test, který ji provádí, jmenovaný v řádku. „Planned“ vyžaduje objekt plánu.
Když byla tato matice poprvé napsána, nic z ní nebylo plánováno. Hledání je zaznamenáno, aby se negativum dalo ověřit, a bylo znovu spuštěno proti masteru na 87b9ac659 dne 2026-09-11 se stejným výsledkem:
$ for kw in palette 'diff view' 'CI status' 'syntax highlight'; do
printf '%s -> ' "$kw"
grep -ril "$kw" .ai/repo/project/issues/ .ai/repo/project/milestones/ | wc -l
done
palette -> 0
diff view -> 0
CI status -> 0
syntax highlight -> 0
Jediné objekty plánu blízké IDE byly I0927 (Cockpit ukazuje nasazení) a úkoly Cockpitu milníku capability-graph, vše již dodáno.
To už není stav. Milník development-runtime a úkoly I1501 až I1512 byly napsány z této matice a jejího plánu v §6 a jsou tím, co řádky níže znamenají, když říkají planned. §7 zaznamenává, na který řádek každý odpovídá.
Vývoj
| schopnost | status | evidence |
|---|---|---|
| průzkumník schopností | canonical+implemented+verified | capabilities.list/describe/projections; /cockpit/capabilities; tests/cockpit.rs::a_capability_the_repository_adds_reaches_every_cockpit_surface |
| paleta příkazů | canonical+implemented+verified | share/cockpit/palette.js; kontrola cockpit-probe ověřuje rodinu palety |
| generický runner provedení | canonical+implemented+verified | pages.rs::runner_form ze vstupního schématu; tests/cockpit.rs::the_runner_form_is_generated_from_the_input_schema |
| streamovaný výstup | canonical+implemented+verified | executions.events + WebSocket; tests/executions.rs; test/cases/100_execution_plane.sh |
| terminál / REPL | chybí | žádné PTY ani provádění shellu nikde v src/; palette.js výslovně říká „paleta navigují a terminál provádí“ |
| navigátor zdrojů / souborů | částečně implementováno | objects.list, directories.list — jen vrstva .ai/**; žádný strom src/** |
| zobrazení zdroje | částečně implementováno | stránka objektu vykreslí tělo indexovaného souboru jako text; žádné soubory s kódem, žádné zvýraznění, žádné kotvy řádků |
| bezpečný postup úprav | chybí | Cockpit odmítá každou trasu, která není GET (cockpit/mod.rs); žádná cesta zápisu, z rozhodnutí (COCKPIT.md) |
| zobrazení diffu | chybí | diff se objevuje jen v rozsazích commitů changelogu a v otiscích worktree; žádná schopnost, žádný povrch |
| provedení testu | částečně implementováno | recepty a případy existují a commands.list je projektuje pouze pro čtení; spustitelné jen z terminálu |
| formátování / lint / kontrola | částečně implementováno | nabízeno jako text přes katalog workflow; runtime ho nikdy nespouští |
| sestavení / release / nasazení | částečně implementováno | distribution.build, deploy.check/list/get to popisují; dělání je shell a CI |
| spuštění úlohy / workflow | pro povrch rozbité | přechody existují jen v lib/plan.sh a lib/start.sh; nedosažitelné z MCP, HTTP a Cockpitu |
| opakovaně použitelné formy workflow | canonical+implemented+verified | ovládací prvky generované ze schématu; deklarované případy měření se načtou do runneru |
| interakce poskytovatele a modelu | částečně implementováno | product.providers projektuje konfiguraci poskytovatele; v src/ neexistuje žádný klient modelu |
Plánování a SCM
| schopnost | status | evidence |
|---|---|---|
| stav repozitáře | canonical+implemented+verified | repository.info; přehled Cockpitu; tests/repository_discovery.rs |
| branches | canonical+implemented+verified | přes worktree.topology; tests/worktree.rs |
| worktrees | canonical+implemented+verified, a pomalé | worktree.*; /cockpit/worktrees změřeno na 18.3 s (§3) |
| commity | částečně implementováno | parsování conventional commitů a trace.commit; žádný povrch pro procházení commitů |
| diffy | chybí | — |
| PR | částečně implementováno | trace odvozuje hrany úkol↔PR; scripts/github-sync; žádná schopnost, žádný povrch |
| úkoly | implementováno, ale duplikováno, a nyní čteno kanonicky | čte plan.* a od 08e4bb252 také devtask.issue; zapisuje lib/plan.sh + lib/project.awk; stále žádná stránka Cockpitu — plánováno jako I1507 |
| milníky | implementováno, ale duplikováno, a nyní čteno kanonicky | stejné rozdělení a devtask.milestone od 08e4bb252; stále ne v Cockpitu — naplánováno jako I1507 |
| vazba úkol↔milník↔kód | canonical+implemented+verified | trace.issue/commit/report; test/cases/98_traceability.sh; jen registr a CLI |
| release / changelog / verze | canonical+implemented+verified | release.changelog, release.version; žádná stránka Cockpitu |
Spolupráce AI a runtime
| schopnost | status | evidence |
|---|---|---|
| peers | canonical+implemented+verified | peers.list, peers.announce; tests/mcp_shared.rs; žádná oblast Cockpitu — dosažitelné jen přes generický runner |
| tvrzení / rozsahy | implementováno, ale duplikováno | Rust repository.scope* klasifikuje; lib/check.sh --overlap rozhoduje o obsažení |
| kolize | částečně implementováno | scripts/collision-check a check --overlap; žádná schopnost, žádný povrch |
| aktuální úloha / mandát | částečně implementováno | continuity.state to čte; zapisující polovinou je jen lib/start.sh |
| kontext relace | částečně implementováno | jen lib/session_context.sh — žádný vlastník v Rustu a žádná schopnost |
| handover | částečně implementováno | lib/handover.sh; continuity.state ukazuje jen blokátory |
| stav workflow | canonical+implemented+verified | stavový automat provádění; tests/executions.rs |
| povrchy modelů / poskytovatelů | částečně implementováno | jen projekce konfigurace |
| executions | canonical+implemented+verified, a disjunktní | executions.*; jen v procesu a majordomus run nikdy nedosáhne serveru (§3) |
| zrušení | canonical+implemented+verified | executions.cancel; schopnost, kterou nelze zrušit, to říká |
| opakování | chybí — explicitní non-goal | execution/mod.rs: „žádná trvalá fronta, žádné opakování a žádný plánovač“ |
| živé události / logy | canonical+implemented+verified | handshake a rámce WebSocketu pozorované v §3; oddělené od trvalé knihy |
Governance
| schopnost | status | evidence |
|---|---|---|
| efektivní pravidla | částečně implementováno | pravidla jako objekty a graf pravidel; přednost se řeší jen v lib/; COCKPIT.md uvádí „žádné řešení přednosti pravidel“ jako rozhodnutí |
| doktríny | canonical+implemented+verified | lib/doctrine.sh; test/cases/17,18; žádné pravidlo projektu není vynucováno nástrojem, z doktríny |
| politiky | částečně implementováno | typované a spotřebovávané; upravované ručně; žádná schopnost, žádný povrch |
| ADR | implementováno, ale duplikováno | lib/adr.sh a lib/decision.sh jsou dvě jména pro jeden pojem a release/changelog.rs stále odkazuje na .ai/repo/decisions/; přidělování čísel je nehlídané |
| řešení kontextu | implementováno, ale duplikováno | directories.list v Rustu a lib/context.sh v shellu odpovídají na jednu otázku; zkompilovaný kontext s rozpočtem nemá žádnou schopnost |
| provenance | canonical+implemented+verified | původ schopností a původ hran znalostí, oba skutečné |
| předběžná kontrola správy | částečně implementováno | check a worktree guard; slovo se nevyskytuje nikde v src/; nic v Cockpitu |
| porušení a náprava | canonical+implemented+verified | nálezy quality.report nesou nápravu; tests/cli_validate_violations.rs — omezeno jen na dokumentaci Rust API a CLI |
| kontroly kvality | canonical+implemented+verified | .ai/repo/ci/gates.yaml a scripts/ci-plan --check; žádná schopnost a žádný pohled na stav kontrol |
| povinnosti „hotovo“ | implementováno, ale duplikováno | obligations.closure čte kontrakt; lib/finish.sh o něm rozhoduje |
Observabilita
| schopnost | status | evidence |
|---|---|---|
| zdraví serveru | canonical+implemented+verified | health.report a jeho sada kontrol; /cockpit/health; tests/health_server.rs |
| stav procesu / runtimu | canonical+implemented+verified | server.status; tests/server_status.rs — na žádné stránce Cockpitu |
| čítače výkonu | canonical+implemented+verified | perf.counters; /cockpit/activity — což není v postranním panelu |
| časování fází | canonical+implemented+verified | tests/hot_path.rs; na straně shellu existuje druhý systém měření času |
| chování cache | canonical+implemented+verified | politika cache a čítače; existuje samostatná cache shellu |
| historie požadavků / provedení | rozbité | jen v procesu, trvalá polovina je jiný model (majordomus history); po restartu nepřežije nic |
| diagnostika | canonical+implemented+verified | sada kontrol zdraví; doctor je jiný předmět rozhodnutím |
| Stav CI | chybí | kontroly a jejich plán jsou kanonické; nic nečte stav běhu na žádném povrchu |
| stav nasazení | částečně implementováno | deploy.* čte deklarované nasazení; živý stav tam není |
| aktuálnost dokumentace a webu | částečně implementováno | odpověď CI, ne Cockpitu |
| drift generovaného artefaktu | canonical+implemented+verified | artifacts.list, generate --check, kontrola zdraví generated-registry; zůstávají dva zapisovatelé docs/generated/ |
Dokumentace a znalosti
| schopnost | status | evidence |
|---|---|---|
| dokumentace | částečně implementováno | sestaveno a připojeno na /docs — 503 v checkoutu, který web nesestavil (§3); není oblastí Cockpitu |
| generovaná reference | canonical+implemented+verified | vygenerovaný strom; tests/generated_documents.rs; dvakrát bajtově shodný |
| Reference API | canonical+implemented+verified | /cockpit/api a generované OpenAPI |
| Swagger | canonical+implemented+verified | /swagger poskytováno jako infrastruktura; podle deklarace to není schopnost |
| knowledge | částečně implementováno | kompilátor je pouze shell, žádná schopnost |
| graf ADR, graf pravidel, graf případů užití | canonical+implemented+verified | graph.get; dokončeno dříve, než se načte jakýkoli JavaScript |
| prohledávatelné znalosti projektu | implementováno, ale duplikováno | objects.search a /cockpit/search proti majordomus search v shellu |
| odkazy do GH Pages | chybí | Cockpit nikdy neodkazuje na publikovaný web |
5. Audit driftu
Repozitář sesouhlasuje většinu svých zrcadel a to je právě tak zjištění jako drift: CLI s registrem, každý generovaný artefakt s jeho zdrojem, dva stavové enginy plánu mezi sebou bajtovou shodou, dispatch tabulka s registrem příkazů, poskytovatelé se šablonami, projekce verze s jediným místem, kde se píše. docs/HARDCODING_LEDGER.yaml je poctivý rejstřík toho, co zbývá. Co následuje, je jen to, co není sesouhlaseno, podle tříd, které balík jmenuje.
Dvě třídy se vrátily prázdné a hledání jsou zaznamenána, aby šel negativ ověřit: ručně psané cesty OpenAPI — žádné (dokument se staví z registru; paths, operationId a tagy nemají žádná literální místa) a pole workflow — žádná (žádný soubor nevyjmenovává recepty just; kontrola command-graph odmítne ručně psaný bridge).
| třída | zjištění | kanonický vlastník | sesouhlaseno? |
|---|---|---|---|
| pole cest | cockpit/nav.rs::areas() je doslovný seznam a je už pozadu za dispatcherem: Executions a Quality jsou deklarovány v enumu Area, vykreslovány stránkami a směrovány, ale chybí v areas() | směrování tras cockpit/mod.rs | ne — a tři povrchy čtou zastaralý seznam: postranní panel, validace oblastí produktového modelu a datová sada cockpit-areas webu |
| pole cest | URL stránek a koncové body API zapsané jako literály napříč cockpit/pages.rs, včetně ručně psaného zrcadla navigace na stránce 404 | nav.rs a HTTP expozice registru | ne |
| pole cest | Tabulka rout docs/COCKPIT.md postrádá commands, continuity, directories, artifacts a quality | cockpit/mod.rs | ne — veřejný popis produktu je nepravdivý |
| katalogy příkazů | bin/majordomus usage() opakuje jednořádkové shrnutí každého příkazu a scripts/generate-site-data publikuje tuto kopii jako data webu | share/commands.yaml | pouze členství (test/cases/30_command_registry.sh); text shrnutí se nekontroluje. Je to otevřený řádek ledgeru command-surface-has-no-owner |
| duplicitní výčty stavů | share/cockpit/executions.js::isFinalState rozhoduje o finalitě provedení v prohlížeči | execution/model.rs::is_final | ne — nový koncový stav znamená stránku, která se dotazuje donekonečna, přičemž všechny kontroly jsou zelené |
| duplicitní výčty stavů | share/cockpit/socket.js má napevno zapsané řídicí zprávy streamu, ačkoli server protokol publikuje | executions.protocol | ne |
| duplicitní schémata | smlouvy generovaných artefaktů pod share/schemas/generated/ se píší ručně pro artefakty, jejichž tvarem je struktura v Rustu | struktura | jen jeden směr: artefakt nemůže porušit schéma, ale schéma může tiše zaostat za typem |
| pole poskytovatelů | lib/capture.sh zakóduje nastavení souboru jednoho poskytovatele, názvy hooků a cesty hooků jako poziční řetězce | share/providers.yaml, které nemá pole pro hooky | ne — fakt nemá vlastníka, takže jej providers-check nevidí |
| logika jen ve frontendu | palette.js sestavuje volání API a URL stránek z pevně zapsaných cest, zatímco všechny sousední moduly je čtou z atributů data-mj-* | vlastní data stránky | ne — jediná komponenta, jejímž účelem je „dosáhnout všeho“, je ta, která mine přesunutý mount |
| logika jen ve frontendu | worktrees.js filtruje, která pole topologie „záleží“ při znovunačtení | digest na straně serveru | ne |
| ruční seznamy koncových bodů | adresa loopback je zkompilována do každého zveřejněného příkladu curl | konstanta výchozího portu CLI | ne |
| soupisy dokumentace a navigace | kurátorská navigace webu plus doslovný seznam tras dlaždic v site-check | generované kolekce | ne — nová kolekce se dodává nedosažitelná a nekontrolovaná; obojí jsou otevřené řádky ledgeru |
| pevně zapsané počty | včetně prvního návrhu této větve, který uváděl počet projektových pravidel, jejž vlastní nové pravidlo téhož commitu zneplatnilo | to, co se počítá | neexistuje žádný rozhodovatel: project.no-counts-in-prose výslovně říká, že rozhoduje recenzent |
Poslední řádek stojí za pozastavení. Pravidlo je blokující a nemá vynucování a dokument, který zavedl pravidlo o kanonické sémantice, jej porušil během jednoho commitu. To je třída v miniatuře: zrcadlo vytvoří někdo, kdo pravidlo zná, zatímco o pravidlu píše.
6. Plán
Hlavní příčiny, seřazeno
R1 — životní cyklus a registr jsou ve dvou programech a jen jeden z nich má plochy. Vše níže z toho plyne. Není to nehoda a je to zdokumentováno; prostě to není slučitelné s tím, aby se Cockpit stal vývojovou plochou.
R2 — runtime nemá žádnou mutující vývojovou schopnost. CapabilityKind::Command používají jen roviny provádění a peerů a nikde jinde, takže neexistuje typované vstupní schéma pro žádný vývojový přechod na žádném strojovém povrchu.
R3 — graf příkazů vidí shellový nástroj jen na nejvyšší úrovni. Každý uzel nástroje je skupina, takže politika expozice nemá co posuzovat a doplňování nemá co nabídnout a důvod zadržení každého je vlastností skupiny, a ne operace.
R4 — příkazy životního cyklu jsou interaktivní. Většina uzlů nástrojů je zadržena, protože se člověka na něco ptají. Interaktivitu povrch nijak neobejde.
R5 — nikde neexistuje vývojová historie. Trvalá úroveň je lokální ledger s vlastním slovníkem; živá úroveň je na proces a při ukončení zapomíná; a majordomus run nezapisuje ani na server, ani, pro vlastní provedení, nic trvalého.
R6 — seznamy sousedící s UI jsou ty bez správců. Repozitář své zrcadlené kopie sladí dobře, kromě hranice, kterou chce tento balíček rozšířit: oblasti navigace, zdokumentovaná směrovací tabulka Cockpitu a sémantika rozhodovaná v prohlížeči.
Cílový tok jedné vývojové mutace
flowchart TD entry["Cockpit form / MCP tool /<br>HTTP POST / CLI"] cap["capability! kind: command<br>the only place the transition is decided"] entry -->|"typed input, validated against<br>the capability's own schema"| cap cap --> object["the object in its canonical storage<br>(.ai/repo/project/issues/<id>.yaml)"] cap --> ledger["a ledger event whose name<br>share/events.yaml declares<br>(durable record)"] cap --> stream["the execution stream<br>(live view)"]
Nic v tom diagramu není nová infrastruktura. Každé políčko existuje; chybí šipky od prvního políčka k ostatním.
Graf závislostí
flowchart TD a["A. one mutating development<br>capability, end to end"] b["B. events: a mutating capability<br>appends to the ledger"] c["C. the lifecycle capabilities<br>(task, session, checkpoint,<br>handover, finish)"] d["D. compiled context as a capability"] e["E. Cockpit development pages<br>(issues, sessions, peers)"] f["F. navigation and route derivation<br>(independent of A–D; do it any time)"] a --> b a --> c a --> d b --> e f --> e
Fáze
Fáze A — jeden vertikální řez a nic jiného. Vezměte přechody plánu (start/verify/done) a deklarujte je jako jeden capability! druhu command v modulu plan, s typovaným vstupem, případy měření a registrovanou událostí knihy. Nasměrujte lib/plan.sh na něj, tak jako lib/context.sh a lib/capture.sh už volají binárku v Rustu. Odstraňte backing:plan z .ai/repo/development-semantics-baseline.txt.
Přijetí: nástroj MCP existuje a tools/call posune úkol; POST /api/v1/plan/… se objeví ve vygenerovaném OpenAPI, aniž by ho kdokoli upravil; stávající generický runner Cockpitu ho umí řídit bez úpravy Cockpitu; lib/plan.sh už samo nezapisuje YAML; test/cases/99_plan_capabilities.sh stále drží oba enginy na bajtové shodě; kontrola development-semantics hlásí o jednu položku méně a odmítne návrat baseline.
Tato fáze je celá architektura v miniatuře. Pokud přistane čistě, každá další fáze má stejný tvar; pokud ne, nic pozdějšího by nefungovalo také.
Fáze B — jeden model událostí. Schopnost druhu command připojí do ledgeru událost, jejíž název deklaruje share/events.yaml, a stejnou změnu publikuje do streamu provádění. Dejte ledgeru schopnost čtení, aby Cockpit mohl vůbec ukázat historii.
Fáze C — životní cyklus. task start/checkpoint/finish, session open/close, handover, evidence, podle vzoru, který založila fáze A, každý neinteraktivní, aby je politika expozice přestala zadržovat.
Fáze D — sestavený kontext jako schopnost. Patří paralelní práci na kompilátoru kontextu, ne této fázi.
Fáze E — vývojové stránky Cockpitu. Úkoly, milníky, relace, peery, úloha. Až po A–C, a jen jako projekce: stránka, která sama počítá stav, je přesně ta vada, které má celý tento dokument předejít.
Fáze F — odvodit navigaci. Sladit areas() s enumem Area a dispatcherem a odvodit směrovací tabulku docs/COCKPIT.md nebo ji zkontrolovat. Nezávislé na zbytku; levné; zabrání další nepropojené stránce.
Necíle
Terminál nebo PTY na jakémkoli povrchu. Úprava zdroje repozitáře v prohlížeči. Opakování a plánovač — provedení ve vlastní modulové dokumentaci uvádí, že je z rozhodnutí nemá. Druhé úložiště dat. Druhý projektový model. Hromadný port lib/*.sh, dříve než může cokoli jiného začít. Nové podstatné jméno pro cokoli, co repozitář už pojmenovává.
Rizika
| riziko | zmírnění |
|---|---|
| master se během fáze pohne | pohnul se během tohoto auditu; rebase při každém přistání a dávejte přednost malým větvím |
| paralelní pracovníci vlastní překrývající se cesty | čtyři větve už zabírají cesty, které zabírá tato úloha; check --overlap je jmenuje, nástěnka peerů ne |
| druhý název existujícího pojmu přistane paralelně | jeden ano: modul devtask, který se dokumentuje jako spojení nad plan a trace místo druhého modelu a drží tvrzení o rovnosti vůči plan.issues. Je aditivní a má zůstat, ale jeho slovník připravenosti je druhý slovník stavů odvozený od kanonického — fáze A by měla pojmenování sbližovat, ne pěstovat třetí |
| měření provedená přes zastaralý server | čtyři z pěti serverů běžících během tohoto auditu byly zastaralé; vždy měřte z čerstvě postaveného spustitelného souboru |
| vytížený stroj mění pomalost ve falešná selhání | pozorováno při zátěži 109 na 18 jádrech; selhání časování nečtěte jako defekt, dokud se nespustí znovu v klidu |
Soubory, které se pravděpodobně změní
apps/majordomus-cli/src/capability/builtin/plan.rs, src/plan.rs, share/events.yaml, lib/plan.sh, .ai/repo/development-semantics-baseline.txt a později src/capability/builtin/{continuity,obligations}.rs, lib/{session,checkpoint,handover, evidence,finish}.sh, src/cockpit/{nav,pages}.rs, docs/COCKPIT.md.
Generované soubory, které se nikdy nesmějí upravovat ručně
docs/generated/**, site/data/**, site/content/**, share/allow/**, share/sections/**, AGENTS.md, CLAUDE.md, .bb/AGENTS.md, share/design/*.css, apps/majordomus-cli/src/web/tokens.css, apps/majordomus-cli/src/design/tokens.yaml, deploy/Dockerfile, docs/SITE_CLAIMS.md, docs/PLAN_STATUS.md, docs/PAGES_STATUS.md. Každý zapisuje majordomus generate nebo scripts/derive a kontroluje se proti čerstvé generaci; úprava je hlášené selhání, ne tichá odchylka.
Selhání k opravě před jakýmkoli rozšířením IDE
| # | selhání | proč blokuje |
|---|---|---|
| F1 | server, jehož spustitelný soubor byl nahrazen, hlásí sám sebe jako ready; zastaralost je vidět jen vnějšímu čtenáři | každé měření provedené přes něj je tiše špatně, včetně měření toho, co IDE chybí |
| F2 | majordomus run nikdy nedosáhne běžícího serveru | neexistuje žádná historie provedení, kterou by mohl povrch ukázat, a jediná stránka, která provedení ukazuje, ukazuje rovinu, do které nikdo nezapisuje |
| F3 | /cockpit/worktrees za 18.3 s a /cockpit/quality za 4.6 s oproti 1–4 ms jinde | IDE se používá nepřetržitě; to už je to nejpomalejší, s čím se člověk setká |
| F4 | /docs/ je 503, dokud web není postaven | vývojář vstupující do čerstvého worktree narazí na rozbitý povrch dokumentace |
| F5 | směrované stránky Cockpitu, které v navigaci chybí | nové stránky jsou ve výchozím stavu neviditelné a sonda prochází z navigace, takže to nic nezachytí |
| F6 | doctor běží 51–74 s proti rozpočtu 3 s při každém commitu | vlastní cena životního cyklu; zaplatí se při každé akci řízené z IDE |
| F7 | MAJORDOMUS_SHARE se dědí do hooků a podle způsobu vyvolání je rozbíjí | rozbilo to push samotného tohoto auditu |
Nejmenší bezpečná další fáze
Fáze A, a z ní jen přechod done: jedna capability! druhu command, která posune jeden úkol, s jeho událostí ledgeru a jeho případem užití. Dotýká se jednoho modulu, jednoho shellového souboru a jednoho řádku základního stavu; je dokazatelná od začátku do konce přes čtyři povrchy na jedno posezení; a buď založí vzor pro všechno ostatní, nebo okamžitě ukáže, že vzor je špatný.
7. Opětovné ověření 2026-09-11 a objekty plánu
Audit výše byl změřen proti 08e4bb252. Tato sekce znovu měří jeho nosná tvrzení proti masteru na 87b9ac659, ze spustitelného souboru sestaveného ve worktree, které měření provedlo, ne přes žádný běžící server — varování §3 o zastaralých serverech platí pro tuto sekci stejně jako pro původní. Řádek je opraven, kde příkaz říká, že se změnil, a označen jako neověřený, kde žádný příkaz nebyl spuštěn.
P2 z §1 to předpověděl: základ auditu byl historický dřív, než audit skončil. Na začátku byl 08e4bb252, na konci 06fa25891 a o den později 87b9ac659.
Ústřední zjištění stále platí
$ python3 -c "import json;c=json.load(open('docs/generated/registry.json'))['capabilities'];\
print([x['id'] for x in c if x['kind']=='command'])"
['executions.cancel', 'executions.start', 'peers.announce']
$ python3 -c "import json;d=json.load(open('docs/generated/openapi.json'));\
print(sorted((p,m) for p,o in d['paths'].items() for m in o if m!='get'))"
[('/api/v1/executions/cancel', 'post'), ('/api/v1/executions/start', 'post'),
('/api/v1/peers/announce', 'post')]
Tři mutující schopnosti, tři operace jiné než GET, žádná z nich není vývojářsky zaměřená. Odstavec, kterým tento dokument začíná, je po dni přistání nezměněn.
Co se změnilo: dvě schopnosti a jeden modul
$ git diff --stat 08e4bb252 87b9ac659 -- docs/generated/registry.json # then compared as sets
capabilities added: devtask.issue, devtask.milestone
capabilities removed: none
modules added: devtask
counts: 78 → 80
Obě jsou kind: query — nic nečtou ani nezapisují — ale jsou první kanonickou odpovědí runtimu na úkol jako práci: připravenost, vlny, překážky, paralelní podmnožiny, každé pole nese, zda ho napsal člověk, nebo odvodil stroj, jako čistou funkci kanonických záznamů a výslovně tak, aby povrch, který ji čte, sám nic neodvozoval. Dvě řádky §4 jsou kvůli tomu výše opraveny. Dokumentace modulu devtask sama říká, že to není druhý projektový model, a tabulka rizik v §6 už jmenuje konvergenci, kterou to vytváří; to riziko nyní nese milník, a ne jen tento dokument.
ADR: přečíslování nebylo potřeba
ADR 0040 je v masteru a je rozhodnutím tohoto dokumentu.
$ git log --oneline -1 87b9ac659 -- .ai/repo/adrs/0040-development-semantics-are-capabilities-of-one-runtime.md
93c5f3f87 docs(architecture): name the canonical development runtime and make it enforceable
$ git merge-base --is-ancestor feature/development-runtime-model origin/master && echo merged
merged
Celé feature/development-runtime-model — tento audit, DEVELOPMENT_RUNTIME.md a rozhodnutí — přistálo na master mezi dokončením auditu a tímto přeověřením. Žádné číslo nebylo třeba hledat a žádné nebylo přiděleno.
Dvě další zjištění o Cockpitu, změřená zde
/cockpit/graphs/composed je megabajt v jednom dokumentu. Změřeno proti serveru, který tento worktree sestavil a spustil:
$ curl -s "$B/cockpit/graphs/composed" -o composed.html -w '%{http_code} %{size_download} %{time_total}\n'
200 1196619 0.059885
$ wc -m < composed.html ; grep -o '<tr' composed.html | wc -l ; grep -c 'page=' composed.html
1196549
4729
0
Toto následuje smlouvu, ne ji popírá: docs/COCKPIT.md uvádí, že stránka detailu nestránkuje nic, a dává důvod — kresba je vylepšení, čtenář bez JavaScriptu má jen tyto seznamy a čtenář ověřující, zda je cesta v manifestu, ji musí najít vlastním hledáním prohlížeče. Smlouva je správná; při 4 729 řádcích jí cena přerostla, protože megabajt nemůže prohledat ani člověk. Přišlo s tím druhé zjištění: průchod v apps/majordomus-cli/tests/cockpit.rs pojmenovává /cockpit/graphs, /cockpit/graphs/topology a /cockpit/graphs/registry, a ne /cockpit/graphs/composed — největší stránku, kterou Cockpit servíruje, nevykresluje žádný test. Naplánováno jako I1509.
/cockpit/search neporušuje tvrzení o provozu bez JavaScriptu. Bylo to hlášeno jako prázdná skořápka o 157 znacích, která odporuje With JavaScript off every page still shows everything it knows. Nereprodukuje se a oprava je důležitější, než by bylo samo tvrzení:
$ curl -s "$B/cockpit/search" | wc -m # no query
16212
$ curl -s "$B/cockpit/search?q=scope" | wc -m # a query, server-rendered
42865 # 164 result rows, no script involved
Oněch 157 znaků je viditelný text oblasti <main> bez zadaného dotazu — podle mého počtu 160 — a ten text je Type something. The search is the repository's own: case-insensitive, over identities, titles, descriptions and content. Stránka nese skutečný <form method="get" action="/cockpit/search">; odeslání bez JavaScriptu vrací výsledky v HTML. Stránka bez dotazu neví, co ukázat, takže tvrzení platí. Žádný úkol k tomu nebyl napsán. Je to zaznamenáno, protože měření, které číslo vyprodukovalo, bylo správné a závěr z něj vyvozený ne, což je z těch dvou chyb ta dražší.
Index byl degradovaný a příčina nebyla v repozitáři
$ curl -s http://127.0.0.1:8741/api/v1/repository | grep -o '"state":"[a-z]*"'
"state":"degraded"
Čtyři soubory si nárokovaly majordomus://session/s-20260909152316-024f, takže byl vyloučen každý žadatel a relace chyběla v registru, který ji má držet. Jeden byl commitnut; tři byly zapsány další ráno, s odstupem třinácti a patnácti sekund, closerem, který znovu uzavíral relaci uzavřenou předchozí večer, a všechny tři ležely staged a necommitnuté v primárním checkoutu — což je to, co čte běžící server, a proto žádný commitnutý strom nikdy nebyl špatný. Množiny commitů byly porovnány, ne předpokládány: každá ze tří obsahuje všech 94 commitů commitnutého záznamu a 202 dalších. Úplný záznam je nyní ten ve stromu a částečný zmizel; nadbytečné soubory byly unstagnuty a ponechány na disku. Zapisovač je beze změny a je to I1503.
Řádky bez nového ověření
Každý řádek §4, který není výše jmenován, je převzat beze změny a neověřen proti 87b9ac659. Sada schopností se mezi oběma commity posunula přesně o dvě, takže řádek, jehož důkazem je schopnost nebo test, které stále existují, se pravděpodobně nezměnil — ale „pravděpodobně“ není měření a pravidlo tohoto dokumentu říká, že číslo bez příkazu vedle sebe je v něm vada.
Tři časování v §3 se výslovně neměřila znovu a neměla by se citovat: 18,3 s pro /cockpit/worktrees, 4,6 s pro /cockpit/quality a 51–74 s pro doctor. První se opravuje na fix/cockpit-answers-quickly a tento dokument tu práci neduplikuje. doctor bylo pozorováno na 83,6 s během pre-commit hooku této relace na stroji, na kterém běželo mnoho sad najednou, což je podle tabulky rizik v §6 přesně ta podmínka, za které se časování nesmí číst jako vlastnost příkazu.
Čím se stal plán z §6
| položka plánu | object |
|---|---|
F2 — run nikdy nedosáhne serveru | I1501 |
| F1 — zastaralý server ohlásí, že je připraven | I1502 |
| duplicitní identita relace | I1503 |
| Fáze A — jedna měnící vývojová schopnost | I1504 |
| Fáze B — jeden model událostí | I1505 |
| Fáze C — životní cyklus | I1506 |
| Fáze E — vývojové stránky Cockpitu | I1507 |
| Fáze F / F5 — navigace odvozená z dispečera | I1508 |
| složený graf | I1509 |
| tato matice se kontroluje proti plánu | I1510 |
F4 — /docs/ je 503 v nesestaveném checkoutu | I1511 |
| Stav CI nemá čtenáře | I1512 |
F3 — /cockpit/worktrees je pomalé | nezapsáno: fix/cockpit-answers-quickly |
| Fáze D — zkompilovaný kontext | nezapsáno: patří práci na kompilátoru kontextu |
F6 — doctor nad rozpočtem | nezapsáno: hlásí samo doctor při každém běhu |
F7 — MAJORDOMUS_SHARE zděděno do hooků | nezapsáno: rozbilo to i commit této relace |
Jak se to měřilo
# the supported start path, reuse, and the fleet
bin/majordomus-cli serve status
bin/majordomus-cli serve ensure
# every surface (B is the address `serve ensure` printed)
curl -s -o /dev/null -w '%{http_code} %{content_type} %{size_download} %{time_total}\n' "$B/<path>"
curl -s -H 'Accept: text/html' "$B/"
# the canonical API document, counted rather than read
python3 -c "import json;d=json.load(open('openapi.json'));print(len(d['paths']))"
# MCP over HTTP, with the session id the initialize response returns
curl -X POST "$B/mcp" -H 'Content-Type: application/json' \
-H 'Accept: application/json, text/event-stream' \
-d '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{…}}'
# the live channel, bounded
curl -s -i -N --http1.1 --max-time 4 -H 'Connection: Upgrade' -H 'Upgrade: websocket' \
-H 'Sec-WebSocket-Version: 13' -H 'Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==' "$B/events"
# whether `run` reaches the server: poll the server while a run is in flight
bin/majordomus-cli run objects.verify & while …; do curl -s "$B/api/v1/executions"; done
# the registry, the generation chain and the lifecycle
bin/majordomus-cli capabilities validate
bin/majordomus-cli generate --check
bin/majordomus start "…" --scope … ; bin/majordomus check
Počty v tomto repozitáři zastarávají. Měřte, ať nevěříte číslu napsanému zde, včetně těchto.