failure-is-visible — Každé selhání, které může runtime utrpět, je omezeno, testováno nebo uvedeno a mění zdraví, které hlásí
Klient na jednom endpointu rozliší běžící od připraveného, od zdravého v meshi, od degradovaného; žádný klient nemůže držet workera za deklarovaný deadline; každá třída selhání v publikované tabulce pojmenovává svůj test nebo deklarované omezení.
AKTIVNÍ 5 of 6 issues done
- připraveno
- 1
- blokováno
- 0
- aktivní
- 0
- verify
- 0
- hotovo
- 5
- zrušeno
- 0
Problém
Readiness zůstává true pro degradovaný index a neví nic o ztraceném lease ani o meshi (apps/majordomus-cli/src/capability/builtin/health.rs:214; was_lost dosáhne jen GET / na apps/majordomus-cli/src/http/router.rs:710); health.report nemá dimenzi meshe (apps/majordomus-cli/src/capability/builtin/health.rs:299); „degraded“ má tři nesouvisející významy. HTTP server čte těla požadavků bez deadline na čtyřech workerech (apps/majordomus-cli/src/http/server.rs:23,208-222), takže čtyři pomalí klienti drží server. Z tříd selhání, které balíček jmenuje, audit našel testy pro SIGKILL, kolizi portu, nezapisovatelný adresář lease a zamrzlého vlastníka a žádné pro plný disk, adresář žurnálu jen pro čtení, pomalého klienta, zamrzlého workera nebo kill mezi vytvořením lease a jeho prvním zápisem; chyby zápisu keep-alive lease jsou polykány (apps/majordomus-cli/src/lease.rs:1058-1060). Předpoklad balíčku o strukturovaném logování je vyvrácen: logování je lidsky čitelný tracing fmt na stderr bez JSON, korelačního id a redakce (apps/majordomus-cli/src/logging.rs:29-37). Doctor nejvyšší úrovně je governance doctor (lib/doctor.sh:53-77). Změřeno v auditu základní hodnoty runtime z 2026-10-09 na master 1fb8d6be44 (plan/RUNTIME_BASELINE.md).
Výsledek
Klient na jednom endpointu rozliší běžící od připraveného, od zdravého v meshi, od degradovaného; žádný klient nemůže držet workera za deklarovaný deadline; každá třída selhání v publikované tabulce pojmenovává svůj test nebo deklarované omezení.
Aktuální stav
Implementováno: /api/v1/live, ohraničená čekání lease na straně klienta, timeouty spojení, meze rozdílu hodin, typované kontroly doktora meshe (apps/majordomus-cli/src/mesh/doctor.rs:93-372). Částečně: připravenost, zdraví, pokrytí tříd selhání. Chybí: deadliny požadavků na straně serveru.
Cílový stav
Tabulka selhání v docs/DEVELOPMENT_RUNTIME.md nemá řádek bez testu nebo omezení, případ odmítne řádek s ani jedním a readiness a health odrážejí každý stav, který runtime o sobě už zná.
Rozsah
- apps/majordomus-cli/src/capability/builtin/health.rs
- apps/majordomus-cli/src/http
- apps/majordomus-cli/src/lease.rs
- apps/majordomus-cli/src/logging.rs
- apps/majordomus-cli/src/mesh/doctor.rs
- apps/majordomus-cli/src/policy.rs
- .ai/repo/policy.yaml
- lib/doctor.sh
- lib/common.sh
- apps/majordomus-cli/tests/
- test/cases
- docs/DEVELOPMENT_RUNTIME.md
- docs/MCP.md
Mimo rozsah
- Circuit breakers; audit nenašel důkaz, že je některý opodstatněný.
- Zásobník metrik nebo odesílání logů; runtime hlásí přes vlastní schopnosti.
- Odolnost deníku, což je I2137 (mesh-journal-converges).
Kritéria přijetí
- /api/v1/ready hlásí false s pojmenovaným důvodem po ztrátě leasu
- health.report nese kontrolu mesh, když je mesh zapnut
- Pomalí klienti nedrží žádného pracovníka po deklarované lhůtě
- Každá třída selhání ve zveřejněné tabulce jmenuje test v CI nebo uvedené omezení
Validace
- bin/majordomus plan validate
- cargo test --test health_server --test http_serve --test mcp_shared --test lease_busy
- MJ_TEST_JOBS=4 bash test/run.sh <the cases these issues add>
Požadované důkazy
- readiness_reflects_state
- request_deadline_test
- failure_class_table
Rizika
- Zpřísnění readiness může způsobit, že kontroly zdraví nasazení selžou tam, kde procházely; blok zdraví fly-deployment čte /api/v1/live a musí to dělat dál.
- Příliš krátký limit na čtení požadavku rozbije pomalá spojení; musí být deklarován a změřen.
Důkazy
Milník není nikdy hotový tím, že jsou hotové jeho úkoly; poslední krok je jeho vlastní přijetí a podmiňují jej řádky níže.
| pokrývá | typ | command | výsledek |
|---|---|---|---|
| readiness_reflects_state | ci | gh run view 38635619021 (validate na masteru c0e3585dc8, push): job rust (3) 116098148455 spouští cargo test --test lease_lost --test health_server; job rust (2) 116098148534 spouští test knihovny capability::builtin::health::tests | success. lease_lost: a_server_that_lost_its_lease_says_so_and_takes_on_nobody_new ok (1 passed; /api/v1/ready false with reason lease_lost); health_server: 7 passed, including an_enabled_mesh_that_runs_is_a_healthy_dimension_as_the_doctor_says, an_enabled_mesh_whose_every_transport_failed_fails_the_dimension_as_the_doctor_does, the_mesh_is_a_dimension_of_health_and_unknown_where_no_server_decided_it; lib: readiness_names_a_degraded_layer_and_is_still_ready, readiness_reports_what_this_process_already_holds, readiness_refuses_a_process_whose_executable_was_removed_under_it ok. Delivered by I2157 (DONE); the run's head is origin/master, so the tested code is the code on master |
| request_deadline_test | ci | gh run view 38635619021 (validate na master c0e3585dc8, push): job rust (3) 116098148455 spouští cargo test --test http_slow_client | úspěch. http_slow_client: slow_client_released_test ok (pomalí klienti uzavřeni v deklarované lhůtě a započítáni v connections.closed_by_deadline, pátý klient obsloužen), past_the_handler_bound_a_request_is_refused_and_the_probe_is_answered ok (2 prošly, 16,88 s). Lhůta je deklarována jako server.read_deadline_seconds: 30 v .ai/repo/policy.yaml a zdokumentována v docs/MCP.md. Dodáno I2156 (HOTOVO); head běhu je origin/master |
Ú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 |
|---|---|---|---|---|
| I2156 | HOTOVO | 0 | — | Pomalý nebo mlčící HTTP klient nemůže držet worker serveru |
| I2157 | HOTOVO | 0 | — | Ready znamená ready: ztracený lease, degradovaná vrstva nebo selhávající mesh se nehlásí jako ready |
| I2707 | HOTOVO | 1 | I2157 | majordomus doctor hlásí zastaralý server, nebo prostě říká, že kontroluje jen governance |
| I2731 | HOTOVO | 0 | — | Každá třída selhání v publikované tabulce selhání jmenuje svůj test nebo uvedené omezení |
| I2827 | HOTOVO | 0 | — | Nástroj napsaný před okamžikem se spustí, až ho jeho autor pustí |
| I3310 | PŘIPRAVENO | 0 | — | majordomus start refuses a task, owner or reason that the task record cannot hold, and writes nothing |
Graf
flowchart LR
I2156["I2156<br/>A slow or silent HTTP client cannot hold a server worker"]:::done
I2157["I2157<br/>Ready means ready: a lost lease, a degraded layer or a failing mesh is not reported ready"]:::done
I2707["I2707<br/>majordomus doctor reports a stale server, or says plainly that it checks governance only"]:::done
I2731["I2731<br/>Every failure class in the published failure table names its test or its stated limitation"]:::done
I2827["I2827<br/>A tool written a moment ago is run once its writer lets go"]:::done
I3310["I3310<br/>majordomus start refuses a task, owner or reason that the task record cannot hold, and writes nothing"]:::ready
I2157 --> I2707
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:2pxOdkazováno z tohoto diagramu (6)
- I2156 Pomalý nebo mlčící HTTP klient nemůže držet worker serveru
- I2157 Připraveno znamená připraveno: ztracené lease, degradovaná vrstva nebo selhávající mesh se nehlásí jako připraveno
- I2707 majordomus doctor hlásí zastaralý server, nebo otevřeně říká, že kontroluje jen governance
- I2731 Každá třída selhání v publikované tabulce selhání jmenuje svůj test nebo uvedené omezení
- I2827 Nástroj napsaný před chvílí se spustí, až když ho jeho zapisovatel pustí
- I3310 majordomus start refuses a task, owner or reason that the task record cannot hold, and writes nothing
Kanonický záznam: .ai/repo/project/milestones/failure-is-visible.yaml. Načtěte jej zpět pomocí majordomus plan show failure-is-visible.