88. Dashboard je projekce schopností a každá karta jmenuje odpověď, z níž byla čtena
Kontext
Vlastník požádal o Dashboard Suite: ne sadu stránek, ale routovatelný, daty řízený pohled na kanonický stav, kterým čtenář prochází od přehledu k diagnóze, od diagnózy k důkazům a od důkazů k příkazu, který na ně reaguje. Fakta, která taková sada ukazuje, už existují. health.report rozhoduje, zda je tento proces zdravý, release.version co strom deklaruje a co commity implikují, plan.status a plan.next kde plán stojí, worktree.status zda je checkout tam, kam patří, continuity.state co odmítá dokončení, peers.list kdo jiný si nárokuje tytéž cesty. Každé je schopnost servírovaná přes MCP, HTTP, příkazovou řádku a Cockpit z jedné deklarace (ADR 0004, ADR 0012).
Dashboard je klasické místo, kde se tato fakta kopírují. Číslo, které si panel počítá sám — počet selhávajících kontrol vyfiltrovaný ze seznamu, součet „blokovaných“ sečtený z tabulky — je druhým odvozením něčeho, o čem již rozhoduje schopnost, a v den, kdy se obě rozejdou, není žádné špatně ve vlastních termínech. Cockpit už odmítá strukturální podobu toho (stránka nesmí číst index: kontrola cockpit-projection), ale nic neodmítlo stránku, která se zeptala správné schopnosti a pak si nad odpovědí počítala vlastní aritmetiku, nebo která ukázala jeden fakt na dvou místech ze dvou různých čtení.
Rozhodnutí
-
Dashboard Suite je modul schopností a jeho stránka je jedna schopnost. První je
dashboard.overview(MCPmajordomus_dashboard_overview,GET /api/v1/dashboard/overview,majordomus dashboard overview). Odpovídá na čtyři otázky — je zdravý, co se změnilo, co je rozbité, co vyžaduje akci — a nemá žádné úložiště, vlastní cache ani stav: každý zdroj se na jednu odpověď ptá jednou, prostřednictvímContext::execute, volání, které provádí každý další povrch. -
Každá karta je typovaná odpověď, která jmenuje svůj zdroj.
DashboardCardnese svou hodnotu, verdikt zdroje (ok,warn,fail,unknown— slovníkHealthStatus), řádek detailu, trasu Cockpitu, do které se čtenář prokliká pro důkazy, příkaz, který na ni působí, když nějaký je, aDashboardSource: schopnost, vstup, s nímž se jí ptalo, ukazatel RFC 6901 do její odpovědi a míru. Mírou jeexact— hodnota na ukazateli,null, když tam žádná není — nebocount— číslo na ukazateli, nebo délka tamního seznamu či mapy, a0, když ji zdroj vynechal, což je způsob, jakým zdroje serializují prázdný seznam nebo nulový součet. Ani jedno není aritmetika za zdroj. -
Slova stavu jsou verdikty zdrojů, nikdy prahy.
fail, kde zdroj říká, že něco odmítá,warn, kde jmenuje něco, na co stojí za to se podívat, jinakokaunknown— nikdyok— když zdroj nemohl odpovědět, s jeho chybou jako detailem. -
Test konzistence je vynucování.
apps/majordomus-cli/tests/dashboard.rsse zeptá na přehled, pak pro každou kartu zavolásource.capabilityssource.inputnad vlastní route té schopnosti a ověří, že čtenísource.pointerssource.measuredávácard.value; zdroj, který neodpověděl, musí nechat kartuunknowna prázdnou. Nejmenuje žádnou kartu, takže karta přidaná zítra je jím držena bez úpravy. Také ověřuje, že stránka přehledu Cockpitu nese hodnotu každé karty (jakodata-value, JSON, který route vrátila) a odkazuje na její route.test/cases/534_the_overview_answers_four_questions.shdrží stejný kontrakt přes sestavený spustitelný soubor: JSON příkazové řádky proti vlastní odpovědi každého zdroje. -
Cockpit nejdřív vykresluje schopnost. Stránka přehledu začíná sekcí „Čtyři otázky“ sestavenou z
dashboard.overviewpřes executor; zbytek stránky zůstává. -
Nejdřív přehled, ostatní stránky až po svých modelech. Quality, Governance, Delivery a Mesh následují jako další schopnosti modulu. Quality čeká na model důkazů z ADR 0087, aby jeho karty četly úsudek indexovaný podle subjektu, místo aby si nějaký vymýšlely.
Zamítnuté alternativy
- Klientská dashboardová aplikace. Stahovala by stejné trasy a držela aritmetiku v JavaScriptu, kde ji nečte žádná kontrola tohoto repozitáře, a znovu by zavedla druhý model registru, který ADR 0012 pro Cockpit odmítlo.
- Datové úložiště dashboardu (tabulka snímků, soubor metrik, cache hodnot karet). Je to kopie s plánem obnovy a každý čtenář se pak musí ptát, zda je kopie aktuální — otázka, na kterou schopnosti už odpovídají tím, že se jich ptáte.
- Ručně počítaná čísla na každé stránce. Rychlejší na psaní a přesně ta vada, kterou toto rozhodnutí existuje, aby odmítlo: číslo bez odkazu na zdroj nelze zkontrolovat a číslo počítané dvakrát se rozejde při první úpravě, která zapomene na jedno z nich.
- Nejdřív kvalita. Nejžádanější stránka a ta, jejíž fakta se stále modelují (ADR 0087). Postavit ji první by zafixovalo tvar, který model důkazů dosud nevyřešil.
Důsledky
Fakt na dashboardu má nyní adresu: schopnost, vstup a ukazatel, z něhož byl přečten, a čtenář se může zeptat přímo tohoto zdroje a musí dostat stejnou hodnotu. Cenou je, že každá karta je deklarace v dashboard.rs s funkcí soudce a zdroj, jehož výstup změní tvar, změní kartu — což konzistenční test i unit test, který provede každou kartu proti syntetickému repozitáři, okamžitě oba ohlásí.
Přehled stojí tolik, kolik stojí jeho zdroje. worktree.status prochází topologii worktrees a je z nich nejpomalejší na stroji s mnoha linked worktrees; peers.list se ptá jen nástěnky tohoto checkoutu (checkouts: this), aby přehled nikdy nesondoval sousední servery. Drahé a odmítající schopnosti — delivery.report, release.analysis, evidence.* — jsou jako zdroje odmítnuty unit testem v modulu.
Co zde není rozhodnuto: zda karta smí někdy kombinovat dva zdroje. Smlouva, jak je uvedena, dovoluje jeden zdroj na kartu; fakt, který potřebuje dva, je nejprve schopnost sám o sobě.