@ikon85/agent-workflow-kit 0.34.3 → 0.34.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (35) hide show
  1. package/.agents/skills/kit-release/SKILL.md +12 -0
  2. package/.agents/skills/kit-update/SKILL.md +6 -3
  3. package/.agents/skills/setup-workflow/SKILL.md +13 -5
  4. package/.agents/skills/setup-workflow/assets/agent-workflow-kit-update.yml +1 -3
  5. package/.claude/skills/kit-release/SKILL.md +12 -0
  6. package/.claude/skills/kit-update/SKILL.md +6 -3
  7. package/.claude/skills/setup-workflow/SKILL.md +13 -5
  8. package/.claude/skills/setup-workflow/assets/agent-workflow-kit-update.yml +1 -3
  9. package/README.md +17 -0
  10. package/agent-workflow-kit.package.json +12 -12
  11. package/docs/adr/0001-consumer-divergence-policy.md +4 -0
  12. package/docs/adr/0003-kit-core-and-project-extension-lifecycle.md +63 -0
  13. package/docs/agents/board-sync.md +1 -1
  14. package/docs/agents/workflow-capabilities.json +17 -0
  15. package/docs/research/benchlm-routing-source.md +198 -0
  16. package/docs/research/consumer-owned-protocol-files.md +238 -0
  17. package/docs/research/frontend-agent-benchmarks.md +282 -0
  18. package/docs/research/model-effort-routing-benchmarks.md +261 -0
  19. package/docs/research/provider-neutral-agent-routing.md +207 -0
  20. package/package.json +1 -1
  21. package/scripts/kit-update-pr.mjs +1 -1
  22. package/scripts/kit-update-pr.test.mjs +2 -0
  23. package/scripts/release-delta-guard.mjs +28 -1
  24. package/scripts/release-delta-guard.test.mjs +45 -0
  25. package/scripts/release-state.mjs +7 -3
  26. package/scripts/release-state.test.mjs +22 -0
  27. package/scripts/test_skill_readiness_contract.py +6 -1
  28. package/scripts/test_skill_setup_workflow_seeds.py +18 -17
  29. package/src/commands/update.mjs +52 -20
  30. package/src/lib/bundle.mjs +1 -1
  31. package/src/lib/updateCandidate.mjs +278 -50
  32. package/src/lib/verifyUpdateCandidate.mjs +220 -0
  33. package/src/lib/verifyUpdateCandidateArtifacts.mjs +78 -0
  34. package/src/lib/verifyUpdateCandidateProtocol.mjs +221 -0
  35. package/src/lib/verifyUpdateCandidateTransaction.mjs +152 -0
@@ -110,3 +110,15 @@ manifest and compares it with both the base and the checked-in manifest. It
110
110
  blocks an unbumped shipped delta, a stale manifest, a too-small Semver bump, or
111
111
  a dead manifest entry and prints the concrete paths. CI runs the same command;
112
112
  there is no separately remembered shipped-file list.
