98. Uvažování je nezávislé na poskytovateli, poradci jsou volitelní a review je zaznamenaný fakt, ne tvrzení
Kontext
Vlastníkův pracovní protokol pro závažnou technickou nejistotu zněl „prozkoumat lokálně, zeptat se ChatGPT, pak Gemini nebo Codexu, syntetizovat, pokračovat“. Žil v soukromých poznámkách jednoho pracovníka a v pomocném skriptu v scratchpadu relace: nic v repozitáři o něm nevědělo, nic nezaznamenávalo, co poradce řekl, a nic nedokázalo odlišit proběhlou revizi od tvrzené. Byl také zapsán jako posloupnost názvů dodavatelů. To je tvar, který se rozbije, když CLI není nainstalováno, chybí klíč nebo neběží démon: každý krok jmenuje něco, co může chybět.
Odpověď omezují čtyři platná rozhodnutí. ADR 0024 vyčerpalo slovo poskytovatel na klientské nástroje, které v tomto repozitáři pracují (share/providers.yaml). ADR 0049 učinilo katalog modelů deklarativním a jeho strany nazvalo vendory. ADR 0032 drží HTTP klienty, TLS a async runtime mimo majordomus-cli; síťové transporty žijí ve vrstvě Node pod scripts/lib/. ADR 0067 umožnilo propojeným runtime meshe žádat o revize a odpovídat na ně.
O návrhu byli před sestavením konzultováni dva nezávislí recenzenti (záznamy jsou v relaci, která jej sestavila). Jeden odpověděl obecně; druhý našel rozhodující vadu v prvním konceptu: připustit konzultaci jen tehdy, byl-li její poradce dostupný v době záznamu, činí nepřípustnou odpověď, která dorazí poté, co jiné selhání otevřelo okruh poradce. Připuštění nyní čte snímek dostupnosti plánu, který požadavek rozeslal.
Rozhodnutí
Uvažování není poskytovatel. Čistá politika (crate::reasoning::policy) rozhoduje, zda vyslovená nejistota zaslouží nezávislou revizi, kolik režim uvažování dovoluje a které schopnosti revize potřebuje. Nejmenuje žádného poradce. Test a reasoning.check na každém doctor drží, že žádný zdrojový soubor nezávislý na poskytovateli žádného nejmenuje.
Poradci se deklarují jednou, odkazem. share/advisors.yaml deklaruje poradní role: transport (api, cli, local_runtime, peer), adaptér, který jím mluví, spustitelný soubor, jehož přítomnost říká, že je nainstalován, a poradní schopnosti. Poskytovatel, dodavatel a model jsou odkazy do dvou existujících tabulek a odkaz, který nevede nikam, je nález. Pořadí deklarace je pořadí preferencí; „nejdřív ChatGPT“ jsou data. Propojené mesh runtimy s funkcí reviews se za běhu stávají poradci ze stejné deklarace.
Nepřítomnost je stav. Dostupnost se odvozuje z přítomnosti (spustitelný soubor v PATH, proměnná s přihlašovacími údaji nastavená — její hodnotu crate nikdy nečte), z režimu (offline připouští jen poradce na tomto stroji, ci žádného), z explicitního seznamu zákazů a ze zaznamenaných výsledků dřívějších konzultací: dvě přechodná selhání otevřou okruh poradce na dobu ochlazení, limit četnosti na dobu vlastní, selhání autentizace na hodinu a poradce se poté vrátí jako recovering. Žádný poradce není běžným plánem: politika pak vrátí strukturovanou lokální revizi, kterou místo toho provede relace, a reasoning se hlásí jako funkční. Nic na vstupní cestě, v doctor, v CI ani při bootu nekontaktuje model.
Review je záznam, přijatý podle pravidel. Jeden zapisovatel, reasoning.record, ukládá typované záznamy pod .ai/local/state/reasoning/<task>/ (stav checkoutu, ADR 0005): posouzení, plán, konzultace, nesouhlas, řešení, závěr, validace, pokus. Podstatné posouzení musí nést důkazy. Zapisovatel plán vypočítá z dostupnosti daného okamžiku a nikdy ho nepřijme. Konzultace musí jmenovat poradce, kterého její plán vybral. Dokončená konzultace nese normalizovaný závěr a selhaná žádný. Nesouhlas se řeší řešením, které cituje důkazy; závěr je odmítnut, dokud je nevyřešený nesouhlas k jeho posouzení, musí zvážit každou odpověď, kterou jeho posouzení obdrželo, a jeho počet review se vypočítá. Žádné pole nedovolí volajícímu tvrdit, že review proběhlo, a žádná cesta nepřemění počet souhlasících poradců v rozhodnutí.
Transport je mimo crate. scripts/lib/advisors/ drží jeden adaptér na transport za jedním kontraktem (typovaná selhání: timeout, rate limit, autentizace, malformed, prázdný, nedostupný, zrušený), driver, který se konzultuje souběžně a vrací výsledky v pořadí plánu, a scripts/advisor-consult, které zaznamená plán, konzultuje a zaznamená každý výsledek přes crate. Sada kontraktu spouští každý adaptér proti fakes.
Relace jej nese. reasoning.status odvozuje stav, časovou osu a zprávu jen ze záznamů. majordomus context tu zprávu ukazuje, handover --derive ji nese a pozdější posouzení téhož subjektu znovu použije platný závěr místo nového dotazu, pokud nedeklaruje nové důkazy. Snímek prostředí, doctor, stránka Reasoning v Cockpitu, HTTP a MCP promítají tytéž schopnosti. Každý profil provádění deklaruje svůj režim uvažování.
Zamítnuté alternativy
- Přepínač poskytovatele ve workflow (
if gemini … else if codex …). To je vada, která se opravuje: správnost by závisela na kardinalitě a pojmenování. - Většina nebo kvorum. Shoda je důkaz o shodě. Počet, který rozhoduje, je způsob selhání, který návrh existuje, aby učinil nereprezentovatelným.
- Síťový kód v cratu. Zamítá to ADR 0032 a důvody platí dál.
- Živé sondování při vstupu. Přidalo by síťovou latenci a selhání sítě ke každému
cd. Přítomnost je levná a upřímná o tom, co měří, a selhání se zjistí dotazem a zaznamená. - Ukládání přepisů. Jsou velké, možná soukromé a nejsou tím, co pozdější relace potřebuje. Normalizovaná pole se ponechávají; surové odpovědi ne.
- Zapisovat každý závěr jako ADR. Většina závěrů je vázána na úlohu. Jeden povýší na ADR, když mění architekturu, aktem člověka.
Důsledky
- Majordomus uvažuje, plánuje, zaznamenává, implementuje a validuje bez nainstalovaného poradce; cesta bez poradce je cvičena testovacím případem, ne jen tvrzena.
- Přidat poradce je jedna položka v
share/advisors.yamla pro nový transport jeden adaptérový modul; následuje každá plocha a nic jiného se neupravuje. - Přihlašovací údaj, který je přítomen, ale chybný, se zjistí při prvním dotazu, zaznamená se jako
auth_faileda poradce zůstane vyloučen hodinu místo opakovaných pokusů. - Počet review rozhodnutí je fakt o záznamech. Relace si nemůže nárokovat review od poradce, který byl nedostupný nebo se ho nikdo nezeptal.
- Co zůstává mimo: crate nemůže vědět, zda poradce odpovídá, dokud se někdo nezeptá, a transportní vrstva je Node vrstva tohoto repozitáře bez devDependency, ne součást nainstalované binárky, jak ADR 0032 už říká o své sourozenecké.