Přeskočit na obsah

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

Vývojový runtime

vývojový runtime: který program vlastní sémantiku plánu, úloh, relací, kontextu, provádění, peerů, důkazů a dokončení, změřený soupis každého z nich, úložiště, které si každý podle rozhodnutí ponechává, dvě úrovně událostí, odvozovací řetězec, jímž musí projít vše zveřejněné, co smí a nesmí rozhodovat jednotlivé povrchy, a seřazené mezery mezi touto hranicí a kódem

Vykresleno z docs/DEVELOPMENT_RUNTIME.md — stejný Markdown, jaký ukazuje GitHub.

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
registrvestavě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 mutovatpouze 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 grafukaž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ázeNázev nativní pro repozitářKanonický vlastník (cíl)Co existuje dnes
Úkol / milníkissue, milestone — plánmodul schopnosti plan8 schopností jen pro čtení; zapisující polovina je lib/plan.sh
Vývojová úlohatask — stávající aktivní úloha. Žádné nové podstatné jméno.modul schopnosti tasklib/start.sh, check.sh, finish.sh; čitelné jen přes continuity.state
Sestavený kontextcontext — builder kontextu a jeho zmrazenímodul schopnosti contextlib/context.sh, lib/context_docs.sh; Rustová polovina je directories.list, která hlásí smlouvy, ne zkompilovaný kontext
Vývojová relacesession — existující epizodamodul schopnosti sessionlib/session.sh; uzavřené záznamy jsou čitelné jako zdroje session, otevřený přes continuity.state
Provádění workflowexecution (rovina) nad command grafumodul executionsexistuje a drží 2 ze 3 mutujících schopností; nic neuchovává napříč procesem
Aktivita agentů / peerůpeer a Actor uvnitř provedenímodul peersexistuje, v paměti; peers.announce je třetí mutující schopnost
Schopnosticapabilitymodul capabilitiesexistuje a je kanonický
Události + důkazyevent (dvě úrovně), evidence, obligationslovník knihy + modul obligationsledger 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 obligationsobligations.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

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ů

PovrchSmí dělatNikdy 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 / Swaggerpopsat registrpopisují operaci, kterou registr nemá
MCP (src/mcp)vystavit schopnosti jako nástroje a zdrojezpřístupnit nástroj, který není schopností
CLI (src/cli.rs)jedna projekce deklarovaná dvakrát, sladěná pomocí projection-closurenarů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.shzů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á.

