bridgebench 3.1.0-alpha.0 → 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 (130) hide show
  1. package/README.md +141 -173
  2. package/dist/{chunk-UECBSKTD.js → chunk-AY45YLYL.js} +105 -5
  3. package/dist/{chunk-LFKEV2YL.js → chunk-CJGHBY54.js} +7 -7
  4. package/dist/{chunk-JTVNKSMO.js → chunk-DVMGL3L7.js} +80 -6
  5. package/dist/{chunk-EQHRUV2I.js → chunk-IUPFMGUL.js} +152 -16
  6. package/dist/{chunk-7YCJSOK7.cjs → chunk-KCXQ5SAU.cjs} +21 -21
  7. package/dist/{chunk-4TWPCPRP.cjs → chunk-QMOPRKWD.cjs} +89 -15
  8. package/dist/{chunk-NJTYVNP4.cjs → chunk-VAS6KNJA.cjs} +216 -80
  9. package/dist/{chunk-CIXITJW6.cjs → chunk-X3LPZGHS.cjs} +106 -6
  10. package/dist/cli.cjs +51 -49
  11. package/dist/cli.js +9 -7
  12. package/dist/client.cjs +5 -6
  13. package/dist/client.d.cts +3 -3
  14. package/dist/client.d.ts +3 -3
  15. package/dist/client.js +4 -5
  16. package/dist/contracts/index.cjs +6 -3
  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 -4
  20. package/dist/index.cjs +8 -5
  21. package/dist/index.d.cts +9 -8
  22. package/dist/index.d.ts +9 -8
  23. package/dist/index.js +8 -5
  24. package/dist/{logger-CCR9Mg1c.d.cts → logger-BByta-7V.d.cts} +23 -23
  25. package/dist/{logger-QJU7SBDz.d.ts → logger-BQf29BLe.d.ts} +23 -23
  26. package/dist/{reports-s2CTnGN8.d.ts → reports-B8TCJtPr.d.ts} +57 -13
  27. package/dist/{reports-4CejmOHf.d.cts → reports-DPpOoOux.d.cts} +57 -13
  28. package/dist/{tasks-CpaCJ6JE.d.ts → tasks-BmhWuMBD.d.cts} +24 -22
  29. package/dist/{tasks-CpaCJ6JE.d.cts → tasks-BmhWuMBD.d.ts} +24 -22
  30. package/dist/tasks.cjs +3 -4
  31. package/dist/tasks.d.cts +1 -1
  32. package/dist/tasks.d.ts +1 -1
  33. package/dist/tasks.js +2 -3
  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
  113. package/dist/chunk-4TWPCPRP.cjs.map +0 -1
  114. package/dist/chunk-7YCJSOK7.cjs.map +0 -1
  115. package/dist/chunk-CIXITJW6.cjs.map +0 -1
  116. package/dist/chunk-EQHRUV2I.js.map +0 -1
  117. package/dist/chunk-JTVNKSMO.js.map +0 -1
  118. package/dist/chunk-LFKEV2YL.js.map +0 -1
  119. package/dist/chunk-NJTYVNP4.cjs.map +0 -1
  120. package/dist/chunk-UECBSKTD.js.map +0 -1
  121. package/dist/cli.cjs.map +0 -1
  122. package/dist/cli.js.map +0 -1
  123. package/dist/client.cjs.map +0 -1
  124. package/dist/client.js.map +0 -1
  125. package/dist/contracts/index.cjs.map +0 -1
  126. package/dist/contracts/index.js.map +0 -1
  127. package/dist/index.cjs.map +0 -1
  128. package/dist/index.js.map +0 -1
  129. package/dist/tasks.cjs.map +0 -1
  130. package/dist/tasks.js.map +0 -1
@@ -1,9 +1,9 @@
1
1
  import { z } from 'zod';
2
2
 
3
3
  declare const METHODOLOGY_VERSION = "arena-v0.3.0";
4
- declare const BenchmarkCategorySchema: z.ZodEnum<["reasoning", "hallucination"]>;
4
+ declare const BenchmarkCategorySchema: z.ZodEnum<["reasoning", "hallucination", "security", "bullshit", "refactoring", "debugging", "generation", "speed"]>;
5
5
  type BenchmarkCategory = z.infer<typeof BenchmarkCategorySchema>;
6
- declare const CATEGORIES: ["reasoning", "hallucination"];
6
+ declare const CATEGORIES: ["reasoning", "hallucination", "security", "bullshit", "refactoring", "debugging", "generation", "speed"];
7
7
  declare const CATEGORY_CLUSTERS: Record<BenchmarkCategory, readonly string[]>;
