I2135 — Kořen důvěry se čte z výchozí větve, ne z toho, co drží checkout
Nechat pracovní strom důvěru meshe jen zužovat a nikdy rozšiřovat: řídit se deklarací pracovního stromu s odstraněným každým rozšířením z commitnuté kopie kmene, nahlásit každý ignorovaný řádek a odmítnout commitnutou deklaraci, která důvěřuje při prvním použití.
HOTOVO vlna 0 · p0 · profil implementation · běží samostatně
Cíl
Nechat pracovní strom důvěru meshe jen zužovat a nikdy rozšiřovat: řídit se deklarací pracovního stromu s odstraněným každým rozšířením z commitnuté kopie kmene, nahlásit každý ignorovaný řádek a odmítnout commitnutou deklaraci, která důvěřuje při prvním použití.
Proč
Server čte .ai/repo/mesh/ z pracovního stromu checkoutu jednou při startu (apps/majordomus-cli/src/shared.rs:34-48,164-174). Větev nebo necommitnutá úprava může přidat klíč do trust.allow, přidat seeds nebo rendezvous.endpoints, kvůli nimž runtime posílá svou kartu a obálku hostiteli dle volby autora větve, nebo nastavit policy tofu, a runtime onoho checkoutu se tím řídí (hrozba T12); peeři soudí podle vlastního souboru, takže škoda je lokální pro onen checkout, což je ten, ve kterém recenzent spouští větev přispěvatele. docs/MESH.md:365,382-399 a ADR 0050 pravidlo 6 říkají, že deklarace je commitnutá; ADR 0059 zaznamenává tuto třídu incidentu. Žádná kontrola CI commitnutou deklaraci tofu neodmítá (tabulka vynucování, 'no unknown remote auto-trust': jen unit testy, apps/majordomus-cli/src/mesh/trust.rs:25-35, apps/majordomus-cli/src/mesh/config.rs:397). Výchozí audit z 2026-10-09 na masteru 1fb8d6be44, mezera meshe 10 a drift 12.
Aktuální stav
Dodáno commity 4816d7c8ad a 11472da40d: mesh::root::resolve zužuje deklaraci pracovního stromu na commitnutou kopii trunku (trunk je lokální větev, kterou repozitář jmenuje jako svůj trunk; zastaralý lokální trunk je starší důvěra, bezpečný směr), každý čtenář se ho ptá, mesh doctor jmenuje každý ignorovaný řádek a scripts/ci/mesh-check odmítne commitnuté tofu, což nyní řídí případ 301.
Cílový stav
mesh::root::resolve porovnává deklaraci pracovního stromu s commitnutou kopií kmene: povoleno jen pokud obě, politika ne volnější než kmenová, klíče, endpointy, seedy a sítě jen tak, jak je kmen uvádí (loopback endpointy a seedy povoleny); bez kopie kmene je tofu odmítnuto. Každý čtenář deklarace se ptá jí. Kontrola trust-root v mesh doctor jmenuje každou ignorovanou řádku; mesh-check odmítne commitnuté tofu. Čtení jen kmene bylo zamítnuto: rozbilo by to zjišťování loopback worktree a každou fixturu, která mesh deklaruje, bez bezpečnostního zisku oproti zúžení.
Rozsah
- apps/majordomus-cli/src/shared.rs
- apps/majordomus-cli/src/mesh/config.rs
- apps/majordomus-cli/src/mesh/doctor.rs
- scripts/ci/mesh-check
- apps/majordomus-cli/src/mesh/root.rs
- apps/majordomus-cli/src/capability/builtin/mesh.rs
- apps/majordomus-cli/tests/mesh.rs
- apps/majordomus-cli/tests/mesh_trust_root.rs
- test/cases
- docs/MESH.md
Závislosti
Žádné. Tento úkol je kořenem grafu.
Kritéria přijetí
- Úprava pracovního stromu, která přidá klíč do trust.allow, tento klíč nepřipustí a mesh doctor ten rozdíl jmenuje
- Větev, která přidá rendezvous endpoint, nedonutí svůj runtime, aby na něj posílal, dokud není změna na výchozí větvi
- Commitnutá deklarace s politikou tofu shodí scripts/ci/mesh-check
Validace
- bin/majordomus plan validate
- cargo test --test mesh
- MJ_TEST_JOBS=4 bash test/run.sh 301_the_mesh_stays_one_subsystem 494_the_mesh_is_declared_and_held
Požadované důkazy
- working_tree_trust_edit_ignored_test
- tofu_declaration_refused_case
Důkazy
| pokrývá | typ | command | výsledek | u commitu |
|---|---|---|---|---|
| working_tree_trust_edit_ignored_test | ci | gh run view 38635619021 --json jobs (validate na master c0e3585dc8, push); job 116098148455 rust (3) spouští tests/mesh_trust_root.rs | test result: ok. 4 passed; 0 failed at master c0e3585dc8 (Rust tree identical to e8505a431d): a_working_tree_edit_that_widens_trust_is_not_obeyed (an uncommitted edit adding key B, policy tofu and endpoint 198.51.100.7 leaves allow=[A], deny_unknown, no endpoint, 3 narrowed lines, and mesh doctor's trust-root check fails naming B, 198.51.100.7 and tofu), a_branch_that_commits_a_widening_is_held_to_the_trunk (a branch commit adding a rendezvous endpoint is not posted to until the trunk lists it), trust_on_first_use_is_honoured_only_from_a_committed_copy, a_working_tree_that_narrows_trust_is_obeyed_as_written; delivered by 4816d7c8ad and 11472da40d (mesh::root::resolve, the trunk being the local branch the repository names as its trunk) | c0e3585 |
| tofu_declaration_refused_case | test | MJ_TEST_JOBS=2 bash test/run.sh 301_the_mesh_stays_one_subsystem 494_the_mesh_is_declared_and_held 1023_a_branch_cannot_widen_the_mesh_trust | 3 prošly na větvi chore/the-trust-root-is-the-default-branch-is-done (master c0e3585dc8 + případ 301 sekce 4): commitnutý .ai/repo/mesh/majordomus.yaml s trust.policy tofu způsobí, že scripts/ci/mesh-check skončí s 10 a jmenuje soubor a politiku; stejná deklarace s deny_unknown projde; necommitnuté tofu se nechá runtime. Mutace: s vypnutým vzorem tofu v kontrole případ 301 selže (očekáváno exit 10, dostal 0). Případ 1023 drží tofu větve, druhý klíč a hub mimo platnost | c0e3585 |
Časová osa
- zahájeno
- 2026-10-15T01:28:05Z
- ověřeno
- 2026-10-15T01:28:17Z
- dokončeno
- 2026-10-15T01:28:23Z
Tato tři pole, důkazy výše a stav závislostí jsou vše, z čeho se stav skládá. Neexistuje žádné pole stavu, které by s nimi mohlo být v rozporu.
Kanonický záznam: .ai/repo/project/issues/I2135.yaml. Načtěte ho zpět pomocí majordomus plan show I2135.