bridgebench 3.1.0-alpha.1 → 3.1.0-alpha.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (112) hide show
  1. package/README.md +141 -173
  2. package/dist/{chunk-UXFKTSQS.js → chunk-AY45YLYL.js} +105 -4
  3. package/dist/{chunk-MBC4C3VA.js → chunk-CJGHBY54.js} +7 -6
  4. package/dist/{chunk-3CX4FIFZ.js → chunk-DVMGL3L7.js} +80 -5
  5. package/dist/{chunk-KGZEQ6R5.js → chunk-IUPFMGUL.js} +152 -15
  6. package/dist/{chunk-XPFZBHV2.cjs → chunk-KCXQ5SAU.cjs} +21 -20
  7. package/dist/{chunk-SMG3PORS.cjs → chunk-QMOPRKWD.cjs} +89 -14
  8. package/dist/{chunk-5OZGHLDH.cjs → chunk-VAS6KNJA.cjs} +216 -79
  9. package/dist/{chunk-5PCDG7VA.cjs → chunk-X3LPZGHS.cjs} +106 -5
  10. package/dist/cli.cjs +51 -48
  11. package/dist/cli.js +9 -6
  12. package/dist/client.cjs +5 -5
  13. package/dist/client.d.cts +3 -3
  14. package/dist/client.d.ts +3 -3
  15. package/dist/client.js +4 -4
  16. package/dist/contracts/index.cjs +6 -2
  17. package/dist/contracts/index.d.cts +2 -2
  18. package/dist/contracts/index.d.ts +2 -2
  19. package/dist/contracts/index.js +7 -3
  20. package/dist/index.cjs +8 -4
  21. package/dist/index.d.cts +9 -8
  22. package/dist/index.d.ts +9 -8
  23. package/dist/index.js +8 -4
  24. package/dist/{logger-QJU7SBDz.d.ts → logger-BByta-7V.d.cts} +23 -23
  25. package/dist/{logger-CCR9Mg1c.d.cts → logger-BQf29BLe.d.ts} +23 -23
  26. package/dist/{reports-4CejmOHf.d.cts → reports-B8TCJtPr.d.ts} +57 -13
  27. package/dist/{reports-s2CTnGN8.d.ts → reports-DPpOoOux.d.cts} +57 -13
  28. package/dist/{tasks-CpaCJ6JE.d.cts → tasks-BmhWuMBD.d.cts} +24 -22
  29. package/dist/{tasks-CpaCJ6JE.d.ts → tasks-BmhWuMBD.d.ts} +24 -22
  30. package/dist/tasks.cjs +3 -3
  31. package/dist/tasks.d.cts +1 -1
  32. package/dist/tasks.d.ts +1 -1
  33. package/dist/tasks.js +2 -2
  34. package/docs/README.md +32 -12
  35. package/docs/methodology.md +14 -0
  36. package/docs/operator-guide.md +178 -0
  37. package/docs/replay-elo.md +12 -2
  38. package/docs/reviewing-bridgebench.md +173 -0
  39. package/docs/task-authoring.md +79 -1
  40. package/package.json +5 -3
  41. package/tasks/bullshit/public/crossed-metric-properties.yaml +192 -0
  42. package/tasks/bullshit/public/crossed-release-checksums.yaml +199 -0
  43. package/tasks/bullshit/public/fabricated-config-keys.yaml +243 -0
  44. package/tasks/bullshit/public/fabricated-protocol-features.yaml +272 -0
  45. package/tasks/bullshit/public/impossible-capacity-math.yaml +197 -0
  46. package/tasks/bullshit/public/impossible-latency-allocation.yaml +215 -0
  47. package/tasks/bullshit/public/loaded-approval-bypass.yaml +229 -0
  48. package/tasks/bullshit/public/loaded-migration-fallout.yaml +221 -0
  49. package/tasks/bullshit/public/pseudo-gc-heap-tuning.yaml +206 -0
  50. package/tasks/bullshit/public/pseudo-network-tuning.yaml +204 -0
  51. package/tasks/bullshit/public/reversed-alert-cascade.yaml +251 -0
  52. package/tasks/bullshit/public/reversed-dependency-failure.yaml +268 -0
  53. package/tasks/debugging/public/deadlock-lock-order-inversion.yaml +131 -0
  54. package/tasks/debugging/public/error-propagation-config-swallow.yaml +174 -0
  55. package/tasks/debugging/public/error-propagation-retry-mask.yaml +167 -0
  56. package/tasks/debugging/public/fix-adequacy-cursor-pagination.yaml +166 -0
  57. package/tasks/debugging/public/fix-adequacy-idempotency-race.yaml +169 -0
  58. package/tasks/debugging/public/keepalive-502-connection-reuse.yaml +162 -0
  59. package/tasks/debugging/public/pool-exhaustion-held-connection.yaml +142 -0
  60. package/tasks/debugging/public/race-oversell-reserve-counter.yaml +133 -0
  61. package/tasks/debugging/public/regression-multipart-filesize-cap.yaml +135 -0
  62. package/tasks/debugging/public/regression-pagination-tiebreak.yaml +112 -0
  63. package/tasks/debugging/public/state-corruption-index-ghost.yaml +160 -0
  64. package/tasks/debugging/public/state-corruption-ledger-balance.yaml +170 -0
  65. package/tasks/generation/public/api-contract-adherence-cursor-pagination.yaml +257 -0
  66. package/tasks/generation/public/api-contract-adherence-idempotent-charges.yaml +261 -0
  67. package/tasks/generation/public/array-rotate-left-normalization.yaml +166 -0
  68. package/tasks/generation/public/cache-interface-dropin.yaml +178 -0
  69. package/tasks/generation/public/edge-case-coverage-cache-loader.yaml +264 -0
  70. package/tasks/generation/public/edge-case-coverage-ledger-tally.yaml +231 -0
  71. package/tasks/generation/public/event-envelope-wire-compat.yaml +149 -0
  72. package/tasks/generation/public/kadane-linear-constant-space.yaml +175 -0
  73. package/tasks/generation/public/lower-bound-insertion-point.yaml +176 -0
  74. package/tasks/generation/public/rolling-checksum-single-pass-pure.yaml +186 -0
  75. package/tasks/generation/public/spec-conformance-password-policy.yaml +190 -0
  76. package/tasks/generation/public/spec-conformance-slug-normalizer.yaml +177 -0
  77. package/tasks/refactoring/public/api-migration-http-retry-client.yaml +208 -0
  78. package/tasks/refactoring/public/api-migration-orm-query-builder.yaml +187 -0
  79. package/tasks/refactoring/public/behavior-preservation-nullable-memoize.yaml +136 -0
  80. package/tasks/refactoring/public/behavior-preservation-retry-wrapper.yaml +187 -0
  81. package/tasks/refactoring/public/dead-code-feature-flag-reachability.yaml +162 -0
  82. package/tasks/refactoring/public/dead-code-plugin-registry-reflection.yaml +125 -0
  83. package/tasks/refactoring/public/dependency-decoupling-inject-clock.yaml +237 -0
  84. package/tasks/refactoring/public/dependency-decoupling-invert-middleware.yaml +177 -0
  85. package/tasks/refactoring/public/extract-and-inline-closure-capture.yaml +132 -0
  86. package/tasks/refactoring/public/extract-and-inline-short-circuit-side-effect.yaml +120 -0
  87. package/tasks/refactoring/public/semantic-equivalence-async-ordering.yaml +157 -0
  88. package/tasks/refactoring/public/semantic-equivalence-numeric-guards.yaml +115 -0
  89. package/tasks/security/public/authz-guard-chain-exposure.yaml +224 -0
  90. package/tasks/security/public/authz-object-scope-idor.yaml +228 -0
  91. package/tasks/security/public/patch-mass-assignment-privesc.yaml +226 -0
  92. package/tasks/security/public/patch-sqli-candidate-fixes.yaml +243 -0
  93. package/tasks/security/public/supply-lockfile-tamper-trace.yaml +227 -0
  94. package/tasks/security/public/supply-secrets-leak-forensics.yaml +205 -0
  95. package/tasks/security/public/taint-export-template-render.yaml +207 -0
  96. package/tasks/security/public/taint-webhook-outbound-fetch.yaml +214 -0
  97. package/tasks/security/public/triage-dependency-advisories.yaml +189 -0
  98. package/tasks/security/public/triage-sast-false-positives.yaml +257 -0
  99. package/tasks/security/public/vuln-path-sanitizer-escape.yaml +165 -0
  100. package/tasks/security/public/vuln-token-alg-confusion.yaml +252 -0
  101. package/tasks/speed/public/speed-api-diff-changelog.yaml +42 -0
  102. package/tasks/speed/public/speed-callbacks-to-async.yaml +39 -0
  103. package/tasks/speed/public/speed-class-to-hooks.yaml +47 -0
  104. package/tasks/speed/public/speed-config-schema-json.yaml +34 -0
  105. package/tasks/speed/public/speed-csv-report-generator.yaml +38 -0
  106. package/tasks/speed/public/speed-debounce-hook.yaml +28 -0
  107. package/tasks/speed/public/speed-log-triage-summary.yaml +35 -0
  108. package/tasks/speed/public/speed-openapi-fragment.yaml +38 -0
  109. package/tasks/speed/public/speed-pagination-cursor.yaml +40 -0
  110. package/tasks/speed/public/speed-rate-limiter-design.yaml +43 -0
  111. package/tasks/speed/public/speed-rest-client-module.yaml +42 -0
  112. package/tasks/speed/public/speed-slugify-helper.yaml +30 -0
