Rename environmentProven, which claimed more than it knew

b80e176b6cf6 · Claude Fable 5 · · parent db4a30252be5

Rename environmentProven, which claimed more than it knew

The field decides whether a task may appear in a score suite, and it was named
as though this repository had built and graded each task at least once. It has
not. The eight `swebench-verified@1.0` instances carry it as true because the
dataset ships their environment and verifier — which is the real distinction,
and the whole reason a public subset costs a manifest entry rather than a
harness — not because anybody here has run them.

`environmentAvailable` says what is actually known: a container and verifier
that can grade this task exist. It deliberately does not claim the task has
been run here, that it passed, or that its image builds on any given machine.
The rule it gates is unchanged and still means something, because the six owned
closed-issue tasks have no environment at all.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01SoZMfWRSGnf6FZX2Ar9rQ2
Co-Authored-By
Claude Fable 5 <noreply@anthropic.com>

Deploy story

What this commit did to the running system — joined from the forge receipt chain, the part a commit page elsewhere cannot show.

Not deployed through the forge lane

No push, promotion, build, or deploy receipt references this commit (receipts are scanned over a bounded recent window). Changes shipped by full node replacement carry their proof in the release gate receipt instead.

Changed files

  • modified bench/build-suites.mjs
  • modified bench/suites/coder-effectiveness-v1.suite.json
  • modified bench/suites/owned-closed-issues.suite.json
  • modified bench/suites/smoke.suite.json
  • modified bench/suites/swebench-verified-subset.suite.json
  • modified bench/suites/tb2-cross-section.suite.json
  • modified bench/suites/tb2-quick.suite.json
  • modified bench/tasks/owned/README.md
  • modified packages/coder-effectiveness/README.md
  • modified packages/coder-effectiveness/fixtures/fixture-suite-3.suite.json
  • modified packages/coder-effectiveness/fixtures/fixture-suite-5.suite.json
  • modified packages/coder-effectiveness/fixtures/fixture-suite.suite.json
  • modified packages/coder-effectiveness/src/results-store.test.ts
  • modified packages/coder-effectiveness/src/suite-manifest.test.ts
  • modified packages/coder-effectiveness/src/suite-manifest.ts
  • modified packages/coder-effectiveness/src/thresholds.test.ts

Diff

16 files changed, +118 -102

bench/build-suites.mjs modified +4 -4

@@ -168,10 +168,10 @@ const firstInstanceOf = (datasets, dataset, repo) => {

168 168
  return names[0];
169 169
};
170 170
171
const registryTask = (datasets, dataset, name, rationale, environmentProven) => ({
171
const registryTask = (datasets, dataset, name, rationale, environmentAvailable) => ({
172 172
  id: name,
173 173
  pin: pinFor(datasets, dataset, name),
174
  environmentProven,
174
  environmentAvailable,
175 175
  ...(rationale === undefined ? {} : { rationale }),
176 176
});
177 177

@@ -184,7 +184,7 @@ const registryTask = (datasets, dataset, name, rationale, environmentProven) =>

184 184
 * be perfectly well closed, but without a commit there is nothing to grade
185 185
 * against.
186 186
 *
187
 * Every one of these is `environmentProven: false` today. The pin is real — the
187
 * Every one of these is `environmentAvailable: false` today. The pin is real — the
188 188
 * issue, its instruction, and the commit that satisfied it — and no container
189 189
 * has been built that can grade it, so `parseSuiteManifest` will refuse to let
190 190
 * them into a score-tier suite until one has. See `bench/tasks/owned/README.md`.

@@ -213,7 +213,7 @@ const ownedTasks = (issuesPath) => {

213 213
        issue: issue.number,
214 214
        acceptedCommit,
215 215
      },
216
      environmentProven: false,
216
      environmentAvailable: false,
217 217
      rationale: issue.title,
218 218
    });
219 219
  }
bench/suites/coder-effectiveness-v1.suite.json modified +20 -20

@@ -13,7 +13,7 @@

13 13
        "commit": "69671fbaac6d67a7ef0dfec016cc38a64ef7a77c",
14 14
        "path": "git-leak-recovery"
15 15
      },
16
      "environmentProven": true
16
      "environmentAvailable": true
17 17
    },
18 18
    {
19 19
      "id": "sanitize-git-repo",

@@ -24,7 +24,7 @@

24 24
        "commit": "69671fbaac6d67a7ef0dfec016cc38a64ef7a77c",
25 25
        "path": "sanitize-git-repo"
26 26
      },
27
      "environmentProven": true
27
      "environmentAvailable": true
28 28
    },
29 29
    {
30 30
      "id": "merge-diff-arc-agi-task",

@@ -35,7 +35,7 @@

35 35
        "commit": "69671fbaac6d67a7ef0dfec016cc38a64ef7a77c",
36 36
        "path": "merge-diff-arc-agi-task"
37 37
      },
