Co to znamená
Šest z jedenácti tokenů povinností jmenuje fakt, který žije mimo pracovní strom: commit, push, target, pages, deploy, verify. Dokud toto nepřistálo, všech šest se splnilo stejně — člověk něco spustil, nebo řekl, že spustil, a napsal majordomus evidence --covers push --command 'git push'. Kniha držela větu. Git držel odpověď a nikdo se ho neptal.
Čtyři z šesti se nyní zjišťují místo zaznamenávání:
| token | fakt | jak se urovnává |
|---|---|---|
commit | změny úlohy jsou v historii větve, ne v pracovním stromu | žádná cesta v rozsahu úlohy není špinavá a HEAD se posunul za commit, z něhož úloha začala |
push | head větve existuje na remotu, který sleduje | vzdálený sledovaný ref dosáhne HEAD |
target | výchozí větev repozitáře dosáhne commitu | refs/remotes/<remote>/HEAD dosáhne HEAD |
pages | publikovaný web servíruje tento commit | scripts/pages verify --timeout 0 — jedna sonda dokumentu identity, který web publikuje |
deploy a verify zůstávají zaznamenávány ručně a slovník říká proč jedním řádkem, místo aby to čtenář musel odvozovat.
Stanovený závazek se splní tím, že je pravdivý, a odmítne tím, že je nepravdivý. Zaznamenání důkazů pro něj nemá v žádném směru účinek: řádek task.evidence tvrdící push o větvi, kterou remote nikdy neviděl, nepřežije střet s git.
Princip
share/obligations.yaml dává každému tokenu established_by — git, příkaz nebo none. Token, jehož hodnota je none, musí nést také unestablished, jednu řádku říkající, proč to tady nic nemůže rozhodnout; behaviorální případ selže, pokud token deklaruje jedno bez druhého, v obou směrech, protože token deklarovaný jako prokazatelný, k němuž není nic, co by ho prokázalo, by jinak prošel tiše.
mj_validate_obligations v lib/evidence.sh se nejprve zeptá mj_obligation_establish. To dispatchuje na mj_obl_est_<token>, které skončí 0 prokázáno, 1 vyvráceno nebo 2 nerozhodnutelné — nic v tomto checkoutu to nedokázalo rozhodnout. Pouze třetí případ čte ledger a chová se pak přesně tak, jako před existencí této kontroly.
Nic se nestahuje. Tokeny gitu čtou remote-tracking refy tak, jak jsou, protože validátor, který by při každém check sahal na síť, by učinil diagnostiku závislou na konektivitě. Čtení je bezpečné ve směru, na kterém záleží: tracking ref nemůže obsahovat commit, který remote nikdy nedostal, takže zastaralý ref může říct jen „ještě ne“, když je odpověď „ano“ — nikdy naopak.
pages volá sondu, která už existovala. scripts/pages verify od doby, kdy vznikla rychlá cesta pro Pages, dotazuje identifikační dokument publikovaného webu na commit, který pojmenovává, a Pages workflow byl až dosud jejím jediným volajícím. Dvě věci ji udělaly volatelnou z validátoru: --timeout 0 je jediná sonda, protože smyčka čte web dřív, než se podívá na hodiny; a každá sonda je nyní omezena --max-time, takže nedostupný hostitel stojí známý počet sekund. Také nyní rozlišuje své dvě selhání. Web, který odpoví a pojmenuje jiný commit, je zamítnutí, exit 10 — tato práce není publikována. Web, který neodpověděl nikdy, nebyl změřen, exit 12 — kontrolu nebylo možné provést a notebook bez sítě nesmí být schopen shodit úlohu, kterou nevidí.
Proč je živé, a ne zaznamenané
Obojí je obhajitelné a alternativu stojí za to uvést. Řádek účetní knihy zaznamenává, kdy fakt platil, což chce vědět ten, kdo o měsíc později audituje historii, a drží jeden mechanismus místo dvou.
Živé vítězí v argumentu, na němž celý tento subsystém stojí. Kniha závazků existuje, protože záznam přežije to, co popisoval, a lék, který všude jinde používá, je přepočet, nikdy časové razítko: mj_obligation_inputs_hash přepočítává, source_hash webu přepočítává. Git fakt se přepočítá v milisekundách a je vždy tvrzením o současnosti. Jeho zaznamenání by vyrobilo přesně to zastarání, které měl tento subsystém odstranit, a pak by potřebovalo mechanismus zastarání, aby je zase odstranil — okliku, jejímž jediným produktem je okno, v němž se záznam a repozitář rozcházejí.
A hlavní kniha už drží to, co worker udělal: každé start, checkpoint, evidence a finish v ní je, s headem, větví a relací v obálce. Není to místo, kde si nástroj zapisuje to, co si může dohledat. Ručně zaznamenaný fakt o remote je také jediný druh důkazu, v němž se worker může mýlit ve směru, který mu lichotí.
Disciplína zastaralosti je zachována, ne zahozena. Fakt zjištěný zde je z konstrukce brán na HEAD, což je mj_git_label exact, a exact je slovo, které nález říká. advanced, diverged a different_context si na záložní cestě zachovávají svůj význam. Nebyl vymyšlen žádný pátý slovník.
Jak to vidět
majordomus check
# OK obligation commit — exact: the tree is clean and 1bcd0b3790c5 carries the task's changes
# OK obligation push — exact: origin/master contains 1bcd0b3790c5
# OK obligation target — exact: origin/master reaches 1bcd0b3790c5
git commit -qm 'one more'
majordomus finish --outcome completed --note done
# FAIL obligation push — no remote-tracking ref reaches 9c8a74105c8c; the commit has not
# reached the remote
# FAIL obligation target — origin/master does not reach 9c8a74105c8c; the work is not on
# the trunk
majordomus evidence --covers push --command 'git push' # recorded, and it changes nothing
majordomus finish --outcome completed --note done
# FAIL obligation push — no remote-tracking ref reaches 9c8a74105c8c; ...Co nepokrývá
deploy a verify stále splňuje záměrně člověk. majordomus deployment čte deklarovaný objekt nasazení a nekontaktuje nic — žádná schopnost v apps/majordomus-cli/src/capability/builtin/deploy.rs nesahá k poskytovateli, což je pravidlo onoho modulu, ne přehlédnutí — a objekt, který čte, je deklarovaný, ne běžící, takže není na koho se ptát. Kontrola, která by vždy prošla, by byla horší než mezera, která je zapsána.
Ani lokální tokeny nejsou zjištěny. tests by šlo rozhodnout jen spuštěním suite, což by způsobilo, že check stojí tolik co test/run.sh. generated by šlo rozhodnout pomocí majordomus generate --check asi za dvanáct sekund a docs pomocí scripts/ci/reference-check; ani jedno není napojeno, protože nebylo rozhodnuto, co smí diagnostika utratit při každém vyvolání. Obojí to říká v unestablished, kam tento repozitář umisťuje mezeru, kterou neuzavřel.
Zavedený commit také neposuzuje, zda commitnutá změna je ta, kterou úloha slíbila. To je implementation a je to úsudek, ne fakt.