bugfix — Per-Task Aggregation

Generated: 2026-05-19T04:05:40Z

Inputs and source artifacts

Everything fed into this aggregation is committed; no private state.

Methodology

Caveats / threats to validity

Aggregate Scores per Tool

Column glossary — read this first. One row per tool; the columns are:

Tool Weighted Mean Pooled Mean Pooled σ within_σ between_σ N n(opus) n(grok420) n(glm51) n(GPT-5.4) n(mimo25pro)
claudekit 178.93 181.53 14.33 11.42 9.35 75 15 15 15 15 15
ecc 172.31 175.40 17.20 13.54 11.70 75 15 15 15 15 15
pure 169.53 172.03 14.64 12.05 9.58 75 15 15 15 15 15
superpower 166.41 169.43 14.03 7.48 13.28 75 15 15 15 15 15
compound 166.25 169.33 13.79 9.57 11.27 75 15 15 15 15 15
bmad 165.72 169.13 17.15 12.75 12.94 75 15 15 15 15 15
omc 164.80 167.97 20.35 15.66 13.74 75 15 15 15 15 15
gstack 159.97 164.69 17.18 9.13 16.12 75 15 15 15 15 15

Inter-rater agreement (Krippendorff α)

α = 0.284 (interval level, judges as coders, blind labels as units, N=40 labels × 5 judges = 200 observations).

Krippendorff α measures how much the 5 judges agree on the absolute score for the same artifact. Conventional thresholds (Krippendorff 2011): α ≥ 0.800 supports firm conclusions; ≥ 0.667 supports tentative ones; < 0.667 is unreliable for absolute claims. Caveat: α punishes per-judge lenience drift hard — GPT-5.4 (panel-low) and mimo25pro (panel-high) are far apart on most artifacts even when they order tools the same way. The benchmark’s weighted-mean aggregation is less sensitive to any single judge’s base rate, but it does not make raw scores robust to per-judge lenience drift — the per-judge z-normalized table below is the actual mitigation for that; α surfaces the drift as a separate honesty metric.

Upper-bound caveat: α is computed on each (label, judge)'s mean across rounds, so round-to-round judge-sampler noise is averaged out before the reliability calculation. The reported α therefore overstates raw round-level inter-judge agreement — true per-round α is lower than the values shown here. Read these as a generous ceiling, not a point estimate.

Power analysis & detection threshold (MDE)

MDE ≈ 22.17 pts at α=0.05 (two-sided), power=0.80, n=5 trials per arm, σ_pool=11.14 pts (pooled across 8 tools using trial-level weighted means).

Two tool means whose gap is below MDE cannot be statistically distinguished at the standard α=0.05 / 80%-power threshold. The current cohort uses n=5 trials per cell, which is the binding constraint — judgments within a cell are correlated (same judge across rounds, same trial across rounds), so trials are the real degree of freedom.

Implication for this cohort: at n=5 trials per cell, every per-task rank-1 lead falls below MDE (per-task MDEs and σ_pool for all three tasks are in results/power-analysis.json) — the top cluster is a statistical tie, not a ranking. The α/2 critical value is the exact Student-t quantile for df=2(n-1)=8 (≈2.306), not the normal z=1.96 — at n=5 this enlarges every MDE by ~12% (feature ≈19.33, bugfix ≈22.17, refactor ≈44.02). Under the corrected threshold the only gap that clears its task MDE anywhere in the corpus is eccgstack on feature (≈21.3 vs the 19.33 feature MDE); the previously-cited eccclaudekit (≈18.3) and ecccompound (≈18.6) feature gaps fall below MDE under the exact-t critical and are no longer treated as separations. No rank-1 lead on any task clears MDE; no gap on bugfix or refactor clears its own task MDE. Trial-to-trial variance (not judge noise) is the binding constraint: the n=3→n=5 expansion raised σ_pool on every task, so MDE did not follow the expected 1/√n drop (refactor worsened sharply, driven by gstack’s trial-4 refactor diff scoring ≈36/200 against ~178 on its other four). No family-wise correction is applied to the ≥21 pairwise gap tests — they are descriptive detection-threshold comparisons, not confirmatory hypothesis tests. This is exactly why post-hoc selective reruns are pre-registered as invalid. See docs/IMPROVEMENT-PLAN-NEXT-COHORT.md.

Outlier audit & rerun verdict

