89. Rozhraní ukazuje jen to, co je odvozeno, a unknown se nikdy nekreslí jako zdravé
Kontext
Dne 2026-09-29 dva auditní průchody jen pro čtení, jeden Cockpitu a jeden veřejného webu, klasifikovaly každý fakt a seznam, které obě rozhraní ukazují. Každý fakt byl zařazen jako odvozený, odvozený bez původu, napevno zapsaný, mock, duplicitní inventář nebo optimistická výchozí hodnota. Dobrá zpráva přišla první: ADR 0012 a kontrola cockpit-projection činí z Cockpitu skutečnou projekci. Žádná stránka nečte index a nic není mockované. Zbyla tenká vrstva, kterou každé stávající pravidlo minulo:
- Stav rozhodnutý literálem. „Attached clients“ v
health.reportjestatus: HealthStatus::Oka nemůže být nic jiného. Jeho počet zahrnuje peery, kteří jsou pryč, zatímco karta preflight na téže stránce říká, že tři z nich jsou pryč. - Počet, který je literál. Čipy efektů příkazů předávají
0jako každý počet, zatímco tabulka níže uvádí příkazy každého efektu. - Neznámé vykreslené jako hodnota. Upstream bez sledovacích dat se čte
+0 −0. Model bez deklarovaného stavu se čte „available“, protožeModelStatusmá#[default] Available. Navigační počet je0, kdyžrepository.infoselže. - Verdikt v pohledu. Stránka Artifacts nazývá množinu „aktuální“, ale ignoruje soubory, které nemají zaznamenaný hash. Pruh Worktrees ukazuje osm ze třinácti součtů a chybějící jsou ty špatné.
- Deklarovaný stav stylizovaný jako dokázaný. Na webu sdílí tvrzení
guaranteedpaletu úspěchu, zatímco základní linie důkazů žádné z těchto tvrzení nezaznamenává jako podpořené. - Inventáře vedené dvakrát. Oblasti navigace, větve dispatcheru, čipy slovníku a seznam testovací stránky jsou každý ručně udržovány vedle toho, co vypisují.
- Žádná aktuálnost. Index a stav gitu se čtou jednou, při startu serveru, a zobrazují se bez času.
Vlastník vyslovil invariant, který všechny tyto věci porušují, jako UI-DERIVED-STATE, v sedmi částech:
- žádná zmockovaná produkční data UI;
- žádný natvrdo zapsaný stav domény;
- žádné duplicitní inventáře;
- vyžadovány důkazy;
- neznámé není zdravé;
- čerstvost je výslovná;
- frontend počítá prezentaci, ne realitu.
Několik pravidel a kontrol už drží jeho části. Žádné neuvádí celek a žádné nečte literály Rustu v Cockpitu:
| Mechanismus | Drží | Nedosáhne |
|---|---|---|
project.product-surface-derived, no-counts-in-prose (site-check, derive-check, případ 97) | 2 a 3 pro funkce, moduly, příkazy, poskytovatele a počty na webu | stavy a verdikty; literály Cockpit |
project.derived-once | 3 jako pravidlo výkonu (poradní, bez kontroly) | pravdivost toho, co se ukazuje |
project.ui-conformance (ui-check, ui-audit) | přístupnost a rozvržení | pravdivost dat |
project.web-surface-declared-once (web validate, případy 84 a 89) | 3 pro mounty a routy | seznamy oblastí, slovníky, součty |
ADR 0012, kontrola cockpit-projection, případ 389 | 1 a 7 pro index | registr, produktový model a katalog Why |
homepage-check | 1, 2 a 5 pro vyprávění domovské stránky, důvěru a providery | Cockpit; důkazy tvrzení (rozšiřuje je #655) |
project.entry-reports-only-evidence (případ 358, tests/preflight.rs) | 4 a 5, typované, pro kartu preflight | každý jiný verdikt |
Rozhodnutí
UI-DERIVED-STATE se stává jedním blokujícím pravidlem projektu, project.ui-derived-state, jehož sedm podpravidel je sedm invariantů vlastníka. Stávající mechanismy zůstávají, kde jsou, a pravidlo je pojmenovává jako své části. Co toto ADR přidává, je výrok a kontrola, která drží části, které řádkový sken vidí.
Kontrola je rozšíření, ne nová jednotka
Kontrola ui-integrity je scripts/ci/cockpit-projection-check --ui-integrity. Běží v jobu structure v každém plánu, jako cockpit-projection. Rozšiřuje stávající kontrolor místo přidání shellové jednotky, protože ADR 0069 nechává shell jen zmenšovat. Její první polovina je stejná otázka, kterou tento kontrolor klade, položená ke třem dalším polím kontextu, a ostatní kontroly jsou stejný druh levného, deterministického skenu řádek. Polovina indexu zůstává pod cockpit-projection beze změny. Přesun obou do typované schopnosti subsystému kvality crate je migrace, kterou už jmenuje inventární záznam kontrolora.
Jeho první kontroly:
- direct-read (invarianty 1 a 7). Soubor Cockpitu, který sám čte
ctx.registry,ctx.productneboctx.why, na jednom řádku nebo rozdělený na dva, je odmítnut. Výjimkou je deklarovaný, okomentovaný allowlist v kontrolním nástroji. Dnes je allowlistnav.rs: výpis modulů v navigaci je seznam modulů registru, seskupený podle odvozené oblasti produktového modelu a pojmenovaný katalogem Why (ADR 0026) a testynav.rstvrdí přesně to. Řádek allowlistu je soubor a pole. - unconditional-ok (invarianty 2, 4 a 5).
health.rs, který kontrole dávástatus: HealthStatus::Okjako literál, je odmítnut. - healthy-default (invariant 5).
#[default]na zdravé variantě (Ok,Available,Current,Valid,Verified,Livea podobné) kdekoli v crate se odmítne. Hodnota, kterou nikdo nedeklaroval, je neznámá, ne dobrá. - count-default (invariant 5). V
pages.rs,unwrap_or(0)nebounwrap_or_default()na řetězci, který čte číslo JSON, se odmítne. Chybějící počet je neznámý, ne nula.
Místo, které je správně tak, jak je napsáno, říká proč v komentáři // ui-integrity: <reason> na svém řádku nebo přímo nad ním. Důvod se čte při revizi a prázdný není žádnou výjimkou. Kontrola registru v health.rs je očekávaným prvním uživatelem: registr, který se nesestaví, zastaví proces dřív, než se naváže jakýkoli přenos.
Ratchet nad tím, co drží master
Na masteru u e2c5ab3d44 najde kontrola třináct nálezů. Drží je .ai/repo/ui-integrity-baseline.txt, které zapisuje --write-baseline a nikdo je neupravuje ručně. Řádek základny je kontrola, soubor a subjekt (funkce, id kontroly, varianta enumu, zdrojový text), nikdy číslo řádku, takže úprava nad nálezem jeho klíč nepřesune. Nález, který základna drží, je dluh a projde. Ten, který nedrží, selže. Řádek, kterému už nic neodpovídá, se hlásí jako zaplacený a nesele, takže změna, která nález opraví, přistane bez druhé úpravy tohoto souboru a příští --write-baseline ho zahodí. --strict základnu ignoruje a je koncovým stavem.
Řádky základní hodnoty a kdo je platí:
- #656 (
fix/the-cockpit-says-only-what-it-knows) splácí čtyři:unconditional-ok … peers,healthy-default … ModelStatus::Availablea dva řádkycount-default … upstream_cell(u.ahead,u.behind). Spuštěná proti stromu #656 kontrola projde a hlásí tyto čtyři jako splacené. - Navazující krok zaplatí dalších devět:
unconditional-ok … registry: komentář s výjimkou, protože je strukturální;unconditional-ok … scope: odvodit z diagnostiky rozsahu;- dva řádky
count-default … activityv čítačích výkonu; - pět čtení
direct-read … ctx.registryvpages.rs(capabilities,capability,api,search,topology), která se přesouvají docapabilities.listacapabilities.get. Ani #656, ani #657 se jich nedotýká a kontrola prochází na obou stromech.
Tři otevřené pull requesty, které opravují porušení z auditů, jsou první splátky tohoto pravidla:
- #655 (
fix/a-declared-guarantee-is-not-shown-as-proven): web přestane vybarvovat deklarovanou záruku jako dokázanou a počítá deklarované odděleně od podporovaných (invarianty 4 a 5). - #656 (
fix/the-cockpit-says-only-what-it-knows): doslovné stavy, doslovné počty a optimistické výchozí hodnoty Cockpitu se stanou odvozenými nebo neznámými (invarianty 2, 3 a 5). - #657 (
feature/every-answer-says-when-it-was-observed): odpovědi repozitáře nesou, kdy byly pozorovány, a statistika jmenuje schopnost, na kterou se ptala (invarianty 4 a 6).
Co toto ADR nepřidává
Nepřeimplementovává homepage-check, které rozšiřuje #655. Nepíše sweep s injekcí chyb. Obojí jsou navazující kroky:
- Injekce chyb (invariant 5): spustit každou trasu Cockpitu s každou schopností, kterou si vyžádá, vynuceně selhávající, a ověřit, že se nevykreslí žádný odznak ok ani healthy a žádné číslo.
- Úplnost součtů (invariant 3): každé číselné pole odpovědi
*Talliesse objeví na stránce, která ji vykresluje (pruhy Worktrees a Artifacts). - Jedna tabulka routes (invariant 3): dispatcher, oblasti navigace,
tests/cockpit.rsadocs/COCKPIT.mdčtou z jedné tabulky (PR #543, přepracováno na masteru). - Lintování šablon webu (invarianty 2 a 3): žádné literální pole doménového slovníku ve smyčce
foradefault(value=…)jen prázdné, neutrální nebo „unknown“. - Obálka
Observed<T>(invariant 6), stavící na #657, aby čerstvost byla typovaná tak, jako preflight otypoval důkazy. - Migrace
cockpit-projection-checkdo typované schopnosti.
Zamítnuté alternativy
- Ručně udržovaný allow-list faktů. Jedna možnost byla vypsat každý fakt, který rozhraní smí ukázat, s jeho zdrojem, a stránky proti seznamu kontrolovat. Takový seznam by byl třetím inventářem toho, co už deklaruje registr, produktový model a generované dokumenty, a rozjel by se na první stránce, kterou do něj nikdo nepřidal. To je invariant 3 porušený mechanismem, který ho měl vynucovat. Allow-list kontroly má opačný tvar: jmenuje těch několik míst, která smějí číst zdroj přímo, a každé místo nese svůj důvod.
- Jen review.
no-counts-in-prosese vynucuje review a audity našly, co review propustilo: literálOka literál0seděly v přezkoumaném kódu. ADR 0048 činí „gated“ režimem pro pravidlo, které program dokáže zkontrolovat. Čtyři z těchto podpravidel lze zkontrolovat levně, takže pravidlo je gated. - Selhávající master kvůli dnešním nálezům. Gate, který je červený hned po příchodu, blokuje každou další změnu, dokud není opraveno všech třináct, a tři pull requesty v běhu už některé z nich opravují. Ratchet připouští, co je známé, odmítá, co je nové, a nechá každou opravu přistát samostatně.
- Selhat na zaplaceném řádku základní hodnoty. To by způsobilo, že každá oprava upravuje základní hodnotu ve stejné změně. Zčervenalo by to master, kdykoli by oprava přistála před kontrolou nebo kontrola před opravou. Zaplacený řádek se místo toho hlásí a další
--write-baselineho vypustí. - Nová typovaná schopnost hned teď. Je to správný cílový stav (ADR 0069), ale přidává položku registru, projekce a build cratu ke kontrole struktury, která jako sken stojí dvacetinu sekundy. Rozšíření drží kontrolu dnes levnou a migrace je pojmenované navazující.
- Lint syntaktického stromu nad crate. Přesnější než prohledávání řádků, ale vyžaduje parser crate v structure jobu. Každá zde psaná kontrola je napsána tak, aby stačilo rozložení rustfmt, a případ 547 připíná tvary, které musí vidět.
Důsledky
- Jedno pravidlo uvádí invariant a každý existující mechanismus je jmenován jako jedna z jeho částí. Čtenář se ptající „je tento fakt UI povolen“ má jedno místo, kam se podívat.
- Nový literál
HealthStatus::Ok, nový zdravý#[default], nový počet nula-za-nepřítomné nebo nové přímé čtení registru na stránce selže ve strukturálním jobu, v každém plánu, se souborem, řádkem a nápravou. - Baseline je viditelný dluh s vlastníky: #656 splácí čtyři řádky a výše uvedené navazující úkoly zbytek. Průchod
--strictje den, kdy je část pravidla na straně kontroly plně splněna. - Řádkové průchody jsou heuristiky s uvedenými limity.
count-defaultvidíunwrap_or(0)a číselné čtení JSON ve stejném řetězci, ne každý celočíselný typ.direct-readvidí pole kontextu podle jména. Tvar, který minou, je nový případ v 547 a rozšíření průchodu, ne výjimka. - Dílčí pravidla 1, 3, 4 a 6 se zde vynucují jen tam, kam sahá řádkový sken. Zbytek zůstává review, stávající kontroly v tabulce výše a navazující práce.