113
+
114
+ It also blocks a **version bump stacked on an untagged previous release**: if
115
+ the base version carries no matching annotated tag, that release is still
116
+ `awaiting-tag` and never became its own artifact. Tag and publish it first —
117
+ never bury it under the next bump. A repository with no matching tag at all is
118
+ bootstrapping its first release and is not blocked.
119
+
120
+ A red release run does not prove nothing was published. Reconstruct the real
121
+ state from the registry and the release before reacting; a stale local
122
+ packument cache can answer "not published" for a package that is live, and the
123
+ recovery route is the idempotent reconciler on the existing tag, never a new
124
+ version.
@@ -30,9 +30,12 @@ release contain the same artifact.
30
30
  ```
31
31
 
32
32
  The command checks npm/GitHub release parity before staging. It prepares a
33
- complete candidate outside the consumer, runs the consumer's existing
34
- `npm test` command there, and activates only a verified candidate. A staging
35
- or verification failure leaves the installed tree byte-identical.
33
+ complete manifest-bounded candidate outside the Consumer, verifies the
34
+ Kit-owned manifest, artifact, protocol, schema/reference, syntax, and
35
+ transaction invariants, and activates only that verified candidate. It
36
+ never runs a Consumer package script, configurable verification command, or
37
+ legacy fallback. A staging or verification failure leaves the installed
38
+ tree byte-identical.
36
39
 
37
40
  The staged candidate also adopts the current readiness schema without
38
41
  invoking `setup-workflow`: it preserves explicit readiness decisions and
@@ -81,11 +81,19 @@ Seed `docs/agents/issue-tracker.md` from the matching template in this folder: [
81
81
 
82
82
  ### 2a. Automatic Kit update pull requests (GitHub tracker only)
83
83
 
84
- > A short scheduled check can keep the installed Kit current by opening one normal pull request after the candidate passes the consumer's own tests. It never merges the pull request for you.
85
-
86
- Only after the user has confirmed a **GitHub tracker**, ask in plain language: *"Should GitHub check weekly for a tested Agent Workflow Kit update and keep one update pull request ready?"* Offer these explicit choices:
87
-
88
- Before offering **Enable**, confirm the consumer has a committed `package-lock.json` and a usable `package.json` `npm test` command. The shipped workflow installs the locked dependencies with `npm ci --ignore-scripts`; without that lockfile/test contract it cannot prove the candidate in a clean checkout, so explain the prerequisite and do not create the workflow yet.
84
+ > A short scheduled check can keep the installed Kit current by opening one
85
+ > normal pull request after the candidate passes the built-in Kit invariant
86
+ > validator. It runs no Consumer package script and never merges the pull
87
+ > request for you.
88
+
89
+ Only after the user has confirmed a **GitHub tracker**, ask in plain language:
90
+ *"Should GitHub check weekly for a verified Agent Workflow Kit update and keep
91
+ one update pull request ready?"* Offer these explicit choices:
92
+
93
+ Before offering **Enable**, explain that the update command uses the same
94
+ built-in Kit invariant validator as manual and agent-driven updates. There is
95
+ no Consumer package script, lockfile, configurable verification profile, or
96
+ legacy test fallback prerequisite.
89
97
 
90
98
  Also read the repository Actions policy before enabling:
91
99
 
@@ -23,9 +23,7 @@ jobs:
23
23
  - uses: actions/setup-node@v4
24
24
  with:
25
25
  node-version: 22.14
26
- - name: Install locked consumer dependencies
27
- run: npm ci --ignore-scripts
28
- - name: Verify, test, and upsert the Kit update pull request
26
+ - name: Verify and upsert the Kit update pull request
29
27
  env:
30
28
  GH_TOKEN: ${{ github.token }}
31
29
  run: npx --yes --package=@ikon85/agent-workflow-kit@latest agent-workflow-kit-update-pr
@@ -110,3 +110,15 @@ manifest and compares it with both the base and the checked-in manifest. It
110
110
  blocks an unbumped shipped delta, a stale manifest, a too-small Semver bump, or
111
111
  a dead manifest entry and prints the concrete paths. CI runs the same command;
112
112
  there is no separately remembered shipped-file list.
113
+
114
+ It also blocks a **version bump stacked on an untagged previous release**: if
115
+ the base version carries no matching annotated tag, that release is still
116
+ `awaiting-tag` and never became its own artifact. Tag and publish it first —
117
+ never bury it under the next bump. A repository with no matching tag at all is
118
+ bootstrapping its first release and is not blocked.
119
+
120
+ A red release run does not prove nothing was published. Reconstruct the real
121
+ state from the registry and the release before reacting; a stale local
122
+ packument cache can answer "not published" for a package that is live, and the
123
+ recovery route is the idempotent reconciler on the existing tag, never a new
124
+ version.
@@ -30,9 +30,12 @@ release contain the same artifact.
30
30
  ```
31
31
 
32
32
  The command checks npm/GitHub release parity before staging. It prepares a
33
- complete candidate outside the consumer, runs the consumer's existing
34
- `npm test` command there, and activates only a verified candidate. A staging
35
- or verification failure leaves the installed tree byte-identical.
33
+ complete manifest-bounded candidate outside the Consumer, verifies the
34
+ Kit-owned manifest, artifact, protocol, schema/reference, syntax, and
35
+ transaction invariants, and activates only that verified candidate. It
36
+ never runs a Consumer package script, configurable verification command, or
37
+ legacy fallback. A staging or verification failure leaves the installed
38
+ tree byte-identical.
36
39
 
37
40
  The staged candidate also adopts the current readiness schema without
38
41
  invoking `setup-workflow`: it preserves explicit readiness decisions and
