15. Hranici epizody vytyčuje poskytovatel, ne model
Kontext
ADR 0009 rozhodlo, kam patří zachytávání promptů: pod model, do hooku samotného poskytovatele, protože worker nemůže zaznamenat, co nikdy nevidí, a pokyn v bootstrap souboru je žádost, ne mechanismus. Záznam relace má stejný tvar problému a zůstal s druhou odpovědí. majordomus session start a session close existují, jsou správné a běží, když si na ně worker vzpomene — což nikdy není epizoda, na které záleželo: ta, která skončila pádem, kompakcí nebo tím, že někdo zavřel okno. Úložiště epizod, které dopadly dobře, a ticho o zbytku je horší než žádné úložiště, protože se čte jako úplný záznam.
Vedle ní ležela prázdnější vada. .ai/local/session-contexts/ vrstva jmenuje od napsání layoutu: init adresář vytváří, .ai/README.md ho nazývá „bounded working contexts“ a nikdy do něj nikdo nezapsal soubor. Žádný příkaz, schopnost, hook, schéma, kontrola, test, pravidlo. Adresář, který kostra vytváří a nic neplní, je slib, který vrstva nedodržuje, a čtenář nerozliší prázdné úložiště od neimplementovaného.
Obojí je jedno rozhodnutí, protože druhé nelze zodpovědět bez prvního. Pracovní kontext se musí zapsat v nějaký okamžik a jediný okamžik, který není věcí toho, že si někdo vzpomene, je ten, který poskytovatel oznámí.
Rozhodnutí
Tam, kde poskytovatel spouští události životního cyklu relace, vymezují hranici. capture install zapíše pro každou shim a odpovídající záznamy do konfigurace poskytovatele; shimy předávají své payloady do capture session --event start|end, který epizodu otevírá a zavírá. Obojí je idempotentní, protože události jsou: start se spustí znovu při obnovení a kompakci a ponechá otevřenou epizodu, konec se spustí bez otevřené epizody a nezapíše nic. Důvod události rozhoduje o closed oproti interrupted a důvod, který adaptér neuvádí, zavře epizodu jako přerušenou, protože označit přerušenou epizodu za dokončenou je horší z obou chyb.
session start zmrazí kontext, který builder vyřešil, do .ai/local/session-contexts/<stamp>--<session-id>.md a session close připojí do téhož dokumentu, co ví uzavření. To úložiště drží: ne vyprávění a ne druhou kopii uzavřeného záznamu, ale jediný fakt, který nemá ani jeden soused — co bylo pracovníkovi skutečně řečeno, když epizoda začala. Uzavřený záznam pod .ai/repo/sessions/ říká, co epizoda vytvořila; archiv promptů drží lidskou polovinu výměny; toto drží kontext, který byl dán.
Úložiště zůstává lokální ze dvou důvodů, které nejsou tentýž. Jmenuje tento stroj — cestu worktree, checkpoint, který tu náhodou byl nejnovější — a fakt o disku není faktem o repozitáři (ADR 0014). A je to snapshot projekce: její pozdější opětovné vyřešení dá jiný dokument, takže publikovat ho by znamenalo publikovat něco, co žádný povrch nedokáže reprodukovat.
Žádný z hooků nezapisuje na standardní výstup. Tento poskytovatel přidává výstup hooku SessionStart do kontextu modelu a lokální polovina vrstvy se do kontextu nikdy nenačítá implicitně; diagnostika jde na stderr a příkaz nikdy nekončí kódem 2, přesně jako capture prompt nikdy.
Zapojení je deklarováno jako wired_by: provider-hook:<provider>:session a dokázáno jeho spuštěním, s jedinou výjimkou: verifikátor provede koncovým shimem syntetický payload se zakázanou mutací, protože uzavření cizí otevřené epizody není cena, kterou smí diagnostika účtovat. Všechno ostatní na cestě — shim, který najde repozitář, nalezení spustitelného souboru, přiřazení adaptéru, parsování payloadu — běží stejně jako při skutečné události.
Zamítnuté alternativy
Pokyn workerovi. „Otevři relaci, když začínáš“ je táž žádost, kterou ADR 0009 zamítlo u promptů, a selhává na stejném místě: žádný test chování nemůže dokázat, že byla splněna, a epizody, které se ztratí, jsou přesně ty, které nikdo nebyl v pozici uzavřít.
Udělat z pracovního kontextu sdílený objekt. Pak by se objevoval, indexoval a promítal jako uzavřený záznam, což je vzor, který tento repozitář preferuje. Jedním být nemůže: jmenuje cestu na jednom stroji a je to snapshot, který žádný povrch nemůže regenerovat. Publikovat artefakt, který nic nedokáže reprodukovat, je způsob, jak projekce přestane být projekcí.
Nechat uzavřený záznam nést tělo pracovního kontextu. Záznam je odvozený a tvarovaný kontraktem; pracovní kontext je zmrazená projekce plus poznámky workera. Jejich sloučení by vložilo neověřitelné tělo do jediného artefaktu, jehož hodnota spočívá v tom, že lze ověřit každé jeho pole.
Smazání adresáře místo toho. Obhajitelné a bylo to poctivé řešení oproti ponechání prázdného. Zamítnuto, protože fakt, který drží, je skutečný a nic jiného jej nedrží: po epizodě nikdo nedokáže rekonstruovat, co builder vyřešil při svém otevření.
Důsledky
capture install nyní zapisuje tři shimy a tři konfigurační záznamy místo jednoho a repozitáři, který nainstaloval dřívější verzi, se řekne, které záznamy chybí, místo aby se jeho konfigurace přepsala. capture status hlásí dva aspekty na poskytovatele a první sloupec jmenuje poskytovatele pro aspekt promptu a <provider>:session pro druhý, takže čtenář hledající jednu odpověď tiše nedostane druhou.
session start a session close získávají --if-open a --if-none. Obě mají výchozí chování, jaké člověk u terminálu očekává — odmítnutí — a hook předává tolerantní hodnotu, což brání tomu, aby událost, která se spustí dvakrát, byla selháním.
Úložiště roste a nic ho neořezává. Pracovní kontext není přepis stavu drženého jinde: uzavřený záznam jej neobsahuje a builder jej nedokáže reprodukovat, takže jej žádný strop neřídí a doctor místo toho hlásí jeho velikost. Je to tatáž politika, jakou má archiv promptů, ze stejného důvodu.
Poskytovatel bez událostí životního cyklu se hlásí jako unsupported a tak zůstává. Hranice, kterou toto rozhodnutí vede, existuje přesně tam, kde ji poskytovatel ohlašuje, a nikde jinde; práce vykonaná mimo relaci zůstává připsána žádné epizodě, jako dříve.