30. Úloha dluží povinnosti a důkazy, které je splní, zastarávají
Kontext
finish už odmítá. Rozesílá registr doktríny a repozitář vybírá, které řádky platí, přes verification.finish_requires, takže kontrakt jsou data, ne seznam v shellu. Vybrané řádky pokrývají pracovní strom: dotčené soubory leží v rozsahu úlohy, ověřovací příkaz běžel a skončil nulou, větev a head stále odpovídají záznamu, žádná otázka není otevřená, existuje poznámka se sekcemi, které její výsledek vyžaduje.
Každý závazek za pracovním stromem chybí. Nic v kontraktu neví, zda byla práce commitnuta, zda commit dosáhl remote, zda ho trunk obsahuje, zda byly generované projekce aktuální ve chvíli, kdy byla úloha prohlášena za hotovou, zda byl web publikován, zda bylo cokoli nasazeno, nebo zda se na nasazené věci někdy někdo podíval. share/events.yaml nemá událost pro publikaci ani nasazení. Worker může splnit každý řádek kontraktu a nechat práci na notebooku.
Části, které by na tyto otázky odpověděly, už existují a nejsou spojeny.
plan je model povinností, o úroveň výš: úkol deklaruje evidence_required, důkazy se zaznamenávají s příkazem nebo artefaktem, protože vyprávění není důkaz, a plan done odmítne, dokud je token nedokázán. usecase run je engine důkazů o provedení, jehož výstup je normalizován tak, aby dva běhy jednoho scénáře byly bajtově identické. usecase impact už počítá, které scénáře a případy změna ukládá workerovi znovu spustit, a project.use-case-evidence už písemně uvádí, že se to musí stát před finish — věta, která nedeklaruje žádný validátor, a proto nikoho nezavazuje. scripts/pages verify dotazuje publikovaný web, dokud neobsluhuje očekávaný commit; nikdo ho nevolá a nezapisuje žádný záznam.
Hlubší mezerou je zastarávání. Důkazy usecase nenesou žádný head ani hash vstupu. Důkazy plan razítkují commit, který nic nepřepočítává. Důkaz tedy, jakmile je zaznamenán, platí navždy, což je totéž jako nekontrolovaný: výsledek testu, který nemůže zastarat, je tvrzení o minulosti vydávané za tvrzení o přítomnosti.
Repozitář přesně tento problém už jednou vyřešil, pro web. Generátor webu hashuje explicitní seznam souborů, které čte, zapisuje hodnotu do odvozených dat jako source_hash a pages current ji přepočítá a porovná, přičemž selže s oběma hashi a příkazem opravy. Tento mechanismus je zapojen do git hooku a doctor dokazuje, že hook nespolkne svůj exit kód. Je to tvar, který zbytku důkazů v tomto repozitáři chybí.
Rozhodnutí
Povinnost je pole na úloze a důkazem je událost v knize nesoucí hash toho, nad čím byl pořízen.
requires: [...]stojí vedlescope: [...]v záznamu úlohy. Rozsah je slib omezení — kam smí pracovník zapisovat.requiresje slib doručení — co pracovník dluží, než je výsledekcompleteddostupný. Názvy tokenů jsou data vshare/obligations.yaml, vedleshare/events.yaml, nikoli řetězce v shellu.- Důkazy jsou
task.evidencev knize, ne nové úložiště. Kniha už je jen přidávací, uspořádaná, kontrolovaná na integritu a její obálka už nese head, větev a relaci. Událost přidává, co musí: který závazek pokrývá, jak byla pořízena a hash vstupů, nad nimiž byla pořízena. - Zastaralost je přepočet, ne časové razítko. Validátor znovu zahashuje deklarované vstupy závazku a porovná je a rozdíl hlásí toutéž zprávou se dvěma hashi, kterou vypisuje
pages current. Zaznamenaný head se označí proti aktuálnímu pomocímj_git_label, jehož čtyři hodnoty — exact, advanced, diverged, different_context — jsou jediným slovníkem zastaralosti repozitáře. Pátý slovník se nevymýšlí. - Cesty splnění jsou příkazy, které už existují. Git odpovídá na commit, push a obsažení v trunku.
generate --checkapages currentodpovídají na generovanou aktuálnost.pages verify --commitodpovídá na publikaci a jeho použití zde je první volající, jakého ten mechanismus kdy měl.usecase impacta případy, které jmenuje, odpovídají na testy, čímž splňují větu, kterouproject.use-case-evidencenebyl schopen vynutit. - Jedno pravidlo, rozeslané tam, kde ostatní.
majordomus.obligation-closure, blokující, validátorobligations, vynucovanécheckafinish, vybírané klíčem politiky jako každá jiná řádka kontraktu. Přeskakuje se pro jiné výsledky nežcompleted, přesně jako řádky ověření a profilu: blokovaná úloha není nepoctivá. - Důkaz propojení získává směr.
doctorjiž dokazuje, že každá deklarovaná doktrína se rozlišuje na validátor a že žádný validátor neběží bez pravidla. Stejný důkaz získávají závazky: každý token jmenuje dosažitelnou kontrolu a každá kontrola je dosažitelná z tokenu.
Zamítnuté alternativy
Manifest relace. Mandát, který k tomu vedl, o něj žádal. Relace v tomto repozitáři nic nebrání z návrhu — nenárokuje si cesty, nedrží akceptaci a je volitelná — a její uzavřený záznam je odvozen z účetní knihy právě proto, aby neexistoval druhý měnitelný účet týchž událostí. Manifest by byl tímto druhým účtem a nechat relaci odmítat akceptaci by obrátilo důvod, proč byl tento pojem oddělen od task. Povinnost patří věci, která už slibuje, už má typovaný výsledek a už odmítá.
Soubor s checklistem na relaci. session_checklist.yml s update_cli: true je inventář, který nikdo neaktualizuje; tento repozitář strávil několik rozhodnutí odstraňováním přesně tohoto tvaru a audit, který toto ADR vyvolal, našel sousední codebase, kde se takové inventáře rozešly o faktor tři, přestože tvrdily, že jsou generované.
Rozšíření session close na výsledky úloh. Přijímá closed a interrupted. Naučit je completed a blocked by dalo repozitáři dva slovníky výsledků pro jednu myšlenku a validátor záznamu relace už odmítá relaci, která tvrdí víc, než může vědět.
Nové úložiště důkazů pod .ai/local/. Jedno existuje pro případy užití a není sekcí manifestu. Přidání druhého neregistrovaného úložiště pro důkazy uzavření by tuto chybu zopakovalo, nikoli opravilo.
Důsledky
Úloha, která nedeklaruje žádné requires, se chová přesně jako dnes, takže je to opt-in na úlohu a na repozitář přes klíč politiky. Úloha, která deklaruje povinnosti, nemůže dosáhnout completed pouhým tvrzením. Důkazy pořízené před změnou po ní už nepočítají, což bude nepohodlné právě v případech, kde by mělo.
Vnější závazky — publikace, nasazení, ověření — jsou ty, které notebook sám nedokáže dokázat. Jejich důkazy jmenují vzdálený fakt a čas a poctivým hlášením pro úlohu, která nedosáhla trunku, je blocked by, ne pass.