@@ -81,11 +81,19 @@ Seed `docs/agents/issue-tracker.md` from the matching template in this folder: [
81
81
 
82
82
  ### 2a. Automatic Kit update pull requests (GitHub tracker only)
83
83
 
84
- > A short scheduled check can keep the installed Kit current by opening one normal pull request after the candidate passes the consumer's own tests. It never merges the pull request for you.
85
-
86
- Only after the user has confirmed a **GitHub tracker**, ask in plain language: *"Should GitHub check weekly for a tested Agent Workflow Kit update and keep one update pull request ready?"* Offer these explicit choices:
87
-
88
- Before offering **Enable**, confirm the consumer has a committed `package-lock.json` and a usable `package.json` `npm test` command. The shipped workflow installs the locked dependencies with `npm ci --ignore-scripts`; without that lockfile/test contract it cannot prove the candidate in a clean checkout, so explain the prerequisite and do not create the workflow yet.
84
+ > A short scheduled check can keep the installed Kit current by opening one
85
+ > normal pull request after the candidate passes the built-in Kit invariant
86
+ > validator. It runs no Consumer package script and never merges the pull
87
+ > request for you.
88
+
89
+ Only after the user has confirmed a **GitHub tracker**, ask in plain language:
90
+ *"Should GitHub check weekly for a verified Agent Workflow Kit update and keep
91
+ one update pull request ready?"* Offer these explicit choices:
92
+
93
+ Before offering **Enable**, explain that the update command uses the same
94
+ built-in Kit invariant validator as manual and agent-driven updates. There is
95
+ no Consumer package script, lockfile, configurable verification profile, or
96
+ legacy test fallback prerequisite.
89
97
 
90
98
  Also read the repository Actions policy before enabling:
91
99
 
@@ -23,9 +23,7 @@ jobs:
23
23
  - uses: actions/setup-node@v4
24
24
  with:
25
25
  node-version: 22.14
26
- - name: Install locked consumer dependencies
27
- run: npm ci --ignore-scripts
28
- - name: Verify, test, and upsert the Kit update pull request
26
+ - name: Verify and upsert the Kit update pull request
29
27
  env:
30
28
  GH_TOKEN: ${{ github.token }}
31
29
  run: npx --yes --package=@ikon85/agent-workflow-kit@latest agent-workflow-kit-update-pr
package/README.md CHANGED
@@ -387,6 +387,23 @@ the old way. Decision record:
387
387
 
388
388
  ## Release notes
389
389
 
390
+ ### 0.34.5
391
+
392
+ - changed: `.agents/skills/kit-update/SKILL.md`
393
+ - changed: `.agents/skills/setup-workflow/SKILL.md`
394
+ - changed: `.agents/skills/setup-workflow/assets/agent-workflow-kit-update.yml`
395
+ - changed: `.claude/skills/kit-update/SKILL.md`
396
+ - changed: `.claude/skills/setup-workflow/SKILL.md`
397
+ - changed: `.claude/skills/setup-workflow/assets/agent-workflow-kit-update.yml`
398
+ - changed: `scripts/kit-update-pr.mjs`
399
+
400
+ ### 0.34.4
401
+
402
+ - changed: `.agents/skills/kit-release/SKILL.md`
403
+ - changed: `.claude/skills/kit-release/SKILL.md`
404
+ - changed: `scripts/release-delta-guard.mjs`
405
+ - changed: `scripts/release-state.mjs`
406
+
390
407
  ### 0.34.3
391
408
 
392
409
  - changed: `.agents/skills/diagnose/SKILL.md`
@@ -1,5 +1,5 @@
1
1
  {
2
- "kitVersion": "0.34.3",
2
+ "kitVersion": "0.34.5",
3
3
  "files": [
4
4
  {
5
5
  "path": ".agents/skills/ask-matt/SKILL.md",
@@ -367,7 +367,7 @@
367
367
  "ownerSkill": "kit-release",
368
368
  "surface": "codex",
369
369
  "installRole": "maintainer",
370
- "sha256": "7e08d5115d34f36da08491fa3bb8d5f4ca45e2908560e8f8c924cf3fd619d7f9",
370
+ "sha256": "f584caa1753ed34de584418a4176015cc3e2382db06efae488bb6d785eab71b7",
371
371
  "mode": 420,
372
372
  "origin": "kit"
373
373
  },
@@ -377,7 +377,7 @@
377
377
  "ownerSkill": "kit-update",
378
378
  "surface": "codex",
379
379
  "installRole": "consumer",
380
- "sha256": "c3487295864d1d8d765e1c453c80daf77d3f08a2b0017f614e44e85170913624",
380
+ "sha256": "9129e14b12b573546e253e14be3b7793afe2ca2b46102bb7b5f2ec1a8276a1ec",
381
381
  "mode": 420,
382
382
  "origin": "kit"
383
383
  },
@@ -577,7 +577,7 @@
577
577
  "ownerSkill": "setup-workflow",
578
578
  "surface": "codex",
579
579
  "installRole": "consumer",
580
- "sha256": "d8abf995d67184b4459b9565c9062319fc42e8a685042b288b3066a07a6fda59",
580
+ "sha256": "dcabda3d93b7c79f35065a9f3130807ff29737e15187a68fdbc37533015d461d",
581
581
  "mode": 420,
582
582
  "origin": "kit"
583
583
  },
@@ -677,7 +677,7 @@
677
677
  "ownerSkill": "setup-workflow",
678
678
  "surface": "codex",
679
679
  "installRole": "consumer",
680
- "sha256": "7281bb67588328aa4a788cbefe69f396c4617569335ce47cfb45bb5607d3205e",
680
+ "sha256": "0f098f6efeda6682726d918135f0a66ffbf9c90616293fd3833d5fe47fc5c927",
681
681
  "mode": 420,
682
682
  "origin": "kit"
683
683
  },
