9. Zachycení promptu probíhá pod modelem, nebo je hlášeno jako nedostupné
Kontext
.ai/local/prompts/ je součástí rozložení od transformace .ai, popsaná jako surová lokální historie uživatelských promptů, a byla prázdná. Poznámka 05_AI_PROTOCOL.md, která ji definovala, byla opatrná — prompty se ukládají, „když je může schopná integrace pozorovat“, a Majordomus „NESMÍ tvrdit, že zachycuje prompty od poskytovatelů, které pozorovat nemůže“ — takže prázdnota byla poctivá, ne rozbitá. Ale žádná integrace nikdy nevznikla a mezera mezi deklarovaným adresářem a schopností je přesně to, co se čte jako funkce.
Zřejmá oprava je řádek v AGENTS.md, který workerovi říká, aby své prompty zapisoval. Fungovat nemůže, ze čtyř samostatných důvodů:
- Model bajty nikdy nevidí. K němu se dostane to, co poskytovatel sestavil; cokoli by zapsal zpět, by byla rekonstrukce, a rekonstrukce není důkaz.
- Není deterministické. Zápis závisí na tom, že se model rozhodne zavolat nástroj. Stane se u prvního promptu relace a ne u dvacátého a vytvoří archiv pouze pro připisování s dírami, které nikdo nevidí.
- Nelze ho ověřit. Neexistuje behaviorální test, který by dokázal „worker zapsal prompt po přečtení souboru“, takže pod
no-claim-without-testby nikdy nemohl být zárukou — jen poradní prózou. - Je to kruhové. Instrukce se načte, když worker přečte
.ai/, což se stane poté, co už byl první prompt relace odeslán. Jediný prompt, který obvykle nese celý záměr, je ten, který takové pravidlo strukturálně nemůže zachytit.
Rozhodnutí
- Zachycení je hook poskytovatele, ne instrukce.
majordomus capture promptpřečte jeden payload na stdin a zapíše jeden záznam. U Claude Code je událostUserPromptSubmit, která běží dřív, než se model vyvolá. Poskytovatelé bez takové události se hlásí jakounsupported; žádná se nepředpokládá. - Jeden prompt je jeden soubor,
YYYYMMDDHHMMSS-<slug>.json, kde slug je začátek promptu. Sdílený soubor jen pro připojování by činil každý záznam závislým na každém předchozím: useknutí ztratí konec, dva hooky se mohou prokládat a nalezení promptu znamená číst soubor. Samostatné soubory jsou po zápisu neměnné, řadí se chronologicky podle jména a výpis adresáře je sám čitelnou historií. Identita pro idempotenci zůstává polem uvnitř záznamu — hook doručený dvakrát za den zapíše jednou — a slug zůstává nápovědou, protože escapy a ne-ASCII se slévají do pomlček, zatímco prompt uvnitř souboru zůstává nedotčen. - Shim je zapojení a je sledovaný.
capture installzapíše.claude/hooks/majordomus-capturea položku v.claude/settings.jsona odmítne přepsat kterékoli — vypíše, co přidat, a skončí s 15. Shim odvozuje repozitář z vlastní cesty: poskytovatel dosadí svůj adresář projektu do řetězce příkazu textově, neexportuje nic, co by repozitář jmenovalo, a nezkracuje pracovní adresář, ve kterém hook běží. wired_by: provider-hook:<provider>je druh vynucování, ověřovaný spuštěním.doctorprotlačí syntetický payload shimem do odkládacího archivu a přečte záznam zpět. Stavy jsouunsupported,unconfigured,named,wiredaverifieda deklarované vynucování splňuje jenverified. Protožedoctorběží napre-commit, hook, který přestane zachycovat, zastaví commit.- Archiv je důkaz, nikdy znalost. Zůstává pod ignorovanou polovinou vrstvy; nic ho nenačítá do kontextu a žádný příkaz z něj nevyhledává. Zapisovatel vydává uzavřenou množinu polí, takže polovina výměny patřící modelu nemá pole, v němž by mohla přijít, a doktrína
prompt-captureselže, pokud je cokoli pod archivem sledováno Gitem nebo pokud záznam nese odpověď, dokončení či přepis. - Text se kopíruje, nepřekódovává.
lib/json_scan.awkvrací surový rozsah JSON každého členu nejvyšší úrovně, takže zachycený prompt je bajt po bajtu shodný s tím, co poskytovatel poslal, a žádný krok dekódování a opětovného kódování nemůže ztratit escape. Odmítne payload, který neumí parsovat, místo aby přečetl jeho část. - Pole payloadu jsou kandidáti a vložené zprávy se filtrují. Adaptér jmenuje uspořádaný seznam klíčů, ve kterých může prompt přijít, místo jednoho, a seznam původů a úvodních značek, které znamenají, že poskytovatel mluví sám se sebou, a ne člověk píšící. Obojí vynutily důkazy do hodiny po spuštění hooku: nainstalovaný Claude Code posílá prompt v
prompt, ne vprompt_text, jak popisovala dokumentace, a stejnou událost spouští pro zprávy<task-notification>, které vkládá. První potichu ztrácelo každý prompt a odhalil ho jen log; druhé plnilo archiv poskytovatelem mluvícím sám se sebou. Přeskočení není selhání, takže nezapíše ani záznam, ani řádek logu. - Neúspěšný záchyt je blokující selhání, přes log. Příkaz nemůže selhat nahlas, proto zapisuje
.capture.logvedle záznamů adoctorselže, dokud má tento log položky. Je to jediná kontrola, která zachytí selhání, jež skutečně ohrožuje záruku: provider, který přejmenuje pole, v němž prompt přichází, nechá hook běžet a self test procházet, protože self test posílá payload vyrobený samotným nástrojem. Log, který nic nečte, by byla dekorace; tento je detektor. - Nic nemaže záznam a není žádný limit k nastavení. Záznam, kontrolní body a předávky rotují pod
retention_max_*, protože každé znovu uvádí stav, který přežívá jinde. Prompt ne: existoval jednou, nebyl z ničeho odvozen a žádný jiný soubor repozitáře ho nedokáže rekonstruovat. Tiché zahazování nejstarších důkazů kvůli omezení adresáře je režim selhání, který má tato celá změna odstranit, takže archiv roste,doctorhlásí jeho počet a velikost a odstranění je záměrný čin člověka. - Repozitář se přihlásí.
initneinstaluje žádný hook do ničí konfigurace poskytovatele a kostra nedeklaruje žádné vynucování. Repozitář, který chce záruku, spustícapture installa deklaruje položku, a pak je jí vázán.
Zamítnuté alternativy
- Pravidlo v
AGENTS.mdnebo projektové pravidlo sclass: advisory. Ze čtyř důvodů výše. Muselo by se také popsat jako poradní, což je opak toho, co bylo požadováno. - Čtení souboru přepisu poskytovatele.
UserPromptSubmitpředátranscript_patha jeho parsování by zachytilo víc. Zachytilo by i výstup modelu, cožnever-store-transcriptszakazuje, a svázalo by nástroj s diskovým formátem jednoho poskytovatele. - Přepsání existujícího
settings.jsonsloučením JSON. Zamítnuto podle „žádné tiché přepsání“: nástroj nemá zapisovač JSON, sloučení by ho vyžadovalo a konfigurace hooku, kterou napsal někdo jiný, není tohoto nástroje, aby ji upravoval. Odmítnout s přesnou položkou k přidání je menší a poctivé. - Spouštět řetězec příkazu nalezený v konfiguraci poskytovatele, aby se ověřil. To je
evaljiným jménem, cožno-network-no-evalzakazuje. Ověření shimu, který nástroj zapsal, a zvlášť kontrola, že jej konfigurace jmenuje, dává stejný důkaz s pojmenovaným stavem (named) pro případ, že se obojí liší.
Důsledky
- Záruka je omezená a rozsah je třeba říct nahlas: prompty odeslané přes zapojený adaptér poskytovatele v tomto checkoutu. Prompty z webu, z desktopové aplikace, z jiného stroje nebo od nezapojeného poskytovatele zde pozorovat nelze a tímto mechanismem nikdy nepůjde.
doctornyní forkuje jednou na každou deklarovanou položkuprovider-hook, aby spustil self test. Cena je na cestěpre-commita patří do změřeného rozpočtu, ne do odhadu:majordomus bench doctorje to, co hýbebenchmark.budget.doctor_ms.- Archiv je to nejcitlivější, co nástroj zapisuje, a nyní také jediné, co zapisuje bez omezení.
.ai/local/už bylo ignorováno a doktrína činí commitnutí záznamu blokujícím selháním, ne konvencí, ale růst se hlásí, neřídí. Pokud by ho někdy bylo třeba omezit, patří to do explicitního příkazu, který člověk spouští, nikdy do hooku. - Dokumentace payloadu poskytovatele není důkazem o payloadu poskytovatele. Tato se mýlila v názvu pole a návrh nyní předpokládá, že se zmýlí znovu: kandidáti místo jednoho jména a log, který hlásí, co payload skutečně nesl. Stejná skepse by měla platit pro každý adaptér přidaný později.
- Codex a Gemini nezískají nic, dokud někdo nezjistí, zda některý z nich má ekvivalentní událost. Do té doby
capture statusříkáunsupported, což je zjištění, ne mezera.