@tangle-network/agent-bench 0.3.8 → 0.4.1
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/CHANGELOG.md +13 -0
- package/README.md +7 -0
- package/dist/adapters.js +23 -23
- package/dist/benchmarks/_harness.d.ts +4 -1
- package/dist/benchmarks/_harness.js +3 -1
- package/dist/benchmarks/aec-bench.js +2 -2
- package/dist/benchmarks/agentbench.js +2 -2
- package/dist/benchmarks/appworld.js +2 -2
- package/dist/benchmarks/bfcl.js +2 -2
- package/dist/benchmarks/commit0.js +2 -2
- package/dist/benchmarks/crag.js +2 -2
- package/dist/benchmarks/dabstep.js +2 -2
- package/dist/benchmarks/enterpriseops-gym.js +2 -2
- package/dist/benchmarks/finresearchbench.js +2 -2
- package/dist/benchmarks/nomiracl.js +2 -2
- package/dist/benchmarks/open-rag-bench.js +2 -2
- package/dist/benchmarks/programbench.js +2 -2
- package/dist/benchmarks/ragbench.js +2 -2
- package/dist/benchmarks/swe-bench.js +2 -2
- package/dist/benchmarks/t2-ragbench.js +2 -2
- package/dist/benchmarks/tau-bench-shared.js +2 -2
- package/dist/benchmarks/tau2-bench.js +3 -3
- package/dist/benchmarks/tau3-banking.js +3 -3
- package/dist/benchmarks/terminal-bench.js +2 -2
- package/dist/benchmarks/toollm.js +2 -2
- package/dist/benchmarks/webarena-verified.js +2 -2
- package/dist/{chunk-YSMEKBTD.js → chunk-5FEQDSCT.js} +2 -2
- package/dist/{chunk-PB64GYIG.js → chunk-67ACKDCX.js} +2 -2
- package/dist/{chunk-NQG5XDSB.js → chunk-7FKBWOQT.js} +2 -2
- package/dist/{chunk-K3BQGZCT.js → chunk-BEN6IF2X.js} +2 -2
- package/dist/{chunk-SHYIRB7I.js → chunk-BZY5QARD.js} +2 -2
- package/dist/{chunk-KP5KD6EN.js → chunk-CLIKAXKH.js} +2 -2
- package/dist/{chunk-XKEFIFIC.js → chunk-CWIOBFSP.js} +2 -2
- package/dist/{chunk-IA2FBTWC.js → chunk-CXDUTWQE.js} +2 -2
- package/dist/{chunk-RH5F53JT.js → chunk-DWALFME7.js} +2 -2
- package/dist/{chunk-V7AEBY6U.js → chunk-EEOC6QPJ.js} +21 -21
- package/dist/{chunk-WSKWVEQB.js → chunk-EIETHPD5.js} +7 -3
- package/dist/chunk-EIETHPD5.js.map +1 -0
- package/dist/{chunk-SHM6MRRF.js → chunk-GC2EPS6L.js} +2 -2
- package/dist/{chunk-IZ5M6OAC.js → chunk-GCHL6XPM.js} +2 -2
- package/dist/{chunk-IFVINJ4B.js → chunk-HQ5HCCKF.js} +2 -2
- package/dist/{chunk-7GRVHU22.js → chunk-HVW25KSX.js} +2 -2
- package/dist/{chunk-3U5TXJZS.js → chunk-J6BU3NTM.js} +2 -2
- package/dist/{chunk-XYA4XSNU.js → chunk-JSQOUKXS.js} +4 -3
- package/dist/chunk-JSQOUKXS.js.map +1 -0
- package/dist/{chunk-SVR2LKYI.js → chunk-NRMGT25X.js} +2 -2
- package/dist/{chunk-MQMRLGOG.js → chunk-QZZEAHWJ.js} +2 -2
- package/dist/{chunk-RCYQEFNX.js → chunk-WG7TM7UV.js} +3 -3
- package/dist/{chunk-HWST3SED.js → chunk-XXFF3RRD.js} +2 -2
- package/dist/{chunk-SFLA7OH3.js → chunk-ZFNOM7WR.js} +3 -3
- package/dist/{chunk-Z4TZ76N7.js → chunk-ZNCCYTFG.js} +2 -2
- package/dist/index.js +23 -23
- package/package.json +4 -4
- package/pier_agents/candidate_contract.py +238 -24
- package/pier_agents/tangle_candidate.py +75 -5
- package/scripts/trata-hedge/README.md +6 -5
- package/scripts/verify-packed-consumer.mjs +65 -1
- package/scripts/verify-pier-agent.mts +6 -4
- package/src/benchmarks/_harness.test.mts +16 -1
- package/src/benchmarks/_harness.ts +9 -2
- package/src/benchmarks/terminal-bench.ts +2 -1
- package/src/gate.ts +1 -1
- package/src/hev-eval.mts +5 -2
- package/src/hev-improve.mts +118 -73
- package/src/official-optimizer-config.mts +89 -0
- package/src/official-optimizer-config.test.mts +88 -0
- package/src/profiles.ts +2 -2
- package/src/rollout-ledger/backfill-swe-arena.test.mts +28 -24
- package/src/smoke-structural-rollout.mts +15 -9
- package/src/swe-arena/activation.mts +1 -4
- package/src/swe-arena/activation.test.mts +10 -13
- package/src/swe-arena/gepa-seat.mts +425 -131
- package/src/swe-arena/gepa-seat.test.mts +524 -100
- package/src/swe-arena/implementation-ref.test.mts +64 -0
- package/src/swe-arena/implementation-ref.ts +62 -0
- package/src/swe-arena/outer-loop.mts +103 -76
- package/src/swe-arena/proposer-fanout.mts +51 -36
- package/src/swe-arena/proposer-fanout.test.mts +0 -1
- package/src/swe-arena/proposer-provenance.mts +11 -16
- package/src/swe-arena/scratch-worktree.test.mts +55 -0
- package/src/swe-arena/scratch-worktree.ts +34 -0
- package/src/swe-code-improve.mts +24 -25
- package/src/swe-improve.mts +129 -96
- package/src/swe-local-proof.mts +6 -1
- package/src/swe-stream.mts +4 -2
- package/src/tb-container-executor.test.mts +30 -6
- package/src/tb-supervisor-sidecar.mts +2 -1
- package/src/trata-gepa.mts +182 -245
- package/dist/chunk-WSKWVEQB.js.map +0 -1
- package/dist/chunk-XYA4XSNU.js.map +0 -1
- package/src/live-improve-campaign-mbpp.mts +0 -641
- package/src/live-improve-campaign.mts +0 -500
- package/src/swe-arena/lineage-record.mts +0 -164
- package/src/swe-arena/lineage-record.test.mts +0 -115
- /package/dist/{chunk-YSMEKBTD.js.map → chunk-5FEQDSCT.js.map} +0 -0
- /package/dist/{chunk-PB64GYIG.js.map → chunk-67ACKDCX.js.map} +0 -0
- /package/dist/{chunk-NQG5XDSB.js.map → chunk-7FKBWOQT.js.map} +0 -0
- /package/dist/{chunk-K3BQGZCT.js.map → chunk-BEN6IF2X.js.map} +0 -0
- /package/dist/{chunk-SHYIRB7I.js.map → chunk-BZY5QARD.js.map} +0 -0
- /package/dist/{chunk-KP5KD6EN.js.map → chunk-CLIKAXKH.js.map} +0 -0
- /package/dist/{chunk-XKEFIFIC.js.map → chunk-CWIOBFSP.js.map} +0 -0
- /package/dist/{chunk-IA2FBTWC.js.map → chunk-CXDUTWQE.js.map} +0 -0
- /package/dist/{chunk-RH5F53JT.js.map → chunk-DWALFME7.js.map} +0 -0
- /package/dist/{chunk-V7AEBY6U.js.map → chunk-EEOC6QPJ.js.map} +0 -0
- /package/dist/{chunk-SHM6MRRF.js.map → chunk-GC2EPS6L.js.map} +0 -0
- /package/dist/{chunk-IZ5M6OAC.js.map → chunk-GCHL6XPM.js.map} +0 -0
- /package/dist/{chunk-IFVINJ4B.js.map → chunk-HQ5HCCKF.js.map} +0 -0
- /package/dist/{chunk-7GRVHU22.js.map → chunk-HVW25KSX.js.map} +0 -0
- /package/dist/{chunk-3U5TXJZS.js.map → chunk-J6BU3NTM.js.map} +0 -0
- /package/dist/{chunk-SVR2LKYI.js.map → chunk-NRMGT25X.js.map} +0 -0
- /package/dist/{chunk-MQMRLGOG.js.map → chunk-QZZEAHWJ.js.map} +0 -0
- /package/dist/{chunk-RCYQEFNX.js.map → chunk-WG7TM7UV.js.map} +0 -0
- /package/dist/{chunk-HWST3SED.js.map → chunk-XXFF3RRD.js.map} +0 -0
- /package/dist/{chunk-SFLA7OH3.js.map → chunk-ZFNOM7WR.js.map} +0 -0
- /package/dist/{chunk-Z4TZ76N7.js.map → chunk-ZNCCYTFG.js.map} +0 -0
|
@@ -199,14 +199,25 @@ async function runTask(t: HumanEvalTask): Promise<TaskRow> {
|
|
|
199
199
|
`${t.taskId}: ${result.selection.length} receipts vs ${scored.length} scored candidates`,
|
|
200
200
|
)
|
|
201
201
|
}
|
|
202
|
-
|
|
202
|
+
const receipts = result.selection.map((receipt) => {
|
|
203
|
+
if (receipt.score === undefined || receipt.reason === undefined) {
|
|
204
|
+
throw new Error(`${t.taskId}: receipt #${receipt.candidateIndex} is missing score or reason`)
|
|
205
|
+
}
|
|
206
|
+
return {
|
|
207
|
+
candidateIndex: receipt.candidateIndex,
|
|
208
|
+
selected: receipt.selected,
|
|
209
|
+
score: receipt.score,
|
|
210
|
+
reason: receipt.reason,
|
|
211
|
+
}
|
|
212
|
+
})
|
|
213
|
+
for (const r of receipts) {
|
|
203
214
|
const rec = scored[r.candidateIndex]
|
|
204
215
|
if (!rec || Math.abs(r.score - visibleCheckScore(rec.outcome)) > 1e-9) {
|
|
205
216
|
throw new Error(`${t.taskId}: receipt #${r.candidateIndex} score ${r.score} does not match the recorded outcome`)
|
|
206
217
|
}
|
|
207
218
|
}
|
|
208
219
|
|
|
209
|
-
const sampleCount =
|
|
220
|
+
const sampleCount = receipts.filter((r) => r.reason.startsWith('sample')).length
|
|
210
221
|
const samples = scored.slice(0, sampleCount)
|
|
211
222
|
if (samples.length === 0) throw new Error(`${t.taskId}: no sample candidates settled`)
|
|
212
223
|
|
|
@@ -223,7 +234,7 @@ async function runTask(t: HumanEvalTask): Promise<TaskRow> {
|
|
|
223
234
|
const sampleHidden = await Promise.all(samples.map((s) => grade(s.candidate)))
|
|
224
235
|
const selectedIdx = selectBestIndex(samples.map((s) => s.outcome))
|
|
225
236
|
const selectedHidden = sampleHidden[selectedIdx] as number
|
|
226
|
-
const winner =
|
|
237
|
+
const winner = receipts.find((r) => r.selected)
|
|
227
238
|
if (!winner) throw new Error(`${t.taskId}: no receipt marked selected`)
|
|
228
239
|
const finalIdx = winner.candidateIndex
|
|
229
240
|
const finalHidden = await grade((scored[finalIdx] as ScoredCandidate).candidate)
|
|
@@ -241,12 +252,7 @@ async function runTask(t: HumanEvalTask): Promise<TaskRow> {
|
|
|
241
252
|
finalIdx,
|
|
242
253
|
finalHidden,
|
|
243
254
|
selectedVisible: visibleCheckScore((samples[selectedIdx] as ScoredCandidate).outcome),
|
|
244
|
-
receipts
|
|
245
|
-
candidateIndex: r.candidateIndex,
|
|
246
|
-
selected: r.selected,
|
|
247
|
-
score: r.score,
|
|
248
|
-
reason: r.reason,
|
|
249
|
-
})),
|
|
255
|
+
receipts,
|
|
250
256
|
tokens: result.tokens,
|
|
251
257
|
usd: result.usd,
|
|
252
258
|
ms: result.ms,
|
|
@@ -26,7 +26,6 @@ import { run } from './proc.ts'
|
|
|
26
26
|
export const ACTIVATION_PREDICATE_RELPATH = '.improve/activation.json'
|
|
27
27
|
|
|
28
28
|
export interface ActivationPredicate {
|
|
29
|
-
version: 'v1'
|
|
30
29
|
/** One sentence: which mechanism this proves fired. */
|
|
31
30
|
description: string
|
|
32
31
|
kind: 'grep' | 'script'
|
|
@@ -53,7 +52,6 @@ export function parseActivationPredicate(raw: string): ParsedPredicate {
|
|
|
53
52
|
return { ok: false, error: 'must be a JSON object' }
|
|
54
53
|
}
|
|
55
54
|
const p = value as Record<string, unknown>
|
|
56
|
-
if (p.version !== 'v1') return { ok: false, error: `version must be "v1", got ${JSON.stringify(p.version)}` }
|
|
57
55
|
if (typeof p.description !== 'string' || p.description.trim().length === 0) {
|
|
58
56
|
return { ok: false, error: 'description must be a non-empty string' }
|
|
59
57
|
}
|
|
@@ -90,13 +88,12 @@ export function activationPredicateInstruction(): string {
|
|
|
90
88
|
'',
|
|
91
89
|
'Template (kind "grep" — a RegExp tested over the run artifacts):',
|
|
92
90
|
' {',
|
|
93
|
-
' "version": "v1",',
|
|
94
91
|
' "description": "patchRiskWarnings emitted in at least one settle",',
|
|
95
92
|
' "kind": "grep",',
|
|
96
93
|
' "pattern": "patchRiskWarnings|patch-risk",',
|
|
97
94
|
' "files": ["journal.jsonl", "workers/"]',
|
|
98
95
|
' }',
|
|
99
|
-
'Or kind "script": {"
|
|
96
|
+
'Or kind "script": {"description":"...","kind":"script","script":"grep -rq NEW_SECTION ws/.loops"}',
|
|
100
97
|
'(exit 0 in any run dir = fired).',
|
|
101
98
|
'Pick a pattern that can ONLY appear when your mechanism ran — not one that matches the diff itself.',
|
|
102
99
|
].join('\n')
|
|
@@ -26,7 +26,6 @@ describe('parseActivationPredicate', () => {
|
|
|
26
26
|
it('accepts a valid grep predicate (with optional files filters)', () => {
|
|
27
27
|
const parsed = parseActivationPredicate(
|
|
28
28
|
JSON.stringify({
|
|
29
|
-
version: 'v1',
|
|
30
29
|
description: 'patchRiskWarnings emitted in at least one settle',
|
|
31
30
|
kind: 'grep',
|
|
32
31
|
pattern: 'patchRiskWarnings|patch-risk',
|
|
@@ -38,7 +37,7 @@ describe('parseActivationPredicate', () => {
|
|
|
38
37
|
|
|
39
38
|
it('accepts a valid script predicate', () => {
|
|
40
39
|
const parsed = parseActivationPredicate(
|
|
41
|
-
JSON.stringify({
|
|
40
|
+
JSON.stringify({ description: 'x', kind: 'script', script: 'grep -rq X .' }),
|
|
42
41
|
)
|
|
43
42
|
expect(parsed.ok).toBe(true)
|
|
44
43
|
})
|
|
@@ -46,13 +45,12 @@ describe('parseActivationPredicate', () => {
|
|
|
46
45
|
it.each([
|
|
47
46
|
['not json', 'not valid JSON'],
|
|
48
47
|
['[]', 'JSON object'],
|
|
49
|
-
[JSON.stringify({
|
|
50
|
-
[JSON.stringify({
|
|
51
|
-
[JSON.stringify({
|
|
52
|
-
[JSON.stringify({
|
|
53
|
-
[JSON.stringify({
|
|
54
|
-
[JSON.stringify({
|
|
55
|
-
[JSON.stringify({ version: 'v1', description: 'x', kind: 'sql' }), 'kind'],
|
|
48
|
+
[JSON.stringify({ description: '', kind: 'grep', pattern: 'a' }), 'description'],
|
|
49
|
+
[JSON.stringify({ description: 'x', kind: 'grep' }), 'pattern'],
|
|
50
|
+
[JSON.stringify({ description: 'x', kind: 'grep', pattern: '(' }), 'RegExp'],
|
|
51
|
+
[JSON.stringify({ description: 'x', kind: 'grep', pattern: 'a', files: [1] }), 'files'],
|
|
52
|
+
[JSON.stringify({ description: 'x', kind: 'script' }), 'script'],
|
|
53
|
+
[JSON.stringify({ description: 'x', kind: 'sql' }), 'kind'],
|
|
56
54
|
])('rejects %s', (raw, want) => {
|
|
57
55
|
const parsed = parseActivationPredicate(raw)
|
|
58
56
|
expect(parsed.ok).toBe(false)
|
|
@@ -84,7 +82,6 @@ describe('runActivationPredicate', () => {
|
|
|
84
82
|
})
|
|
85
83
|
|
|
86
84
|
const grep = (pattern: string, files?: string[]) => ({
|
|
87
|
-
version: 'v1' as const,
|
|
88
85
|
description: 'd',
|
|
89
86
|
kind: 'grep' as const,
|
|
90
87
|
pattern,
|
|
@@ -127,7 +124,7 @@ describe('runActivationPredicate', () => {
|
|
|
127
124
|
})
|
|
128
125
|
|
|
129
126
|
it('script kind fires on rc=0 in any run dir, not-fired otherwise', async () => {
|
|
130
|
-
const script = (s: string) => ({
|
|
127
|
+
const script = (s: string) => ({ description: 'd', kind: 'script' as const, script: s })
|
|
131
128
|
const hit = await runActivationPredicate(script('grep -q patchRiskWarnings driver.log'), [runA, runB])
|
|
132
129
|
expect(hit.fired).toBe(true)
|
|
133
130
|
expect(hit.evidence[0]).toContain(runB)
|
|
@@ -261,11 +258,11 @@ describe('activation-predicate prefilter', () => {
|
|
|
261
258
|
await mkdir(join(args.worktreePath, '.improve'), { recursive: true })
|
|
262
259
|
await writeFile(
|
|
263
260
|
join(args.worktreePath, ACTIVATION_PREDICATE_RELPATH),
|
|
264
|
-
JSON.stringify({
|
|
261
|
+
JSON.stringify({ description: 'd', kind: 'grep', pattern: 'x' }),
|
|
265
262
|
)
|
|
266
263
|
} else if (proposer.name === 'invalid-predicate') {
|
|
267
264
|
await mkdir(join(args.worktreePath, '.improve'), { recursive: true })
|
|
268
|
-
await writeFile(join(args.worktreePath, ACTIVATION_PREDICATE_RELPATH), '{
|
|
265
|
+
await writeFile(join(args.worktreePath, ACTIVATION_PREDICATE_RELPATH), '{}')
|
|
269
266
|
}
|
|
270
267
|
return { applied: true, summary: `${proposer.name} edit` }
|
|
271
268
|
},
|