@@ -1679,7 +1679,7 @@
1679
1679
  "ownerSkill": "kit-release",
1680
1680
  "surface": "claude",
1681
1681
  "installRole": "maintainer",
1682
- "sha256": "7e08d5115d34f36da08491fa3bb8d5f4ca45e2908560e8f8c924cf3fd619d7f9",
1682
+ "sha256": "f584caa1753ed34de584418a4176015cc3e2382db06efae488bb6d785eab71b7",
1683
1683
  "mode": 420,
1684
1684
  "origin": "kit"
1685
1685
  },
@@ -1689,7 +1689,7 @@
1689
1689
  "ownerSkill": "kit-update",
1690
1690
  "surface": "claude",
1691
1691
  "installRole": "consumer",
1692
- "sha256": "c3487295864d1d8d765e1c453c80daf77d3f08a2b0017f614e44e85170913624",
1692
+ "sha256": "9129e14b12b573546e253e14be3b7793afe2ca2b46102bb7b5f2ec1a8276a1ec",
1693
1693
  "mode": 420,
1694
1694
  "origin": "kit"
1695
1695
  },
@@ -1909,7 +1909,7 @@
1909
1909
  "ownerSkill": "setup-workflow",
1910
1910
  "surface": "claude",
1911
1911
  "installRole": "consumer",
1912
- "sha256": "d8abf995d67184b4459b9565c9062319fc42e8a685042b288b3066a07a6fda59",
1912
+ "sha256": "dcabda3d93b7c79f35065a9f3130807ff29737e15187a68fdbc37533015d461d",
1913
1913
  "mode": 420,
1914
1914
  "origin": "kit"
1915
1915
  },
@@ -2009,7 +2009,7 @@
2009
2009
  "ownerSkill": "setup-workflow",
2010
2010
  "surface": "claude",
2011
2011
  "installRole": "consumer",
2012
- "sha256": "7281bb67588328aa4a788cbefe69f396c4617569335ce47cfb45bb5607d3205e",
2012
+ "sha256": "0f098f6efeda6682726d918135f0a66ffbf9c90616293fd3833d5fe47fc5c927",
2013
2013
  "mode": 420,
2014
2014
  "origin": "kit"
2015
2015
  },
@@ -2535,7 +2535,7 @@
2535
2535
  "path": "scripts/kit-update-pr.mjs",
2536
2536
  "kind": "script",
2537
2537
  "installRole": "consumer",
2538
- "sha256": "83f30a4ca938171cfa2f4153917813fae40bf2a906940e047c7066d18284209b",
2538
+ "sha256": "c28bbd5a45583a92eca12758c1d626e04bce820300178b54933340759d1690fd",
2539
2539
  "mode": 493,
2540
2540
  "origin": "kit"
2541
2541
  },