38
      "environmentProven": true
38
      "environmentAvailable": true
39 39
    },
40 40
    {
41 41
      "id": "build-cython-ext",

@@ -46,7 +46,7 @@

46 46
        "commit": "69671fbaac6d67a7ef0dfec016cc38a64ef7a77c",
47 47
        "path": "build-cython-ext"
48 48
      },
49
      "environmentProven": true
49
      "environmentAvailable": true
50 50
    },
51 51
    {
52 52
      "id": "sqlite-with-gcov",

@@ -57,7 +57,7 @@

57 57
        "commit": "69671fbaac6d67a7ef0dfec016cc38a64ef7a77c",
58 58
        "path": "sqlite-with-gcov"
59 59
      },
60
      "environmentProven": true
60
      "environmentAvailable": true
61 61
    },
62 62
    {
63 63
      "id": "fix-code-vulnerability",

@@ -68,7 +68,7 @@

68 68
        "commit": "69671fbaac6d67a7ef0dfec016cc38a64ef7a77c",
69 69
        "path": "fix-code-vulnerability"
70 70
      },
71
      "environmentProven": true
71
      "environmentAvailable": true
72 72
    },
73 73
    {
74 74
      "id": "regex-log",

@@ -79,7 +79,7 @@

79 79
        "commit": "69671fbaac6d67a7ef0dfec016cc38a64ef7a77c",
80 80
        "path": "regex-log"
81 81
      },
82
      "environmentProven": true
82
      "environmentAvailable": true
83 83
    },
84 84
    {
85 85
      "id": "count-dataset-tokens",

@@ -90,7 +90,7 @@

90 90
        "commit": "69671fbaac6d67a7ef0dfec016cc38a64ef7a77c",
91 91
        "path": "count-dataset-tokens"
92 92
      },
93
      "environmentProven": true
93
      "environmentAvailable": true
94 94
    },
95 95
    {
96 96
      "id": "password-recovery",

@@ -101,7 +101,7 @@

101 101
        "commit": "69671fbaac6d67a7ef0dfec016cc38a64ef7a77c",
102 102
        "path": "password-recovery"
103 103
      },
104
      "environmentProven": true
104
      "environmentAvailable": true
105 105
    },
106 106
    {
107 107
      "id": "openssl-selfsigned-cert",

@@ -112,7 +112,7 @@

112 112
        "commit": "69671fbaac6d67a7ef0dfec016cc38a64ef7a77c",
113 113
        "path": "openssl-selfsigned-cert"
114 114
      },
115
      "environmentProven": true
115
      "environmentAvailable": true
116 116
    },
117 117
    {
118 118
      "id": "nginx-request-logging",

@@ -123,7 +123,7 @@

123 123
        "commit": "69671fbaac6d67a7ef0dfec016cc38a64ef7a77c",
124 124
        "path": "nginx-request-logging"
125 125
      },
126
      "environmentProven": true
126
      "environmentAvailable": true
127 127
    },
128 128
    {
129 129
      "id": "schemelike-metacircular-eval",

@@ -134,7 +134,7 @@

134 134
        "commit": "69671fbaac6d67a7ef0dfec016cc38a64ef7a77c",
135 135
        "path": "schemelike-metacircular-eval"
136 136
      },
137
      "environmentProven": true
137
      "environmentAvailable": true
138 138
    },
139 139
    {
140 140
      "id": "astropy__astropy-12907",

@@ -145,7 +145,7 @@

145 145
        "commit": "86723674f04e4209ac479d0fb75d9d9f44b4377e",
146 146
        "path": "datasets/swebench-verified/astropy__astropy-12907"
147 147
      },
148
      "environmentProven": true,
148
      "environmentAvailable": true,
149 149
      "rationale": "astropy: table and unit handling in a large scientific codebase"
150 150
    },
151 151
    {

@@ -157,7 +157,7 @@

157 157
        "commit": "86723674f04e4209ac479d0fb75d9d9f44b4377e",
158 158
        "path": "datasets/swebench-verified/django__django-10097"
159 159
      },
160
      "environmentProven": true,
160
      "environmentAvailable": true,
161 161
      "rationale": "Django: the framework half of the benchmark, wide blast radius per change"
162 162
    },
163 163
    {

@@ -169,7 +169,7 @@

169 169
        "commit": "86723674f04e4209ac479d0fb75d9d9f44b4377e",
170 170
        "path": "datasets/swebench-verified/matplotlib__matplotlib-13989"
171 171
      },
172
      "environmentProven": true,
172
      "environmentAvailable": true,
173 173
      "rationale": "matplotlib: rendering state, where the test is the only oracle"
174 174
    },