CoKanonické úložištěSdíleno?Proč právě tohle
Úkoly, milníky.ai/repo/project/{issues,milestones}/*.yamlsledovánouž 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.yamlloká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 sessionsledovánouzavř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 jednozáměrně omezeno; druhý trvalý log by reprodukoval vadu, kterou měl share/events.yaml opravit
Stav aktéra / peeranástěnka v paměti (src/peers.rs)ani jednopeer 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ňujesledovánodůkaz, který žije daleko od závazku, který splňuje, je důkaz, který nikdo nespojí
Slovník povinnostíshare/obligations.yamldodánosmlouva, takže zůstává doslovná
Artefaktydocs/generated/**, site/data/** přes generate::Targetsledovánojeden 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árukaMechanismusKde
Jedna typovaná definice na operaciregistr odmítne sestavit schopnost složenou mimo její modul, duplicitní id nebo politiku měření výkonu, která odporuje druhucapability/registry.rs
Projekce se nemůže s registrem rozejítcapabilities 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 typutři soubory se musí shodovat — sekce manifestu, pathspec sources.yaml, druh kinds.yamldiscovery/, 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 chybagenerované allow-listy podle kindu pod share/allow/share/allow/*.txt
Trvalá událost se nedá překlepnoutregistrovaný slovník, vynucovaný při připojení i čteníshare/events.yaml
Snímek a proud se nemohou rozcházetjeden zámek, jedno zveřejnění, odmítnuté nepřípustné přechody, monotónní posloupnostexecution/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íkazápůjčka se čte jednou; server, který nikdo nevlastní, má omezenou životnostlease.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/&lt;module&gt;.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/&lt;kind&gt;/&lt;kind&gt;.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://&lt;kind&gt;/&lt;identity&gt;,<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.

  1. Deklarujte jedno capability! v souboru jeho modulu pod apps/majordomus-cli/src/capability/builtin/ s typovaným vstupem, typovaným výstupem a BenchmarkCases vstupu. Nový modul je jedno module! plus jedno jméno v compose_modules!.
  2. Pokud mutuje, dejte mu kind: command a připojte událost knihy — přidejte jeho název do share/events.yaml s příkazem, který ji zapisuje, a klíči payloadu, které vyžaduje.
  3. 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.
  4. Spusťte majordomus usecase impact a každou mezeru v pokrytí, kterou jmenuje, uzavřete případem užití, který se provede.
  5. 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

KonceptDnešní kanonický vlastníkÚložištěSchéma / typZjišťováníKonzumentiCesta mutaceUdálostiTestyDokumentyDrift / duplicita
issuečte src/plan.rs; zapisuje lib/plan.sh.ai/repo/project/issues/*.yamlmajordomus.issue/v1sources.yaml třída issuedotazy plan.*, jeden zdroj na úkol, web, projekce na GitHubpouze lib/plan.sh:514-515plan_start, plan_verify, plan_evidence, plan_donetest/cases/*, tests/PLANNING.mdzapisující polovina nedosažitelná z žádného strojového povrchu
milestonejako úkol.ai/repo/project/milestones/*.yamlmajordomus.milestone/v1třída milestoneplan.model, plan.roadmap, po jednom zdrojilib/plan.shjako úkoljako úkolROADMAP.mdjako úkol
úloha (aktivní)lib/start.sh, check.sh, finish.sh.ai/local/state/current.yamlmajordomus.current/v1neindexováno (lokální)continuity.state, obligations.closure, scopepouze lib/task.started, task.checkpoint, task.evidence, task.finishedtest/cases/32_refusal_lifecycle.shCONTINUITY.mdžádná schopnost; odmítnutý finish nezapíše vůbec žádnou událost
relace (uzavřená)lib/session.sh.ai/repo/sessions/*.mdsession/v1třída session12 zdrojů, objects.*, weblib/session.shsession.closedtest/cases/*CONTINUITY.mdžádný modul Rustu; zapsat unreachable
znalosti (kandidát)lib/knowledge.sh.ai/repo/knowledge/candidates/*.mdknowledge/v1sources.yaml třída candidatesknowledge_base.candidates, knowledge_base.record, knowledge_base.status, jeden zdroj na záznam, briefingjen lib/knowledge.sh, na hranici epizody a příkazem `knowledge derivepovýšitreject`knowledge.derived, knowledge.promoted, knowledge.rejectedtest/cases/*
relace (otevřená)lib/session.sh.ai/local/state/session-current.yaml, sessions-open/majordomus.session-record/v1neindexovánocontinuity.statelib/session.shsession.started”””
kontext relacepouze lib/session_context.sh.ai/local/session-contexts/majordomus.session-context/v1neindexovánobriefing, člověkpouze lib/—”.ai/README.mdžádný vlastník v Rustu a vůbec žádná schopnost
kontrolní bodlib/checkpoint.sh.ai/local/state/checkpoints/—neindexovánocontinuity.state, contextpouze lib/task.checkpoint”CONTINUITY.mdžádná schopnost
handoverlib/handover.sh.ai/local/state/handovers/—neindexovánocontinuity.state, contextpouze lib/task.handed_over””žádná schopnost
rozhodnutí (lokální)lib/decision.sh.ai/local/state/decisions.md—neindexovánocontext, adr proposepouze lib/decision.recordedtest/cases/99_adr.shDOCTRINE.mddvě jména pro jeden pojem: lib/decision.sh vs lib/adr.sh a release/changelog.rs stále odkazuje na .ai/repo/decisions/
otázkalib/question.sh.ai/local/state/open-questions.md—neindexovánocontinuity.state počítá jen blokující položkypouze lib/question.opened, question.resolved”CONTINUITY.mdžádná schopnost
evidencelib/evidence.shevidence[] v objektu plánuuvnitř schématu issue/milestonepřes objektplan.*, obligations.closurelib/evidence.sh, lib/plan.shtask.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í stavdodávaný slovníkregistrobligations.*, finishlib/finish.shtask.finishedtest/cases/32CONTINUITY.mdčtení a rozhodnutí jsou dvě implementace jednoho kontraktu
ADRlib/adr.sh.ai/repo/adrs/????-*.mdadr/v1třída adrjeden zdroj každý, graph.get?id=adrs, release.changeloglib/adr.shadr.proposedtest/cases/99_adr.shDOCTRINE.mdžádná schopnost; přidělování čísel není hlídáno — 0039 je dnes zabrané dvakrát napříč větvemi

Runtime

KonceptKanonický vlastníkÚložištěSchéma / typZjišťováníKonzumentiCesta mutaceUdálostiTestyDokumentyDrift
schopnostsrc/capability/složeno při startu procesuCanonicalSchema na schopnostcompose_modules!každý povrchpouze zdroj—tests/projections.rsCAPABILITIES.mdkanonické; model
commandtři složené deklarace: cli.rs, share/commands.yaml, justfilesledovánocommand/v1 pro shellovou polovinucommands.graphCLI, most workflow, dokončování, dokumentacepouze zdroj—test/cases/34_command_fixtures.shCOMMANDS.mdpoloviční nástroj má hloubku 1: plan done není uzel
prováděnísrc/execution/jen v procesutypovaný vstup pro každou schopnostregistrexecutions.*, /events, Cockpitexecutions.start, .canceltypované zprávy streamutests/EXECUTIONS.mdnic 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.jsonlregistrovaný slovníkprůchod registremhistory, continuity.state, obligationspouze lib/samo o sobětest/cases/*SCHEMAS.mddisjunktní s proudem provádění v obou směrech
peer / aktérsrc/peers.rs, execution/model.rs::Actorv pamětitypované—peers.*, Cockpit, check --overlappeers.announce—tests/AGENTS.mdoznámení patří spojení a při opětovném připojení se ztratí
worktreesrc/worktree/odvozeno z gitu; zámek pod <git-common-dir>/majordomus/locks/typovaná topologiegit worktree list --porcelainworktree.*, pre-commit guard, Cockpitworktree create/migrate/repair—tests/, test/cases/*WORKTREES.mddvě legacy rozložení stále rozpoznávaná, záměrně
kontext (zkompilovaný)lib/context.sh, lib/context_docs.shskládáno při každém volánírozpočtované sestavení.ai/**/README.md, druh contextpracovník, briefing— (jen pro čtení)—test/cases/*CONTEXT.mdpolovina v Rustu (directories.list) hlásí kontrakty, ne sestavený kontext; DYNAMICITY.md už tabulku poskytovatelů označuje jako cíl
repozitář / indexsrc/repository.rs, src/index.rs.ai/manifest.yaml + stromy, které jmenujemanifest/v1manifest, pak sources.yamlvše——tests/SCHEMAS.mdbenchmarks, ci, providers a workspaces jsou na disku, ale v žádné sekci manifestu, vedle několika volných baseline souborů
sdílený server / leasesrc/lease.rs, src/shared.rs.ai/local/state/mcp/server.jsonLeaseDocument—každý připojený klientserve, mcp—test/cases/108ENTRY.md, ADR 0035jeden 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

KonceptKanonický vlastníkÚložištěKonzumentiCesta mutaceDokumentyDrift
pravidlo / doktrína.ai/repo/rules/{project,vendor}/sledovaný Markdown, identita id+versioncheck, finish, doctor, watch, web, po jednom zdrojilib/rules.sh (aktualizace vendoru)DOCTRINE.mdefektivní 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/*.yamlsledovánoprojekce poskytovatelů, finish, kontextručně upraveno + update.ai/README.md—
dovednost.ai/repo/skills/<id>/SKILL.mdsledovánopo jednom zdroji, lib/skills.shlib/skills.sh.ai/repo/skills/README.mdžádný modul Rustu; jen hrany dovednost→dovednost v graph.rs
knowledge.ai/repo/knowledge/sledovánoobjects.*lib/knowledge.sh—kompilátor je jen shellový, žádná schopnost
případ užití.ai/repo/use-cases/*.mdsledovánopo jednom zdroji, kontrola pokrytí, weblib/usecase.shUSE_CASES.mdlib/usecase.sh je druhý zapisovatel docs/generated/
artifactgenerate::Target (15 cílů)docs/generated/**, site/data/**web, dokumentace, artifacts.listmajordomus generateDYNAMICITY.mddva zapisovatelé: src/generate.rs a sada shellů zahrnující lib/usecase.sh, bin/majordomus, scripts/derive, scripts/generate-site-data
Cockpitsrc/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.yamlsledovánovalidate.yml, just gateručně upraveno + ci-plan --checkCI.mdci-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.

  1. Neexistuje žádná mutující vývojová schopnost. Schopnost druhu command deklarují 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í: schopnost kind: command na přechod, ratchetovaná od .ai/repo/development-semantics-baseline.txt.
  2. 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 v share/commands.yaml, nebo z každého udělejte schopnost a nechte graf, ať jej odvodí.
  3. 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.
  4. 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.
  5. Dokončení se rozhoduje na dvou místech. obligations.closure čte smlouvu; lib/finish.sh o ní rozhoduje. Dvě implementace jedné smlouvy. Uzavření: rozhodnutí se přesune do modulu obligations a finish se na ně ptá.
  6. Kompilovaný kontext nemá schopnost. directories.list hlásí kontrakty kontextu; kompilovaný, rozpočtovaný kontext, který pracovník skutečně dostane, je jen lib/context.sh a DYNAMICITY.md už uvádí tabulku poskytovatelů jako entitu bez vlastníka.
  7. 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.
  8. Dva zapisovatelé docs/generated/. src/generate.rs plus sada shellu. Stávající dluh, už v území HARDCODING_LEDGER.yaml, který zasáhne každý nový generovaný vývojový artefakt.
  9. 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.* a graph.* a health.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.
  10. Pojmy se shellovým vlastníkem a vůbec žádnou schopností runtime: kontexty relací, znalosti, dovednosti, prompty, otázky, historie, vyhledávání.
  11. Přidělování čísel ADR není hlídané. 0039 dnes 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ž class mutuje a jehož writes jmenuje strom vývojových objektů, pro který docs/generated/registry.json v odpovídajícím modulu nedeklaruje žádnou schopnost druhu command.
  • Čistota plochy. Odkaz na .ai/repo, .ai/local nebo spustitelný soubor majordomus uvnitř apps/majordomus-cli/src/cockpit/** nebo share/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@1 nechá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 writes v share/commands.yaml rozšířené o jméno zapisující funkce, sladěné s lib/ tak, jak už je exit_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.

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