surfaces-never-disagree — Každý povrch promítá stejný stav, říká, kdy byl pozorován, a nevede si vlastní seznam
Čtenář na kterémkoli povrchu vidí tutéž hodnotu, čas, kdy byla pozorována, a zda je zastaralá; schopnost přidaná do registru nebo z něj odebraná se objeví nebo zmizí všude bez úpravy kteréhokoli konzumenta; stránka obsluhovaná vedle zápisových tras spouští jen skript, který dodala.
AKTIVNÍ 7 of 13 issues done
- připraveno
- 6
- blokováno
- 0
- aktivní
- 0
- verify
- 0
- hotovo
- 7
- zrušeno
- 0
Problém
Jádrová projekce drží: 181 rout /api/v1 živého serveru se rovná 181 operacím OpenAPI, které se rovnají commitovanému docs/generated/openapi.json, a executor je jedinou cestou dispatche (apps/majordomus-cli/src/capability/executor.rs:156). Kolem toho: aktuálnost není jednotná, protože dashboard/overview, episodes, lifecycle/runtime, plan/status, served a mesh nenesou observed_at, odznak přehledu je na nečinném repozitáři trvale zastaralý (apps/majordomus-cli/src/index.rs:44, apps/majordomus-cli/src/live.rs:250-252) a GET / řekl stale: null, zatímco servíroval build o 12 commitů za HEAD. Vlastnost parity porovnává HTTP jen pro GET routy a vylučuje koordinační read modely (apps/majordomus-cli/tests/properties.rs:166-168,300) a nic neporovnává JSON z CLI s HTTP. /swagger nemá CSP ani SRI na stejném originu jako zápisové routy (apps/majordomus-cli/src/http/swagger.rs:52,79). Cockpit a web drží nejméně devět katalogů na straně konzumenta toho, co registr deklaruje, a ADR 0004 říká, že nic nemá druhý registr. Změřeno v auditu základního stavu runtime z 2026-10-09 na masteru 1fb8d6be44 (plan/RUNTIME_BASELINE.md).
Výsledek
Čtenář na kterémkoli povrchu vidí tutéž hodnotu, čas, kdy byla pozorována, a zda je zastaralá; schopnost přidaná do registru nebo z něj odebraná se objeví nebo zmizí všude bez úpravy kteréhokoli konzumenta; stránka obsluhovaná vedle zápisových tras spouští jen skript, který dodala.
Aktuální stav
Implementováno: trasy, OpenAPI, MCP a generovaný dataset registru jsou odvozeny z registru a kontrolovány na drift. Částečně: čerstvost, parita, přístup Cockpitu k datům (pět stránek čte ctx.registry přímo, .ai/repo/ui-integrity-baseline.txt:9-13). Druhé registry: strom clap (kontrolovaný oběma směry apps/majordomus-cli/src/capability/closure.rs), cli/local.rs LOCAL (89 příkazů), nativní webové povrchy (apps/majordomus-cli/src/web/discover.rs:150), trasy Cockpitu (tři seznamy, vzájemně křížově kontrolované) a kopie spotřebitelů uvedené v plan/RUNTIME_BASELINE.md.
Cílový stav
Každá odpověď hlásící stav nese observed_at a source, vynuceno nad registrem; vlastnost parity pokrývá zapisovatele a CLI; žádný soubor Cockpitu ani webu nejmenuje hodnotu, kterou už deklaruje enum, schopnost nebo HttpExposure; /swagger a každé GET odmítají, co by mohla udělat nepřátelská stránka nebo rebindingový hostitel.
Rozsah
- apps/majordomus-cli/src/capability/builtin
- apps/majordomus-cli/src/cockpit
- apps/majordomus-cli/src/http
- apps/majordomus-cli/src/live.rs
- apps/majordomus-cli/src/index.rs
- apps/majordomus-cli/src/site.rs
- apps/majordomus-cli/src/web/discover.rs
- share/cockpit
- site/templates
- apps/majordomus-cli/tests/properties.rs
- apps/majordomus-cli/tests/dashboard.rs
- test/cases
- docs/SURFACES.md
- docs/COCKPIT.md
- .ai/repo/adrs/0004-canonical-architecture-and-performance-truth.md
Mimo rozsah
- Odstranění stromu clap nebo cli/local.rs LOCAL; obojí jsou změřené druhé deklarace (SURFACES F-1, F-4) a tento milník je zaznamenává, nepřepisuje CLI.
- Psaní statického webu, který tvrdí živý stav; web zůstává obrázkem označeným jako obrázek.
- Hlášení vyměněného spustitelného souboru, což je I1502.
Kritéria přijetí
- Test nad registrem selže, když schopnost hlásící stav odpoví bez observed_at
- Test parity pokrývá každou schopnost s HTTP trasou a každou schopnost s cestou CLI
- GET /swagger odpovídá s CSP a hashi integrity a cizí Host je na GET odmítnut
- Kontrola selže na doslovné cestě /api/v1/ nebo zkopírované hodnotě enumu v kódu Cockpitu či webu
Validace
- bin/majordomus plan validate
- cargo test --test properties --test projections --test dashboard --test http_serve --test http_host
- bin/majordomus-cli generate --check
- MJ_TEST_JOBS=4 bash test/run.sh 545_every_answer_says_when_it_was_observed 406_one_declaration_every_surface
Požadované důkazy
- uniform_freshness
- parity_with_writers_and_cli
- no_consumer_catalogue
Rizika
- Přidání observed_at k výstupům schopností mění jejich schémata a tedy veřejný povrch; version-surface to ocení jako změnu, což je správně.
- Rozšíření parity na POST routy spouští zapisovače v testech; každý musí běžet proti syntetickému repozitáři, nikdy proti checkoutu.
Úkoly
Každý z nich je prováděcí kontrakt s vlastními kritérii přijetí, validačním příkazem a požadovanými důkazy. Sloupec wave je vrstva grafu závislostí, v níž úkol leží.
| issue | status | vlna | závisí na | název |
|---|---|---|---|---|
| I2151 | HOTOVO | 0 | — | Stránka servírovaná vedle zapisovacích tras spouští jen skript, který sama dodala, a rebinding host nic nečte |
| I2653 | HOTOVO | 0 | — | Každý diagram na webu je jeden interaktivní viewer s odkazy, jehož odkazy mezi uzly se odvozují, a odvozenou tabulku lze nakreslit jako graf |
| I2654 | PŘIPRAVENO | 1 | I2653 | Graf je ke své tabulce vázán kontrolou a tabulky, které jsou měřenými řadami, se kreslí |
| I2655 | PŘIPRAVENO | 1 | I2653 | Domovská stránka rozhoduje, zda nese odvozené číslo, v rámci svého deklarovaného příběhu a rozpočtu |
| I2656 | PŘIPRAVENO | 1 | I2653 | Viewer diagramů obsluhuje Cockpit i majordomus ui a uzel, který je souborem repozitáře, odkazuje na svůj zdroj |
| I2770 | HOTOVO | 0 | — | majordomus ui a Cockpit nosí navbar webu: jeden renderer, stejné styly a skripty a porovnání v prohlížeči, které rozdíl odmítne |
| I2842 | PŘIPRAVENO | 0 | — | Živý web se ověřuje podle plánu a jeho poslední ověření je důkaz |
| I2943 | HOTOVO | 0 | — | Mesh, na kterém tento proces není, se uvádí jako nepozorovaný, nikdy jako nula nebo ne |
| I3007 | HOTOVO | 0 | — | Commit, který jmenuje záznam nebo data webu, je commit, který historie drží |
| I3008 | HOTOVO | 0 | — | Odkaz domovské stránky s fragmentem míří na prvek, který její stránka nese |
| I3009 | PŘIPRAVENO | 0 | — | No record's prose and no board announcement holds a template delimiter |
| I3010 | HOTOVO | 0 | — | Manuál mesh říká, že hlídač úprav není zapojen, a jak jej zapojit ručně |
| I3318 | PŘIPRAVENO | 0 | — | Every decision and curated note is read on /ui, with the records it names and the records that name it |
Graf
flowchart LR
I2151["I2151<br/>A page served beside the write routes runs only script it shipped, and a rebinding host reads nothing"]:::done
I2653["I2653<br/>Every diagram on the site is one interactive, linkable viewer whose node links are inferred, and a derived table can be drawn as a chart"]:::done
I2654["I2654<br/>A chart is held to its table by a gate, and the tables that are measured series are drawn"]:::ready
I2655["I2655<br/>The homepage decides whether it carries a derived figure, within its declared story and budget"]:::ready
I2656["I2656<br/>The diagram viewer serves the Cockpit and majordomus ui, and a node that is a repository file links to its source"]:::ready
I2770["I2770<br/>majordomus ui and the Cockpit wear the site's navbar: one renderer, the same styles and scripts, and a browser comparison that refuses a difference"]:::done
I2842["I2842<br/>The live site is verified on a schedule, and its last verification is evidence"]:::ready
I2943["I2943<br/>A mesh this process is not on is said as not observed, never as zero or no"]:::done
I3007["I3007<br/>A commit that a record or the site's data names is a commit the history holds"]:::done
I3008["I3008<br/>A homepage link with a fragment resolves to an element its page carries"]:::done
I3009["I3009<br/>No record's prose and no board announcement holds a template delimiter"]:::ready
I3010["I3010<br/>The mesh manual says the edit guard is not wired, and how to wire it by hand"]:::done
I3318["I3318<br/>Every decision and curated note is read on /ui, with the records it names and the records that name it"]:::ready
I2653 --> I2654
I2653 --> I2655
I2653 --> I2656
classDef done stroke:#16a34a,fill:#dcfce7,color:#14532d,stroke-width:2px
classDef active stroke:#2563eb,fill:#eff6ff,color:#1e3a8a,stroke-width:2px
classDef verify stroke:#7c3aed,fill:#f5f3ff,color:#4c1d95,stroke-width:2px
classDef ready stroke:#0891b2,fill:#ecfeff,color:#164e63,stroke-width:2px
classDef planned stroke:#0891b2,fill:#ecfeff,color:#164e63,stroke-width:2px
classDef blocked stroke:#b45309,fill:#fffbeb,color:#78350f,stroke-width:2px
classDef cancelled stroke:#6b7280,fill:#f9fafb,color:#374151,stroke-width:2px
classDef superseded stroke:#6b7280,fill:#f9fafb,color:#374151,stroke-width:2pxLinked from this diagram (13)
- I2151 Stránka servírovaná vedle zapisovacích tras spouští jen skript, který sama dodala, a rebindující host nečte nic
- I2653 Každý diagram na webu je jeden interaktivní, odkazovatelný prohlížeč, jehož odkazy uzlů se odvozují, a odvozenou tabulku lze nakreslit jako graf
- I2654 Graf je ke své tabulce připoután kontrolou a tabulky, které jsou měřenými řadami, se kreslí
- I2655 Úvodní stránka rozhoduje, zda nese odvozené číslo, v rámci své deklarované story a rozpočtu
- I2656 Prohlížeč diagramů obsluhuje Cockpit a majordomus ui a uzel, který je souborem repozitáře, odkazuje na svůj zdroj
- I2770 majordomus ui a Cockpit nosí navigační lištu webu: jeden renderer, stejné styly a skripty a porovnání v prohlížeči, které odmítne rozdíl
- I2842 Živý web se ověřuje podle plánu a jeho poslední ověření je důkaz
- I2943 Mesh, na kterém tento proces není, se uvádí jako nepozorovaný, nikdy jako nula či ne
- I3007 Commit, který jmenuje záznam nebo data webu, je commit, který historie drží
- I3008 Odkaz na domovské stránce s fragmentem se vyřeší na prvek, který jeho stránka nese
- I3009 No record's prose and no board announcement holds a template delimiter
- I3010 Manuál mesh říká, že hlídač úprav není zapojen, a jak jej zapojit ručně
- I3318 Every decision and curated note is read on /ui, with the records it names and the records that name it
Kanonický záznam: .ai/repo/project/milestones/surfaces-never-disagree.yaml. Přečtěte ho zpět pomocí majordomus plan show surfaces-never-disagree.