@@ -2655,7 +2655,7 @@
2655
2655
  "path": "scripts/release-delta-guard.mjs",
2656
2656
  "kind": "script",
2657
2657
  "installRole": "maintainer",
2658
- "sha256": "a51f30e7261e4efb0b5c5002f39353ef8e8be18a2bd39ad7139f1ce7a2e7e18d",
2658
+ "sha256": "1d2aab5f15bca25167b166b37232139916cf814e94de873fa74a653ecf9a4619",
2659
2659
  "mode": 420,
2660
2660
  "origin": "kit"
2661
2661
  },
@@ -2671,7 +2671,7 @@
2671
2671
  "path": "scripts/release-state.mjs",
2672
2672
  "kind": "script",
2673
2673
  "installRole": "consumer",
2674
- "sha256": "23b4ffc77e9b499587fa563d067b1df9ae81b87a654d636281c7d139e5842687",
2674
+ "sha256": "fd9f7f86e26ab3faba819e0c46e5e87c2dd3a84dc9a6111b4eceb4ebe6a3a344",
2675
2675
  "mode": 420,
2676
2676
  "origin": "kit"
2677
2677
  },
@@ -2,6 +2,10 @@
2
2
 
3
3
  Status: accepted (2026-07-18, issue #130)
4
4
 
5
+ Partially superseded by ADR-0003: consumer ownership remains valid for genuine
6
+ project files, but no longer applies to Kit Core or to mixed core/extension
7
+ registries.
8
+
5
9
  Since the consumer-source cutover the kit is SSOT for shipped files, but
6
10
  consumers keep learning: edits made directly on a shipped file in a consumer
7
11
  silently fork it, and every subsequent `kit-update` reports a permanent
@@ -0,0 +1,63 @@
1
+ # Kit Core and project extensions have separate identities
2
+
3
+ Status: accepted (2026-07-22, issues #190, #194, #196, #197)
4
+
5
+ The original divergence policy allowed any shipped path to become
6
+ consumer-owned. That is safe for a genuinely project-specific file, but not for
7
+ a protocol authority such as the skill/readiness registry: once a consumer
8
+ owns that mixed file, new Kit declarations stop arriving while local additions
9
+ and stale Kit declarations remain indistinguishable. A real consumer exhibited
10
+ exactly this state: the installed readiness harness was current while its owned
11
+ registry had no readiness capabilities or declarations.
12
+
13
+ We decided to model four explicit lifecycle states instead of treating every
14
+ local difference as file ownership:
15
+
16
+ 1. **Kit Core** remains upstream-owned under the Kit's canonical identity. A
17
+ consumer cannot permanently own it under that same identity.
18
+ 2. **Project extensions** live on separate consumer-owned surfaces. Every
19
+ shipped skill may load its optional `docs/agents/skills/<skill>.md`; local
20
+ skill identities live in a separate local registry. Neither surface changes
21
+ the corresponding Kit Core.
22
+ 3. A **Contribution bridge** may temporarily retain a registered local Core
23
+ experiment. It must resolve into a project extension, a generalized upstream
24
+ contribution that returns in a release, or an explicit fork.
25
+ 4. An **Explicit fork** has its own identity, version, and update line. Semantic
26
+ divergence cannot masquerade indefinitely as the canonical Kit skill.
27
+
28
+ An update composes and validates the complete protocol group in an isolated,
29
+ manifest-derived staged candidate. It never infers an ownership decision from
30
+ `--yes`: an unclassified collision blocks unchanged until a user classifies it.
31
+ Existing mixed states migrate semantically, preserving local identities and
32
+ project metadata on their new surfaces; an ambiguous semantic change blocks
33
+ instead of being overwritten or frozen silently.
34
+
35
+ The upstream route is capability-based, not maintainer-specific. At the moment
36
+ of contribution, repository permissions and an optional machine-local upstream
37
+ checkout determine whether the approved route can use a direct pull request, a
38
+ fork, or an issue. No consumer asks who the user is, and no telemetry reports
39
+ local edits automatically.
40
+
41
+ ## Considered options
42
+
43
+ - **Keep arbitrary consumer-owned shipped paths:** rejected because a protocol
44
+ authority then stops receiving schema and behavior evolution under the same
45
+ identity.
46
+ - **Add more merge rules to the mixed registry:** rejected because local skills,
47
+ project annotations, readiness declarations, and upstream skill definitions
48
+ have different ownership and lifecycle semantics.
49
+ - **Overwrite Core and discard local changes:** rejected because it loses valid
50
+ project behavior and can destroy unregistered work.
51
+ - **Special-case the maintainer:** rejected because identity is irrelevant; the
52
+ portable distinction is whether the user has an approved route and the
53
+ required repository capabilities.
54
+
55
+ ## Consequences
56
+
57
+ - ADR-0001 remains valid for genuine consumer-owned files but is narrowed for
58
+ Kit Core and mixed registries.
59
+ - Core updates can advance without erasing project-specific behavior.
60
+ - Consumers gain explicit extension, contribution, and fork lifecycles instead
61
+ of permanent accidental divergence.
62
+ - Migration requires a one-time semantic classification of existing mixed
63
+ states and must fail closed when that classification is ambiguous.
@@ -65,7 +65,7 @@ The workflow board is [Agent Workflow Kit](https://github.com/users/iKon85/proje
65
65
  "wavePrefix": "Welle"
66
66
  },
67
67
  "wrapup": {
68
- "remoteBranchSweep": false
68
+ "remoteBranchSweep": true
69
69
  }
70
70
  }
71
71
  ```
@@ -0,0 +1,17 @@
1
+ {
2
+ "worktreeLifecycle": {
3
+ "enabled": true,
4
+ "worktreeRoot": ".worktrees",
5
+ "branchTemplate": "{type}/{issue}-{slug}",
6
+ "pathTemplate": "{issue}-{slug}",
7
+ "branchRegex": "^(?:feat|fix|chore|docs)/(?P<issue>\\d+)-",
8
+ "mainBranches": ["main"],
9
+ "protectedBranches": ["main"],
10
+ "setupEntry": "python3 scripts/worktree-lifecycle/setup.py",
11
+ "setupSteps": [],
12
+ "riskyCommandPatterns": [
13
+ "\\b(?:npm|pnpm|yarn)\\s+(?:run\\s+)?(?:test|typecheck|build)\\b",
14
+ "\\bgit\\s+(?:commit|push)\\b"
15
+ ]
16
+ }
17
+ }
@@ -0,0 +1,198 @@
1
+ # BenchLM as a routing-evidence source
2
+
3
+ **Researched:** 2026-07-22
4
+ **Question:** What role, if any, should BenchLM play in the Kit's evidence-backed
5
+ model and effort routing, and what does that imply for setup and kit-update?
6
+
7
+ ## Decision
8
+
9
+ Use BenchLM as a **catalog, discovery, and corroboration source**, not as an
10
+ authoritative routing source.
11
+
12
+ BenchLM is unusually useful for finding new model families, benchmarks,
13
+ pricing changes, supersession relationships, and gaps in current evidence. It
14
+ must not directly choose a dispatch route, especially an effort level. A route
15
+ observation still has to come from the benchmark owner and retain the complete
16
+ configuration identity: model, effort, agent/harness, benchmark version,
17
+ quality metric, uncertainty, and task cost.
18
+
19
+ This gives the source hierarchy:
20
+
21
+ 1. **Benchmark owner artifacts** (DeepSWE, Artificial Analysis, OpenHands,
22
+ Code/Design Arena) provide decision evidence.
23
+ 2. **BenchLM** discovers and cross-checks those sources and model releases.
24
+ 3. **Local user evidence and preferences** calibrate the resulting policy.
25
+ 4. The approval-gated policy reconciler proposes, but never silently applies,
26
+ routing changes.
27
+
28
+ ## What BenchLM contributes
29
+
30
+ BenchLM currently tracks 290 models and 323 benchmarks. Its useful coverage
31
+ includes agentic work, coding, multimodal work, model pricing, context windows,
32
+ runtime signals, release metadata, and supersession chains. Its methodology
33
+ currently gives ranking weight to three agentic and five coding benchmarks;
34
+ many more sources, including DeepSWE and most frontend sources, are display-only
35
+ context ([methodology](https://benchlm.ai/methodology)).
36
+
37
+ Frontend coverage is useful primarily as a source map. The current focused page
38
+ combines sourced React Native Evals, Design2Code, Vision2Web, and related
39
+ browser-task evidence, but calls itself a reporting family rather than a
40
+ weighted category, contains only seven eligible models, and warns that models
41
+ may have as few as two source rows
42
+ ([frontend/app-dev view](https://benchlm.ai/best/frontend-app-dev)). The owners
43
+ remain more authoritative: [React Native Evals](https://rn-evals.vercel.app/)
44
+ publishes agent success, token, and cost results, while
45
+ [Vision2Web](https://vision2web-bench.github.io/) explicitly evaluates
46
+ model-plus-framework submissions across visual, interactive, and full-stack
47
+ tasks.
48
+
49
+ BenchLM also exposes confidence separately from score, 90% score intervals,
50
+ `Supported` versus `Estimated` states, source-coverage counts, and a dated
51
+ BenchAlign method/frozen-input identifier. That is valuable for shortlisting
52
+ and for detecting insufficient evidence, but it is confidence in BenchLM's
53
+ composite inference rather than a pass-rate interval for our exact workload
54
+ ([confidence method](https://benchlm.ai/benchmark-confidence)).
55
+
56
+ ## Why it cannot drive routing directly
57
+
58
+ ### Effort and harness can disappear
59
+
60
+ BenchLM's exported Sol model row records DeepSWE as `72.7`, but not the effort,
61
+ harness, confidence interval, or cost
62
+ ([models export](https://benchlm.ai/data/models.json)). The owner artifact shows
63
+ that this number is specifically `gpt-5-6-sol + mini-swe-agent + max`: 72.7%
64
+ Pass@1 over four whole-benchmark runs, with a 95% run-to-run interval and about
65
+ $8.39 mean cost per scored attempt
66
+ ([DeepSWE v1.1 artifact](https://deepswe.datacurve.ai/artifacts/v1.1/leaderboard-live.json)).
67
+
68
+ This collapsing is fatal for model-plus-effort selection. Some older model
69
+ families have explicit `high` or `max` variants in the BenchLM catalog, while
70
+ current Sol, Terra, Luna, and Fable evidence can be folded into one base-model
71
+ row. The overall/category scores therefore describe mixed published
72
+ configurations, not a consistent effort curve.
73
+
74
+ ### Composite rankings are editorial inference
75
+
76
+ BenchAlign normalizes unlike protocols, combines source families, and imputes
77
+ missing evidence with wider uncertainty. BenchLM publishes the method version,
78
+ frozen-input identifier, weighted benchmark list, and dated output, but its
79
+ public downloads reference internal source files rather than a published,
80
+ locally reproducible BenchAlign implementation. The composite is reproducible
81
+ as a cached dated output, not independently rebuildable by the Kit from public
82
+ code ([methodology](https://benchlm.ai/methodology)).
83
+
84
+ Raw source rows are more useful than the composite, but the current
85
+ machine-readable model export is a numeric benchmark map without per-row source
86
+ URLs or complete execution settings. The Kit must follow the benchmark catalog
87
+ to the owner rather than treating `models.json` as normalized routing evidence.
88
+
89
+ ### Current semantic inconsistencies require defensive ingestion
90
+
91
+ The same-day exports currently contain examples that a production adapter must
92
+ reject or downgrade:
93
+
94
+ - BenchLM's DeepSWE Markdown page says that source metadata is preserved but
95
+ reports zero leaderboard models, while `models.json` contains six DeepSWE
96
+ scores.
97
+ - `benchmarks.json` currently contains duplicate `sweMultimodal` definitions.
98
+ - Its Design2Code and Vision2Web catalog entries currently point to a provider
99
+ documentation page rather than the benchmark owners. The official
100
+ [Design2Code repository](https://github.com/NoviScl/Design2Code) and
101
+ [Vision2Web site](https://vision2web-bench.github.io/) show the correct
102
+ provenance.
103
+
104
+ These may be transient publishing defects, but they make last-known-good,
105
+ semantic validation, and owner verification mandatory.
106
+
107
+ ## Machine-readable access, cadence, and legal posture
108
+
109
+ BenchLM documents MIT-licensed JSON downloads for leaderboard, models,
110
+ benchmarks, pricing, speed, and comparisons. Each export currently has
111
+ `schemaVersion`, `generatedAt`, and `sourceLastUpdated`; `updates.json` provides
112
+ a cheap change feed. BenchLM says it refreshes several times per week and often
113
+ within hours of major launches ([dataset documentation](https://benchlm.ai/data)).
114
+
115
+ The adapter should use the documented `/data/*.json` downloads and
116
+ `updates.json`, not scrape rendered pages. Fetch at low cadence, send ordinary
117
+ conditional requests where supported, retain attribution, and persist the raw
118
+ snapshot hash and generation timestamp.
119
+
120
+ There is one governance warning: the current Terms page still visibly contains
121
+ launch placeholders for operator identity, jurisdiction, effective date, and
122
+ contact details. It permits published downloads under their stated licenses
123
+ and non-degrading automated access, but this unfinished legal surface reduces
124
+ operational confidence. The MIT dataset declaration is clear; nonetheless the
125
+ adapter should not depend on high-frequency or undocumented endpoints
126
+ ([dataset license](https://benchlm.ai/data),
127
+ [terms](https://benchlm.ai/terms)). Underlying benchmark data remains subject
128
+ to its original publisher's license.
129
+
130
+ ## Concrete adapter contract
131
+
132
+ `BenchLmCatalogSource` should ingest only:
133
+
134
+ - model/provider/family and release/supersession metadata;
135
+ - current pricing and runtime hints;
136
+ - benchmark definitions and owner links;
137
+ - coverage, freshness, `Supported`/`Estimated`, and confidence metadata;
138
+ - the update feed as an invalidation and discovery trigger.
139
+
140
+ It should emit `candidate-discovered`, `source-changed`, `pricing-changed`, and
141
+ `evidence-gap` events. It must not emit an authoritative
142
+ `RouteObservation(model, effort, harness)` unless an owner adapter has verified
143
+ the complete row.
144
+
145
+ Every refresh must:
146
+
147
+ 1. validate the export schema and cross-file referential integrity;
148
+ 2. reject duplicate benchmark identities and implausible source changes;
149
+ 3. retain the last-known-good snapshot on failure;
150
+ 4. classify aggregate scores as `corroborating`, never `decisive`;
151
+ 5. resolve relevant rows through the original source adapter;
152
+ 6. show a human-readable diff before a personal policy changes.
153
+
154
+ ## Setup and kit-update implication
155
+
156
+ BenchLM improves discovery, but it does not change ownership: setup asks which
157
+ **surfaces/providers the user can and wants to use**, not which model currently
158
+ tops a leaderboard. Availability, policy, and benchmark ability are separate.
159
+
160
+ For a first setup or an existing installation without a routing profile:
161
+
162
+ 1. Detect installed/supported surfaces where possible and ask the user to
163
+ confirm the common choices (for example Claude Code, Codex, and explicitly
164
+ offered additional providers such as Google or Moonshot/Kimi).
165
+ 2. Record availability and dispatch capability separately: subscription/API,
166
+ allowed cross-provider execution, per-spawn model control, and per-spawn
167
+ effort control.
168
+ 3. Ask for the optimization preference and local overrides, or allow the safe
169
+ `inherit` mode.
170
+ 4. Use BenchLM to discover current candidate families, then owner sources to
171
+ construct the proposed model-plus-effort policy.
172
+ 5. Preview the policy and require approval before activation.
173
+
174
+ The list of “common AIs” must be data-driven and versioned, not hard-coded in a
175
+ skill prompt. BenchLM can nominate newly common candidates, while surface
176
+ capability checks determine whether they are actually selectable.
177
+
178
+ `kit-update` should install updated schemas, adapters, and provider-catalog
179
+ logic. It should run a short routing preflight when the profile is absent,
180
+ invalid, stale, references a removed model, or when a newly detected surface
181
+ changes available choices. It should otherwise report `still valid` without
182
+ re-running the whole interview. An update may refresh and cache evidence, but
183
+ must never rewrite the user's provider choices, model routes, effort routes, or
184
+ global configuration without a separately approved reconcile transaction.
185
+
186
+ ## Final classification
187
+
188
+ | Use | Classification |
189
+ |---|---|
190
+ | Discover new models, providers, benchmarks, and releases | Recommended |
191
+ | Detect evidence/pricing/freshness changes | Recommended with validation |
192
+ | Corroborate owner-source observations | Useful |
193
+ | Select a candidate shortlist | Advisory only |
194
+ | Select model plus effort for dispatch | Rejected |
195
+ | Treat BenchAlign overall/category score as capability truth | Rejected |
196
+
197
+ BenchLM therefore adds real value to the planned routing wave, but as the
198
+ system's **radar**, not its **autopilot**.