@ikon85/agent-workflow-kit 0.41.1 → 0.42.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/README.md CHANGED
@@ -469,6 +469,16 @@ the old way. Decision record:
469
469
 
470
470
  ## Release notes
471
471
 
472
+ ### 0.42.1
473
+
474
+ - changed: `docs/agents/skills/orchestrate-wave.md`
475
+
476
+ ### 0.42.0
477
+
478
+ - added: `docs/adr/0010-model-roster-replaces-the-optimization-dial.md`
479
+ - added: `docs/research/agent-task-taxonomy-benchmark-coverage.md`
480
+ - changed: `docs/adr/0006-routing-knowledge-access-and-policy-are-separate.md`
481
+
472
482
  ### 0.41.1
473
483
 
474
484
  - changed: `README.md`
@@ -1,5 +1,5 @@
1
1
  {
2
- "kitVersion": "0.41.1",
2
+ "kitVersion": "0.42.1",
3
3
  "files": [
4
4
  {
5
5
  "path": ".agents/skills/ask-matt/SKILL.md",
@@ -1,6 +1,10 @@
1
1
  # Routing knowledge, access, and policy are separate
2
2
 
3
- Status: accepted (2026-07-22, Program #197)
3
+ Status: accepted (2026-07-22, Program #197) — the optimization-dial clause is
4
+ superseded by
5
+ [ADR-0010](./0010-model-roster-replaces-the-optimization-dial.md)
6
+ (items 3 and the "Model preferences and optimization overrides" sentence below;
7
+ everything else stands)
4
8
 
5
9
  Planning cannot safely persist a concrete recommended model. Provider catalogs
6
10
  change, model names age, effort behavior differs by model, agent surfaces expose
@@ -0,0 +1,87 @@
1
+ # A Model roster replaces the optimization dial
2
+
3
+ Status: accepted (2026-07-27, Program #287, Welle 18 / #294) — supersedes the
4
+ Routing-policy clause of
5
+ [ADR-0006](./0006-routing-knowledge-access-and-policy-are-separate.md)
6
+
7
+ ADR-0006 made "optimization goals and optional advanced overrides" inputs of
8
+ the Routing policy, and setup asked the user to pick Balanced, Quality, or
9
+ Cost. That dial cannot be made to work. The goal is always the right model for
10
+ the job, and a cheap-but-weak model can cost more per completed task than a
11
+ strong one — so a Cost dial does not express a preference the resolver can act
12
+ on without knowing cost per *completed* task, which no benchmark owner
13
+ publishes. Meanwhile the dial was never read: `readRoutingProfile` has zero
14
+ callers and `resolveRoute` always returns `routing-infrastructure-missing`.
15
+
16
+ We decided the user control is a **Model roster** — a positive list of
17
+ model-and-effort pairs the user authorizes — plus three **Standard routes**
18
+ that decide when no decisive evidence covers the resolved Routing intent.
19
+
20
+ 1. **The optimization dial is removed everywhere it appears, not only from the
21
+ Routing policy.** The Routing intent loses its optimization goal too. What a
22
+ user is willing to spend is a Routing profile choice, not a property of the
23
+ work; leaving the field in the intent while the resolver ignores it would
24
+ leave a dead concept in the domain language. The glossary entry and the
25
+ intent schema both drop it.
26
+ 2. **`unreachable` and `missingInfrastructure` are kept.** They are unrelated to
27
+ the dial, and the resolver's fallback semantics depend on them.
28
+ 3. **Transport authorization belongs to the Routing profile.** Selecting Claude
29
+ Code and Codex does not authorize either to drive the other's CLI. ADR-0006
30
+ is already explicit that a detected transport is not an approved one; this
31
+ ADR names where the approval is stored — the global profile document, as its
32
+ own interview answer, narrowable per project by intersection only.
33
+ 4. **The Routing policy is derived, not stored.** The profile is the stored
34
+ personal choice and carries no revision. The policy is the constraint object
35
+ derived from profile plus inventory for one dispatch, and it carries the
36
+ composed revision so a Dispatch receipt can prove which constraints applied.
37
+ 5. **Cost is displayed and used as a tiebreak inside a cohort of identical
38
+ currency and unit — never as the ranking motor.** This is what the Cost dial
39
+ was reaching for, at the only altitude where it is honest.
40
+ 6. **The Kit ships no opinion about which models are good.** Excluding a model
41
+ is one user's preference under one subscription, not a default truth. The
42
+ inventory stays unfiltered per ADR-0006; the roster authorizes.
43
+
44
+ ## `inherit` is retained, and the condition that would have removed it
45
+
46
+ This ADR was drafted to remove `inherit` entirely if verify-spike 18c (#296)
47
+ could not prove that the session-default model-and-effort pair is readable back
48
+ and identifiable against the roster. **The spike came back positive, so
49
+ `inherit` is retained** in the constrained form: inheritance is permitted only
50
+ when the session-default pair is attested *and* inside the effective roster,
51
+ and otherwise blocks.
52
+
53
+ The condition under which `inherit` is removed entirely therefore stands as a
54
+ standing test, not a settled negative: **if the session-default pair ceases to
55
+ be readable back on a surface, `inherit` is removed for that surface rather
56
+ than left as an unprovable path.** A receipt that cannot name the pair it
57
+ inherited is not proof of anything.
58
+
59
+ The spike qualifies the retention with an identification requirement. One and
60
+ the same Claude Code session reports its default model under three different
61
+ identifiers — `opus[1m]` in `~/.claude/settings.json`, `claude-opus-5[1m]` in
62
+ the session's init event, and `claude-opus-5` in the server-returned
63
+ `message.model`. The attested channel is the one that drops the context
64
+ variant. Roster identification therefore requires an explicit normalization
65
+ rule and a decision on whether the context variant is part of pair identity;
66
+ until that rule exists, "identified against the roster" is not a check a
67
+ receipt may claim to have made.
68
+
69
+ ## Consequences
70
+
71
+ - ADR-0006's Routing-policy clause (item 3, "optimization goals and optional
72
+ advanced overrides") and its closing sentence "Model preferences and
73
+ optimization overrides remain optional advanced settings" no longer describe
74
+ the system. The rest of ADR-0006 — the separation of Evidence catalog, Access
75
+ graph, and Routing policy; detection is not authorization; the surface
76
+ adapter capability declaration; the Dispatch receipt requirement — stands
77
+ unchanged and remains the foundation this ADR builds on.
78
+ - `advanced.optimization` is removed from the Routing profile schema, and
79
+ `optimization` from the Routing policy schema, each with a deterministic
80
+ version-aware decoder that records the drop rather than silently discarding a
81
+ choice the user made.
82
+ - Setup's Balanced / Quality / Cost prompt is replaced by roster admission and
83
+ Standard-route nomination.
84
+ - Model-and-effort is pair identity. Effort domains are per model — some models
85
+ support an effort level others do not, and some carry no effort axis at all —
86
+ so a pair is authorized as a pair, never as a model with an effort attached
87
+ afterwards.
@@ -2,12 +2,165 @@
2
2
  <!-- agent-workflow-kit: project-extension/v1; skill=orchestrate-wave -->
3
3
  # Project layer — orchestrate-wave
4
4
 
5
- These stable sections are intentionally empty until the kit has proven its own landing recipe. The skill uses its generic fallback meanwhile.
5
+ Filled 2026-07-27 after Welle 18 (#289) ran the whole loop end-to-end recon,
6
+ build, integrate, verify, land, tag, publish — and proved the recipe below. The
7
+ sections were deliberately empty until then; the generic fallback carried that
8
+ run and cost it a `degraded` start plus a hand-derivation of every command here.
9
+
10
+ This repo has **no database, no dev server, no typecheck step and no browser
11
+ surface**, so several generic phases collapse to very little. Where that is the
12
+ case the section says so rather than inventing a command.
6
13
 
7
14
  ## §Setup
15
+
16
+ Nothing to start. No DB, no tunnel, no service, no dev server — Phase 0's
17
+ "start what live-verify needs" is a no-op here.
18
+
19
+ Two things that are *not* no-ops:
20
+
21
+ - `git config core.hooksPath .githooks` once per clone (worktrees inherit it).
22
+ - `npm install` in the wave worktree after fast-forwarding to `origin/main` —
23
+ the lockfile is untracked, so dependencies do not travel with the branch.
24
+
8
25
  ## §Builder Commands
26
+
27
+ Per-slice gate, run by the implementer before reporting back:
28
+
29
+ ```sh
30
+ npm test # test:node (node --test) + test:python (unittest)
31
+ ```
32
+
33
+ The fast pre-commit lints run automatically via `.githooks/pre-commit`
34
+ (~3 s, skill/manifest lints). A slice is not "green" on the fast lints alone.
35
+
9
36
  ## §Builder Hard Rules
37
+
38
+ - **Never `--no-verify`.** pre-commit and pre-push are the backstop, not an
39
+ obstacle.
40
+ - **English-first prose** in every published skill; the language census in the
41
+ maintainer suite enforces it.
42
+ - **No hardcoded board values** — labels, headings, field IDs and status names
43
+ come from `docs/agents/board-sync.md`; the portability lint blocks literals.
44
+ - **Dual-surface mirror in the same PR.** A changed `.claude/skills/<s>/SKILL.md`
45
+ needs its `.agents/skills/<s>/SKILL.md` mirror via `codex-adapter-sync` in the
46
+ same PR, never after merge.
47
+ - **Shipped-file changes must preserve the manifest/reconcile contract.**
48
+
10
49
  ## §Integration Suites
50
+
51
+ Both frameworks, every time — `npm test` runs both and a red in either is a red:
52
+
53
+ ```sh
54
+ npm test
55
+ ```
56
+
57
+ - `test:node` — `node --test` (665 tests as of 0.42.0)
58
+ - `test:python` — `python3 -m unittest discover -s scripts -p 'test_*.py'`
59
+ (522 tests as of 0.42.0)
60
+
61
+ There is no typecheck step in this repo; do not look for one. Several
62
+ negative-path tests print `[FAIL] …` lines **by design** — only the runner's own
63
+ summary and exit code decide red or green.
64
+
11
65
  ## §Verify Recipe
66
+
67
+ Central verify is the `/local-ci` full gate, run from the wave worktree root.
68
+ It mirrors the CI `test` job step for step:
69
+
70
+ ```sh
71
+ git fetch origin main
72
+ npm test
73
+ npm run kit:staleness
74
+ npm run release:guard -- --base "$(git merge-base origin/main HEAD)"
75
+ npm pack --dry-run
76
+ ```
77
+
78
+ - **No branch-name-derived guard exists here**, so the generic skill's warning
79
+ about an integrated verify branch blocking with no baseline does not apply.
80
+ No skip or override is needed.
81
+ - **No browser, no headless login, no screenshots, no console check, no DB
82
+ compare, no design/brand check.** This repo ships text; "assert the AC as a
83
+ user-visible outcome" means reading the artefact the slice produced (an ADR,
84
+ a skill body, a script's output) and the tests that pin it.
85
+ - **`release:guard` red with "shipped delta has no version bump" is not a
86
+ failure of the wave** — it means the wave touched the shipped consumer set and
87
+ the release metadata is missing. See §Landing.
88
+ - **A flaky red is possible.** `scripts/codex-exec.test.mjs` contains
89
+ timing-sensitive tests that fail under CPU contention (#345). Re-run the single
90
+ test in isolation before treating it as a real red; a test that is green in
91
+ isolation and red under load is contention, not the wave.
92
+
12
93
  ## §Headless Login
94
+
95
+ Not applicable. No application, no browser surface, no authenticated session.
96
+ Never invent a login recipe for this repo.
97
+
13
98
  ## §Landing
99
+
100
+ **One PR for the whole wave**, base `main`. `main` is protected by the
101
+ `main protection` ruleset: a PR is required, the CI job **`test`** (job name, not
102
+ the workflow name `CI`) must be green with the branch up to date, and there are
103
+ no bypass actors — `gh pr merge --admin` does not help.
104
+
105
+ - `Closes #<n>` on its own line per leaf; `Part of #<anchor>` for the anchor,
106
+ never `closes`.
107
+ - Body via temp file + `--body-file`, and **run `gh` from the repo** (it resolves
108
+ the target repo from the cwd).
109
+
110
+ **Anchor reconcile, on PR create and on merge:**
111
+
112
+ ```sh
113
+ python3 scripts/board-sync.py anchor-sync <anchor#> --dry-run # review first
114
+ python3 scripts/board-sync.py anchor-sync <anchor#>
115
+ ```
116
+
117
+ `anchor-sync` only works on a **promoted** anchor whose body carries a slice
118
+ table between `<!-- slice-table:start -->` and `<!-- slice-table:end -->`. A
119
+ stub-shaped anchor (a bullet list of slices, `wave-stub` label) makes it a no-op
120
+ that exits 1 with "no slice table found — nothing to sync". That is a promotion
121
+ gap, not a sync failure: install the table with the columns
122
+ `| # | Status | Slice | Sub-Issue | Gate | closes/refs |`, drop the `wave-stub`
123
+ label, then re-run. Do not hand-maintain the Status cells afterwards — they are
124
+ regenerated from the board.
125
+
126
+ **Completion, after merge:**
127
+
128
+ ```sh
129
+ python3 scripts/board-sync.py add --issue <anchor#> --status-role done
130
+ gh issue close <anchor#> --reason completed --comment "…"
131
+ python3 scripts/board-sync.py item-of --issue <anchor#> # re-read: status must be Done
132
+ python3 scripts/board-sync.py parent-of <anchor#> # Program-PRD?
133
+ python3 scripts/board-sync.py program-sync <prd#> # after the anchor is Done
134
+ ```
135
+
136
+ Closing the issue does **not** move the board field — set the field, then re-read
137
+ both.
138
+
139
+ **New issues** go through `python3 scripts/board-sync.py create --title … --body-file …`,
140
+ never a bare `gh issue create`.
141
+
142
+ ### Release lockstep
143
+
144
+ There is no deploy and no migration, but there **is** a publication gate, and a
145
+ wave that touches the shipped consumer set (anything in the kit manifest —
146
+ including `docs/adr/*` and `docs/research/*`) drags it along.
147
+
148
+ 1. `npm run release:prepare -- --base origin/main` reports the delta and a
149
+ `recommendedBump` without writing anything.
150
+ 2. **The confirmed Semver is the one human gate.** Ask, unless an explicit
151
+ end-to-end mandate covers release preparation. That confirmed version then
152
+ authorizes metadata, merge, tag *and* publish — do not ask again after merge.
153
+ 3. `npm run release:prepare -- --version <x.y.z>`, commit the bump.
154
+ 4. Merge the PR. Merging **integrates only**; it cannot publish.
155
+ 5. Verify on canonical `main`: tip == merge commit, `package.json` version
156
+ matches, no existing tag. Then `git tag -a v<x.y.z> <main-tip> -m "…"` and
157
+ push. The annotated tag on the `main` tip is the sole publication intent.
158
+ 6. **A red release run does not prove nothing was published.** Read
159
+ `npm view @ikon85/agent-workflow-kit version` and `gh release view v<x.y.z>`
160
+ directly, plus `npm run release:status` (cache-bypassing), before reacting.
161
+ 7. **Recovery is `gh workflow run release.yml -f tag=v<x.y.z>` on the existing
162
+ tag** — the reconciler is idempotent. **Never recover by bumping the version.**
163
+
164
+ The release workflow runs the full suite *after* the tag is pushed, so a flaky
165
+ test strands an already-published tag. That is the recovery path above, not a
166
+ reason to re-tag.
@@ -0,0 +1,451 @@
1
+ # Agent task taxonomy and benchmark coverage
2
+
3
+ **Researched:** 2026-07-26
4
+ **Question:** Which agent task classes do recognized benchmark owners actually
5
+ distinguish, which of those classes carry evidence strong enough to pick a
6
+ model **and** an effort level, and how does that generalize the Kit's existing
7
+ frontend taxonomy?
8
+
9
+ ## Verdict
10
+
11
+ Benchmark owners distinguish **more task classes than the Kit currently models,
12
+ but far fewer domains**. Of the seven candidate classes in the brief, six are
13
+ directly measured by an owner today; one (architecture/judgment work) exists
14
+ only as a static knowledge quiz, not as an agent measurement.
15
+
16
+ Three findings drive the proposed schema:
17
+
18
+ 1. **Effort identity is the scarce resource, not the task class.** Only four
19
+ sources publish a row that names model **and** reasoning effort **and**
20
+ harness: DeepSWE, the Terminal-Bench leaderboard, Artificial Analysis'
21
+ per-evaluation leaderboards, and Scale's SWE Atlas boards. Everything else
22
+ collapses at least one of the three.
23
+ 2. **Almost nobody reports per-domain scores.** Code Arena is the only source in
24
+ this survey that publishes a separate score per subject-matter domain. Every
25
+ other owner publishes one aggregate over a task mix whose composition is
26
+ documented but not scored separately. The Kit's `domain` segment is therefore
27
+ `general` for most of the taxonomy — that is a coverage fact, not a schema
28
+ defect.
29
+ 3. **No owner publishes cost per *completed* task.** Every cost figure found is
30
+ cost per *attempted* task (or per whole run). Cost per success is derivable
31
+ but is an inference the Kit must label as such.
32
+
33
+ ## 0. Method: what counts as decisive
34
+
35
+ The repo already carries a per-source `decisive` boolean
36
+ (`src/lib/frontendWorkloads.mjs`). This note evaluates it against a three-part
37
+ test, because a single boolean turned out to hide the interesting failure mode:
38
+
39
+ | Dimension | Question | Failure mode |
40
+ |---|---|---|
41
+ | **Triple match** | Does the owner measure this exact `workload:domain:axis`, or is it an aggregate the Kit is slicing? | Aggregate laundering |
42
+ | **Configuration identity** | Does the published row name the reasoning effort? | Effort collapse |
43
+ | **Harness identity** | Does the published row name the agent/scaffold and its version? | Harness collapse |
44
+
45
+ **Decisive** = all three hold. **Diagnostic** = the owner measures something
46
+ relevant but at least one dimension is collapsed, estimated, or stale.
47
+
48
+ This is a stricter reading than the current boolean. Under it, two sources the
49
+ repo currently marks `decisive: true` are decisive on the triple and on harness,
50
+ but **not** on effort — see §4.
51
+
52
+ ## 1. Proposed taxonomy: `workload:domain:axis`
53
+
54
+ The identity format is unchanged: three colon-free segments, exactly one axis
55
+ per observation (`evidenceWorkloadIdentity` in `src/lib/routingIntent.mjs`).
56
+
57
+ ### 1.1 Containment of the existing frontend taxonomy
58
+
59
+ The existing frontend vocabulary is a **strict subset**, unchanged:
60
+
61
+ - workloads `frontend-greenfield`, `frontend-repository-repair` keep their
62
+ identifiers and their meaning (lifecycle × repository context);
63
+ - all eight frontend domains (`general`, `reference-design`, `marketing`,
64
+ `analytics`, `product`, `game`, `simulation`, `editor`) keep their identifiers
65
+ and remain valid **only** for the two frontend workloads;
66
+ - all five existing axes keep their identifiers. Four (`visual-preference`,
67
+ `visual-fidelity`, `accessibility`, `responsive`) stay frontend-scoped; one
68
+ (`functional`) is promoted to the general executable-verifier axis, which is
69
+ exactly how it is already used for `openhands-frontend`.
70
+
71
+ Nothing in `FRONTEND_SOURCE_CLAIMS`, `classifyFrontendWorkload`, or
72
+ `frontendEvidenceWorkload` needs a value change to fit under the general
73
+ taxonomy. The generalization is additive.
74
+
75
+ ### 1.2 Workloads
76
+
77
+ A workload is **what the agent is asked to change or produce**, defined by
78
+ lifecycle × repository context — the same rule the frontend pair already
79
+ follows.
80
+
81
+ | Workload | Definition | Owner that measures it |
82
+ |---|---|---|
83
+ | `frontend-greenfield` | New UI from a prompt or prototype, isolated from a repo | [Code Arena WebDev](https://arena.ai/leaderboard/code/webdev) |
84
+ | `frontend-repository-repair` | Fix/extend UI inside an established repo | [SWE-bench Multimodal](https://www.swebench.com/multimodal), [OpenHands Index](https://index.openhands.dev/) |
85
+ | `repository-repair` | Issue → patch in an established non-frontend repo | [DeepSWE](https://deepswe.datacurve.ai/), [SWE-bench Verified](https://www.swebench.com/verified) |
86
+ | `repository-comprehension` | Answer questions about an existing system without changing it | [SWE Atlas Codebase QnA](https://labs.scale.com/leaderboard/sweatlas-qna) |
87
+ | `code-transformation` | Restructure code while preserving behavior (refactor, migration) | [SWE Atlas Refactoring](https://labs.scale.com/leaderboard/sweatlas-refactoring), [RefactorBench](https://arxiv.org/abs/2503.07832) |
88
+ | `test-authoring` | Write tests that catch a stated regression | [SWE Atlas Test Writing](https://labs.scale.com/leaderboard/sweatlas-tw) |
89
+ | `greenfield-application` | Build a new non-frontend app/library from a spec | [OpenHands Index](https://www.openhands.dev/blog/openhands-index) (commit0) |
90
+ | `algorithmic-synthesis` | Self-contained competitive-programming style problems | [LiveCodeBench](https://livecodebench.github.io/) |
91
+ | `terminal-operations` | End-to-end system/CLI work in a real environment | [Terminal-Bench](https://www.tbench.ai/leaderboard/terminal-bench/2.1) |
92
+ | `tool-orchestration` | Multi-turn tool use with a simulated user under a written policy | [τ²-bench / τ³-bench](https://github.com/sierra-research/tau2-bench), [BFCL](https://gorilla.cs.berkeley.edu/leaderboard.html) |
93
+ | `knowledge-deliverable` | Produce a professional artifact (doc, sheet, slides, diagram) | [GDPval](https://arxiv.org/pdf/2510.04374), [GDPval-AA v2](https://artificialanalysis.ai/evaluations/gdpval-aa) |
94
+ | `architecture-reasoning` | Judge architectural trade-offs and system-level constraints | [SAKE](https://arxiv.org/abs/2606.29520) — **knowledge quiz only, not agentic** |
95
+ | `long-horizon-autonomy` | Cross-suite: how long an unattended run stays correct | [METR Time Horizon 1.1](https://metr.org/blog/2026-1-29-time-horizon-1-1/) |
96
+ | `long-context-operation` | Cross-suite: accuracy as a function of input length | [AA-LCR](https://artificialanalysis.ai/evaluations/artificial-analysis-long-context-reasoning), [NoLiMa](https://arxiv.org/abs/2502.05167) |
97
+
98
+ The last two are deliberately **cross-cutting** workloads rather than axes: their
99
+ owners run their own task suites, so an observation about them is not a slice of
100
+ another workload's evidence.
101
+
102
+ Mapping to the brief's candidate list:
103
+
104
+ | Candidate class in the brief | Verified? | Maps to |
105
+ |---|---|---|
106
+ | mechanical / refactoring | **yes** | `code-transformation` (SWE Atlas Refactoring is live: [Scale, 2026-05-07](https://scale.com/blog/swe-atlas-complete)) |
107
+ | algorithmics | **yes** | `algorithmic-synthesis` (LiveCodeBench scenarios) |
108
+ | debugging / repository repair | **yes** | `repository-repair` |
109
+ | frontend design | **yes** | `frontend-greenfield` (Code Arena domains) |
110
+ | architecture / judgment work | **partly** | `architecture-reasoning` exists only as multiple choice (SAKE); `knowledge-deliverable` is the closest *agentic* judgment proxy |
111
+ | long-horizon agentic work | **yes** | `long-horizon-autonomy` + `terminal-operations` |
112
+ | tool-use / orchestration | **yes** | `tool-orchestration` |
113
+
114
+ Two classes the brief did not name, but owners do distinguish and score
115
+ separately, were added: `repository-comprehension` and `test-authoring` — both
116
+ are separate SWE Atlas leaderboards, and `information gathering` / `software
117
+ testing` are separate OpenHands Index categories.
118
+
119
+ ### 1.3 Domains
120
+
121
+ A domain is a **subject-matter partition the owner scores separately**. The rule
122
+ is deliberately strict: if the owner publishes only an aggregate, the domain is
123
+ `general`, even when the owner documents a richer task mix.
124
+
125
+ | Workload | Allowed domains | Basis |
126
+ |---|---|---|
127
+ | `frontend-greenfield`, `frontend-repository-repair` | the existing eight | Code Arena publishes per-domain boards derived from >250k clustered prompts ([category methodology](https://arena.ai/blog/new-categories-code-arena/)) |
128
+ | `tool-orchestration` | `general`, `airline`, `retail`, `telecom`, `banking` | Sierra ships the domains separately ([tau2-bench](https://github.com/sierra-research/tau2-bench)); AA publishes [τ²-Bench Telecom](https://artificialanalysis.ai/evaluations/tau2-bench) and [τ³-Banking](https://artificialanalysis.ai/evaluations/tau3-banking) as separate boards |
129
+ | everything else | `general` | owner publishes one aggregate |
130
+
131
+ Documented-but-unscored partitions (record as metadata, **never** as a domain
132
+ segment, or the Kit is laundering an aggregate):
133
+
134
+ - DeepSWE: 113 tasks over 91 repos, TypeScript 35 / Go 34 / Python 34 /
135
+ JavaScript 5 / Rust 5 — one aggregate pass@1
136
+ ([DeepSWE methodology](https://deepswe.datacurve.ai/blog/deepswe)).
137
+ - Terminal-Bench 2.x: software engineering, ML, security, data science, system
138
+ administration — one aggregate accuracy
139
+ ([tbench.ai](https://www.tbench.ai/), [arXiv 2601.11868](https://arxiv.org/abs/2601.11868)).
140
+ - SWE Atlas Codebase QnA: architecture, root-cause analysis, code onboarding,
141
+ security, API integration — one aggregate resolve rate
142
+ ([Scale blog](https://scale.com/blog/swe-atlas-complete)).
143
+ - GDPval: 44 occupations across 9 sectors; the AA leaderboard reports an
144
+ aggregate Elo ([GDPval-AA v2](https://artificialanalysis.ai/evaluations/gdpval-aa)).
145
+ Whether OpenAI's own release publishes per-occupation win rates is
146
+ **unverified** — `openai.com/index/gdpval/` returned HTTP 403 to automated
147
+ fetch on 2026-07-26; the paper is at
148
+ [arXiv 2510.04374](https://arxiv.org/pdf/2510.04374).
149
+ - LiveCodeBench reports Easy/Medium/Hard columns. That is **difficulty, not
150
+ domain** — putting it in the `domain` segment would be schema abuse.
151
+
152
+ ### 1.4 Axes
153
+
154
+ An axis is the **quality dimension measured**. Five exist; six are proposed.
155
+
156
+ | Axis | Status | Meaning | Grader |
157
+ |---|---|---|---|
158
+ | `functional` | existing, generalized | executable verifier pass/fail | program |
159
+ | `visual-fidelity` | existing, frontend-scoped | similarity to a reference rendering | metric / VLM |
160
+ | `visual-preference` | existing, frontend-scoped | blinded human pairwise on rendered UI | human |
161
+ | `accessibility` | existing, frontend-scoped | WCAG-style conformance | tool / human |
162
+ | `responsive` | existing, frontend-scoped | correctness across a viewport matrix | program / VLM |
163
+ | `rubric-quality` | **new** | structured rubric score where no single pass/fail exists | rubric + judge |
164
+ | `answer-accuracy` | **new** | correctness of an answer about a system or document | judge / key |
165
+ | `blind-preference` | **new** | blinded pairwise ranking of a non-visual deliverable | human **or** LLM judge — record which |
166
+ | `policy-adherence` | **new** | compliance with a written domain policy during tool use | program |
167
+ | `time-horizon` | **new** | human task length at a fixed success probability | fitted from runs |
168
+ | `context-retention` | **new** | accuracy as a function of input length | program / judge |
169
+
170
+ `visual-preference` is conceptually the frontend special case of
171
+ `blind-preference`; it is kept as a distinct identifier for backward
172
+ compatibility, and because its grader is always human whereas GDPval-AA v2 uses
173
+ an LLM judge ([AA GDPval-AA](https://artificialanalysis.ai/evaluations/gdpval-aa))
174
+ while OpenAI's own GDPval uses human expert graders
175
+ ([arXiv 2510.04374](https://arxiv.org/pdf/2510.04374)). An adapter that merges
176
+ those two grader types into one axis is fabricating comparability.
177
+
178
+ ### 1.5 Cost is not an axis
179
+
180
+ `validateObservation` in `src/lib/routingCatalog.mjs` already carries
181
+ `cost.{amount,currency,unit}` on every observation. Cost must stay there. Making
182
+ it an axis would produce identities like `repository-repair:general:cost` that
183
+ have no owner behind them, and would let a cheap-but-failing configuration
184
+ outrank a working one. See §6 for what `unit` may legitimately contain.
185
+
186
+ ## 2. Source table
187
+
188
+ `Decisive` uses the §0 three-part test. `Freshness` is what was observable on
189
+ 2026-07-26; where an owner publishes no cadence statement, that is stated.
190
+
191
+ | Source | Workloads claimed | Axes | Decisive? | Freshness / cadence | Machine-ingestible artifact |
192
+ |---|---|---|---|---|---|
193
+ | **DeepSWE v1.1** (DataCurve) | `repository-repair:general` | `functional` | **Yes** — `reasoning_effort`, `harness: mini-swe-agent`, `config`, `ci_method` all in the JSON | `generated_at` 2026-07-25T03:13Z, latest job finished 2026-07-25; **no published cadence** | [`/artifacts/v1.1/leaderboard-live.json`](https://deepswe.datacurve.ai/artifacts/v1.1/leaderboard-live.json) (HTTP 200, ~62 KB) |
194
+ | **Terminal-Bench 2.1 leaderboard** (Laude Institute) | `terminal-operations:general` | `functional` | **Yes** — columns are Rank, Agent, Model, **Effort**, Accuracy ±CI, Date, Agent Org, Model Org, PR, Hacks, Cost | latest submissions 2026-07-11; **no cadence statement** | **None found.** `www.tbench.ai/api/leaderboard` → 404. Task registry only: [`registry.json`](https://raw.githubusercontent.com/harbor-framework/terminal-bench/main/registry.json). Run-log repos exist but are empty scaffolds ([terminal-bench-2-leaderboard](https://github.com/laude-institute/terminal-bench-2-leaderboard)) |
195
+ | **Artificial Analysis — per-evaluation boards** | `terminal-operations`, `tool-orchestration`, `knowledge-deliverable`, `long-context-operation`, `algorithmic-synthesis` (all `:general`) | `functional`, `policy-adherence`, `blind-preference`, `answer-accuracy` | **Yes** for boards that expose effort-variant rows — verified on [Terminal-Bench v2.1](https://artificialanalysis.ai/evaluations/terminalbench-v2-1) ("GPT-5.6 Sol (xhigh)", "GPT-5.6 Terra (max)", harness named as *Terminus 2 in an e2b sandbox*) | Intelligence Index v4.1 current; Coding Agent Index v1.3 current with a May–Jul 2026 change history; **AA states no fixed refresh schedule** ([methodology](https://artificialanalysis.ai/methodology/intelligence-benchmarking)) | [Data API](https://artificialanalysis.ai/data-api/docs) — snake_case JSON; cost lives under `artificial_analysis_intelligence_index_cost.cost_per_task`. **There is no `costPerTaskUsd` field** (see §6). Attribution required at all tiers |
196
+ | **Artificial Analysis — Coding Agent Index v1.3** | `repository-repair`, `terminal-operations`, `repository-comprehension` (`:general`) | `functional`, `answer-accuracy` | **No — effort collapse by design.** AA states: *"Unless otherwise specified, we use each agent's default reasoning settings so the benchmark reflects the default user experience"* | v1.3 current, history May–Jul 2026 | [coding-agents methodology](https://artificialanalysis.ai/methodology/coding-agents-benchmarking) |
197
+ | **SWE Atlas** (Scale) — QnA / Test Writing / Refactoring | `repository-comprehension`, `test-authoring`, `code-transformation` (`:general`) | `answer-accuracy`, `rubric-quality` | **Yes on QnA and Test Writing** — rows read e.g. *"Opus 4.8 (Claude Code) xhigh"*; native scaffold named, effort in the label, resolve rate ± CI. **Refactoring: effort exposure unverified** — the rendered rows observed showed model + harness + `48.57±6.73` but no effort token | Refactoring board went live with [Scale's 2026-05-07 post](https://scale.com/blog/swe-atlas-complete); dataset repo pushed 2026-07-20; **no cadence statement** | Dataset + run config only, Apache-2.0: [scaleapi/SWE-Atlas](https://github.com/scaleapi/SWE-Atlas). **No results JSON found** |
198
+ | **Code Arena WebDev** (Arena) | `frontend-greenfield:{8 domains}` | `visual-preference` | **Partly.** Triple ✓ (only source with real per-domain boards), harness ✓ (encoded in labels such as `-codex`), **effort ✗** — the board columns are Rank, Model, Organization, License, Score, Votes, Price ($/M), Context Length; effort appears only when a lab bakes it into the model label | live pairwise voting; page timestamp 2026-07-24, 477,155 votes observed on the WebDev board; changes tracked in the [leaderboard changelog](https://arena.ai/blog/leaderboard-changelog/) | **No leaderboard API found.** Ranking code is open ([arena-rank](https://github.com/lmarena/arena-rank)); raw votes are released as a HF dataset (`lmarena-ai/arena-human-preference-140k`) but that is votes, not the published board |
199
+ | **OpenHands Index** | `repository-repair`, `greenfield-application`, `frontend-repository-repair`, `test-authoring`, `repository-comprehension` (`:general`) | `functional` | **No — effort collapse.** Harness ✓ (OpenHands Software Agent SDK), triple ✓, but no reasoning-effort dimension is reported | launched [2026-01-29](https://www.openhands.dev/blog/openhands-index); [3-months-out update 2026-05-11](https://www.openhands.dev/blog/openhands-index-3-months-out) states only *"looking to do some more frequent updates going forward"* | Board at [index.openhands.dev](https://index.openhands.dev/) (no export found); harness open-sourced at [OpenHands/benchmarks](https://github.com/OpenHands/benchmarks), pushed 2026-07-19 |
200
+ | **SWE-bench** (Verified / Multimodal / Lite / Multilingual) | `repository-repair:general`, `frontend-repository-repair:general` | `functional` | **No.** Submissions are self-reported with heterogeneous scaffolds; the *Verified* badge is opt-in (maintainers re-run a random subset). `metadata.yaml` may carry scaffold/effort, but it is not a guaranteed, uniform column | [SWE-bench/experiments](https://github.com/SWE-bench/experiments) last commit **2026-03-29** — ~4 months stale | Per-submission `all_preds.jsonl`/`preds.json`, `metadata.yaml`, `logs/*/report.json`, `trajs/` in [SWE-bench/experiments](https://github.com/SWE-bench/experiments) |
201
+ | **METR Time Horizon 1.1** | `long-horizon-autonomy:general` | `time-horizon` | **No — effort collapse.** Per-model p50/p80 horizons with bootstrapped CIs and a `scaffolds` list, but **no reasoning-effort field** in the entries inspected | TH1.1 published [2026-01-29](https://metr.org/blog/2026-1-29-time-horizon-1-1/); [time-horizons page](https://metr.org/time-horizons/) latest entry 2026-05-08, updated *"periodically whenever we have new measurements"*; [eval-analysis-public](https://github.com/METR/eval-analysis-public) pushed 2026-03-06 | [`benchmark_results_1_1.yaml`](https://metr.org/assets/benchmark_results_1_1.yaml) (HTTP 200, ~16 KB) — contains `p50_horizon_length`/`p80_horizon_length` with `ci_low`/`ci_high`, `average_score`, `release_date`, `scaffolds`, plus `doubling_time_in_days` |
202
+ | **BFCL V4** (Berkeley/Gorilla) | `tool-orchestration:general` | `functional` | **No — effort collapse.** Cost is *"an estimate of the cost for the entire benchmark"*; no per-row effort | last updated **2026-04-12**, evaluated at a pinned commit; *"will be updated periodically"* — no cadence | [ShishirPatil/gorilla](https://github.com/ShishirPatil/gorilla) (repo pushed 2026-04-13); categories in [TEST_CATEGORIES.md](https://github.com/ShishirPatil/gorilla/blob/main/berkeley-function-call-leaderboard/TEST_CATEGORIES.md); [changelog](https://github.com/ShishirPatil/gorilla/blob/main/berkeley-function-call-leaderboard/CHANGELOG.md) |
203
+ | **Aider polyglot** | `code-transformation:general` (instruction-following edit) | `functional` | **No — stale.** Effort *is* in the label (e.g. `gpt-5 (high)`) and cost is reported, but the data is ~10 months old | `polyglot_leaderboard.yml` last commit **2025-10-04** (repo itself pushed 2026-05-22) | [`polyglot_leaderboard.yml`](https://github.com/Aider-AI/aider/blob/main/aider/website/_data/polyglot_leaderboard.yml); also `refactor_leaderboard.yml`, `edit_leaderboard.yml` in the same directory |
204
+ | **LiveCodeBench** | `algorithmic-synthesis:general` | `functional` | **No.** Board columns are Rank, Model, Pass@1, Easy, Medium, Hard — no effort, no harness, no cost | official repo [LiveCodeBench/LiveCodeBench](https://github.com/LiveCodeBench/LiveCodeBench) pushed **2025-07-16**; AA's replication uses a May 2023–May 2024 problem window | [HF org](https://huggingface.co/livecodebench/); no leaderboard JSON found |
205
+ | **SWE-Lancer** (OpenAI) | `repository-repair:general`, `architecture-reasoning:general` (SWE Manager split) | `functional`, `answer-accuracy` | **No — frozen.** 1,400+ Upwork tasks worth $1M in real payouts; IC SWE graded by triple-verified end-to-end tests, manager tasks graded against the original hiring manager's choice | [openai/SWELancer-Benchmark](https://github.com/openai/SWELancer-Benchmark) **archived 2025-07-18**, redirected into `openai/preparedness`. No maintained leaderboard | [arXiv 2502.12115](https://arxiv.org/abs/2502.12115) |
206
+ | **SAKE** | `architecture-reasoning:general` | `answer-accuracy` | **No — not agentic.** 2,154 expert-curated 4-option MCQs over 8 architectural categories and 4 context-length levels, 11 models, zero-/five-shot | static paper artifact, [arXiv 2606.29520](https://arxiv.org/abs/2606.29520) | open-sourced evaluation scripts + results per the paper; no live board |
207
+ | **AA-LCR** | `long-context-operation:general` | `answer-accuracy` | **Partly** — 100 questions over 10k–100k-token documents, pass/fail via LLM judge, per-model cost/time/tokens per task. **Not segmented by context length in the published view** | part of Intelligence Index v4.1 (6% weight); no cadence statement | [AA-LCR board](https://artificialanalysis.ai/evaluations/artificial-analysis-long-context-reasoning) + Data API |
208
+ | **NoLiMa** | `long-context-operation:general` | `context-retention` | **No.** 13 models, latent-association needle retrieval; 11 of 13 fall below 50% of their short-context baseline at 32K | static paper, [arXiv 2502.05167](https://arxiv.org/abs/2502.05167); [adobe-research/NoLiMa](https://github.com/adobe-research/NoLiMa) | repo |
209
+ | **Chroma "Context Rot"** | `long-context-operation:general` | `context-retention` | **No.** 18 models, extended NIAH + LongMemEval (~113k tokens) + repeated-words | published **2025-07-14**, one-off report | [trychroma.com/research/context-rot](https://www.trychroma.com/research/context-rot) |
210
+ | **RefactorBench** (Microsoft) | `code-transformation:general` | `functional` | **No — static.** 100 handcrafted multi-file refactors, 3 instruction specificities; agents solved 22% vs 87% for a time-limited human developer | ICLR 2025 paper, static | [arXiv 2503.07832](https://arxiv.org/abs/2503.07832), [microsoft/RefactorBench](https://github.com/microsoft/RefactorBench) |
211
+ | **GDPval / GDPval-AA v2** | `knowledge-deliverable:general` | `blind-preference` | **AA board: yes on effort/cost; no on grader parity.** 220 tasks, 44 occupations, blind pairwise, Elo anchored to a human baseline of 1000, *"average cost per task (USD), broken down by input, cache hit, cache write, reasoning, and answer tokens"* plus average turns per task. OpenAI's own grading is human-expert; AA's is an LLM judge — the two are not the same axis instance | v2 current; no cadence statement | [GDPval-AA v2 board](https://artificialanalysis.ai/evaluations/gdpval-aa) + Data API; paper [arXiv 2510.04374](https://arxiv.org/pdf/2510.04374) |
212
+
213
+ ## 3. What owners actually distinguish (question a)
214
+
215
+ Confirmed as **separately published task classes**, not inferred:
216
+
217
+ - Scale splits the engineering loop into **three separate leaderboards** —
218
+ Codebase QnA (124 tasks), Test Writing (90), Refactoring (70) — and states the
219
+ design intent: *"it targets underrepresented but practically important task
220
+ categories, uses comprehensive category-specific evaluation protocols, and
221
+ adopts under-specified, agentic task formulations"*
222
+ ([arXiv 2605.08366](https://arxiv.org/abs/2605.08366)).
223
+ - OpenHands splits into **five categories**: issue resolution, greenfield
224
+ development, frontend development, software testing, information gathering
225
+ ([launch post](https://www.openhands.dev/blog/openhands-index)).
226
+ - LiveCodeBench splits into **four scenarios**: code generation, self-repair,
227
+ test output prediction, code execution, and states that *"model performances
228
+ are correlated across different scenarios"* yet relative rankings vary by task
229
+ type ([livecodebench.github.io](https://livecodebench.github.io/)).
230
+ - SWE-bench splits by **repository population**, not by task type: Full, Lite,
231
+ Verified, Multimodal, Multilingual ([swebench.com](https://www.swebench.com/SWE-bench/)).
232
+ Multimodal is 517 visual-domain issues
233
+ ([multimodal](https://www.swebench.com/multimodal)).
234
+ - SWE-Lancer splits **IC engineering vs managerial proposal selection**
235
+ ([arXiv 2502.12115](https://arxiv.org/abs/2502.12115)).
236
+ - Code Arena splits by **subject-matter domain**, uniquely: Reference-Based
237
+ Design (~29% of prompts), Brand/Marketing, Data & Analytics, Consumer Product,
238
+ Gaming, Simulations (~15.3%), Content Creation & Editing Tools
239
+ ([category methodology](https://arena.ai/blog/new-categories-code-arena/)).
240
+ - BFCL splits by **call shape and interaction mode**: `simple_{python,java,
241
+ javascript}`, `parallel`, `multiple`, `parallel_multiple`, `irrelevance`,
242
+ `live_irrelevance`, `live_relevance`, `multi_turn_{base,miss_func,miss_param,
243
+ long_context}`, `memory_{kv,vector,rec_sum}`, `web_search_{base,no_snippet}`,
244
+ `format_sensitivity` ([TEST_CATEGORIES.md](https://github.com/ShishirPatil/gorilla/blob/main/berkeley-function-call-leaderboard/TEST_CATEGORIES.md)).
245
+
246
+ What owners **explicitly say they do not cover** — this is the most useful
247
+ primary-source material in the survey:
248
+
249
+ - DeepSWE: *"bug localization and refactoring are under-represented, even though
250
+ each is challenging in its own right"*, and *"Developers also don't use these
251
+ models through mini-swe-agent in practice; they use them inside more
252
+ sophisticated, model-native harnesses like Codex CLI, Claude Code, Cursor, and
253
+ Gemini CLI, none of which the current leaderboard directly reflects"*
254
+ ([limitations](https://deepswe.datacurve.ai/blog/deepswe)).
255
+ - SAKE: *"their ability to reason about software architecture remains largely
256
+ unmeasured"* ([arXiv 2606.29520](https://arxiv.org/abs/2606.29520)).
257
+ - Scale, on why model-plus-scaffold is the unit: native agents
258
+ *"(Claude Code, Codex CLI) perform 1.5-2x more exploration than generic
259
+ harnesses"* ([Scale blog](https://scale.com/blog/swe-atlas-complete)).
260
+ - GDPval: automated grading reached only **66% agreement with human graders**,
261
+ which is why the primary metric stays human head-to-head
262
+ ([arXiv 2510.04374](https://arxiv.org/pdf/2510.04374)).
263
+
264
+ ## 4. Decisive vs diagnostic (question b)
265
+
266
+ **Decisive today (all three dimensions intact):**
267
+
268
+ | Identity | Source |
269
+ |---|---|
270
+ | `repository-repair:general:functional` | DeepSWE v1.1 JSON |
271
+ | `terminal-operations:general:functional` | Terminal-Bench 2.1 board; AA Terminal-Bench v2.1 board |
272
+ | `repository-comprehension:general:answer-accuracy` | SWE Atlas Codebase QnA |
273
+ | `test-authoring:general:rubric-quality` | SWE Atlas Test Writing |
274
+ | `knowledge-deliverable:general:blind-preference` | AA GDPval-AA v2 (LLM judge — record the grader) |
275
+ | `tool-orchestration:{telecom,banking}:policy-adherence` | AA τ²-Telecom, AA τ³-Banking |
276
+
277
+ **Diagnostic only, with the reason:**
278
+
279
+ | Identity | Source | Collapsed dimension |
280
+ |---|---|---|
281
+ | `frontend-greenfield:{domain}:visual-preference` | Code Arena WebDev | **effort** — no effort column; only sometimes in the label |
282
+ | `frontend-repository-repair:general:functional` | OpenHands Index | **effort** — not a reported dimension |
283
+ | `code-transformation:general:rubric-quality` | SWE Atlas Refactoring | **effort** — unverified on the rendered rows |
284
+ | `greenfield-application:general:functional` | OpenHands Index | **effort** |
285
+ | `algorithmic-synthesis:general:functional` | LiveCodeBench | effort + harness + staleness (repo 2025-07) |
286
+ | `long-horizon-autonomy:general:time-horizon` | METR TH1.1 | **effort** |
287
+ | `long-context-operation:general:context-retention` | NoLiMa, Chroma | effort + harness + staleness |
288
+ | `architecture-reasoning:general:answer-accuracy` | SAKE | **not agentic at all** — MCQ knowledge |
289
+ | `repository-repair:general:functional` | SWE-bench Verified | heterogeneous self-reported scaffolds; staleness |
290
+
291
+ **Direct consequence for `src/lib/frontendWorkloads.mjs`:** the two entries
292
+ currently marked `decisive: true` (`code-arena-webdev`, `openhands-frontend`) are
293
+ decisive on triple and harness but **not on effort**. Under the current single
294
+ boolean, a resolver reading `decisive: true` may believe it can pick an effort
295
+ level from those sources. It cannot. Recommendation (not applied here): replace
296
+ the boolean with three flags — `measuresTriple`, `preservesEffort`,
297
+ `preservesHarness` — so an effort route requires `preservesEffort`, and let the
298
+ resolver fall back to a separate effort-curve source (DeepSWE, Terminal-Bench)
299
+ with the cross-source inference explicitly marked. That is the same rule
300
+ `docs/research/frontend-agent-benchmarks.md` §7.4 already states in prose; making
301
+ it a schema field prevents it from being forgotten.
302
+
303
+ ## 5. Does a smaller model degrade on long runs / large context? (question c)
304
+
305
+ **No primary source in this survey reports long-run or long-context degradation
306
+ broken down by model tier or reasoning effort.** The intuition is widely held; it
307
+ is not measured that way by any owner found.
308
+
309
+ What *is* measured:
310
+
311
+ - **METR** fits a logistic curve of success probability against *human* task
312
+ duration and reports the length at which the curve crosses 50% (and 80%). TH1.1
313
+ expanded the suite from 170 to 228 tasks and moved from Vivaria to Inspect;
314
+ 8h+ tasks doubled from 14 to 31, but **only 5 of those 31 have measured human
315
+ baselines** — the rest are estimated
316
+ ([TH1.1](https://metr.org/blog/2026-1-29-time-horizon-1-1/)). CIs come from
317
+ bootstrapping over task families, tasks, and runs. The published YAML records
318
+ `scaffolds` per model but **no effort field** in the entries inspected
319
+ ([benchmark_results_1_1.yaml](https://metr.org/assets/benchmark_results_1_1.yaml)).
320
+ Reported doubling times: 187.8 days all-time, 128.7 days (CI 104.4–158.0) from
321
+ 2023 on. **This is per model, not per tier.**
322
+ - **Toby Ord's half-life model** ([arXiv 2505.05115](https://arxiv.org/abs/2505.05115))
323
+ explains the METR curve with *"a constant rate of failing during each minute"*,
324
+ giving each agent its own half-life. The abstract does **not** claim weaker
325
+ models have systematically shorter half-lives — that stratification is an
326
+ inference, not a result.
327
+ - **NoLiMa** ([arXiv 2502.05167](https://arxiv.org/abs/2502.05167)): 11 of 13
328
+ models drop below 50% of their short-context baseline at 32K; even GPT-4o falls
329
+ from 99.3% to 69.7%. It compares 13 different models — **not size variants
330
+ within one family**.
331
+ - **Chroma "Context Rot"** ([2025-07-14](https://www.trychroma.com/research/context-rot))
332
+ tested 18 models *including* three within-family size ladders (Qwen3-8B / 32B /
333
+ 235B-A22B and GPT-4.1 / mini / nano). It is therefore the only source that
334
+ *could* have answered the tier question — and it explicitly does not. Its
335
+ size-specific remarks are behavioural quirks, not degradation curves:
336
+ *"We only observe non-attempts with Qwen3-8B, [which] make up 4.21% of tasks"*;
337
+ *"GPT-4.1 mini attempts all tasks, but sometimes generates random words for the
338
+ 'Golden Gate Bridge'/'Golden Gate Park' combination."* Its headline finding is
339
+ tier-agnostic: *"model performance degrades as input length increases, often in
340
+ surprising and non-uniform ways."*
341
+ - **AA-LCR** reports one aggregate over 10k–100k-token documents; the published
342
+ view is **not** segmented by context length
343
+ ([AA-LCR](https://artificialanalysis.ai/evaluations/artificial-analysis-long-context-reasoning)).
344
+
345
+ **Verdict for the Kit:** "route a small model away from long unattended runs" is
346
+ currently a **defensible heuristic with no decisive backing**. The closest real
347
+ evidence is indirect and within-family effort, not tier: DeepSWE's
348
+ `mean_agent_steps` / `mean_output_tokens` / `mean_duration_seconds` fields let
349
+ the Kit observe that a low-effort configuration consumes a different trajectory
350
+ shape at the same task set. Publishing that as a tier claim would be an
351
+ inference. Mark it `unverified`.
352
+
353
+ ## 6. Cost per completed task (question d)
354
+
355
+ **Verified correction to the brief: there is no `costPerTaskUsd` field.** The
356
+ Artificial Analysis Data API is snake_case; the cost object is
357
+ `artificial_analysis_intelligence_index_cost` containing `total_cost` and
358
+ `cost_per_task` (itself nested into `total_cost`, `input_cost`, `reasoning_cost`,
359
+ `answer_cost`) ([Data API docs](https://artificialanalysis.ai/data-api/docs)).
360
+
361
+ **More importantly: every source found reports cost per *attempted* task, never
362
+ cost per *completed* task.**
363
+
364
+ | Source | Cost metric published | Denominator |
365
+ |---|---|---|
366
+ | Artificial Analysis | *"Cost per Task ... calculated by multiplying input, cached, and output token prices by tokens consumed across the workload, weighted by the relative weights of each benchmark ... then dividing by task count"* | **task count** — attempted |
367
+ | AA Coding Agent Index | *"Cost to run: average pay per token API cost per task, based on provider token pricing rather than consumer plans"* ([methodology](https://artificialanalysis.ai/methodology/coding-agents-benchmarking)) | attempted |
368
+ | AA GDPval-AA v2 | *"average cost per task (USD), broken down by input, cache hit, cache write, reasoning, and answer tokens"* | attempted |
369
+ | DeepSWE | `mean_cost_usd`, `median_cost_usd` — per **attempt** | attempted |
370
+ | Terminal-Bench 2.1 board | `Cost` in USD for the whole submission run (e.g. $552.67) | whole run |
371
+ | BFCL V4 | *"an estimate of the cost for the entire benchmark, in USD"* | whole run |
372
+ | Aider polyglot | total run cost, divisible by 225 exercises | attempted |
373
+ | OpenHands Index | cost-accuracy curves per model; the [3-months-out post](https://www.openhands.dev/blog/openhands-index-3-months-out) gives only relative pricing, not absolute per-task figures | attempted |
374
+ | SWE-Lancer | $1M in Upwork **payouts earned**, not spend | neither — it is revenue, not cost |
375
+
376
+ Cost per completed task is `cost_per_attempt / pass_rate`. Both operands are
377
+ published by DeepSWE and by AA, so the Kit **can** compute it — but it is a
378
+ derived quantity and must be tagged as such, with the caveat that the two
379
+ operands must come from the same row. Concretely: `cost.unit` in
380
+ `routingCatalog.mjs` should carry `usd-per-attempt` (what owners publish) or
381
+ `usd-per-run`, and any `usd-per-success` value must be flagged as Kit-derived.
382
+
383
+ Also note the retry semantics differ and are not interchangeable: DeepSWE reports
384
+ pass@1 over four repeated whole-benchmark runs with a 95% run-to-run interval
385
+ (`ci_method: "95% run-to-run: SE across repeated whole-benchmark passes"`), AA
386
+ runs 3 attempts per task, and AA retries API failures for reliability rather than
387
+ as extra solution attempts.
388
+
389
+ ## 7. Gaps
390
+
391
+ Task classes with **no decisive source**, and what would close each:
392
+
393
+ 1. **Architecture / judgment work — the largest gap.** SAKE is 2,154 multiple
394
+ choice questions, not an agent run; SWE-Lancer's manager split is the only
395
+ agentic proxy and its repo has been archived since 2025-07-18. *Needed:* an
396
+ owner-run board where an agent produces an architectural decision inside a
397
+ real repository and is graded against the decision a senior engineer actually
398
+ made, with effort and harness in the row. Until then the Kit's `judgment`
399
+ routing workload rests on **no decisive evidence at all** — its closest proxy
400
+ is `knowledge-deliverable` (GDPval-AA), which is not software architecture.
401
+ 2. **Mechanical / refactoring at effort granularity.** SWE Atlas Refactoring is
402
+ live and names the harness, but effort exposure on its rows is unverified;
403
+ RefactorBench is a static 2025 paper; Aider's refactor/polyglot YAMLs are ~10
404
+ months stale. *Needed:* one confirmation that the Refactoring board carries
405
+ the effort token its sibling boards do. This is the cheapest gap to close —
406
+ a single human look at the rendered board settles it.
407
+ 3. **Any per-domain evidence outside frontend.** Code Arena is the sole source
408
+ with per-domain boards. Terminal-Bench, DeepSWE, and SWE Atlas QnA all
409
+ document a category mix and publish one aggregate. *Needed:* per-category
410
+ score export from any of them; until then the Kit must not emit a non-`general`
411
+ domain for those workloads.
412
+ 4. **Tier- or effort-resolved long-horizon degradation.** §5. *Needed:* a source
413
+ that reports success against task duration *per effort level*. DeepSWE already
414
+ holds both halves (effort rows + per-run duration/step statistics) and is the
415
+ most plausible candidate to publish it.
416
+ 5. **Accessibility and responsiveness.** Unchanged from
417
+ `docs/research/frontend-agent-benchmarks.md`: no current, broad, model-comparative
418
+ board. `accessibility` and `responsive` remain axes with **zero** decisive
419
+ sources.
420
+ 6. **Cost per completed task.** No owner publishes it (§6). *Needed:* nothing
421
+ external — the Kit derives it and labels it derived.
422
+ 7. **Machine-ingestible artifacts for four otherwise-strong sources.**
423
+ Terminal-Bench (no results endpoint; `/api/leaderboard` → 404), SWE Atlas (only
424
+ dataset + run config), Code Arena (no board API), OpenHands Index (no export).
425
+ Only DeepSWE, Artificial Analysis, METR, Aider, and SWE-bench/experiments can
426
+ be ingested without scraping a rendered page. Three of those five are stale by
427
+ more than 3 months.
428
+ 8. **Cadence is undeclared almost everywhere.** Only two freshness statements
429
+ were found in the whole survey: METR's *"periodically whenever we have new
430
+ measurements"* and OpenHands' *"looking to do some more frequent updates going
431
+ forward"*. Every other owner publishes dated artifacts with no promise. The
432
+ catalog's `freshness.expiresAt` therefore has to be a **Kit-side policy
433
+ decision per source**, not a value read from the owner.
434
+
435
+ ## 8. Implication for the routing catalog
436
+
437
+ Minimal changes implied by the above, in order of value:
438
+
439
+ 1. Split the `decisive` boolean into `measuresTriple` / `preservesEffort` /
440
+ `preservesHarness` (§4). An effort route requires `preservesEffort`; a
441
+ cross-source effort inference must be recorded as an inference.
442
+ 2. Constrain `domain` to `general` unless the owner publishes a separate score
443
+ for that domain (§1.3). Add a lint so a new adapter cannot introduce a domain
444
+ the owner does not score.
445
+ 3. Give `cost.unit` an explicit enum — `usd-per-attempt`, `usd-per-run`,
446
+ `usd-per-success-derived` — so a derived number is never mistaken for a
447
+ published one (§6).
448
+ 4. Treat `long-horizon-autonomy` and `long-context-operation` as first-class
449
+ workloads with their own suites, not as modifiers on other workloads (§1.2).
450
+ 5. Keep the tier-degradation heuristic in the policy layer as an explicitly
451
+ `unverified` prior, subject to override by local outcome telemetry (§5).
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ikon85/agent-workflow-kit",
3
- "version": "0.41.1",
3
+ "version": "0.42.1",
4
4
  "description": "Portable AI-agent workflow skills (plan → execute → land → learn) for Claude Code & Codex — grilling, TDD, diagnosis, two-axis code review, cross-model Codex review, design & domain-modeling, plus a skill router (ask-matt). npx init/update/diff/uninstall.",
5
5
  "type": "module",
6
6
  "bin": {