Co to znamená
Kde provider vyvolává události relace, hranici epizody vede hook tohoto providera, nikoli model, který uvnitř pracuje. SessionStart otevře epizodu a předá pracovníkovi briefing, který politika deklaruje, PreCompact zaznamená, o co konverzace brzy přijde, SessionEnd zapíše záznam pokračování a uzavře epizodu do sdíleného záznamu pod .ai/repo/sessions/ a nic z toho nezávisí na tom, že si pracovník vzpomene spustit příkaz. Při otevření se kontext, který builder vyřešil, zapíše do .ai/local/session-contexts/ a uchová se po dobu epizody, takže to, co bylo pracovníkovi řečeno, je důkaz, ne vzpomínka.
Princip
capture install zapíše vedle promptového shimu další tři — .claude/hooks/majordomus-session-start, .claude/hooks/majordomus-session-end a .claude/hooks/majordomus-session-compact — a odpovídající položky v .claude/settings.json, odmítne přepsat konfiguraci, kterou nezapsal, a pojmenuje každou chybějící položku. Každý shim předá svůj payload majordomus capture session --provider <name> --event start|end|compact, který přečte identitu relace providera a zdroj nebo důvod události pomocí lib/json_scan.awk a volá session start, session close nebo checkpoint --derive. Které události adaptér má a který sloupec jeho řádku každou drží, je tabulka: čtvrtá událost je řádek a dva sloupce, ne další větev v každém čtenáři.
Každý směr je idempotentní, protože jsou idempotentní události. SessionStart se při obnovení spustí znovu, takže start předá --if-open keep a již otevřená epizoda se ponechá místo nahrazení. SessionEnd se spustí, ať bylo cokoli otevřeno, či ne, takže close předá --if-none ignore a nezapíše nic, když není co zavírat. PreCompact a SessionEnd zaznamenávají, co zaznamenávají, ať je úloha otevřená, či ne, a ať jakýkoli výsledek dosáhla ta poslední, protože kontrolní bod a záznam pokračování patří epizodě a úloha je volitelná relace, kterou jmenují, když ji mají. Každá událost zapíše do hlavní knihy řádek provider.event.received, než se cokoli z toho rozhodne, a řádek provider.event.failed s důvodem, když práce nedoběhne: hook musí svému providerovi vrátit úspěch a vrátit úspěch není totéž co tvrdit, že se práce stala. Do ADR 0052 všechny tři nejprve žádaly úlohu active a repozitář, jehož poslední úloha byla předána, přestal zapisovat oba záznamy — šest dní, v tomto, zatímco všechny zdravotní kontroly procházely. O výsledku rozhoduje důvod události: důvod, který adaptér uvádí jako záměrný, uzavře epizodu jako closed, a cokoli jiného — pád, jméno, které tabulka nezná — ji uzavře jako interrupted, protože označit přerušenou epizodu za dokončenou je horší ze dvou chyb.
Startovní hook zapíše briefing na standardní výstup a další dva nezapíšou nic. Claude Code přidá výstup hooku SessionStart do kontextu, který se chystá sestavit, což je jediný okamžik, kdy záznam o pokračování dosáhne workera, aniž by si worker musel vzpomenout se zeptat — a záznam, který nic nenačítá, je záznam, který nikdo nečte. Co briefing smí nést, omezuje session.briefing_budget_lines a smí to být jen odkazy, štítky divergence, čerstvost, podle které se záznam posuzuje vůči session.freshness, blokátory, které odmítají přijetí, a jediná sekce předávky, podle které resumující worker jedná — ta jen dokud je záznam aktuální, protože záznam za prahem zastarání se ukáže jako historie se svým stářím a záměrně se necituje jako instrukce; nikdy nenese konverzaci a session.briefing_on_start: false obnoví ticho. Události konce a komprese se spouštějí uvnitř již probíhajícího tahu, kde by výstup změnil to, co někdo dělá, místo aby to poskytl, a proto říkají vše na stderr. Žádný hook nekončí kódem 2, ze stejného důvodu jako capture prompt nikdy.
Epizoda zanechá záznam o pokračování dřív, než se obálka uzavře, a před ním závěrečný checkpoint. Oba dokumenty odpovídají na různé otázky — záznam relace indexuje, co epizoda vytvořila, předávka je to, ze čeho další worker pokračuje — a dokud ji nezapsala událost konce, další worker zdědil první a ne druhou. Její tělo odvozuje handover --derive ze záznamu úlohy, ledgeru, gitu a otevřených otázek, z nichž vše je už zapsáno a už validováno; nic nevolá model.
Tyto odvozené záznamy se zapisují, když už se workera nelze zeptat. Čtvrtá věc, kterou capture install zapisuje, se workera ptá dříve. Je to mod providera, .claude/skills/majordomus-handover, zkopírovaný z share/mods/claude-code/, který Claude Code načte sám z této složky. Provider měří kontextové okno při každé odpovědi a při jeho plnění nevyvolá žádnou událost, takže požadavek nemůže být shim (ADR 0123). Jakmile se okno přiblíží své linii zaplnění, pevné rezervě před plným stavem nebo jeho podílu, podle toho, co nastane dřív (HEADROOM_TOKENS a MAX_FILL v modulu hooks modu), mod zařadí do fronty jeden prompt. Prompt žádá workera, aby přečetl živý stav a poslal # Objective, # Current State a # Next Action do majordomus handover. Ptá se jednou za okno a vůbec, když worker už v něm předávku napsal. Složku vlastní její značka, stejně jako shim: drift se přepíše a složka bez značky se ponechá. Instaluje ji jen session.handover_on_fill: true: skeleton ji deklaruje, starší politika bez klíče nedostane nic a jakákoli jiná hodnota odstraní složku, kterou nástroj zapsal. Nevytyčuje hranici a nenahrazuje žádný odvozený záznam; přidává jediný záznam, který mohl napsat jen worker.
session start zmrazí pracovní kontext: front matter nesoucí schema: session-context/v1, identitu epizody, providera a vlastní id relace providera — stejný řetězec, který nesou záznamy promptů, což spojuje obě úložiště — a pak výstup builderu kontextu, doslova, pod nadpisem. Následuje sekce ## Notes pro vlastní popis práce pracovníka. session close připojí sekci ## Close jmenující výsledek a sdílený záznam; dokument se jen doplňuje a nikdy nepřepisuje, takže to, co do něj pracovník napsal, přežije uzavření.
wired_by: provider-hook:<provider>:session činí repozitář odpovědným za zapojení. doctor o tom rozhoduje tím, že provede syntetický payload koncovým shimem se zakázanou mutací: shim vyhledávající repozitář, nalezení spustitelného souboru, shoda adaptéru a parsování payloadu proběhnou celé a vynechá se jen uzavření — uzavřít cizí otevřenou epizodu není cena, kterou smí diagnostika účtovat. Pět stavů je pět stavů aspektu promptu, protože jde o týchž pět faktů.
Jak to vidět
majordomus capture install
majordomus capture status # claude-code:session verified
claude plugin validate .claude/skills/majordomus-handover
# the mod that asks before the window fills
printf '{"session_id":"cc-1","source":"startup"}' | .claude/hooks/majordomus-session-start
# stdout is the briefing the next worker is handed
majordomus session status # an open episode nobody typed a command for
printf '{"session_id":"cc-1"}' | .claude/hooks/majordomus-session-compact
majordomus checkpoint --show # what the compaction recorded
majordomus session context # the working context, composed on this read
majordomus session context --path # .ai/local/session-contexts/<stamp>--<id>.md
printf '{"session_id":"cc-1","reason":"prompt_input_exit"}' | .claude/hooks/majordomus-session-end
majordomus session latest # the closed record, with its commits and referencesCo nepokrývá
Jen Claude Code má adaptér životního cyklu, a to je nyní užší ze dvou faktů. Codex CLI i Gemini CLI dokumentují SessionStart a SessionEnd; tato distribuce pro žádný nedodává adaptér, takže jsou hlášeny jako unadapted, ne unsupported, což je slovo vyhrazené poskytovateli, který danou věc nemůže vůbec (ADR 0103, share/providers.yaml nese citace). Klient bez jakýchkoli hooků nyní dostane epizodu z připojení MCP — viz connection-episode — takže worker už nezůstává bez hranice kvůli dodavateli. Relace otevřená na webu, v jiné aplikaci nebo na jiném stroji zůstává nepozorovatelná z hooku, který nikdy neběžel, a z připojení, které nikdy nevzniklo.
Úvodní snímek je snímek, ne živý pohled: je to to, co builder rozlišil při otevření, a repozitář se pod ním dál hýbe. session context skládá živý pracovní kontext z epizody, gitu a ledgeru při každém čtení a --path jmenuje snímek. Je také lokální a lokální zůstává — jmenuje tento stroj a žádný povrch jej nemůže reprodukovat, takže se nikdy nepublikuje, neindexuje ani sám nenačítá do kontextu.
Není to přepis a nemůže se jím stát. Odvozená polovina je výstup buildera a autorská polovina je shrnutí práce; klíč front matter pojmenovávající seznam zpráv, dokončení nebo odpověď modelu je blokující selhání, a tak se project.never-store-transcripts udržuje mechanicky, a ne z paměti.
Proč existuje
.ai/local/session-contexts/ vrstva jmenovala od začátku a neměla producenta: init vytvořil adresář, jedna věta prózy jej popisovala a nic do něj nikdy nezapsalo soubor. Adresář, který kostra vytvoří a nic jej nenaplní, je slib, který vrstva nedodržuje, a čtenář nerozezná prázdné úložiště od neimplementovaného. Dát mu producenta znamenalo odpovědět, odkud se bere hranice epizody, a odpověď byla ta, kterou ADR 0009 už dalo pro prompty: pod modelem, v hooku providera, kde jeho spuštění je důkazem, že funguje. .ai/repo/adrs/0015-the-episode-boundary-is-drawn-by-the-provider-not-by-the-mod.md toto rozhodnutí zaznamenává a .ai/repo/adrs/0017-an-episode-that-opens-is-handed-what-the-last-one-left.md zaznamenává briefing, událost zhuštění kontextu a záznam pokračování, které z něj plynou.