175 175
    {

@@ -181,7 +181,7 @@

181 181
        "commit": "86723674f04e4209ac479d0fb75d9d9f44b4377e",
182 182
        "path": "datasets/swebench-verified/pydata__xarray-2905"
183 183
      },
184
      "environmentProven": true,
184
      "environmentAvailable": true,
185 185
      "rationale": "xarray: array semantics over pandas and numpy, dtype-sensitive"
186 186
    },
187 187
    {

@@ -193,7 +193,7 @@

193 193
        "commit": "86723674f04e4209ac479d0fb75d9d9f44b4377e",
194 194
        "path": "datasets/swebench-verified/pytest-dev__pytest-10051"
195 195
      },
196
      "environmentProven": true,
196
      "environmentAvailable": true,
197 197
      "rationale": "pytest: the test runner itself, so a fix has to be reentrant"
198 198
    },
199 199
    {

@@ -205,7 +205,7 @@

205 205
        "commit": "86723674f04e4209ac479d0fb75d9d9f44b4377e",
206 206
        "path": "datasets/swebench-verified/scikit-learn__scikit-learn-10297"
207 207
      },
208
      "environmentProven": true,
208
      "environmentAvailable": true,
209 209
      "rationale": "scikit-learn: estimator API conformance, contract-shaped"
210 210
    },
211 211
    {

@@ -217,7 +217,7 @@

217 217
        "commit": "86723674f04e4209ac479d0fb75d9d9f44b4377e",
218 218
        "path": "datasets/swebench-verified/sphinx-doc__sphinx-10323"
219 219
      },
220
      "environmentProven": true,
220
      "environmentAvailable": true,
221 221
      "rationale": "Sphinx: documentation tooling, heavy on configuration surface"
222 222
    },
223 223
    {

@@ -229,7 +229,7 @@

229 229
        "commit": "86723674f04e4209ac479d0fb75d9d9f44b4377e",
230 230
        "path": "datasets/swebench-verified/sympy__sympy-11618"
231 231
      },
232
      "environmentProven": true,
232
      "environmentAvailable": true,
233 233
      "rationale": "SymPy: symbolic evaluation, where a plausible-looking fix is usually wrong"
234 234
    }
235 235
  ]
bench/suites/owned-closed-issues.suite.json modified +6 -6

@@ -12,7 +12,7 @@

12 12
        "issue": 21,
13 13
        "acceptedCommit": "586edf191fb221d1e1f5c600b4a714d40fc95820"
14 14
      },
15
      "environmentProven": false,
15
      "environmentAvailable": false,
16 16
      "rationale": "Add Ollama local model support to openagents coder"
17 17
    },
18 18
    {

@@ -23,7 +23,7 @@

23 23
        "issue": 24,
24 24
        "acceptedCommit": "f6366a80930ade654bc29b3b1217268011506061"
25 25
      },
26
      "environmentProven": false,
26
      "environmentAvailable": false,
27 27
      "rationale": "Resume a coder thread with --resume"
28 28
    },
29 29
    {

@@ -34,7 +34,7 @@

34 34
        "issue": 31,
35 35
        "acceptedCommit": "cf1861c9cbd2b2bf3e02593bf4c291db82c88e58"
36 36
      },
37
      "environmentProven": false,
37
      "environmentAvailable": false,
38 38
      "rationale": "Adopt the proxy's reasoning and tool-call fidelity in the coder"
39 39
    },
40 40
    {

@@ -45,7 +45,7 @@

45 45
        "issue": 36,
46 46
        "acceptedCommit": "2a631cf63107d1b706e7e8058f49c1bd283447ed"
47 47
      },
48
      "environmentProven": false,
48
      "environmentAvailable": false,
49 49
      "rationale": "Teach the coder's tools token economy, per model family"
50 50
    },
51 51
    {

@@ -56,7 +56,7 @@

56 56
        "issue": 40,
57 57
        "acceptedCommit": "fb705a506a2d56263b07698aa02b3223861d0df6"
58 58
      },
59
      "environmentProven": false,
59
      "environmentAvailable": false,
60 60
      "rationale": "Coder presents model tiers, never vendor model names"
61 61
    },
62 62
    {

@@ -67,7 +67,7 @@

67 67
        "issue": 41,
68 68
        "acceptedCommit": "a04c4fcf4708ff30b264970eb08acbebe5f20ed5"
69 69
      },
70
      "environmentProven": false,
70
      "environmentAvailable": false,
71 71
      "rationale": "Read a conversation on request: the read-conversation plugin, discovered, loaded, and streamed in the coder"
72 72
    }
73 73
  ]
bench/suites/smoke.suite.json modified +2 -2

@@ -13,7 +13,7 @@

13 13
        "commit": "69671fbaac6d67a7ef0dfec016cc38a64ef7a77c",
14 14
        "path": "fix-code-vulnerability"
15 15
      },
16
      "environmentProven": true,
16
      "environmentAvailable": true,
