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.

Preflight

preflight: co je prokázáno o checkoutu, ne co to je — verdikt za každé tvrzení (git, epizoda, briefing, úloha, předávka, politika, pravidla, ADR, server a plochy, peery, běhy testů, vynucování, projekce, generované dokumenty, nasazení) s důkazem za ním; devět verdiktů, co vstup čte a nikdy nečte, naměřená cena a co spustit pro každý verdikt

Vykresleno z docs/PREFLIGHT.md — stejný Markdown, který zobrazuje GitHub.

Vstup do repozitáře Majordomus odpoví na jednu otázku za dobu, kterou zabere cd: platí zde Majordomus skutečně, v jakém kontextu pracuji, které integrace žijí a která tvrzení jsou právě teď prokázána? Odpovědí je jedna typovaná hodnota, environment::preflight::Preflight, sestavená v apps/majordomus-cli/src/environment/preflight.rs. Každý povrch tuto hodnotu vykresluje a žádný nepočítá vlastní stav. Chování tak, jak je implementováno a testováno; kde se tento dokument a spustitelný kód rozcházejí, má chybu dokument.

Pravidlem je project.entry-reports-only-evidence (.ai/repo/rules/project/entry-reports-only-evidence.v1.md); rozhodnutím je ADR 0066.

Architektura

flowchart TD
  state["repository state<br/><small>git, .ai/local/state, lease, evidence ledger, gh-pages ref, index</small>"]
  observations["Observations<br/><small>plain data</small>"]
  preflight["Preflight<br/>environment.preflight<br/><small>sections of checks, each a verdict and its evidence</small>"]
  state -->|"observe(): the only reading; bounded, loopback only, never a build"| observations
  observations -->|"derive(): pure; every verdict is a test over a value"| preflight
  preflight --> enter["env enter<br/><small>the compact line drawn on entering (direnv, via .envrc)</small>"]
  preflight --> full["majordomus env preflight<br/><small>full, --compact, --format json, --full</small>"]
  preflight --> http["GET /api/v1/environment/preflight"]
  preflight --> mcp["MCP<br/><small>tool majordomus_preflight, resource majordomus://environment/preflight</small>"]
  preflight --> cockpit["Cockpit overview<br/><small>the Preflight card, each verdict as data-check / data-verdict</small>"]

RepositoryEnvironment (ENVIRONMENT.md) říká, čím checkout je. Preflight říká, co je o něm dokázáno. Obě jsou záměrně samostatné hodnoty. Sloučení důkazu do snapshotu by měnilo jeho digest, takže každý banner by se četl jako novinka.

Bootstrap repozitáře

.envrc je nezměněno: provede jedno volání, bin/majordomus-env enter --shell direnv, a vyhodnotí, co toto volání exportuje (project.envrc-is-an-adapter). Volání rozliší snapshot, zajistí runtime a pak vykreslí banner následovaný kompaktním preflightem, vše ze stejných odečtů. Samostatný řádek majordomus env preflight --compact v .envrc by byl druhým git status při každém cd, což pravidlo adaptéru zakazuje. Bootstrap soubory klienta (.mcp.json, .gemini/settings.json, .codex/config.toml) spouštějí launcher a o ničem nerozhodují.

Sémantika stavů

VerdiktZnamenáNakresleno
verifiedprokázáno proti tomuto stromu zaznamenaným výsledkem nebo přímou odpovědí✓
activeplatí nyní, pozorováno přímo, není co zaznamenávat k ověření✓
freshdost nedávné, aby se podle toho dalo jednat, vůči deklarovanému prahu nebo aktuálnímu commitu✓
staledůkazy existují, o jiném commitu, stromu či okamžiku◐
degradedplatí, ve formě, kterou by tento executable neposkytoval◐
unavailablenení tam co pozorovat○
failedpozorováno a neplatilo to✗
unknownnikdo se nepodíval, nebo se pohled nedokončil?
not_applicablezde není co posuzovat-

První tři nelze vytvořit bez důkazů. Check::new mění holé tvrzení o platnosti na unknown, takže žádný renderer nemůže nakreslit úspěch, který nic nepodpírá. attention vypíše každou kontrolu, která potřebuje pohled, nejnaléhavější první: failed, degraded, stale, unavailable, unknown.

Kontroly