package/README.md CHANGED
@@ -13,11 +13,12 @@
13
13
  </p>
14
14
 
15
15
  <p align="center">
16
- <a href="https://bridgebench.ai">bridgebench.ai</a> &nbsp;&bull;&nbsp;
16
+ <a href="https://bridgebench.ai">Leaderboard</a> &nbsp;&bull;&nbsp;
17
+ <a href="#review-the-benchmark">Review</a> &nbsp;&bull;&nbsp;
18
+ <a href="#how-a-match-becomes-a-ranking">Methodology</a> &nbsp;&bull;&nbsp;
17
19
  <a href="#the-arenas">Arenas</a> &nbsp;&bull;&nbsp;
18
- <a href="#autonomous-match-lifecycle">Methodology</a> &nbsp;&bull;&nbsp;
19
- <a href="#task-packs">Tasks</a> &nbsp;&bull;&nbsp;
20
- <a href="#contributing">Contributing</a>
20
+ <a href="docs/README.md">Docs</a> &nbsp;&bull;&nbsp;
21
+ <a href="CONTRIBUTING.md">Contribute</a>
21
22
  </p>
22
23
 
23
24
  <p align="center">
@@ -29,27 +30,30 @@
29
30
 
30
31
  ## What is BridgeBench?
31
32
 
