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.
- package/README.md +141 -173
- package/dist/{chunk-UXFKTSQS.js → chunk-AY45YLYL.js} +105 -4
- package/dist/{chunk-MBC4C3VA.js → chunk-CJGHBY54.js} +7 -6
- package/dist/{chunk-3CX4FIFZ.js → chunk-DVMGL3L7.js} +80 -5
- package/dist/{chunk-KGZEQ6R5.js → chunk-IUPFMGUL.js} +152 -15
- package/dist/{chunk-XPFZBHV2.cjs → chunk-KCXQ5SAU.cjs} +21 -20
- package/dist/{chunk-SMG3PORS.cjs → chunk-QMOPRKWD.cjs} +89 -14
- package/dist/{chunk-5OZGHLDH.cjs → chunk-VAS6KNJA.cjs} +216 -79
- package/dist/{chunk-5PCDG7VA.cjs → chunk-X3LPZGHS.cjs} +106 -5
- package/dist/cli.cjs +51 -48
- package/dist/cli.js +9 -6
- package/dist/client.cjs +5 -5
- package/dist/client.d.cts +3 -3
- package/dist/client.d.ts +3 -3
- package/dist/client.js +4 -4
- package/dist/contracts/index.cjs +6 -2
- package/dist/contracts/index.d.cts +2 -2
- package/dist/contracts/index.d.ts +2 -2
- package/dist/contracts/index.js +7 -3
- package/dist/index.cjs +8 -4
- package/dist/index.d.cts +9 -8
- package/dist/index.d.ts +9 -8
- package/dist/index.js +8 -4
- package/dist/{logger-QJU7SBDz.d.ts → logger-BByta-7V.d.cts} +23 -23
- package/dist/{logger-CCR9Mg1c.d.cts → logger-BQf29BLe.d.ts} +23 -23
- package/dist/{reports-4CejmOHf.d.cts → reports-B8TCJtPr.d.ts} +57 -13
- package/dist/{reports-s2CTnGN8.d.ts → reports-DPpOoOux.d.cts} +57 -13
- package/dist/{tasks-CpaCJ6JE.d.cts → tasks-BmhWuMBD.d.cts} +24 -22
- package/dist/{tasks-CpaCJ6JE.d.ts → tasks-BmhWuMBD.d.ts} +24 -22
- package/dist/tasks.cjs +3 -3
- package/dist/tasks.d.cts +1 -1
- package/dist/tasks.d.ts +1 -1
- package/dist/tasks.js +2 -2
- package/docs/README.md +32 -12
- package/docs/methodology.md +14 -0
- package/docs/operator-guide.md +178 -0
- package/docs/replay-elo.md +12 -2
- package/docs/reviewing-bridgebench.md +173 -0
- package/docs/task-authoring.md +79 -1
- package/package.json +5 -3
- package/tasks/bullshit/public/crossed-metric-properties.yaml +192 -0
- package/tasks/bullshit/public/crossed-release-checksums.yaml +199 -0
- package/tasks/bullshit/public/fabricated-config-keys.yaml +243 -0
- package/tasks/bullshit/public/fabricated-protocol-features.yaml +272 -0
- package/tasks/bullshit/public/impossible-capacity-math.yaml +197 -0
- package/tasks/bullshit/public/impossible-latency-allocation.yaml +215 -0
- package/tasks/bullshit/public/loaded-approval-bypass.yaml +229 -0
- package/tasks/bullshit/public/loaded-migration-fallout.yaml +221 -0
- package/tasks/bullshit/public/pseudo-gc-heap-tuning.yaml +206 -0
- package/tasks/bullshit/public/pseudo-network-tuning.yaml +204 -0
- package/tasks/bullshit/public/reversed-alert-cascade.yaml +251 -0
- package/tasks/bullshit/public/reversed-dependency-failure.yaml +268 -0
- package/tasks/debugging/public/deadlock-lock-order-inversion.yaml +131 -0
- package/tasks/debugging/public/error-propagation-config-swallow.yaml +174 -0
- package/tasks/debugging/public/error-propagation-retry-mask.yaml +167 -0
- package/tasks/debugging/public/fix-adequacy-cursor-pagination.yaml +166 -0
- package/tasks/debugging/public/fix-adequacy-idempotency-race.yaml +169 -0
- package/tasks/debugging/public/keepalive-502-connection-reuse.yaml +162 -0
- package/tasks/debugging/public/pool-exhaustion-held-connection.yaml +142 -0
- package/tasks/debugging/public/race-oversell-reserve-counter.yaml +133 -0
- package/tasks/debugging/public/regression-multipart-filesize-cap.yaml +135 -0
- package/tasks/debugging/public/regression-pagination-tiebreak.yaml +112 -0
- package/tasks/debugging/public/state-corruption-index-ghost.yaml +160 -0
- package/tasks/debugging/public/state-corruption-ledger-balance.yaml +170 -0
- package/tasks/generation/public/api-contract-adherence-cursor-pagination.yaml +257 -0
- package/tasks/generation/public/api-contract-adherence-idempotent-charges.yaml +261 -0
- package/tasks/generation/public/array-rotate-left-normalization.yaml +166 -0
- package/tasks/generation/public/cache-interface-dropin.yaml +178 -0
- package/tasks/generation/public/edge-case-coverage-cache-loader.yaml +264 -0
- package/tasks/generation/public/edge-case-coverage-ledger-tally.yaml +231 -0
- package/tasks/generation/public/event-envelope-wire-compat.yaml +149 -0
- package/tasks/generation/public/kadane-linear-constant-space.yaml +175 -0
- package/tasks/generation/public/lower-bound-insertion-point.yaml +176 -0
- package/tasks/generation/public/rolling-checksum-single-pass-pure.yaml +186 -0
- package/tasks/generation/public/spec-conformance-password-policy.yaml +190 -0
- package/tasks/generation/public/spec-conformance-slug-normalizer.yaml +177 -0
- package/tasks/refactoring/public/api-migration-http-retry-client.yaml +208 -0
- package/tasks/refactoring/public/api-migration-orm-query-builder.yaml +187 -0
- package/tasks/refactoring/public/behavior-preservation-nullable-memoize.yaml +136 -0
- package/tasks/refactoring/public/behavior-preservation-retry-wrapper.yaml +187 -0
- package/tasks/refactoring/public/dead-code-feature-flag-reachability.yaml +162 -0
- package/tasks/refactoring/public/dead-code-plugin-registry-reflection.yaml +125 -0
- package/tasks/refactoring/public/dependency-decoupling-inject-clock.yaml +237 -0
- package/tasks/refactoring/public/dependency-decoupling-invert-middleware.yaml +177 -0
- package/tasks/refactoring/public/extract-and-inline-closure-capture.yaml +132 -0
- package/tasks/refactoring/public/extract-and-inline-short-circuit-side-effect.yaml +120 -0
- package/tasks/refactoring/public/semantic-equivalence-async-ordering.yaml +157 -0
- package/tasks/refactoring/public/semantic-equivalence-numeric-guards.yaml +115 -0
- package/tasks/security/public/authz-guard-chain-exposure.yaml +224 -0
- package/tasks/security/public/authz-object-scope-idor.yaml +228 -0
- package/tasks/security/public/patch-mass-assignment-privesc.yaml +226 -0
- package/tasks/security/public/patch-sqli-candidate-fixes.yaml +243 -0
- package/tasks/security/public/supply-lockfile-tamper-trace.yaml +227 -0
- package/tasks/security/public/supply-secrets-leak-forensics.yaml +205 -0
- package/tasks/security/public/taint-export-template-render.yaml +207 -0
- package/tasks/security/public/taint-webhook-outbound-fetch.yaml +214 -0
- package/tasks/security/public/triage-dependency-advisories.yaml +189 -0
- package/tasks/security/public/triage-sast-false-positives.yaml +257 -0
- package/tasks/security/public/vuln-path-sanitizer-escape.yaml +165 -0
- package/tasks/security/public/vuln-token-alg-confusion.yaml +252 -0
- package/tasks/speed/public/speed-api-diff-changelog.yaml +42 -0
- package/tasks/speed/public/speed-callbacks-to-async.yaml +39 -0
- package/tasks/speed/public/speed-class-to-hooks.yaml +47 -0
- package/tasks/speed/public/speed-config-schema-json.yaml +34 -0
- package/tasks/speed/public/speed-csv-report-generator.yaml +38 -0
- package/tasks/speed/public/speed-debounce-hook.yaml +28 -0
- package/tasks/speed/public/speed-log-triage-summary.yaml +35 -0
- package/tasks/speed/public/speed-openapi-fragment.yaml +38 -0
- package/tasks/speed/public/speed-pagination-cursor.yaml +40 -0
- package/tasks/speed/public/speed-rate-limiter-design.yaml +43 -0
- package/tasks/speed/public/speed-rest-client-module.yaml +42 -0
- 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">
|
|
16
|
+
<a href="https://bridgebench.ai">Leaderboard</a> •
|
|
17
|
+
<a href="#review-the-benchmark">Review</a> •
|
|
18
|
+
<a href="#how-a-match-becomes-a-ranking">Methodology</a> •
|
|
17
19
|
<a href="#the-arenas">Arenas</a> •
|
|
18
|
-
<a href="
|
|
19
|
-
<a href="
|
|
20
|
-
<a href="#contributing">Contributing</a>
|
|
20
|
+
<a href="docs/README.md">Docs</a> •
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
##
|
|
46
|
+
## Start with the path you need
|
|
39
47
|
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
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
|
-
##
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
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
|
-
|
|
133
|
-
|
|
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
|
-
|
|
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
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
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
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
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
|
-
|
|
180
|
-
|
|
181
|
-
## Debugging & the continuous improvement loop
|
|
114
|
+
## The arenas
|
|
182
115
|
|
|
183
|
-
|
|
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
|
-
```
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
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
|
-
|
|
177
|
+
Canonical executable sources:
|
|
192
178
|
|
|
193
|
-
|
|
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
|
-
|
|
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
|
-
|
|
222
|
-
|
|
223
|
-
|
|
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
|
|
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([
|
|
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-
|
|
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-
|
|
16
|
+
} from "./chunk-DVMGL3L7.js";
|
|
17
17
|
import {
|
|
18
18
|
METHODOLOGY_VERSION
|
|
19
|
-
} from "./chunk-
|
|
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
|
|
142
|
-
|
|
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",
|