8
8
  declare const CATEGORY_META: Record<BenchmarkCategory, {
9
9
  label: string;
@@ -16,21 +16,21 @@ declare const TaskArtifactSchema: z.ZodObject<{
16
16
  label: z.ZodString;
17
17
  content: z.ZodString;
18
18
  }, "strict", z.ZodTypeAny, {
19
- type: "code" | "log" | "config" | "spec" | "diff" | "table" | "note";
20
19
  id: string;
21
- content: string;
20
+ type: "code" | "log" | "config" | "spec" | "diff" | "table" | "note";
22
21
  label: string;
22
+ content: string;
23
23
  }, {
24
- type: "code" | "log" | "config" | "spec" | "diff" | "table" | "note";
25
24
  id: string;
26
- content: string;
25
+ type: "code" | "log" | "config" | "spec" | "diff" | "table" | "note";
27
26
  label: string;
27
+ content: string;
28
28
  }>;
29
29
  type TaskArtifact = z.infer<typeof TaskArtifactSchema>;
30
30
  declare const TaskPublicSchema: z.ZodObject<{
31
31
  id: z.ZodString;
32
32
  version: z.ZodString;
33
- category: z.ZodEnum<["reasoning", "hallucination"]>;
33
+ category: z.ZodEnum<["reasoning", "hallucination", "security", "bullshit", "refactoring", "debugging", "generation", "speed"]>;
34
34
  cluster: z.ZodString;
35
35
  difficulty: z.ZodEnum<["hard", "expert"]>;
36
36
  title: z.ZodString;
@@ -42,47 +42,47 @@ declare const TaskPublicSchema: z.ZodObject<{
42
42
  label: z.ZodString;
43
43
  content: z.ZodString;
44
44
  }, "strict", z.ZodTypeAny, {
45
- type: "code" | "log" | "config" | "spec" | "diff" | "table" | "note";
46
45
  id: string;
47
- content: string;
46
+ type: "code" | "log" | "config" | "spec" | "diff" | "table" | "note";
48
47
  label: string;
48
+ content: string;
49
49
  }, {
50
- type: "code" | "log" | "config" | "spec" | "diff" | "table" | "note";
51
50
  id: string;
52
- content: string;
51
+ type: "code" | "log" | "config" | "spec" | "diff" | "table" | "note";
53
52
  label: string;
53
+ content: string;
54
54
  }>, "many">;
55
55
  tags: z.ZodDefault<z.ZodArray<z.ZodString, "many">>;
56
56
  }, "strict", z.ZodTypeAny, {
57
57
  id: string;
58
58
  version: string;
59
- category: "reasoning" | "hallucination";
59
+ category: "reasoning" | "hallucination" | "security" | "bullshit" | "refactoring" | "debugging" | "generation" | "speed";
60
60
  cluster: string;
61
61
  difficulty: "hard" | "expert";
62
62
  title: string;
63
63
  summary: string;
64
64
  prompt: string;
65
65
  artifacts: {
66
- type: "code" | "log" | "config" | "spec" | "diff" | "table" | "note";
67
66
  id: string;
68
- content: string;
67
+ type: "code" | "log" | "config" | "spec" | "diff" | "table" | "note";
69
68
  label: string;
69
+ content: string;
70
70
  }[];
71
71
  tags: string[];
72
72
  }, {
73
73
  id: string;
74
74
  version: string;
75
- category: "reasoning" | "hallucination";
75
+ category: "reasoning" | "hallucination" | "security" | "bullshit" | "refactoring" | "debugging" | "generation" | "speed";
76
76
  cluster: string;
77
77
  difficulty: "hard" | "expert";
78
78
  title: string;
79
79
  summary: string;
80
80
  prompt: string;
81
81
  artifacts: {
82
- type: "code" | "log" | "config" | "spec" | "diff" | "table" | "note";
83
82
  id: string;
84
- content: string;
83
+ type: "code" | "log" | "config" | "spec" | "diff" | "table" | "note";
85
84
  label: string;
85
+ content: string;
86
86
  }[];
87
87
  tags?: string[] | undefined;
88
88
  }>;
@@ -100,14 +100,14 @@ declare const TaskPrivateSchema: z.ZodObject<{
100
100
  completeness: z.ZodString;
101
101
  }, "strict", z.ZodTypeAny, {
102
102
  correctness: string;
103
+ evidenceGrounding: string;
103
104
  constraintHandling: string;
104
105
  completeness: string;
105
- evidenceGrounding: string;
106
106
  }, {
107
107
  correctness: string;
108
+ evidenceGrounding: string;
108
109
  constraintHandling: string;
109
110
  completeness: string;
110
- evidenceGrounding: string;
111
111
  }>;
112
112
  }, "strict", z.ZodTypeAny, {
113
113
  id: string;
@@ -117,9 +117,9 @@ declare const TaskPrivateSchema: z.ZodObject<{
117
117
  disqualifyingErrors: string[];
118
118
  rubric: {
119
119
  correctness: string;
120
+ evidenceGrounding: string;
120
121
  constraintHandling: string;
121
122
  completeness: string;
122
- evidenceGrounding: string;
123
123
  };
124
124
  }, {
125
125
  id: string;
@@ -128,9 +128,9 @@ declare const TaskPrivateSchema: z.ZodObject<{
128
128
  requiredEvidence: string[];
129
129
  rubric: {
130
130
  correctness: string;
131
+ evidenceGrounding: string;
131
132
  constraintHandling: string;
132
133
  completeness: string;
133
- evidenceGrounding: string;
134
134
  };
135
135
  disqualifyingErrors?: string[] | undefined;
136
136
  }>;
@@ -147,5 +147,7 @@ type CompleteArenaTask = ArenaTask & {
147
147
  private: TaskPrivate;
148
148
  privateHash: string;
149
149
  };
150
+ /** Narrow a task to one carrying its hidden reference (present for every judged category). */
151
+ declare function isCompleteArenaTask(task: ArenaTask): task is CompleteArenaTask;
150
152
 
151
- export { type ArenaTask as A, type BenchmarkCategory as B, CATEGORIES as C, METHODOLOGY_VERSION as M, type TaskArtifact as T, BenchmarkCategorySchema as a, CATEGORY_CLUSTERS as b, CATEGORY_META as c, type CompleteArenaTask as d, TaskArtifactSchema as e, type TaskPrivate as f, TaskPrivateSchema as g, type TaskPublic as h, TaskPublicSchema as i };
153
+ export { type ArenaTask as A, type BenchmarkCategory as B, CATEGORIES as C, METHODOLOGY_VERSION as M, type TaskArtifact as T, BenchmarkCategorySchema as a, CATEGORY_CLUSTERS as b, CATEGORY_META as c, type CompleteArenaTask as d, TaskArtifactSchema as e, type TaskPrivate as f, TaskPrivateSchema as g, type TaskPublic as h, TaskPublicSchema as i, isCompleteArenaTask as j };
package/dist/tasks.cjs CHANGED
@@ -7,8 +7,8 @@
7
7
 
8
8
 
9
9
 
10
- var _chunk4TWPCPRPcjs = require('./chunk-4TWPCPRP.cjs');
11
- require('./chunk-CIXITJW6.cjs');
10
+ var _chunkQMOPRKWDcjs = require('./chunk-QMOPRKWD.cjs');
11
+ require('./chunk-X3LPZGHS.cjs');
12
12
 
13
13
 
14
14
 
@@ -18,5 +18,4 @@ require('./chunk-CIXITJW6.cjs');
18
18
 
19
19
 
20
20
 
21
- exports.TASKS_PER_CATEGORY = _chunk4TWPCPRPcjs.TASKS_PER_CATEGORY; exports.TASKS_PER_CLUSTER = _chunk4TWPCPRPcjs.TASKS_PER_CLUSTER; exports.TaskLoader = _chunk4TWPCPRPcjs.TaskLoader; exports.buildCompetitorPrompt = _chunk4TWPCPRPcjs.buildCompetitorPrompt; exports.competitorPromptPolicyHash = _chunk4TWPCPRPcjs.competitorPromptPolicyHash; exports.defaultTaskRoot = _chunk4TWPCPRPcjs.defaultTaskRoot; exports.mergePrivateHalves = _chunk4TWPCPRPcjs.mergePrivateHalves; exports.validatePublicTaskFile = _chunk4TWPCPRPcjs.validatePublicTaskFile;
22
- //# sourceMappingURL=tasks.cjs.map
21
+ exports.TASKS_PER_CATEGORY = _chunkQMOPRKWDcjs.TASKS_PER_CATEGORY; exports.TASKS_PER_CLUSTER = _chunkQMOPRKWDcjs.TASKS_PER_CLUSTER; exports.TaskLoader = _chunkQMOPRKWDcjs.TaskLoader; exports.buildCompetitorPrompt = _chunkQMOPRKWDcjs.buildCompetitorPrompt; exports.competitorPromptPolicyHash = _chunkQMOPRKWDcjs.competitorPromptPolicyHash; exports.defaultTaskRoot = _chunkQMOPRKWDcjs.defaultTaskRoot; exports.mergePrivateHalves = _chunkQMOPRKWDcjs.mergePrivateHalves; exports.validatePublicTaskFile = _chunkQMOPRKWDcjs.validatePublicTaskFile;
package/dist/tasks.d.cts CHANGED
@@ -1,4 +1,4 @@
1
- import { f as TaskPrivate, B as BenchmarkCategory, d as CompleteArenaTask, A as ArenaTask } from './tasks-CpaCJ6JE.cjs';
1
+ import { f as TaskPrivate, B as BenchmarkCategory, d as CompleteArenaTask, A as ArenaTask } from './tasks-BmhWuMBD.cjs';
2
2
  import 'zod';
3
3
 
4
4
  declare const TASKS_PER_CATEGORY = 12;
package/dist/tasks.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { f as TaskPrivate, B as BenchmarkCategory, d as CompleteArenaTask, A as ArenaTask } from './tasks-CpaCJ6JE.js';
1
+ import { f as TaskPrivate, B as BenchmarkCategory, d as CompleteArenaTask, A as ArenaTask } from './tasks-BmhWuMBD.js';
2
2
  import 'zod';
3
3
 
4
4
  declare const TASKS_PER_CATEGORY = 12;
package/dist/tasks.js CHANGED
@@ -7,8 +7,8 @@ import {
7
7
  defaultTaskRoot,
8
8
  mergePrivateHalves,
9
9
  validatePublicTaskFile
10
- } from "./chunk-JTVNKSMO.js";
11
- import "./chunk-UECBSKTD.js";
10
+ } from "./chunk-DVMGL3L7.js";
11
+ import "./chunk-AY45YLYL.js";
12
12
  export {
13
13
  TASKS_PER_CATEGORY,
14
14
  TASKS_PER_CLUSTER,
@@ -19,4 +19,3 @@ export {
19
19
  mergePrivateHalves,
20
20
  validatePublicTaskFile
21
21
  };
22
- //# sourceMappingURL=tasks.js.map
package/docs/README.md CHANGED
@@ -1,25 +1,45 @@
1
1
  # BridgeBench documentation
2
2
 
3
- Start with the contract, then follow the workflow you need.
3
+ Choose the path that matches what you are trying to verify or change.
4
4
 
5
- ## Protocol
5
+ ## Review a benchmark result
6
6
 
7
- - [Methodology](methodology.md) — scheduling, blind judging, outcomes, and Elo.
8
- - [Replay Elo](replay-elo.md) verify a journal and reproduce its ladder.
9
- - [Private packs](private-packs.md) — hidden-reference data flow and contamination controls.
7
+ 1. [Reviewing BridgeBench](reviewing-bridgebench.md) — the guided path from a
8
+ public task through votes, journal evidence, and replayed Elo.
9
+ 2. [Methodology](methodology.md) — the canonical scheduling, execution,
10
+ anonymization, voting, failure, and scoring contract.
11
+ 3. [Replay the Elo](replay-elo.md) — reproduce a ladder and validate every
12
+ journal transition.
13
+ 4. [Private packs](private-packs.md) — understand hidden references,
14
+ contamination controls, retirement, and the external trust boundary.
10
15
 
11
- ## Contributing
16
+ Use the [glossary](glossary.md) whenever a contract term is unfamiliar.
12
17
 
13
- - [Task authoring](task-authoring.md) — public schema, private schema, clusters, and validation.
14
- - [Glossary](glossary.md) — the terms used by the engine, CLI, and published reports.
15
- - [Repository contribution guide](../CONTRIBUTING.md) — local checks and pull-request expectations.
18
+ ## Contribute
16
19
 
17
- ## Canonical sources
20
+ - [Task authoring](task-authoring.md) — public/private schemas, arena clusters,
21
+ balance invariants, and proposal workflow.
22
+ - [Repository contribution guide](../CONTRIBUTING.md) — local checks,
23
+ pull-request expectations, task proposals, and audit reports.
24
+ - [Security policy](../SECURITY.md) — report vulnerabilities privately.
25
+
26
+ ## Operate and release
27
+
28
+ - [Operator guide](operator-guide.md) — paid runs, results, dashboard, triage,
29
+ resume, and publishing.
30
+ - [Private packs](private-packs.md) — required reading before handling active
31
+ hidden references.
32
+ - [Release guide](../RELEASING.md) — npm trusted publishing and tag workflow.
33
+
34
+ ## Canonical executable sources
18
35
 
19
36
  - Model roster and request policy: [`src/models.ts`](../src/models.ts)
20
- - Category and methodology constants: [`src/types.ts`](../src/types.ts)
37
+ - Category and methodology constants:
38
+ [`src/contracts/categories.ts`](../src/contracts/categories.ts)
21
39
  - Task-pack invariants: [`src/tasks.ts`](../src/tasks.ts)
22
40
  - Journal verification: [`src/verification.ts`](../src/verification.ts)
41
+ - Elo implementation: [`src/elo.ts`](../src/elo.ts)
23
42
  - CLI workflows: `npm run arena -- --help` and `npm run tasks -- --help`
24
43
 
25
- When prose and executable validation disagree, treat the code as the current behavior and open an issue to repair the documentation.
44
+ When prose and executable validation disagree, treat the executable contract
45
+ as current behavior and open an issue to repair the documentation.
@@ -2,6 +2,20 @@
2
2
 
3
3
  Every ranking BridgeBench publishes is the fold of an append-only match journal. This document specifies the full protocol that produces a journal line, so any published ladder can be audited or reproduced. The engine stamps every line with `methodologyVersion` (currently `arena-v0.3.0`, `src/contracts/categories.ts`); results from different methodology versions never mix silently.
4
4
 
5
+ ## What this contract establishes
6
+
7
+ | Control | What it establishes | Deliberate limit |
8
+ | --- | --- | --- |
9
+ | Versioned run manifest and seeded scheduler | The planned roster, tasks, policies, ordering inputs, and schedule are reproducible | Model responses are not expected to be byte-identical across new API calls |
10
+ | Byte-identical public context | Both competitors receive the same task evidence | Provider routing and model runtime behavior remain external dependencies |
11
+ | Redaction, per-judge permutation, and isolated votes | Recorded decisions follow the benchmark's anonymity and position-bias controls | Model judges can still have shared biases or make a poor qualitative choice |
12
+ | Task hashes and append-only journal | Claimed inputs can be tied to each line and inconsistent drift detected | The files do not authenticate the publisher or prevent a coordinated rewrite; active hidden references remain unavailable until retirement |
13
+ | Fail-closed verifier | Schema, ordering, panel outcome, points, costs, manifests, and Elo replay consistently | Internal consistency does not independently prove semantic answer quality |
14
+
15
+ The benchmark is reproducible at the **evidence and scoring** layer, not by
16
+ promising deterministic model prose. [Reviewing BridgeBench](reviewing-bridgebench.md)
17
+ walks through those guarantees and limitations using the bundled fixtures.
18
+
5
19
  ## Run identity and scheduling
6
20
 
7
21
  A **run** is deterministic from a versioned manifest:
@@ -0,0 +1,178 @@
1
+ # Operating BridgeBench
2
+
3
+ This guide covers paid arena runs, local result custody, the dashboard,
4
+ triage, and publishing. Reviewers do not need any of this setup; use
5
+ [Reviewing BridgeBench](reviewing-bridgebench.md) for the credential-free path.
6
+
7
+ ## Requirements and private inputs
8
+
9
+ Use Node.js 20.19 or newer and npm 10 or newer.
10
+
11
+ A judged run requires:
12
+
13
+ 1. `OPENROUTER_API_KEY` in the operator process environment;
14
+ 2. `BRIDGEBENCH_PRIVATE_DIR` pointing to the separate private-pack checkout.
15
+
16
+ Keep both values out of source, shell output, screenshots, issue reports, and
17
+ logs. Set an account-level OpenRouter spending limit before a paid run.
18
+ BridgeBench validates the selected model IDs, canonical slugs, and judge
19
+ structured-output support before spending.
20
+
21
+ The private overlay mirrors the public task layout:
22
+
23
+ ```text
24
+ <private-checkout>/
25
+ └── tasks/
26
+ ├── reasoning/private/<task-id>.yaml
27
+ └── hallucination/private/<task-id>.yaml
28
+ ```
29
+
30
+ See [Private packs](private-packs.md) for resolution order, data flow,
31
+ contamination controls, rotation, and retirement.
32
+
33
+ ## Model transport and roster
34
+
35
+ Every competitor and judge request uses OpenRouter with exact, pinned slugs;
36
+ `latest` aliases are prohibited. The benchmark therefore measures model
37
+ behavior through one aggregator's routing rather than direct provider APIs.
38
+
39
+ The canonical roster and request policies live in
40
+ [`src/models.ts`](../src/models.ts). Judges are never eligible competitors.
41
+ OpenRouter generation records can be retrieved later with
42
+ `npm run arena -- generation <id>` for independent cost, token, and routing
43
+ checks.
44
+
45
+ ## Run an arena
46
+
47
+ Default category runs:
48
+
49
+ ```bash
50
+ npm run arena -- run --category reasoning
51
+ npm run arena -- run --category hallucination
52
+ ```
53
+
54
+ Set an explicit schedule and stop boundary:
55
+
56
+ ```bash
57
+ npm run arena -- run \
58
+ --category hallucination \
59
+ --matches 24 \
60
+ --seed july-calibration \
61
+ --max-cost-usd 40
62
+ ```
63
+
64
+ Use repeated `--competitor` flags to select an explicit roster of at least two
65
+ unique, enabled competitors:
66
+
67
+ ```bash
68
+ npm run arena -- run \
69
+ --category reasoning \
70
+ --competitor openai/gpt-5.6-sol \
71
+ --competitor anthropic/claude-fable-5
72
+ ```
73
+
74
+ Without `--competitor`, the run uses every enabled competitor. Press Ctrl-C
75
+ once to request cancellation: active calls abort, completed matches remain
76
+ journaled, and the exact schedule can resume.
77
+
78
+ ## Run identity and resume
79
+
80
+ Category, seed, match count, sorted roster, task hashes, request policies,
81
+ prompt-policy hashes, methodology, and engine version define the run manifest.
82
+ The run ID is derived from that canonical manifest.
83
+
84
+ Resume only the matching schedule:
85
+
86
+ ```bash
87
+ npm run arena -- run \
88
+ --category hallucination \
89
+ --matches 24 \
90
+ --seed july-calibration \
91
+ --max-cost-usd 40 \
92
+ --resume
93
+ ```
94
+
95
+ Journaled match IDs are skipped exactly. Repeating a completed schedule without
96
+ `--resume` is rejected.
97
+
98
+ ## Local result custody
99
+
100
+ Results are ignored by Git and isolated by arena:
101
+
102
+ ```text
103
+ results/<category>/journal.jsonl append-only execution record
104
+ results/<category>/runs/<run-id>.json versioned run manifest
105
+ results/<category>/snapshot.json verified derived view
106
+ results/<category>/leaderboard.md verified derived view
107
+ results/<category>/logs/ structured redacted logs
108
+ ```
109
+
110
+ The journal is authoritative. Verify it before rebuilding or publishing:
111
+
112
+ ```bash
113
+ npm run arena -- verify --category reasoning
114
+ npm run report
115
+ ```
116
+
117
+ Reports, resume state, and publishing all use the same fail-closed verifier.
118
+
119
+ ## Local dashboard
120
+
121
+ ```bash
122
+ npm run dashboard
123
+ ```
124
+
125
+ Open [http://127.0.0.1:4317](http://127.0.0.1:4317). The dashboard provides:
126
+
127
+ - **Arena** — run configuration and live competitor/judge progress;
128
+ - **Leaderboard** — the verified per-category ladder;
129
+ - **Matches** — public task context, full responses, votes, and rationales.
130
+
131
+ The control plane binds only to `127.0.0.1`. The API key remains in the server
132
+ process and is never serialized to the browser. Mutations require a same-origin
133
+ JSON request, only one run can be active, and model output is escaped text.
134
+
135
+ ## Triage and continuous improvement
136
+
137
+ Every run writes a structured, key-redacted JSONL log. The triage command
138
+ checks for failed requests, suspiciously fast responses, truncation, judge
139
+ abstentions, and other anomalies. A health stop halts a run that is mostly
140
+ producing failures.
141
+
142
+ ```bash
143
+ npm run arena -- run --debug
144
+ npm run triage
145
+ npm run arena -- generation gen-...
146
+ ```
147
+
148
+ Use the loop: run → read the health report → inspect the run log and provider
149
+ record → fix the task, prompt, or policy → use a fresh seed → compare reports.
150
+ Do not overwrite or hand-edit a journal to repair an outcome.
151
+
152
+ ## Publish
153
+
154
+ An explicit API target and category are required. Configure
155
+ `BRIDGEBENCH_API_URL` and `BRIDGEBENCH_ADMIN_KEY` privately before invoking:
156
+
157
+ ```bash
158
+ npm run tasks -- publish --category hallucination
159
+ npm run arena -- publish --category reasoning
160
+ ```
161
+
162
+ `tasks publish` may send both task halves to the private API store.
163
+ `arena publish` syncs verified journal evidence. Never place active hidden
164
+ references or admin credentials in command output, commits, or issue reports.
165
+
166
+ Package releases follow [RELEASING.md](../RELEASING.md). A release must pass
167
+ the public-clone quality gate and contamination check before npm publishing.
168
+
169
+ ## Operating guardrails
170
+
171
+ - Use pinned model slugs and a fixed, recorded roster.
172
+ - Set a budget cap and account-level provider limit before paid work.
173
+ - Treat competitor responses as adversarial input; never execute their code or
174
+ commands.
175
+ - Stop and rotate a pack if an active hidden reference leaks.
176
+ - Keep categories in separate journals and Elo ladders.
177
+ - Preserve append order; never edit a journal in place.
178
+ - Publish retired private halves so their recorded hashes become auditable.
@@ -1,6 +1,9 @@
1
1
  # Replay the Elo yourself
2
2
 
3
- A BridgeBench ladder is not a claim — it is the fold of a journal you can re-run. This is the recipe.
3
+ A BridgeBench ladder is not a claim — it is the fold of a journal you can
4
+ re-run. This is the rating recipe. Start with
5
+ [Reviewing BridgeBench](reviewing-bridgebench.md) if you want the complete
6
+ task-to-result walkthrough first.
4
7
 
5
8
  ## What you need
6
9
 
@@ -16,6 +19,10 @@ npm run arena -- verify \
16
19
  --journal test/fixtures/journals/valid.jsonl
17
20
  ```
18
21
 
22
+ `npm run review` runs this replay together with public-pack and documentation
23
+ validation. The synthetic line proves the verifier mechanism; it is not a
24
+ published model-quality claim.
25
+
19
26
  For a downloaded journal, place its run manifests in a sibling `runs/` directory or pass `--manifests-dir <path>`.
20
27
 
21
28
  ## The journal line, abridged
@@ -76,4 +83,7 @@ With the repo checked out, `npm run report` verifies the journal before rebuildi
76
83
  - **Judging**: each vote carries the judge's rationale and resolved winner; `agreement` must match the winner-vote count (three `unanimous`, exactly two `split`).
77
84
  - **Cost/token accounting**: every response carries its OpenRouter generation ID; `npm run arena -- generation <id>` fetches the provider's own record.
78
85
 
79
- If any of it doesn't reproduce, open an issue with the line number.
86
+ If any of it doesn't reproduce, open a
87
+ [ladder audit report](https://github.com/bridge-mind/bridgebench/issues/new?template=audit-report.yml)
88
+ with the journal source, first failing line, verifier output, and reproduction
89
+ command.
@@ -0,0 +1,173 @@
1
+ # Reviewing BridgeBench
2
+
3
+ BridgeBench is designed so a technical reviewer can trace a ranking from the
4
+ public task through the match evidence and replay the rating math without
5
+ running a model or receiving private credentials.
6
+
7
+ This guide is the shortest complete review path. The
8
+ [methodology](methodology.md) remains the canonical protocol.
9
+
10
+ ## Review in one command
11
+
12
+ From a fresh clone:
13
+
14
+ ```bash
15
+ npm ci
16
+ npm run review
17
+ ```
18
+
19
+ The command is offline and requires no API key or private overlay.
20
+
21
+ | Check | Evidence used | Failure means |
22
+ | --- | --- | --- |
23
+ | Documentation | Local Markdown files and `package.json` | A link, heading, documented command, fixture path, or docs navigation path drifted |
24
+ | Public task packs | All files under `tasks/*/public/` | A schema, category, cluster balance, filename, uniqueness, or prompt-budget invariant failed |
25
+ | Journal structure | `test/fixtures/journals/valid.jsonl` | The match no longer satisfies the current journal contract |
26
+ | Run identity | The matching manifest under `test/fixtures/journals/runs/` | The journal line is not bound to the expected schedule and policy inputs |
27
+ | Outcome and Elo | Recorded votes, winner, point, and ratings | The majority outcome or rating transition does not replay exactly |
28
+
29
+ The included journal is deliberately synthetic. It proves that the public
30
+ audit mechanism works; it is not presented as evidence about a real model.
31
+
32
+ ## Follow one match
33
+
34
+ Use these complementary examples:
35
+
36
+ - [`stateful-retry-budget.yaml`](../tasks/reasoning/public/stateful-retry-budget.yaml)
37
+ is a real public task and shows the exact task shape competitors receive.
38
+ - [`valid.jsonl`](../test/fixtures/journals/valid.jsonl) is the compact,
39
+ deterministic match used by the verifier.
40
+ - [The matching run manifest](../test/fixtures/journals/runs/run-bcdf984dc74998a7c083.json)
41
+ binds the fixture to its seed, roster, task hashes, prompt policies,
42
+ methodology, and engine version.
43
+
44
+ The real task and synthetic match are intentionally separate. Public tasks
45
+ evolve as packs rotate; the verifier fixture stays small and deterministic so
46
+ contract regressions are obvious.
47
+
48
+ ### Task and run identity
49
+
50
+ Production `task` objects record the task ID, version, category, cluster, and
51
+ the SHA-256 hashes of the exact public and private YAML used for the match. The
52
+ `runManifestHash` binds the journal line to the versioned run manifest. This
53
+ small synthetic fixture uses obvious `public-fixture` and `private-fixture`
54
+ stand-ins so it tests the contract without pretending to contain a production
55
+ task.
56
+
57
+ This lets a reviewer detect task or policy drift without trusting a
58
+ leaderboard snapshot.
59
+
60
+ ### Competitor evidence
61
+
62
+ `competitors.responseA` and `competitors.responseB` retain:
63
+
64
+ - the complete response text;
65
+ - success or failure status;
66
+ - generation ID;
67
+ - token counts, cost, latency, and finish reason.
68
+
69
+ Both competitors receive the same public task context. A single exhausted
70
+ competitor failure is a forfeit; two failures produce a no-contest.
71
+
72
+ ### Blind panel evidence
73
+
74
+ `panel.votes` contains all three structured verdicts, including each rationale,
75
+ criteria assessment, resolved winner, and completion metadata. Judges receive
76
+ anonymous answers in independently permuted A/B order. They never receive
77
+ ratings, costs, other votes, or the competitors' canonical identities.
78
+
79
+ Two valid votes for the same competitor decide the match. The recorded
80
+ `agreement` must match the vote count.
81
+
82
+ ### Point and Elo
83
+
84
+ Every decided match awards one point and one Elo update. Ratings start at 1000
85
+ and use K=32. The fixture starts both competitors at 1000, records a unanimous
86
+ win for model A, and therefore moves the ratings to 1016 and 984.
87
+
88
+ `arena verify` recomputes the outcome and the `eloBefore`/`eloAfter` transition
89
+ in journal order. Read [Replay the Elo](replay-elo.md) for the formula and
90
+ per-line checks.
91
+
92
+ ## Inspect the bundled match visually
93
+
94
+ The localhost dashboard can load a separate deterministic fixture so you can
95
+ inspect the public task, responses, judge rationales, and leaderboard without
96
+ an API key.
97
+
98
+ macOS or Linux:
99
+
100
+ ```bash
101
+ BRIDGEBENCH_RESULTS_DIR=test/fixtures/dashboard-results npm run dashboard
102
+ ```
103
+
104
+ PowerShell:
105
+
106
+ ```powershell
107
+ $env:BRIDGEBENCH_RESULTS_DIR = "test/fixtures/dashboard-results"
108
+ npm run dashboard
109
+ ```
110
+
111
+ Open [http://127.0.0.1:4317](http://127.0.0.1:4317), then use **Leaderboard**
112
+ and **Matches**. Treat the fixture as review-only and do not start a run; this
113
+ command does not place the dashboard itself into a read-only mode. The
114
+ dashboard binds to localhost, keeps API credentials in the server process, and
115
+ renders model output as escaped text.
116
+
117
+ ## Audit a published ladder
118
+
119
+ 1. Download the category journal from
120
+ [bridgebench.ai](https://bridgebench.ai) and obtain its matching `runs/`
121
+ manifests.
122
+ 2. Keep the manifests in a sibling `runs/` directory or pass
123
+ `--manifests-dir <path>`.
124
+ 3. Verify the journal:
125
+
126
+ ```bash
127
+ npm run arena -- verify --category reasoning --journal ./journal.jsonl
128
+ ```
129
+
130
+ 4. Inspect the first failing line if verification stops.
131
+ 5. Compare each journaled `publicHash` with the raw public task YAML. After a
132
+ pack retires, compare `privateHash` with the published private half too.
133
+ 6. Review votes and rationales qualitatively; deterministic verification
134
+ cannot decide whether a judge's preference was substantively correct.
135
+
136
+ To rebuild local derived views after verification, place the journal and
137
+ manifests under `results/<category>/` and run `npm run report`.
138
+
139
+ ## What the evidence proves
140
+
141
+ | Evidence or control | What it supports | What it cannot establish |
142
+ | --- | --- | --- |
143
+ | Seeded scheduler and run manifest | The planned schedule, roster, policies, versions, and task hashes are bound to a stable run ID | That a new model call will return byte-identical prose |
144
+ | Public/private task hashes | The exact task halves used by a match can be identified and drift detected | The contents or quality of an active hidden reference before retirement |
145
+ | Blind structured votes | The recorded winner follows the visible panel votes and anonymity controls | That model judges are unbiased or selected the objectively best answer |
146
+ | Append-only journal verification | Schema, ordering, majority outcome, point, cost totals, and Elo transitions are internally consistent | Publisher identity, an external timestamp, or protection against a coordinated journal-and-manifest rewrite |
147
+ | OpenRouter generation IDs | Provider routing and accounting can be cross-checked with the transport record | Direct-provider equivalence or provider retention behavior |
148
+ | Published retired references | The hidden half can eventually be hashed and reviewed against the journal | That no third party retained an active reference while it was in use |
149
+
150
+ BridgeBench measures models through OpenRouter, not through direct provider
151
+ APIs. Active hidden references travel to the configured model judges and may
152
+ be stored in the private BridgeBench API. Withholding them reduces
153
+ contamination risk; it does not prove non-retention or prevent all leakage.
154
+ See [Private packs](private-packs.md) for the complete trust boundary and
155
+ incident procedure.
156
+
157
+ ## Reviewer completion checklist
158
+
159
+ A review is complete when you can answer:
160
+
161
+ - What does each arena measure, and which claims are out of scope?
162
+ - Did both competitors receive identical public evidence?
163
+ - How were identities hidden and answer order balanced?
164
+ - Do the recorded votes support the winner?
165
+ - Do the point and Elo transitions replay from the journal?
166
+ - Can the task and run inputs be tied to their recorded hashes?
167
+ - Which conclusions still depend on hidden references or model-judge quality?
168
+
169
+ If a published result does not reproduce, use the
170
+ [ladder audit report](https://github.com/bridge-mind/bridgebench/issues/new?template=audit-report.yml)
171
+ and include the journal source, first failing line, verifier output, and exact
172
+ reproduction command. Never include credentials, active hidden references, or
173
+ private filesystem paths.