@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.
- package/.agents/skills/kit-release/SKILL.md +12 -0
- package/.agents/skills/kit-update/SKILL.md +6 -3
- package/.agents/skills/setup-workflow/SKILL.md +13 -5
- package/.agents/skills/setup-workflow/assets/agent-workflow-kit-update.yml +1 -3
- package/.claude/skills/kit-release/SKILL.md +12 -0
- package/.claude/skills/kit-update/SKILL.md +6 -3
- package/.claude/skills/setup-workflow/SKILL.md +13 -5
- package/.claude/skills/setup-workflow/assets/agent-workflow-kit-update.yml +1 -3
- package/README.md +17 -0
- package/agent-workflow-kit.package.json +12 -12
- package/docs/adr/0001-consumer-divergence-policy.md +4 -0
- package/docs/adr/0003-kit-core-and-project-extension-lifecycle.md +63 -0
- package/docs/agents/board-sync.md +1 -1
- package/docs/agents/workflow-capabilities.json +17 -0
- package/docs/research/benchlm-routing-source.md +198 -0
- package/docs/research/consumer-owned-protocol-files.md +238 -0
- package/docs/research/frontend-agent-benchmarks.md +282 -0
- package/docs/research/model-effort-routing-benchmarks.md +261 -0
- package/docs/research/provider-neutral-agent-routing.md +207 -0
- package/package.json +1 -1
- package/scripts/kit-update-pr.mjs +1 -1
- package/scripts/kit-update-pr.test.mjs +2 -0
- package/scripts/release-delta-guard.mjs +28 -1
- package/scripts/release-delta-guard.test.mjs +45 -0
- package/scripts/release-state.mjs +7 -3
- package/scripts/release-state.test.mjs +22 -0
- package/scripts/test_skill_readiness_contract.py +6 -1
- package/scripts/test_skill_setup_workflow_seeds.py +18 -17
- package/src/commands/update.mjs +52 -20
- package/src/lib/bundle.mjs +1 -1
- package/src/lib/updateCandidate.mjs +278 -50
- package/src/lib/verifyUpdateCandidate.mjs +220 -0
- package/src/lib/verifyUpdateCandidateArtifacts.mjs +78 -0
- package/src/lib/verifyUpdateCandidateProtocol.mjs +221 -0
- 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
|
|
34
|
-
|
|
35
|
-
|
|
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
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
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:
|
|
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
|
|
34
|
-
|
|
35
|
-
|
|
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
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
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:
|
|
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.
|
|
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": "
|
|
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": "
|
|
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": "
|
|
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": "
|
|
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": "
|
|
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": "
|
|
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": "
|
|
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": "
|
|
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": "
|
|
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": "
|
|
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": "
|
|
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.
|
|
@@ -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**.
|