17 17
      "rationale": "quick-shaped"
18 18
    },
19 19
    {

@@ -25,7 +25,7 @@

25 25
        "commit": "69671fbaac6d67a7ef0dfec016cc38a64ef7a77c",
26 26
        "path": "regex-log"
27 27
      },
28
      "environmentProven": true,
28
      "environmentAvailable": true,
29 29
      "rationale": "quick-shaped"
30 30
    }
31 31
  ]
bench/suites/swebench-verified-subset.suite.json modified +8 -8

@@ -13,7 +13,7 @@

13 13
        "commit": "86723674f04e4209ac479d0fb75d9d9f44b4377e",
14 14
        "path": "datasets/swebench-verified/astropy__astropy-12907"
15 15
      },
16
      "environmentProven": true,
16
      "environmentAvailable": true,
17 17
      "rationale": "astropy: table and unit handling in a large scientific codebase"
18 18
    },
19 19
    {

@@ -25,7 +25,7 @@

25 25
        "commit": "86723674f04e4209ac479d0fb75d9d9f44b4377e",
26 26
        "path": "datasets/swebench-verified/django__django-10097"
27 27
      },
28
      "environmentProven": true,
28
      "environmentAvailable": true,
29 29
      "rationale": "Django: the framework half of the benchmark, wide blast radius per change"
30 30
    },
31 31
    {

@@ -37,7 +37,7 @@

37 37
        "commit": "86723674f04e4209ac479d0fb75d9d9f44b4377e",
38 38
        "path": "datasets/swebench-verified/matplotlib__matplotlib-13989"
39 39
      },
40
      "environmentProven": true,
40
      "environmentAvailable": true,
41 41
      "rationale": "matplotlib: rendering state, where the test is the only oracle"
42 42
    },
43 43
    {

@@ -49,7 +49,7 @@

49 49
        "commit": "86723674f04e4209ac479d0fb75d9d9f44b4377e",
50 50
        "path": "datasets/swebench-verified/pydata__xarray-2905"
51 51
      },
52
      "environmentProven": true,
52
      "environmentAvailable": true,
53 53
      "rationale": "xarray: array semantics over pandas and numpy, dtype-sensitive"
54 54
    },
55 55
    {

@@ -61,7 +61,7 @@

61 61
        "commit": "86723674f04e4209ac479d0fb75d9d9f44b4377e",
62 62
        "path": "datasets/swebench-verified/pytest-dev__pytest-10051"
63 63
      },
64
      "environmentProven": true,
64
      "environmentAvailable": true,
65 65
      "rationale": "pytest: the test runner itself, so a fix has to be reentrant"
66 66
    },
67 67
    {

@@ -73,7 +73,7 @@

73 73
        "commit": "86723674f04e4209ac479d0fb75d9d9f44b4377e",
74 74
        "path": "datasets/swebench-verified/scikit-learn__scikit-learn-10297"
75 75
      },
76
      "environmentProven": true,
76
      "environmentAvailable": true,
77 77
      "rationale": "scikit-learn: estimator API conformance, contract-shaped"
78 78
    },
79 79
    {

@@ -85,7 +85,7 @@

85 85
        "commit": "86723674f04e4209ac479d0fb75d9d9f44b4377e",
86 86
        "path": "datasets/swebench-verified/sphinx-doc__sphinx-10323"
87 87
      },
88
      "environmentProven": true,
88
      "environmentAvailable": true,
89 89
      "rationale": "Sphinx: documentation tooling, heavy on configuration surface"
90 90
    },
91 91
    {

@@ -97,7 +97,7 @@

97 97
        "commit": "86723674f04e4209ac479d0fb75d9d9f44b4377e",
98 98
        "path": "datasets/swebench-verified/sympy__sympy-11618"
99 99
      },
100
      "environmentProven": true,
100
      "environmentAvailable": true,
101 101
      "rationale": "SymPy: symbolic evaluation, where a plausible-looking fix is usually wrong"
102 102
    }
103 103
  ]
bench/suites/tb2-cross-section.suite.json modified +12 -12

@@ -13,7 +13,7 @@

13 13
        "commit": "69671fbaac6d67a7ef0dfec016cc38a64ef7a77c",
14 14
        "path": "git-leak-recovery"
15 15
      },
16
      "environmentProven": true
16
      "environmentAvailable": true
17 17
    },
18 18
    {
19 19
      "id": "sanitize-git-repo",

@@ -24,7 +24,7 @@

24 24
        "commit": "69671fbaac6d67a7ef0dfec016cc38a64ef7a77c",
25 25
        "path": "sanitize-git-repo"
26 26
      },
27
      "environmentProven": true
27
      "environmentAvailable": true
28 28
    },
