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.

To, co nástroj ví sám o sobě, se zapisuje jednou a všude jinde se odvozuje; druhá kopie je selhání testu

Číslo, seznam nebo slovník, který se objevuje na dvou místech, se na jednom z nich bude lišit, a ta nesrovnalost je tichá, dokud někoho nestojí odpoledne práce. Proto má každý z těchto faktů právě jeden domov, každý jiný čtenář ho počítá a druhá kopie shodí test.

deklarovaný stavdeklarovaný stav: zaručeno Deklarováno jako deterministické a blokující, implementováno a s uvedeným behaviorálním testem, který to má dokázat. Zda to zaznamenaný běh podporuje, říká verdikt důkazů zobrazený vedle.

zaznamenané důkazyzaznamenané důkazy: nespuštěno Deklarováno jako zaručené, ale nepodložené zaznamenaným během: test je pojmenován, ale žádný úspěšný běh nad současnými vstupy zaznamenán není. jak se zaznamenávají důkazy

Hodnoty politiky nemají výchozí hodnoty na straně čtenáře, stavy tvrzení se deklarují v matici, fixtures webu odvozují své vstupy z generátoru a každý příkaz, doktrína i tvrzení se kontroluje proti seznamu čtenému z dispatch tabulky nebo registru, a ne zapsanému do testu.

Co to znamená

Číslo, seznam nebo slovník, který se objevuje na dvou místech, se na jednom z nich bude lišit, a ta nesrovnalost je tichá, dokud někoho nestojí odpoledne práce. Proto má každý z těchto faktů právě jeden domov, každý jiný čtenář ho počítá a druhá kopie shodí test.

Dnes jsou pokryty čtyři druhy faktů: hodnoty v politice, množina stavů, které může tvrzení nést, vstupy, jež čte generátor webu, a množiny příkazů, doktrín, tvrzení a termínů slovníku, které o sobě nástroj deklaruje.

Princip

Hodnoty politiky nemají výchozí hodnoty na straně čtenáře. mj_pol_req vrátí hodnotu, nebo odmítne a pojmenuje chybějící klíč. Vedle čtečky záměrně není || cap=200: to je druhý zdroj pravdy pro totéž číslo, nic nedrží obě v souladu a čtečka, která dosadí vlastní hodnotu, vynucuje něco, co konfigurace neříká. Doktrína majordomus.policy-completeness odvozuje seznam klíčů skenováním lib/ na volání mj_pol_req, takže klíč se do kontroly dostane tím, že se čte.

Kontrola porovnává celé cesty klíčů, ne poslední segmenty, a není to puntičkářství: checkpoint.retention_max_files a handover.retention_max_files jsou různé klíče s různými hodnotami a porovnání podle konce by hlásilo odchylku mezi dvěma nastaveními, z nichž každé je správné.

Stavy tvrzení jsou data. docs/CLAIMS.yaml je deklaruje pod statuses: v pořadí, v jakém je web prezentuje. Dříve se objevovaly v komentáři v tom souboru, v literálu JSON uvnitř generátoru, ve dvou smyčkách vedle něj a v site-check — pět kopií jednoho uzavřeného slovníku.

Fixtures odvozují své vstupy. scripts/generate-site-data --inputs vypíše kanonické vstupy, které čte, a fixture_repo v test/lib.sh z tohoto seznamu sestaví testovací repozitář. Šest fixtures dříve neslo vlastní seznam kopírovaných souborů; když generátor získal nový kanonický vstup, všech šest zastaralo najednou a pět případů selhalo s „canonical input missing“ na repozitáři, který ten soubor měl.

Kontroly sebepopisu nic nevyjmenovávají. test/cases/28_no_hardcoded_values.sh čte seznam příkazů z dispatch tabulky, doktríny z registru, tvrzení z matice a slovník z tabulky pojmů. Nový příkaz se připojí ke kontrole „musí být odeslán, v usage, zdokumentován v docs/CLI.md a vyvolán nějakým případem“ tím, že existuje.

Jak to vidět

# a policy key the code reads but the policy does not declare
sed -i '' '/builder_budget_lines/d' .ai/repo/policy.yaml
majordomus context
# majordomus: policy is missing required key 'context.builder_budget_lines'

majordomus doctor | grep 'policy '
# ok  policy  11 key(s) — every policy value the code reads is declared, with no reader-side default

scripts/generate-site-data --inputs | wc -l     # what the fixtures copy
bash test/run.sh 28_no_hardcoded_values

Co nepokrývá

Týká se faktů, která nástroj uvádí o sobě, ne každého čísla kdekoli. Řádová hodnota v návrhovém dokumentu, měření jiného repozitáře nebo číslo v příkladu výstupu příkazu je text a text zůstává.

Kontrola slovníku dokazuje, že pojem z tabulky konceptů se objevuje někde jinde v repozitáři. Nemůže dokázat, že se na obou místech používá ve stejném významu.

Nezjistí fakt duplikovaný mezi dvěma soubory, které oba vypadají kanonicky. Pravidlo, které vynucuje, je „odvozuj, neopakuj“, a vidí jen opakování, která umí hledat; každé nové je nové tvrzení.

