You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
feat(verification): unified ResultArbiter — wire the orphaned 4-mechanism arbitration stack into dispatch (#306)
## What
First instance of **mathematical-object arbitration**: when several
provers rule on the same goal, ECHIDNA now fuses their verdicts through
a policy-selected arbiter instead of an inline boolean all-must-agree
check.
The four arbitration mechanisms (portfolio `reconcile`, Bayesian
log-odds, Dempster-Shafer, Pareto) already existed in
`src/rust/verification/` but were **orphaned** — each had its own
bespoke input type and nothing outside its own tests called it.
`verify_proof_cross_checked` collapsed every cross-checker to a bool,
counted a timeout as disagreement, and flattened a genuine
Proven-vs-Refuted conflict to `verified=false`.
## How
- **`result_arbiter.rs`** (new):
`ResultArbiter::arbitrate(&[ProverAttempt]) -> ArbitratedVerdict`.
Adapts the 8-variant `ProverOutcome` taxonomy into each mechanism's
input; `ArbitrationPolicy` (`portfolio` default | `bayesian` |
`dempster_shafer`) selected via `DispatchConfig.arbitration_policy`. The
verdict carries agreeing/disagreeing/inconclusive camps, a [0,1]
conflict metric, `needs_review`, policy-specific posterior/belief, and a
Pareto-recommended prover among the agreeing set.
- **`dispatch.rs`**: cross-check path feeds rich outcomes to the
arbiter; `DispatchResult` gains `needs_review` + `arbitration`
(serde-defaulted → wire-compatible). Disagreements are named in the
message ("PROVERS DISAGREE: … — flagged for review").
- Semantics: timeout/error = **no-information** (no longer vetoes
agreement); `InconsistentPremises` from any prover taints the verdict
(`suspect_premises` → review); conclusive disagreement is never silently
flattened.
- `verified` stays primary-anchored (arbitrated-Proven **and** primary
proved) so existing consumers see no surprise flips.
## Owner decision embedded here (why this PR is NOT armed for
auto-merge)
The **default `ArbitrationPolicy::Portfolio`** keeps conservative
categorical semantics, but the timeout-is-not-disagreement change and
the `NoProofFound→Refuted` verdict mapping are policy calls on the trust
pipeline — please ratify (or request `bayesian`/`dempster_shafer` as
default).
## Verification
- 11 new unit tests: Proven-vs-Refuted conflict flagged not flattened,
DS high-conflict refusal, timeout tolerance, suspect premises, Pareto
pick, serde round-trip
- `cargo test --lib`: 1185 passed; edited integration suites (stage1,
e2e pipeline/prover, aspect, security, concurrency): 154 passed
- `cargo fmt --check` + clippy clean on the new module
Refs echidnabot#58 (multi-prover consensus). Follow-up (out of scope):
proof-object-level arbitration via the exchange/ translators — needs
`ProverBackend` to return proof objects first.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Copy file name to clipboardExpand all lines: docs/wiki/Guides.md
+4Lines changed: 4 additions & 0 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -101,6 +101,10 @@ Motivating examples:
101
101
-**Dempster-Shafer** — "Five solvers; three Proven, two Refuted; either commit a posterior or *refuse to arbitrate* because conflict is too high."
102
102
-**Pareto** — "Lean took 30s and produced a 4kB certificate; Z3 took 0.2s and produced no certificate. Which dominates?" — neither; return both as Pareto-optimal.
103
103
104
+
### Unified entry point: `ResultArbiter`
105
+
106
+
You normally don't call the four mechanisms directly. `ResultArbiter` (`src/rust/verification/result_arbiter.rs`) takes the per-prover `ProverOutcome`s from a cross-checked dispatch, adapts them into whichever mechanism `DispatchConfig.arbitration_policy` selects (`portfolio` default | `bayesian` | `dempster_shafer`), and returns an `ArbitratedVerdict`: winning verdict, agreeing/disagreeing/inconclusive camps, a `[0,1]` conflict metric, `needs_review`, and a Pareto-recommended prover among the agreeing set. `Dispatcher::verify_proof_cross_checked` attaches it to `DispatchResult.arbitration`. Key semantics: timeouts and errors are no-information (they no longer veto agreement), and a genuine Proven-vs-Refuted split is flagged for review instead of being flattened to `verified = false`.
107
+
104
108
## Guide: Cross-prover semantic queries
105
109
106
110
The synonym layer carries an optional `semantic_class` tag per entry. Combined with the three cross-prover dictionaries (`_msc2020.toml`, `_wordnet_math.toml`, `_conceptnet_seed.toml`) this gives "every prover's name for the same concept" lookups, fully offline.
0 commit comments