58. Znalosti se odvozují na hranici epizody z ledgeru a gitu a povyšuje je člověk
Kontext
Epizoda zaznamenává rozhodnutí, řeší otázky a dokončuje úlohy a každá z těchto věcí zanechá v ledgeru typovaný řádek. Když epizoda skončí, checkpoint zaznamená, jak práce vypadala, a handover zaznamená, co dělat dál (ADR 0052). Nic nezaznamenává, co repozitář nyní ví. Rozhodnutí zaznamenané u úlohy je vidět v majordomus history, na jednom stroji, dokud ho nesmaže limit uchování ledgeru; vyřešená otázka je odpověď v lokálním úložišti; úloha, která skončila blocked, zanechává svůj důvod v poznámce pod .ai/local/state/completed/. Každé z toho je důkaz něčeho, co o repozitáři platí, a každé je nedostupné ze sledovaného stromu, ze všech ostatních checkoutů i ze všech povrchů, které registr napájí.
Vrstva už má objekt, pro který je to určeno. ADR 0010 stanovilo, že kurátorované znalosti jsou jeden druh, knowledge/v1, s třídou (fact | convention | constraint | memory | lesson), stavem (candidate | verified | superseded), epistemickým postojem (observed | inferred | decided) a původem, jehož derived_from jmenuje objekty knihy s typovanými odkazy. Chybí zapisovač: share/schemas/majordomus/knowledge/knowledge.v1.proto říká, že extracted znamená, že to odvodil nástroj, a žádný příkaz to nedělá. Úložiště drží jednu napsanou poznámku.
Předchozí pokus, origin/feature/repository-knowledge, šel opačným směrem: sken manifestů a prózy checkoutu do typovaných znalostí, základní hodnota tolerovaného dluhu znalostí, žebříček mode: observe|warn|protect|strict a přepínač politiky semantic, který poskytovateli dovolí číst text. Jeho podstatné moduly nebyly sledovány, když byl checkpoint vynucen, a jsou ztraceny; zbylo zapojení návrhu, ne návrh. Tento záznam říká, co se z něj přebírá a co ne.
ADR 0014 dodává argument, kam záznamy patří: záznam, který může číst jen jeden stroj, je záznam, který nečte nikdo. ADR 0017 dodává okamžik, kdy se dalšímu pracovníkovi řekne: úvodní briefing. ADR 0052 dodává invariant, který tento záznam rozšiřuje: úložiště, které lze číst, není úložiště, do kterého se zapisuje, a zastaveného zapisovatele musí hlásit kontrola, která porovnává dva fakty, uzavírání epizod a postup záznamů.
Rozhodnutí
Znalostní báze je druh knowledge pod .ai/repo/knowledge/ a nic jiného. Žádný nový druh, žádné nové úložiště, žádná paměťová služba, žádný agent, žádný registr. Záznam je jedno tvrzení o repozitáři, na jednom řádku, s třídou, stavem, epistemickým postojem a provenance, která se vyřeší. Záznam nikdy není shrnutím konverzace a nikdy necituje prompt ani tah; kontrola přepisu, kterou project.never-store-transcripts drží, se vztahuje na jeho název, popis i tělo.
Odvozený záznam je kandidát pod .ai/repo/knowledge/candidates/, sledovaný, objevovaný zdrojovou třídou existujícího druhu. Deriver zapisuje status: candidate, provenance.origin: extracted a derived_from jmenující objekty knihy, z nichž záznam vznikl. Adresář je sourozencem curated/, deklarovaný jako třída candidates v .ai/repo/knowledge/sources.yaml s pathspecem :(glob).ai/repo/knowledge/candidates/*.md a nese vlastní smlouvu README.md (ADR 0011). Smlouva nikdy nechybí: init zasadí adresář a jeho README z kostry a deriver, který adresář vytvoří v repozitáři inicializovaném před tímto rozhodnutím, zasadí README vedle prvního kandidáta. Je sledovaný z důvodu ADR 0014: kandidát pod .ai/local/state/ by byl čitelný stroji, který ho odvodil, a žádnému jinému, a review, na které čeká, by se nekonalo nikde. Název souboru je id záznamu a id se odvozuje z důkazů: id epizody následované digestem zdrojového objektu, takže dva worktree nikdy nezapíší jedno jméno pro různý obsah a opakovaný běh nad týmiž důkazy přepíše tentýž soubor bajt po bajtu.
verified zapisuje akt, nikdy deriver. majordomus knowledge promote <id> s důkazy na standardním vstupu přesune záznam do curated/, nastaví status: verified, ponechá jeho derived_from a přidá do něj povyšující epizodu a připojí důkazy pod # Evidence; prázdný stdin se odmítne, protože akt bez důkazů je tvrzení, a stdin nesoucí značku přepisu se odmítne ze stejného důvodu, z jakého ji záznam nesmí nést. Třídu určuje člověk: --class <c> při povýšení je místo, kde se convention stává constraint nebo lesson, protože zda rozhodnutí zavazuje, je úsudek, který deriver nečiní. majordomus knowledge reject <id> --reason "<why>" přepíše kandidáta na místě jako superseded, jmenuje superseded_by, když --by <id> uvádí záznam, který ho nahrazuje, a jinak zaznamená důvod pod # Rejected. Druhým aktem je úprava souboru člověkem. Deriver přeskočí id, které bylo povýšeno nebo nahrazeno, takže žádný z aktů další hranice epizody nezruší.
Bez modelu lze odvodit přesně tento seznam a deriver implementuje přesně tento seznam. Důkazem jsou řádky knihy, které epizoda opatřila razítkem, a commity, které udělala; nic nečte konverzaci, předávku ani prompt.
| evidence | record | třída | epistemika | derived_from |
|---|---|---|---|---|
decision.recorded | text rozhodnutí | convention | decided | session:<episode>, decision:<task-id>; samotná relace, když řádek nenese žádnou úlohu |
question.resolved | odpověď, která uvádí otázku, na niž odpovídá | fact | observed | session:<episode>, task:<task-id> |
task.finished s výsledkem blocked, failed nebo no_match | výsledek a první řádek # Reason poznámky k úloze | lesson | inferred | session:<episode>, task:<task-id> |
task.finished s výsledkem completed a příkazem verify | ověření, které prošlo | fact | observed | session:<episode>, task:<task-id> |
commity epizody dotýkající se .ai/repo/rules/ nebo .ai/repo/adrs/ | žádný záznam; každý záznam epizody získá commit:<sha> v derived_from a relates_to file:<path> v relations | — | — | — |
Každé odvozené rozhodnutí je convention. Dřívější koncept klasifikoval rozhodnutí jako constraint, když jeho znění neslo slovo jako never nebo must; to je čtení prózy, které docs/CLI.md odmítá pro každý druh, a je to přesně úsudek, který povýšení existuje, aby zaznamenalo. Next Action předávky je stav pokračování, ne znalost. ADR, pravidlo a dokument jsou samostatné zdroje; záznam se k nim vztahuje a nikdy je neopakuje. Stejný ledger, stejný git, stejné bajty: date záznamu je den řádku důkazu, ne hodiny, a do souboru nevstupuje žádná náhodná hodnota. Volný text řádku ledgeru se při čtení jednou odescapuje a při skládání záznamu jednou escapuje, takže digest je nad textem, který člověk napsal, a uvozovka uvnitř rozhodnutí záznam ani neusekne, ani nezmění jeho identitu. Řádek, jehož text nese značku přepisu, nedá žádný záznam; deriver jej hlásí jako přeskočený místo zápisu záznamu, který by kontrola integrity odmítla. Žádná síť, žádný model, žádné eval.
Slovník odkazů získává task:<id>; question:<id> se odmítá. Vzor derived_from v protu připouští decision, session, commit, issue, file a test. Rozhodnutí nemá v ledgeru vlastní identitu — decision.recorded nese úlohu a text — takže odkazem je decision:<task-id>, jak ho už používá komentář samotného protu a provenience ADR 0010. Ani otázka nemá identitu a řeší ji její úloha, takže vzor získává task a nic jiného. Rozhodnutí zaznamenané mimo úlohu se odvozuje jen z relace; decision:none a task:none se jako odkazy odmítají, protože odkaz na nic není odkaz. Soubor proto se mění; schéma a allow-list se regenerují, nikdy neupravují.
Běží, když se epizoda uzavře a když je konverzace zhuštěna, z důvodu checkpointu. To jsou okamžiky, kdy to, co epizoda ví, přestává být dosažitelné. Cesta uzavření je jedna: mj_session_close v lib/session.sh spustí derivera poté, co je záznam relace publikován a než se připojí session.closed, kdykoli session.knowledge_on_end není vypnuto, takže po každém uzavření — adaptéru konce poskytovatele, majordomus session close, jakémkoli budoucím volajícím — následuje jeho řádek knowledge.derived a nikdy uzavření bez něj. Adaptér konce čte výsledek uzavření a hlásí selhání odvození přes mj_capture_session_failed; neodvozuje podruhé. Adaptér compaction nemá uzavření, na které by se mohl zavěsit, takže volá derivera sám, přepínaného session.knowledge_on_compact a nezávislého na checkpoint_on_compact: compaction, která přeskočí svůj checkpoint, stále odvozuje. Běží bez ohledu na to, zda je úloha aktivní: životní cyklus patří epizodě. Na vyžádání majordomus knowledge derive [--episode <id>] dělá totéž pro otevřenou epizodu nebo tu pojmenovanou. Druhý běh nad stejnými důkazy nic nezapíše a řekne to, na příkazové řádce i v knize.
Důkazem, že proběhla, je řádek v knize záznamů, zaregistrovaný před zápisem. knowledge.derived nese epizodu, počet zapsaných, počet nezměněných, zapsané cesty a, když byl řádek odmítnut, počet přeskočených; knowledge.promoted a knowledge.rejected nesou id a co bylo provedeno. Odvození, které selže uvnitř hooku poskytovatele, se zaznamená jako provider.event.failed přes mj_capture_session_failed a hook skončí s 0: poskytovatel není nikdy blokován a selhání není nikdy tiché.
Další pracovník se to dozví. Úvodní briefing (ADR 0017) získává jednu omezenou sekci, po otevřených otázkách a před předávkou: kandidáti čekající na posouzení na této větvi, počet na jednom řádku a id pod ním, omezené tak, jak je blok otevřených otázek, uvnitř session.briefing_budget_lines. Větev kandidáta je větev epizody, kterou jmenuje v derived_from, čtená ze sledovaného záznamu relace, nebo dokud není tento záznam zapsán, z knihy. Kandidát, jehož epizodu tento checkout nedokáže rozlišit, je jmenován na vlastním řádku jako nepřiřazený, ne skryt, protože záznam, který briefing nedokáže zařadit, je stále záznam, který někdo musí posoudit. Nepřítomnost se vypíše, ne vynechá.
Vynucování tvoří tři pravidla standardního balíčku, rozeslaná z registru doktríny, a nejsou to projektová pravidla. Zadání žádalo projektová pravidla. lib/doctor.sh v každém repozitáři odmítne validační funkci, kterou nedeklaruje žádné pravidlo z efektivní sady toho repozitáře, a majordomus init osazuje repozitář pouze vendorovaným standardním balíčkem. Validátor deklarovaný pravidlem pod .ai/repo/rules/project/ by tedy zčervenal doctor v každém jednorázovém testovacím repozitáři i u každého adoptéra, s čímž se potkalo ADR 0052 a vyřešilo to dodáním majordomus.lifecycle-observed v share/standard/majordomus/rules/. Stejná odpověď platí ze stejného důvodu: deriver se dodává s nástrojem a běží v hookách každého adoptéra, takže pravidlo, že stále zapisuje, patří dodavateli, ne jednomu repozitáři. Dodaný manifest zapisuje scripts/rules-package write, vendorovaná kopie pod .ai/repo/rules/vendor/ se obnovuje pomocí majordomus rules vendor update a ani jedno se needituje ručně.
majordomus.knowledge-observed, blokující,mj_validate_knowledge_lifecycle, dispečovaná zdoctorawatch, kategorieknowledge, exit 10. Nález: nejnovější řádeksession.closedjmenuje epizodu, kterou nejmenuje žádný řádekknowledge.derived, a je starší nežsession.freshness.stale_minutes; nebo jesession.knowledge_on_endzapnuto a zdroj životního cyklu nikdy nevolá deriver, čteno ze zdroje tak, jak ho čtemj_validate_doctrine_wiring. Posouzení je podmíněno tak, jak podmínilo vlastní ADR 0052: checkout, jehož ledger neobsahuje žádný řádekknowledge.derived, se neposuzuje a hlásí to jako přeskočení, protože v den, kdy toto rozhodnutí přistane, má každý checkout uzavřené epizody a žádný neodvozoval, a nález, který je najednou všude červený, je nález, který nikdo nečte. To, co gate nechává neposouzené, je přesně jeden případ, checkout, na kterém deriver nikdy neběžel, a první derivace ho ukončí. Reprodukce nálezu je jen pro čtení,majordomus historyfiltrované na dvě události; náprava,majordomus knowledge derive --episode <id>, následujefix:ve zprávě. Čtečka v Rustu,knowledge_base.status, činí z téhož ledgeru a týchž čísel politiky polovinu posouzení týkající se čerstvosti; polovina zapojení patří jen shell validátoru, protože jen shell nástroj umí číst svůj vlastní zdroj.majordomus.knowledge-integrity, blokující,mj_validate_knowledge_integrity, spouštěno zcheckadoctor. Každý záznam podcandidates/acurated/je platný vůčiknowledge/v1bez neznámého klíče, id jsou jedinečná napříč oběma adresáři a rovna názvu souboru,verifiednese původ, každý cílderived_fromarelationsse rozpozná,supersededjmenujesuperseded_bynebo zaznamenává své zamítnutí, žádný záznam podcandidates/netvrdíverifieda žádný název, popis ani tělo nenese konverzaci. Validátor čte oba adresáře jednou a rozpoznává každý odkaz jedním průchodem knihou a jedním dávkovým dotazem na git, takže jeho cena roste s úložištěm, ne se součinem záznamů a odkazů.majordomus knowledge checkje tatáž kontrola jako příkaz.majordomus.candidates-reviewed, poradní,mj_validate_knowledge_accumulation, dispatchovaná zdoctor. Politika deklarujeknowledge.candidates_max_filesaknowledge.candidate_max_age_minutesjednou; více kandidátů než strop, kandidát, jehož stáří revize překročí limit, nebo kandidát, který strom nesleduje, jeWARN, který je jmenuje. Stáří revize je stáří položky fronty, ne důkazu: měří se od nejstaršího řádkuknowledge.derived, jehož cesty soubor jmenují, pak od commitu, který soubor přidal, a teprve potom oddatezáznamu, a nález říká, který zdroj použil, protožedateje den důkazu a kandidát odvozený dnes z minuloměsíčního rozhodnutí čekal jeden den, ne měsíc. Nesledovaný kandidát se jmenuje, protože záznam, který git nedrží, nenajde nic a nikdo ho neposoudí. Je poradní, protože zda si kandidát zaslouží revizi, je úsudek člověka; dispatchuje se jen zdoctor, protože podwatchje poradní nález drift a končí kódem 11, a plná fronta revizí nesmí shoditwatch. Politika, která nedeklaruje ani jeden klíč, se hlásí ve třídě samotného pravidla, jakomj_validate_retentionhlásí své klíče.
Čtečka v Rustu je jeden modul, deklarovaný jednou, a čte, co zapsal shell. Modul knowledge_base pod apps/majordomus-cli/src/capability/builtin/ deklaruje knowledge_base.candidates, knowledge_base.record a knowledge_base.status a majordomus generate je promítá do HTTP, OpenAPI, MCP, příkazové řádky, katalogu modulů cockpitu a inventáře měření výkonu. Id modulu není knowledge, protože registr odmítá vestavěný modul pojmenovaný jako deklarativní druh. Čtečka bere kandidáty z indexu (sledované soubory, jako každý druh), ledger z crate::session::Ledger a prahy z čtení politiky v continuity.rs; žádné z nich neopakuje a netvrdí, že čte lib/capture.sh. Cockpit nedostává ručně psanou stránku: projekcí je položka katalogu modulu a vygenerovaná stránka každé schopnosti (ADR 0012).
Zamítnuté alternativy
Sken checkoutu do typovaných znalostí, s extraktory, kanoničností a baseline tolerovaného dluhu. To je to, co postavilo origin/feature/repository-knowledge. Odvozuje znalosti z manifestů a prózy, což docs/CLI.md odmítá pro každý druh — druh pochází ze struktury, nikdy z prózy — a své podpříkazy deklarovalo v cli.rs místo v blocích capability!, což project.rust-canonical-declaration zakazuje. Jeho soubory baseline a výjimek jsou druhé úložiště klíčované podle id, inventář, který ADR 0053 zamítlo, protože zastará v okamžiku, kdy se branch opustí, a jeho žebříček mode je třetí slovník vynucování vedle blocking | advisory. Jeho přepínač semantic.enabled existuje, aby poskytovatel mohl číst text, což docs/CONTINUITY.md a project.no-network-no-eval odmítají. Jeho pole visibility na záznam dává hranici publikace na každého výrobce, kde ji třída zdroje už kreslí jednou. Přebírá se z něj tvar odpovědi o stavu, nyní knowledge_base.status, a zásada, že klíč politiky znalostí se deklaruje jednou v politice, kostře, schématu a regenerovaném allowlistu. Jméno knowledge derive se zde znovu používá s opačným významem: deterministické, bez modelu, bez sítě.
Kandidáti pod .ai/local/state/, povyšovaní ručně do sledovaného stromu. Deriver by zapisoval tam, kam zapisuje checkpoint, a na žádném jiném stroji by se nic nezměnilo, dokud by si někdo nevzpomněl na příkaz. To je tvar, který pojmenovalo ADR 0014: záznam, který umí číst jen jeden stroj. Review, na které kandidát čeká, by proběhlo na jediném checkoutu, který nelze sdílet, a zjištění zastaveného zapisovače by na každém klonu nic neznamenalo.
Nový druh, knowledge-candidate, s vlastním schématem. Kandidát a ověřený záznam se liší v jednom poli, status, které stávající schéma už nese. Druhý druh by potřeboval druhé schéma, druhý seznam povolených, druhou třídu a druhou sadu čtenářů kvůli rozlišení, které udělá jeden enumerátor. ADR 0010 i project.no-new-nouns to zamítají.
Odvozovat z Next Action předávky nebo z těla checkpointu. Obojí jsou odvozené projekce téhož ledgeru a Next Action říká, co dělat, ne co je pravda. Odvozovat znalosti z odvozeného záznamu by dostalo do sledovaného stromu projekci projekce, s původem ukazujícím na soubor pod .ai/local/.
Klasifikovat rozhodnutí podle jeho formulace. Seznam slov, který mění never na constraint, čte prózu, aby určil druh, což kompilátor znalostí z principu odmítá, a mýlí se dost často na to, aby byl horší než žádná odpověď: rozhodnutí, které říká „starou podobu už nepotřebujeme“, nese no a nikoho nezavazuje. Deriver zapisuje convention; třídu zapisuje člověk, který záznam povyšuje, s důkazem vedle ní.
Odvozovat z koncového adaptéru místo z uzavření. První návrh dal volání do mj_capture_session_end, po checkpointu a před předávku. Pak by majordomus session close zadané člověkem a každý budoucí volající uzavření uzavřel epizodu bez odvození a nález zastaveného zapisovatele by byl červený pro uzavření, které adaptér nikdy neviděl. Uzavření je jediná cesta, kterou jde každé uzavření, takže tam deriver běží; adaptér si ponechává hlášení o selhání, což je jeho úloha.
Jedinečné názvy souborů přes mj_publish_record. Atomický zapisovač, který používá každý lokální záznam, připojuje náhodnou příponu a nikdy nepřepisuje, takže opakovaný běh by zapsal druhý soubor se stejným obsahem. Idempotence potřebuje soubor pojmenovaný id, zapsaný přes dočasné jméno ve stejném adresáři a přejmenovaný přes starý. Prefix .tmp. ho drží pod stávajícím pravidlem ignorování a stávajícím úklidem.
question:<id> v derived_from. Otázka nenese v účetní knize žádnou identitu; vymýšlet digest, který by na ni odkazoval, by byl odkaz, který nic jiného ve vrstvě nedokáže vyřešit. Otázku řeší úloha, která ji vlastní.
Měření stáří kandidáta z jeho date. Datum je den důkazu, uchovaný kvůli determinismu. Validátor, který by ho četl jako stáří ve frontě, by označil kandidáta odvozeného dnes ráno za čtrnáct dní po termínu, protože rozhodnutí, které zaznamenává, padlo před dvěma týdny. Záznam ve frontě má vlastní stáří, v ledgeru i v gitu, a to se měří.
Pravidla projektu deklarující validátory. Výše zamítnuto z mechanického důvodu: doctor by v každém adoptujícím a každém testovacím repozitáři hlásilo validátor, který žádné pravidlo nedeklaruje, a naplnění pravidel projektu ze skeletu by vložilo pravidla cizího repozitáře do jmenného prostoru projektu.
Vyhrazená stránka cockpitu. Stránka je ručně psaná route (cockpit/mod.rs), oblast navigace a položka v průchodu stránek; deklarace už dává položku katalogu a stránku na každou schopnost. Stránku lze přidat, když ji člověk potřebuje; nic v tomto rozhodnutí na ní nezávisí.
Důsledky
Každá hranice epizody, která zaznamená rozhodnutí, vyřeší otázku nebo dokončí úlohu, zanechá kandidáta ve sledovaném stromu a řádka účetní knihy knowledge.derived to říká, i když nic nezapsala. Strom je po takové epizodě nečistý, dokud člověk nepřidá kandidáty vedle záznamu relace, což stávající zjištění session už žádá a doporučující pravidlo nyní jmenuje; kandidát je commitovaný obsah a changed_files dalšího checkpointu jej uvádí, jako uvádí záznam relace.
Zastavený zapisovatel znalostí je hlášen doctor a watch v tomto repozitáři i u každého adoptujícího, se stejnými prahy, jaké používá předávka; repozitář, v němž se žádná epizoda neuzavřela nebo v němž nikdy neběžel žádný derive, se neposuzuje a říká to. Nález porovnává epizody, ne časová razítka, protože uzavření derivuje dřív, než připojí session.closed, takže řádek knowledge.derived epizody předchází jejímu řádku session.closed v pořadí ledgeru.
majordomus knowledge už není pouze pro čtení. share/commands.yaml to říká, docs/CLI.md to říká a jeho návratové kódy pokrývají každou konstantu, kterou lib/knowledge.sh používá. Kompilátor grafu čte front matter záznamu znalostí, takže jeho id uzlu je na obou stranách knowledge:<id> a knowledge edges --type derived_from uvádí, z čeho záznam vznikl; cíl, který může vyřešit jen ledger nebo git, je pro graf externí a řeší jej místo toho validátor integrity, nikdy jej kompilátor nehlásí jako visící.
Cena se měří tam, kde se platí: MJ_TIMING=1 majordomus knowledge derive --dry-run vypisuje vlastní čas deriveru, MJ_TIMING=1 majordomus knowledge check vypisuje čítače validátoru a majordomus doctor hlásí svůj rozpočet jako u každé doktríny. Politika získává čtyři klíče, deklarované jednou a čtené shellem i čtečkou v Rustu ze stejného souboru.
Co toto rozhodnuje, nerozhoduje, kteří kandidáti si zaslouží povýšení. To zůstává aktem člověka a informativní pravidlo existuje proto, aby byla fronta vidět, ne aby ji stroj vyprázdnil.
Dodatek, 2026-10-15: epizoda trunku stageuje své záznamy a nese je větev (I1984)
Kmen, který se mění jen přes pull requesty, nemůže commitnout to, co tam zapisuje hranice epizody. main v OSCILLA drželo nesledované .ai/repo/knowledge/candidates/, které nikdy nemohlo commitnout: každý další kontrolní bod zaznamenal strom jako špinavý, kontroly release s čistým stromem odmítaly a candidates-reviewed žádalo přesně ten commit, který proces zakazuje. Záznam relace z ADR 0014 pod .ai/repo/sessions/ má stejnou vadu.
Na trunku hranice epizody zapíše záznam uzavřené relace a odvozené kandidáty do .ai/local/state/outbox/ místo do sledovaných sekcí. Trunk je výchozí větev remote, jak ji čte mj_git_trunk_ref; žádný název větve se zde nepíše. Příští hranice epizody na jakékoli jiné větvi téhož klonu přesune outbox do .ai/repo/sessions/ a .ai/repo/knowledge/candidates/ beze změny a pull request té větve je donese na trunk. Id záznamu se odvozuje z jeho důkazů, takže přesun je idempotentní a dva klony držící tentýž záznam zapíšou stejné bajty. context a doctor jmenují neprázdný outbox, takže klon, který už nikdy nevětví, stále říká, co drží.
ADR 0014 a tento záznam zůstávají pravdivé: každý záznam stále skončí sledovaný, sdílený a posuzovatelný a jen okamžik, kdy se stane sledovaným, se přesouvá z trunku na větev, která bude sloučena. Zamítnuto: přeskočit odvození na trunku (ztratí rozhodnutí a poučení, která epizoda zaznamenala), zapisovat sledované soubory a smířit se se špinavým trunkem (nahlášená vada) a ignorovat sledované sekce na trunku (odporuje sledované smlouvě).
Práce se skládá ze tří řezů, každý jedním pull requestem:
- Epizody trunku zapisují do outboxu.
lib/common.shzískámj_on_trunk;lib/session.sh(close) alib/knowledge.sh(derive) zapisují do.ai/local/state/outbox/{sessions,candidates}/, když platí. Případtrunk_stays_clean_case: ve fixture, jejíž výchozí větev remote jemain, uzavření epizody namainnechágit status --porcelainprázdné a outbox drží záznam. - Epizoda větve vyprazdňuje outbox. Na hranici epizody na větvi, která není trunk, se záznamy z outboxu přesunou do sledovaných sekcí;
contextadoctorhlásí neprázdný outbox. Případ: příští epizoda větve outbox přesune a kandidát je nabídnut příkazemknowledge candidatesjako dnes. - Slova následují.
docs/KNOWLEDGE.md, text pravidlacandidates-reviewedvshare/standard/majordomus/rules/a README relací říkají, kde záznamy epizody trunku čekají. Pouze dokumentace a text pravidel.