Evaluation Programme

How & When We Measure Swarm Quality

A plain-English guide to HyperMind's evaluation metrics, why the old "Collective IQ" number was broken, what replaces it, and exactly when each measurement should run.

The 30-second version

1 Why we stopped trusting "Collective IQ"

collective_iq.score was a blend of four things:

IngredientWeightDoes it care if the answer is correct?
Convergence (did the panel agree?)40%No — agreement ≠ correctness
Calibration (L1 distance to truth)30%Yes (weakly — it's a non-proper rule)
Coordination density (citations/disputes)20%No — "chatter"
Reputation motion (how much trust moved)10%No — sign-blind (falling = rising)

So 70% of the score can be maxed out without a single correct forecast. Worse, it can't be compared to a single LLM at all — three of the four ingredients are meaningless without a panel. A reviewer finds the formula in 30 seconds and dismisses the whole result. We're retiring it.

Don't: treat process signals (agreement, chatter, churn) as quality. They belong on an "engagement" dashboard, not a forecast-quality KPI.

2 The metrics we use now

Every number below is a proper scoring rule — meaning you can only maximise it by telling the truth. That's the minimum bar for a metric you publish.

MetricUnitWhat it tells you (plain English)
Brier score[0, 0.25]How far off the predicted probability was from the real outcome. Lower = better. 0.25 = a coin flip.
ECE (calibration error)[0, 1]When the swarm says "90% sure", is it right 90% of the time? Lower = better-calibrated.
EIG/Q (info gain / question)bitsHow much real information the swarm added over a naive baseline. Goes negative when confidently wrong. This is our new headline number.
WoC-Δ (wisdom-of-crowds delta)BrierThe only number that tests the core claim: "the swarm beat its single best member." Negative = the crowd won.
Logarithmic scorenatsA second proper rule that punishes overconfidence harder than Brier. We report both as a robustness check.

3 When do we measure? (the important part)

The key insight: proper metrics need the real answer to be known first. You can't compute Brier on a forecast that hasn't resolved. So not everything runs on every output. Here are the three schedules:

CONTINUOUSper claim
Reputation update + process telemetry
Runs every time an oracle resolves a claim or a claim is sealed. This is the "learning loop" — trust goes up/down, the swarm adapts. Cheap, always-on. Note: the telemetry here (agreement, citations) is useful for ops dashboards but is not a quality signal.
PERIODICbatch, weekly
Full score suite — Brier, ECE, EIG/Q, WoC-Δ, dispute survival
Runs on a resolved benchmark (outcomes already known). Gated on every release + weekly in CI. This is what makes our published numbers trustworthy — every metric has a confidence interval and a Single-LLM comparison column.
ONE-OFFdeep audit
Specialist reviews, power analysis, weight-fitting
Before a paper submission, a major version, or a third-party audit. Expensive. Only re-run when the definition of a metric changes — not on every build.
Don't: run Brier/ECE on every live output. There's no ground truth yet, and forcing it is exactly the mistake that broke CIQ (substituting "how much did agents talk" for "were they right").
Do: keep the reputation loop continuous (per-resolution), gate releases on the periodic batch, and reserve the deep audits for versions.

4 Developer quick-start

One command runs the periodic batch and prints every metric with a confidence interval + the Single-LLM baseline:

hmctl eval bench --model gpt-5-mini --dataset eb100 --rounds 3

# Output:
#   Brier      : 0.082  (95% CI [0.071, 0.094])   | Single-LLM: 0.069
#   ECE        : 0.041
#   EIG/Q      : +0.61 bits                       | Single-LLM: +0.55 bits
#   WoC-Δ      : -0.013  (crowd beat best member)
#
#   Sources: Brier 1950 · Gneiting & Raftery 2007 · Guo et al. 2017

Every number is reproducible from the run's trace.json. The source footer under each metric makes the citation traceable.

4b Verifiable RAG & Relata tools (v1.3.0)

When RELATA_URL is set, five MCP tools upgrade the retrieval layer from in-process lexical search to verified, attributed, contestable knowledge retrieval over the signed ledger.

ToolRequires Relata?What it does
hm_retrieveOptional (degrades)BM25 hybrid search over the signed ledger — every result carries author, reputation, trust score
hm_justifyOptional (degrades)Full evidence chain for any claim: author, confidence, dispute history, citations
hm_recallOptional (degrades)Memory search — "what does the swarm believe about X?" with optional time-travel
hm_relatedYes (PATHS_BETWEEN)Graph traversal: find connected claims/entities via CITES/CORROBORATES links
hm_learnYes (write)Trigger focused OrgSim research on a topic; publishes signed findings to the ledger

Without RELATA_URL, all tools degrade gracefully to the in-process lexical fallback. Wire Relata with hmctl mcp install --env RELATA_URL=http://localhost:8000.

5 The work (tracked tickets)

Tracked under the parent programme #226:

#228criticalPanel aggregation fix — root cause of the 0.25 "no-info" floor. Anti-herding over-shrinkage collapses calibrated minorities. Highest-leverage fix (est. ΔBrier −0.15 to −0.21).
#227highRetire CIQ; promote EIG/Q as headline. Move old score to legacy.score, surface EIG/Q + Brier + ECE everywhere.
#229highEval harness bugs — silent payload drop, skipped significance tests on small n, broken climatology baseline.
#230highWire reputation loop into eval — the "continuous learning" claim is currently invisible because record_outcome never fires during bench.
#231highDispute-FSM benchmark — port the 911-line dispute_lab from the deleted branch; load-test the 7-state FSM end-to-end.
#232mediumMulti-round deliberation — all evals ran rounds=1; the ICL feature was never exercised. Add --rounds N + shuffle.
#233mediumProper-scoring suite — add logarithmic score + skill score + Murphy-Winkler decomposition; report metric-agreement (Spearman ρ).
#234mediumComposite metric — if we keep one headline composite, fit its weights by regression on a held-out benchmark, not hand-picked constants.