Round-level outlier check per the pre-registered rerun protocol (CLAUDE.md § Rerun): a round-judgment flags when |score − median(other rounds)| > 15 pts AND > 1.41 × spread(other rounds) (≈ 2σ on the 2 remaining samples).

Sample flagged rounds (first 5):

Tool Trial Judge Round Score Others Δ from median
ecc t3 grok420 round2 174.0 [191.0, 189.0] 16.0
omc t3 grok420 round2 174.0 [193.0, 189.0] 17.0
omc t1 opus round1 155.0 [167.0, 176.0] 16.5
omc t1 glm51 round2 187.0 [165.0, 149.0] 30.0
ecc t2 gpt54pro round2 139.0 [154.0, 155.0] 15.5

Rerun verdict: no action. No Tier-1 (skill failure, t1–t3 audited) or Tier-3 (harness bug) triggers fired. The Tier-2 per-round 2σ trigger did fire on the individual rounds counted above, but the aggregate outlier rate is statistically consistent with the 2σ-chance baseline (point estimate at/below ~5%, 95% CI overlapping it), so this is treated as a class-level no-action decision rather than per-round re-rolling. Selectively re-rolling the flagged rounds would bias the cohort toward the mean (extreme values re-roll closer to median while in-distribution values stay), shrinking the cohort’s apparent variance without removing real noise. The correct fix for round-level noise is deterministic judge sampling (caveat 09); the correct fix for trial-level variance is more trials per cell (see docs/IMPROVEMENT-PLAN-NEXT-COHORT.md item #1).

Robust-statistics sensitivity (median / trimmed-mean companion)

Sensitivity view: per-tool median and trimmed mean (drop hi/lo) of the 5 trial-level weighted means, instead of the arithmetic mean used above. Rank-1 is invariant on every task under mean / median / trimmed; the largest middle-rank shift in this corpus is gstack refactor (rank-8 → rank-7 under median, driven by one bad trial — the canonical mean correctly retains it). Full table: ../robust-statistics-companion.md; raw figures in ../robust-statistics.json; recompute with scripts/compute-robust-stats.py. Not the pre-registered primary statistic — a sensitivity view alongside the equal-weight companion.

Per-judge z-normalized sensitivity

Tool ordering when each judge is z-normalized ((score − judge_mean) / judge_sd) before averaging — cancels per-judge lenience drift so each judge contributes ordering signal, not absolute lenience. Useful as a sensitivity check against the canonical Weighted Mean: rank-1 should be invariant under both rules.

Tool Judge-Z mean Weighted-Mean rank Judge-Z rank
claudekit +0.810 1 1
ecc +0.336 2 2
pure +0.033 3 3
superpower -0.138 4 4
compound -0.161 5 5
bmad -0.173 6 6
omc -0.234 7 7
gstack -0.472 8 8

Δ is Weighted-Mean rank − Judge-Z rank. Δ=0 means the canonical and z-normalized rules agree; |Δ|≥2 means the ordering moves materially under judge normalization (worth investigating).

Comparative-rank validity probe (Opus-1M, parallel signal)

Spearman ρ vs panel weighted-mean rank: -0.405 (n_cells = 25 comparative-judge runs; 5 tools flagged with |Δrank| ≥ 2)

Independent of the per-artifact panel above: one Opus-1M call ranks all 8 tools’ artifacts for a (task, trial) cell side-by-side, then averaged across 5 rounds with fresh per-round Greek-suffix labels and shuffled prompt order. Comparative-rank is a parallel signal — it does NOT enter the weighted mean. High ρ means both judgment regimes agree on tool ordering; low or negative ρ flags a calibration disagreement worth investigating (panel sees artifacts in isolation and can drift; comparative sees the cohort range and recalibrates each round). This in-report table is the Opus-1M lane only, shown as a quick signal; the full two-lane (Opus-1M + GPT-5.4) triangulation with all three pairwise Spearman ρ per task lives in _comparative-eval/_triangulation.md (omitted from public release). Methodology and per-round outputs: _comparative-eval/ (omitted from public release).

[!] Blinding observations volunteered by Opus (rounds where the judge noted potentially-identifying patterns — treat as soft warnings):

Tool Panel rank Comparative rank Δ Panel weighted-mean Comparative mean-rank ± σ n obs
compound 5 1 +4 ⚠ 166.25 3.00 ± 1.58 25
pure 3 2 +1 169.53 3.32 ± 1.57 25
bmad 6 3 +3 ⚠ 165.72 3.72 ± 2.35 25
gstack 8 4 +4 ⚠ 159.97 4.36 ± 2.61 25
superpower 4 5 -1 166.41 4.60 ± 1.87 25
omc 7 6 +1 164.80 5.00 ± 2.68 25
ecc 2 7 -5 ⚠ 172.31 5.64 ± 2.00 25
claudekit 1 8 -7 ⚠ 178.93 6.36 ± 1.44 25

Δ = panel_rank − comparative_rank. Positive Δ means comparative ranks the tool higher than the panel; ⚠ marks |Δ| ≥ 2.

Ranking (Weighted Mean)

  1. claudekit — 178.93/200
  2. ecc — 172.31/200
  3. pure — 169.53/200
  4. superpower — 166.41/200
  5. compound — 166.25/200
  6. bmad — 165.72/200
  7. omc — 164.80/200
  8. gstack — 159.97/200

Per-Trial Breakdown

Weighted-mean score for each individual trial (same 3·opus + 2·GPT-5.4 + others weighting as the canonical column). Surfaces trial-to-trial drift inside a tool — a wide spread means the cohort mean is averaging over disagreeing runs rather than stable ones. The Δ column is max − min across all trials; ≥ 15 pts is flagged as noisy (the tool’s output is bimodal at this sample size).

Tool t1 t2 t3 t4 t5 Δ (max − min) Flag Skills (t1/t2/t3/t4/t5) Subagents (t1/t2/t3/t4/t5)
claudekit 188.75 189.71 172.54 184.25 159.42 30.29 noisy 134/112/148/—/— 1/0/1/—/—
ecc 186.04 170.38 180.83 149.21 175.08 36.83 noisy 89/77/40/—/— 1/1/1/—/—
pure 160.96 182.33 182.00 157.37 165.00 24.96 noisy 0/0/0/—/— 0/0/1/—/—
superpower 164.42 170.88 167.12 167.17 162.46 8.42 111/117/124/—/— 0/0/0/—/—
compound 174.96 159.04 164.12 174.83 158.29 16.67 noisy 105/75/75/—/— 0/0/0/—/—
bmad 158.67 182.29 174.92 160.25 152.46 29.83 noisy 69/71/110/—/— 0/0/0/—/—
omc 159.67 153.00 182.92 149.67 178.75 33.25 noisy 163/371/157/—/— 4/6/1/—/—
gstack 156.25 162.67 153.58 165.96 161.38 12.38 72/77/67/—/— 0/0/0/—/—

Reading: a noisy flag here means the cohort mean for that tool is averaging over runs that disagree by ≥ 15 weighted pts. Use this column to read the headline rank with calibration — a tool whose trials cluster tightly is a more reliable signal than one with a wide spread. The pre-registered rerun protocol triggers on per-round outliers within a trial (not trial-to-trial), so a wide Δ here is real tool variance, not a harness artifact.

Skills (t1/t2/t3/t4/t5) = number of distinct skill / slash-command invocations per trial (from session-audit.jsonskills_invoked). Subagents (t1/t2/t3/t4/t5) = sub-agent dispatches per trial. A tool whose primary mechanism is a skill/sub-agent and reads 0 for a trial likely failed to invoke its mechanism — under the rerun protocol this is a Tier-1 trigger (“Skill failure”), distinct from the statistical-outlier trigger. Cross-reference these counts when a trial scores far from its siblings.

Per-Judge Means

Each cell is one judge’s mean score for one tool, averaged over that judge’s 15 samples (5 trials × 3 rounds). The columns:

Tool opus grok420 glm51 gpt54pro mimo25pro
claudekit 177.9 187.5 181.8 168.1 192.5
ecc 172.1 182.9 177.0 157.3 187.7
pure 169.7 177.3 174.9 156.7 181.5
superpower 168.3 175.5 173.0 147.6 182.8
compound 165.7 178.2 170.8 152.0 180.0
bmad 165.9 174.1 175.5 148.3 181.8
omc 165.0 170.4 168.9 148.5 187.0
gstack 157.3 176.3 165.7 141.6 182.5

Provenance Defects (2)

Files whose internal judge field disagrees with the filename slot the aggregator dispatched by. The score is still counted (not retroactively pulled); listed here for transparency.