KontrolaPřečtené důkazyVerdikty
repository.gitgit status --porcelain=v2 --branch (vlastní volání snímku)aktivní, nedostupné
session.episode.ai/local/state/session-current.yamlactive, degraded (jiného checkoutu), unavailable
session.task.ai/local/state/current.yamlaktivní (outcome: active), not_applicable
session.contextstart_head a start_working_tree epizody oproti HEAD, stromu a začátku úlohyfresh, stale, unknown (žádná epizoda, nebo zapsáno nad špinavým stromem)
session.handoverrozlišení záznamů kontinuity a session.freshnessfresh, stale, unknown, not_applicable
governance.policyLoadedPolicyaktivní, selhalo
governance.rulesrules.report, počítáno na commituaktivní (na HEAD), zastaralé, neznámé
governance.adrsindex, druh adraktivní (indexováno; relevance se netvrdí), neznámé
integration.serverlease, standing_of nad jedním GET / — nebo v procesu, který lease drží, nad jeho vlastním dokumentem lease, takže i tam je přestavěný spustitelný soubor degradedverified, degraded (outdated), failed (stale lease), unavailable, unknown
integration.mcp / api / cockpitpovrchy, které GET / vypisuje pomocí readyověřeno, degradováno, selhalo, nedostupné, neznámé
integration.peersnástěnka peerů tohoto checkoutu (checkouts=this), tatáž nástěnka, kterou čte obsloužený požadavekaktivní, degradované, nedostupné, neznámé (při vstupu nezjišťováno)
verification.tests.ai/repo/evidence/ledger.json, každý běh posouzen vlastním porovnáním stromů modulu důkazů a otiskem testuverified, stale, failed, unavailable
verification.coverage.ai/local/state/coverage/rust.json, poslední měření celého crate, které scripts/rust-coverage provedlo samo, s commitem a stromem, které změřiloverified (prahy platí na HEAD), active (--report: změřeno na HEAD, nic nedrženo), stale (jiný commit nebo strom, který nebyl po celý běh čistý), failed (práh nebo sada), unavailable (žádný záznam), unknown (nečitelné)
verification.enforcementdůkazy pravidel rules.reportverified, degraded, stale (jiný commit, nebo strom, který není čistý — zkontrolováno před selháním), failed, not_applicable (nic nedluží důkaz), unknown
verification.projectionsprojekce poskytovatelů proti jejich šablonámverified, stale, unknown, not_applicable
verification.docs.ai/local/state/generation/check.json, poslední verdikt scripts/pages current (kontrola generování v hooku pre-commit: data webu podle hashe vstupu, projekce registru podle generate --check), zaznamenaný se stromem, který zkontrolovalverified (ten strom je HEAD, pracovní strom čistý, obě poloviny aktuální), failed (odvozená data byla zastaralá), stale (jiný strom, nebo pracovní strom, který nebyl svým indexem), unknown (žádný záznam, nečitelný, nebo byla přeskočena polovina registru)
verification.deploymentrefs/remotes/origin/gh-pages, jehož commity jmenují source: <sha>verified (zdroj je HEAD nebo jeho prefix), stale, unknown, unavailable

Stav řízení

Soubor pravidla na disku je objeven. governance.rules je active, když rules.report spočítal korpus na HEAD, což znamená, že je načten. Jeho souhrn uvádí, kolik pravidel blokuje, kolik jich je vlastních projektu a kolik převzatých a kolik jich spouští kontrola CI. Vynuceno a ověřeno patří verification.enforcement. Tato kontrola je verified jen tehdy, když je každé pravidlo, které dluží spustitelný důkaz, proven proti stromu. Existující kontrola není verdikt, který prošel, takže korpus, který je kontrolovaný a nikdy nespuštěný, je degraded. ADR se počítají jako indexované; nic nespojuje ADR s úlohou, takže žádné se netvrdí za relevantní.

Čerstvost kontextu relace

Briefing epizody je přesný na commitu a stromu, na kterých byl napsán. Je stale, jakmile se pohne HEAD, pod ním se změní strom nebo po něm začne úloha. Shrnutí pojmenuje, co z toho nastalo, a majordomus context zapíše aktuální briefing. Briefing napsaný nad dirty stromem je unknown spíše než fresh: epizoda zaznamenává slovo dirty, ne které změny, takže úpravu nebo revert od té doby nelze vidět. Preflight nikdy sám kontext neregeneruje: entry není místem pro zápis, který vlastní vlastní životní cyklus providera. V checkoutu zatím neexistuje žádná zkompilovaná revize kontextu, takže se žádná nezobrazuje.

detekce MCP a Cockpitu

