Zdůvodnění
Spojení zemřelo při uzavření
Záznam promptu nesl vlastní identifikátor relace providera — UUID, které mimo toho providera nic neznamená — a nic dalšího, co by ho umístilo. Jeho převod na kanonické id epizody vyžadoval state/sessions-open/<provider session>.yaml a uzavření epizody ten soubor maže. Takže od okamžiku konce epizody nemohlo nic v repozitáři říct, ke které epizodě jeho prompty patří.
Nejde o mezeru, která se pomalu rozšiřuje. Je úplná a okamžitá: mapování existuje, dokud je epizoda otevřená, a zmizí v okamžiku, kdy se uzavře, a každý prompt té epizody se najednou stane nepřiřaditelným. Změřeno v repozitáři Majordomus, kde bylo toto pravidlo napsáno, 2026-09-11: 974 záznamů, 80 různých relací poskytovatele, 20 kontextů relací a 713 promptů bez zbývající cesty k epizodě. Archiv byl hromadou textu s časovými razítky.
Identita, která žije v souboru, který smaže někdo jiný, není identita. Proto ji nese záznam: epizodu, relaci poskytovatele, z níž vznikl, a repozitář a worktree, v nichž byl zachycen, zapsané v okamžiku, kdy ještě platí, s použitím identity, kterou zbytek nástroje už počítá — mj_repository_id a mj_worktree_id — a ne druhého pojmu vymyšleného zde.
Přisuzování je důkaz, nebo nic
Záznam říká, jak přišel ke své epizodě. open znamená, že epizoda byla při příchodu promptu otevřená pod danou relací providera: pozorování. session-context a ledger znamenají, že byl propojen dodatečně z důkazů, které uzavření přežily: odvození, a čtenáři se řekne které. orphan a unlinked-legacy nenesou žádnou epizodu, a jsou to dvě slova, ne jedno, protože jde o dva různé fakty — zachycení, které hledalo a epizodu nenašlo, a záznam napsaný před existencí pole.
Nic nepřipíná prompt k epizodě, která je mu časově nejblíž. Prompt přisouzený špatné epizodě je horší než prompt nepřisouzený žádné: druhý viditelně chybí, první je potichu nepravdivý — bude čten jako důkaz a bude špatně. Sladění, které toto pravidlo jmenuje, odmítá v okamžiku, kdy by obě epizody mohly být odpovědí, a validátor nesmí hlásit archiv jako plně propojený, když důkaz pro toto tvrzení neexistuje.
Archiv je soukromý, a nebyl
Surové prompty jsou nejsoukromější věc, kterou tento nástroj zapisuje. Lidé do nich vkládají přihlašovací údaje — aby se zeptali, proč požadavek vrací 401, nebo aby si nechali přečíst konfiguraci — spolu se jmény zákazníků, interními hostnames a cestami. Stav relace vedle nich byl vždy 0600. Záznamy promptů byly 0644 po celý život archivu: čitelné každým účtem na stroji, včetně jejich názvů souborů, které jsou začátky samotných promptů.
Vyplývají z toho dvě věci. Archiv a vše v něm je čitelné jen jeho vlastníkem, včetně adresáře. A zjevný přihlašovací materiál je nahrazen cestou do záznamu, dříve než jsou bajty kdekoli kromě proměnné — ne poté, protože tajemství, které bylo na disku, na disku bylo. Co bylo nahrazeno, se zaznamenává, aby „nic nebylo nalezeno“ a „tajemství je pryč“ byla různá tvrzení, která čtenář rozliší.
Něco to omezuje
Evidenční kniha, předávky a checkpointy se každé rotují pod deklarovaným stropem. Prompty žádný neměly, s argumentem, že prompt nic znovu netvrdí, a proto jej nesmí nic smazat. Ten argument se týká záznamu — že se stal, kdy, v jaké epizodě, pod jakým headem — a ne bajtů textu, což je část nesoucí přihlašovací údaje a jejíž riziko s hodnotou nechátrá.
Retence tedy bere tělo a ponechává záznam. Přežije každé pole, včetně původu odkazu na epizodu, a náhrobek říká, kdy tělo zmizelo, jak bylo dlouhé a jaký byl digest toho, co to bylo. Záznam se stále nikdy nemaže. Archiv zůstává úplným rejstříkem toho, co se kdy ptalo.
Požadované chování
Každý záznam v archivu nese episode_link, jehož hodnotou je jedna z open, session-context, ledger, orphan nebo unlinked-legacy. Záznam s open, session-context nebo ledger nese nenulové episode; zbylé dva žádné. Záznam, který nenese episode_link vůbec, je porušením, protože jej už nelze odlišit od záznamu, jehož epizoda byla ztracena.
Záznam zapsaný hookem zachycení nese repository_id a worktree_id tak, jak je nástroj počítá jinde. Payload, který nejmenuje relaci providera, nebo jehož relace providera nemá v tomto worktree otevřenou epizodu, vytvoří orphan — nikdy ne epizodu čehokoli, co v tomto checkoutu otevřelo epizodu naposledy.
Adresář archivu má režim 0700 a každý soubor v něm má režim 0600.
Politika deklaruje prompts.retention_max_days a prompts.retention_max_bytes. Tělo starší než první, nebo nejstarší těla nad druhým, se ořezává explicitním příkazem a nikdy jako vedlejší efekt zachycení. Ořezání je atomické na záznam a zanechává záznam, jeho identitu, jeho provenienci a náhrobek toho, co bylo odebráno.
Tvary přihlašovacích údajů, které zapisovač zná, se nahradí před zápisem záznamu, takže se neobjeví ani v záznamu, ani v žádném z obou vykreslení, ani v názvu souboru, ani v žádné diagnostice. Žádná diagnostika nevypisuje hodnotu proměnné prostředí.
Chování při selhání
Porušení je nález FAIL v kategorii prompts a příkaz, který jej našel, skončí s exit 10. Pod watch se totéž porušení hlásí jako drift a příkaz skončí s exit 11. Archiv, který vůbec není přítomen, je přeskočení, ne projití: nic zde nebylo zachyceno.
Ověření
Rozhoduje o tom mj_validate_prompt_continuity, volané z doctor, watch. Behaviorální případ test/cases/140_prompt_continuity.sh pouští vlastní hook shimy poskytovatele — ne knihovní funkce — přes živou epizodu, osiřelou epizodu, rekonciliaci a prune a protlačí falešné přihlašovací údaje skutečnou cestou zachytávání, aby ověřil, že perzistovaná reprezentace je nenese. CI tento případ spouští.