29 29
    {
30 30
      "id": "merge-diff-arc-agi-task",

@@ -35,7 +35,7 @@

35 35
        "commit": "69671fbaac6d67a7ef0dfec016cc38a64ef7a77c",
36 36
        "path": "merge-diff-arc-agi-task"
37 37
      },
38
      "environmentProven": true
38
      "environmentAvailable": true
39 39
    },
40 40
    {
41 41
      "id": "build-cython-ext",

@@ -46,7 +46,7 @@

46 46
        "commit": "69671fbaac6d67a7ef0dfec016cc38a64ef7a77c",
47 47
        "path": "build-cython-ext"
48 48
      },
49
      "environmentProven": true
49
      "environmentAvailable": true
50 50
    },
51 51
    {
52 52
      "id": "sqlite-with-gcov",

@@ -57,7 +57,7 @@

57 57
        "commit": "69671fbaac6d67a7ef0dfec016cc38a64ef7a77c",
58 58
        "path": "sqlite-with-gcov"
59 59
      },
60
      "environmentProven": true
60
      "environmentAvailable": true
61 61
    },
62 62
    {
63 63
      "id": "fix-code-vulnerability",

@@ -68,7 +68,7 @@

68 68
        "commit": "69671fbaac6d67a7ef0dfec016cc38a64ef7a77c",
69 69
        "path": "fix-code-vulnerability"
70 70
      },
71
      "environmentProven": true
71
      "environmentAvailable": true
72 72
    },
73 73
    {
74 74
      "id": "regex-log",

@@ -79,7 +79,7 @@

79 79
        "commit": "69671fbaac6d67a7ef0dfec016cc38a64ef7a77c",
80 80
        "path": "regex-log"
81 81
      },
82
      "environmentProven": true
82
      "environmentAvailable": true
83 83
    },
84 84
    {
85 85
      "id": "count-dataset-tokens",

@@ -90,7 +90,7 @@

90 90
        "commit": "69671fbaac6d67a7ef0dfec016cc38a64ef7a77c",
91 91
        "path": "count-dataset-tokens"
92 92
      },
93
      "environmentProven": true
93
      "environmentAvailable": true
94 94
    },
95 95
    {
96 96
      "id": "password-recovery",

@@ -101,7 +101,7 @@

101 101
        "commit": "69671fbaac6d67a7ef0dfec016cc38a64ef7a77c",
102 102
        "path": "password-recovery"
103 103
      },
104
      "environmentProven": true
104
      "environmentAvailable": true
105 105
    },
106 106
    {
107 107
      "id": "openssl-selfsigned-cert",

@@ -112,7 +112,7 @@

112 112
        "commit": "69671fbaac6d67a7ef0dfec016cc38a64ef7a77c",
113 113
        "path": "openssl-selfsigned-cert"
114 114
      },
115
      "environmentProven": true
115
      "environmentAvailable": true
116 116
    },
117 117
    {
118 118
      "id": "nginx-request-logging",

@@ -123,7 +123,7 @@

123 123
        "commit": "69671fbaac6d67a7ef0dfec016cc38a64ef7a77c",
124 124
        "path": "nginx-request-logging"
125 125
      },
126
      "environmentProven": true
126
      "environmentAvailable": true
127 127
    },
128 128
    {
129 129
      "id": "schemelike-metacircular-eval",

@@ -134,7 +134,7 @@

134 134
        "commit": "69671fbaac6d67a7ef0dfec016cc38a64ef7a77c",
135 135
        "path": "schemelike-metacircular-eval"
136 136
      },
137
      "environmentProven": true
137
      "environmentAvailable": true
138 138
    }
139 139
  ]
140 140
}
bench/suites/tb2-quick.suite.json modified +2 -2

@@ -13,7 +13,7 @@

13 13
        "commit": "69671fbaac6d67a7ef0dfec016cc38a64ef7a77c",
14 14
        "path": "regex-log"
15 15
      },
16
      "environmentProven": true,
16
      "environmentAvailable": true,
17 17
      "rationale": "near-zero tool surface: the suite's test of whether the agent can just answer"
18 18
    },
19 19
    {

@@ -25,7 +25,7 @@

25 25
        "commit": "69671fbaac6d67a7ef0dfec016cc38a64ef7a77c",
26 26
        "path": "openssl-selfsigned-cert"
27 27
      },
28
      "environmentProven": true,
28
      "environmentAvailable": true,
29 29
      "rationale": "a fully specified checklist: every command is known upfront, so round count is a tool habit rather than a reasoning result"
30 30
    }
31 31
  ]
bench/tasks/owned/README.md modified +13 -7

@@ -23,7 +23,7 @@ carries one into a task pinned to that commit:

23 23
    "issue": 31,
24 24
    "acceptedCommit": "cf1861c9cb..."
25 25
  },
26
  "environmentProven": false,
26
  "environmentAvailable": false,
