@tangle-network/agent-bench 0.3.5 → 0.3.7
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 +13 -1
- package/dist/adapters.d.ts +15 -0
- package/dist/adapters.js +43 -0
- package/dist/adapters.js.map +1 -0
- package/dist/benchmarks/_harness.d.ts +125 -0
- package/dist/benchmarks/_harness.js +33 -0
- package/dist/benchmarks/_harness.js.map +1 -0
- package/dist/benchmarks/aec-bench.d.ts +27 -0
- package/dist/benchmarks/aec-bench.js +8 -0
- package/dist/benchmarks/aec-bench.js.map +1 -0
- package/dist/benchmarks/agentbench.d.ts +16 -0
- package/dist/benchmarks/agentbench.js +10 -0
- package/dist/benchmarks/agentbench.js.map +1 -0
- package/dist/benchmarks/appworld.d.ts +37 -0
- package/dist/benchmarks/appworld.js +14 -0
- package/dist/benchmarks/appworld.js.map +1 -0
- package/dist/benchmarks/bfcl.d.ts +18 -0
- package/dist/benchmarks/bfcl.js +10 -0
- package/dist/benchmarks/bfcl.js.map +1 -0
- package/dist/benchmarks/cad-design.d.ts +45 -0
- package/dist/benchmarks/cad-design.js +7 -0
- package/dist/benchmarks/cad-design.js.map +1 -0
- package/dist/benchmarks/cadbench.d.ts +19 -0
- package/dist/benchmarks/cadbench.js +8 -0
- package/dist/benchmarks/cadbench.js.map +1 -0
- package/dist/benchmarks/cadgenbench.d.ts +22 -0
- package/dist/benchmarks/cadgenbench.js +8 -0
- package/dist/benchmarks/cadgenbench.js.map +1 -0
- package/dist/benchmarks/commit0.d.ts +31 -0
- package/dist/benchmarks/commit0.js +10 -0
- package/dist/benchmarks/commit0.js.map +1 -0
- package/dist/benchmarks/crag.d.ts +14 -0
- package/dist/benchmarks/crag.js +9 -0
- package/dist/benchmarks/crag.js.map +1 -0
- package/dist/benchmarks/dabstep.d.ts +18 -0
- package/dist/benchmarks/dabstep.js +10 -0
- package/dist/benchmarks/dabstep.js.map +1 -0
- package/dist/benchmarks/enterpriseops-gym.d.ts +38 -0
- package/dist/benchmarks/enterpriseops-gym.js +10 -0
- package/dist/benchmarks/enterpriseops-gym.js.map +1 -0
- package/dist/benchmarks/finresearchbench.d.ts +15 -0
- package/dist/benchmarks/finresearchbench.js +8 -0
- package/dist/benchmarks/finresearchbench.js.map +1 -0
- package/dist/benchmarks/finsearchcomp.d.ts +49 -0
- package/dist/benchmarks/finsearchcomp.js +7 -0
- package/dist/benchmarks/finsearchcomp.js.map +1 -0
- package/dist/benchmarks/frames.d.ts +59 -0
- package/dist/benchmarks/frames.js +13 -0
- package/dist/benchmarks/frames.js.map +1 -0
- package/dist/benchmarks/hotpotqa.d.ts +48 -0
- package/dist/benchmarks/hotpotqa.js +15 -0
- package/dist/benchmarks/hotpotqa.js.map +1 -0
- package/dist/benchmarks/humaneval.d.ts +62 -0
- package/dist/benchmarks/humaneval.js +17 -0
- package/dist/benchmarks/humaneval.js.map +1 -0
- package/dist/benchmarks/mind2web.d.ts +41 -0
- package/dist/benchmarks/mind2web.js +9 -0
- package/dist/benchmarks/mind2web.js.map +1 -0
- package/dist/benchmarks/nomiracl.d.ts +15 -0
- package/dist/benchmarks/nomiracl.js +9 -0
- package/dist/benchmarks/nomiracl.js.map +1 -0
- package/dist/benchmarks/open-rag-bench.d.ts +14 -0
- package/dist/benchmarks/open-rag-bench.js +9 -0
- package/dist/benchmarks/open-rag-bench.js.map +1 -0
- package/dist/benchmarks/programbench.d.ts +38 -0
- package/dist/benchmarks/programbench.js +10 -0
- package/dist/benchmarks/programbench.js.map +1 -0
- package/dist/benchmarks/rag-shared.d.ts +42 -0
- package/dist/benchmarks/rag-shared.js +39 -0
- package/dist/benchmarks/rag-shared.js.map +1 -0
- package/dist/benchmarks/ragbench.d.ts +16 -0
- package/dist/benchmarks/ragbench.js +9 -0
- package/dist/benchmarks/ragbench.js.map +1 -0
- package/dist/benchmarks/simpleqa.d.ts +64 -0
- package/dist/benchmarks/simpleqa.js +11 -0
- package/dist/benchmarks/simpleqa.js.map +1 -0
- package/dist/benchmarks/swe-bench.d.ts +56 -0
- package/dist/benchmarks/swe-bench.js +14 -0
- package/dist/benchmarks/swe-bench.js.map +1 -0
- package/dist/benchmarks/t2-ragbench.d.ts +14 -0
- package/dist/benchmarks/t2-ragbench.js +9 -0
- package/dist/benchmarks/t2-ragbench.js.map +1 -0
- package/dist/benchmarks/tau-bench-shared.d.ts +26 -0
- package/dist/benchmarks/tau-bench-shared.js +10 -0
- package/dist/benchmarks/tau-bench-shared.js.map +1 -0
- package/dist/benchmarks/tau2-bench.d.ts +7 -0
- package/dist/benchmarks/tau2-bench.js +11 -0
- package/dist/benchmarks/tau2-bench.js.map +1 -0
- package/dist/benchmarks/tau3-banking.d.ts +15 -0
- package/dist/benchmarks/tau3-banking.js +9 -0
- package/dist/benchmarks/tau3-banking.js.map +1 -0
- package/dist/benchmarks/terminal-bench.d.ts +24 -0
- package/dist/benchmarks/terminal-bench.js +8 -0
- package/dist/benchmarks/terminal-bench.js.map +1 -0
- package/dist/benchmarks/toollm.d.ts +16 -0
- package/dist/benchmarks/toollm.js +10 -0
- package/dist/benchmarks/toollm.js.map +1 -0
- package/dist/benchmarks/trata-hedge.d.ts +32 -0
- package/dist/benchmarks/trata-hedge.js +7 -0
- package/dist/benchmarks/trata-hedge.js.map +1 -0
- package/dist/benchmarks/types.d.ts +107 -0
- package/dist/benchmarks/types.js +1 -0
- package/dist/benchmarks/types.js.map +1 -0
- package/dist/benchmarks/webarena-verified.d.ts +16 -0
- package/dist/benchmarks/webarena-verified.js +10 -0
- package/dist/benchmarks/webarena-verified.js.map +1 -0
- package/dist/chunk-2PVVP7GN.js +197 -0
- package/dist/chunk-2PVVP7GN.js.map +1 -0
- package/dist/chunk-2XU6OGEN.js +170 -0
- package/dist/chunk-2XU6OGEN.js.map +1 -0
- package/dist/chunk-53UPUNBZ.js +325 -0
- package/dist/chunk-53UPUNBZ.js.map +1 -0
- package/dist/chunk-5H5XV76F.js +240 -0
- package/dist/chunk-5H5XV76F.js.map +1 -0
- package/dist/chunk-7WSD27QQ.js +118 -0
- package/dist/chunk-7WSD27QQ.js.map +1 -0
- package/dist/chunk-C7T7WEK2.js +103 -0
- package/dist/chunk-C7T7WEK2.js.map +1 -0
- package/dist/chunk-CKUVRZ2T.js +251 -0
- package/dist/chunk-CKUVRZ2T.js.map +1 -0
- package/dist/chunk-HBSWHQNJ.js +30 -0
- package/dist/chunk-HBSWHQNJ.js.map +1 -0
- package/dist/chunk-HHXFIHXC.js +116 -0
- package/dist/chunk-HHXFIHXC.js.map +1 -0
- package/dist/chunk-IFAV6KEM.js +276 -0
- package/dist/chunk-IFAV6KEM.js.map +1 -0
- package/dist/chunk-INNOYXCP.js +387 -0
- package/dist/chunk-INNOYXCP.js.map +1 -0
- package/dist/chunk-J3KDJNX2.js +182 -0
- package/dist/chunk-J3KDJNX2.js.map +1 -0
- package/dist/chunk-JRWWGMK7.js +148 -0
- package/dist/chunk-JRWWGMK7.js.map +1 -0
- package/dist/chunk-JTHWEDEW.js +32 -0
- package/dist/chunk-JTHWEDEW.js.map +1 -0
- package/dist/chunk-KDIKRJGB.js +120 -0
- package/dist/chunk-KDIKRJGB.js.map +1 -0
- package/dist/chunk-LRRD7NAG.js +301 -0
- package/dist/chunk-LRRD7NAG.js.map +1 -0
- package/dist/chunk-ODT47UAY.js +221 -0
- package/dist/chunk-ODT47UAY.js.map +1 -0
- package/dist/chunk-PA2ZKHJC.js +230 -0
- package/dist/chunk-PA2ZKHJC.js.map +1 -0
- package/dist/chunk-PUIRNYI7.js +189 -0
- package/dist/chunk-PUIRNYI7.js.map +1 -0
- package/dist/chunk-PWQVGAJB.js +144 -0
- package/dist/chunk-PWQVGAJB.js.map +1 -0
- package/dist/chunk-R36V2VP7.js +169 -0
- package/dist/chunk-R36V2VP7.js.map +1 -0
- package/dist/chunk-R67DFVLO.js +142 -0
- package/dist/chunk-R67DFVLO.js.map +1 -0
- package/dist/chunk-SEVJPLZC.js +260 -0
- package/dist/chunk-SEVJPLZC.js.map +1 -0
- package/dist/chunk-SYDW647C.js +318 -0
- package/dist/chunk-SYDW647C.js.map +1 -0
- package/dist/chunk-TBKU5XQI.js +228 -0
- package/dist/chunk-TBKU5XQI.js.map +1 -0
- package/dist/chunk-TSWPNOYM.js +147 -0
- package/dist/chunk-TSWPNOYM.js.map +1 -0
- package/dist/chunk-UAIOHCUK.js +27 -0
- package/dist/chunk-UAIOHCUK.js.map +1 -0
- package/dist/chunk-UPAMRDX4.js +233 -0
- package/dist/chunk-UPAMRDX4.js.map +1 -0
- package/dist/chunk-VQRS7VUC.js +342 -0
- package/dist/chunk-VQRS7VUC.js.map +1 -0
- package/dist/chunk-X3BTXCJ4.js +262 -0
- package/dist/chunk-X3BTXCJ4.js.map +1 -0
- package/dist/chunk-X5YKXC6V.js +211 -0
- package/dist/chunk-X5YKXC6V.js.map +1 -0
- package/dist/chunk-Y6O2OCUO.js +130 -0
- package/dist/chunk-Y6O2OCUO.js.map +1 -0
- package/dist/chunk-YCGY7UIZ.js +208 -0
- package/dist/chunk-YCGY7UIZ.js.map +1 -0
- package/dist/chunk-Z7ML6L77.js +162 -0
- package/dist/chunk-Z7ML6L77.js.map +1 -0
- package/dist/chunk-ZEWMTR5M.js +136 -0
- package/dist/chunk-ZEWMTR5M.js.map +1 -0
- package/dist/index.d.ts +355 -0
- package/dist/index.js +1908 -0
- package/dist/index.js.map +1 -0
- package/package.json +26 -9
- package/scripts/run-package-tests.mjs +30 -8
- package/scripts/verify-packed-consumer.mjs +12 -1
- package/scripts/verify-pier-agent.mts +1 -0
- package/src/benchmarks/humaneval.test.mts +122 -0
- package/src/benchmarks/humaneval.ts +100 -27
- package/src/david-attribution.mts +78 -0
- package/src/david-goliath.mts +149 -0
- package/src/hev-improve.mts +25 -6
- package/src/humaneval-object-ablation.mts +201 -0
- package/src/live-improve-campaign-mbpp.mts +641 -0
- package/src/live-improve-campaign.mts +500 -0
- package/src/mbpp-structural.mts +12 -7
- package/src/stream-observe.py +45 -0
- package/src/stream-observe.tpl.html +247 -0
- package/src/supervisor-arena.mts +816 -0
- package/src/swe-arena/analyze.ts +211 -0
- package/src/swe-arena/arms.ts +788 -0
- package/src/swe-arena/bootstrap-meta.mts +188 -0
- package/src/swe-arena/bootstrap-meta.test.mts +51 -0
- package/src/swe-arena/calibrate.ts +116 -0
- package/src/swe-arena/capabilities.mts +76 -0
- package/src/swe-arena/capabilities.test.mts +57 -0
- package/src/swe-arena/capacity.ts +194 -0
- package/src/swe-arena/cell-evidence.mts +405 -0
- package/src/swe-arena/cell-evidence.test.mts +248 -0
- package/src/swe-arena/diagnosis-ensemble.test.mts +210 -0
- package/src/swe-arena/diagnosis-ensemble.ts +520 -0
- package/src/swe-arena/execution.test.mts +1170 -0
- package/src/swe-arena/fixtures/analyze.py +80 -0
- package/src/swe-arena/fixtures/excludes.txt +8 -0
- package/src/swe-arena/fixtures/gen1-salvage/README.md +45 -0
- package/src/swe-arena/fixtures/gen1-salvage/cand0-e6d7361.diff +116 -0
- package/src/swe-arena/fixtures/gen1-salvage/cand1-76a8590.diff +293 -0
- package/src/swe-arena/fixtures/holdout-preregister.log +12 -0
- package/src/swe-arena/fixtures/holdout.json +44 -0
- package/src/swe-arena/fixtures/instances.json +146 -0
- package/src/swe-arena/fixtures/ledger.jsonl +12 -0
- package/src/swe-arena/fixtures/patches/pallets__flask-5014.solo.patch +36 -0
- package/src/swe-arena/fixtures/patches/pydata__xarray-4687.sup.patch +33 -0
- package/src/swe-arena/fixtures/rejudge.jsonl +15 -0
- package/src/swe-arena/fixtures/rematch.jsonl +3 -0
- package/src/swe-arena/fixtures/rematch2.jsonl +3 -0
- package/src/swe-arena/fixtures/rematch3.jsonl +3 -0
- package/src/swe-arena/fixtures/sup-journal-true.json +19 -0
- package/src/swe-arena/fixtures/verify/astropy__astropy-13033.sh +48 -0
- package/src/swe-arena/fixtures/verify/django__django-11532.sh +50 -0
- package/src/swe-arena/fixtures/verify/matplotlib__matplotlib-20826.sh +76 -0
- package/src/swe-arena/fixtures/verify/pydata__xarray-4687.sh +44 -0
- package/src/swe-arena/fixtures/verify/pytest-dev__pytest-6197.sh +32 -0
- package/src/swe-arena/fixtures/verify/sphinx-doc__sphinx-9658.sh +51 -0
- package/src/swe-arena/fixtures/worker-tokens.json +42 -0
- package/src/swe-arena/fixtures.ts +104 -0
- package/src/swe-arena/holdout-certify.mts +408 -0
- package/src/swe-arena/holdout-certify.test.mts +160 -0
- package/src/swe-arena/judge-child.mts +37 -0
- package/src/swe-arena/manifest.mts +293 -0
- package/src/swe-arena/manifest.test.mts +169 -0
- package/src/swe-arena/materialize.ts +142 -0
- package/src/swe-arena/outer-loop.mts +2145 -0
- package/src/swe-arena/outer-loop.test.mts +696 -0
- package/src/swe-arena/parity.test.mts +87 -0
- package/src/swe-arena/proc.test.mts +174 -0
- package/src/swe-arena/proc.ts +260 -0
- package/src/swe-arena/profiles/default-author.profile.json +4 -0
- package/src/swe-arena/proposer-fanout.mts +489 -0
- package/src/swe-arena/proposer-fanout.test.mts +372 -0
- package/src/swe-arena/reconcile.ts +0 -0
- package/src/swe-arena/replay.mts +183 -0
- package/src/swe-arena/replay.test.mts +300 -0
- package/src/swe-arena/run-experiment.mts +361 -0
- package/src/swe-arena/run-supervisor.mjs +297 -0
- package/src/swe-arena/run-supervisor.test.mts +498 -0
- package/src/swe-arena/serialized-judge.ts +414 -0
- package/src/swe-arena/types.ts +166 -0
- package/src/swe-code-improve.mts +328 -0
- package/src/swe-emit-patch.mts +104 -0
- package/src/swe-improve.mts +232 -0
- package/src/swe-jail.ts +2 -2
- package/src/swe-local-proof.mts +169 -0
- package/src/swe-repro-calibrate.mts +446 -0
- package/src/swe-stream.mts +1497 -0
|
@@ -0,0 +1,211 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Typed port of the reference `fixtures/analyze.py` statistics: discordant
|
|
3
|
+
* pair extraction, exact two-sided sign test, and cost rollups.
|
|
4
|
+
*
|
|
5
|
+
* The sign test is NOT re-implemented: `mcnemar` from
|
|
6
|
+
* `@tangle-network/agent-eval` computes the identical exact two-sided
|
|
7
|
+
* binomial p on discordant pairs (`min(1, 2·P(X ≤ min(b,c)))`, X ~
|
|
8
|
+
* Binomial(b+c, 0.5)) — the same formula as `analyze.py::sign_test`.
|
|
9
|
+
*
|
|
10
|
+
* Token accounting has TWO deliberately distinct rollups:
|
|
11
|
+
* - `supBrainTokens` — what analyze.py prints as "SUP total tokens":
|
|
12
|
+
* supervisor-journal metered spend (the supervisor "brain"), journal-true
|
|
13
|
+
* where captured, else the runtime's `sup_spentTokens`.
|
|
14
|
+
* - `supTotalTokens` — brain + worker-session tokens (worker-tokens.json).
|
|
15
|
+
* This is the true SUP-arm spend (1,722,390 for the 12-run set) and the
|
|
16
|
+
* number the 2.55x SUP/SOLO ratio refers to. analyze.py never printed it;
|
|
17
|
+
* its printed 0.83x ratio is brain-only.
|
|
18
|
+
*/
|
|
19
|
+
|
|
20
|
+
import { mcnemar } from '@tangle-network/agent-eval'
|
|
21
|
+
import type { ReconciledInstance } from './reconcile'
|
|
22
|
+
import type { LedgerRow, RematchRow, WorkerTokens } from './types'
|
|
23
|
+
|
|
24
|
+
export interface PairedOutcome {
|
|
25
|
+
iid: string
|
|
26
|
+
solo: boolean
|
|
27
|
+
sup: boolean
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/** Raw ledger outcomes — analyze.py semantics (strict `is True`), sorted by iid. */
|
|
31
|
+
export function ledgerOutcomes(ledger: LedgerRow[]): PairedOutcome[] {
|
|
32
|
+
return [...ledger]
|
|
33
|
+
.sort((a, b) => (a.iid < b.iid ? -1 : a.iid > b.iid ? 1 : 0))
|
|
34
|
+
.map((r) => ({ iid: r.iid, solo: r.solo_resolved === true, sup: r.sup_resolved === true }))
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
/** Reconciled (re-judged, gold-gated) outcomes, sorted by iid. */
|
|
38
|
+
export function reconciledOutcomes(instances: ReconciledInstance[]): PairedOutcome[] {
|
|
39
|
+
return [...instances]
|
|
40
|
+
.sort((a, b) => (a.iid < b.iid ? -1 : a.iid > b.iid ? 1 : 0))
|
|
41
|
+
.map((r) => ({ iid: r.iid, solo: r.solo.resolved, sup: r.sup.resolved }))
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
export interface DiscordantSplit {
|
|
45
|
+
/** SUP resolved, SOLO not. */
|
|
46
|
+
supOnly: string[]
|
|
47
|
+
/** SOLO resolved, SUP not. */
|
|
48
|
+
soloOnly: string[]
|
|
49
|
+
both: string[]
|
|
50
|
+
neither: string[]
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
export function splitPairs(outcomes: PairedOutcome[]): DiscordantSplit {
|
|
54
|
+
const supOnly: string[] = []
|
|
55
|
+
const soloOnly: string[] = []
|
|
56
|
+
const both: string[] = []
|
|
57
|
+
const neither: string[] = []
|
|
58
|
+
for (const o of outcomes) {
|
|
59
|
+
if (o.sup && !o.solo) supOnly.push(o.iid)
|
|
60
|
+
else if (o.solo && !o.sup) soloOnly.push(o.iid)
|
|
61
|
+
else if (o.solo && o.sup) both.push(o.iid)
|
|
62
|
+
else neither.push(o.iid)
|
|
63
|
+
}
|
|
64
|
+
return { supOnly, soloOnly, both, neither }
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
export interface SignTestResult {
|
|
68
|
+
n: number
|
|
69
|
+
/** Discordant pairs where SUP (treatment) won. */
|
|
70
|
+
b: number
|
|
71
|
+
/** Discordant pairs where SOLO (control) won. */
|
|
72
|
+
c: number
|
|
73
|
+
nDiscordant: number
|
|
74
|
+
/** Exact two-sided binomial sign-test p on discordant pairs. */
|
|
75
|
+
pValue: number
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
/** Exact paired sign test, SOLO as control and SUP as treatment. */
|
|
79
|
+
export function pairedSignTest(outcomes: PairedOutcome[]): SignTestResult {
|
|
80
|
+
const result = mcnemar(
|
|
81
|
+
outcomes.map((o) => o.solo),
|
|
82
|
+
outcomes.map((o) => o.sup),
|
|
83
|
+
)
|
|
84
|
+
const { n, b, c, nDiscordant, pValue } = result
|
|
85
|
+
return { n, b, c, nDiscordant, pValue }
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
export interface CostRollup {
|
|
89
|
+
soloTokens: number
|
|
90
|
+
/** analyze.py's "SUP total tokens": journal-true brain spend, else sup_spentTokens. */
|
|
91
|
+
supBrainTokens: number
|
|
92
|
+
/** Σ worker-session tokens (worker-tokens.json; instances without workers contribute 0). */
|
|
93
|
+
supWorkerTokens: number
|
|
94
|
+
/** Brain + workers — the true SUP-arm token spend. */
|
|
95
|
+
supTotalTokens: number
|
|
96
|
+
supUsd: number
|
|
97
|
+
/** Blended $ per token from SUP runtime accounting (analyze.py's `rate`). */
|
|
98
|
+
blendedRatePerTok: number
|
|
99
|
+
soloUsdDerived: number
|
|
100
|
+
/** supBrainTokens / soloTokens — the ratio analyze.py prints (0.83x). */
|
|
101
|
+
brainTokenRatio: number
|
|
102
|
+
/** supTotalTokens / soloTokens — the true-spend ratio (2.55x). */
|
|
103
|
+
totalTokenRatio: number
|
|
104
|
+
soloWallS: number
|
|
105
|
+
supWallS: number
|
|
106
|
+
wallRatio: number
|
|
107
|
+
/** iids where the runtime's sup_spentTokens disagrees with journal-true (no-winner zeroing). */
|
|
108
|
+
telemetryGaps: string[]
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
/**
|
|
112
|
+
* Port of analyze.py's cost section over the full ledger (all 12 paired runs
|
|
113
|
+
* — cost is a property of the runs, not of the gradeable subset), extended
|
|
114
|
+
* with the worker-token rollup.
|
|
115
|
+
*/
|
|
116
|
+
export function costRollup(
|
|
117
|
+
ledger: LedgerRow[],
|
|
118
|
+
supJournalTrue: Record<string, number | null>,
|
|
119
|
+
workerTokens: Record<string, WorkerTokens>,
|
|
120
|
+
): CostRollup {
|
|
121
|
+
const rows = [...ledger].sort((a, b) => (a.iid < b.iid ? -1 : a.iid > b.iid ? 1 : 0))
|
|
122
|
+
let soloTokens = 0
|
|
123
|
+
let supBrainTokens = 0
|
|
124
|
+
let supUsd = 0
|
|
125
|
+
let soloWallS = 0
|
|
126
|
+
let supWallS = 0
|
|
127
|
+
const telemetryGaps: string[] = []
|
|
128
|
+
for (const r of rows) {
|
|
129
|
+
soloTokens += r.solo_tokens
|
|
130
|
+
const journalTrue = supJournalTrue[r.iid] ?? null
|
|
131
|
+
supBrainTokens += journalTrue ?? r.sup_spentTokens ?? 0
|
|
132
|
+
supUsd += r.sup_spentUsd ?? 0
|
|
133
|
+
soloWallS += r.solo_wall_s
|
|
134
|
+
supWallS += r.sup_wall_s
|
|
135
|
+
if (journalTrue !== null && (r.sup_spentTokens ?? 0) !== journalTrue) telemetryGaps.push(r.iid)
|
|
136
|
+
}
|
|
137
|
+
const supWorkerTokens = Object.values(workerTokens).reduce((s, w) => s + w.worker_tok, 0)
|
|
138
|
+
const supTotalTokens = supBrainTokens + supWorkerTokens
|
|
139
|
+
const blendedRatePerTok = supBrainTokens > 0 ? supUsd / supBrainTokens : 0
|
|
140
|
+
return {
|
|
141
|
+
soloTokens,
|
|
142
|
+
supBrainTokens,
|
|
143
|
+
supWorkerTokens,
|
|
144
|
+
supTotalTokens,
|
|
145
|
+
supUsd,
|
|
146
|
+
blendedRatePerTok,
|
|
147
|
+
soloUsdDerived: soloTokens * blendedRatePerTok,
|
|
148
|
+
brainTokenRatio: soloTokens > 0 ? supBrainTokens / soloTokens : 0,
|
|
149
|
+
totalTokenRatio: soloTokens > 0 ? supTotalTokens / soloTokens : 0,
|
|
150
|
+
soloWallS,
|
|
151
|
+
supWallS,
|
|
152
|
+
wallRatio: soloWallS > 0 ? supWallS / soloWallS : 0,
|
|
153
|
+
telemetryGaps,
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
/** Round label for the original head-to-head SUP run in the ledger. */
|
|
158
|
+
export type SupRound = 'SUP' | 'SUP2' | 'SUP3' | 'SUP4'
|
|
159
|
+
|
|
160
|
+
export interface RoundState {
|
|
161
|
+
round: SupRound
|
|
162
|
+
resolved: boolean
|
|
163
|
+
verifyPass: boolean
|
|
164
|
+
patchLines: number
|
|
165
|
+
verdict: 'delivered' | 'no-winner' | 'best-effort' | null
|
|
166
|
+
delivered: boolean | null
|
|
167
|
+
spentTokens: number | null
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
/**
|
|
171
|
+
* Supervisor evolution progression: the original SUP run (round 0, from the
|
|
172
|
+
* ledger) followed by each rematch round, for every instance that appears in
|
|
173
|
+
* at least one rematch file.
|
|
174
|
+
*/
|
|
175
|
+
export function roundsProgression(
|
|
176
|
+
ledger: LedgerRow[],
|
|
177
|
+
rounds: RematchRow[][],
|
|
178
|
+
): Map<string, RoundState[]> {
|
|
179
|
+
const byIid = new Map<string, RoundState[]>()
|
|
180
|
+
const rematchIids = new Set(rounds.flat().map((r) => r.iid))
|
|
181
|
+
for (const r of ledger) {
|
|
182
|
+
if (!rematchIids.has(r.iid)) continue
|
|
183
|
+
byIid.set(r.iid, [
|
|
184
|
+
{
|
|
185
|
+
round: 'SUP',
|
|
186
|
+
resolved: r.sup_resolved === true,
|
|
187
|
+
verifyPass: r.sup_verify_pass === true,
|
|
188
|
+
patchLines: r.sup_patch_lines,
|
|
189
|
+
verdict: r.sup_verdict,
|
|
190
|
+
delivered: r.sup_delivered,
|
|
191
|
+
spentTokens: r.sup_spentTokens,
|
|
192
|
+
},
|
|
193
|
+
])
|
|
194
|
+
}
|
|
195
|
+
for (const round of rounds) {
|
|
196
|
+
for (const r of round) {
|
|
197
|
+
const states = byIid.get(r.iid)
|
|
198
|
+
if (!states) throw new Error(`rematch row for ${r.iid} has no ledger baseline`)
|
|
199
|
+
states.push({
|
|
200
|
+
round: r.arm,
|
|
201
|
+
resolved: r.resolved === true,
|
|
202
|
+
verifyPass: r.verify_pass === true,
|
|
203
|
+
patchLines: r.patch_lines,
|
|
204
|
+
verdict: r.sup_verdict,
|
|
205
|
+
delivered: r.delivered,
|
|
206
|
+
spentTokens: r.spentTokens,
|
|
207
|
+
})
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
return byIid
|
|
211
|
+
}
|