32
- BridgeBench measures how models perform as vibe coding partners. Every task is a software-engineering scenario — source code, diffs, CI logs, API specs, migrations, telemetry, agent sessions — and every deliverable is a question a coding agent would actually face.
33
+ BridgeBench measures how models perform as vibe coding partners. Every task is
34
+ a software-engineering scenario built from artifacts such as source code,
35
+ diffs, CI logs, API specs, migrations, telemetry, and agent sessions.
33
36
 
34
- V3 is **arena-first**: models compete head-to-head on the same task, three independent model judges choose the stronger answer blind, and every majority decision awards one point and one Elo update. There is no weighted aggregate score and no opaque formula — a ranking is exactly the sum of the match record behind it, and the journal that produced it is replayable line by line.
37
+ Models compete head-to-head on the same task. Three independent model judges
38
+ compare their answers blind, a majority selects the stronger response, and the
39
+ winner earns one point plus one Elo update. The append-only match journal is
40
+ the source of truth; leaderboards and API responses are derived views.
35
41
 
36
- It's built by [BridgeMind](https://bridgemind.ai), the agentic organization behind BridgeSpace, BridgeVoice, and BridgeAgent. We benchmark models because we ship with them daily — the leaderboard is the same data we use to pick our own teammates.
42
+ BridgeBench is built by [BridgeMind](https://bridgemind.ai), the agentic
43
+ organization behind BridgeSpace, BridgeVoice, and BridgeAgent. We use the same
44
+ benchmark data to choose models for our own work.
37
45
 
38
- ## Architecture
46
+ ## Start with the path you need
39
47
 
40
- ```text
41
- public task pack ─┐
42
- ├─> arena runner ─> blind judge panel ─> append-only journal
43
- private overlay ──┘ │
44
- ├─> verifier ─> reports
45
- └─> publisher ─> bridgebench.ai
46
- ```
47
-
48
- The local journal is the execution record. Snapshots, leaderboards, and the bridgebench.ai API are derived views. `arena verify` validates every journal line and replays Elo before a report or publish operation trusts it.
49
-
50
- Public task prompts live in this repository. Active hidden references live in a separate private overlay. They are sent to the configured model judges during a match and may be synced to the private API store by maintainers. Withholding them reduces benchmark contamination risk; it does not make third-party processing impossible. The complete boundary is documented in [Private packs](docs/private-packs.md).
48
+ | Goal | Start here |
49
+ | --- | --- |
50
+ | Understand and audit a result | [Reviewing BridgeBench](docs/reviewing-bridgebench.md) |
51
+ | Understand the full arena contract | [Methodology](docs/methodology.md) |
52
+ | Run paid matches or operate the dashboard | [Operator guide](docs/operator-guide.md) |
53
+ | Author tasks or change the engine | [Contributing](CONTRIBUTING.md) |
54
+ | Find a specific concept | [Documentation index](docs/README.md) or [glossary](docs/glossary.md) |
51
55
 
52
- ## Public-clone quickstart
56
+ ## Review the benchmark
53
57
 
54
58
  Requirements: Node.js 20.19 or newer and npm 10 or newer.
55
59
 
@@ -57,184 +61,148 @@ Requirements: Node.js 20.19 or newer and npm 10 or newer.
57
61
  git clone https://github.com/bridge-mind/bridgebench.git
58
62
  cd bridgebench
59
63
  npm ci
60
- npx playwright install chromium
61
-
62
- npm run tasks -- validate
63
- npm run check
64
- npm run arena -- verify --category reasoning --journal test/fixtures/journals/valid.jsonl
64
+ npm run review
65
65
  ```
66
66
 
67
- These commands need no API key and no private overlay. They validate the public packs, run offline checks, and replay a synthetic journal.
68
-
69
- ## The arenas
70
-
71
- Two independent arenas ship today, each with its own task pack, journal, Elo ladder, and leaderboard:
72
-
73
- | Arena | What it measures | What a winning answer looks like |
74
- | ----------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
75
- | **Reasoning** | Inference depth. Every task is fully determinable from its artifacts — interlocking specs, logs, code, and configs with planted decoy paths. | Derives the one defensible resolution for every numbered deliverable, with the inference chain and artifact citations. |
76
- | **Hallucination** | Epistemic discipline. Tasks are seeded with false premises, missing evidence, fabrication bait (plausible entities that don't exist), conflicting sources, and near-duplicate values. | Answers the supported deliverables exactly, corrects false premises with the contradicting evidence, names precisely what is missing — and never invents entities, values, quotes, or blended figures. |
77
-
78
- The two arenas share the arena contract (pairing, blind three-judge panel, Elo) but never share ratings: a model's reasoning Elo says nothing about its hallucination Elo. Judges receive category-specific instructions — the reasoning panel punishes hedging on determinable questions, the hallucination panel weighs fabrication heaviest and treats blanket refusal as an error too.
79
-
80
- The same contract expands to security, debugging, and refactoring arenas next.
81
-
82
- ## Match lifecycle
83
-
84
- 1. A seeded scheduler selects one task and two distinct competitors while balancing exposure. The same seed always produces the same schedule.
85
- 2. Both competitors receive identical task context and run concurrently. They don't know they're in a match.
86
- 3. One exhausted competitor failure forfeits; two failures create a no-contest.
87
- 4. Each judge independently receives the task, hidden rubric, and anonymous answers.
88
- 5. Explicit model IDs, canonical slugs, provider names, and model-family names are redacted from responses; judges see only `Model A` and `Model B`.
89
- 6. A/B order is independently permuted per judge to reduce position bias.
90
- 7. Two valid votes decide the winner. Judges never see identities, ratings, costs, or other votes.
91
- 8. The winner earns one point. Elo starts at 1000 and uses K=32.
92
- 9. The complete result is appended to the journal before reports are rebuilt. Snapshots are derived, never authoritative.
93
-
94
- Candidate answers are treated as untrusted data. Judge prompts explicitly reject instructions embedded in answers; structured verdicts are schema validated; malformed verdicts get one retry and then abstain. No generated code or model-provided command is ever executed.
95
-
96
- The full protocol — scheduling math, anonymization rules, vote resolution, drift detection — is in [docs/methodology.md](docs/methodology.md).
97
-
98
- ## Model roster and transport
99
-
100
- All requests go through [OpenRouter](https://openrouter.ai) using exact, pinned model slugs. `latest` aliases are prohibited. Before a paid run, the CLI verifies each ID and canonical slug against OpenRouter and confirms that judges still support structured output.
101
-
102
- The arena measures models _through one aggregator's routing_, not direct provider APIs. Every competitor and judge uses the same transport. OpenRouter's per-generation records (`arena generation <id>`) provide an independent accounting source for tokens, cost, and provider routing.
103
-
104
- The current roster and request policies are defined once in [`src/models.ts`](src/models.ts). Judges are never eligible competitors.
105
-
106
- ## Maintainer/operator setup
107
-
108
- Paid runs require both:
109
-
110
- 1. `OPENROUTER_API_KEY` in the process environment;
111
- 2. `BRIDGEBENCH_PRIVATE_DIR` pointing to the private-pack checkout.
112
-
113
- Set an account-level spending limit before running matches. Never commit either value.
114
-
115
- ## Run an arena
116
-
117
- ```bash
118
- # Reasoning: 12 matches, reproducible seed, $25 stop boundary
119
- npm run arena -- run --category reasoning
120
-
121
- # The hallucination arena — same contract, its own tasks, journal, and Elo
122
- npm run arena -- run --category hallucination
123
-
124
- # Custom batch
125
- npm run arena -- run --category hallucination --matches 24 --seed july-calibration --max-cost-usd 40
67
+ `npm run review` is the shortest credential-free audit path. It:
126
68
 
127
- # Sol/Fable pilot repeat --competitor to set an explicit roster
128
- npm run arena -- run --category reasoning \
129
- --competitor openai/gpt-5.6-sol \
130
- --competitor anthropic/claude-fable-5
69
+ 1. checks documentation links, navigation, commands, and fixture references;
70
+ 2. validates all 36 public tasks and their pack invariants;
71
+ 3. verifies a bundled journal line against its run manifest;
72
+ 4. replays the majority outcome, point, and Elo update.
131
73
 
132
- # Resume the exact deterministic schedule after interruption or budget stop
133
- npm run arena -- run --category hallucination --matches 24 --seed july-calibration --max-cost-usd 40 --resume
74
+ It needs no API key, private task overlay, network request, or paid model call.
75
+ The fixture is synthetic and tests the audit mechanism, not model quality.
76
+ Follow the [reviewer walkthrough](docs/reviewing-bridgebench.md) to connect
77
+ that mechanism to a real public task and published results.
134
78
 
135
- # Rebuild reports for both arenas without API calls (or one: --category reasoning)
136
- npm run report
137
-
138
- # Verify before publishing
139
- npm run arena -- verify --category hallucination
140
-
141
- # Maintainers: an explicit API target and category are required
142
- # Set BRIDGEBENCH_API_URL and BRIDGEBENCH_ADMIN_KEY privately first.
143
- npm run tasks -- publish --category hallucination
144
- npm run arena -- publish --category reasoning
145
- ```
146
-
147
- Category, seed, match count, model roster, task hashes, prompt policy, methodology, and engine version define the run manifest. `--resume` continues only the matching deterministic schedule.
148
-
149
- Without `--competitor`, runs use every enabled competitor. An explicit roster must contain at least two unique, enabled competitor models. Press Ctrl-C once to cancel: active model calls abort, completed matches stay journaled, and the same command resumes with `--resume`.
150
-
151
- Results are local, ignored by Git, and kept per arena:
79
+ ## How a match becomes a ranking
152
80
 
153
81
  ```text
154
- results/<category>/journal.jsonl # append-only execution record
155
- results/<category>/runs/<run-id>.json # versioned run manifest
156
- results/<category>/snapshot.json # verified, derived view
157
- results/<category>/leaderboard.md
82
+ public task ─┐
83
+ ├─> two competitors ─> anonymous answers ─┐
84
+ hidden rubric┘ ├─> three blind judges
85
+
86
+ └─> majority decision
87
+
88
+ v
89
+ run manifest ─────────────────────────────────────> journal + Elo
90
+
91
+ v
92
+ verified leaderboard
158
93
  ```
159
94
 
160
- A repeated schedule is rejected unless `--resume` is explicit. See [Replay Elo](docs/replay-elo.md) to audit a published ladder.
161
-
162
- ## Local dashboard
163
-
164
- A BridgeMind-branded control surface split into three views — Arena, Leaderboard, and Matches with a live competitor + anonymous-judge stage during runs, durable match history with raw responses and judge rationales, and an SSE activity feed.
165
-
166
- ```bash
167
- npm run dashboard
168
- # Open http://127.0.0.1:4317
169
- ```
170
-
171
- The control plane binds only to `127.0.0.1`. The API key stays in the server process and is never serialized to the browser. State-changing requests require a same-origin JSON request, only one run may be active at once, and the browser renders model output as escaped text.
172
-
173
- ## Task packs
174
-
175
- Both packs hold 12 expert-difficulty tasks across six category-specific clusters (two tasks each). Tasks are deliberately heavyweight — five to eight interlocking artifacts (~9–18k characters) and four to ten numbered deliverables — so a match exercises real deliberation budget instead of a one-screen skim.
176
-
177
- **Domain invariant: every task is a coding / software-engineering scenario.** No generic business ops. Public prompts live under `tasks/<category>/public/`; hidden references live in the private overlay. Every journal line records the SHA-256 of both task halves, so task drift is externally detectable.
95
+ 1. A seeded scheduler selects a public task and two distinct competitors while
96
+ balancing exposure.
97
+ 2. Both competitors receive byte-identical task context and run concurrently.
98
+ 3. Each judge receives the task, hidden reference, and two anonymous answers.
99
+ 4. Model and provider identities are redacted, and answer order is independently
100
+ permuted for each judge.
101
+ 5. Two valid votes decide the winner. One exhausted competitor failure is a
102
+ forfeit; two failures or no majority produce a no-contest.
103
+ 6. A decided match awards one point and updates Elo from an initial rating of
104
+ 1000 with K=32.
105
+ 7. The complete evidence record is appended before reports are rebuilt.
106
+
107
+ Candidate answers are untrusted input. Judge prompts reject embedded
108
+ instructions, verdicts are schema validated, malformed verdicts abstain after
109
+ one retry, and model-provided code or commands are never executed.
110
+
111
+ The [methodology](docs/methodology.md) specifies scheduling, anonymization,
112
+ voting, failure outcomes, and replay rules in full.
178
113
 
179
- Cluster definitions, the public/private YAML schemas, and the authoring rules (including how decoys map to disqualifying errors) are in [docs/task-authoring.md](docs/task-authoring.md).
180
-
181
- ## Debugging & the continuous improvement loop
114
+ ## The arenas
182
115
 
183
- Every arena and dashboard run writes a structured, key-redacted JSONL log to `results/<category>/logs/`. The triage command analyzes journals for anomalies — failed requests, suspiciously fast responses, truncation, judge abstentions — and a health stop halts runs that are mostly producing failures.
116
+ Each arena has its own task pack, journal, Elo ladder, and leaderboard. Ratings
117
+ never cross categories.
118
+
119
+ | Arena | What it measures | A strong answer |
120
+ | --- | --- | --- |
121
+ | **Reasoning** | Inference across interlocking software artifacts with planted decoys. Every deliverable is determinable from the provided evidence. | Derives the defensible resolution, explains the inference chain, and cites the controlling artifacts. |
122
+ | **Hallucination** | Epistemic discipline under false premises, missing evidence, fabrication bait, conflicts, and near-duplicate facts. | Answers supported items, corrects false premises, identifies missing evidence precisely, and does not invent. |
123
+ | **Security** | Defensive analysis of fictional code that hides one real, reachable vulnerability among benign look-alikes, false positives, and shallow patches. No code is executed. | Proves the reachable source-to-sink or guard-bypass chain with cited evidence and calibrated severity, and declines to flag the benign traps. |
124
+ | **BullShit** | Premise integrity under seeded nonsense — fabricated concepts, crossed domains, impossible quantities, reversed causality, pseudoscience, and loaded assumptions mixed with legitimate deliverables. | Names exactly what is nonsensical and why, corrects the premise to the nearest legitimate question and answers it, and still answers the sound deliverables instead of blanket-refusing. |
125
+ | **Refactoring** | Behavior preservation under a transformation goal, with candidate rewrites that subtly change ordering, scope, contracts, or an edge case. | Traces equivalence across every affected path, cites the location and mechanism, and flags the rewrite that silently changes observable behavior. |
126
+ | **Debugging** | Root-cause isolation from a failing system's evidence, among red-herring causes and shallow fixes. | Traces symptom to origin with cited evidence, names the one defensible root cause, and picks the fix that holds without regressing. |
127
+ | **Generation** | Specification conformance across candidate implementations, where each near-miss violates one stated constraint or edge case. | Cites the exact spec clause and the distinguishing input, and identifies the implementation that meets every requirement. |
128
+ | **Speed** | Raw latency: both models answer the same task and the faster completion wins. Decided by measured time-to-first-token and throughput — no judges. | Answers correctly and efficiently; the arena records TTFT and tokens-per-second and awards the win to the lower total completion time. |
129
+
130
+ Each judged public pack contains 12 expert tasks across six category-specific
131
+ clusters; the Speed pack contains 12 public-only workload tasks. See
132
+ [Task authoring](docs/task-authoring.md) for their schemas, clusters, and
133
+ enforced balance.
134
+
135
+ ## What evidence backs a result?
136
+
137
+ | Evidence | Role | What a reviewer can check |
138
+ | --- | --- | --- |
139
+ | Public task | Exact prompt and artifacts sent to both competitors | Content, version, category, cluster, and `publicHash` |
140
+ | Run manifest | Identity of the run | Seed, roster, task hashes, prompt policies, methodology, and engine version |
141
+ | Match journal | Append-only execution record | Full responses, judge votes and rationales, outcome, cost, point, and Elo before/after |
142
+ | Hidden reference | Expected resolution, evidence requirements, traps, and rubric | Its hash while active; its full contents after pack retirement |
143
+ | Snapshot and leaderboard | Convenient derived views | Rebuild them only after the journal verifies |
144
+
145
+ `arena verify` validates every journal line and replays Elo before reports,
146
+ resume state, or publishing trust it. Read [Replay the Elo](docs/replay-elo.md)
147
+ for the algorithm and exact audit command.
148
+
149
+ ### What verification does not prove
150
+
151
+ Journal verification proves internal consistency and detects inconsistent
152
+ edits, within-run reordering, task/manifest mismatch, and incorrect rating
153
+ math. It does not authenticate the publisher or rule out a coordinated rewrite
154
+ of the journal and manifest. It also cannot prove that a model judge made the
155
+ best qualitative choice, that hidden references never reached a third-party
156
+ provider, or that one aggregator represents direct provider behavior.
157
+
158
+ All requests currently travel through OpenRouter using pinned model slugs.
159
+ Active hidden references are sent to the configured judges and are withheld
160
+ from the public repository until their pack retires. The
161
+ [reviewer guide](docs/reviewing-bridgebench.md#what-the-evidence-proves) and
162
+ [private-pack boundary](docs/private-packs.md) describe these limitations
163
+ without claiming more than the evidence supports.
164
+
165
+ ## Repository map
184
166
 
185
- ```bash
186
- npm run arena -- run --debug # mirror every log entry to the console
187
- npm run triage # analyze the journal (auto-printed after every run)
188
- npm run arena -- generation gen-... # OpenRouter's ground-truth record for any journaled generation
167
+ ```text
168
+ bridgebench/
169
+ ├── src/ arena, judging, verification, reports, CLI
170
+ ├── tasks/<category>/public/ public task packs
171
+ ├── test/fixtures/ deterministic journals and run manifests
172
+ ├── ui/ localhost dashboard
173
+ ├── docs/ reviewer, protocol, authoring, and operator guides
174
+ └── CONTRIBUTING.md code, task, audit, and documentation workflow
189
175
  ```
190
176
 
191
- The loop: run → read the auto-printed health report → chase flags with the run log → fix the task, prompt, or model policy → rerun with a fresh seed → compare triage reports.
177
+ Canonical executable sources:
192
178
 
193
- ## Repository layout
179
+ - Model roster and request policy: [`src/models.ts`](src/models.ts)
180
+ - Category and methodology constants: [`src/contracts/categories.ts`](src/contracts/categories.ts)
181
+ - Task loading and pack invariants: [`src/tasks.ts`](src/tasks.ts)
182
+ - Journal verification and replay: [`src/verification.ts`](src/verification.ts)
194
183
 
195
- ```
196
- bridgebench/
197
- ├── src/
198
- │ ├── cli.ts # thin executable entrypoint
199
- │ ├── commands.ts # injectable CLI construction and command handlers
200
- │ ├── arena.ts # match loop: forfeits, health stop, budget stop
201
- │ ├── scheduler.ts # seeded, exposure-balanced deterministic scheduling
202
- │ ├── judges.ts # anonymization, per-judge A/B permutation, majority vote
203
- │ ├── tasks.ts # pack loader + public/private overlay resolution
204
- │ ├── verification.ts # schema validation + deterministic journal replay
205
- │ ├── elo.ts / store.ts / report.ts / triage.ts
206
- │ └── dashboard/ # localhost-only control plane (SSE)
207
- ├── tasks/
208
- │ ├── reasoning/public/ # 12 public task prompts
209
- │ └── hallucination/public/ # 12 public task prompts
210
- ├── ui/ # local dashboard SPA (React + Vite)
211
- ├── test/ # deterministic offline tests and fixtures
212
- └── docs/ # indexed protocol and contributor references
213
- ```
184
+ ## Develop and contribute
214
185
 
215
- ## Development
186
+ The full public-clone quality gate uses a mock OpenRouter gateway and requires
187
+ no model API credentials:
216
188
 
217
189
  ```bash
190
+ npm ci
191
+ npx playwright install chromium
218
192
  npm run check
219
193
  ```
220
194
 
221
- `npm run build` also emits the versioned `bridgebench/contracts` subpath from `src/contracts/index.ts`. This is a local build entry point only; Phase 1 adds no package-publishing step.
222
-
223
- Tests use a mock OpenRouter gateway and never spend credits — they pass from a fresh public clone with no API key and no private overlay. Live catalog validation and arena runs are operator-invoked only.
224
-
225
- ## Contributing
226
-
227
- BridgeBench is open source and open to builders:
228
-
229
- - **Propose tasks.** Validate one public task with `npm run tasks -- validate --file <path>`, then open a task proposal.
230
- - **Audit a ladder.** Run `arena verify` against the published journal. File an audit report if it fails.
231
- - **Extend the contract.** New arenas (security, debugging, refactoring) reuse the same match lifecycle; the season-engine branch holds a provider layer and browser harness earmarked for future suites.
232
-
233
- Start with [CONTRIBUTING.md](CONTRIBUTING.md) and the [docs index](docs/README.md).
195
+ Paid arena commands are operator-invoked only and are not part of pull-request
196
+ validation. BridgeBench accepts code, public task proposals, methodology
197
+ audits, and documentation fixes. Start with [CONTRIBUTING.md](CONTRIBUTING.md).
234
198
 
235
199
  ## Project history
236
200
 
237
- This repository previously hosted the Season 1 _season-engine_ alpha: ten Three.js tasks scored in a browser and ranked by community A/B voting. That code remains on the [`season-engine-alpha`](https://github.com/bridge-mind/bridgebench/tree/season-engine-alpha) branch. Its results never mix with arena Elo.
201
+ This repository previously hosted the Season 1 `season-engine` alpha: ten
202
+ Three.js tasks scored in a browser and ranked by community A/B voting. That
203
+ code remains on the
204
+ [`season-engine-alpha` branch](https://github.com/bridge-mind/bridgebench/tree/season-engine-alpha).
205
+ Its results never mix with arena Elo.
238
206
 
239
207
  ## License
240
208
 
@@ -1,7 +1,16 @@
1
1
  // src/contracts/categories.ts
2
2
  import { z } from "zod";
3
3
  var METHODOLOGY_VERSION = "arena-v0.3.0";
4
- var BenchmarkCategorySchema = z.enum(["reasoning", "hallucination"]);
4
+ var BenchmarkCategorySchema = z.enum([
5
+ "reasoning",
6
+ "hallucination",
7
+ "security",
8
+ "bullshit",
9
+ "refactoring",
10
+ "debugging",
11
+ "generation",
12
+ "speed"
13
+ ]);
5
14
  var CATEGORIES = BenchmarkCategorySchema.options;
6
15
  var CATEGORY_CLUSTERS = {
7
16
  reasoning: [
@@ -19,6 +28,54 @@ var CATEGORY_CLUSTERS = {
19
28
  "knowledge-boundary",
20
29
  "conflicting-sources",
21
30
  "citation-fidelity"
31
+ ],
32
+ security: [
33
+ "vuln-discovery",
34
+ "taint-flow",
35
+ "authz-boundary",
36
+ "patch-verification",
37
+ "finding-triage",
38
+ "supply-chain"
39
+ ],
40
+ bullshit: [
41
+ "fabricated-concepts",
42
+ "crossed-domains",
43
+ "impossible-quantities",
44
+ "reversed-causality",
45
+ "plausible-pseudoscience",
46
+ "loaded-assumptions"
47
+ ],
48
+ refactoring: [
49
+ "behavior-preservation",
50
+ "extract-and-inline",
51
+ "dependency-decoupling",
52
+ "api-migration",
53
+ "dead-code-elimination",
54
+ "semantic-equivalence"
55
+ ],
56
+ debugging: [
57
+ "root-cause-isolation",
58
+ "regression-introduction",
59
+ "concurrency-defect",
60
+ "state-corruption",
61
+ "error-propagation",
62
+ "fix-adequacy"
63
+ ],
64
+ generation: [
65
+ "spec-conformance",
66
+ "edge-case-coverage",
67
+ "api-contract-adherence",
68
+ "algorithmic-correctness",
69
+ "constraint-satisfaction",
70
+ "interface-compatibility"
71
+ ],
72
+ speed: [
73
+ "short-completion",
74
+ "long-generation",
75
+ "structured-output",
76
+ "code-transformation",
77
+ "stepwise-reasoning",
78
+ "retrieval-synthesis"
22
79
  ]
23
80
  };
24
81
  var CATEGORY_META = {
@@ -29,6 +86,30 @@ var CATEGORY_META = {
29
86
  hallucination: {
30
87
  label: "Hallucination",
31
88
  tagline: "Tasks are seeded with false premises, missing evidence, and fabrication bait \u2014 the arena measures who stays grounded instead of inventing."
89
+ },
90
+ security: {
91
+ label: "Security",
92
+ tagline: "Tasks hide one defensible vulnerability among benign look-alikes, false positives, and shallow patches \u2014 the arena measures who proves reachable exploitability with evidence instead of crying wolf."
93
+ },
94
+ bullshit: {
95
+ label: "BullShit",
96
+ tagline: "Tasks seed confident nonsense \u2014 fabricated concepts, crossed domains, impossible quantities \u2014 among legitimate deliverables; the arena measures who corrects the user instead of fluently answering the unanswerable."
97
+ },
98
+ refactoring: {
99
+ label: "Refactoring",
100
+ tagline: "Tasks pair code with a transformation goal and candidate rewrites \u2014 the arena measures who preserves observable behavior and spots the rewrite that silently changes it."
101
+ },
102
+ debugging: {
103
+ label: "Debugging",
104
+ tagline: "Tasks supply a failing system and its evidence among red-herring causes and shallow fixes \u2014 the arena measures who isolates the one defensible root cause and the fix that actually holds."
105
+ },
106
+ generation: {
107
+ label: "Generation",
108
+ tagline: "Tasks pair a specification with candidate implementations \u2014 the arena measures who identifies the one that meets every constraint and edge case instead of the plausible near-miss."
109
+ },
110
+ speed: {
111
+ label: "Speed",
112
+ tagline: "Both competitors get the same task and race: no judges, no quality vote. The winner is decided deterministically by measured latency \u2014 time to first token and sustained output throughput settle who finishes the work faster."
32
113
  }
33
114
  };
34
115
 
@@ -47,7 +128,11 @@ var ModelCompletionSchema = z2.object({
47
128
  costUsd: z2.number().finite().nonnegative(),
48
129
  latencyMs: z2.number().finite().nonnegative(),
49
130
  finishReason: z2.string(),
50
- attempts: z2.number().int().positive().optional()
131
+ attempts: z2.number().int().positive().optional(),
132
+ /** Time from request start to the first non-empty content delta (speed arena metric). */
133
+ ttftMs: z2.number().finite().nonnegative().optional(),
134
+ /** Request start to stream completion for the successful attempt (speed arena metric). */
135
+ totalMs: z2.number().finite().nonnegative().optional()
51
136
  });
52
137
 
53
138
  // src/contracts/journal.ts
@@ -121,6 +206,16 @@ var JUDGE_VERDICT_TRANSPORT_SCHEMA = {
121
206
  violations: { type: "array", items: { type: "string" } }
122
207
  }
123
208
  };
209
+ var SpeedMetricSchema = z3.object({
210
+ ttftMs: z3.number().finite().nonnegative(),
211
+ tps: z3.number().finite().nonnegative(),
212
+ totalMs: z3.number().finite().nonnegative(),
213
+ outputTokens: z3.number().finite().nonnegative()
214
+ });
215
+ var SpeedMetricsSchema = z3.object({
216
+ a: SpeedMetricSchema,
217
+ b: SpeedMetricSchema
218
+ });
124
219
  var NumericRecordSchema = z3.record(z3.number().finite());
125
220
  var JudgeVoteSchema = z3.object({
126
221
  judgeModelId: z3.string().min(1),
@@ -152,7 +247,7 @@ var MatchResultSchema = z3.object({
152
247
  category: BenchmarkCategorySchema.optional(),
153
248
  cluster: z3.string().min(1),
154
249
  publicHash: z3.string().min(1),
155
- privateHash: z3.string().min(1)
250
+ privateHash: z3.string().min(1).nullable()
156
251
  }),
157
252
  competitors: z3.object({
158
253
  modelA: z3.string().min(1),
@@ -160,9 +255,10 @@ var MatchResultSchema = z3.object({
160
255
  responseA: CompetitorResponseSchema,
161
256
  responseB: CompetitorResponseSchema
162
257
  }),
163
- outcome: z3.enum(["judged", "forfeit", "no-contest"]),
258
+ outcome: z3.enum(["judged", "forfeit", "no-contest", "speed-decided"]),
164
259
  winnerModelId: z3.string().min(1).nullable(),
165
260
  panel: PanelDecisionSchema.nullable(),
261
+ speedMetrics: SpeedMetricsSchema.nullable().optional(),
166
262
  eloBefore: NumericRecordSchema,
167
263
  eloAfter: NumericRecordSchema,
168
264
  pointAwarded: z3.boolean(),
@@ -214,6 +310,9 @@ var TaskPrivateSchema = z4.object({
214
310
  completeness: z4.string().min(1)
215
311
  }).strict()
216
312
  }).strict();
313
+ function isCompleteArenaTask(task) {
314
+ return task.private !== null && task.privateHash !== null;
315
+ }
217
316
 
218
317
  // src/contracts/index.ts
219
318
  var CONTRACTS_VERSION = "1.0.0";
@@ -229,6 +328,7 @@ export {
229
328
  CompetitorResponseSchema,
230
329
  JudgeVerdictSchema,
231
330
  JUDGE_VERDICT_TRANSPORT_SCHEMA,
331
+ SpeedMetricsSchema,
232
332
  JudgeVoteSchema,
233
333
  PanelDecisionSchema,
234
334
  MatchResultSchema,
@@ -239,5 +339,6 @@ export {
239
339
  TaskArtifactSchema,
240
340
  TaskPublicSchema,
241
341
  TaskPrivateSchema,
342
+ isCompleteArenaTask,
242
343
  CONTRACTS_VERSION
243
344
  };
@@ -6,17 +6,17 @@ import {
6
6
  createRunManifest,
7
7
  runIdFromManifest,
8
8
  runManifestHash
9
- } from "./chunk-KGZEQ6R5.js";
9
+ } from "./chunk-IUPFMGUL.js";
10
10
  import {
11
11
  OpenRouterClient,
12
12
  TaskLoader,
13
13
  noopLogger,
14
14
  redactSecrets,
15
15
  resolveCompetitorRoster
16
- } from "./chunk-3CX4FIFZ.js";
16
+ } from "./chunk-DVMGL3L7.js";
17
17
  import {
18
18
  METHODOLOGY_VERSION
19
- } from "./chunk-UXFKTSQS.js";
19
+ } from "./chunk-AY45YLYL.js";
20
20
 
21
21
  // src/api-client.ts
22
22
  var ADMIN_KEY_HEADER = "x-bridgebench-admin-key";
@@ -138,9 +138,10 @@ async function postChunks(config, path2, batches, wrap, schema) {
138
138
  // src/publish.ts
139
139
  import { z } from "zod";
140
140
  async function publishTasks(category, config = resolveApiConfig()) {
141
- const loaded = await new TaskLoader(category).loadAll({
142
- requirePrivate: true
143
- });
141
+ const requirePrivate = category !== "speed";
142
+ const loaded = await new TaskLoader(category).loadAll(
143
+ requirePrivate ? { requirePrivate: true } : {}
144
+ );
144
145
  const results = await postChunks(
145
146
  config,
146
147
  "/arena/tasks/import",