Lease na disku je nárok, ne server. Server je verified jen tehdy, když adresa, kterou lease jmenuje, odpovídá GET / jako držitel lease tohoto checkoutu, ve verzi tohoto spustitelného souboru. To je lease::probe_reply, totéž rozhodnutí, jaké dělá volba launcheru, s rozpočtem 250 ms. Server, který odpovídá z jiného kódu, je degraded. Lease, jehož adresa neodpovídá, je failed. Žádné lease je unavailable. Kontroly MCP, API a Cockpitu čtou příznak ready, který index samotného serveru uvádí pro každý povrch. Banner už neoznačuje službu jako odpovídající, pokud server není ověřen. MAJORDOMUS_URL se stále exportuje, protože klient může adresu stále zastihnout. Obsloužený požadavek držící lease je vlastním důkazem a čte vlastní nástěnku peerů.

Ověřovací důkazy

Běh v evidenčním registru ověřuje strom jen podle definice „prokázáno“ z modulu důkazů: prošel, jeho test má stále zaznamenaný hash a strom před vámi je tím stromem, který běh měřil, bez vlastního řádku registru. Běh na jakémkoli jiném stromě je stale. Toto porovnání stojí git dva procesy na každý zaznamenaný commit, proto se jeho odpovědi ukládají do cache v .ai/local/state/environment/snapshot.json. Cache je klíčovaná podle HEAD, každé cesty, kterou git hlásí jako změněnou, a souboru registru, takže jakákoli změna ji přepočítá. Obsloužený požadavek cache nikdy nezapisuje. Pokrytí se hlásí jako unavailable, dokud měření pokrytí nezanechá v repozitáři záznam.

Čerstvost nasazení

scripts/pages publikuje do gh-pages a každý commit nasazení jmenuje zdrojový commit, z něhož byl sestaven. Preflight čte lokální ref refs/remotes/origin/gh-pages. Nasazení je verified, když je tímto zdrojem HEAD, stale, když je jiným commitem, a unavailable bez refu. Ref je jen tak čerstvý jako poslední fetch a důkaz to říká. Zda GitHub tento commit servíruje, je věcí scripts/pages verify. Lokální stav runtime se na statický web nikdy nepublikuje.

Záruky výkonu

Vstup nikdy nesestavuje index. Součet pravidel pochází z cache, kterou zapisuje env preflight --full, označené commitem, u něhož byl spočten. Vstup se nikdy neptá nástěnky peerů, což stojí oběh, který sesbírá nástěnku každého checkoutu. Nikdy nespouští test, build, generátor ani vzdálený požadavek. Jeho jediný socket míří na loopback adresu, kterou jmenuje lease.

Měření níže bylo pořízeno 2026-09-15, debug build, v linked worktree tohoto repozitáře, zatímco na stejném stroji sestavovalo několik dalších relací. Je to teplý vstup přes bin/majordomus-env enter --shell direnv, volání, které provádí .envrc:

reálný čas
banner vypnut (snímek, zajištěný runtime, bridge)219–229 ms
kompaktní banner a kompaktní preflight248–301 ms
první položka po změně HEAD nebo stromu, porovnání s registrem přepočítánoasi 2,2 s jednou
env preflight (rychlé, ptá se nástěnky)asi 230 ms
env preflight --full (sestaví index, spočítá důkazy pravidel)asi 1,1 s

Preflight tedy přidá k teplému vstupu asi 30–70 ms. Podlahou pod ním je vstup, který tam už byl. Každý proces gitu na tomto stroji stál při té zátěži 40–90 ms a porovnání knihy jsou dva z nich na zaznamenaný commit, proto se jeho odpovědi cachují. Cíle mandátu 50 ms teplý, 150 ms studený a 250 ms tvrdý na tomto stroji nejsou splněny. Rozpočty, které repozitář vynucuje, jsou benchmark.budget.enter_ms (750 ms) a enter_cold_ms (1000 ms) politiky, měřené test/cases/190 při každém běhu.

Řešení problémů

VidíteZnamenáDělat
server ◐ degradedserver odpovídá z jiné verze nebo z nahrazeného spustitelného souborumajordomus serve stop && majordomus serve ensure
server ✗ failedlease jmenuje adresu, která neodpovídá jako tento checkoutmajordomus serve ensure
rules ? / enforced ?korpus pravidel nebyl v tomto checkoutu nikdy spočítánmajordomus env preflight --full
rules ◐spočteno při jiném commitumajordomus env preflight --full
tests ◐ stalezaznamenané běhy měřily jiný stromspustit testy a zaznamenat je (majordomus evidence record)
context ◐ staleHEAD, strom nebo úloha se od briefingu posunulymajordomus context
deploy ◐ staleweb byl sestaven z jiného commitu, nebo ref není stažengit fetch origin gh-pages; scripts/pages verify
nic nenakreslenoroura, CI, nebo MAJORDOMUS_BANNER=offmajordomus env preflight

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