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.

Epizoda, která se otevře, dostane to, co zanechala poslední

Epizoda, která se otevře, dostane to, co zanechala poslední

majordomus://adr/adr-0017navrženo architekturacontinuityprovider

17. Epizodě, která se otevírá, se předá, co po sobě nechala ta poslední

Kontext

ADR 0009 umístilo zachycení promptu pod model. ADR 0015 tam umístilo i hranici epizody: poskytovatel vyvolá událost, když sezení začíná, a jinou, když končí, a hranice se z nich kreslí, jinak je fikcí. Obojí je rozhodnuto a obojí je správně.

Společně učinily objevování automatickým a načítání nechaly přesně tam, kde bylo. Po 0015 se relace otevře, aniž by kdokoli psal příkaz, pracovní kontext je zmrazen a uzavřený záznam je zapsán — a další worker se stále dozví, co věděl předchozí, jen tím, že si vzpomene spustit majordomus context. To je tatáž vada, proti které stojí obě dřívější rozhodnutí, posunutá o krok později. CONTINUITY.md slib uvádí přímo: „další worker dostane briefing sestavený z těchto souborů, ne přepis k přečtení.“ Nic ho nedalo.

Před rozhodnutím byly prostudovány dvě srovnatelné implementace, obě takové, které vlastní model Majordomus už ve všech ostatních ohledech překonává.

prismatic-platform má validovaný protokol .ai/ — identita odvozená z gitu, vrstvené rozpoznávání, štítky divergence, atomická publikace jen s připisováním — a vedle něj druhé, nevalidované úložiště několika set ručně psaných poznámek relací vybíraných podle času změny. Jeho obnova je čtyřřádková instrukce v CLAUDE.md. Jeho vlastní přenosový dokument jmenuje chybějící kus: startovní hook vydávající výstup resolveru je „the obvious upgrade the design deliberately declines.“

hzs_radar je místo, odkud tento protokol pochází, a je ještě přísnější. Jeho pravidlo je formulováno jako HANDOVER != SOURCE OF TRUTH, každý obnovený záznam se klasifikuje proti gitu, než mu lze věřit, a jeho .ai/README.md říká otevřeně: „Obnova je behaviorální, ne automatická infrastruktura … žádný startovací hook nevkládá každou předávku do kontextu.“

Všechny tři návrhy se tedy zastavují na téže čáře a každý tam záměrně. Uvedený důvod je tentýž, který uvádí tento repozitář ve smlouvě vrstvy: nic pod local/ se nesmí implicitně načíst do kontextu modelu.

Ta klauzule plní dvě úlohy a jen jedna přežije kontrolu. Zakazuje publikování — generátor nebo veřejné rozhraní nesoucí záznamy, které pojmenovávají jeden stroj — a to je bezpodmínečné a správné. Zakazuje také jakoukoli automatickou cestu ze záznamu k workerovi a tento výklad činí záznam o pokračování v běžném případě jen k zápisu: produkuje ho mechanismus, na který si nikdo nemusí pamatovat, a konzumuje ho takový, na který si pamatuje každý.

Pod klauzulí leží tři záležitosti, které stojí za to od ní oddělit: přepis nesmí nikdy dorazit; kontext nesmí růst bez omezení; a fakt o disku se nesmí stát faktem o repozitáři. Žádná ze tří se netýká toho, zda záznam dosáhne pracovníka. Všechny tři se týkají toho, co k němu dorazí a kolik.

Rozhodnutí

Událost start zapíše briefing na standardní výstup, který poskytovatel přidá do kontextu, který se chystá sestavit. Ze stejného argumentu plynou další dvě události.

Briefing. Nese tři fakta, ve kterých se worker nemůže mlčky mýlit — v jaké epizodě je, co po sobě zanechala poslední s označením divergence, které říká, jak moc jí věřit, a co blokuje přijetí — plus jednu sekci handoveru, podle které obnovující worker jedná. Je ohraničen session.briefing_budget_lines a to, čím ho přesahuje, jmenuje, místo aby mlčky ořezával. Nenese žádnou konverzaci. Nepřítomnost se vypisuje, ne vynechává, protože „žádný relevantní handover“ je fakt, který další worker potřebuje, a ticho je nerozeznatelné od briefingu, který neběžel.

Je to událost start a jen událost start. Ta se spustí dřív, než existuje tah, a její výstup ho vybavuje; události end a compaction se spouštějí uvnitř už probíhajícího tahu, kde by výstup měnil to, co někdo dělá. Je to tatáž distinkce, která zakazuje hooku promptu psát na standardní výstup, uplatněná důsledně, a ne obrácená.

Událost compaction. Compaction není koncem epizody — worker pokračuje — a je nejběžnějším způsobem, jak se ztratí stav, zatímco práce ještě probíhá. Poskytovatel ji ohlásí předem, což je jediný okamžik, kdy lze o kontextu, který bude zahozen, cokoli zapsat, takže se tam zaznamená odvozený checkpoint.

Záznam o pokračování na konci. Epizoda, která skončí s dosud aktivní úlohou, nyní zapíše předávku dříve, než se obálka uzavře. Oba dokumenty odpovídají na různé otázky: záznam relace je index toho, co epizoda vytvořila, a předávka je to, od čeho další worker pokračuje. Dosud další worker zdědil první a ne druhý.

