Co v tomto repozitáři vlastní sémantiku vývoje software, kde každé žije, který povrch smí o čem rozhodovat a jak daleko je kód od této hranice dnes.
Doprovodné dokumenty jsou DYNAMICITY.md, který rozhoduje, kde žije fakt, a CAPABILITIES.md, který rozhoduje, jak se deklaruje operace. Tento dokument je třetí z této sady: rozhoduje, kde žije sémantika. Rozhodnutím je ADR 0040; pravidlem je project.development-semantics-are-canonical@1.
Každý počet v tomto dokumentu byl změřen. Příkazy jsou v How this was measured; žádný není zkopírován z prózy a tvrzení o chování, které dosud není implementováno, je formulováno jako cíl.
Invariant
Kanonickým vývojovým runtimem je registr schopností Rust executable. Vývojová sémantika jsou jeho schopnosti. Cockpit vývojovou sémantiku neprovádí; žádá o operace kanonický runtime a odebírá kanonický stav a události. Stejná věta platí s „CLI“, „HTTP API“, „OpenAPI“ nebo „MCP“ místo „Cockpitu“.
Vývojová sémantika je jakékoli pravidlo, odvození nebo přechod nad plánem, aktivní úlohou, zkompilovaným kontextem, relací, provedením, peerem, událostí, důkazy, povinností nebo dokončením. „Je tento úkol připraven?“, „co tato úloha ještě dluží?“, „smí se tato relace uzavřít?“, „do které vlny tento úkol patří?“ — každá má právě jednu správnou odpověď a runtime je místo, kde se počítá.
Měření, o které se to opírá
Tento repozitář obsluhují dva spustitelné soubory a hranice mezi nimi není vrstvením.
bin/majordomus je shellový nástroj implementovaný pod lib/. Jeho vlastní nápověda seskupuje jeho příkazy jako TASK, CONTEXT, MEMORY, RULES, PLAN a SYSTEM: start, check, finish, session, checkpoint, evidence, handover, decision, question, plan, adr, usecase. Ten seznam je vývojový životní cyklus a lib/ je jediný zapisovatel toho, co vytváří — lib/plan.sh:514-515 je jediné místo, kde se zapisuje YAML úkolu nebo milníku.
bin/majordomus-cli je spustitelný soubor v Rustu. Vlastní registr schopností a každou jeho projekci: MCP, HTTP, OpenAPI, Swagger, Cockpit, příkazovou řádku, generovanou referenci. Jeho nápověda uvádí rozdělení záporně: „Životní cyklus úlohy (init, start, check, finish, doctor, ...) je nástroj shellu bin/majordomus ve stejném repozitáři; tento spustitelný soubor tyto příkazy neimplementuje.“
Toto jsou měření, která činí důsledek přesným. Každé uvádí, co je pravda, ne kolik; příkaz, který reprodukuje součet, je v Jak se to měřilo.
| Měření | Co ukazuje |
|---|---|
| registr | vestavěné operace plus jeden zdroj na každý objekt vrstvy; capabilities list vypíše oba součty ve svém summary |
| vestavěné schopnosti, které mohou cokoli mutovat | pouze executions.start, executions.cancel a peers.announce. Každá další schopnost runtime je dotaz nebo zdroj |
| graf příkazů | tři původy — executable, workflow a tool |
| příkazy původem z nástroje, které dosáhnou kteréhokoli strojového povrchu | žádné. Každé z nich nese důvod projections.withheld |
| tvar nástrojové poloviny grafu | každý uzel nástroje je skupina na první úrovni, takže majordomus plan done <id> vůbec není uzel; polovina spustitelného souboru se vnořuje do svých podpříkazů |
| trvalá provádění | žádné — executions list odpovídá „provádění žije v procesu, který jej přijal“ |
| expozice vestavěných schopností | každá dosahuje HTTP; všechny kromě health.live a health.ready dosahují MCP; méně než polovina dosahuje příkazového řádku — objects.get, repository.info, každé plan.* a graph.* a health.report nemají projekci do CLI |
Graf uvádí čtyři zadržené důvody: „asks the person something; a request/response surface would hang“, „effect RepositoryMutation is above the machine ceiling LocalMutation“, „no capability declares this command line, so no machine surface has a typed input schema to execute from“ a „groups other commands; nothing to execute“. Většina grafu je zadržena ze všech strojových povrchů a nejčastějším důvodem je třetí.
Runtime tedy dnes nedokáže změnit jediný vývojový objekt a nic z životního cyklu není dosažitelné z Cockpitu, MCP ani HTTP.
Cockpit není provinilec. Jeho stromy nikde neodkazují na vrstvu; nečte žádný stav a žádný nezapisuje. Jediný odkaz, který tento dokument zaznamenal, když přistálo ADR 0040, byl zobrazovaný popisek — titulek původu u statistic() pojmenovávající cestu vrstvy tam, kde všechna ostatní místa volání pojmenovávají prózu — a od té doby byl také přepsán na prózu, což zbytek souboru dělal už dřív. Je to už ta čistá projekce, kterou vyžadují COCKPIT.md a ADR 0013. Vada je na druhé straně: runtime nemá co nabídnout z vývojové sémantiky, takže Cockpit, který má být vývojovým povrchem, má dvě možnosti — reimplementovat životní cyklus, nebo volat bin/majordomus. Obě vytvářejí druhou implementaci a ta druhá se rozjede.
Kanonický model v názvech nativních pro repozitář
Repozitář už má jméno pro každou fázi, kterou vývojový povrch potřebuje. Zavedení synonyma pro kteroukoli z nich je vada, ne rozšíření. Mapování níže je model; worker rozšiřující kteroukoli fázi konverguje ke jménu ve středním sloupci.
| Fáze | Název nativní pro repozitář | Kanonický vlastník (cíl) | Co existuje dnes |
|---|---|---|---|
| Úkol / milník | issue, milestone — plán | modul schopnosti plan | 8 schopností jen pro čtení; zapisující polovina je lib/plan.sh |
| Vývojová úloha | task — stávající aktivní úloha. Žádné nové podstatné jméno. | modul schopnosti task | lib/start.sh, check.sh, finish.sh; čitelné jen přes continuity.state |
| Sestavený kontext | context — builder kontextu a jeho zmrazení | modul schopnosti context | lib/context.sh, lib/context_docs.sh; Rustová polovina je directories.list, která hlásí smlouvy, ne zkompilovaný kontext |
| Vývojová relace | session — existující epizoda | modul schopnosti session | lib/session.sh; uzavřené záznamy jsou čitelné jako zdroje session, otevřený přes continuity.state |
| Provádění workflow | execution (rovina) nad command grafu | modul executions | existuje a drží 2 ze 3 mutujících schopností; nic neuchovává napříč procesem |
| Aktivita agentů / peerů | peer a Actor uvnitř provedení | modul peers | existuje, v paměti; peers.announce je třetí mutující schopnost |
| Schopnosti | capability | modul capabilities | existuje a je kanonický |
| Události + důkazy | event (dvě úrovně), evidence, obligation | slovník knihy + modul obligations | ledger je trvalý a místní; proud provádění je živý a běží v procesu; oba jsou disjunktní |
| Vyhodnocení dokončení | uzavření obligation a smlouva dokončení | modul obligations | obligations.closure to čte; lib/finish.sh to rozhoduje |
Dvě fáze, které pipeline mandátu jmenuje zvlášť, jsou tady jedna věc, a říct to je důležitější než diagram: vývojová úloha je existující task, ne nový objekt vedle ní, a provedení workflow je execution z command grafu příkazů, ne třetí plánovač.
Hranice vlastnictví
flowchart TD
store["THE LAYER · storage<br/><small>.ai/repo (shared) + .ai/local<br/>typed by share/kinds.yaml<br/>discovered by .ai/repo/knowledge/sources.yaml</small>"]
runtime["THE CANONICAL RUNTIME · semantics<br/><small>apps/majordomus-cli/src/capability/<br/>one capability! per operation, typed in/out<br/>exposure derived by command_graph/policy.rs</small><br/>docs/CAPABILITIES.md"]
store <-->|"reads and writes"| runtime
subgraph surfaces["projections · surfaces"]
cockpitui["Cockpit<br/>docs/COCKPIT.md"]
http["HTTP + WS"]
openapi["OpenAPI"]
mcp["MCP<br/>docs/MCP.md"]
cli["CLI<br/>docs/CLI.md"]
end
runtime --> cockpitui
runtime --> http
runtime --> openapi
runtime --> mcp
runtime --> cli
Odkazuje z tohoto diagramu (4)
Vrstva vlastní úložiště. Každý vývojový objekt je typovaný soubor .ai/. Jeho druh je deklarován v share/kinds.yaml, jehož deklarativní druhy vypisuje projekce registru, jeho kontrakt v share/schemas/majordomus/<kind>/<kind>.v1.schema.json a jeho umístění v .ai/repo/knowledge/sources.yaml jako pathspec :(glob). Tři soubory se shodují, jinak objekt nemá typ ani autoritu.
Runtime vlastní sémantiku. Jedna deklarace capability! na operaci, s typovaným vstupem a výstupem. Kde je vystavena, se odvozuje z jejího efektu a interaktivity pomocí command_graph/policy.rs, nikdy se nevolí po plochách.
Povrch vlastní prezentaci a nic víc. Vykresluje výstup schopnosti a odesílá vstup schopnosti. Nepočítá žádný stav, nerozhoduje o žádném přechodu, nečte ani nezapisuje žádný soubor vrstvy a nespouští žádný program, aby získal sémantiku. Povrch, který volá shell, vlastní sestavení argumentů, výklad návratového kódu a vykreslení chyb — tři sémantiky v povrchu, nedeklarované.
Odpovědnosti povrchů
| Povrch | Smí dělat | Nikdy nesmí |
|---|---|---|
Cockpit (src/cockpit, share/cockpit) | vykreslit JSON schopnosti; odeslat vstup schopnosti; odebírat /events | číst nebo zapisovat .ai/**; vypočítat stav nebo přechod; spustit proces majordomus |
HTTP + WebSocket (src/http) | směruje na schopnosti; nese typovaný proud událostí | drží trasu, kterou žádná schopnost nedeklaruje |
| OpenAPI / Swagger | popsat registr | popisují operaci, kterou registr nemá |
MCP (src/mcp) | vystavit schopnosti jako nástroje a zdroje | zpřístupnit nástroj, který není schopností |
CLI (src/cli.rs) | jedna projekce deklarovaná dvakrát, sladěná pomocí projection-closure | narůst o příkaz, za nímž není žádná schopnost |
Shellový nástroj (bin/majordomus, lib/**) | cíl: volat runtime schopnosti, jako to již dělají lib/context.sh a lib/capture.sh přes lib/rust_bin.sh | zůstávají jediným zapisovatelem objektu vývoje |
Úložiště: rozhodnuto a znovu použito
Žádné nové úložiště dat. Každé rozhodnutí níže je úložiště, které repozitář už má.
| Co | Kanonické úložiště | Sdíleno? | Proč právě tohle |
|---|---|---|---|
| Úkoly, milníky | .ai/repo/project/{issues,milestones}/*.yaml | sledováno | už je to kanonický plán; schéma majordomus.{issue,milestone}/v1; stav se nikdy neukládá, odvozuje se z časových značek a důkazů |
| Aktivní úloha | .ai/local/state/current.yaml | lokální | úloha je nárokem jednoho checkoutu; její sdílení by si nárokovalo cesty pro každý worktree |
| Vývojová relace, uzavřená | .ai/repo/sessions/*.md, druh session | sledováno | uzavřená epizoda je trvalý sdílený záznam toho, co se stalo |
| Vývojová relace, otevřená | .ai/local/state/session-current.yaml (+ sessions-open/) | lokální | otevřená epizoda patří procesu, který ji drží |
| Původ zkompilovaného kontextu | .ai/local/session-contexts/<episode> | lokální | jmenuje tento stroj a zmrazuje projekci v jednom okamžiku; .ai/README.md zakazuje jeho publikaci |
| Trvalé události | .ai/local/state/ledger.jsonl, slovník share/events.yaml (každé jméno, které registruje) | místní, jen připojování | už je kanonickým záznamem; pořadí knihy je pro mj_record_rank nosné |
| Živé události provádění | úložiště v procesu, streamované přes /events (15 typovaných zpráv) | ani jedno | záměrně omezeno; druhý trvalý log by reprodukoval vadu, kterou měl share/events.yaml opravit |
| Stav aktéra / peera | nástěnka v paměti (src/peers.rs) | ani jedno | peer je spojení; jeho trvalou stopou je by obálky účetní knihy a worker záznamu relace |
| Důkazy dokončení | evidence[] uvnitř úkolu nebo milníku, který splňuje | sledováno | důkaz, který žije daleko od závazku, který splňuje, je důkaz, který nikdo nespojí |
| Slovník povinností | share/obligations.yaml | dodáno | smlouva, takže zůstává doslovná |
| Artefakty | docs/generated/**, site/data/** přes generate::Target | sledováno | jeden zapisovatel, transakční, --checkovatelný |
Dvě úrovně událostí, pojmenované. Trvalá změna stavu je událost účetní knihy, jejíž název je registrován v share/events.yaml. Typovaný stream provádění je živý pohled na běžící runtime a nikdy není záznamem. Vývojová schopnost, která mění stav, připisuje do knihy; stream nese stejnou změnu, jak se děje. Žádná z úrovní nesmí držet trvalý fakt, který druhá nevidí — což dnes v obou směrech dělá.
Provedení zůstávají nedurabilní. executions list viditelně nemá co číst a pokušením je úložiště. Zamítnuto tak, jak je napsáno: durabilní záznam už existuje a je jím kniha. Úložiště provedení zůstává omezené a v procesu; durabilita je úkolem knihy.
Tok dat, tok změn, tok událostí
Čtení. Povrch se zeptá schopnosti. Schopnost čte index — objekty objevené z sources.yaml, otypované kinds.yaml, ověřené proti schématu druhu — nebo odvození nad ním (plan.rs, graph.rs, product.rs, why.rs, obligations.rs). Žádný povrch nečte soubor.
flowchart LR layer[".ai/**"] -->|discovery| index["index"] index -->|derivation| capability["capability"] capability -->|projection| surface["surface"]
Mutace. Cílový tok. Povrch pošle typovaný vstup schopnosti druhu command. Schopnost zvaliduje proti svému vstupnímu schématu, aplikuje přechod na objekt v jeho kanonickém úložišti, připojí registrovanou událost ledgeru a vrátí nový stav. Totéž volání přes MCP, HTTP, CLI i Cockpit je jedna cesta kódem.
flowchart LR surface["surface"] -->|typed input| capability["capability"] capability --> object["object in .ai/**"] object --> ledger["ledger event"] ledger --> events["/events"]
Skutečný tok dnes. U mutujících příkazů životního cyklu je povrchem terminál a schopnost neexistuje: bin/majordomus posílá do lib/<name>.sh, které zapíše objekt a samo připojí řádek registru. To je dluh, který tento dokument zaznamenává, uzamčený ratchetem v .ai/repo/development-semantics-baseline.txt.
Události. Trvalé: mj_ledger_append odmítne jméno, které share/events.yaml nedeklaruje, a takové, kterému chybí povinné pole; history --event odmítne filtrovat podle nedeklarovaného jména; history --validate hlásí uložený řádek, který nezná žádný čtenář. Živé: ExecutionStore::publish aplikuje událost na snímek pod jedním zámkem, odmítne přechod, který ExecutionState::may_move_to nepovoluje, přidělí sekvenci, událost uchová a předá odběratelům — takže klient čtoucí snímek a klient čtoucí stream se nemohou rozcházet.
Záruky konzistence
| Záruka | Mechanismus | Kde |
|---|---|---|
| Jedna typovaná definice na operaci | registr odmítne sestavit schopnost složenou mimo její modul, duplicitní id nebo politiku měření výkonu, která odporuje druhu | capability/registry.rs |
| Projekce se nemůže s registrem rozejít | capabilities validate, generate --check a kontrola projection-closure nad jediným rozhraním deklarovaným dvakrát (CLI) | capabilities/, scripts/ci/projection-check |
| Objekt nelze zbavit typu | tři soubory se musí shodovat — sekce manifestu, pathspec sources.yaml, druh kinds.yaml | discovery/, metadata/ |
| Stav se nemůže rozejít s fakty | žádný stav se nikde neukládá; lib/project.awk odvozuje BLOCKED / READY / ACTIVE / VERIFY / DONE / CANCELLED z časových razítek, důkazů a závislostí | .ai/repo/project/project.yaml |
| Neznámý klíč je chyba | generované allow-listy podle kindu pod share/allow/ | share/allow/*.txt |
| Trvalá událost se nedá překlepnout | registrovaný slovník, vynucovaný při připojení i čtení | share/events.yaml |
| Snímek a proud se nemohou rozcházet | jeden zámek, jedno zveřejnění, odmítnuté nepřípustné přechody, monotónní posloupnost | execution/store.rs |
| Generovaný soubor nelze upravovat ručně | transakční generování plus otisk nebo diff proti čerstvému generování | generate.rs, hook pre-commit |
| Živý stav nemůže přežít svého vlastníka | zápůjčka se čte jednou; server, který nikdo nevlastní, má omezenou životnost | lease.rs, ADR 0035 |
Co dnes není zaručeno, uvedeno proto, aby se výše uvedený seznam nečetl jako víc, než je: vývojový objekt zapsaný lib/ se neověřuje proti vstupnímu schématu své schopnosti, protože žádná schopnost neexistuje; a fakt, který se dostane do ledgeru, se nedostane do proudu provádění, ani naopak.
Řetězec odvozování, kterým prochází každý zpřístupněný objekt
flowchart TD decl["canonical declaration<br>capability! under src/capability/builtin/<module>.rs<br>(or, for a layer object, its kind in share/kinds.yaml)"] schema["serialization schema<br>CanonicalSchema from the typed input/output<br>(or share/schemas/majordomus/<kind>/<kind>.v1.schema.json)"] http["HTTP route + OpenAPI<br>src/http/router.rs<br>docs/generated/openapi.json, openapi.yaml"] mcp["MCP tool or resource<br>majordomus://<kind>/<identity>,<br>or a tool by capability id"] cockpit["Cockpit contract<br>the page that renders that capability's JSON"] decl --> schema schema --> http http --> mcp mcp --> cockpit
Každý článek je generovaný. Nic na řetězu se nepíše ručně a ručně psaný záznam kdekoli na něm je porušením project.rust-canonical-declaration@1 (ADR 0004) stejně jako ADR 0040. Řetěz kontrolují majordomus capabilities validate, majordomus generate --check a kontroly projection-closure a rust-generated.
U objektu vrstvy začíná řetěz o krok dříve, u schématu dokumentu: Markdown kind je popsán v <kind>.v1.proto (Header = front matter, Body = sekce), z čehož se generují JSON Schema, allow-list front matteru pod share/allow/ a požadavky na sekce těla pod share/sections/.
Rozšiřitelnost: přidání vývojové sémantiky
Záměrně krátké. Pokud tento seznam roste, architektura regredovala.
- Deklarujte jedno
capability!v souboru jeho modulu podapps/majordomus-cli/src/capability/builtin/s typovaným vstupem, typovaným výstupem aBenchmarkCasesvstupu. Nový modul je jednomodule!plus jedno jméno vcompose_modules!. - Pokud mutuje, dejte mu
kind: commanda připojte událost knihy — přidejte jeho název doshare/events.yamls příkazem, který ji zapisuje, a klíči payloadu, které vyžaduje. - Spusťte
majordomus generate, potémajordomus capabilities validate. Každý povrch — HTTP, OpenAPI, MCP, stránka Cockpit, generovaná reference, cíl měření výkonu — následuje bez druhé registrace. - Spusťte
majordomus usecase impacta každou mezeru v pokrytí, kterou jmenuje, uzavřete případem užití, který se provede. - Pokud sémantiku zastřešoval shellový příkaz, nasměrujte ho na schopnost a odstraňte jeho položku z
.ai/repo/development-semantics-baseline.txt. Základní linie se smí zmenšovat a nesmí růst.
Žádný jiný soubor se neupravuje, aby operace existovala všude, kde má.
Inventář
Změřeno, ne zapamatováno. Vlastník je ten, kdo dnes sémantiku rozhoduje; Cesta mutace je jediná věc, která ji smí zapsat. Koncept, jehož vlastník je lib/*.sh, je dluh proti ADR 0040, ne architektura.
Vývojový životní cyklus
| Koncept | Dnešní kanonický vlastník | Úložiště | Schéma / typ | Zjišťování | Konzumenti | Cesta mutace | Události | Testy | Dokumenty | Drift / duplicita |
|---|---|---|---|---|---|---|---|---|---|---|
| issue | čte src/plan.rs; zapisuje lib/plan.sh | .ai/repo/project/issues/*.yaml | majordomus.issue/v1 | sources.yaml třída issue | dotazy plan.*, jeden zdroj na úkol, web, projekce na GitHub | pouze lib/plan.sh:514-515 | plan_start, plan_verify, plan_evidence, plan_done | test/cases/*, tests/ | PLANNING.md | zapisující polovina nedosažitelná z žádného strojového povrchu |
| milestone | jako úkol | .ai/repo/project/milestones/*.yaml | majordomus.milestone/v1 | třída milestone | plan.model, plan.roadmap, po jednom zdroji | lib/plan.sh | jako úkol | jako úkol | ROADMAP.md | jako úkol |
| úloha (aktivní) | lib/start.sh, check.sh, finish.sh | .ai/local/state/current.yaml | majordomus.current/v1 | neindexováno (lokální) | continuity.state, obligations.closure, scope | pouze lib/ | task.started, task.checkpoint, task.evidence, task.finished | test/cases/32_refusal_lifecycle.sh | CONTINUITY.md | žádná schopnost; odmítnutý finish nezapíše vůbec žádnou událost |
| relace (uzavřená) | lib/session.sh | .ai/repo/sessions/*.md | session/v1 | třída session | 12 zdrojů, objects.*, web | lib/session.sh | session.closed | test/cases/* | CONTINUITY.md | žádný modul Rustu; zapsat unreachable |
| znalosti (kandidát) | lib/knowledge.sh | .ai/repo/knowledge/candidates/*.md | knowledge/v1 | sources.yaml třída candidates | knowledge_base.candidates, knowledge_base.record, knowledge_base.status, jeden zdroj na záznam, briefing | jen lib/knowledge.sh, na hranici epizody a příkazem `knowledge derive | povýšit | reject` | knowledge.derived, knowledge.promoted, knowledge.rejected | test/cases/* |
| relace (otevřená) | lib/session.sh | .ai/local/state/session-current.yaml, sessions-open/ | majordomus.session-record/v1 | neindexováno | continuity.state | lib/session.sh | session.started | ” | ” | ” |
| kontext relace | pouze lib/session_context.sh | .ai/local/session-contexts/ | majordomus.session-context/v1 | neindexováno | briefing, člověk | pouze lib/ | — | ” | .ai/README.md | žádný vlastník v Rustu a vůbec žádná schopnost |
| kontrolní bod | lib/checkpoint.sh | .ai/local/state/checkpoints/ | — | neindexováno | continuity.state, context | pouze lib/ | task.checkpoint | ” | CONTINUITY.md | žádná schopnost |
| handover | lib/handover.sh | .ai/local/state/handovers/ | — | neindexováno | continuity.state, context | pouze lib/ | task.handed_over | ” | ” | žádná schopnost |
| rozhodnutí (lokální) | lib/decision.sh | .ai/local/state/decisions.md | — | neindexováno | context, adr propose | pouze lib/ | decision.recorded | test/cases/99_adr.sh | DOCTRINE.md | dvě jména pro jeden pojem: lib/decision.sh vs lib/adr.sh a release/changelog.rs stále odkazuje na .ai/repo/decisions/ |
| otázka | lib/question.sh | .ai/local/state/open-questions.md | — | neindexováno | continuity.state počítá jen blokující položky | pouze lib/ | question.opened, question.resolved | ” | CONTINUITY.md | žádná schopnost |
| evidence | lib/evidence.sh | evidence[] v objektu plánu | uvnitř schématu issue/milestone | přes objekt | plan.*, obligations.closure | lib/evidence.sh, lib/plan.sh | task.evidence, plan_evidence | ” | PLANNING.md | žádná schopnost |
| závazek / uzavření | capability/builtin/obligations.rs (čtení) + lib/finish.sh (rozhodnutí) | share/obligations.yaml + lokální stav | dodávaný slovník | registr | obligations.*, finish | lib/finish.sh | task.finished | test/cases/32 | CONTINUITY.md | čtení a rozhodnutí jsou dvě implementace jednoho kontraktu |
| ADR | lib/adr.sh | .ai/repo/adrs/????-*.md | adr/v1 | třída adr | jeden zdroj každý, graph.get?id=adrs, release.changelog | lib/adr.sh | adr.proposed | test/cases/99_adr.sh | DOCTRINE.md | žádná schopnost; přidělování čísel není hlídáno — 0039 je dnes zabrané dvakrát napříč větvemi |
Runtime
| Koncept | Kanonický vlastník | Úložiště | Schéma / typ | Zjišťování | Konzumenti | Cesta mutace | Události | Testy | Dokumenty | Drift |
|---|---|---|---|---|---|---|---|---|---|---|
| schopnost | src/capability/ | složeno při startu procesu | CanonicalSchema na schopnost | compose_modules! | každý povrch | pouze zdroj | — | tests/projections.rs | CAPABILITIES.md | kanonické; model |
| command | tři složené deklarace: cli.rs, share/commands.yaml, justfile | sledováno | command/v1 pro shellovou polovinu | commands.graph | CLI, most workflow, dokončování, dokumentace | pouze zdroj | — | test/cases/34_command_fixtures.sh | COMMANDS.md | poloviční nástroj má hloubku 1: plan done není uzel |
| provádění | src/execution/ | jen v procesu | typovaný vstup pro každou schopnost | registr | executions.*, /events, Cockpit | executions.start, .cancel | typované zprávy streamu | tests/ | EXECUTIONS.md | nic trvalého; 15 zpráv není v žádném slovníku ledgeru |
| událost (trvalá) | share/events.yaml + mj_ledger_append | .ai/local/state/ledger.jsonl | registrovaný slovník | průchod registrem | history, continuity.state, obligations | pouze lib/ | samo o sobě | test/cases/* | SCHEMAS.md | disjunktní s proudem provádění v obou směrech |
| peer / aktér | src/peers.rs, execution/model.rs::Actor | v paměti | typované | — | peers.*, Cockpit, check --overlap | peers.announce | — | tests/ | AGENTS.md | oznámení patří spojení a při opětovném připojení se ztratí |
| worktree | src/worktree/ | odvozeno z gitu; zámek pod <git-common-dir>/majordomus/locks/ | typovaná topologie | git worktree list --porcelain | worktree.*, pre-commit guard, Cockpit | worktree create/migrate/repair | — | tests/, test/cases/* | WORKTREES.md | dvě legacy rozložení stále rozpoznávaná, záměrně |
| kontext (zkompilovaný) | lib/context.sh, lib/context_docs.sh | skládáno při každém volání | rozpočtované sestavení | .ai/**/README.md, druh context | pracovník, briefing | — (jen pro čtení) | — | test/cases/* | CONTEXT.md | polovina v Rustu (directories.list) hlásí kontrakty, ne sestavený kontext; DYNAMICITY.md už tabulku poskytovatelů označuje jako cíl |
| repozitář / index | src/repository.rs, src/index.rs | .ai/manifest.yaml + stromy, které jmenuje | manifest/v1 | manifest, pak sources.yaml | vše | — | — | tests/ | SCHEMAS.md | benchmarks, ci, providers a workspaces jsou na disku, ale v žádné sekci manifestu, vedle několika volných baseline souborů |
| sdílený server / lease | src/lease.rs, src/shared.rs | .ai/local/state/mcp/server.json | LeaseDocument | — | každý připojený klient | serve, mcp | — | test/cases/108 | ENTRY.md, ADR 0035 | jeden server na checkout, ne na repozitář |
Jak se runtime chová při každém selhání, které může zažít, a co to dokazuje, je tabulka selhání v MCP.md: každý řádek jmenuje testy, které jej provádějí, nebo uvádí omezení, že to nedělá nic, a test/cases/3056 odmítne řádek, který nemá ani jedno.
Správa a plochy
| Koncept | Kanonický vlastník | Úložiště | Konzumenti | Cesta mutace | Dokumenty | Drift |
|---|---|---|---|---|---|---|
| pravidlo / doktrína | .ai/repo/rules/{project,vendor}/ | sledovaný Markdown, identita id+version | check, finish, doctor, watch, web, po jednom zdroji | lib/rules.sh (aktualizace vendoru) | DOCTRINE.md | efektivní množina je vendorovaný základ plus vlastní pravidla tohoto repozitáře, každé blocking nebo advisory; každé pravidlo vynucované nástrojem je vendorované a žádné projektové pravidlo není vynucováno nástrojem — doktrína, ne vada: projektové pravidlo dostane kontrolu v CI. majordomus rules list --json vytiskne rozdělení |
| politika / profil | .ai/repo/policy.yaml, profiles/*.yaml | sledováno | projekce poskytovatelů, finish, kontext | ručně upraveno + update | .ai/README.md | — |
| dovednost | .ai/repo/skills/<id>/SKILL.md | sledováno | po jednom zdroji, lib/skills.sh | lib/skills.sh | .ai/repo/skills/README.md | žádný modul Rustu; jen hrany dovednost→dovednost v graph.rs |
| knowledge | .ai/repo/knowledge/ | sledováno | objects.* | lib/knowledge.sh | — | kompilátor je jen shellový, žádná schopnost |
| případ užití | .ai/repo/use-cases/*.md | sledováno | po jednom zdroji, kontrola pokrytí, web | lib/usecase.sh | USE_CASES.md | lib/usecase.sh je druhý zapisovatel docs/generated/ |
| artifact | generate::Target (15 cílů) | docs/generated/**, site/data/** | web, dokumentace, artifacts.list | majordomus generate | DYNAMICITY.md | dva zapisovatelé: src/generate.rs a sada shellů zahrnující lib/usecase.sh, bin/majordomus, scripts/derive, scripts/generate-site-data |
| Cockpit | src/cockpit/ | žádné | člověk | — | COCKPIT.md | čisté — žádný odkaz na vrstvu vůbec; jediný zobrazovaný popisek, který ADR 0040 zaznamenal, je nyní próza |
| kvalita / kontroly | .ai/repo/ci/gates.yaml | sledováno | validate.yml, just gate | ručně upraveno + ci-plan --check | CI.md | ci-plan --check vypisuje součty kontrol a tříd; případy žijí v test/cases/ a apps/majordomus-cli/tests/ |
Mezery oproti cílové pipeline
Seřazeno podle toho, co nejvíce blokuje vývojový povrch.
- Neexistuje žádná mutující vývojová schopnost. Schopnost druhu
commanddeklarují jen roviny provádění a peerů. Každý přechod úkolu, událost životního cyklu relace, kontrolní bod, předávka, připojení důkazu a rozhodnutí o dokončení je z MCP, HTTP a Cockpitu nedostupné. Uzavření: schopnostkind: commandna přechod, ratchetovaná od.ai/repo/development-semantics-baseline.txt. - Graf příkazů nevidí podpříkazy životního cyklu. Každý uzel nástroje je skupina na první úrovni;
majordomus plan done <id>uzlem není. Politika expozice proto nemá co posuzovat a engine doplňování nemá co nabídnout. Jak to uzavřít: deklarujte shell podpříkazy vshare/commands.yaml, nebo z každého udělejte schopnost a nechte graf, ať jej odvodí. - Většina příkazů životního cyklu je interaktivní. Graf je zadržuje jako „ptá se člověka na něco; plocha požadavek/odpověď by zamrzla“. Interaktivita není vlastnost, kterou plocha může obejít. Uzavření:
project.commands-run-non-interactively@2, blokující od dodatku ADR 0039, rozhodováno jeho skeny. - Dva disjunktní modely událostí. Trvalý slovník účetní knihy a živý slovník streamu, bez mostu mezi nimi. Cockpit nemůže ukázat jediný feed aktivity. Uzavření: mutující vývojová schopnost připojí registrovanou událost do účetní knihy a publikuje tutéž změnu do streamu; žádná vrstva nedrží trvalý fakt, který by druhá neviděla.
- Dokončení se rozhoduje na dvou místech.
obligations.closurečte smlouvu;lib/finish.sho ní rozhoduje. Dvě implementace jedné smlouvy. Uzavření: rozhodnutí se přesune do moduluobligationsafinishse na ně ptá. - Kompilovaný kontext nemá schopnost.
directories.listhlásí kontrakty kontextu; kompilovaný, rozpočtovaný kontext, který pracovník skutečně dostane, je jenlib/context.shaDYNAMICITY.mduž uvádí tabulku poskytovatelů jako entitu bez vlastníka. - Provedení nejsou trvalá. Rozhodnutím, ne opomenutím — ale znamená to, že Cockpit nemůže ukázat, co běželo před aktuálním procesem. Uzavření: kniha, podle §4.
- Dva zapisovatelé
docs/generated/.src/generate.rsplus sada shellu. Stávající dluh, už v územíHARDCODING_LEDGER.yaml, který zasáhne každý nový generovaný vývojový artefakt. - CLI je nejméně úplný konzument, ne nejúplnější. Méně než polovina vestavěných schopností má projekci CLI —
objects.get,repository.info, každéplan.*agraph.*ahealth.reportžádnou nemají. Člověk u terminálu tedy dosáhne na méně kanonického runtimu než klient MCP, což obrací obvyklý předpoklad, že CLI je referenčním povrchem a ostatní ho dohánějí. Jak to uzavřít: politika vystavení o tom rozhoduje z efektu a interaktivity; dotaz zadržený před CLI je buď rozhodnutí politiky, které stojí za vyslovení, nebo opomenutí, které stojí za opravu, a dnes nic neříká, které z nich. - Pojmy se shellovým vlastníkem a vůbec žádnou schopností runtime: kontexty relací, znalosti, dovednosti, prompty, otázky, historie, vyhledávání.
- Přidělování čísel ADR není hlídané.
0039dnes nárokují dva různé soubory na dvou větvích. Vývojový povrch, který navrhuje rozhodnutí, to zhorší.
Vynucování
Pravidlem je project.development-semantics-are-canonical@1, class: blocking. Podle doktríny tohoto repozitáře — a v souladu s každým projektovým pravidlem, z nichž žádné nenese blok x-majordomus — se vynucuje kontrolou CI, a ne validátorem lib/.
scripts/development-semantics-check je kontrola, zapojená jako development-semantics v jobu structure souboru .ai/repo/ci/gates.yaml. Čte jen sledované soubory a nepotřebuje sestavení. Rozhoduje dvě věci:
- Podložení. Veřejný příkaz
share/commands.yaml, jehožclassmutuje a jehožwritesjmenuje strom vývojových objektů, pro kterýdocs/generated/registry.jsonv odpovídajícím modulu nedeklaruje žádnou schopnost druhucommand. - Čistota plochy. Odkaz na
.ai/repo,.ai/localnebo spustitelný soubormajordomusuvnitřapps/majordomus-cli/src/cockpit/**neboshare/cockpit/**, s výjimkou hlavičky původu samotného generátoru.
Každé zjištění, které dnes hlásí, je v .ai/repo/development-semantics-baseline.txt: nepodložené příkazy mutující stav — adr, checkpoint, decision, evidence, finish, handover, init, migrate, plan, question, rules, session, start, update a usecase — a jeden zobrazovaný popisek Cockpitu. Zjištění mimo baseline selže; řádek baseline, který nic neodpovídá, také selže, takže ratchet utahuje, místo aby hnil.
Dvě věci, o kterých kontrola nerozhoduje, aby se její mlčení nečetlo jako průchod:
- Zda je odvození v povrchu sémantické, nebo prezentační. Šablona, která skloňuje počet, není druhou implementací; ta, která počítá připravenost, ano. Kontrola, která by hádala, by byla neauditovatelná. Rozhoduje recenzent, přesně jako
majordomus.decision-threshold@1nechává svou vlastní hranici na recenzentovi. - Kdo zapisuje vývojový objekt. Zápis v shellu nemá spolehlivý syntaktický tvar a grep na stromy objektů by hlásil každého čtenáře jako zapisovatele. Rozhodnout by to dalo jen zapisovatele deklarované jako data — pole
writesvshare/commands.yamlrozšířené o jméno zapisující funkce, sladěné slib/tak, jak už jeexit_codes. To je otevřená položka, ne kontrola.
Jak se to měřilo
# the two programs and the split between them
bin/majordomus --help
bin/majordomus-cli --help
# what the registry holds, which capabilities can mutate, and the module/kind breakdown
bin/majordomus-cli capabilities list --format json > caps.json
jq -r '{count, summary}' caps.json
jq -r '.capabilities[] | select(.provenance.source=="builtin")
| "\(.id)\t\(.kind)\t\((.exposure|keys)|join(","))"' caps.json
jq -r '.capabilities | group_by(.module)
| map("\(.[0].module)\t\(length)") | .[]' caps.json
# the commands, their origins, every withheld reason, and the depth per origin
bin/majordomus-cli commands graph --format json > cg.json
jq -r '.commands|group_by(.origin)|map("\(.[0].origin)\t\(length)")|.[]' cg.json
jq -r '[.commands[].projections.withheld|select(.)]
| group_by(.)|map("\(length)\t\(.[0])")|.[]' cg.json
jq -r '.commands|group_by(.origin)
| map({o:.[0].origin,
d:(map(.path|length)|group_by(.)|map({d:.[0],n:length}))})|.[]' cg.json
# executions keep nothing across a process; the stream's message vocabulary
bin/majordomus-cli executions list
bin/majordomus-cli executions protocol
# the effective rules, the class split, and which of them the tool enforces
bin/majordomus rules list --json
# the durable ledger event names
grep -oE '^\s+- id: [a-z._]+' share/events.yaml
# the generation targets
bin/majordomus-cli generate --help
# the web surfaces and their mounts
bin/majordomus-cli web list
# who writes what
grep -rln 'project/issues\|project/milestones' lib/ bin/ scripts/
grep -rln 'docs/generated' lib/ bin/ scripts/
grep -rn '\.ai/\|bin/majordomus' apps/majordomus-cli/src/cockpit/ share/cockpit/*.js
# sizes and the test surface
cat lib/*.sh | wc -l ; ls test/cases/*.sh | wc -l
ls apps/majordomus-cli/tests/*.rs | wc -l
# the gate over this document's own rule
scripts/development-semantics-check
Počty čehokoli v tomto repozitáři zastarávají; měřte, místo abyste věřili číslu napsanému zde, včetně těchto.