diff --git a/scripts/seo/config.mjs b/scripts/seo/config.mjs index 0b5d7ff..f45f72a 100644 --- a/scripts/seo/config.mjs +++ b/scripts/seo/config.mjs @@ -6,7 +6,7 @@ export default { drop: ['script', 'style', 'button', 'form', '.prevnext'], title: 'Mru docs', summary: - "Reference for Mru's open core: the shrinking-quorum decision crate and its fault-injection demo (Rust, no_std, four Kani proofs), the Dusk simulator and the Mru 2049 browser flight simulator. Prototype at TRL 3; code under Apache 2.0.", + "Reference for Mru's open core, for unattended missions with no repair path: the shrinking-quorum decision crate and its fault-injection demo (Rust, no_std, nine Kani proofs: four on the core, five on the C interface), the Dusk simulator and the Mru 2049 browser flight simulator. Prototype on general-purpose processors, not flight hardware; code under Apache 2.0.", intro: 'Product pages, use cases and research results are at https://mru.space/llms.txt. Questions: contact@mru.space.', sections: [ diff --git a/scripts/sync-tokens.mjs b/scripts/sync-tokens.mjs index 1b679bf..9efceb1 100644 --- a/scripts/sync-tokens.mjs +++ b/scripts/sync-tokens.mjs @@ -21,6 +21,11 @@ const FILES = [ ]), ['src/scripts/theme.ts', 'src/scripts/theme.ts'], ['src/components/Breadcrumbs.astro', 'src/components/Breadcrumbs.astro'], + // Headline numbers: claims.json is generated in the website from the flight + // and dusk results files. Docs pages read them with claim() or . + ['src/data/claims.json', 'src/data/claims.json'], + ['src/data/claims.ts', 'src/data/claims.ts'], + ['src/components/Claim.astro', 'src/components/Claim.astro'], // Shared build scripts: share cards, Markdown twins and llms files, checks. // Each repo keeps its own scripts/seo/config.mjs. ...[ diff --git a/src/components/Claim.astro b/src/components/Claim.astro new file mode 100644 index 0000000..bbf1ff4 --- /dev/null +++ b/src/components/Claim.astro @@ -0,0 +1,15 @@ +--- +// A number from claims.json, for MDX and templates: . +// part="ci" gives the interval, part="min" the lowest seed. +import { claim } from '../data/claims'; +interface Props { + id: string; + part?: 'text' | 'ci' | 'min'; +} +const { id, part = 'text' } = Astro.props; +const c = claim(id); +const out = part === 'ci' ? c.ci : part === 'min' ? c.min_text : c.text; +if (out === undefined) throw new Error(`claims.json: claim "${id}" has no ${part}`); +--- + + diff --git a/src/data/claims.json b/src/data/claims.json new file mode 100644 index 0000000..edb9f5f --- /dev/null +++ b/src/data/claims.json @@ -0,0 +1,3050 @@ +{ + "note": "Generated by scripts/claims/pull.mjs. Do not edit by hand.", + "generated": "2026-10-11", + "sources": { + "flight": { + "repo": "mruspace/flight", + "commit": "900a1fd", + "bench": ["2026-10-11-darwin-arm64.json", "2026-10-11-linux-aarch64.json", "2026-10-11-linux-x86_64.json"], + "bench_commits": { "darwin-arm64": "7c1a629", "linux-aarch64": "d79b345", "linux-x86_64": "d79b345" }, + "kat": "2026-10-11-darwin-arm64-kat.json", + "kat_commit": "22ea557" + }, + "dusk": { + "repo": "mruspace/dusk", + "commit": "6936feb", + "runs": 10000, + "seed": 1, + "generated": { + "date": "2026-10-11", + "commit": "6936feb", + "host": "darwin-arm64", + "rustc": "rustc 1.86.0 (05f9846f8 2025-03-31)", + "seed": 1, + "runs": 10000 + } + } + }, + "claims": { + "dusk.break_even_years": { + "value": 136.4421, + "lo": 131.4738, + "hi": 141.9611, + "format": "years0", + "unit": "years of useful work per wrong result, above which fixed TMR comes out ahead", + "scope": "Dusk default scenario, 10,000 missions, seed 1", + "conditions": "Weibull shape 1.5, scale 125 y, correlated deaths 0.1, upset rate 1e-3, self-check coverage 0.99, self-check throughput 0.5. No ground support after launch. 95% paired bootstrap, 2,000 resamples. Parameters illustrative, not calibrated.", + "source": { + "repo": "dusk", + "path": "docs/data.json: headline.break_even_years", + "command": "cargo run --release --bin charts" + }, + "text": "136", + "ci": "131 to 142" + }, + "dusk.cold.crossing": { + "value": 0.1954, + "format": "dec2", + "unit": "spare aging rate below which three-string cold standby does more useful work than the shrinking quorum", + "scope": "Dusk --sweep, cold standby by spare aging rate, 10,000 missions per row", + "conditions": "Weibull shape 1.5, scale 125 y, correlated deaths 0.1, upset rate 1e-3, self-check coverage 0.99, self-check throughput 0.5. No ground support after launch. 95% paired bootstrap, 2,000 resamples. Parameters illustrative, not calibrated.", + "source": { + "repo": "dusk", + "path": "docs/data.json: cold.crossing", + "command": "cargo run --release --bin charts" + }, + "text": "0.20" + }, + "dusk.fewer_wrong_vs_simplex": { + "value": 0.5915, + "lo": 0.5779000000000001, + "hi": 0.6048, + "format": "pct0", + "unit": "fewer wrong results than standby simplex", + "scope": "Dusk default scenario, 10,000 missions, seed 1", + "conditions": "Weibull shape 1.5, scale 125 y, correlated deaths 0.1, upset rate 1e-3, self-check coverage 0.99, self-check throughput 0.5. No ground support after launch. 95% paired bootstrap, 2,000 resamples. Parameters illustrative, not calibrated.", + "source": { + "repo": "dusk", + "path": "docs/data.json: 1 - headline.wrong_vs_simplex", + "command": "cargo run --release --bin charts" + }, + "text": "59%", + "ci": "58% to 60%" + }, + "dusk.ground.0": { + "value": 1.3399, + "lo": 1.3323, + "hi": 1.3474, + "format": "ratio2", + "unit": "the useful work of a ground-commanded fallback, when ground support ends after 0 years", + "scope": "Dusk default scenario, 10,000 missions, seed 1", + "conditions": "Ground answers in 30 days. Weibull shape 1.5, scale 125 y, correlated deaths 0.1, upset rate 1e-3, self-check coverage 0.99, self-check throughput 0.5. No ground support after launch. 95% paired bootstrap, 2,000 resamples. Parameters illustrative, not calibrated.", + "source": { + "repo": "dusk", + "path": "docs/data.json: ground.points[years=0]", + "command": "cargo run --release --bin charts" + }, + "text": "1.34×", + "ci": "1.33× to 1.35×" + }, + "dusk.ground.100": { + "value": 1.1064, + "lo": 1.1026, + "hi": 1.1103, + "format": "ratio2", + "unit": "the useful work of a ground-commanded fallback, when ground support ends after 100 years", + "scope": "Dusk default scenario, 10,000 missions, seed 1", + "conditions": "Ground answers in 30 days. Weibull shape 1.5, scale 125 y, correlated deaths 0.1, upset rate 1e-3, self-check coverage 0.99, self-check throughput 0.5. No ground support after launch. 95% paired bootstrap, 2,000 resamples. Parameters illustrative, not calibrated.", + "source": { + "repo": "dusk", + "path": "docs/data.json: ground.points[years=100]", + "command": "cargo run --release --bin charts" + }, + "text": "1.11×", + "ci": "1.10× to 1.11×" + }, + "dusk.ground.25": { + "value": 1.312, + "lo": 1.305, + "hi": 1.3189, + "format": "ratio2", + "unit": "the useful work of a ground-commanded fallback, when ground support ends after 25 years", + "scope": "Dusk default scenario, 10,000 missions, seed 1", + "conditions": "Ground answers in 30 days. Weibull shape 1.5, scale 125 y, correlated deaths 0.1, upset rate 1e-3, self-check coverage 0.99, self-check throughput 0.5. No ground support after launch. 95% paired bootstrap, 2,000 resamples. Parameters illustrative, not calibrated.", + "source": { + "repo": "dusk", + "path": "docs/data.json: ground.points[years=25]", + "command": "cargo run --release --bin charts" + }, + "text": "1.31×", + "ci": "1.30× to 1.32×" + }, + "dusk.ground.50": { + "value": 1.2489, + "lo": 1.2426, + "hi": 1.2547, + "format": "ratio2", + "unit": "the useful work of a ground-commanded fallback, when ground support ends after 50 years", + "scope": "Dusk default scenario, 10,000 missions, seed 1", + "conditions": "Ground answers in 30 days. Weibull shape 1.5, scale 125 y, correlated deaths 0.1, upset rate 1e-3, self-check coverage 0.99, self-check throughput 0.5. No ground support after launch. 95% paired bootstrap, 2,000 resamples. Parameters illustrative, not calibrated.", + "source": { + "repo": "dusk", + "path": "docs/data.json: ground.points[years=50]", + "command": "cargo run --release --bin charts" + }, + "text": "1.25×", + "ci": "1.24× to 1.25×" + }, + "dusk.ground.never": { + "value": 1.0017, + "lo": 1.0012, + "hi": 1.0022, + "format": "ratio2", + "unit": "the useful work of a ground-commanded fallback when ground support never ends (last point, 250 years, past every processor's life)", + "scope": "Dusk default scenario, 10,000 missions, seed 1", + "conditions": "Ground answers in 30 days. Weibull shape 1.5, scale 125 y, correlated deaths 0.1, upset rate 1e-3, self-check coverage 0.99, self-check throughput 0.5. No ground support after launch. 95% paired bootstrap, 2,000 resamples. Parameters illustrative, not calibrated.", + "source": { + "repo": "dusk", + "path": "docs/data.json: ground.points[-1]", + "command": "cargo run --release --bin charts" + }, + "text": "1.00×", + "ci": "1.00× to 1.00×" + }, + "dusk.nodes2.work_vs_cold.01": { + "value": 1.05, + "format": "ratio2", + "text": "1.05×", + "ci": "1.05× to 1.05×", + "unit": "the useful work of two-string cold standby, spare aging rate 0.1", + "scope": "Dusk --nodes 2, 10,000 missions, seed 1", + "conditions": "Weibull shape 1.5, scale 125 y, correlated deaths 0.1, upset rate 1e-3, self-check coverage 0.99, self-check throughput 0.5. No ground support after launch. 95% paired bootstrap, 2,000 resamples. Parameters illustrative, not calibrated.", + "source": { + "repo": "dusk", + "path": "docs/data.json: display.nodes2_work_vs_cold_01", + "command": "cargo run --release --bin charts" + } + }, + "dusk.nodes2.work_vs_cold.10": { + "value": 1.49, + "format": "ratio2", + "text": "1.49×", + "ci": "1.48× to 1.50×", + "unit": "the useful work of two-string cold standby, spare aging rate 1", + "scope": "Dusk --nodes 2, 10,000 missions, seed 1", + "conditions": "Weibull shape 1.5, scale 125 y, correlated deaths 0.1, upset rate 1e-3, self-check coverage 0.99, self-check throughput 0.5. No ground support after launch. 95% paired bootstrap, 2,000 resamples. Parameters illustrative, not calibrated.", + "source": { + "repo": "dusk", + "path": "docs/data.json: display.nodes2_work_vs_cold_10", + "command": "cargo run --release --bin charts" + } + }, + "dusk.risk.cold_01": { + "value": 0.6134, + "lo": 0.6036, + "hi": 0.6227, + "format": "pct1", + "unit": "of missions deliver at least one wrong result", + "scope": "Dusk default scenario, 10,000 missions, seed 1, cold standby, aging 0.1", + "conditions": "Weibull shape 1.5, scale 125 y, correlated deaths 0.1, upset rate 1e-3, self-check coverage 0.99, self-check throughput 0.5. No ground support after launch. 95% paired bootstrap, 2,000 resamples. Parameters illustrative, not calibrated.", + "source": { + "repo": "dusk", + "path": "docs/data.json: policies[cold standby, aging 0.1].risk", + "command": "cargo run --release --bin charts" + }, + "text": "61.3%", + "ci": "60.4% to 62.3%" + }, + "dusk.risk.cold_10": { + "value": 0.4321, + "lo": 0.4222, + "hi": 0.4416, + "format": "pct1", + "unit": "of missions deliver at least one wrong result", + "scope": "Dusk default scenario, 10,000 missions, seed 1, cold standby, aging 1.0", + "conditions": "Weibull shape 1.5, scale 125 y, correlated deaths 0.1, upset rate 1e-3, self-check coverage 0.99, self-check throughput 0.5. No ground support after launch. 95% paired bootstrap, 2,000 resamples. Parameters illustrative, not calibrated.", + "source": { + "repo": "dusk", + "path": "docs/data.json: policies[cold standby, aging 1.0].risk", + "command": "cargo run --release --bin charts" + }, + "text": "43.2%", + "ci": "42.2% to 44.2%" + }, + "dusk.risk.shrink": { + "value": 0.2012, + "lo": 0.1932, + "hi": 0.2089, + "format": "pct1", + "unit": "of missions deliver at least one wrong result", + "scope": "Dusk default scenario, 10,000 missions, seed 1, shrinking quorum", + "conditions": "Weibull shape 1.5, scale 125 y, correlated deaths 0.1, upset rate 1e-3, self-check coverage 0.99, self-check throughput 0.5. No ground support after launch. 95% paired bootstrap, 2,000 resamples. Parameters illustrative, not calibrated.", + "source": { + "repo": "dusk", + "path": "docs/data.json: policies[shrinking quorum].risk", + "command": "cargo run --release --bin charts" + }, + "text": "20.1%", + "ci": "19.3% to 20.9%" + }, + "dusk.risk.simplex": { + "value": 0.4321, + "lo": 0.4222, + "hi": 0.4416, + "format": "pct1", + "unit": "of missions deliver at least one wrong result", + "scope": "Dusk default scenario, 10,000 missions, seed 1, standby simplex", + "conditions": "Weibull shape 1.5, scale 125 y, correlated deaths 0.1, upset rate 1e-3, self-check coverage 0.99, self-check throughput 0.5. No ground support after launch. 95% paired bootstrap, 2,000 resamples. Parameters illustrative, not calibrated.", + "source": { + "repo": "dusk", + "path": "docs/data.json: policies[standby simplex].risk", + "command": "cargo run --release --bin charts" + }, + "text": "43.2%", + "ci": "42.2% to 44.2%" + }, + "dusk.risk.tmr": { + "value": 0, + "lo": 0, + "hi": 0, + "format": "pct1", + "unit": "of missions deliver at least one wrong result", + "scope": "Dusk default scenario, 10,000 missions, seed 1, fixed TMR", + "conditions": "Weibull shape 1.5, scale 125 y, correlated deaths 0.1, upset rate 1e-3, self-check coverage 0.99, self-check throughput 0.5. No ground support after launch. 95% paired bootstrap, 2,000 resamples. Parameters illustrative, not calibrated.", + "source": { + "repo": "dusk", + "path": "docs/data.json: policies[fixed TMR].risk", + "command": "cargo run --release --bin charts" + }, + "text": "0.0%", + "ci": "0.0% to 0.0%" + }, + "dusk.risk.unchecked": { + "value": 0.8719, + "lo": 0.8655, + "hi": 0.8782, + "format": "pct1", + "unit": "of missions deliver at least one wrong result", + "scope": "Dusk default scenario, 10,000 missions, seed 1, TMR + unchecked simplex", + "conditions": "Weibull shape 1.5, scale 125 y, correlated deaths 0.1, upset rate 1e-3, self-check coverage 0.99, self-check throughput 0.5. No ground support after launch. 95% paired bootstrap, 2,000 resamples. Parameters illustrative, not calibrated.", + "source": { + "repo": "dusk", + "path": "docs/data.json: policies[TMR + unchecked simplex].risk", + "command": "cargo run --release --bin charts" + }, + "text": "87.2%", + "ci": "86.6% to 87.8%" + }, + "dusk.runs": { + "value": 10000, + "format": "int", + "unit": "missions", + "scope": "Dusk default scenario, 10,000 missions, seed 1", + "conditions": "Weibull shape 1.5, scale 125 y, correlated deaths 0.1, upset rate 1e-3, self-check coverage 0.99, self-check throughput 0.5. No ground support after launch. 95% paired bootstrap, 2,000 resamples. Parameters illustrative, not calibrated.", + "source": { "repo": "dusk", "path": "docs/data.json: runs", "command": "cargo run --release --bin charts" }, + "text": "10,000" + }, + "dusk.sweep.range": { + "value": [1.1131, 1.6797], + "format": "ratio2", + "text": "1.11× to 1.68×", + "unit": "the useful work of fixed TMR, lowest and highest row of the sensitivity sweep", + "scope": "Dusk --sweep, 10,000 missions per row, seed 1", + "conditions": "One parameter varied at a time, the others at their defaults. No ground support after launch.", + "source": { + "repo": "dusk", + "path": "docs/data.json: sweep.rows[].points[].work", + "command": "cargo run --release --bin charts" + } + }, + "dusk.useful_years.cold_01": { + "value": 144.7462, + "format": "years1", + "unit": "mean useful years per mission", + "scope": "Dusk default scenario, 10,000 missions, seed 1, cold standby, aging 0.1", + "conditions": "Weibull shape 1.5, scale 125 y, correlated deaths 0.1, upset rate 1e-3, self-check coverage 0.99, self-check throughput 0.5. No ground support after launch. 95% paired bootstrap, 2,000 resamples. Parameters illustrative, not calibrated.", + "source": { + "repo": "dusk", + "path": "docs/data.json: policies[cold standby, aging 0.1].useful_years", + "command": "cargo run --release --bin charts" + }, + "text": "144.7" + }, + "dusk.useful_years.cold_10": { + "value": 83.107, + "format": "years1", + "unit": "mean useful years per mission", + "scope": "Dusk default scenario, 10,000 missions, seed 1, cold standby, aging 1.0", + "conditions": "Weibull shape 1.5, scale 125 y, correlated deaths 0.1, upset rate 1e-3, self-check coverage 0.99, self-check throughput 0.5. No ground support after launch. 95% paired bootstrap, 2,000 resamples. Parameters illustrative, not calibrated.", + "source": { + "repo": "dusk", + "path": "docs/data.json: policies[cold standby, aging 1.0].useful_years", + "command": "cargo run --release --bin charts" + }, + "text": "83.1" + }, + "dusk.useful_years.shrink": { + "value": 132.5904, + "format": "years1", + "unit": "mean useful years per mission", + "scope": "Dusk default scenario, 10,000 missions, seed 1, shrinking quorum", + "conditions": "Weibull shape 1.5, scale 125 y, correlated deaths 0.1, upset rate 1e-3, self-check coverage 0.99, self-check throughput 0.5. No ground support after launch. 95% paired bootstrap, 2,000 resamples. Parameters illustrative, not calibrated.", + "source": { + "repo": "dusk", + "path": "docs/data.json: policies[shrinking quorum].useful_years", + "command": "cargo run --release --bin charts" + }, + "text": "132.6" + }, + "dusk.useful_years.simplex": { + "value": 83.107, + "format": "years1", + "unit": "mean useful years per mission", + "scope": "Dusk default scenario, 10,000 missions, seed 1, standby simplex", + "conditions": "Weibull shape 1.5, scale 125 y, correlated deaths 0.1, upset rate 1e-3, self-check coverage 0.99, self-check throughput 0.5. No ground support after launch. 95% paired bootstrap, 2,000 resamples. Parameters illustrative, not calibrated.", + "source": { + "repo": "dusk", + "path": "docs/data.json: policies[standby simplex].useful_years", + "command": "cargo run --release --bin charts" + }, + "text": "83.1" + }, + "dusk.useful_years.tmr": { + "value": 98.9574, + "format": "years1", + "unit": "mean useful years per mission", + "scope": "Dusk default scenario, 10,000 missions, seed 1, fixed TMR", + "conditions": "Weibull shape 1.5, scale 125 y, correlated deaths 0.1, upset rate 1e-3, self-check coverage 0.99, self-check throughput 0.5. No ground support after launch. 95% paired bootstrap, 2,000 resamples. Parameters illustrative, not calibrated.", + "source": { + "repo": "dusk", + "path": "docs/data.json: policies[fixed TMR].useful_years", + "command": "cargo run --release --bin charts" + }, + "text": "99.0" + }, + "dusk.useful_years.unchecked": { + "value": 166.2234, + "format": "years1", + "unit": "mean useful years per mission", + "scope": "Dusk default scenario, 10,000 missions, seed 1, TMR + unchecked simplex", + "conditions": "Weibull shape 1.5, scale 125 y, correlated deaths 0.1, upset rate 1e-3, self-check coverage 0.99, self-check throughput 0.5. No ground support after launch. 95% paired bootstrap, 2,000 resamples. Parameters illustrative, not calibrated.", + "source": { + "repo": "dusk", + "path": "docs/data.json: policies[TMR + unchecked simplex].useful_years", + "command": "cargo run --release --bin charts" + }, + "text": "166.2" + }, + "dusk.work_vs_cold.01": { + "value": 0.916, + "lo": 0.9131, + "hi": 0.9187, + "format": "ratio2", + "unit": "the useful work of three-string cold standby, spare aging rate 0.1", + "scope": "Dusk default scenario, 10,000 missions, seed 1", + "conditions": "Spare aging rate 0.1 of a powered processor. Weibull shape 1.5, scale 125 y, correlated deaths 0.1, upset rate 1e-3, self-check coverage 0.99, self-check throughput 0.5. No ground support after launch. 95% paired bootstrap, 2,000 resamples. Parameters illustrative, not calibrated.", + "source": { + "repo": "dusk", + "path": "docs/data.json: headline.work_vs_cold[aging=0.1]", + "command": "cargo run --release --bin charts" + }, + "text": "0.92×", + "ci": "0.91× to 0.92×" + }, + "dusk.work_vs_cold.10": { + "value": 1.5954, + "lo": 1.5901, + "hi": 1.6008, + "format": "ratio2", + "unit": "the useful work of three-string cold standby, spare aging rate 1", + "scope": "Dusk default scenario, 10,000 missions, seed 1", + "conditions": "Spare aging rate 1 of a powered processor. Weibull shape 1.5, scale 125 y, correlated deaths 0.1, upset rate 1e-3, self-check coverage 0.99, self-check throughput 0.5. No ground support after launch. 95% paired bootstrap, 2,000 resamples. Parameters illustrative, not calibrated.", + "source": { + "repo": "dusk", + "path": "docs/data.json: headline.work_vs_cold[aging=1]", + "command": "cargo run --release --bin charts" + }, + "text": "1.60×", + "ci": "1.59× to 1.60×" + }, + "dusk.work_vs_tmr": { + "value": 1.3399, + "lo": 1.3323, + "hi": 1.3474, + "format": "ratio2", + "unit": "the useful work of fixed TMR, total over all missions", + "scope": "Dusk default scenario, 10,000 missions, seed 1", + "conditions": "Weibull shape 1.5, scale 125 y, correlated deaths 0.1, upset rate 1e-3, self-check coverage 0.99, self-check throughput 0.5. No ground support after launch. 95% paired bootstrap, 2,000 resamples. Parameters illustrative, not calibrated.", + "source": { + "repo": "dusk", + "path": "docs/data.json: headline.work_vs_tmr", + "command": "cargo run --release --bin charts" + }, + "text": "1.34×", + "ci": "1.33× to 1.35×" + }, + "dusk.work_vs_unchecked": { + "value": 0.7977, + "format": "pct0", + "unit": "of the useful work of TMR with an unchecked simplex fallback", + "scope": "Dusk default scenario, 10,000 missions, seed 1", + "conditions": "Weibull shape 1.5, scale 125 y, correlated deaths 0.1, upset rate 1e-3, self-check coverage 0.99, self-check throughput 0.5. No ground support after launch. 95% paired bootstrap, 2,000 resamples. Parameters illustrative, not calibrated.", + "source": { + "repo": "dusk", + "path": "docs/data.json: headline.work_vs_unchecked", + "command": "cargo run --release --bin charts" + }, + "text": "80%" + }, + "dusk.wrong_days.shrink": { + "value": 0.2465, + "format": "days3", + "unit": "wrong results per mission (one wrong day is one result)", + "scope": "Dusk default scenario, 10,000 missions, seed 1, shrinking quorum", + "conditions": "Weibull shape 1.5, scale 125 y, correlated deaths 0.1, upset rate 1e-3, self-check coverage 0.99, self-check throughput 0.5. No ground support after launch. 95% paired bootstrap, 2,000 resamples. Parameters illustrative, not calibrated.", + "source": { + "repo": "dusk", + "path": "docs/data.json: policies[shrinking quorum].wrong_per_mission", + "command": "cargo run --release --bin charts" + }, + "text": "0.246" + }, + "dusk.wrong_days.simplex": { + "value": 0.6034, + "format": "days3", + "unit": "wrong results per mission (one wrong day is one result)", + "scope": "Dusk default scenario, 10,000 missions, seed 1, standby simplex", + "conditions": "Weibull shape 1.5, scale 125 y, correlated deaths 0.1, upset rate 1e-3, self-check coverage 0.99, self-check throughput 0.5. No ground support after launch. 95% paired bootstrap, 2,000 resamples. Parameters illustrative, not calibrated.", + "source": { + "repo": "dusk", + "path": "docs/data.json: policies[standby simplex].wrong_per_mission", + "command": "cargo run --release --bin charts" + }, + "text": "0.603" + }, + "dusk.wrong_days.tmr": { + "value": 0, + "format": "days3", + "unit": "wrong results per mission (one wrong day is one result)", + "scope": "Dusk default scenario, 10,000 missions, seed 1, fixed TMR", + "conditions": "Weibull shape 1.5, scale 125 y, correlated deaths 0.1, upset rate 1e-3, self-check coverage 0.99, self-check throughput 0.5. No ground support after launch. 95% paired bootstrap, 2,000 resamples. Parameters illustrative, not calibrated.", + "source": { + "repo": "dusk", + "path": "docs/data.json: policies[fixed TMR].wrong_per_mission", + "command": "cargo run --release --bin charts" + }, + "text": "0.000" + }, + "dusk.wrong_vs_simplex": { + "value": 0.4085, + "lo": 0.3952, + "hi": 0.4221, + "format": "pct0", + "unit": "of the wrong results of standby simplex", + "scope": "Dusk default scenario, 10,000 missions, seed 1", + "conditions": "Weibull shape 1.5, scale 125 y, correlated deaths 0.1, upset rate 1e-3, self-check coverage 0.99, self-check throughput 0.5. No ground support after launch. 95% paired bootstrap, 2,000 resamples. Parameters illustrative, not calibrated.", + "source": { + "repo": "dusk", + "path": "docs/data.json: headline.wrong_vs_simplex", + "command": "cargo run --release --bin charts" + }, + "text": "41%", + "ci": "40% to 42%" + }, + "dusk.wrong_vs_unchecked": { + "value": 0.01, + "lo": 0.0096, + "hi": 0.0104, + "format": "pct2", + "unit": "of the wrong results of TMR with an unchecked simplex fallback", + "scope": "Dusk default scenario, 10,000 missions, seed 1", + "conditions": "Weibull shape 1.5, scale 125 y, correlated deaths 0.1, upset rate 1e-3, self-check coverage 0.99, self-check throughput 0.5. No ground support after launch. 95% paired bootstrap, 2,000 resamples. Parameters illustrative, not calibrated.", + "source": { + "repo": "dusk", + "path": "docs/data.json: headline.wrong_vs_unchecked", + "command": "cargo run --release --bin charts" + }, + "text": "1.00%", + "ci": "0.96% to 1.04%" + }, + "flight.bench.pairs": { + "value": 150, + "format": "int", + "unit": "run pairs, shrinking quorum against fixed TMR", + "scope": "Mru Flight bench, mean of 10 seeds, 20,000 ticks per run, three replica processes on one host; the same counts on all three hosts", + "conditions": "Every schedule and upset rate.", + "source": { + "repo": "flight", + "path": "bench/results/*.json: sum of summary[].seeds", + "command": "./scripts/bench.sh" + }, + "text": "150" + }, + "flight.bench.pairs_below": { + "value": 0, + "format": "int", + "unit": "run pairs where the shrinking quorum delivered fewer correct results", + "scope": "Mru Flight bench, mean of 10 seeds, 20,000 ticks per run, three replica processes on one host; the same counts on all three hosts", + "conditions": "Every schedule and upset rate.", + "source": { + "repo": "flight", + "path": "bench/results/*.json: sum of summary[].seeds_shrink_below_tmr", + "command": "./scripts/bench.sh" + }, + "text": "0" + }, + "flight.bench.ratio.common-mode": { + "value": 3.0008, + "min": 2.9997, + "format": "ratio2", + "unit": "correct results of the shrinking quorum over fixed TMR", + "scope": "Mru Flight bench, mean of 10 seeds, 20,000 ticks per run, three replica processes on one host; the same counts on all three hosts, schedule common-mode", + "conditions": "Upset rate 0.001, common-mode share 0.05, known-answer test every 64 ticks. General-purpose processors, not flight hardware.", + "source": { + "repo": "flight", + "path": "bench/results/*.json: summary[schedule=common-mode, upset_rate=0.001].useful_ratio_shrink_tmr", + "command": "./scripts/bench.sh" + }, + "text": "3.00×", + "min_text": "3.00×" + }, + "flight.bench.ratio.last-stuck": { + "value": 1.2501, + "min": 1.2498, + "format": "ratio2", + "unit": "correct results of the shrinking quorum over fixed TMR", + "scope": "Mru Flight bench, mean of 10 seeds, 20,000 ticks per run, three replica processes on one host; the same counts on all three hosts, schedule last-stuck", + "conditions": "Upset rate 0.001, common-mode share 0.05, known-answer test every 64 ticks. General-purpose processors, not flight hardware.", + "source": { + "repo": "flight", + "path": "bench/results/*.json: summary[schedule=last-stuck, upset_rate=0.001].useful_ratio_shrink_tmr", + "command": "./scripts/bench.sh" + }, + "text": "1.25×", + "min_text": "1.25×" + }, + "flight.bench.ratio.none": { + "value": 1, + "min": 1, + "format": "ratio2", + "unit": "correct results of the shrinking quorum over fixed TMR", + "scope": "Mru Flight bench, mean of 10 seeds, 20,000 ticks per run, three replica processes on one host; the same counts on all three hosts, schedule none", + "conditions": "Upset rate 0.001, common-mode share 0.05, known-answer test every 64 ticks. General-purpose processors, not flight hardware.", + "source": { + "repo": "flight", + "path": "bench/results/*.json: summary[schedule=none, upset_rate=0.001].useful_ratio_shrink_tmr", + "command": "./scripts/bench.sh" + }, + "text": "1.00×", + "min_text": "1.00×" + }, + "flight.bench.ratio.staggered-kills": { + "value": 1.5002, + "min": 1.4998, + "format": "ratio2", + "unit": "correct results of the shrinking quorum over fixed TMR", + "scope": "Mru Flight bench, mean of 10 seeds, 20,000 ticks per run, three replica processes on one host; the same counts on all three hosts, schedule staggered-kills", + "conditions": "Upset rate 0.001, common-mode share 0.05, known-answer test every 64 ticks. General-purpose processors, not flight hardware.", + "source": { + "repo": "flight", + "path": "bench/results/*.json: summary[schedule=staggered-kills, upset_rate=0.001].useful_ratio_shrink_tmr", + "command": "./scripts/bench.sh" + }, + "text": "1.50×", + "min_text": "1.50×" + }, + "flight.bench.ratio.stuck": { + "value": 1.6112, + "min": 1.6104, + "format": "ratio2", + "unit": "correct results of the shrinking quorum over fixed TMR", + "scope": "Mru Flight bench, mean of 10 seeds, 20,000 ticks per run, three replica processes on one host; the same counts on all three hosts, schedule stuck", + "conditions": "Upset rate 0.001, common-mode share 0.05, known-answer test every 64 ticks. General-purpose processors, not flight hardware.", + "source": { + "repo": "flight", + "path": "bench/results/*.json: summary[schedule=stuck, upset_rate=0.001].useful_ratio_shrink_tmr", + "command": "./scripts/bench.sh" + }, + "text": "1.61×", + "min_text": "1.61×" + }, + "flight.bench.runs_per_host": { + "value": 300, + "format": "int", + "unit": "runs per host", + "scope": "Mru Flight bench, mean of 10 seeds, 20,000 ticks per run, three replica processes on one host; the same counts on all three hosts", + "conditions": "", + "source": { "repo": "flight", "path": "bench/results/*.json: runs.length", "command": "./scripts/bench.sh" }, + "text": "300" + }, + "flight.bench.ticks": { + "value": 20000, + "format": "int", + "unit": "ticks per run", + "scope": "Mru Flight bench, mean of 10 seeds, 20,000 ticks per run, three replica processes on one host; the same counts on all three hosts", + "conditions": "", + "source": { "repo": "flight", "path": "bench/results/*.json: matrix.ticks", "command": "./scripts/bench.sh" }, + "text": "20,000" + }, + "flight.bench.useful.shrink.common-mode": { + "value": 11987.3, + "format": "mean1", + "unit": "correct results per run", + "scope": "Mru Flight bench, mean of 10 seeds, 20,000 ticks per run, three replica processes on one host; the same counts on all three hosts, schedule common-mode, shrink", + "conditions": "Upset rate 0.001.", + "source": { + "repo": "flight", + "path": "bench/results/*.json: summary[schedule=common-mode, upset_rate=0.001].useful_mean.shrink", + "command": "./scripts/bench.sh" + }, + "text": "11,987.3" + }, + "flight.bench.useful.shrink.last-stuck": { + "value": 12486.2, + "format": "mean1", + "unit": "correct results per run", + "scope": "Mru Flight bench, mean of 10 seeds, 20,000 ticks per run, three replica processes on one host; the same counts on all three hosts, schedule last-stuck, shrink", + "conditions": "Upset rate 0.001.", + "source": { + "repo": "flight", + "path": "bench/results/*.json: summary[schedule=last-stuck, upset_rate=0.001].useful_mean.shrink", + "command": "./scripts/bench.sh" + }, + "text": "12,486.2" + }, + "flight.bench.useful.shrink.none": { + "value": 19999.9, + "format": "mean1", + "unit": "correct results per run", + "scope": "Mru Flight bench, mean of 10 seeds, 20,000 ticks per run, three replica processes on one host; the same counts on all three hosts, schedule none, shrink", + "conditions": "Upset rate 0.001.", + "source": { + "repo": "flight", + "path": "bench/results/*.json: summary[schedule=none, upset_rate=0.001].useful_mean.shrink", + "command": "./scripts/bench.sh" + }, + "text": "19,999.9" + }, + "flight.bench.useful.shrink.staggered-kills": { + "value": 14985, + "format": "mean1", + "unit": "correct results per run", + "scope": "Mru Flight bench, mean of 10 seeds, 20,000 ticks per run, three replica processes on one host; the same counts on all three hosts, schedule staggered-kills, shrink", + "conditions": "Upset rate 0.001.", + "source": { + "repo": "flight", + "path": "bench/results/*.json: summary[schedule=staggered-kills, upset_rate=0.001].useful_mean.shrink", + "command": "./scripts/bench.sh" + }, + "text": "14,985.0" + }, + "flight.bench.useful.shrink.stuck": { + "value": 14483.8, + "format": "mean1", + "unit": "correct results per run", + "scope": "Mru Flight bench, mean of 10 seeds, 20,000 ticks per run, three replica processes on one host; the same counts on all three hosts, schedule stuck, shrink", + "conditions": "Upset rate 0.001.", + "source": { + "repo": "flight", + "path": "bench/results/*.json: summary[schedule=stuck, upset_rate=0.001].useful_mean.shrink", + "command": "./scripts/bench.sh" + }, + "text": "14,483.8" + }, + "flight.bench.useful.tmr.common-mode": { + "value": 3994.7, + "format": "mean1", + "unit": "correct results per run", + "scope": "Mru Flight bench, mean of 10 seeds, 20,000 ticks per run, three replica processes on one host; the same counts on all three hosts, schedule common-mode, tmr", + "conditions": "Upset rate 0.001.", + "source": { + "repo": "flight", + "path": "bench/results/*.json: summary[schedule=common-mode, upset_rate=0.001].useful_mean.tmr", + "command": "./scripts/bench.sh" + }, + "text": "3,994.7" + }, + "flight.bench.useful.tmr.last-stuck": { + "value": 9988.5, + "format": "mean1", + "unit": "correct results per run", + "scope": "Mru Flight bench, mean of 10 seeds, 20,000 ticks per run, three replica processes on one host; the same counts on all three hosts, schedule last-stuck, tmr", + "conditions": "Upset rate 0.001.", + "source": { + "repo": "flight", + "path": "bench/results/*.json: summary[schedule=last-stuck, upset_rate=0.001].useful_mean.tmr", + "command": "./scripts/bench.sh" + }, + "text": "9,988.5" + }, + "flight.bench.useful.tmr.none": { + "value": 19999.9, + "format": "mean1", + "unit": "correct results per run", + "scope": "Mru Flight bench, mean of 10 seeds, 20,000 ticks per run, three replica processes on one host; the same counts on all three hosts, schedule none, tmr", + "conditions": "Upset rate 0.001.", + "source": { + "repo": "flight", + "path": "bench/results/*.json: summary[schedule=none, upset_rate=0.001].useful_mean.tmr", + "command": "./scripts/bench.sh" + }, + "text": "19,999.9" + }, + "flight.bench.useful.tmr.staggered-kills": { + "value": 9988.5, + "format": "mean1", + "unit": "correct results per run", + "scope": "Mru Flight bench, mean of 10 seeds, 20,000 ticks per run, three replica processes on one host; the same counts on all three hosts, schedule staggered-kills, tmr", + "conditions": "Upset rate 0.001.", + "source": { + "repo": "flight", + "path": "bench/results/*.json: summary[schedule=staggered-kills, upset_rate=0.001].useful_mean.tmr", + "command": "./scripts/bench.sh" + }, + "text": "9,988.5" + }, + "flight.bench.useful.tmr.stuck": { + "value": 8989.5, + "format": "mean1", + "unit": "correct results per run", + "scope": "Mru Flight bench, mean of 10 seeds, 20,000 ticks per run, three replica processes on one host; the same counts on all three hosts, schedule stuck, tmr", + "conditions": "Upset rate 0.001.", + "source": { + "repo": "flight", + "path": "bench/results/*.json: summary[schedule=stuck, upset_rate=0.001].useful_mean.tmr", + "command": "./scripts/bench.sh" + }, + "text": "8,989.5" + }, + "flight.footprint.darwin-arm64": { + "value": 1952, + "format": "mb1", + "unit": "largest resident memory of any process, over every bench run", + "scope": "Mru Flight bench on Apple M4 (darwin-arm64), commit 7c1a629", + "conditions": "Release build, static where the target allows.", + "source": { + "repo": "flight", + "path": "bench/results/*.json: max of runs[].voter_rss_kib, darwin-arm64", + "command": "./scripts/bench.sh" + }, + "text": "1.9 MB" + }, + "flight.footprint.linux-aarch64": { + "value": 1696, + "format": "mb1", + "unit": "largest resident memory of any process, over every bench run", + "scope": "Mru Flight bench on Neoverse-N2 (linux-aarch64), commit d79b345", + "conditions": "Release build, static where the target allows.", + "source": { + "repo": "flight", + "path": "bench/results/*.json: max of runs[].voter_rss_kib, linux-aarch64", + "command": "./scripts/bench.sh" + }, + "text": "1.7 MB" + }, + "flight.footprint.linux-x86_64": { + "value": 2140, + "format": "mb1", + "unit": "largest resident memory of any process, over every bench run", + "scope": "Mru Flight bench on AMD EPYC 7763 64-Core Processor (linux-x86_64), commit d79b345", + "conditions": "Release build, static where the target allows.", + "source": { + "repo": "flight", + "path": "bench/results/*.json: max of runs[].voter_rss_kib, linux-x86_64", + "command": "./scripts/bench.sh" + }, + "text": "2.1 MB" + }, + "flight.fprime.components": { + "value": 4, + "format": "int", + "unit": "F´ components, one of them test-only (FaultInjector)", + "scope": "fprime/Mru/Components", + "conditions": "F´ v4.4.1", + "source": { "repo": "flight", "kind": "manual", "ref": "fprime/Mru/Components/" }, + "text": "4" + }, + "flight.fprime.unit_tests": { + "value": 37, + "format": "int", + "unit": "F´ unit tests", + "scope": "fprime/Mru components, fprime-util check in CI", + "conditions": "HealthRegistry 5, ReplicaHost 5, FaultInjector 8, RedundancyManager 19", + "source": { "repo": "flight", "kind": "manual", "ref": "docs/fprime-design-fpp.md" }, + "text": "37" + }, + "flight.kani.core": { + "value": 4, + "format": "int", + "unit": "Kani proofs of the decision core", + "scope": "quorum/src/lib.rs", + "conditions": "Run in CI on every change: cargo kani -p quorum -p quorum-ffi.", + "source": { "repo": "flight", "path": "count of #[kani::proof] in quorum/src/lib.rs" }, + "text": "4" + }, + "flight.kani.ffi": { + "value": 5, + "format": "int", + "unit": "Kani proofs that the C interface gives the core's answer", + "scope": "quorum-ffi/src/lib.rs", + "conditions": "Run in CI on every change.", + "source": { "repo": "flight", "path": "count of #[kani::proof] in quorum-ffi/src/lib.rs" }, + "text": "5" + }, + "flight.kani.total": { + "value": 9, + "format": "int", + "unit": "Kani proofs in all", + "scope": "quorum and quorum-ffi", + "conditions": "Run in CI on every change.", + "source": { "repo": "flight", "path": "sum of the two counts" }, + "text": "9" + }, + "flight.kat_cost.1000000.cpu": { + "scope": "Known-answer test cost, 10 runs of 100,000 ticks per period, self-check on the last replica, demo task on Apple M4 (darwin-arm64)", + "conditions": "No faults after the two kills. CPU time of the voter and replicas. General-purpose processor, not flight hardware.", + "source": { + "repo": "flight", + "path": "2026-10-11-darwin-arm64-kat.json: throughput[kat_period=1000000]", + "command": "./scripts/kat-coverage.sh" + }, + "value": 0, + "format": "pct1", + "unit": "extra CPU time against no test (median)", + "detail": { + "kat_period": 1000000, + "runs": 10, + "useful_mean": 50010, + "kat_tests_mean": 0, + "kat_tests_per_delivered_result": 0, + "cpu_s_median": 0.901, + "cpu_s_q1": 0.8768, + "cpu_s_q3": 0.939, + "cpu_s_iqr": 0.0622, + "cpu_cost_vs_no_test": 0, + "model_extra_computes": 0.000001 + }, + "text": "0.0%" + }, + "flight.kat_cost.1000000.tests_per_result": { + "scope": "Known-answer test cost, 10 runs of 100,000 ticks per period, self-check on the last replica, demo task on Apple M4 (darwin-arm64)", + "conditions": "No faults after the two kills. CPU time of the voter and replicas. General-purpose processor, not flight hardware.", + "source": { + "repo": "flight", + "path": "2026-10-11-darwin-arm64-kat.json: throughput[kat_period=1000000]", + "command": "./scripts/kat-coverage.sh" + }, + "value": 0, + "format": "dec4", + "unit": "known-answer tests per delivered result", + "text": "0.0000" + }, + "flight.kat_cost.128.cpu": { + "scope": "Known-answer test cost, 10 runs of 100,000 ticks per period, self-check on the last replica, demo task on Apple M4 (darwin-arm64)", + "conditions": "No faults after the two kills. CPU time of the voter and replicas. General-purpose processor, not flight hardware.", + "source": { + "repo": "flight", + "path": "2026-10-11-darwin-arm64-kat.json: throughput[kat_period=128]", + "command": "./scripts/kat-coverage.sh" + }, + "value": 0.0044, + "format": "pct1", + "unit": "extra CPU time against no test (median)", + "detail": { + "kat_period": 128, + "runs": 10, + "useful_mean": 50010, + "kat_tests_mean": 781, + "kat_tests_per_delivered_result": 0.015617, + "cpu_s_median": 0.905, + "cpu_s_q1": 0.8912, + "cpu_s_q3": 0.9472, + "cpu_s_iqr": 0.056, + "cpu_cost_vs_no_test": 0.0044, + "model_extra_computes": 0.007812 + }, + "text": "0.4%" + }, + "flight.kat_cost.128.tests_per_result": { + "scope": "Known-answer test cost, 10 runs of 100,000 ticks per period, self-check on the last replica, demo task on Apple M4 (darwin-arm64)", + "conditions": "No faults after the two kills. CPU time of the voter and replicas. General-purpose processor, not flight hardware.", + "source": { + "repo": "flight", + "path": "2026-10-11-darwin-arm64-kat.json: throughput[kat_period=128]", + "command": "./scripts/kat-coverage.sh" + }, + "value": 0.015617, + "format": "dec4", + "unit": "known-answer tests per delivered result", + "text": "0.0156" + }, + "flight.kat_cost.16.cpu": { + "scope": "Known-answer test cost, 10 runs of 100,000 ticks per period, self-check on the last replica, demo task on Apple M4 (darwin-arm64)", + "conditions": "No faults after the two kills. CPU time of the voter and replicas. General-purpose processor, not flight hardware.", + "source": { + "repo": "flight", + "path": "2026-10-11-darwin-arm64-kat.json: throughput[kat_period=16]", + "command": "./scripts/kat-coverage.sh" + }, + "value": 0.1038, + "format": "pct1", + "unit": "extra CPU time against no test (median)", + "detail": { + "kat_period": 16, + "runs": 10, + "useful_mean": 50010, + "kat_tests_mean": 6249, + "kat_tests_per_delivered_result": 0.124955, + "cpu_s_median": 0.9945, + "cpu_s_q1": 0.9802, + "cpu_s_q3": 1.0157, + "cpu_s_iqr": 0.0355, + "cpu_cost_vs_no_test": 0.1038, + "model_extra_computes": 0.0625 + }, + "text": "10.4%" + }, + "flight.kat_cost.16.tests_per_result": { + "scope": "Known-answer test cost, 10 runs of 100,000 ticks per period, self-check on the last replica, demo task on Apple M4 (darwin-arm64)", + "conditions": "No faults after the two kills. CPU time of the voter and replicas. General-purpose processor, not flight hardware.", + "source": { + "repo": "flight", + "path": "2026-10-11-darwin-arm64-kat.json: throughput[kat_period=16]", + "command": "./scripts/kat-coverage.sh" + }, + "value": 0.124955, + "format": "dec4", + "unit": "known-answer tests per delivered result", + "text": "0.1250" + }, + "flight.kat_cost.256.cpu": { + "scope": "Known-answer test cost, 10 runs of 100,000 ticks per period, self-check on the last replica, demo task on Apple M4 (darwin-arm64)", + "conditions": "No faults after the two kills. CPU time of the voter and replicas. General-purpose processor, not flight hardware.", + "source": { + "repo": "flight", + "path": "2026-10-11-darwin-arm64-kat.json: throughput[kat_period=256]", + "command": "./scripts/kat-coverage.sh" + }, + "value": 0.015, + "format": "pct1", + "unit": "extra CPU time against no test (median)", + "detail": { + "kat_period": 256, + "runs": 10, + "useful_mean": 50010, + "kat_tests_mean": 390, + "kat_tests_per_delivered_result": 0.007798, + "cpu_s_median": 0.9145, + "cpu_s_q1": 0.884, + "cpu_s_q3": 0.949, + "cpu_s_iqr": 0.065, + "cpu_cost_vs_no_test": 0.015, + "model_extra_computes": 0.003906 + }, + "text": "1.5%" + }, + "flight.kat_cost.256.tests_per_result": { + "scope": "Known-answer test cost, 10 runs of 100,000 ticks per period, self-check on the last replica, demo task on Apple M4 (darwin-arm64)", + "conditions": "No faults after the two kills. CPU time of the voter and replicas. General-purpose processor, not flight hardware.", + "source": { + "repo": "flight", + "path": "2026-10-11-darwin-arm64-kat.json: throughput[kat_period=256]", + "command": "./scripts/kat-coverage.sh" + }, + "value": 0.007798, + "format": "dec4", + "unit": "known-answer tests per delivered result", + "text": "0.0078" + }, + "flight.kat_cost.32.cpu": { + "scope": "Known-answer test cost, 10 runs of 100,000 ticks per period, self-check on the last replica, demo task on Apple M4 (darwin-arm64)", + "conditions": "No faults after the two kills. CPU time of the voter and replicas. General-purpose processor, not flight hardware.", + "source": { + "repo": "flight", + "path": "2026-10-11-darwin-arm64-kat.json: throughput[kat_period=32]", + "command": "./scripts/kat-coverage.sh" + }, + "value": 0.0438, + "format": "pct1", + "unit": "extra CPU time against no test (median)", + "detail": { + "kat_period": 32, + "runs": 10, + "useful_mean": 50010, + "kat_tests_mean": 3125, + "kat_tests_per_delivered_result": 0.062488, + "cpu_s_median": 0.9405, + "cpu_s_q1": 0.922, + "cpu_s_q3": 0.9812, + "cpu_s_iqr": 0.0592, + "cpu_cost_vs_no_test": 0.0438, + "model_extra_computes": 0.03125 + }, + "text": "4.4%" + }, + "flight.kat_cost.32.tests_per_result": { + "scope": "Known-answer test cost, 10 runs of 100,000 ticks per period, self-check on the last replica, demo task on Apple M4 (darwin-arm64)", + "conditions": "No faults after the two kills. CPU time of the voter and replicas. General-purpose processor, not flight hardware.", + "source": { + "repo": "flight", + "path": "2026-10-11-darwin-arm64-kat.json: throughput[kat_period=32]", + "command": "./scripts/kat-coverage.sh" + }, + "value": 0.062488, + "format": "dec4", + "unit": "known-answer tests per delivered result", + "text": "0.0625" + }, + "flight.kat_cost.64.cpu": { + "scope": "Known-answer test cost, 10 runs of 100,000 ticks per period, self-check on the last replica, demo task on Apple M4 (darwin-arm64)", + "conditions": "No faults after the two kills. CPU time of the voter and replicas. General-purpose processor, not flight hardware.", + "source": { + "repo": "flight", + "path": "2026-10-11-darwin-arm64-kat.json: throughput[kat_period=64]", + "command": "./scripts/kat-coverage.sh" + }, + "value": 0.0189, + "format": "pct1", + "unit": "extra CPU time against no test (median)", + "detail": { + "kat_period": 64, + "runs": 10, + "useful_mean": 50010, + "kat_tests_mean": 1562, + "kat_tests_per_delivered_result": 0.031234, + "cpu_s_median": 0.918, + "cpu_s_q1": 0.9048, + "cpu_s_q3": 0.9607, + "cpu_s_iqr": 0.056, + "cpu_cost_vs_no_test": 0.0189, + "model_extra_computes": 0.015625 + }, + "text": "1.9%" + }, + "flight.kat_cost.64.tests_per_result": { + "scope": "Known-answer test cost, 10 runs of 100,000 ticks per period, self-check on the last replica, demo task on Apple M4 (darwin-arm64)", + "conditions": "No faults after the two kills. CPU time of the voter and replicas. General-purpose processor, not flight hardware.", + "source": { + "repo": "flight", + "path": "2026-10-11-darwin-arm64-kat.json: throughput[kat_period=64]", + "command": "./scripts/kat-coverage.sh" + }, + "value": 0.031234, + "format": "dec4", + "unit": "known-answer tests per delivered result", + "text": "0.0312" + }, + "flight.kat_cost.8.cpu": { + "scope": "Known-answer test cost, 10 runs of 100,000 ticks per period, self-check on the last replica, demo task on Apple M4 (darwin-arm64)", + "conditions": "No faults after the two kills. CPU time of the voter and replicas. General-purpose processor, not flight hardware.", + "source": { + "repo": "flight", + "path": "2026-10-11-darwin-arm64-kat.json: throughput[kat_period=8]", + "command": "./scripts/kat-coverage.sh" + }, + "value": 0.2214, + "format": "pct1", + "unit": "extra CPU time against no test (median)", + "detail": { + "kat_period": 8, + "runs": 10, + "useful_mean": 50010, + "kat_tests_mean": 12498, + "kat_tests_per_delivered_result": 0.24991, + "cpu_s_median": 1.1005, + "cpu_s_q1": 1.097, + "cpu_s_q3": 1.1058, + "cpu_s_iqr": 0.0088, + "cpu_cost_vs_no_test": 0.2214, + "model_extra_computes": 0.125 + }, + "text": "22.1%" + }, + "flight.kat_cost.8.tests_per_result": { + "scope": "Known-answer test cost, 10 runs of 100,000 ticks per period, self-check on the last replica, demo task on Apple M4 (darwin-arm64)", + "conditions": "No faults after the two kills. CPU time of the voter and replicas. General-purpose processor, not flight hardware.", + "source": { + "repo": "flight", + "path": "2026-10-11-darwin-arm64-kat.json: throughput[kat_period=8]", + "command": "./scripts/kat-coverage.sh" + }, + "value": 0.24991, + "format": "dec4", + "unit": "known-answer tests per delivered result", + "text": "0.2499" + }, + "flight.kat_coverage.corrupt.64.0": { + "value": 1, + "format": "pct0", + "unit": "of injected faults detected", + "scope": "Known-answer test coverage campaign, 400 faults on the last replica, demo task on Apple M4 (darwin-arm64)", + "conditions": "Known-answer test every 64 ticks. General-purpose processor, not flight hardware.", + "source": { + "repo": "flight", + "path": "2026-10-11-darwin-arm64-kat.json: summary", + "command": "./scripts/kat-coverage.sh" + }, + "detail": { + "fault": "corrupt", + "location": null, + "kat_period": 64, + "common_mode": 0, + "runs": 400, + "detected": 400, + "fraction_detected": 1, + "missed_with_wrong": 0, + "missed_no_effect": 0, + "latency_mean": 0, + "latency_max": 0, + "wrong_before_detection_mean": 0, + "wrong_before_detection_max": 0, + "wrong_rate_when_missed": null + }, + "text": "100%" + }, + "flight.kat_coverage.corrupt.64.0.05": { + "value": 0.9425, + "format": "pct0", + "unit": "of injected faults detected", + "scope": "Known-answer test coverage campaign, 400 faults on the last replica, demo task on Apple M4 (darwin-arm64)", + "conditions": "Known-answer test every 64 ticks, common-mode share 0.05. General-purpose processor, not flight hardware.", + "source": { + "repo": "flight", + "path": "2026-10-11-darwin-arm64-kat.json: summary", + "command": "./scripts/kat-coverage.sh" + }, + "detail": { + "fault": "corrupt", + "location": null, + "kat_period": 64, + "common_mode": 0.05, + "runs": 400, + "detected": 377, + "fraction_detected": 0.9425, + "missed_with_wrong": 23, + "missed_no_effect": 0, + "latency_mean": 0, + "latency_max": 0, + "wrong_before_detection_mean": 0, + "wrong_before_detection_max": 0, + "wrong_rate_when_missed": 0.0196 + }, + "text": "94%" + }, + "flight.kat_coverage.corrupt.64.0.05.latency_mean": { + "scope": "Known-answer test coverage campaign, 400 faults on the last replica, demo task on Apple M4 (darwin-arm64)", + "conditions": "Known-answer test every 64 ticks, common-mode share 0.05. General-purpose processor, not flight hardware.", + "source": { + "repo": "flight", + "path": "2026-10-11-darwin-arm64-kat.json: summary", + "command": "./scripts/kat-coverage.sh" + }, + "value": 0, + "format": "mean1", + "unit": "ticks from the fault to detection, mean over detected faults", + "text": "0.0" + }, + "flight.kat_coverage.corrupt.64.0.05.wrong_mean": { + "scope": "Known-answer test coverage campaign, 400 faults on the last replica, demo task on Apple M4 (darwin-arm64)", + "conditions": "Known-answer test every 64 ticks, common-mode share 0.05. General-purpose processor, not flight hardware.", + "source": { + "repo": "flight", + "path": "2026-10-11-darwin-arm64-kat.json: summary", + "command": "./scripts/kat-coverage.sh" + }, + "value": 0, + "format": "mean1", + "unit": "wrong results before detection, mean over detected faults", + "text": "0.0" + }, + "flight.kat_coverage.corrupt.64.0.2": { + "value": 0.79, + "format": "pct0", + "unit": "of injected faults detected", + "scope": "Known-answer test coverage campaign, 400 faults on the last replica, demo task on Apple M4 (darwin-arm64)", + "conditions": "Known-answer test every 64 ticks, common-mode share 0.2. General-purpose processor, not flight hardware.", + "source": { + "repo": "flight", + "path": "2026-10-11-darwin-arm64-kat.json: summary", + "command": "./scripts/kat-coverage.sh" + }, + "detail": { + "fault": "corrupt", + "location": null, + "kat_period": 64, + "common_mode": 0.2, + "runs": 400, + "detected": 316, + "fraction_detected": 0.79, + "missed_with_wrong": 84, + "missed_no_effect": 0, + "latency_mean": 0, + "latency_max": 0, + "wrong_before_detection_mean": 0, + "wrong_before_detection_max": 0, + "wrong_rate_when_missed": 0.0196 + }, + "text": "79%" + }, + "flight.kat_coverage.corrupt.64.0.2.latency_mean": { + "scope": "Known-answer test coverage campaign, 400 faults on the last replica, demo task on Apple M4 (darwin-arm64)", + "conditions": "Known-answer test every 64 ticks, common-mode share 0.2. General-purpose processor, not flight hardware.", + "source": { + "repo": "flight", + "path": "2026-10-11-darwin-arm64-kat.json: summary", + "command": "./scripts/kat-coverage.sh" + }, + "value": 0, + "format": "mean1", + "unit": "ticks from the fault to detection, mean over detected faults", + "text": "0.0" + }, + "flight.kat_coverage.corrupt.64.0.2.wrong_mean": { + "scope": "Known-answer test coverage campaign, 400 faults on the last replica, demo task on Apple M4 (darwin-arm64)", + "conditions": "Known-answer test every 64 ticks, common-mode share 0.2. General-purpose processor, not flight hardware.", + "source": { + "repo": "flight", + "path": "2026-10-11-darwin-arm64-kat.json: summary", + "command": "./scripts/kat-coverage.sh" + }, + "value": 0, + "format": "mean1", + "unit": "wrong results before detection, mean over detected faults", + "text": "0.0" + }, + "flight.kat_coverage.corrupt.64.0.latency_mean": { + "scope": "Known-answer test coverage campaign, 400 faults on the last replica, demo task on Apple M4 (darwin-arm64)", + "conditions": "Known-answer test every 64 ticks. General-purpose processor, not flight hardware.", + "source": { + "repo": "flight", + "path": "2026-10-11-darwin-arm64-kat.json: summary", + "command": "./scripts/kat-coverage.sh" + }, + "value": 0, + "format": "mean1", + "unit": "ticks from the fault to detection, mean over detected faults", + "text": "0.0" + }, + "flight.kat_coverage.corrupt.64.0.wrong_mean": { + "scope": "Known-answer test coverage campaign, 400 faults on the last replica, demo task on Apple M4 (darwin-arm64)", + "conditions": "Known-answer test every 64 ticks. General-purpose processor, not flight hardware.", + "source": { + "repo": "flight", + "path": "2026-10-11-darwin-arm64-kat.json: summary", + "command": "./scripts/kat-coverage.sh" + }, + "value": 0, + "format": "mean1", + "unit": "wrong results before detection, mean over detected faults", + "text": "0.0" + }, + "flight.kat_coverage.hang.64": { + "value": 1, + "format": "pct0", + "unit": "of injected faults detected", + "scope": "Known-answer test coverage campaign, 64 faults on the last replica, demo task on Apple M4 (darwin-arm64)", + "conditions": "Known-answer test every 64 ticks. General-purpose processor, not flight hardware.", + "source": { + "repo": "flight", + "path": "2026-10-11-darwin-arm64-kat.json: summary", + "command": "./scripts/kat-coverage.sh" + }, + "detail": { + "fault": "hang", + "location": null, + "kat_period": 64, + "common_mode": null, + "runs": 64, + "detected": 64, + "fraction_detected": 1, + "missed_with_wrong": 0, + "missed_no_effect": 0, + "latency_mean": 0.5, + "latency_max": 1, + "wrong_before_detection_mean": 0, + "wrong_before_detection_max": 0, + "wrong_rate_when_missed": null + }, + "text": "100%" + }, + "flight.kat_coverage.hang.64.latency_mean": { + "scope": "Known-answer test coverage campaign, 64 faults on the last replica, demo task on Apple M4 (darwin-arm64)", + "conditions": "Known-answer test every 64 ticks. General-purpose processor, not flight hardware.", + "source": { + "repo": "flight", + "path": "2026-10-11-darwin-arm64-kat.json: summary", + "command": "./scripts/kat-coverage.sh" + }, + "value": 0.5, + "format": "mean1", + "unit": "ticks from the fault to detection, mean over detected faults", + "text": "0.5" + }, + "flight.kat_coverage.hang.64.wrong_mean": { + "scope": "Known-answer test coverage campaign, 64 faults on the last replica, demo task on Apple M4 (darwin-arm64)", + "conditions": "Known-answer test every 64 ticks. General-purpose processor, not flight hardware.", + "source": { + "repo": "flight", + "path": "2026-10-11-darwin-arm64-kat.json: summary", + "command": "./scripts/kat-coverage.sh" + }, + "value": 0, + "format": "mean1", + "unit": "wrong results before detection, mean over detected faults", + "text": "0.0" + }, + "flight.kat_coverage.stuck.128": { + "value": 1, + "format": "pct0", + "unit": "of injected faults detected", + "scope": "Known-answer test coverage campaign, 256 faults on the last replica, demo task on Apple M4 (darwin-arm64)", + "conditions": "Known-answer test every 128 ticks. General-purpose processor, not flight hardware.", + "source": { + "repo": "flight", + "path": "2026-10-11-darwin-arm64-kat.json: summary", + "command": "./scripts/kat-coverage.sh" + }, + "detail": { + "fault": "stuck", + "location": null, + "kat_period": 128, + "common_mode": null, + "runs": 256, + "detected": 256, + "fraction_detected": 1, + "missed_with_wrong": 0, + "missed_no_effect": 0, + "latency_mean": 63.5, + "latency_max": 127, + "wrong_before_detection_mean": 31.5, + "wrong_before_detection_max": 63, + "wrong_rate_when_missed": null + }, + "text": "100%" + }, + "flight.kat_coverage.stuck.128.latency_mean": { + "scope": "Known-answer test coverage campaign, 256 faults on the last replica, demo task on Apple M4 (darwin-arm64)", + "conditions": "Known-answer test every 128 ticks. General-purpose processor, not flight hardware.", + "source": { + "repo": "flight", + "path": "2026-10-11-darwin-arm64-kat.json: summary", + "command": "./scripts/kat-coverage.sh" + }, + "value": 63.5, + "format": "mean1", + "unit": "ticks from the fault to detection, mean over detected faults", + "text": "63.5" + }, + "flight.kat_coverage.stuck.128.wrong_mean": { + "scope": "Known-answer test coverage campaign, 256 faults on the last replica, demo task on Apple M4 (darwin-arm64)", + "conditions": "Known-answer test every 128 ticks. General-purpose processor, not flight hardware.", + "source": { + "repo": "flight", + "path": "2026-10-11-darwin-arm64-kat.json: summary", + "command": "./scripts/kat-coverage.sh" + }, + "value": 31.5, + "format": "mean1", + "unit": "wrong results before detection, mean over detected faults", + "text": "31.5" + }, + "flight.kat_coverage.stuck.16": { + "value": 1, + "format": "pct0", + "unit": "of injected faults detected", + "scope": "Known-answer test coverage campaign, 256 faults on the last replica, demo task on Apple M4 (darwin-arm64)", + "conditions": "Known-answer test every 16 ticks. General-purpose processor, not flight hardware.", + "source": { + "repo": "flight", + "path": "2026-10-11-darwin-arm64-kat.json: summary", + "command": "./scripts/kat-coverage.sh" + }, + "detail": { + "fault": "stuck", + "location": null, + "kat_period": 16, + "common_mode": null, + "runs": 256, + "detected": 256, + "fraction_detected": 1, + "missed_with_wrong": 0, + "missed_no_effect": 0, + "latency_mean": 7.5, + "latency_max": 15, + "wrong_before_detection_mean": 3.5, + "wrong_before_detection_max": 7, + "wrong_rate_when_missed": null + }, + "text": "100%" + }, + "flight.kat_coverage.stuck.16.latency_mean": { + "scope": "Known-answer test coverage campaign, 256 faults on the last replica, demo task on Apple M4 (darwin-arm64)", + "conditions": "Known-answer test every 16 ticks. General-purpose processor, not flight hardware.", + "source": { + "repo": "flight", + "path": "2026-10-11-darwin-arm64-kat.json: summary", + "command": "./scripts/kat-coverage.sh" + }, + "value": 7.5, + "format": "mean1", + "unit": "ticks from the fault to detection, mean over detected faults", + "text": "7.5" + }, + "flight.kat_coverage.stuck.16.wrong_mean": { + "scope": "Known-answer test coverage campaign, 256 faults on the last replica, demo task on Apple M4 (darwin-arm64)", + "conditions": "Known-answer test every 16 ticks. General-purpose processor, not flight hardware.", + "source": { + "repo": "flight", + "path": "2026-10-11-darwin-arm64-kat.json: summary", + "command": "./scripts/kat-coverage.sh" + }, + "value": 3.5, + "format": "mean1", + "unit": "wrong results before detection, mean over detected faults", + "text": "3.5" + }, + "flight.kat_coverage.stuck.256": { + "value": 1, + "format": "pct0", + "unit": "of injected faults detected", + "scope": "Known-answer test coverage campaign, 256 faults on the last replica, demo task on Apple M4 (darwin-arm64)", + "conditions": "Known-answer test every 256 ticks. General-purpose processor, not flight hardware.", + "source": { + "repo": "flight", + "path": "2026-10-11-darwin-arm64-kat.json: summary", + "command": "./scripts/kat-coverage.sh" + }, + "detail": { + "fault": "stuck", + "location": null, + "kat_period": 256, + "common_mode": null, + "runs": 256, + "detected": 256, + "fraction_detected": 1, + "missed_with_wrong": 0, + "missed_no_effect": 0, + "latency_mean": 127.5, + "latency_max": 255, + "wrong_before_detection_mean": 63.5, + "wrong_before_detection_max": 127, + "wrong_rate_when_missed": null + }, + "text": "100%" + }, + "flight.kat_coverage.stuck.256.latency_mean": { + "scope": "Known-answer test coverage campaign, 256 faults on the last replica, demo task on Apple M4 (darwin-arm64)", + "conditions": "Known-answer test every 256 ticks. General-purpose processor, not flight hardware.", + "source": { + "repo": "flight", + "path": "2026-10-11-darwin-arm64-kat.json: summary", + "command": "./scripts/kat-coverage.sh" + }, + "value": 127.5, + "format": "mean1", + "unit": "ticks from the fault to detection, mean over detected faults", + "text": "127.5" + }, + "flight.kat_coverage.stuck.256.wrong_mean": { + "scope": "Known-answer test coverage campaign, 256 faults on the last replica, demo task on Apple M4 (darwin-arm64)", + "conditions": "Known-answer test every 256 ticks. General-purpose processor, not flight hardware.", + "source": { + "repo": "flight", + "path": "2026-10-11-darwin-arm64-kat.json: summary", + "command": "./scripts/kat-coverage.sh" + }, + "value": 63.5, + "format": "mean1", + "unit": "wrong results before detection, mean over detected faults", + "text": "63.5" + }, + "flight.kat_coverage.stuck.32": { + "value": 1, + "format": "pct0", + "unit": "of injected faults detected", + "scope": "Known-answer test coverage campaign, 256 faults on the last replica, demo task on Apple M4 (darwin-arm64)", + "conditions": "Known-answer test every 32 ticks. General-purpose processor, not flight hardware.", + "source": { + "repo": "flight", + "path": "2026-10-11-darwin-arm64-kat.json: summary", + "command": "./scripts/kat-coverage.sh" + }, + "detail": { + "fault": "stuck", + "location": null, + "kat_period": 32, + "common_mode": null, + "runs": 256, + "detected": 256, + "fraction_detected": 1, + "missed_with_wrong": 0, + "missed_no_effect": 0, + "latency_mean": 15.5, + "latency_max": 31, + "wrong_before_detection_mean": 7.5, + "wrong_before_detection_max": 15, + "wrong_rate_when_missed": null + }, + "text": "100%" + }, + "flight.kat_coverage.stuck.32.latency_mean": { + "scope": "Known-answer test coverage campaign, 256 faults on the last replica, demo task on Apple M4 (darwin-arm64)", + "conditions": "Known-answer test every 32 ticks. General-purpose processor, not flight hardware.", + "source": { + "repo": "flight", + "path": "2026-10-11-darwin-arm64-kat.json: summary", + "command": "./scripts/kat-coverage.sh" + }, + "value": 15.5, + "format": "mean1", + "unit": "ticks from the fault to detection, mean over detected faults", + "text": "15.5" + }, + "flight.kat_coverage.stuck.32.wrong_mean": { + "scope": "Known-answer test coverage campaign, 256 faults on the last replica, demo task on Apple M4 (darwin-arm64)", + "conditions": "Known-answer test every 32 ticks. General-purpose processor, not flight hardware.", + "source": { + "repo": "flight", + "path": "2026-10-11-darwin-arm64-kat.json: summary", + "command": "./scripts/kat-coverage.sh" + }, + "value": 7.5, + "format": "mean1", + "unit": "wrong results before detection, mean over detected faults", + "text": "7.5" + }, + "flight.kat_coverage.stuck.64": { + "value": 1, + "format": "pct0", + "unit": "of injected faults detected", + "scope": "Known-answer test coverage campaign, 256 faults on the last replica, demo task on Apple M4 (darwin-arm64)", + "conditions": "Known-answer test every 64 ticks. General-purpose processor, not flight hardware.", + "source": { + "repo": "flight", + "path": "2026-10-11-darwin-arm64-kat.json: summary", + "command": "./scripts/kat-coverage.sh" + }, + "detail": { + "fault": "stuck", + "location": null, + "kat_period": 64, + "common_mode": null, + "runs": 256, + "detected": 256, + "fraction_detected": 1, + "missed_with_wrong": 0, + "missed_no_effect": 0, + "latency_mean": 31.5, + "latency_max": 63, + "wrong_before_detection_mean": 15.5, + "wrong_before_detection_max": 31, + "wrong_rate_when_missed": null + }, + "text": "100%" + }, + "flight.kat_coverage.stuck.64.latency_mean": { + "scope": "Known-answer test coverage campaign, 256 faults on the last replica, demo task on Apple M4 (darwin-arm64)", + "conditions": "Known-answer test every 64 ticks. General-purpose processor, not flight hardware.", + "source": { + "repo": "flight", + "path": "2026-10-11-darwin-arm64-kat.json: summary", + "command": "./scripts/kat-coverage.sh" + }, + "value": 31.5, + "format": "mean1", + "unit": "ticks from the fault to detection, mean over detected faults", + "text": "31.5" + }, + "flight.kat_coverage.stuck.64.wrong_mean": { + "scope": "Known-answer test coverage campaign, 256 faults on the last replica, demo task on Apple M4 (darwin-arm64)", + "conditions": "Known-answer test every 64 ticks. General-purpose processor, not flight hardware.", + "source": { + "repo": "flight", + "path": "2026-10-11-darwin-arm64-kat.json: summary", + "command": "./scripts/kat-coverage.sh" + }, + "value": 15.5, + "format": "mean1", + "unit": "wrong results before detection, mean over detected faults", + "text": "15.5" + }, + "flight.kat_coverage.stuck.8": { + "value": 1, + "format": "pct0", + "unit": "of injected faults detected", + "scope": "Known-answer test coverage campaign, 256 faults on the last replica, demo task on Apple M4 (darwin-arm64)", + "conditions": "Known-answer test every 8 ticks. General-purpose processor, not flight hardware.", + "source": { + "repo": "flight", + "path": "2026-10-11-darwin-arm64-kat.json: summary", + "command": "./scripts/kat-coverage.sh" + }, + "detail": { + "fault": "stuck", + "location": null, + "kat_period": 8, + "common_mode": null, + "runs": 256, + "detected": 256, + "fraction_detected": 1, + "missed_with_wrong": 0, + "missed_no_effect": 0, + "latency_mean": 3.5, + "latency_max": 7, + "wrong_before_detection_mean": 1.5, + "wrong_before_detection_max": 3, + "wrong_rate_when_missed": null + }, + "text": "100%" + }, + "flight.kat_coverage.stuck.8.latency_mean": { + "scope": "Known-answer test coverage campaign, 256 faults on the last replica, demo task on Apple M4 (darwin-arm64)", + "conditions": "Known-answer test every 8 ticks. General-purpose processor, not flight hardware.", + "source": { + "repo": "flight", + "path": "2026-10-11-darwin-arm64-kat.json: summary", + "command": "./scripts/kat-coverage.sh" + }, + "value": 3.5, + "format": "mean1", + "unit": "ticks from the fault to detection, mean over detected faults", + "text": "3.5" + }, + "flight.kat_coverage.stuck.8.wrong_mean": { + "scope": "Known-answer test coverage campaign, 256 faults on the last replica, demo task on Apple M4 (darwin-arm64)", + "conditions": "Known-answer test every 8 ticks. General-purpose processor, not flight hardware.", + "source": { + "repo": "flight", + "path": "2026-10-11-darwin-arm64-kat.json: summary", + "command": "./scripts/kat-coverage.sh" + }, + "value": 1.5, + "format": "mean1", + "unit": "wrong results before detection, mean over detected faults", + "text": "1.5" + }, + "flight.kat_coverage.stuckbit.acc.128": { + "value": 0.9844, + "format": "pct0", + "unit": "of injected faults detected", + "scope": "Known-answer test coverage campaign, 128 faults on the last replica, demo task on Apple M4 (darwin-arm64)", + "conditions": "Known-answer test every 128 ticks. General-purpose processor, not flight hardware.", + "source": { + "repo": "flight", + "path": "2026-10-11-darwin-arm64-kat.json: summary", + "command": "./scripts/kat-coverage.sh" + }, + "detail": { + "fault": "stuckbit", + "location": "acc", + "kat_period": 128, + "common_mode": null, + "runs": 128, + "detected": 126, + "fraction_detected": 0.9844, + "missed_with_wrong": 2, + "missed_no_effect": 0, + "latency_mean": 63.8, + "latency_max": 127, + "wrong_before_detection_mean": 31.48, + "wrong_before_detection_max": 63, + "wrong_rate_when_missed": 0.6254, + "by_value": { "0": { "runs": 64, "detected": 63 }, "1": { "runs": 64, "detected": 63 } } + }, + "text": "98%" + }, + "flight.kat_coverage.stuckbit.acc.128.latency_mean": { + "scope": "Known-answer test coverage campaign, 128 faults on the last replica, demo task on Apple M4 (darwin-arm64)", + "conditions": "Known-answer test every 128 ticks. General-purpose processor, not flight hardware.", + "source": { + "repo": "flight", + "path": "2026-10-11-darwin-arm64-kat.json: summary", + "command": "./scripts/kat-coverage.sh" + }, + "value": 63.8, + "format": "mean1", + "unit": "ticks from the fault to detection, mean over detected faults", + "text": "63.8" + }, + "flight.kat_coverage.stuckbit.acc.128.wrong_mean": { + "scope": "Known-answer test coverage campaign, 128 faults on the last replica, demo task on Apple M4 (darwin-arm64)", + "conditions": "Known-answer test every 128 ticks. General-purpose processor, not flight hardware.", + "source": { + "repo": "flight", + "path": "2026-10-11-darwin-arm64-kat.json: summary", + "command": "./scripts/kat-coverage.sh" + }, + "value": 31.48, + "format": "mean1", + "unit": "wrong results before detection, mean over detected faults", + "text": "31.5" + }, + "flight.kat_coverage.stuckbit.acc.16": { + "value": 0.9844, + "format": "pct0", + "unit": "of injected faults detected", + "scope": "Known-answer test coverage campaign, 128 faults on the last replica, demo task on Apple M4 (darwin-arm64)", + "conditions": "Known-answer test every 16 ticks. General-purpose processor, not flight hardware.", + "source": { + "repo": "flight", + "path": "2026-10-11-darwin-arm64-kat.json: summary", + "command": "./scripts/kat-coverage.sh" + }, + "detail": { + "fault": "stuckbit", + "location": "acc", + "kat_period": 16, + "common_mode": null, + "runs": 128, + "detected": 126, + "fraction_detected": 0.9844, + "missed_with_wrong": 2, + "missed_no_effect": 0, + "latency_mean": 7.4, + "latency_max": 15, + "wrong_before_detection_mean": 3.4, + "wrong_before_detection_max": 7, + "wrong_rate_when_missed": 0.6254, + "by_value": { "0": { "runs": 64, "detected": 63 }, "1": { "runs": 64, "detected": 63 } } + }, + "text": "98%" + }, + "flight.kat_coverage.stuckbit.acc.16.latency_mean": { + "scope": "Known-answer test coverage campaign, 128 faults on the last replica, demo task on Apple M4 (darwin-arm64)", + "conditions": "Known-answer test every 16 ticks. General-purpose processor, not flight hardware.", + "source": { + "repo": "flight", + "path": "2026-10-11-darwin-arm64-kat.json: summary", + "command": "./scripts/kat-coverage.sh" + }, + "value": 7.4, + "format": "mean1", + "unit": "ticks from the fault to detection, mean over detected faults", + "text": "7.4" + }, + "flight.kat_coverage.stuckbit.acc.16.wrong_mean": { + "scope": "Known-answer test coverage campaign, 128 faults on the last replica, demo task on Apple M4 (darwin-arm64)", + "conditions": "Known-answer test every 16 ticks. General-purpose processor, not flight hardware.", + "source": { + "repo": "flight", + "path": "2026-10-11-darwin-arm64-kat.json: summary", + "command": "./scripts/kat-coverage.sh" + }, + "value": 3.4, + "format": "mean1", + "unit": "wrong results before detection, mean over detected faults", + "text": "3.4" + }, + "flight.kat_coverage.stuckbit.acc.256": { + "value": 0.9844, + "format": "pct0", + "unit": "of injected faults detected", + "scope": "Known-answer test coverage campaign, 128 faults on the last replica, demo task on Apple M4 (darwin-arm64)", + "conditions": "Known-answer test every 256 ticks. General-purpose processor, not flight hardware.", + "source": { + "repo": "flight", + "path": "2026-10-11-darwin-arm64-kat.json: summary", + "command": "./scripts/kat-coverage.sh" + }, + "detail": { + "fault": "stuckbit", + "location": "acc", + "kat_period": 256, + "common_mode": null, + "runs": 128, + "detected": 126, + "fraction_detected": 0.9844, + "missed_with_wrong": 2, + "missed_no_effect": 0, + "latency_mean": 178.6, + "latency_max": 255, + "wrong_before_detection_mean": 88.27, + "wrong_before_detection_max": 127, + "wrong_rate_when_missed": 0.6254, + "by_value": { "0": { "runs": 64, "detected": 63 }, "1": { "runs": 64, "detected": 63 } } + }, + "text": "98%" + }, + "flight.kat_coverage.stuckbit.acc.256.latency_mean": { + "scope": "Known-answer test coverage campaign, 128 faults on the last replica, demo task on Apple M4 (darwin-arm64)", + "conditions": "Known-answer test every 256 ticks. General-purpose processor, not flight hardware.", + "source": { + "repo": "flight", + "path": "2026-10-11-darwin-arm64-kat.json: summary", + "command": "./scripts/kat-coverage.sh" + }, + "value": 178.6, + "format": "mean1", + "unit": "ticks from the fault to detection, mean over detected faults", + "text": "178.6" + }, + "flight.kat_coverage.stuckbit.acc.256.wrong_mean": { + "scope": "Known-answer test coverage campaign, 128 faults on the last replica, demo task on Apple M4 (darwin-arm64)", + "conditions": "Known-answer test every 256 ticks. General-purpose processor, not flight hardware.", + "source": { + "repo": "flight", + "path": "2026-10-11-darwin-arm64-kat.json: summary", + "command": "./scripts/kat-coverage.sh" + }, + "value": 88.27, + "format": "mean1", + "unit": "wrong results before detection, mean over detected faults", + "text": "88.3" + }, + "flight.kat_coverage.stuckbit.acc.32": { + "value": 0.9844, + "format": "pct0", + "unit": "of injected faults detected", + "scope": "Known-answer test coverage campaign, 128 faults on the last replica, demo task on Apple M4 (darwin-arm64)", + "conditions": "Known-answer test every 32 ticks. General-purpose processor, not flight hardware.", + "source": { + "repo": "flight", + "path": "2026-10-11-darwin-arm64-kat.json: summary", + "command": "./scripts/kat-coverage.sh" + }, + "detail": { + "fault": "stuckbit", + "location": "acc", + "kat_period": 32, + "common_mode": null, + "runs": 128, + "detected": 126, + "fraction_detected": 0.9844, + "missed_with_wrong": 2, + "missed_no_effect": 0, + "latency_mean": 15.5, + "latency_max": 31, + "wrong_before_detection_mean": 7.44, + "wrong_before_detection_max": 15, + "wrong_rate_when_missed": 0.6254, + "by_value": { "0": { "runs": 64, "detected": 63 }, "1": { "runs": 64, "detected": 63 } } + }, + "text": "98%" + }, + "flight.kat_coverage.stuckbit.acc.32.latency_mean": { + "scope": "Known-answer test coverage campaign, 128 faults on the last replica, demo task on Apple M4 (darwin-arm64)", + "conditions": "Known-answer test every 32 ticks. General-purpose processor, not flight hardware.", + "source": { + "repo": "flight", + "path": "2026-10-11-darwin-arm64-kat.json: summary", + "command": "./scripts/kat-coverage.sh" + }, + "value": 15.5, + "format": "mean1", + "unit": "ticks from the fault to detection, mean over detected faults", + "text": "15.5" + }, + "flight.kat_coverage.stuckbit.acc.32.wrong_mean": { + "scope": "Known-answer test coverage campaign, 128 faults on the last replica, demo task on Apple M4 (darwin-arm64)", + "conditions": "Known-answer test every 32 ticks. General-purpose processor, not flight hardware.", + "source": { + "repo": "flight", + "path": "2026-10-11-darwin-arm64-kat.json: summary", + "command": "./scripts/kat-coverage.sh" + }, + "value": 7.44, + "format": "mean1", + "unit": "wrong results before detection, mean over detected faults", + "text": "7.4" + }, + "flight.kat_coverage.stuckbit.acc.64": { + "value": 0.9844, + "format": "pct0", + "unit": "of injected faults detected", + "scope": "Known-answer test coverage campaign, 128 faults on the last replica, demo task on Apple M4 (darwin-arm64)", + "conditions": "Known-answer test every 64 ticks. General-purpose processor, not flight hardware.", + "source": { + "repo": "flight", + "path": "2026-10-11-darwin-arm64-kat.json: summary", + "command": "./scripts/kat-coverage.sh" + }, + "detail": { + "fault": "stuckbit", + "location": "acc", + "kat_period": 64, + "common_mode": null, + "runs": 128, + "detected": 126, + "fraction_detected": 0.9844, + "missed_with_wrong": 2, + "missed_no_effect": 0, + "latency_mean": 31.8, + "latency_max": 63, + "wrong_before_detection_mean": 15.57, + "wrong_before_detection_max": 31, + "wrong_rate_when_missed": 0.6254, + "by_value": { "0": { "runs": 64, "detected": 63 }, "1": { "runs": 64, "detected": 63 } } + }, + "text": "98%" + }, + "flight.kat_coverage.stuckbit.acc.64.latency_mean": { + "scope": "Known-answer test coverage campaign, 128 faults on the last replica, demo task on Apple M4 (darwin-arm64)", + "conditions": "Known-answer test every 64 ticks. General-purpose processor, not flight hardware.", + "source": { + "repo": "flight", + "path": "2026-10-11-darwin-arm64-kat.json: summary", + "command": "./scripts/kat-coverage.sh" + }, + "value": 31.8, + "format": "mean1", + "unit": "ticks from the fault to detection, mean over detected faults", + "text": "31.8" + }, + "flight.kat_coverage.stuckbit.acc.64.wrong_mean": { + "scope": "Known-answer test coverage campaign, 128 faults on the last replica, demo task on Apple M4 (darwin-arm64)", + "conditions": "Known-answer test every 64 ticks. General-purpose processor, not flight hardware.", + "source": { + "repo": "flight", + "path": "2026-10-11-darwin-arm64-kat.json: summary", + "command": "./scripts/kat-coverage.sh" + }, + "value": 15.57, + "format": "mean1", + "unit": "wrong results before detection, mean over detected faults", + "text": "15.6" + }, + "flight.kat_coverage.stuckbit.acc.8": { + "value": 0.9844, + "format": "pct0", + "unit": "of injected faults detected", + "scope": "Known-answer test coverage campaign, 128 faults on the last replica, demo task on Apple M4 (darwin-arm64)", + "conditions": "Known-answer test every 8 ticks. General-purpose processor, not flight hardware.", + "source": { + "repo": "flight", + "path": "2026-10-11-darwin-arm64-kat.json: summary", + "command": "./scripts/kat-coverage.sh" + }, + "detail": { + "fault": "stuckbit", + "location": "acc", + "kat_period": 8, + "common_mode": null, + "runs": 128, + "detected": 126, + "fraction_detected": 0.9844, + "missed_with_wrong": 2, + "missed_no_effect": 0, + "latency_mean": 3.5, + "latency_max": 7, + "wrong_before_detection_mean": 1.44, + "wrong_before_detection_max": 3, + "wrong_rate_when_missed": 0.6254, + "by_value": { "0": { "runs": 64, "detected": 63 }, "1": { "runs": 64, "detected": 63 } } + }, + "text": "98%" + }, + "flight.kat_coverage.stuckbit.acc.8.latency_mean": { + "scope": "Known-answer test coverage campaign, 128 faults on the last replica, demo task on Apple M4 (darwin-arm64)", + "conditions": "Known-answer test every 8 ticks. General-purpose processor, not flight hardware.", + "source": { + "repo": "flight", + "path": "2026-10-11-darwin-arm64-kat.json: summary", + "command": "./scripts/kat-coverage.sh" + }, + "value": 3.5, + "format": "mean1", + "unit": "ticks from the fault to detection, mean over detected faults", + "text": "3.5" + }, + "flight.kat_coverage.stuckbit.acc.8.wrong_mean": { + "scope": "Known-answer test coverage campaign, 128 faults on the last replica, demo task on Apple M4 (darwin-arm64)", + "conditions": "Known-answer test every 8 ticks. General-purpose processor, not flight hardware.", + "source": { + "repo": "flight", + "path": "2026-10-11-darwin-arm64-kat.json: summary", + "command": "./scripts/kat-coverage.sh" + }, + "value": 1.44, + "format": "mean1", + "unit": "wrong results before detection, mean over detected faults", + "text": "1.4" + }, + "flight.kat_coverage.stuckbit.block.128": { + "value": 0.4609, + "format": "pct0", + "unit": "of injected faults detected", + "scope": "Known-answer test coverage campaign, 128 faults on the last replica, demo task on Apple M4 (darwin-arm64)", + "conditions": "Known-answer test every 128 ticks. General-purpose processor, not flight hardware.", + "source": { + "repo": "flight", + "path": "2026-10-11-darwin-arm64-kat.json: summary", + "command": "./scripts/kat-coverage.sh" + }, + "detail": { + "fault": "stuckbit", + "location": "block", + "kat_period": 128, + "common_mode": null, + "runs": 128, + "detected": 59, + "fraction_detected": 0.4609, + "missed_with_wrong": 69, + "missed_no_effect": 0, + "latency_mean": 67.6, + "latency_max": 123, + "wrong_before_detection_mean": 16.58, + "wrong_before_detection_max": 36, + "wrong_rate_when_missed": 0.4995, + "by_value": { "0": { "runs": 64, "detected": 30 }, "1": { "runs": 64, "detected": 29 } } + }, + "text": "46%" + }, + "flight.kat_coverage.stuckbit.block.128.latency_mean": { + "scope": "Known-answer test coverage campaign, 128 faults on the last replica, demo task on Apple M4 (darwin-arm64)", + "conditions": "Known-answer test every 128 ticks. General-purpose processor, not flight hardware.", + "source": { + "repo": "flight", + "path": "2026-10-11-darwin-arm64-kat.json: summary", + "command": "./scripts/kat-coverage.sh" + }, + "value": 67.6, + "format": "mean1", + "unit": "ticks from the fault to detection, mean over detected faults", + "text": "67.6" + }, + "flight.kat_coverage.stuckbit.block.128.wrong_mean": { + "scope": "Known-answer test coverage campaign, 128 faults on the last replica, demo task on Apple M4 (darwin-arm64)", + "conditions": "Known-answer test every 128 ticks. General-purpose processor, not flight hardware.", + "source": { + "repo": "flight", + "path": "2026-10-11-darwin-arm64-kat.json: summary", + "command": "./scripts/kat-coverage.sh" + }, + "value": 16.58, + "format": "mean1", + "unit": "wrong results before detection, mean over detected faults", + "text": "16.6" + }, + "flight.kat_coverage.stuckbit.block.16": { + "value": 0.4609, + "format": "pct0", + "unit": "of injected faults detected", + "scope": "Known-answer test coverage campaign, 128 faults on the last replica, demo task on Apple M4 (darwin-arm64)", + "conditions": "Known-answer test every 16 ticks. General-purpose processor, not flight hardware.", + "source": { + "repo": "flight", + "path": "2026-10-11-darwin-arm64-kat.json: summary", + "command": "./scripts/kat-coverage.sh" + }, + "detail": { + "fault": "stuckbit", + "location": "block", + "kat_period": 16, + "common_mode": null, + "runs": 128, + "detected": 59, + "fraction_detected": 0.4609, + "missed_with_wrong": 69, + "missed_no_effect": 0, + "latency_mean": 7.7, + "latency_max": 15, + "wrong_before_detection_mean": 1.86, + "wrong_before_detection_max": 5, + "wrong_rate_when_missed": 0.4995, + "by_value": { "0": { "runs": 64, "detected": 30 }, "1": { "runs": 64, "detected": 29 } } + }, + "text": "46%" + }, + "flight.kat_coverage.stuckbit.block.16.latency_mean": { + "scope": "Known-answer test coverage campaign, 128 faults on the last replica, demo task on Apple M4 (darwin-arm64)", + "conditions": "Known-answer test every 16 ticks. General-purpose processor, not flight hardware.", + "source": { + "repo": "flight", + "path": "2026-10-11-darwin-arm64-kat.json: summary", + "command": "./scripts/kat-coverage.sh" + }, + "value": 7.7, + "format": "mean1", + "unit": "ticks from the fault to detection, mean over detected faults", + "text": "7.7" + }, + "flight.kat_coverage.stuckbit.block.16.wrong_mean": { + "scope": "Known-answer test coverage campaign, 128 faults on the last replica, demo task on Apple M4 (darwin-arm64)", + "conditions": "Known-answer test every 16 ticks. General-purpose processor, not flight hardware.", + "source": { + "repo": "flight", + "path": "2026-10-11-darwin-arm64-kat.json: summary", + "command": "./scripts/kat-coverage.sh" + }, + "value": 1.86, + "format": "mean1", + "unit": "wrong results before detection, mean over detected faults", + "text": "1.9" + }, + "flight.kat_coverage.stuckbit.block.256": { + "value": 0.4609, + "format": "pct0", + "unit": "of injected faults detected", + "scope": "Known-answer test coverage campaign, 128 faults on the last replica, demo task on Apple M4 (darwin-arm64)", + "conditions": "Known-answer test every 256 ticks. General-purpose processor, not flight hardware.", + "source": { + "repo": "flight", + "path": "2026-10-11-darwin-arm64-kat.json: summary", + "command": "./scripts/kat-coverage.sh" + }, + "detail": { + "fault": "stuckbit", + "location": "block", + "kat_period": 256, + "common_mode": null, + "runs": 128, + "detected": 59, + "fraction_detected": 0.4609, + "missed_with_wrong": 69, + "missed_no_effect": 0, + "latency_mean": 184.8, + "latency_max": 251, + "wrong_before_detection_mean": 45.69, + "wrong_before_detection_max": 67, + "wrong_rate_when_missed": 0.4995, + "by_value": { "0": { "runs": 64, "detected": 30 }, "1": { "runs": 64, "detected": 29 } } + }, + "text": "46%" + }, + "flight.kat_coverage.stuckbit.block.256.latency_mean": { + "scope": "Known-answer test coverage campaign, 128 faults on the last replica, demo task on Apple M4 (darwin-arm64)", + "conditions": "Known-answer test every 256 ticks. General-purpose processor, not flight hardware.", + "source": { + "repo": "flight", + "path": "2026-10-11-darwin-arm64-kat.json: summary", + "command": "./scripts/kat-coverage.sh" + }, + "value": 184.8, + "format": "mean1", + "unit": "ticks from the fault to detection, mean over detected faults", + "text": "184.8" + }, + "flight.kat_coverage.stuckbit.block.256.wrong_mean": { + "scope": "Known-answer test coverage campaign, 128 faults on the last replica, demo task on Apple M4 (darwin-arm64)", + "conditions": "Known-answer test every 256 ticks. General-purpose processor, not flight hardware.", + "source": { + "repo": "flight", + "path": "2026-10-11-darwin-arm64-kat.json: summary", + "command": "./scripts/kat-coverage.sh" + }, + "value": 45.69, + "format": "mean1", + "unit": "wrong results before detection, mean over detected faults", + "text": "45.7" + }, + "flight.kat_coverage.stuckbit.block.32": { + "value": 0.4609, + "format": "pct0", + "unit": "of injected faults detected", + "scope": "Known-answer test coverage campaign, 128 faults on the last replica, demo task on Apple M4 (darwin-arm64)", + "conditions": "Known-answer test every 32 ticks. General-purpose processor, not flight hardware.", + "source": { + "repo": "flight", + "path": "2026-10-11-darwin-arm64-kat.json: summary", + "command": "./scripts/kat-coverage.sh" + }, + "detail": { + "fault": "stuckbit", + "location": "block", + "kat_period": 32, + "common_mode": null, + "runs": 128, + "detected": 59, + "fraction_detected": 0.4609, + "missed_with_wrong": 69, + "missed_no_effect": 0, + "latency_mean": 15.6, + "latency_max": 31, + "wrong_before_detection_mean": 3.85, + "wrong_before_detection_max": 10, + "wrong_rate_when_missed": 0.4995, + "by_value": { "0": { "runs": 64, "detected": 30 }, "1": { "runs": 64, "detected": 29 } } + }, + "text": "46%" + }, + "flight.kat_coverage.stuckbit.block.32.latency_mean": { + "scope": "Known-answer test coverage campaign, 128 faults on the last replica, demo task on Apple M4 (darwin-arm64)", + "conditions": "Known-answer test every 32 ticks. General-purpose processor, not flight hardware.", + "source": { + "repo": "flight", + "path": "2026-10-11-darwin-arm64-kat.json: summary", + "command": "./scripts/kat-coverage.sh" + }, + "value": 15.6, + "format": "mean1", + "unit": "ticks from the fault to detection, mean over detected faults", + "text": "15.6" + }, + "flight.kat_coverage.stuckbit.block.32.wrong_mean": { + "scope": "Known-answer test coverage campaign, 128 faults on the last replica, demo task on Apple M4 (darwin-arm64)", + "conditions": "Known-answer test every 32 ticks. General-purpose processor, not flight hardware.", + "source": { + "repo": "flight", + "path": "2026-10-11-darwin-arm64-kat.json: summary", + "command": "./scripts/kat-coverage.sh" + }, + "value": 3.85, + "format": "mean1", + "unit": "wrong results before detection, mean over detected faults", + "text": "3.9" + }, + "flight.kat_coverage.stuckbit.block.64": { + "value": 0.4609, + "format": "pct0", + "unit": "of injected faults detected", + "scope": "Known-answer test coverage campaign, 128 faults on the last replica, demo task on Apple M4 (darwin-arm64)", + "conditions": "Known-answer test every 64 ticks. General-purpose processor, not flight hardware.", + "source": { + "repo": "flight", + "path": "2026-10-11-darwin-arm64-kat.json: summary", + "command": "./scripts/kat-coverage.sh" + }, + "detail": { + "fault": "stuckbit", + "location": "block", + "kat_period": 64, + "common_mode": null, + "runs": 128, + "detected": 59, + "fraction_detected": 0.4609, + "missed_with_wrong": 69, + "missed_no_effect": 0, + "latency_mean": 32.9, + "latency_max": 62, + "wrong_before_detection_mean": 8.17, + "wrong_before_detection_max": 18, + "wrong_rate_when_missed": 0.4995, + "by_value": { "0": { "runs": 64, "detected": 30 }, "1": { "runs": 64, "detected": 29 } } + }, + "text": "46%" + }, + "flight.kat_coverage.stuckbit.block.64.latency_mean": { + "scope": "Known-answer test coverage campaign, 128 faults on the last replica, demo task on Apple M4 (darwin-arm64)", + "conditions": "Known-answer test every 64 ticks. General-purpose processor, not flight hardware.", + "source": { + "repo": "flight", + "path": "2026-10-11-darwin-arm64-kat.json: summary", + "command": "./scripts/kat-coverage.sh" + }, + "value": 32.9, + "format": "mean1", + "unit": "ticks from the fault to detection, mean over detected faults", + "text": "32.9" + }, + "flight.kat_coverage.stuckbit.block.64.wrong_mean": { + "scope": "Known-answer test coverage campaign, 128 faults on the last replica, demo task on Apple M4 (darwin-arm64)", + "conditions": "Known-answer test every 64 ticks. General-purpose processor, not flight hardware.", + "source": { + "repo": "flight", + "path": "2026-10-11-darwin-arm64-kat.json: summary", + "command": "./scripts/kat-coverage.sh" + }, + "value": 8.17, + "format": "mean1", + "unit": "wrong results before detection, mean over detected faults", + "text": "8.2" + }, + "flight.kat_coverage.stuckbit.block.8": { + "value": 0.4609, + "format": "pct0", + "unit": "of injected faults detected", + "scope": "Known-answer test coverage campaign, 128 faults on the last replica, demo task on Apple M4 (darwin-arm64)", + "conditions": "Known-answer test every 8 ticks. General-purpose processor, not flight hardware.", + "source": { + "repo": "flight", + "path": "2026-10-11-darwin-arm64-kat.json: summary", + "command": "./scripts/kat-coverage.sh" + }, + "detail": { + "fault": "stuckbit", + "location": "block", + "kat_period": 8, + "common_mode": null, + "runs": 128, + "detected": 59, + "fraction_detected": 0.4609, + "missed_with_wrong": 69, + "missed_no_effect": 0, + "latency_mean": 3.4, + "latency_max": 7, + "wrong_before_detection_mean": 0.69, + "wrong_before_detection_max": 3, + "wrong_rate_when_missed": 0.4995, + "by_value": { "0": { "runs": 64, "detected": 30 }, "1": { "runs": 64, "detected": 29 } } + }, + "text": "46%" + }, + "flight.kat_coverage.stuckbit.block.8.latency_mean": { + "scope": "Known-answer test coverage campaign, 128 faults on the last replica, demo task on Apple M4 (darwin-arm64)", + "conditions": "Known-answer test every 8 ticks. General-purpose processor, not flight hardware.", + "source": { + "repo": "flight", + "path": "2026-10-11-darwin-arm64-kat.json: summary", + "command": "./scripts/kat-coverage.sh" + }, + "value": 3.4, + "format": "mean1", + "unit": "ticks from the fault to detection, mean over detected faults", + "text": "3.4" + }, + "flight.kat_coverage.stuckbit.block.8.wrong_mean": { + "scope": "Known-answer test coverage campaign, 128 faults on the last replica, demo task on Apple M4 (darwin-arm64)", + "conditions": "Known-answer test every 8 ticks. General-purpose processor, not flight hardware.", + "source": { + "repo": "flight", + "path": "2026-10-11-darwin-arm64-kat.json: summary", + "command": "./scripts/kat-coverage.sh" + }, + "value": 0.69, + "format": "mean1", + "unit": "wrong results before detection, mean over detected faults", + "text": "0.7" + }, + "flight.kat_coverage.stuckbit.in.128": { + "value": 0.5, + "format": "pct0", + "unit": "of injected faults detected", + "scope": "Known-answer test coverage campaign, 128 faults on the last replica, demo task on Apple M4 (darwin-arm64)", + "conditions": "Known-answer test every 128 ticks. General-purpose processor, not flight hardware.", + "source": { + "repo": "flight", + "path": "2026-10-11-darwin-arm64-kat.json: summary", + "command": "./scripts/kat-coverage.sh" + }, + "detail": { + "fault": "stuckbit", + "location": "in", + "kat_period": 128, + "common_mode": null, + "runs": 128, + "detected": 64, + "fraction_detected": 0.5, + "missed_with_wrong": 10, + "missed_no_effect": 54, + "latency_mean": 44.5, + "latency_max": 76, + "wrong_before_detection_mean": 19.47, + "wrong_before_detection_max": 38, + "wrong_rate_when_missed": 0.0782, + "by_value": { "0": { "runs": 64, "detected": 0 }, "1": { "runs": 64, "detected": 64 } } + }, + "text": "50%" + }, + "flight.kat_coverage.stuckbit.in.128.latency_mean": { + "scope": "Known-answer test coverage campaign, 128 faults on the last replica, demo task on Apple M4 (darwin-arm64)", + "conditions": "Known-answer test every 128 ticks. General-purpose processor, not flight hardware.", + "source": { + "repo": "flight", + "path": "2026-10-11-darwin-arm64-kat.json: summary", + "command": "./scripts/kat-coverage.sh" + }, + "value": 44.5, + "format": "mean1", + "unit": "ticks from the fault to detection, mean over detected faults", + "text": "44.5" + }, + "flight.kat_coverage.stuckbit.in.128.wrong_mean": { + "scope": "Known-answer test coverage campaign, 128 faults on the last replica, demo task on Apple M4 (darwin-arm64)", + "conditions": "Known-answer test every 128 ticks. General-purpose processor, not flight hardware.", + "source": { + "repo": "flight", + "path": "2026-10-11-darwin-arm64-kat.json: summary", + "command": "./scripts/kat-coverage.sh" + }, + "value": 19.47, + "format": "mean1", + "unit": "wrong results before detection, mean over detected faults", + "text": "19.5" + }, + "flight.kat_coverage.stuckbit.in.16": { + "value": 0.5, + "format": "pct0", + "unit": "of injected faults detected", + "scope": "Known-answer test coverage campaign, 128 faults on the last replica, demo task on Apple M4 (darwin-arm64)", + "conditions": "Known-answer test every 16 ticks. General-purpose processor, not flight hardware.", + "source": { + "repo": "flight", + "path": "2026-10-11-darwin-arm64-kat.json: summary", + "command": "./scripts/kat-coverage.sh" + }, + "detail": { + "fault": "stuckbit", + "location": "in", + "kat_period": 16, + "common_mode": null, + "runs": 128, + "detected": 64, + "fraction_detected": 0.5, + "missed_with_wrong": 10, + "missed_no_effect": 54, + "latency_mean": 7.5, + "latency_max": 15, + "wrong_before_detection_mean": 3.22, + "wrong_before_detection_max": 7, + "wrong_rate_when_missed": 0.0782, + "by_value": { "0": { "runs": 64, "detected": 0 }, "1": { "runs": 64, "detected": 64 } } + }, + "text": "50%" + }, + "flight.kat_coverage.stuckbit.in.16.latency_mean": { + "scope": "Known-answer test coverage campaign, 128 faults on the last replica, demo task on Apple M4 (darwin-arm64)", + "conditions": "Known-answer test every 16 ticks. General-purpose processor, not flight hardware.", + "source": { + "repo": "flight", + "path": "2026-10-11-darwin-arm64-kat.json: summary", + "command": "./scripts/kat-coverage.sh" + }, + "value": 7.5, + "format": "mean1", + "unit": "ticks from the fault to detection, mean over detected faults", + "text": "7.5" + }, + "flight.kat_coverage.stuckbit.in.16.wrong_mean": { + "scope": "Known-answer test coverage campaign, 128 faults on the last replica, demo task on Apple M4 (darwin-arm64)", + "conditions": "Known-answer test every 16 ticks. General-purpose processor, not flight hardware.", + "source": { + "repo": "flight", + "path": "2026-10-11-darwin-arm64-kat.json: summary", + "command": "./scripts/kat-coverage.sh" + }, + "value": 3.22, + "format": "mean1", + "unit": "wrong results before detection, mean over detected faults", + "text": "3.2" + }, + "flight.kat_coverage.stuckbit.in.256": { + "value": 0.5, + "format": "pct0", + "unit": "of injected faults detected", + "scope": "Known-answer test coverage campaign, 128 faults on the last replica, demo task on Apple M4 (darwin-arm64)", + "conditions": "Known-answer test every 256 ticks. General-purpose processor, not flight hardware.", + "source": { + "repo": "flight", + "path": "2026-10-11-darwin-arm64-kat.json: summary", + "command": "./scripts/kat-coverage.sh" + }, + "detail": { + "fault": "stuckbit", + "location": "in", + "kat_period": 256, + "common_mode": null, + "runs": 128, + "detected": 64, + "fraction_detected": 0.5, + "missed_with_wrong": 10, + "missed_no_effect": 54, + "latency_mean": 172.5, + "latency_max": 204, + "wrong_before_detection_mean": 78.47, + "wrong_before_detection_max": 102, + "wrong_rate_when_missed": 0.0782, + "by_value": { "0": { "runs": 64, "detected": 0 }, "1": { "runs": 64, "detected": 64 } } + }, + "text": "50%" + }, + "flight.kat_coverage.stuckbit.in.256.latency_mean": { + "scope": "Known-answer test coverage campaign, 128 faults on the last replica, demo task on Apple M4 (darwin-arm64)", + "conditions": "Known-answer test every 256 ticks. General-purpose processor, not flight hardware.", + "source": { + "repo": "flight", + "path": "2026-10-11-darwin-arm64-kat.json: summary", + "command": "./scripts/kat-coverage.sh" + }, + "value": 172.5, + "format": "mean1", + "unit": "ticks from the fault to detection, mean over detected faults", + "text": "172.5" + }, + "flight.kat_coverage.stuckbit.in.256.wrong_mean": { + "scope": "Known-answer test coverage campaign, 128 faults on the last replica, demo task on Apple M4 (darwin-arm64)", + "conditions": "Known-answer test every 256 ticks. General-purpose processor, not flight hardware.", + "source": { + "repo": "flight", + "path": "2026-10-11-darwin-arm64-kat.json: summary", + "command": "./scripts/kat-coverage.sh" + }, + "value": 78.47, + "format": "mean1", + "unit": "wrong results before detection, mean over detected faults", + "text": "78.5" + }, + "flight.kat_coverage.stuckbit.in.32": { + "value": 0.5, + "format": "pct0", + "unit": "of injected faults detected", + "scope": "Known-answer test coverage campaign, 128 faults on the last replica, demo task on Apple M4 (darwin-arm64)", + "conditions": "Known-answer test every 32 ticks. General-purpose processor, not flight hardware.", + "source": { + "repo": "flight", + "path": "2026-10-11-darwin-arm64-kat.json: summary", + "command": "./scripts/kat-coverage.sh" + }, + "detail": { + "fault": "stuckbit", + "location": "in", + "kat_period": 32, + "common_mode": null, + "runs": 128, + "detected": 64, + "fraction_detected": 0.5, + "missed_with_wrong": 10, + "missed_no_effect": 54, + "latency_mean": 15.5, + "latency_max": 31, + "wrong_before_detection_mean": 7.22, + "wrong_before_detection_max": 15, + "wrong_rate_when_missed": 0.0782, + "by_value": { "0": { "runs": 64, "detected": 0 }, "1": { "runs": 64, "detected": 64 } } + }, + "text": "50%" + }, + "flight.kat_coverage.stuckbit.in.32.latency_mean": { + "scope": "Known-answer test coverage campaign, 128 faults on the last replica, demo task on Apple M4 (darwin-arm64)", + "conditions": "Known-answer test every 32 ticks. General-purpose processor, not flight hardware.", + "source": { + "repo": "flight", + "path": "2026-10-11-darwin-arm64-kat.json: summary", + "command": "./scripts/kat-coverage.sh" + }, + "value": 15.5, + "format": "mean1", + "unit": "ticks from the fault to detection, mean over detected faults", + "text": "15.5" + }, + "flight.kat_coverage.stuckbit.in.32.wrong_mean": { + "scope": "Known-answer test coverage campaign, 128 faults on the last replica, demo task on Apple M4 (darwin-arm64)", + "conditions": "Known-answer test every 32 ticks. General-purpose processor, not flight hardware.", + "source": { + "repo": "flight", + "path": "2026-10-11-darwin-arm64-kat.json: summary", + "command": "./scripts/kat-coverage.sh" + }, + "value": 7.22, + "format": "mean1", + "unit": "wrong results before detection, mean over detected faults", + "text": "7.2" + }, + "flight.kat_coverage.stuckbit.in.64": { + "value": 0.5, + "format": "pct0", + "unit": "of injected faults detected", + "scope": "Known-answer test coverage campaign, 128 faults on the last replica, demo task on Apple M4 (darwin-arm64)", + "conditions": "Known-answer test every 64 ticks. General-purpose processor, not flight hardware.", + "source": { + "repo": "flight", + "path": "2026-10-11-darwin-arm64-kat.json: summary", + "command": "./scripts/kat-coverage.sh" + }, + "detail": { + "fault": "stuckbit", + "location": "in", + "kat_period": 64, + "common_mode": null, + "runs": 128, + "detected": 64, + "fraction_detected": 0.5, + "missed_with_wrong": 10, + "missed_no_effect": 54, + "latency_mean": 31.5, + "latency_max": 63, + "wrong_before_detection_mean": 15.22, + "wrong_before_detection_max": 31, + "wrong_rate_when_missed": 0.0782, + "by_value": { "0": { "runs": 64, "detected": 0 }, "1": { "runs": 64, "detected": 64 } } + }, + "text": "50%" + }, + "flight.kat_coverage.stuckbit.in.64.latency_mean": { + "scope": "Known-answer test coverage campaign, 128 faults on the last replica, demo task on Apple M4 (darwin-arm64)", + "conditions": "Known-answer test every 64 ticks. General-purpose processor, not flight hardware.", + "source": { + "repo": "flight", + "path": "2026-10-11-darwin-arm64-kat.json: summary", + "command": "./scripts/kat-coverage.sh" + }, + "value": 31.5, + "format": "mean1", + "unit": "ticks from the fault to detection, mean over detected faults", + "text": "31.5" + }, + "flight.kat_coverage.stuckbit.in.64.wrong_mean": { + "scope": "Known-answer test coverage campaign, 128 faults on the last replica, demo task on Apple M4 (darwin-arm64)", + "conditions": "Known-answer test every 64 ticks. General-purpose processor, not flight hardware.", + "source": { + "repo": "flight", + "path": "2026-10-11-darwin-arm64-kat.json: summary", + "command": "./scripts/kat-coverage.sh" + }, + "value": 15.22, + "format": "mean1", + "unit": "wrong results before detection, mean over detected faults", + "text": "15.2" + }, + "flight.kat_coverage.stuckbit.in.8": { + "value": 0.5, + "format": "pct0", + "unit": "of injected faults detected", + "scope": "Known-answer test coverage campaign, 128 faults on the last replica, demo task on Apple M4 (darwin-arm64)", + "conditions": "Known-answer test every 8 ticks. General-purpose processor, not flight hardware.", + "source": { + "repo": "flight", + "path": "2026-10-11-darwin-arm64-kat.json: summary", + "command": "./scripts/kat-coverage.sh" + }, + "detail": { + "fault": "stuckbit", + "location": "in", + "kat_period": 8, + "common_mode": null, + "runs": 128, + "detected": 64, + "fraction_detected": 0.5, + "missed_with_wrong": 10, + "missed_no_effect": 54, + "latency_mean": 3.5, + "latency_max": 7, + "wrong_before_detection_mean": 1.41, + "wrong_before_detection_max": 3, + "wrong_rate_when_missed": 0.0782, + "by_value": { "0": { "runs": 64, "detected": 0 }, "1": { "runs": 64, "detected": 64 } } + }, + "text": "50%" + }, + "flight.kat_coverage.stuckbit.in.8.latency_mean": { + "scope": "Known-answer test coverage campaign, 128 faults on the last replica, demo task on Apple M4 (darwin-arm64)", + "conditions": "Known-answer test every 8 ticks. General-purpose processor, not flight hardware.", + "source": { + "repo": "flight", + "path": "2026-10-11-darwin-arm64-kat.json: summary", + "command": "./scripts/kat-coverage.sh" + }, + "value": 3.5, + "format": "mean1", + "unit": "ticks from the fault to detection, mean over detected faults", + "text": "3.5" + }, + "flight.kat_coverage.stuckbit.in.8.wrong_mean": { + "scope": "Known-answer test coverage campaign, 128 faults on the last replica, demo task on Apple M4 (darwin-arm64)", + "conditions": "Known-answer test every 8 ticks. General-purpose processor, not flight hardware.", + "source": { + "repo": "flight", + "path": "2026-10-11-darwin-arm64-kat.json: summary", + "command": "./scripts/kat-coverage.sh" + }, + "value": 1.41, + "format": "mean1", + "unit": "wrong results before detection, mean over detected faults", + "text": "1.4" + }, + "flight.kat_coverage.stuckbit.out.128": { + "value": 0.5, + "format": "pct0", + "unit": "of injected faults detected", + "scope": "Known-answer test coverage campaign, 128 faults on the last replica, demo task on Apple M4 (darwin-arm64)", + "conditions": "Known-answer test every 128 ticks. General-purpose processor, not flight hardware.", + "source": { + "repo": "flight", + "path": "2026-10-11-darwin-arm64-kat.json: summary", + "command": "./scripts/kat-coverage.sh" + }, + "detail": { + "fault": "stuckbit", + "location": "out", + "kat_period": 128, + "common_mode": null, + "runs": 128, + "detected": 64, + "fraction_detected": 0.5, + "missed_with_wrong": 64, + "missed_no_effect": 0, + "latency_mean": 57.5, + "latency_max": 126, + "wrong_before_detection_mean": 14.31, + "wrong_before_detection_max": 31, + "wrong_rate_when_missed": 0.5011, + "by_value": { "0": { "runs": 64, "detected": 31 }, "1": { "runs": 64, "detected": 33 } } + }, + "text": "50%" + }, + "flight.kat_coverage.stuckbit.out.128.latency_mean": { + "scope": "Known-answer test coverage campaign, 128 faults on the last replica, demo task on Apple M4 (darwin-arm64)", + "conditions": "Known-answer test every 128 ticks. General-purpose processor, not flight hardware.", + "source": { + "repo": "flight", + "path": "2026-10-11-darwin-arm64-kat.json: summary", + "command": "./scripts/kat-coverage.sh" + }, + "value": 57.5, + "format": "mean1", + "unit": "ticks from the fault to detection, mean over detected faults", + "text": "57.5" + }, + "flight.kat_coverage.stuckbit.out.128.wrong_mean": { + "scope": "Known-answer test coverage campaign, 128 faults on the last replica, demo task on Apple M4 (darwin-arm64)", + "conditions": "Known-answer test every 128 ticks. General-purpose processor, not flight hardware.", + "source": { + "repo": "flight", + "path": "2026-10-11-darwin-arm64-kat.json: summary", + "command": "./scripts/kat-coverage.sh" + }, + "value": 14.31, + "format": "mean1", + "unit": "wrong results before detection, mean over detected faults", + "text": "14.3" + }, + "flight.kat_coverage.stuckbit.out.16": { + "value": 0.5, + "format": "pct0", + "unit": "of injected faults detected", + "scope": "Known-answer test coverage campaign, 128 faults on the last replica, demo task on Apple M4 (darwin-arm64)", + "conditions": "Known-answer test every 16 ticks. General-purpose processor, not flight hardware.", + "source": { + "repo": "flight", + "path": "2026-10-11-darwin-arm64-kat.json: summary", + "command": "./scripts/kat-coverage.sh" + }, + "detail": { + "fault": "stuckbit", + "location": "out", + "kat_period": 16, + "common_mode": null, + "runs": 128, + "detected": 64, + "fraction_detected": 0.5, + "missed_with_wrong": 64, + "missed_no_effect": 0, + "latency_mean": 7.5, + "latency_max": 15, + "wrong_before_detection_mean": 1.64, + "wrong_before_detection_max": 4, + "wrong_rate_when_missed": 0.5011, + "by_value": { "0": { "runs": 64, "detected": 31 }, "1": { "runs": 64, "detected": 33 } } + }, + "text": "50%" + }, + "flight.kat_coverage.stuckbit.out.16.latency_mean": { + "scope": "Known-answer test coverage campaign, 128 faults on the last replica, demo task on Apple M4 (darwin-arm64)", + "conditions": "Known-answer test every 16 ticks. General-purpose processor, not flight hardware.", + "source": { + "repo": "flight", + "path": "2026-10-11-darwin-arm64-kat.json: summary", + "command": "./scripts/kat-coverage.sh" + }, + "value": 7.5, + "format": "mean1", + "unit": "ticks from the fault to detection, mean over detected faults", + "text": "7.5" + }, + "flight.kat_coverage.stuckbit.out.16.wrong_mean": { + "scope": "Known-answer test coverage campaign, 128 faults on the last replica, demo task on Apple M4 (darwin-arm64)", + "conditions": "Known-answer test every 16 ticks. General-purpose processor, not flight hardware.", + "source": { + "repo": "flight", + "path": "2026-10-11-darwin-arm64-kat.json: summary", + "command": "./scripts/kat-coverage.sh" + }, + "value": 1.64, + "format": "mean1", + "unit": "wrong results before detection, mean over detected faults", + "text": "1.6" + }, + "flight.kat_coverage.stuckbit.out.256": { + "value": 0.5, + "format": "pct0", + "unit": "of injected faults detected", + "scope": "Known-answer test coverage campaign, 128 faults on the last replica, demo task on Apple M4 (darwin-arm64)", + "conditions": "Known-answer test every 256 ticks. General-purpose processor, not flight hardware.", + "source": { + "repo": "flight", + "path": "2026-10-11-darwin-arm64-kat.json: summary", + "command": "./scripts/kat-coverage.sh" + }, + "detail": { + "fault": "stuckbit", + "location": "out", + "kat_period": 256, + "common_mode": null, + "runs": 128, + "detected": 64, + "fraction_detected": 0.5, + "missed_with_wrong": 64, + "missed_no_effect": 0, + "latency_mean": 167.5, + "latency_max": 254, + "wrong_before_detection_mean": 41.39, + "wrong_before_detection_max": 73, + "wrong_rate_when_missed": 0.5011, + "by_value": { "0": { "runs": 64, "detected": 31 }, "1": { "runs": 64, "detected": 33 } } + }, + "text": "50%" + }, + "flight.kat_coverage.stuckbit.out.256.latency_mean": { + "scope": "Known-answer test coverage campaign, 128 faults on the last replica, demo task on Apple M4 (darwin-arm64)", + "conditions": "Known-answer test every 256 ticks. General-purpose processor, not flight hardware.", + "source": { + "repo": "flight", + "path": "2026-10-11-darwin-arm64-kat.json: summary", + "command": "./scripts/kat-coverage.sh" + }, + "value": 167.5, + "format": "mean1", + "unit": "ticks from the fault to detection, mean over detected faults", + "text": "167.5" + }, + "flight.kat_coverage.stuckbit.out.256.wrong_mean": { + "scope": "Known-answer test coverage campaign, 128 faults on the last replica, demo task on Apple M4 (darwin-arm64)", + "conditions": "Known-answer test every 256 ticks. General-purpose processor, not flight hardware.", + "source": { + "repo": "flight", + "path": "2026-10-11-darwin-arm64-kat.json: summary", + "command": "./scripts/kat-coverage.sh" + }, + "value": 41.39, + "format": "mean1", + "unit": "wrong results before detection, mean over detected faults", + "text": "41.4" + }, + "flight.kat_coverage.stuckbit.out.32": { + "value": 0.5, + "format": "pct0", + "unit": "of injected faults detected", + "scope": "Known-answer test coverage campaign, 128 faults on the last replica, demo task on Apple M4 (darwin-arm64)", + "conditions": "Known-answer test every 32 ticks. General-purpose processor, not flight hardware.", + "source": { + "repo": "flight", + "path": "2026-10-11-darwin-arm64-kat.json: summary", + "command": "./scripts/kat-coverage.sh" + }, + "detail": { + "fault": "stuckbit", + "location": "out", + "kat_period": 32, + "common_mode": null, + "runs": 128, + "detected": 64, + "fraction_detected": 0.5, + "missed_with_wrong": 64, + "missed_no_effect": 0, + "latency_mean": 15.5, + "latency_max": 31, + "wrong_before_detection_mean": 3.69, + "wrong_before_detection_max": 8, + "wrong_rate_when_missed": 0.5011, + "by_value": { "0": { "runs": 64, "detected": 31 }, "1": { "runs": 64, "detected": 33 } } + }, + "text": "50%" + }, + "flight.kat_coverage.stuckbit.out.32.latency_mean": { + "scope": "Known-answer test coverage campaign, 128 faults on the last replica, demo task on Apple M4 (darwin-arm64)", + "conditions": "Known-answer test every 32 ticks. General-purpose processor, not flight hardware.", + "source": { + "repo": "flight", + "path": "2026-10-11-darwin-arm64-kat.json: summary", + "command": "./scripts/kat-coverage.sh" + }, + "value": 15.5, + "format": "mean1", + "unit": "ticks from the fault to detection, mean over detected faults", + "text": "15.5" + }, + "flight.kat_coverage.stuckbit.out.32.wrong_mean": { + "scope": "Known-answer test coverage campaign, 128 faults on the last replica, demo task on Apple M4 (darwin-arm64)", + "conditions": "Known-answer test every 32 ticks. General-purpose processor, not flight hardware.", + "source": { + "repo": "flight", + "path": "2026-10-11-darwin-arm64-kat.json: summary", + "command": "./scripts/kat-coverage.sh" + }, + "value": 3.69, + "format": "mean1", + "unit": "wrong results before detection, mean over detected faults", + "text": "3.7" + }, + "flight.kat_coverage.stuckbit.out.64": { + "value": 0.5, + "format": "pct0", + "unit": "of injected faults detected", + "scope": "Known-answer test coverage campaign, 128 faults on the last replica, demo task on Apple M4 (darwin-arm64)", + "conditions": "Known-answer test every 64 ticks. General-purpose processor, not flight hardware.", + "source": { + "repo": "flight", + "path": "2026-10-11-darwin-arm64-kat.json: summary", + "command": "./scripts/kat-coverage.sh" + }, + "detail": { + "fault": "stuckbit", + "location": "out", + "kat_period": 64, + "common_mode": null, + "runs": 128, + "detected": 64, + "fraction_detected": 0.5, + "missed_with_wrong": 64, + "missed_no_effect": 0, + "latency_mean": 31.5, + "latency_max": 63, + "wrong_before_detection_mean": 7.91, + "wrong_before_detection_max": 17, + "wrong_rate_when_missed": 0.5011, + "by_value": { "0": { "runs": 64, "detected": 31 }, "1": { "runs": 64, "detected": 33 } } + }, + "text": "50%" + }, + "flight.kat_coverage.stuckbit.out.64.latency_mean": { + "scope": "Known-answer test coverage campaign, 128 faults on the last replica, demo task on Apple M4 (darwin-arm64)", + "conditions": "Known-answer test every 64 ticks. General-purpose processor, not flight hardware.", + "source": { + "repo": "flight", + "path": "2026-10-11-darwin-arm64-kat.json: summary", + "command": "./scripts/kat-coverage.sh" + }, + "value": 31.5, + "format": "mean1", + "unit": "ticks from the fault to detection, mean over detected faults", + "text": "31.5" + }, + "flight.kat_coverage.stuckbit.out.64.wrong_mean": { + "scope": "Known-answer test coverage campaign, 128 faults on the last replica, demo task on Apple M4 (darwin-arm64)", + "conditions": "Known-answer test every 64 ticks. General-purpose processor, not flight hardware.", + "source": { + "repo": "flight", + "path": "2026-10-11-darwin-arm64-kat.json: summary", + "command": "./scripts/kat-coverage.sh" + }, + "value": 7.91, + "format": "mean1", + "unit": "wrong results before detection, mean over detected faults", + "text": "7.9" + }, + "flight.kat_coverage.stuckbit.out.8": { + "value": 0.5, + "format": "pct0", + "unit": "of injected faults detected", + "scope": "Known-answer test coverage campaign, 128 faults on the last replica, demo task on Apple M4 (darwin-arm64)", + "conditions": "Known-answer test every 8 ticks. General-purpose processor, not flight hardware.", + "source": { + "repo": "flight", + "path": "2026-10-11-darwin-arm64-kat.json: summary", + "command": "./scripts/kat-coverage.sh" + }, + "detail": { + "fault": "stuckbit", + "location": "out", + "kat_period": 8, + "common_mode": null, + "runs": 128, + "detected": 64, + "fraction_detected": 0.5, + "missed_with_wrong": 64, + "missed_no_effect": 0, + "latency_mean": 3.5, + "latency_max": 7, + "wrong_before_detection_mean": 0.67, + "wrong_before_detection_max": 2, + "wrong_rate_when_missed": 0.5011, + "by_value": { "0": { "runs": 64, "detected": 31 }, "1": { "runs": 64, "detected": 33 } } + }, + "text": "50%" + }, + "flight.kat_coverage.stuckbit.out.8.latency_mean": { + "scope": "Known-answer test coverage campaign, 128 faults on the last replica, demo task on Apple M4 (darwin-arm64)", + "conditions": "Known-answer test every 8 ticks. General-purpose processor, not flight hardware.", + "source": { + "repo": "flight", + "path": "2026-10-11-darwin-arm64-kat.json: summary", + "command": "./scripts/kat-coverage.sh" + }, + "value": 3.5, + "format": "mean1", + "unit": "ticks from the fault to detection, mean over detected faults", + "text": "3.5" + }, + "flight.kat_coverage.stuckbit.out.8.wrong_mean": { + "scope": "Known-answer test coverage campaign, 128 faults on the last replica, demo task on Apple M4 (darwin-arm64)", + "conditions": "Known-answer test every 8 ticks. General-purpose processor, not flight hardware.", + "source": { + "repo": "flight", + "path": "2026-10-11-darwin-arm64-kat.json: summary", + "command": "./scripts/kat-coverage.sh" + }, + "value": 0.67, + "format": "mean1", + "unit": "wrong results before detection, mean over detected faults", + "text": "0.7" + }, + "flight.kat.latency_ticks": { + "value": 40, + "format": "int", + "unit": "ticks from the stuck fault to its detection", + "scope": "Mru Flight bench, mean of 10 seeds, 20,000 ticks per run, three replica processes on one host; the same counts on all three hosts, schedule last-stuck", + "conditions": "Upset rate 0.0001, known-answer test every 64 ticks.", + "source": { + "repo": "flight", + "path": "bench/results/*.json: summary[schedule=last-stuck, upset_rate=0.0001].detection_latency_mean_ticks", + "command": "./scripts/bench.sh" + }, + "text": "40" + }, + "flight.kat.wrong": { + "value": 20, + "format": "int", + "unit": "wrong results per run before the known-answer test caught a stuck last replica", + "scope": "Mru Flight bench, mean of 10 seeds, 20,000 ticks per run, three replica processes on one host; the same counts on all three hosts, schedule last-stuck", + "conditions": "Upset rate 0.0001, known-answer test every 64 ticks.", + "source": { + "repo": "flight", + "path": "bench/results/*.json: summary[schedule=last-stuck, upset_rate=0.0001].wrong_mean.shrink", + "command": "./scripts/bench.sh" + }, + "text": "20" + }, + "flight.wrong.common_mode_max": { + "value": 3.6, + "format": "mean1", + "unit": "wrong results per run from upsets that hit both self-check runs alike", + "scope": "Mru Flight bench, mean of 10 seeds, 20,000 ticks per run, three replica processes on one host; the same counts on all three hosts, schedule common-mode", + "conditions": "Upset rate 0.01, common-mode share 0.05.", + "source": { + "repo": "flight", + "path": "bench/results/*.json: summary[schedule=common-mode, upset_rate=0.01].wrong_mean.shrink", + "command": "./scripts/bench.sh" + }, + "text": "3.6" + } + } +} diff --git a/src/data/claims.ts b/src/data/claims.ts new file mode 100644 index 0000000..23cd76f --- /dev/null +++ b/src/data/claims.ts @@ -0,0 +1,57 @@ +// Headline numbers, read from claims.json, which scripts/claims/pull.mjs +// writes from the results files in mruspace/flight and mruspace/dusk. +// A page asks for a claim by id; an unknown id fails the build. +import data from './claims.json'; + +export interface Claim { + value: unknown; + format: string; + text: string; + ci?: string; + min_text?: string; + unit: string; + scope: string; + conditions: string; + source: { repo: string; path?: string; kind?: string; ref?: string; command?: string }; + /** The results-file row a claim came from, when a page shows more than one number from it. */ + detail?: Record; +} + +export const CLAIMS = data.claims as unknown as Record; +export const CLAIM_SOURCES = data.sources; + +export function claim(id: string): Claim { + const c = CLAIMS[id]; + if (!c) throw new Error(`claims.json: no claim "${id}". Run npm run claims, or fix the id.`); + return c; +} + +/** The claim's text, for templates: {t('dusk.work_vs_tmr')} gives "1.34×". */ +export const t = (id: string): string => claim(id).text; + +/** "1.33× to 1.35×" for a claim with an interval. */ +export function ci(id: string): string { + const c = claim(id); + if (!c.ci) throw new Error(`claims.json: claim "${id}" has no interval`); + return c.ci; +} + +// Static copy (metadata descriptions, research frontmatter) cannot call t(). +// assertClaims checks it instead: every listed claim's text must appear, and +// every decimal or grouped number in the copy must belong to a listed claim. +// Decimals and grouped integers; version strings such as 0.2.0 are not claims. +const NUM = /(? s.replace(/(\d)x\b/g, '$1×'); +export function assertClaims(where: string, strings: (string | undefined)[], ids: string[] = []): void { + if (ids.length === 0) return; + const copy = norm(strings.filter(Boolean).join('\n')); + const allowed = new Set(); + for (const id of ids) { + const c = claim(id); + if (!copy.includes(c.text) && !copy.includes(c.text.replace('×', ''))) + throw new Error(`claims: ${where} lists ${id} ("${c.text}") but its copy does not contain it`); + for (const s of [c.text, c.ci, c.min_text]) for (const n of (s ?? '').match(NUM) ?? []) allowed.add(n); + } + for (const n of copy.match(NUM) ?? []) + if (!allowed.has(n)) throw new Error(`claims: ${where} has the number "${n}", which no listed claim gives`); +} diff --git a/src/data/metadata.json b/src/data/metadata.json index 6002109..9e2bb0f 100644 --- a/src/data/metadata.json +++ b/src/data/metadata.json @@ -10,7 +10,7 @@ { "url": "https://docs.mru.space/concepts/shrinking-quorum/", "title": "Shrinking quorum · Mru Docs", - "description": "Vote on three replicas, compare on two, self-check on one. The rule, its Kani-proved guarantees, its cost, and how replicas are diagnosed.", + "description": "Vote on three replicas, compare on two, self-check on one. What Kani proves per tick, what is tested per run, the cost and the command path.", "ogTitle": "Shrinking quorum", "cardLabel": "Docs · Concepts", "schema": ["TechArticle", "BreadcrumbList"] @@ -23,10 +23,26 @@ "cardLabel": "Docs · Concepts", "schema": ["TechArticle", "BreadcrumbList"] }, + { + "url": "https://docs.mru.space/concepts/prior-art/", + "title": "Prior art and related work · Mru Docs", + "description": "TMR, degradable systems, Byzantine agreement, Space Shuttle redundancy management and deep-space fault protection, and how Mru relates.", + "ogTitle": "Prior art and related work", + "cardLabel": "Docs · Concepts", + "schema": ["TechArticle", "BreadcrumbList"] + }, + { + "url": "https://docs.mru.space/concepts/qualification/", + "title": "Qualification path · Mru Docs", + "description": "What exists for Mru against NPR 7150.2, NASA-STD-8739.8, ECSS-E-ST-40C and ECSS-Q-ST-80C, and what has not started. No compliance claim.", + "ogTitle": "Qualification path", + "cardLabel": "Docs · Concepts", + "schema": ["TechArticle", "BreadcrumbList"] + }, { "url": "https://docs.mru.space/core/quorum-crate/", "title": "quorum crate API reference · Mru Docs", - "description": "API reference for the quorum crate: Policy, Mode, Reply, Outcome, Verdict, decide(), Health. no_std, no allocation, four Kani proofs.", + "description": "API reference for the quorum crate: Policy, Mode, Reply, Outcome, Verdict, decide(), Health. no_std, no allocation, nine Kani proofs.", "ogTitle": "The quorum crate", "cardLabel": "Docs · Core runtime", "schema": ["TechArticle", "SoftwareSourceCode", "BreadcrumbList"] @@ -58,7 +74,7 @@ { "url": "https://docs.mru.space/simulation/dusk/", "title": "Dusk simulator reference · Mru Docs", - "description": "Run Dusk, the Monte Carlo of redundancy policies: options and defaults, the fault model, default results, sweeps and what it does not claim.", + "description": "Run Dusk, the Monte Carlo of redundancy policies: options, the fault model, results and their definitions, sweeps, ground support and limits.", "ogTitle": "Dusk", "cardLabel": "Docs · Simulation", "schema": ["TechArticle", "SoftwareSourceCode", "BreadcrumbList"] diff --git a/src/data/nav.ts b/src/data/nav.ts index 0774146..3abb441 100644 --- a/src/data/nav.ts +++ b/src/data/nav.ts @@ -1,5 +1,10 @@ // Docs navigation, from the DocsNav artboard. The nav follows concepts and // layers, not repository names. Prev/next follow PAGES. +// +// A page marks one item active: the item for the page itself. Items that link +// to a section of a page (an href with #) are never active; the page item is. +// So on /concepts/shrinking-quorum/ "Shrinking quorum" is active, not +// "Degradation-first" or "Graceful Degradation Index". export type NavId = | 'home' @@ -8,6 +13,8 @@ export type NavId = | 'quorum' | 'gdi' | 'layers' + | 'prior' + | 'qual' | 'crate' | 'cli' | 'proofs' @@ -36,10 +43,12 @@ export const NAV: NavGroup[] = [ { title: 'Concepts', items: [ - { id: 'dfp', label: 'Degradation-first', href: '/concepts/shrinking-quorum/' }, + { id: 'dfp', label: 'Degradation-first', href: '/concepts/shrinking-quorum/#degradation-first' }, { id: 'quorum', label: 'Shrinking quorum', href: '/concepts/shrinking-quorum/' }, { id: 'gdi', label: 'Graceful Degradation Index', href: '/concepts/shrinking-quorum/#gdi' }, { id: 'layers', label: 'Layers 0 to 5', href: '/concepts/architecture/' }, + { id: 'prior', label: 'Prior art', href: '/concepts/prior-art/' }, + { id: 'qual', label: 'Qualification path', href: '/concepts/qualification/' }, ], }, { @@ -87,7 +96,7 @@ export const PAGES: DocPage[] = [ { path: '/concepts/shrinking-quorum/', short: 'Shrinking quorum', - updated: '7 Oct 2026', + updated: '11 Oct 2026', file: 'src/pages/concepts/shrinking-quorum.astro', }, { @@ -96,10 +105,22 @@ export const PAGES: DocPage[] = [ updated: '11 Oct 2026', file: 'src/pages/concepts/architecture.astro', }, + { + path: '/concepts/prior-art/', + short: 'Prior art', + updated: '11 Oct 2026', + file: 'src/pages/concepts/prior-art.astro', + }, + { + path: '/concepts/qualification/', + short: 'Qualification path', + updated: '11 Oct 2026', + file: 'src/pages/concepts/qualification.astro', + }, { path: '/core/quorum-crate/', short: 'The quorum crate', - updated: '7 Oct 2026', + updated: '11 Oct 2026', source: 'quorum/src/lib.rs', file: 'src/pages/core/quorum-crate.astro', }, diff --git a/src/pages/concepts/architecture.astro b/src/pages/concepts/architecture.astro index 33d2b60..a2108c7 100644 --- a/src/pages/concepts/architecture.astro +++ b/src/pages/concepts/architecture.astro @@ -2,6 +2,7 @@ import DocsLayout from '../../layouts/DocsLayout.astro'; import DocsEnd from '../../components/DocsEnd.astro'; import Breadcrumbs from '../../components/Breadcrumbs.astro'; +import { t } from '../../data/claims'; const crumbs = [ { label: 'Docs', href: '/' }, @@ -72,7 +73,7 @@ const crumbs = [

Layers 0 to 5

-

Only Layer 1 has code today. Layers 0 and 2 to 5 exist only in the whitepaper.

+

Only Layer 1 has code today. Layers 0 and 2 to 5 are not built. They exist only in the whitepaper.

@@ -88,7 +89,7 @@ const crumbs = [ - + @@ -104,35 +105,36 @@ const crumbs = [ - + - + - + - + @@ -259,13 +261,13 @@ const crumbs = [

Products and research

  • - Mru Flight runs Layer 1 on spacecraft. The F´ components RedundancyManager,{' '} + Mru Flight is Layer 1 for spacecraft. The F´ components RedundancyManager,{' '} HealthRegistry and ReplicaHost are built and tested: 37 unit tests, and a system test - that gives the demo's counts on the bench schedules. They have not run on flight hardware. A launcher for{' '} - ESA's OPS-SAT is in the repository. + against the demo's counts on the bench schedules. They have not run on flight hardware. A launcher for a{' '} + proposed experiment on ESA's OPS-SAT is in the repository.
  • - Mru Field runs the same Layer 1 core on systems on Earth that are hard to reach. See{' '} + Mru Field is the same Layer 1 core for systems on Earth that are hard to reach. See{' '} Mru Field.
  • @@ -301,10 +303,16 @@ const crumbs = [ mru.space
  • - Shrinking quorum: the Layer 1 rule and its guarantees + Shrinking quorum: the Layer 1 rule, what is proved and what is tested +
  • +
  • + Qualification path: what exists against the NASA and ECSS software + standards
  • - Dusk: 10,000 missions, 1.34× the useful work of fixed TMR + Dusk: {t('dusk.runs')} missions, {t('dusk.work_vs_tmr')} the useful work of + fixed TMR. This assumes no ground support after launch. The gain falls to {t('dusk.ground.never')} when support + never ends. See Ground support.
diff --git a/src/pages/concepts/prior-art.astro b/src/pages/concepts/prior-art.astro new file mode 100644 index 0000000..23f9a34 --- /dev/null +++ b/src/pages/concepts/prior-art.astro @@ -0,0 +1,175 @@ +--- +import DocsLayout from '../../layouts/DocsLayout.astro'; +import DocsEnd from '../../components/DocsEnd.astro'; +import Breadcrumbs from '../../components/Breadcrumbs.astro'; + +const crumbs = [ + { label: 'Docs', href: '/' }, + { label: 'Concepts', href: '/concepts/shrinking-quorum/' }, + { label: 'Prior art' }, +]; +--- + + +
+ +

Prior art and related work

+

+ The shrinking quorum builds on decades of work in fault-tolerant computing. Stepping down from three replicas to + two to one is not new. This page lists the work Mru draws on and how Mru relates to each. +

+ +

TMR and its origins

+
    +
  • +

    + von Neumann, 1956. Shows that reliable computation can be built from unreliable components + through redundancy. Mru: the shrinking quorum is one use of that idea, with the redundancy shrinking as parts + fail. +

    +

    + J. von Neumann, "Probabilistic Logics and the Synthesis of Reliable Organisms from Unreliable + Components," in C. E. Shannon and J. McCarthy (eds.), Automata Studies, Princeton University Press, 1956, + pp. 43-98. +

    +
  • +
  • +

    + Lyons and Vanderkulk, 1962. Triple modular redundancy with a majority vote, applied to + reliability. Mru: fixed TMR in this form is the baseline on these pages. With three replicas, the shrinking + quorum votes the same way. +

    +

    + R. E. Lyons and W. Vanderkulk, "The Use of Triple-Modular Redundancy to Improve Computer + Reliability," IBM Journal of Research and Development, 6(2):200-209, 1962.{' '} + doi:10.1147/rd.62.0200 +

    +
  • +
+ +

Degradable systems and performability

+
    +
  • +

    + Meyer, 1980. Defines performability, a measure that combines performance and reliability for + systems that degrade. Mru: Dusk's figure of merit, useful work summed over the whole decline, is a measure + of this kind. The whitepaper cites Meyer for it. +

    +

    + J. F. Meyer, "On Evaluating the Performability of Degradable Computing Systems," IEEE Transactions + on Computers, C-29(8):720-731, 1980.{' '} + doi:10.1109/TC.1980.1675654 +

    +
  • +
+ +

Byzantine agreement

+
    +
  • +

    + Lamport, Shostak and Pease, 1982. Sets the limits of agreement when faulty components can + give conflicting information to different parts of a system. Mru: the shrinking quorum assumes replicas that + are damaged, not malicious. It does not solve input agreement: all replicas must already have the same input. + See Open questions. +

    +

    + L. Lamport, R. Shostak and M. Pease, "The Byzantine Generals Problem," ACM Transactions on + Programming Languages and Systems, 4(3):382-401, 1982.{' '} + doi:10.1145/357172.357176 +

    +
  • +
+ +

Redundancy management on the Space Shuttle

+
    +
  • +

    + Sklaroff, 1976. The Shuttle's general-purpose computers ran as a redundant set. Voting + detected and identified two failures. The remaining two used comparison and self-test to tolerate a third. + Mru: degradation from voting to comparison to self-test is not new. Mru does it with no ground team. +

    +

    + J. R. Sklaroff, "Redundancy Management Technique for Space Shuttle Computers," IBM Journal of + Research and Development, 20(1):20-28, 1976.{' '} + doi:10.1147/rd.201.0020 +

    +
  • +
  • +

    + Spector and Gifford, 1984. A case study of the Shuttle's primary computer system. Mru: a + reference for how a flown redundant system was designed and managed. +

    +

    + A. Spector and D. Gifford, "The Space Shuttle Primary Computer System," Communications of the ACM, + 27(9):872-900, 1984. doi:10.1145/358234.358246 +

    +
  • +
+ +

Autonomous fault protection on deep-space missions

+
    +
  • +

    + Avizienis et al., 1971 (STAR). JPL's self-testing and repairing computer, designed for + outer-planet spacecraft. Standby spares replaced failed units by automatic recovery. Mru: autonomous recovery + in deep space is decades old. The shrinking quorum steps down instead of relying on spares. The F´{' '} + RedundancyManager can admit a spare after a known-answer test. +

    +

    + A. Avizienis, G. C. Gilley, F. P. Mathur, D. A. Rennels, J. A. Rohr and D. K. Rubin, "The STAR + (Self-Testing And Repairing) Computer: An Investigation of the Theory and Practice of Fault-Tolerant Computer + Design," IEEE Transactions on Computers, C-20(11):1312-1321, 1971.{' '} + doi:10.1109/T-C.1971.223133 +

    +
  • +
  • +

    + Rasmussen, 2008. Fundamentals of fault-tolerant design for spacecraft guidance, navigation + and control, from JPL. Mru: the shrinking quorum is one autonomous response to processor loss. It is not a + full fault-protection system and does not replace one. +

    +

    + R. D. Rasmussen, "GN&C Fault Protection Fundamentals," 31st Annual AAS Guidance and Control + Conference, Breckenridge, CO, 2008. Jet Propulsion Laboratory. Companion presentation:{' '} + NASA NTRS 20100020171. +

    +
  • +
+ + + + + + + +

What Mru adds

+
    +
  • + Autonomy with no ground team. The step-down from three replicas to one runs on board, with no + command from the ground. +
  • +
  • + A small decision core with proofs. The quorum crate is{' '} + no_std with no allocation. Kani proves four properties of decide() for every set of + three replies. See Kani proofs for the scope of each. +
  • +
  • + Published trade data. Dusk and the{' '} + bench publish what the step-down buys in useful work and what it costs in wrong + results, with the code to reproduce them. +
  • +
+ +
+
diff --git a/src/pages/concepts/qualification.astro b/src/pages/concepts/qualification.astro new file mode 100644 index 0000000..b5fc681 --- /dev/null +++ b/src/pages/concepts/qualification.astro @@ -0,0 +1,203 @@ +--- +import DocsLayout from '../../layouts/DocsLayout.astro'; +import DocsEnd from '../../components/DocsEnd.astro'; +import Breadcrumbs from '../../components/Breadcrumbs.astro'; + +const crumbs = [ + { label: 'Docs', href: '/' }, + { label: 'Concepts', href: '/concepts/shrinking-quorum/' }, + { label: 'Qualification path' }, +]; +--- + + +
+ +

Qualification path

+

+ What exists today, and the NASA and ECSS software standards it relates to. No qualification evidence exists yet. + Mru makes no compliance claim. +

+ +

Standards

+

This page maps Mru to four software standards, two from NASA and two from ECSS:

+
+
0 · Survival kernel §7NoneNot built Paper None
Prototype - Nine Kani proofs, 21 scenario checks and 37 F´ unit tests in CI, an F´ system test against the - demo, bench on general-purpose processors, Dusk + Nine Kani proofs, the scenario checks and 37 F´ unit tests in CI, a known-answer test coverage + campaign, an F´ system test against the demo, bench on general-purpose + processors, Dusk
2 · Navigation and orientation §9NoneNot built Paper None
3 · Science and knowledge triage §10NoneNot built Paper None
4 · Communication §11NoneNot built Paper None
5 · Bounded self-modification §12NoneNot built Paper None
+ + + + + + + + + + + + + + + + + + + + + + + + +
NumberTitle
NPR 7150.2NASA Software Engineering Requirements
NASA-STD-8739.8Software Assurance and Software Safety Standard
ECSS-E-ST-40CSpace engineering: Software
ECSS-Q-ST-80CSpace product assurance: Software product assurance
+
+

+ The tables below map by topic, not by clause. No clause of any standard has been checked against Mru. +

+ +

What exists

+

+ These activities run today. They are engineering evidence, not qualification evidence: none was planned, reviewed + or recorded under a standard. +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ActivityWhat existsRelated standards
Unit tests + Unit tests of the core and the C interface, run in CI on every change. See{' '} + the quorum crate. + NPR 7150.2, ECSS-E-ST-40C
Formal proofs + Nine Kani proofs, four on the core and five on the C interface, run in CI on every change. Each has a + stated scope. See Kani proofs. + NPR 7150.2, NASA-STD-8739.8, ECSS-E-ST-40C, ECSS-Q-ST-80C
Continuous integration + Build and test on Linux x86_64, Linux ARM64 and macOS, plus static ARM Linux binaries tested under + emulation and a bare-metal ARM Cortex-M build. + NPR 7150.2, ECSS-E-ST-40C
Scenario tests + scripts/scenarios.sh runs the demo program and checks its output: faults, limits, resets and + the comparison with fixed TMR. + NPR 7150.2, ECSS-E-ST-40C
Bench + 300 runs per host with injected faults on three general-purpose processors. Not radiation testing, not + target hardware. See Bench. + NPR 7150.2, ECSS-E-ST-40C
F´ unit tests and system test + 37 unit tests of the F´ components, and a 60-case system test against the demo's counts. Not run + on flight hardware. See F´ components. + NPR 7150.2, ECSS-E-ST-40C
+
+ +

Not started

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ActivityStatusRelated standards
Software classification and criticalityNot startedNPR 7150.2, NASA-STD-8739.8, ECSS-Q-ST-80C
Requirements traceabilityNot startedNPR 7150.2, ECSS-E-ST-40C
Independent verification and validationNot startedNPR 7150.2, NASA-STD-8739.8, ECSS-E-ST-40C
Tool qualification (compiler, Kani, test tools)Not startedNPR 7150.2, ECSS-Q-ST-80C
Rust toolchain qualification plan: TODONot startedNPR 7150.2, ECSS-Q-ST-80C
Coding standard complianceNot startedNPR 7150.2, ECSS-Q-ST-80C
MC/DC structural coverageNot startedNPR 7150.2, ECSS-E-ST-40C
Software development and assurance plansNot startedNPR 7150.2, NASA-STD-8739.8, ECSS-E-ST-40C, ECSS-Q-ST-80C
+
+

+ Status as of 11 Oct 2026, flight v0.2.0. The F´ components and the C interface have numbered requirements, + each with a verification method, but no trace to mission or standard requirements. +

+ + + + + + diff --git a/src/pages/concepts/shrinking-quorum.astro b/src/pages/concepts/shrinking-quorum.astro index 5c15dc7..a5c9b84 100644 --- a/src/pages/concepts/shrinking-quorum.astro +++ b/src/pages/concepts/shrinking-quorum.astro @@ -2,12 +2,14 @@ import DocsLayout from '../../layouts/DocsLayout.astro'; import DocsEnd from '../../components/DocsEnd.astro'; import Breadcrumbs from '../../components/Breadcrumbs.astro'; +import { t, ci } from '../../data/claims'; const crumbs = [ { label: 'Docs', href: '/' }, { label: 'Concepts', href: '/concepts/shrinking-quorum/' }, { label: 'Shrinking quorum' }, ]; +const proofs = 'https://github.com/mruspace/flight/blob/v0.2.0/quorum/src/lib.rs'; --- @@ -27,8 +33,14 @@ const crumbs = [

Shrinking quorum

- A redundancy policy: vote on three replicas, compare on two, self-check on one. It decides exactly as fixed TMR - while TMR can run, and continues after TMR stops. + A redundancy policy for unattended missions with no repair path: vote on three replicas, compare on two, + self-check on one. It keeps running on the last replica, where fixed TMR stops. +

+

+ Kani proves that, with two or more replicas alive, decide() gives the same outcome under both + policies, for every set of three replies. The shrinking quorum also sets diagnose at two replicas, so + it can retire a stuck replica and continue where fixed TMR stays in disagreement. Over a whole run, never less + than fixed TMR is tested, not proved.

The trouble with a fixed threshold

@@ -37,8 +49,20 @@ const crumbs = [ still detect a disagreement. One cannot outvote anything, so the system stops.

- With a repair crew in reach, stopping is safe: someone swaps the board. With no one in reach, stopping throws away - the last processor's whole remaining life. + Most fault tolerance assumes someone can step in eventually. With a ground team in reach, stopping is safe: the + team finds the fault and commands a fallback. With no one in reach, stopping throws away the last processor's + whole remaining life. +

+

+ Fixed TMR is the baseline on these pages because both policies give the same outcome while two or more replicas + live. It is not what most spacecraft fly. Most fly dual-string radiation-hardened processors with EDAC, watchdogs + and autonomous fault protection. Stepping down from three to two to one is not new either: the Space Shuttle's + redundant set of general-purpose computers did it, and Meyer gave degradable systems a measure, performability, in + 1980. See Prior art. +

+

+ What Mru adds: the step-down runs with no ground team, the decision core is small and checked with Kani, and the + trade data is published (Dusk, bench).

Three modes

@@ -92,44 +116,155 @@ const crumbs = [ {'}'} {'}'} -

What it guarantees

+

Degradation-first

+

The shrinking quorum applies the whitepaper's design principle:

+
+ Principle + + "A system intended to operate for millennia without intervention must treat its own physical decay, of + power, computation, memory, and thermal capacity, not as an exceptional fault to be handled, but as the + constant, governing condition around which every architectural decision is made." + +
+
+ Corollary + + "Capability is a depleting resource to be spent, not a fixed budget to be defended. The objective is not to + preserve function but to maximize the cumulative useful work extracted across the entire descent from full + capability to silence." + +
+

+ W. Binns, Mru whitepaper, section 5, + doi:10.5281/zenodo.20579438. Dashes in the original are shown as commas. +

+

+ For the shrinking quorum, the figure of merit is useful work over the whole decline, not correct operation at full + strength. Dusk measures it, along with the wrong results it costs. +

+ +

What is proved and what is tested

+

Proved (per tick)

+

+ Four Kani proofs on decide(). Each reply is any of Absent, Single or{' '} + Pair, with any u64 values, so each proof covers every set of three replies to{' '} + decide(). +

  • - Never less than fixed TMR. While TMR can still run, both policies make exactly the same - decision. They differ only after TMR has stopped. + + identical_while_tmr_can_run + + : with two or more replies present, both policies give the same outcome. It compares the outcome only, not the + mode or diagnose.
  • - It halts only with nothing left. Fixed TMR stops below two replicas. The shrinking quorum stops - at zero. + + tmr_stops_below_two + + : with fewer than two replies present, the fixed TMR outcome is Halted.
  • - Only agreed results go out. A delivered value came from at least two replicas, or from both - runs of the last replica's self-check. + + shrink_halts_only_with_nothing_left + + : the shrinking quorum's outcome is Halted if and only if no reply is present. +
  • +
  • + + delivers_only_agreed_values + + : if either policy delivers a value, at least two replies agree on it, or exactly one replica is alive and it + returned Pair(v, v).

- Each property is a Kani proof over every possible input, run in CI on every change. See{' '} - Kani proofs. + CI runs cargo kani -p quorum -p quorum-ffi on every change. Five more proofs show that the C + interface gives the core's answer. The proofs do not cover the health record, the diagnosis, the known-answer + test, timing, or the system over a run. See Kani proofs. +

+ +

Tested (per run)

+

Never less useful work than fixed TMR over a whole run is a test result, with these scopes:

+
    +
  • + Scenario tests. scripts/scenarios.sh in CI: ten seeds, two kill faults per run, + 20,000 ticks. Kill faults only. +
  • +
  • + Bench. 150 pairs of runs per host, five fault schedules, on three hosts with general-purpose + processors. The three replicas are processes on one host, not separate processors. No pair below fixed TMR. See{' '} + Bench. +
  • +
  • + Dusk. {t('dusk.runs')} simulated missions. The two policies are identical until fixed TMR + stops, by construction of the model, and a unit test checks it over 200 seeds. See{' '} + Dusk. +
  • +
+ +

Two replicas

+

+ With two replicas left, decide() compares them. Equal values are delivered. Unequal values give{' '} + Detected, and nothing goes out that tick. Under the shrinking quorum it also sets{' '} + diagnose. Fixed TMR does not. +

+

+ The demo then runs a known-answer test (KAT) on both replicas: a fixed input whose result is known. There are + three cases. +

+
    +
  • + Both pass. Nothing is retired. The tick is lost, and nothing escalates. A persistent fault that + the KAT cannot see keeps every tick Detected. +
  • +
  • + Both fail or time out. Both are retired, and the run halts. Fixed TMR would keep comparing. +
  • +
  • + One fails. It is retired. The survivor goes on in self-check. +
  • +
+

+ This is the current behavior. The first two cases are gaps: no escalation for a fault the KAT cannot see, and a + halt where fixed TMR would go on.

What it costs

- On one replica, a stuck fault is caught only by the periodic known-answer test. Until then, a few wrong results - can get out. Fixed TMR never produces those, because it never lives that long. + On one replica, a stuck fault is caught only by the periodic known-answer test, and only if it changes the + test's answer. Until then, wrong results get out. Fixed TMR never produces those, because it never lives that + long. The bench measures how many faults the test catches:{' '} + known-answer test coverage.

Trade - In Dusk's default run, fixed TMR comes out ahead only if one wrong result costs more than 136 years of - useful work (95% CI 131 to 142). + In Dusk's default run, {t('dusk.risk.shrink')} of missions (95% CI {ci('dusk.risk.shrink')}) deliver at + least one wrong result under the shrinking quorum, and {t('dusk.risk.tmr')} under fixed TMR. Fixed TMR comes out + ahead only if one wrong result costs more than {t('dusk.break_even_years')} years of useful work (95% CI{' '} + {ci('dusk.break_even_years')}). The run assumes no ground support after launch.
+

Command path

+

+ Self-check on one replica can deliver a few wrong results before the KAT catches a stuck fault. The KAT runs every{' '} + --kat-period ticks, 64 by default. An upset that hits both self-check runs alike can also get + through. +

+

+ This mode is for data products, not spacecraft commands, unless the mission adds its own command safety layer. + Integrators can gate commands on Verdict.mode: issue a command only when the mode is{' '} + Vote or Compare and the outcome is Deliver. See the{' '} + example. +

+

Health and diagnosis

A replica outvoted STRIKES = 3 times within STRIKE_WINDOW = 200 ticks is diagnosed with - a known-answer test: a fixed input whose result is known. Pass, and its strikes are cleared, because the upsets - were transient. Fail, and it is retired. + a known-answer test. Pass, and its strikes are cleared, on the assumption that the upsets were transient. Fail, + and it is retired. The strike record has unit tests, not proofs.

Graceful Degradation Index

@@ -139,6 +274,29 @@ const crumbs = [ decline.

+

Open questions

+
    +
  • + Common-mode faults, such as shared power, clock or thermal. Dusk models correlated deaths with{' '} + --p-corr. The demo models an upset that hits both self-check runs alike with{' '} + --common-mode. Neither models shared power, clock or thermal faults. +
  • +
  • + Input agreement between replicas. In the demo, all replicas get the same input because it is a + function of the tick. Real sensor inputs need an agreement step. Mru does not provide one yet. +
  • +
  • + Replica determinism under interrupts and scheduling. The replicas must compute the same bits. + In the demo this holds only because the task is a pure function of the tick. Neither Dusk nor the bench tests + it. +
  • +
  • + KAT coverage on real hardware. Dusk sets self-check coverage as a parameter,{' '} + --coverage. The bench's stuck fault returns the same wrong value for every input, so the KAT + always sees it. Neither measures the share of real hardware faults a KAT catches. +
  • +
+

Default results

-
policy              useful      p10      p50      p90      service   wrong days
-                    mean y                                  mean y   mean / run
-fixed TMR             99.0     37.6     92.7    168.9         99.0        0.000
-standby simplex       83.1     38.4     78.3    134.0        166.4        0.603
-shrinking quorum     132.6     64.3    126.6    208.3        166.4        0.246
+
policy                     useful      p10      p50      p90      service   wrong days     risk
+                           mean y                                  mean y   mean / run   P(>=1)
+fixed TMR                    99.0     37.6     92.7    168.9         99.0        0.000     0.0%
+standby simplex              83.1     38.4     78.3    134.0        166.4        0.603    43.2%
+shrinking quorum            132.6     64.3    126.6    208.3        166.4        0.246    20.1%
+TMR + unchecked simplex     166.2     76.9    156.7    267.9        166.4       24.715    87.2%
+cold standby, aging 0.1     144.7     69.7    139.3    226.7        289.8        1.043    61.3%
+cold standby, aging 1.0      83.1     38.4     78.3    134.0        166.4        0.603    43.2%

- 1.34× the useful work of fixed TMR in total (95% CI 1.33× to 1.35×). Never less on any single mission. + {t('dusk.work_vs_tmr')} the useful work of fixed TMR in total (95% CI {ci('dusk.work_vs_tmr')}). This assumes no + ground support after launch. The gain falls to {t('dusk.ground.never')} when support never ends. See{' '} + Ground support. Never less on any single mission, by construction: the two policies are + identical until fixed TMR stops. Fixed TMR comes out ahead only if one wrong result costs more than{' '} + {t('dusk.break_even_years')} years of useful work (95% CI {ci('dusk.break_even_years')}), next to a risk of{' '} + {t('dusk.risk.shrink')} against {t('dusk.risk.tmr')}. +

+

+ Cold standby is the nearest model here of dual-string with autonomous switchover. Standby simplex is the same + design with spares that age as fast as a powered processor, so it equals cold standby at aging 1.0. See{' '} + Baselines.

-

Sweeps and ground support

+

What the columns mean

- --sweep varies each parameter the model cannot pin down. Across every row, the gain over fixed TMR - stays between 1.11× and 1.68×. + Each mission runs one day at a time. On each day the policy runs in one mode, set by the number of live + processors, and the lowest-numbered live processors do the work. These are the definitions in{' '} + src/model.rs. +

+
    +
  • + Useful. The sum over days of throughput credit for a correct delivered result: 1.0 for a vote + day with at most one upset, 1.0 for a pair day with no upset, 0.5 (--selfcheck-throughput) for a + single self-check day with no upset, 1.0 for an unchecked day with no upset, and 0 for lost, wrong and idle + days. Shown as the mean in years, with the 10th, 50th and 90th percentiles. +
  • +
  • + Service. The first day the policy can never produce output again, or the horizon. For fixed + TMR, the first day with fewer than two live processors. For the others, the first day with none left. The model + ends the run that day, so a spare due to join later is not used. Shown as the mean in years. +
  • +
  • + Wrong days. Days whose delivered result was corrupted by an upset that nothing caught. One day + is one result. Only a lone processor can make one: its self-check misses an upset with probability 1 minus{' '} + --coverage, and an unchecked processor delivers every upset. Shown as the mean per mission. +
  • +
  • + Risk. The share of missions with at least one wrong day, with a paired bootstrap 95% CI. +
  • +
+

+ A vote day with two or more upsets and a pair day with any upset are lost: the policy catches the disagreement and + delivers nothing.

+ +

Baselines

+

+ Fixed TMR is one baseline, not what most spacecraft fly. Two more act with no ground team, on the same fault + histories. +

+
    +
  • + TMR + unchecked simplex steps down on its own, but its last processor does not check itself. It + isolates the value of self-check. The shrinking quorum does {t('dusk.work_vs_unchecked')} of its useful work and + makes {t('dusk.wrong_vs_unchecked')} of its wrong results (95% CI {ci('dusk.wrong_vs_unchecked')}). Risk:{' '} + {t('dusk.risk.unchecked')} against {t('dusk.risk.shrink')}. +
  • +
  • + Cold standby keeps one processor powered and switches on the next, in order, when it dies. The + active one self-checks. Here it has three strings, on the same hardware as TMR. Correlated deaths follow the + powered fault history, which slightly under-counts them for an unpowered spare. +
  • +
+

+ How fast an unpowered spare ages is not known, so --sweep varies it from 0.1 to 1.0 of the powered + rate. Against cold standby, the shrinking quorum does {t('dusk.work_vs_cold.01')} the useful work at 0.1 (95% CI{' '} + {ci('dusk.work_vs_cold.01')}) and {t('dusk.work_vs_cold.10')} at 1.0 (95% CI {ci('dusk.work_vs_cold.10')}). Cold + standby does more useful work below an aging rate of about {t('dusk.cold.crossing')}. At every rate it has more + missions with a wrong result: {t('dusk.risk.cold_10')} to {t('dusk.risk.cold_01')}, against{' '} + {t('dusk.risk.shrink')}. With two strings (--nodes 2), the shrinking quorum does{' '} + {t('dusk.nodes2.work_vs_cold.01')} to {t('dusk.nodes2.work_vs_cold.10')} the useful work of cold standby. +

+ +

Sweeps

- --ground adds a ground team that commands the fallback by hand while support lasts. With 49 years of - support, Voyager's so far, the gain is still 1.25×. Answer time barely matters. What matters is whether anyone - is still there. + --sweep varies each parameter the model cannot pin down. Across every row, the gain over fixed TMR is{' '} + {t('dusk.sweep.range')}. Every row assumes no ground support after launch. +

+ +

Ground support

+

+ The 1.34× above assumes no ground support after launch. --ground compares the shrinking quorum with + fixed TMR plus a ground team. When TMR drops to one processor, the team commands it into self-check after an + answer time, if support has not ended. The gain falls as support lasts longer: +

+
10000 missions, seed 1; shrinking quorum's useful work vs TMR + ground fallback
+
+ground support ends        1 day   30 days  180 days   95% CI at 30 days
+at launch                  1.34x     1.34x     1.34x   1.33x to 1.35x
+after 10 years             1.33x     1.33x     1.33x   1.33x to 1.34x
+after 25 years             1.31x     1.31x     1.31x   1.30x to 1.32x
+after 50 years             1.25x     1.25x     1.25x   1.24x to 1.25x
+after 100 years            1.11x     1.11x     1.11x   1.10x to 1.11x
+after 200 years            1.01x     1.01x     1.01x   1.01x to 1.01x
+never                      1.00x     1.00x     1.00x   1.00x to 1.00x
+

+ With support that never ends, the gain is 1.00×: the ground does by hand what the shrinking quorum does alone. + With 49 years of support, Voyager's so far, the charts program gives 1.25×. Answer time barely matters. What + matters is whether anyone is still there.

Checked against the bench

diff --git a/src/styles/shared/site.css b/src/styles/shared/site.css index cba5bd5..9a3e64a 100644 --- a/src/styles/shared/site.css +++ b/src/styles/shared/site.css @@ -167,10 +167,25 @@ html.js .quorum-fallback { .log a.entry[hidden] { display: none; } -/* First section of a research entry: its heading sits on the top rule. */ -.entry-body > .article:first-child .body > h2:first-child { +/* Research entry sections: the space between sections sits above the section, + not on its heading, so a margin note starts level with its own heading + (the first heading sits on the top rule). */ +.entry-body > .article .body > h2:first-child { margin-top: 0; } +.entry-body > .article + .article { + margin-top: 56px; +} +/* A number cell that may wrap at its space on a narrow screen, e.g. a ratio + with the lowest seed in brackets: "1.50 (1.50)". */ +.tbl td.m.wrap { + white-space: normal; +} +/* A margin note is running text: the label on its own line, then links and + code inline. .note is a flex column for cards, which split it at each link. */ +.article .note { + display: block; +} /* Tablets (no canvas artboard): from 641 to 920 px the seven nav links and the button do not fit, so the header uses the phone menu, as below 640 px. */