Odvození je to, co umožňuje všechny tři. Každý záznam pokračování bral své tělo ze stdin, což je správné pro pracovníka, který ho píše záměrně, a fatální, když nepíše nikdo. --derive skládá tělo z záznamu úlohy, ledgeru, gitu, otevřených otázek a nejnovějšího checkpointu — každé už zapsané, už validované, už s ověřenou identitou. Odvozené tělo je projekce záznamů, což je přesně důvod, proč jej smí zapsat hook: může se mýlit jen tehdy, když se mýlí záznam, který čte, a ten má vlastní kontrolu. Nevolá se žádný model a neprovádí se žádný síťový požadavek.

Klauzule vrstvy je zúžena, ne zrušena. local/ generátor nikdy nepublikuje, na veřejné ploše se neservíruje a nikdy se nečte jako politika. Do kontextu modelu se dostane přesně dvěma cestami, obě omezené politikou a ani jedna není přepis: tvůrce kontextu, když o to pracovník požádá, a tento briefing. session.briefing_on_start: false obnovuje starší mlčení pro repozitář, který nesouhlasí.

Čtení je odděleno od zápisu. Spustitelný soubor v Rustu získává schopnost continuity, která čte lokální polovinu a hlásí ji přes MCP, přes HTTP i v Cockpitu, se stejným dvoustupňovým vyhodnocením a stejnými čtyřmi štítky rozdílu, jaké používá nástroj v shellu. Nikdy nezapisuje: životní cyklus má jediného zapisovatele a druhý účet událostí, které ledger už drží, je přesně to, co celý tento návrh odmítá. Je obsluhována a nikdy promítána — žádný artefakt docs/generated/ a žádná stránka webu nenese záznam o lokální polovině a test to dokazuje.

Zamítnuté alternativy

Nechat načítání behaviorální, jako oba studované repozitáře. Je to status quo a je obhajitelné: jedna klauzule zůstane jednoduchá a nikoho nepřekvapí. Bylo zamítnuto, protože činí hodnotu záznamu pokračování podmíněnou jedinou věcí, na kterou se podle tohoto návrhu nelze spolehnout — že si pracovník vzpomene. Vlastní poznámky prismatic-platform nazývají alternativu zřejmou a odmítají ji z opatrnosti, ne podle podstaty.

Vložit celý briefing majordomus context. Je už sestaven, už rozpočtován a už je správným obsahem. Zamítnuto kvůli velikosti: ten rozpočet je 300 řádků, placených v každé epizodě, ať je cokoli potřeba, nebo ne. Briefing je menší dokument s menším rozpočtem a končí jmenováním příkazu, který vytiskne zbytek.

Vydávat jen ukazatele — cestu a popisek, žádný obsah. To by klauzuli respektovalo doslova: nic z local/ by se necitovalo. Zamítnuto, protože ukazatel bez Next Action je pokyn jít a přečíst soubor, což je problém pamatování s jedním krokem navíc, a protože cesta plus popisek divergence je už fakt o tomto disku. Buď klauzule trasu povoluje, nebo ne; verze, která povoluje metadata a zakazuje větu, nevede žádnou principiální čáru.

Psát předávku na konci z modelu. Shrnuté tělo by se četlo lépe. Bylo zamítnuto, protože vkládá síťové volání a nedeterministický výsledek na cestu, která běží při zavření okna, a protože nástroj nikde jinde modely nevolá. Volitelné tělo napsané modelem zůstává možné nad odvozeným; odvozené zůstává autoritativní.

Nechat zapisovat záznamy i spustitelný soubor v Rustu. Už slouží každé jiné části vrstvy a mohl by sloužit i této symetricky. Zamítnuto, protože dva zapisovatelé jednoho úložiště jen pro přidávání jsou dva účty téhož děje a vlastnost jediného zapisovatele knihy je to, co vůbec umožňuje odvodit obálku relace.

Důsledky

Klauzule local/ vrstvy je pozměněna, a s ní pravidlo majordomus.session-lifecycle. Dřívější text tohoto pravidla vyžadoval ticho na standardním výstupu od každé události a behaviorální případ to tvrdil; obojí nyní uvádí užší kontrakt a případ tvrdí briefing, jeho rozpočet a ticho zbylých dvou událostí. Repozitář, který vendoroval dřívější balíček, dostane pozměněné pravidlo přes rules vendor update, které změnu hlásí, ale neaplikuje ji.

capture install zapíše čtyři shimy a čtyři položky konfigurace. Repozitář, který nainstaloval dřívější verzi, se dozví, která položka chybí, místo aby se jeho konfigurace přepsala, přesně jak to zařídilo 0015.

Briefing se platí v každé epizodě. Šedesát řádků je deklarovaná cena, je vidět v politice a repozitář, který nic z toho nechce, přepínač vypne.

continuity.state čte lokální polovinu při každém volání, což stojí jeden podproces gitu na každý vyřešený záznam a cachuje se dvě sekundy — krátce, protože záznamy zapisuje jiný proces a delší cache by odpovídala epizodou, která se už zavřela.

Cockpit získává sedmou oblast. Je to jediná stránka, která ukazuje lokální polovinu, a je to důvod, proč Cockpit zůstává vázán na loopback rozhraní.

Nic zde nedělá epizodu závislou na briefingu. Jeho sestavení je best-effort: poškozený záznam, který nešlo citovat, se zaloguje vedle pracovních kontextů a epizoda se přesto otevře, protože epizoda, která se otevřela a nešla popsat, má větší hodnotu než žádná epizoda.

Odkud to pochází

kanonický soubor
.ai/repo/adrs/0017-an-episode-that-opens-is-handed-what-the-last-one-left.md
identity
adr-0017
dostupné také jako
Zdroj MCP majordomus://adr/adr-0017 · majordomus entity show adr/adr-0017 · GET /api/v1/entity?uri=majordomus://adr/adr-0017
v Cockpitu
/cockpit/objects/adr/adr-0017

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.