27 27
  "rationale": "Adopt the proxy's reasoning and tool-call fidelity in the coder"
28 28
}
29 29
```

@@ -44,10 +44,16 @@ below needs.

44 44
45 45
**No container exists that can grade any of these.** The pin is real and the
46 46
suite is real; the environment is not. Every owned task therefore carries
47
`environmentProven: false`, and `parseSuiteManifest` refuses to let an unproven
48
task into a `score`-tier suite — so `owned-closed-issues.suite.json` is
49
`smoke`, and `coder-effectiveness-v1` holds the twenty proven public tasks and
50
none of these.
47
`environmentAvailable: false`, and `parseSuiteManifest` refuses to let a task
48
with no gradeable environment into a `score`-tier suite — so
49
`owned-closed-issues.suite.json` is `smoke`, and `coder-effectiveness-v1` holds
50
the twenty registry-backed public tasks and none of these.
51
52
The registry tasks carry `environmentAvailable: true` because the dataset ships
53
their environment and verifier, which is what makes a public subset cost a
54
manifest entry rather than a harness. The flag says a gradeable definition
55
exists; it does not say the task has been run here, or that it passed, or that
56
its image builds on any particular machine.
51 57
52 58
That refusal is the point rather than a limitation. A score suite that included
53 59
a task nobody could run would report those trials as missing, and a missing

@@ -68,8 +74,8 @@ closing commit touches both source and test files:

68 74
   recorded test pass; it does not mean the agent reproduced the recorded diff,
69 75
   and it should not.
70 76
71
Two things have to be true before the first of these is `environmentProven`,
72
and neither is cheap:
77
Two things have to be true before the first of these can flip
78
`environmentAvailable`, and neither is cheap:
73 79
74 80
- **The image.** `packages/openagents-cli` sits in a 117-package pnpm
75 81
  workspace, so the environment is a repo snapshot plus an install, not a
packages/coder-effectiveness/README.md modified +8 -6

@@ -69,7 +69,7 @@ A manifest task carries its identity rather than its label:

69 69
    "commit": "69671fbaac6d67a7ef0dfec016cc38a64ef7a77c",
70 70
    "path": "regex-log"
71 71
  },
72
  "environmentProven": true
72
  "environmentAvailable": true
73 73
}
74 74
```
75 75

@@ -79,10 +79,12 @@ anything: `regex-log` names a task whose content moved when the dataset moved,

79 79
and a suite that pinned only names would report two different measurements
80 80
under one heading.
81 81
82
`environmentProven` is whether a container for this task has ever been built
83
and graded. A `score` suite may not hold an unproven task — a trial nobody
84
could run reads as the coder failing rather than as a missing environment — so
85
an owned task lives in a `smoke` suite until somebody proves it.
82
`environmentAvailable` is whether a container and verifier that can grade this
83
task exist. A registry task has them by construction; an owned task drawn from
84
a closed issue has neither until somebody writes them. A `score` suite may not
85
hold a task with no gradeable environment — a trial nobody can run reads as the
86
coder failing rather than as a missing environment — so the owned tasks live in
87
a `smoke` suite until their environments are written.
86 88
87 89
## A smoke run is never a published score, structurally
88 90

@@ -304,7 +306,7 @@ leaves unpriced stays unpriced here — that omission is the signal.

304 306
305 307
- **The owned lane's environments.** Six closed issues are pinned to their
306 308
  closing commits and none of them has a container that can grade it, so they
307
  are `environmentProven: false` and their suite is `smoke`.
309
  are `environmentAvailable: false` and their suite is `smoke`.
308 310
  `bench/tasks/owned/README.md` has the construction and the two things that
309 311
  have to be true before the first one is admitted to a score.
310 312
- **Per-model cost from the coder's own trajectory.** The ATIF exporter writes
packages/coder-effectiveness/fixtures/fixture-suite-3.suite.json modified +3 -3

@@ -13,7 +13,7 @@

13 13
        "commit": "69671fbaac6d67a7ef0dfec016cc38a64ef7a77c",
14 14
        "path": "build-cmake"
15 15
      },
16
      "environmentProven": true
16
      "environmentAvailable": true
17 17
    },
18 18
    {
19 19
      "id": "fix-git",

@@ -24,7 +24,7 @@

24 24
        "commit": "69671fbaac6d67a7ef0dfec016cc38a64ef7a77c",
25 25
        "path": "fix-git"
26 26
      },
27
      "environmentProven": true
27
      "environmentAvailable": true
28 28
    },
29 29
    {
30 30
      "id": "parse-log",

@@ -35,7 +35,7 @@

35 35
        "commit": "69671fbaac6d67a7ef0dfec016cc38a64ef7a77c",
36 36
        "path": "parse-log"
37 37
      },
38
      "environmentProven": true
38
      "environmentAvailable": true
39 39
    }
40 40
  ]
