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.

Zachycení promptu probíhá pod modelem, nebo se ohlásí jako nedostupné

Zachycení promptu probíhá pod modelem, nebo se ohlásí jako nedostupné

majordomus://adr/adr-0009přijato záznamproviderssoukromí

odkazuje na

Nic. Tento objekt nedeklaruje žádný odkaz.

odkazuje na něj

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-test by 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 prompt přečte jeden payload na stdin a zapíše jeden záznam. U Claude Code je událost UserPromptSubmit, která běží dřív, než se model vyvolá. Poskytovatelé bez takové události se hlásí jako unsupported; žá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 install zapíše .claude/hooks/majordomus-capture a položku v .claude/settings.json a 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. doctor protlačí syntetický payload shimem do odkládacího archivu a přečte záznam zpět. Stavy jsou unsupported, unconfigured, named, wired a verified a deklarované vynucování splňuje jen verified. Protože doctor běží na pre-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-capture selž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.awk vrací 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 v prompt_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.log vedle záznamů a doctor selž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, doctor hlásí jeho počet a velikost a odstranění je záměrný čin člověka.
  • Repozitář se přihlásí. init neinstaluje žádný hook do ničí konfigurace poskytovatele a kostra nedeklaruje žádné vynucování. Repozitář, který chce záruku, spustí capture install a deklaruje položku, a pak je jí vázán.

Zamítnuté alternativy

  • Pravidlo v AGENTS.md nebo projektové pravidlo s class: 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. UserPromptSubmit předá transcript_path a jeho parsování by zachytilo víc. Zachytilo by i výstup modelu, což never-store-transcripts zakazuje, a svázalo by nástroj s diskovým formátem jednoho poskytovatele.
  • Přepsání existujícího settings.json slouč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 eval jiným jménem, což no-network-no-eval zakazuje. 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.
  • doctor nyní forkuje jednou na každou deklarovanou položku provider-hook, aby spustil self test. Cena je na cestě pre-commit a patří do změřeného rozpočtu, ne do odhadu: majordomus bench doctor je to, co hýbe benchmark.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.

Odkud to pochází

kanonický soubor
.ai/repo/adrs/0009-prompt-capture-happens-below-the-model.md
identity
adr-0009
dostupné také jako
Zdroj MCP majordomus://adr/adr-0009 · majordomus entity show adr/adr-0009 · GET /api/v1/entity?uri=majordomus://adr/adr-0009
v Cockpitu
/cockpit/objects/adr/adr-0009

Tato stránka je generována z výše uvedeného souboru pomocí scripts/generate-site-data; úprava stránky nic nemění, úprava souboru změní všechna rozhraní. Výše uvedené vztahy jsou hrany docs/generated/graph.json, které spustitelný program zapisuje ze stejného indexu.

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