mesh-journal-converges — Žurnál kooperace je trvalý, konverguje při jakémkoli pořadí doručení a nikdy nenechá zastaralý nárok zvítězit
Událost, kterou runtime přijal, přežije pád, nebo je ohlášena jako ztracená; repliky se stejnou autentizovanou sadou událostí vytvoří týž digest při jakémkoli pořadí doručení; claim, který vypršel, se nikdy nevrátí, aby přebil claim přijatý za jeho nepřítomnosti, a každý konflikt claimů je oznámen; každá stránka žurnálu vrací každou událost jednou.
AKTIVNÍ 4 of 7 issues done
- připraveno
- 3
- blokováno
- 0
- aktivní
- 0
- verify
- 0
- hotovo
- 4
- zrušeno
- 0
Problém
Gramatika a fold podepsaného žurnálu jsou tam, kde se testují, v pořádku: události jsou podepsány nad kanonickým JSON (apps/majordomus-cli/src/mesh/journal.rs:934-948), fold řadí podle (lamport, stream, seq) (apps/majordomus-cli/src/mesh/state.rs:508-513) a proptesty permutují doručení. Jeho trvanlivost a tvrzení však v pořádku nejsou. Journal::persist ignoruje chyby zápisu (apps/majordomus-cli/src/mesh/journal.rs:1984), nikdy nevolá fsync a načtení mlčky zahazuje nerozparsovatelné řádky (apps/majordomus-cli/src/mesh/journal.rs:1407-1413); připojení za utržený konec slije další událost s poškozeným řádkem. Tvrzení nemají fencing: vypršení je verdikt při foldu, který se obrátí, když stejný stream po spánku nebo rozdělení sítě znovu zatepe (apps/majordomus-cli/src/mesh/journal.rs:1681-1697, apps/majordomus-cli/src/mesh/state.rs:656-661), a oživené tvrzení pak přebije tvrzení, které bylo v jeho nepřítomnosti oprávněně přijato. Uvolnění se kontroluje podle běhu, ne podle relace (apps/majordomus-cli/src/mesh/cooperation.rs:3373-3390). Rozpočet synchronizace ignoruje velikost značek (apps/majordomus-cli/src/mesh/journal.rs:1734-1766), takže vytížený žurnál může překročit MAX_LINK_MESSAGE (apps/majordomus-cli/src/mesh/link.rs:67,70). Stránkování mesh.events vrací jako kurzor maximální lamport žurnálu a události přeskakuje (apps/majordomus-cli/src/capability/builtin/mesh.rs:594-596, apps/majordomus-cli/src/mesh/journal.rs:2124-2133). docs/MESH.md:189-190 tvrdí, že testování permutací pokrývá jeden stream o šesti událostech. Změřeno v auditu základní linie běhu ze dne 2026-10-09 na masteru 1fb8d6be44 (plan/RUNTIME_BASELINE.md).
Výsledek
Událost, kterou runtime přijal, přežije pád, nebo je ohlášena jako ztracená; repliky se stejnou autentizovanou sadou událostí vytvoří týž digest při jakémkoli pořadí doručení; claim, který vypršel, se nikdy nevrátí, aby přebil claim přijatý za jeho nepřítomnosti, a každý konflikt claimů je oznámen; každá stránka žurnálu vrací každou událost jednou.
Aktuální stav
Trvalé: klíč uzlu a každá přijatá událost, bez fsync a s ignorovanými chybami zápisu. Jen v paměti: registr, spojení, nonce, náhrobky, beaty. Exkluzivita je lokální přijetí plus deterministické dodatečné pojmenování vítěze, bez fencing tokenu a bez oznámení při přechodu Held na Conflicted. Kontrola důvěry při opětovném načtení žurnálu a horní mez Lamport jsou I2124 (milník runtime-trust, probíhá na fix/a-remote-caller-cannot-write) a nejsou zde opakovány; kritérium runtime-trust, že „prošlý claim se nevrátí jako živý“, splňuje I2138 v tomto milníku.
Cílový stav
Každý řádek kontraktu konzistence z auditu (plan/RUNTIME_BASELINE.md) jmenuje test: utržený konec, selhaný zápis, pád během kompaktace, oživené tvrzení, uvolnění jinou relací, synchronizace na hranici značky, stránkování napříč sdílenými lamporty a náhodný vlastnostní test s více streamy s permutací a duplikací. docs/MESH.md uvádí exkluzivitu jako lokální přijetí s oznámenými konflikty, ne jako zámek.
Rozsah
- apps/majordomus-cli/src/mesh/journal.rs
- apps/majordomus-cli/src/mesh/state.rs
- apps/majordomus-cli/src/mesh/cooperation.rs
- apps/majordomus-cli/src/mesh/link.rs
- apps/majordomus-cli/src/mesh/doctor.rs
- apps/majordomus-cli/src/capability/builtin/mesh.rs
- apps/majordomus-cli/tests/mesh_cooperation.rs
- apps/majordomus-cli/tests/mesh_compaction.rs
- apps/majordomus-cli/tests/mesh.rs
- test/cases
- test/mesh-lab
- docs/MESH.md
Mimo rozsah
- Globální zámek, kvorum nebo koordinátor. Invariant balíčku 5 dovoluje místo toho silné záruky odmítnout; dokumentace už linearizovatelnost vylučuje (docs/MESH.md:26-27,612-613) a tento milník tento postoj drží, pokud ADR nerozhodne jinak.
- Kontrola důvěry při opětovném načtení žurnálu a hranice Lamportových hodin, což je I2124.
- Uchovávání náhrobků, které dokumentace zaznamenává jako záměrné omezení.
Kritéria přijetí
- Utržený nebo nečitelný řádek deníku počítá a hlásí mesh doctor a žádná úplná událost před ním ani po něm se neztratí
- Selhání zápisu se hlásí a událost se nepotvrdí jako uložená
- Tvrzení, které vypršelo a po rozdělení oživlo, je vůči tvrzení přijatému za jeho nepřítomnosti na každém runtime Conflicted, nikoli Held
- Dvě repliky krmené týmiž ověřenými událostmi v libovolném pořadí a s duplicitami hlásí shodné digesty, což ověřuje multi-stream property test
- Žádná synchronizační zpráva nepřekročí MAX_LINK_MESSAGE a stránky mesh.events vrací každou událost právě jednou
Validace
- bin/majordomus plan validate
- cargo test --lib mesh
- cargo test --test mesh_cooperation --test mesh_compaction --test mesh
- MJ_TEST_JOBS=4 bash test/run.sh 368_mesh_handover_resolves 493_mesh_compaction_keeps_what_is_live
Požadované důkazy
- journal_durability_tests
- claim_fencing_tests
- multi_stream_convergence_proptest
Rizika
- Přidání epochy do ClaimAcquired je změna na drátě; potřebuje verzi schématu linku nebo událostí řešenou tak, jak ji oceňuje I2164, jinak staré runtimy nové pole odmítnou nebo špatně přečtou.
- fsync při každém připojení stojí latenci na cestě heartbeatu; zvolená mez se musí změřit, ne předpokládat.
- I2124 upravuje stejnou cestu znovunačtení v apps/majordomus-cli/src/mesh/journal.rs; I2137 by měl přistát po něm.
Ú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 |
|---|---|---|---|---|
| I2137 | HOTOVO | 0 | — | Přijatá událost meshe je na disku dřív, než se počítá, a poškozený řádek žurnálu se nahlásí, nikdy tiše nesloučí ani nezahodí |
| I2139 | HOTOVO | 0 | — | Zpráva synchronizace zůstává pod hranicí odkazu, ať váží značky cokoli |
| I2140 | HOTOVO | 0 | — | Stránkování mesh.events vrací každou událost přesně jednou |
| I2706 | HOTOVO | 1 | I2137 | Vlastní událost, jejíž připojení selhalo, se nikdy nepotvrdí jako trvalá a opětovné načtení žurnálu je omezené velikostí |
| I2733 | PŘIPRAVENO | 1 | I2140 | Obnovený průchod mesh.events vrátí každou událost přesně jednou, napříč oddíly |
| I2825 | PŘIPRAVENO | 0 | — | Tvrzení uvolněné na jednom runtimu je uvolněno na každém runtimu, který ho drží, a odkaz na restartovaného peera se obnoví |
| I3174 | PŘIPRAVENO | 0 | — | An exclusive claim carries a fencing epoch, and a holder returning under an old epoch is refused |
Graf
flowchart LR
I2137["I2137<br/>An accepted mesh event is on disk before it counts, and a damaged journal line is reported, never fused or dropped silently"]:::done
I2139["I2139<br/>A sync message stays under the link bound whatever the marks weigh"]:::done
I2140["I2140<br/>Paging mesh.events returns every event exactly once"]:::done
I2706["I2706<br/>An own event whose append failed is never acknowledged as durable, and a journal reload is bounded in size"]:::done
I2733["I2733<br/>A resumed mesh.events walk returns every event exactly once, across partitions"]:::ready
I2825["I2825<br/>A claim released on one runtime is released on every runtime that holds it, and a link to a restarted peer recovers"]:::ready
I3174["I3174<br/>An exclusive claim carries a fencing epoch, and a holder returning under an old epoch is refused"]:::ready
I2137 --> I2706
I2140 --> I2733
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 (7)
- I2137 Přijatá událost meshe je na disku dříve, než se počítá, a poškozený řádek žurnálu se ohlásí, nikdy se tiše nesloučí ani nezahodí
- I2139 Synchronizační zpráva zůstane pod limitem linky, ať značky váží cokoli
- I2140 Stránkování mesh.events vrací každou událost právě jednou
- I2706 Vlastní událost, jejíž připojení selhalo, se nikdy nepotvrdí jako trvalá a opětovné načtení žurnálu je omezeno velikostí
- I2733 Obnovený průchod mesh.events vrátí každou událost právě jednou, napříč partice
- I2825 Nárok uvolněný na jednom runtime je uvolněn na každém runtime, který ho drží, a linka k restartovanému peerovi se obnoví
- I3174 An exclusive claim carries a fencing epoch, and a holder returning under an old epoch is refused
Kanonický záznam: .ai/repo/project/milestones/mesh-journal-converges.yaml. Přečtěte jej zpět pomocí majordomus plan show mesh-journal-converges.