41 41
}
packages/coder-effectiveness/fixtures/fixture-suite-5.suite.json modified +5 -5

@@ -13,7 +13,7 @@

13 13
        "commit": "69671fbaac6d67a7ef0dfec016cc38a64ef7a77c",
14 14
        "path": "build-cmake"
15 15
      },
16
      "environmentProven": true
16
      "environmentAvailable": true
17 17
    },
18 18
    {
19 19
      "id": "fix-git",

@@ -24,7 +24,7 @@

24 24
        "commit": "69671fbaac6d67a7ef0dfec016cc38a64ef7a77c",
25 25
        "path": "fix-git"
26 26
      },
27
      "environmentProven": true
27
      "environmentAvailable": true
28 28
    },
29 29
    {
30 30
      "id": "parse-log",

@@ -35,7 +35,7 @@

35 35
        "commit": "69671fbaac6d67a7ef0dfec016cc38a64ef7a77c",
36 36
        "path": "parse-log"
37 37
      },
38
      "environmentProven": true
38
      "environmentAvailable": true
39 39
    },
40 40
    {
41 41
      "id": "port-forward",

@@ -46,7 +46,7 @@

46 46
        "commit": "69671fbaac6d67a7ef0dfec016cc38a64ef7a77c",
47 47
        "path": "port-forward"
48 48
      },
49
      "environmentProven": true
49
      "environmentAvailable": true
50 50
    },
51 51
    {
52 52
      "id": "never-run",

@@ -57,7 +57,7 @@

57 57
        "commit": "69671fbaac6d67a7ef0dfec016cc38a64ef7a77c",
58 58
        "path": "never-run"
59 59
      },
60
      "environmentProven": true
60
      "environmentAvailable": true
61 61
    }
62 62
  ]
63 63
}
packages/coder-effectiveness/fixtures/fixture-suite.suite.json modified +4 -4

@@ -13,7 +13,7 @@

13 13
        "commit": "69671fbaac6d67a7ef0dfec016cc38a64ef7a77c",
14 14
        "path": "build-cmake"
15 15
      },
16
      "environmentProven": true
16
      "environmentAvailable": true
17 17
    },
18 18
    {
19 19
      "id": "fix-git",

@@ -24,7 +24,7 @@

24 24
        "commit": "69671fbaac6d67a7ef0dfec016cc38a64ef7a77c",
25 25
        "path": "fix-git"
26 26
      },
27
      "environmentProven": true
27
      "environmentAvailable": true
28 28
    },
29 29
    {
30 30
      "id": "parse-log",

@@ -35,7 +35,7 @@

35 35
        "commit": "69671fbaac6d67a7ef0dfec016cc38a64ef7a77c",
36 36
        "path": "parse-log"
37 37
      },
38
      "environmentProven": true
38
      "environmentAvailable": true
39 39
    },
40 40
    {
41 41
      "id": "port-forward",

@@ -46,7 +46,7 @@

46 46
        "commit": "69671fbaac6d67a7ef0dfec016cc38a64ef7a77c",
47 47
        "path": "port-forward"
48 48
      },
49
      "environmentProven": true
49
      "environmentAvailable": true
50 50
    }
51 51
  ]
52 52
}
packages/coder-effectiveness/src/results-store.test.ts modified +1 -1

@@ -66,7 +66,7 @@ const manifestFor = (name: string) =>

66 66
        commit: "69671fbaac6d67a7ef0dfec016cc38a64ef7a77c",
67 67
        path: trial.task,
68 68
      },
69
      environmentProven: true,
69
      environmentAvailable: true,
70 70
    })),
71 71
  });
72 72
packages/coder-effectiveness/src/suite-manifest.test.ts modified +4 -4

@@ -36,7 +36,7 @@ const registryTask = (id: string, overrides: Partial<{ commit: string; path: str

36 36
    commit: overrides.commit ?? "69671fbaac6d67a7ef0dfec016cc38a64ef7a77c",
37 37
    path: overrides.path ?? id,
38 38
  },
39
  environmentProven: true,
39
  environmentAvailable: true,
40 40
});
41 41
42 42
const suite = (overrides: Partial<SuiteManifest> = {}): SuiteManifest =>

@@ -91,14 +91,14 @@ describe("parseSuiteManifest", () => {

91 91
    // The owned tasks are pinned and real and have no container yet. A score
92 92
    // over them would read their absence as the coder failing.
93 93
    expect(() =>
94
      suite({ tasks: [{ ...registryTask("regex-log"), environmentProven: false }] }),
95
    ).toThrow(/environment has never been built/u);
94
      suite({ tasks: [{ ...registryTask("regex-log"), environmentAvailable: false }] }),
95
    ).toThrow(/no environment that can grade/u);
96 96
  });