Proč existuje

Každé selhání, které tento repozitář vyprodukoval, má stejný tvar. Vynucování deklarované v politice a k ničemu nezapojené. Projekce, jejíž hash nikdo neporovnal. Úložiště zapsané a nikdy nepřečtené. Přepínače profilu, které žádný kód nezjišťoval. Commit hlášený jako zelený, který existoval jen v jedné pracovní kopii. Šest testovacích fixtur se šesti kopiemi jednoho seznamu.

Nástroj existuje, aby zachytil deklarováno, ale nezapojeno, takže seznam deklarovaný, ale neodvozený uvnitř nástroje je tatáž chyba v rouše nástroje. Kontrola, která ji najde, nesmí sama nic vyjmenovávat, jinak se stane další kopií.

Pod tím leží druhé pravidlo a je z obou ostřejší: prázdná množina je chyba, ne výsledek. Každý případ tohoto selhání vyprodukoval věrohodnou odpověď místo zastavení. grep -c spočítal tvar a vrátil číslo, které bylo špatně z důvodu, který nikdo neviděl. Porovnání klíčů podle posledních segmentů ohlásilo konflikt mezi dvěma nastaveními, z nichž každé bylo správně. Regex claims-to-responsibility s výchozí hodnotou (?!) nic nezachytil z konstrukce a publikoval stránku bez vlastníka místo selhání. Test runner vypsal 0 passed, 0 failed a skončil nulou, když jeho filtr neodpovídal žádnému případu, takže výběr neexistujícího testu vypadal jako úspěch. Vygenerovaný dokument jmenoval commit, při kterém vznikl, což je rodič commitu, který jej obsahuje, takže byl věčně o jeden pozadu a žádné přegenerování to neopravilo.

Nic z toho neselhalo. Každé vrátilo něco, co vypadalo jako odpověď, a proto přežilo dost dlouho na to, aby se našlo společně. Kontrola, která nerozliší „nic nesedělo“ od „nic nebylo špatně“, není kontrola, a každý seznam, který tento nástroj odvozuje, musí brát prázdné odvození jako vadu odvození.

Oprava nástroje odstraní past pro všechny, a proto je to správné místo pro její opravu. Neodstraní zvyk, který tato selhání také vyžadovala: kontrolovat tvrzení proti stromu, ne proti zprávě o stromu, bezprostředně před jeho vyslovením, ne na začátku práce. Několik výše uvedených případů bylo v dobré víře hlášeno z měření, která byla o hodinu dříve správná. Žádné tvrzení tohle nezachytí.

Vzorek není verdikt. site-probe --quick měří jednu routu na šablonu, což je správné a záměrné: stránky se sdílenou šablonou sdílejí rozvržení. Ale hlásí „ok“ pro navštívené routy a čtenář to bere jako „web je v pořádku“ — jeden běh prošel vzorkem a plný běh pak našel přetečení na stránce, kterou vzorek neotevřel. S vzorkováním nebylo nic špatně; chybělo, aby výsledek řekl, na kterou otázku odpovídá. Kontrola, která měří jen část věci, to musí říct ve svém výstupu, jinak se její „ok“ čte jako tvrzení o celku.

Nestačí ani kontrola samotného stromu. Jednu z těchto chyb našlo CI a lokálně se nedala reprodukovat, protože vstupní globy generátoru se expandovaly v řadicím pořadí toho, kdo je spustil: čistý klon selhávajícího commitu hlásil na stroji vývojáře „in sync“ a na runneru STALE. Commit byl identický a prostředí ne. Tam, kde výsledek může záviset na prostředí, je třeba reprodukovat to prostředí, které rozhoduje.

Detail vykreslený z docs/claims/derived-not-declared.md.

Od tvrzení k důkazu

  1. 1 · veřejné tvrzení

    To, co nástroj ví sám o sobě, se zapisuje jednou a všude jinde se odvozuje; druhá kopie je selhání testu

    Vytvořeno na Deklarovat jednou, Politika.

  2. 2 · kanonické tvrzení

    derived-not-declareddeklarovaný stav: zaručeno v docs/CLAIMS.yaml

    Definováno v číst na tomto webu · docs/CONCEPTS.md

  3. 3 · implementace

    lib/doctor.sh · majordomus doctor

  4. 4 · test a scénáře

    Test: test/cases/28_no_hardcoded_values.sh

    Provedeno v Podmínit CI samotným nástrojem, s exit kódem, který je kontraktem.

  5. 5 · zaznamenané běhy

    zaznamenané důkazy: nespuštěno jak se zaznamenávají důkazy

Ověřte si to sami

Test běží v jednorázovém dočasném repozitáři a ověřuje chování, ne řetězec ve zdrojovém kódu.

z klonu repozitáře
bash test/run.sh 28_no_hardcoded_values

Kde se toto tvrzení používá

pokryté odpovědnosti

Související tvrzení stejná implementace

Prohledává názvy a popisy všech stránek, které tento web publikuje.