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.

Hák poskytovatele otevře epizodu pod modelem a předá pracovníkovi, co po sobě zanechal předchozí, zaznamená, co se kompakcí chystá zahodit, a uzavře epizodu záznamem pokračování vedle její obálky

Tam, kde poskytovatel spouští události relace, hranici epizody vytyčuje hook samotného poskytovatele, ne model pracující uvnitř. SessionStart otevře epizodu a předá workerovi briefing, který politika deklaruje, PreCompact zaznamená, co konverzace přestane držet, SessionEnd zapíše záznam o 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 worker 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 workerovi řečeno, je důkaz, ne vzpomínka.

deklarovaný stavdeklarovaný stav: zaručeno Deklarováno jako deterministické a blokující, implementováno a s uvedeným behaviorálním testem, který to má dokázat. Zda to zaznamenaný běh podporuje, říká verdikt důkazů zobrazený vedle.

zaznamenané důkazyzaznamenané důkazy: nespuštěno Deklarováno jako zaručené, ale nepodložené zaznamenaným během: test je pojmenován, ale žádný úspěšný běh nad současnými vstupy zaznamenán není. jak se zaznamenávají důkazy

Vlastní události poskytovatele SessionStart, PreCompact a SessionEnd vymezují hranici a řídí životní cyklus; každá je idempotentní, protože jsou to i události, a doctor ověří zapojení tím, že prožene payload koncovým shimem s vypnutou mutací. Událost start zapíše briefing z politiky na stdout, čímž záznam o pokračování dorazí k pracovníkovi, který o něj nežádal; zbylé dvě nezapisují nic, protože se spouštějí uvnitř již probíhajícího tahu. Pracovní kontext, který každé otevření zmrazí, je lokální, jen se k němu připisuje, nepřepisuje se, a je odmítnut, pokud by obsahoval konverzaci.

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 references

Co 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.

Detail vykreslený z docs/claims/session-lifecycle.md.

Od tvrzení k důkazu

  1. 1 · veřejné tvrzení

    Hák poskytovatele otevře epizodu pod modelem a předá pracovníkovi, co po sobě zanechal předchozí, zaznamená, co se kompakcí chystá zahodit, a uzavře epizodu záznamem pokračování vedle její obálky

    Vzniklo na Continuity, Policy.

  2. 2 · kanonické tvrzení

    session-lifecycledeklarovaný stav: zaručeno v docs/CLAIMS.yaml

    Definováno v přečtěte si to na tomto webu · docs/DOCTRINE.md

  3. 3 · implementace

    lib/session_context.sh

  4. 4 · test a scénáře

    Test: test/cases/54_session_lifecycle_hooks.sh

    Provedeno v Nechat relaci otevřít a zavřít, aniž by na to musel kdokoli myslet.

  5. 5 · zaznamenané běhy

    zaznamenané důkazy: nespuštěno jak se zaznamenávají důkazy

Ověřte si to sami

Test běží v jednorázovém dočasném repozitáři a ověřuje chování, ne řetězec ve zdrojovém kódu.

z klonu repozitáře
bash test/run.sh 54_session_lifecycle_hooks

Kde se toto tvrzení používá

pokryté odpovědnosti

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