97 97
98 98
  test("allows an unproven task in a smoke suite", () => {
99 99
    const manifest = suite({
100 100
      tier: "smoke",
101
      tasks: [{ ...registryTask("regex-log"), environmentProven: false }],
101
      tasks: [{ ...registryTask("regex-log"), environmentAvailable: false }],
102 102
    });
103 103
104 104
    expect(manifest.tier).toBe("smoke");
packages/coder-effectiveness/src/suite-manifest.ts modified +25 -17

@@ -89,18 +89,26 @@ export const SuiteTaskSchema = S.Struct({

89 89
  id: S.String,
90 90
  pin: SuiteTaskPinSchema,
91 91
  /**
92
   * Whether a container for this task has been built and graded at least once.
92
   * Whether a container and verifier that can grade this task exist.
93 93
   *
94
   * An owned task drawn from a closed issue is a real, pinned piece of work
95
   * long before anybody has built an image that can grade it, and writing it
96
   * into the manifest early is how the suite records the intent. But a score
97
   * cannot include a task nobody has ever run: its absence from the results
98
   * would read as a failure of the coder rather than an absence of an
99
   * environment. So {@link parseSuiteManifest} refuses a `score` manifest that
100
   * holds an unproven task, and the suite that holds them stays `smoke` until
101
   * somebody proves them.
94
   * A `harbor-registry` task has them by construction: the dataset ships the
95
   * environment and the verifier, which is the entire reason a public subset
96
   * costs a manifest entry rather than a harness. A `tracker-closed-issue` task
97
   * has neither until somebody writes them — it is a real, pinned piece of work
98
   * with a recorded accepted outcome and no way yet to run it, and writing it
99
   * into the manifest early is how the suite records the intent.
100
   *
101
   * Note what this field does NOT claim: that the task has been run here, or
102
   * that it passed, or that its image builds on this machine. It claims a
103
   * gradeable definition exists. That is the property a suite needs, because a
104
   * score cannot include a task nobody can run at all — its absence from the
105
   * results would read as a failure of the coder rather than an absence of an
106
   * environment, and the suite would get quietly worse the day somebody added a
107
   * task and forgot to build it. So {@link parseSuiteManifest} refuses a
108
   * `score` manifest that holds one, and the suite that holds them stays
109
   * `smoke` until the environments are written.
102 110
   */
103
  environmentProven: S.Boolean,
111
  environmentAvailable: S.Boolean,
104 112
  /** One line on why this task is in the suite. Not digested. */
105 113
  rationale: S.optional(S.String),
106 114
});

@@ -150,12 +158,12 @@ export const parseSuiteManifest = (value: unknown): SuiteManifest => {

150 158
  }
151 159
152 160
  if (manifest.tier === "score") {
153
    const unproven = manifest.tasks
154
      .filter((task) => !task.environmentProven)
161
    const unavailable = manifest.tasks
162
      .filter((task) => !task.environmentAvailable)
155 163
      .map((task) => task.id);
156
    if (unproven.length > 0) {
164
    if (unavailable.length > 0) {
157 165
      throw new Error(
158
        `suite ${manifest.id} is tier score but holds ${String(unproven.length)} task(s) whose environment has never been built and graded (${unproven.join(", ")}); a task nobody has run would read as a failure of the coder rather than a missing environment`,
166
        `suite ${manifest.id} is tier score but holds ${String(unavailable.length)} task(s) with no environment that can grade them (${unavailable.join(", ")}); a task nobody can run would read as a failure of the coder rather than a missing environment`,
159 167
      );
160 168
    }
161 169
  }

@@ -168,9 +176,9 @@ export const parseSuiteManifest = (value: unknown): SuiteManifest => {

168 176
 *
169 177
 * `id` is in because it is how a trial directory names itself, so a suite that
170 178
 * renamed a task is running against a different result shape. `rationale` and
171
 * `environmentProven` are out: prose about why a task was chosen, and whether
172
 * anybody has built it yet, are facts about the suite's bookkeeping rather than
173
 * about the work the coder is asked to do.
179
 * `environmentAvailable` are out: prose about why a task was chosen, and
180
 * whether anybody has written its environment yet, are facts about the suite's
181
 * bookkeeping rather than about the work the coder is asked to do.
174 182
 */
175 183
export const taskDigestOf = (task: SuiteTask): string =>
176 184
  `task:${createHash("sha256")
packages/coder-effectiveness/src/thresholds.test.ts modified +1 -1

@@ -227,7 +227,7 @@ const tierManifest = (tier: "score" | "smoke", tasks: ReadonlyArray<string>) =>

227 227
        commit: "69671fbaac6d67a7ef0dfec016cc38a64ef7a77c",
228 228
        path: id,
229 229
      },
230
      environmentProven: true,
230
      environmentAvailable: true,
231 231
    })),
232 232
  });
233 233

This page updates live while a promote is in flight · changelog