@kontextmind/kxm 0.7.191 → 0.7.193
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/.claude-plugin/marketplace.json +1 -1
- package/.kxm/roles/planner.yaml +5 -1
- package/CHANGELOG.md +27 -0
- package/docs/contributing/assignment-runner.md +1 -1
- package/docs/contributing/ci-and-release.md +1 -1
- package/docs/contributing/development.md +37 -0
- package/docs/contributing/harness-routing-internals.md +8 -4
- package/docs/evals/planner-bakeoff-2026-10.md +7 -5
- package/docs/reference/cli-reference.md +3 -1
- package/docs/reference/config-reference.md +20 -3
- package/docs/reference/harness-routing.md +5 -2
- package/docs/reference/workflow-catalog.md +19 -18
- package/package.json +1 -1
- package/plugins/kxm/.claude-plugin/plugin.json +1 -1
- package/plugins/kxm/dist/mcp-server.js +1 -1
- package/plugins/kxm/package.json +1 -1
- package/plugins/kxm/src/mcp-server.ts +1 -1
- package/plugins/kxm/src/model-catalog-refresh.ts +77 -5
- package/scripts/harness-run.mjs +1 -1
package/.kxm/roles/planner.yaml
CHANGED
|
@@ -3,9 +3,13 @@ id: planner
|
|
|
3
3
|
purpose: planner
|
|
4
4
|
permission: read-only
|
|
5
5
|
description: Plans the change before implementation.
|
|
6
|
-
# claude-fable is primary.
|
|
6
|
+
# claude-fable is primary. claude-claude-sonnet-5-5 is the same-vendor
|
|
7
|
+
# fallback (October 2026 bake-off: Sonnet 126, Fable 110, about 1/5 the
|
|
8
|
+
# list cost). The Pi fallback is a different vendor.
|
|
7
9
|
roster:
|
|
8
10
|
- route: claude-fable
|
|
9
11
|
effort: medium
|
|
12
|
+
- route: claude-claude-sonnet-5-5
|
|
13
|
+
effort: medium
|
|
10
14
|
- route: pi-qwen3-8-flash-openrouter
|
|
11
15
|
effort: medium
|
package/CHANGELOG.md
CHANGED
|
@@ -225,6 +225,15 @@ All notable user-facing changes are documented here. The project follows [Semant
|
|
|
225
225
|
|
|
226
226
|
### Changed
|
|
227
227
|
|
|
228
|
+
- **The planner fallback is Claude Sonnet 5.5.** `claude-fable` stays the
|
|
229
|
+
planner primary. `claude-claude-sonnet-5-5` (`claude` / `claude-sonnet-5.5`,
|
|
230
|
+
selector `anthropic/claude-sonnet-5.5`, read-only, effort `medium`) is the
|
|
231
|
+
next route, ahead of `pi-qwen3-8-flash-openrouter`. The October 2026
|
|
232
|
+
bake-off scored Sonnet 126 and Fable 110 out of 150, at about one fifth
|
|
233
|
+
the list cost, which was not enough to replace the primary. OpenRouter
|
|
234
|
+
listed `anthropic/claude-sonnet-5.5` on 2026-10-20 at $2 input and $10
|
|
235
|
+
output per 1M tokens. See
|
|
236
|
+
[Planner bake-off, October 2026](docs/evals/planner-bakeoff-2026-10.md).
|
|
228
237
|
- **Writer #2 is OpenRouter Qwen3.7 Plus.** `pi-qwen3-7-plus-openrouter`
|
|
229
238
|
(`openrouter/qwen/qwen3.7-plus`) replaces `pi-qwen3-coder-plus-openrouter`.
|
|
230
239
|
OpenRouter no longer lists `qwen/qwen3-coder-plus`. The live catalog on
|
|
@@ -705,6 +714,24 @@ All notable user-facing changes are documented here. The project follows [Semant
|
|
|
705
714
|
|
|
706
715
|
### Fixed
|
|
707
716
|
|
|
717
|
+
- **The weekly model refresh opens its pull request with a GitHub App.**
|
|
718
|
+
`.github/workflows/refresh-models.yml` uses `actions/create-github-app-token`
|
|
719
|
+
with repository secrets `KXM_REFRESH_APP_ID` and
|
|
720
|
+
`KXM_REFRESH_APP_PRIVATE_KEY`. The App is installed on `kontextmind/kxm`
|
|
721
|
+
only, with Contents read and write and Pull requests read and write. A
|
|
722
|
+
missing secret fails the job and names both. `GITHUB_TOKEN` is not used to
|
|
723
|
+
create the pull request. Setup is in
|
|
724
|
+
[Refresh model prices and inventory](docs/contributing/development.md#refresh-model-prices-and-inventory).
|
|
725
|
+
- **GLM 5.3 prices no longer share one YAML anchor.**
|
|
726
|
+
`openrouter/z-ai/glm-5.3-flash` tracks the OpenRouter models API on
|
|
727
|
+
2026-10-20: $0.047076 input, $0.12 output, and $0.006 cache read per 1M
|
|
728
|
+
tokens. `zai-coding-cn/glm-5.3-flash` keeps the coding-plan rate of $0.15 /
|
|
729
|
+
$0.50 (cache read $0.03). `zai-coding-cn/glm-5.3` output is $1.40, matching
|
|
730
|
+
OpenRouter `z-ai/glm-5.3` (input $0.079 and cache read $0.078 were already
|
|
731
|
+
the same). The refresh does not rewrite a shared anchor that a
|
|
732
|
+
non-OpenRouter row depends on. `.kxm/prices.yaml` is dated 2026-10-20.
|
|
733
|
+
The OpenRouter `standard` rates for those two inventory rows match.
|
|
734
|
+
|
|
708
735
|
- **`kxm improve report` and `kxm routing report` include attempts settled in a registered lane.**
|
|
709
736
|
Inside a KXM project, a present user-state `registry.db` is opened read-only at schema version 2. One query loads the home row and every lane row for that project id. Event-store paths come from the stored project keys, so a stale checkout path cannot hide a lane. A missing store stays a zero-record source. An absent registry, or a checkout that is not registered, still reads only that checkout's own store. `--file` still reads only the named file. See
|
|
710
737
|
[kxm improve report](docs/reference/cli-reference.md#kxm-improve-report).
|
|
@@ -35,7 +35,7 @@ admits each route for specific roles and permissions:
|
|
|
35
35
|
| Role | Admitted route (harness / model) | Vendor | Permission |
|
|
36
36
|
|---|---|---|---|
|
|
37
37
|
| `writer` | `grok` / `grok-4.7`; relief: `pi` / `openrouter/qwen/qwen3.7-plus`; `agy` / `gemini-4-argon-high`, then `gemini-4-argon-medium`, then `gemini-3.8-flash-medium`, then `gemini-3.8-flash-high` | `xai`; `alibaba`; `google` | `edit` |
|
|
38
|
-
| `planner` | `claude` / `fable` | `anthropic` | `read-only` |
|
|
38
|
+
| `planner` | `claude` / `fable`, then `claude` / `claude-sonnet-5.5`; fallback `pi` / `openrouter/qwen/qwen3.8-flash` | `anthropic`; `anthropic`; `alibaba` | `read-only` |
|
|
39
39
|
| `reviewer-arch` | `claude` / `fable` | `anthropic` | `read-only` |
|
|
40
40
|
| `reviewer-cli` | `codex` / `gpt-6.1-sol`; fallback `pi` / `openrouter/qwen/qwen3.8-flash`, then `codex` / `gpt-5.6-sol` | `openai`; `alibaba`; `openai` | `read-only` |
|
|
41
41
|
|
|
@@ -46,7 +46,7 @@ together.
|
|
|
46
46
|
| Push to `main`, or manual | `ci.yml` (Validate matrix) | `validate:pr` on Linux and Windows for Node 22.19.0 and Node 24; not on a pull request |
|
|
47
47
|
| Code pull request and code push | `ci.yml` (Plugin validation) | `claude plugin validate --strict` on the marketplace and the plugin |
|
|
48
48
|
| Daily at 04:00 UTC, or manual | `nightly.yml` | `test:coverage:complete`, `check`, `check:generated`, `npm pack --dry-run` |
|
|
49
|
-
| Monday at 13:00 UTC, or manual | `refresh-models.yml` | Fetches the public OpenRouter catalog, and opens or updates one pull request on `automation/model-refresh` when `.kxm/prices.yaml` or `.kxm/models/inventory.yaml` changes.
|
|
49
|
+
| Monday at 13:00 UTC, or manual | `refresh-models.yml` | Fetches the public OpenRouter catalog, and opens or updates one pull request on `automation/model-refresh` when `.kxm/prices.yaml` or `.kxm/models/inventory.yaml` changes. The pull request uses a GitHub App token from `KXM_REFRESH_APP_ID` and `KXM_REFRESH_APP_PRIVATE_KEY` (`actions/create-github-app-token`). `GITHUB_TOKEN` posts `model-catalog-guard` and dispatches `ci.yml` on that branch. App setup is in [Refresh model prices and inventory](development.md#refresh-model-prices-and-inventory) |
|
|
50
50
|
| Merged pull request | `auto-release.yml` | Tags the merge commit and dispatches `release.yml` |
|
|
51
51
|
| Tag push or dispatch | `release.yml` | Verifies, packs and publishes (see [Release flow](#release-flow)) |
|
|
52
52
|
| Manual only | `smoke.yml` | Real Pi smoke, currently disabled (see [Smoke tests](#smoke-tests)) |
|
|
@@ -418,6 +418,43 @@ Review the diff and commit it yourself, or wait for the Monday pull request on
|
|
|
418
418
|
`automation/model-refresh`. The field reference is
|
|
419
419
|
[Weekly OpenRouter refresh](../reference/config-reference.md#weekly-openrouter-refresh).
|
|
420
420
|
|
|
421
|
+
The Monday job opens that pull request with a GitHub App installation token,
|
|
422
|
+
not the workflow's `GITHUB_TOKEN`. This repository does not permit GitHub
|
|
423
|
+
Actions to create pull requests, and the workflow does not change that
|
|
424
|
+
setting. The App is installed on `kontextmind/kxm` only. Its repository
|
|
425
|
+
permissions are Contents read and write, and Pull requests read and write.
|
|
426
|
+
No other repository is installed, and the token asks only for those two
|
|
427
|
+
permissions on `kxm`.
|
|
428
|
+
|
|
429
|
+
Create the App as an organization owner:
|
|
430
|
+
|
|
431
|
+
1. Open [New GitHub App](https://github.com/organizations/kontextmind/settings/apps/new).
|
|
432
|
+
Set the homepage URL to `https://github.com/kontextmind/kxm`. Uncheck
|
|
433
|
+
Active under Webhook. The workflow only mints an installation token.
|
|
434
|
+
2. Under Repository permissions, set **Contents** to Read and write and
|
|
435
|
+
**Pull requests** to Read and write. Leave every other permission at No
|
|
436
|
+
access.
|
|
437
|
+
3. Under "Where can this GitHub App be installed?", choose **Only on this
|
|
438
|
+
account**. Create the App.
|
|
439
|
+
4. On the App's settings page, copy the numeric **App ID**. Generate a
|
|
440
|
+
private key and keep the downloaded PEM.
|
|
441
|
+
5. Install the App: **Install App**, then **Only select repositories**,
|
|
442
|
+
then `kontextmind/kxm`, then Install. Do not install it on any other
|
|
443
|
+
repository.
|
|
444
|
+
6. On [Actions secrets](https://github.com/kontextmind/kxm/settings/secrets/actions)
|
|
445
|
+
for this repository, add `KXM_REFRESH_APP_ID` (the numeric App ID, not
|
|
446
|
+
the Client ID) and `KXM_REFRESH_APP_PRIVATE_KEY` (the full PEM, including
|
|
447
|
+
the `BEGIN` and `END` lines).
|
|
448
|
+
|
|
449
|
+
`actions/create-github-app-token` reads those secrets as `app-id` and
|
|
450
|
+
`private-key`. If either secret is missing, the job fails before it pushes
|
|
451
|
+
and names both `KXM_REFRESH_APP_ID` and `KXM_REFRESH_APP_PRIVATE_KEY`. An
|
|
452
|
+
unchanged catalog still requires the secrets: a Monday with no diff exits 0
|
|
453
|
+
only after both are set. The workflow `GITHUB_TOKEN` still posts the
|
|
454
|
+
`model-catalog-guard` commit status and dispatches `ci.yml`, because the App
|
|
455
|
+
is not granted statuses or actions. Do not turn on "Allow GitHub Actions to
|
|
456
|
+
create and approve pull requests."
|
|
457
|
+
|
|
421
458
|
`kxm models inventory-refresh` still rewrites the whole inventory from Pi, Grok,
|
|
422
459
|
agy, OpenRouter, and Nous, including a new `fetchedAt` timestamp. The weekly
|
|
423
460
|
script does not call those local CLIs.
|
|
@@ -9,7 +9,7 @@ This page records how the KXM repository applies [harness routing](../reference/
|
|
|
9
9
|
|
|
10
10
|
The files use one id shape per kind. A route id is `<harness>-<model-slug>[-<provider>]`, with `.` written as `-`. An agent id equals its role. A workflow id is `default`, `land`, or `<role>-only`. An agent step id equals that role.
|
|
11
11
|
|
|
12
|
-
This checkout's admitted routes are `grok-grok-4-7`, `pi-qwen3-7-plus-openrouter`, `agy-gemini-4-argon-high`, `agy-gemini-4-argon-medium`, `agy-gemini-3-8-flash-medium`, `agy-gemini-3-8-flash-high`, `claude-fable`, `codex-gpt-6-1-sol`, `codex-gpt-5-6-sol`, `pi-qwen3-8-flash-openrouter`, and `pi-glm-5-3-flash-openrouter`. `pi-qwen3-coder-plus-openrouter` stays on disk with `status: retired` because OpenRouter removed `qwen/qwen3-coder-plus` (catalog 404); it is not admitted and not on a roster, and `qwen-openrouter-pi` does not resolve. Agents are `planner`, `writer`, `reviewer-arch`, and `reviewer-cli`. `opus-claude` was removed because `opus` is not an admitted selector. `qwen-token-plan/*` and `zai-coding-cn/*` left the admitted list because those harnesses are not allowlisted; their `prices.yaml` rows stay. Other old ids resolve as aliases. Every roster entry names an effort. `reviewer-arch` dispatches `claude-fable`. #343's architecture critic ran on opus because the justfile recipe review-arch hardcoded that model; the role file on that commit listed only `fable-claude`. The helper now refuses `opus`.
|
|
12
|
+
This checkout's admitted routes are `grok-grok-4-7`, `pi-qwen3-7-plus-openrouter`, `agy-gemini-4-argon-high`, `agy-gemini-4-argon-medium`, `agy-gemini-3-8-flash-medium`, `agy-gemini-3-8-flash-high`, `claude-fable`, `claude-claude-sonnet-5-5`, `codex-gpt-6-1-sol`, `codex-gpt-5-6-sol`, `pi-qwen3-8-flash-openrouter`, and `pi-glm-5-3-flash-openrouter`. `pi-qwen3-coder-plus-openrouter` stays on disk with `status: retired` because OpenRouter removed `qwen/qwen3-coder-plus` (catalog 404); it is not admitted and not on a roster, and `qwen-openrouter-pi` does not resolve. Agents are `planner`, `writer`, `reviewer-arch`, and `reviewer-cli`. `opus-claude` was removed because `opus` is not an admitted selector. `qwen-token-plan/*` and `zai-coding-cn/*` left the admitted list because those harnesses are not allowlisted; their `prices.yaml` rows stay. Other old ids resolve as aliases. Every roster entry names an effort. `reviewer-arch` dispatches `claude-fable`. #343's architecture critic ran on opus because the justfile recipe review-arch hardcoded that model; the role file on that commit listed only `fable-claude`. The helper now refuses `opus`.
|
|
13
13
|
|
|
14
14
|
## This checkout's routes and roster
|
|
15
15
|
|
|
@@ -37,11 +37,12 @@ roster:
|
|
|
37
37
|
effort: medium
|
|
38
38
|
```
|
|
39
39
|
|
|
40
|
-
The writer role lists route ids, in order: `grok-grok-4-7`, then `pi-qwen3-7-plus-openrouter`, then `agy-gemini-4-argon-high`, `agy-gemini-4-argon-medium`, `agy-gemini-3-8-flash-medium`, and `agy-gemini-3-8-flash-high`. `grok-grok-4-7` is harness `grok`, model `grok-4.7`, vendor `xai`. An agent file does not declare `harness:`. Argon is writer #3 and #4. Flash medium is the safety net because Argon needs a paid Google AI Pro, Ultra, or Enterprise plan and `agy -p` exits when the pinned model is missing. Flash high stays on the roster so that admitted model file is still used. The planner
|
|
40
|
+
The writer role lists route ids, in order: `grok-grok-4-7`, then `pi-qwen3-7-plus-openrouter`, then `agy-gemini-4-argon-high`, `agy-gemini-4-argon-medium`, `agy-gemini-3-8-flash-medium`, and `agy-gemini-3-8-flash-high`. `grok-grok-4-7` is harness `grok`, model `grok-4.7`, vendor `xai`. An agent file does not declare `harness:`. Argon is writer #3 and #4. Flash medium is the safety net because Argon needs a paid Google AI Pro, Ultra, or Enterprise plan and `agy -p` exits when the pinned model is missing. Flash high stays on the roster so that admitted model file is still used. The planner roster is `claude-fable`, then `claude-claude-sonnet-5-5` (`anthropic/claude-sonnet-5.5`), then `pi-qwen3-8-flash-openrouter`. Fable stays the primary. The [October 2026 planner bake-off](../evals/planner-bakeoff-2026-10.md) is why Sonnet is the fallback. The CLI critic primary is `codex-gpt-6-1-sol`, then `pi-qwen3-8-flash-openrouter`, then `codex-gpt-5-6-sol`. The architecture critic primary stays `claude-fable`, then `pi-glm-5-3-flash-openrouter`. Argon can serve as a planner or architecture-review fallback; it is not on those rosters. GPT-6.1 Sol Pro is the same model with reasoning mode `pro`. The route id does not carry a reasoning mode, role effort has no `pro` value, and codex is limited to `reviewer-cli`, so that mode is not an architecture fallback.
|
|
41
41
|
|
|
42
42
|
`node scripts/kxm.mjs routes list`:
|
|
43
43
|
|
|
44
44
|
```text
|
|
45
|
+
admitted anthropic/claude-sonnet-5.5
|
|
45
46
|
admitted anthropic/fable
|
|
46
47
|
admitted google/gemini-3.8-flash-high
|
|
47
48
|
admitted google/gemini-3.8-flash-medium
|
|
@@ -54,6 +55,7 @@ admitted openrouter/qwen/qwen3.8-flash
|
|
|
54
55
|
admitted openrouter/z-ai/glm-5.3-flash
|
|
55
56
|
admitted xai/grok-4.7
|
|
56
57
|
planner claude-fable
|
|
58
|
+
planner claude-claude-sonnet-5-5
|
|
57
59
|
planner pi-qwen3-8-flash-openrouter
|
|
58
60
|
reviewer-arch claude-fable
|
|
59
61
|
reviewer-arch pi-glm-5-3-flash-openrouter
|
|
@@ -74,7 +76,7 @@ On the capture machine, `kxm harness list` showed `claude` detected but logged o
|
|
|
74
76
|
|
|
75
77
|
### Price catalog and inventory
|
|
76
78
|
|
|
77
|
-
`.kxm/prices.yaml` is dated `2026-10-
|
|
79
|
+
`.kxm/prices.yaml` is dated `2026-10-20`. A run on that date can record a list estimate. Any other day records `providerMetadata.priceCatalogStale: true` and no list estimate. The list prices below come from `.kxm/models/inventory.yaml`. OpenRouter and Nous were fetched at `2026-10-17T13:45:00.000Z`. `pi`, `grok`, and `agy` were not installed for that refresh, so models that exist only in those CLIs stay, including the previous `agy` rows, and the Gemini 4 Argon and Claude 5.5 `agy` rows were added by hand from `agy models`. Prices are USD per 1M tokens. The checkout has no routing records yet, so none of the examples has recorded latency; for latency, run a bounded side-by-side experiment and compare p50 and p95 in `kxm routing report`.
|
|
78
80
|
|
|
79
81
|
## The developer roster
|
|
80
82
|
|
|
@@ -154,6 +156,8 @@ Pi's own `xai` provider reported `ready` (OAuth) on the capture machine. When th
|
|
|
154
156
|
|
|
155
157
|
`claude` was logged out on the capture machine, so the native route failed closed. Pi's `anthropic` provider reported `ready` (OAuth). The `anthropic/fable` row in `prices.yaml` gives a list estimate only when the catalog is dated today.
|
|
156
158
|
|
|
159
|
+
The planner fallback is the same harness. `claude-claude-sonnet-5-5` is model `claude-sonnet-5.5`, selector `anthropic/claude-sonnet-5.5`, read-only, effort `medium`, and it sits immediately after Fable. `pi-qwen3-8-flash-openrouter` stays third. The [October 2026 planner bake-off](../evals/planner-bakeoff-2026-10.md) scored Sonnet 126 and Fable 110. OpenRouter listed the standard tier on 2026-10-20 at $2 input and $10 output per 1M tokens (cache read $0.10, cache write $2.50). That row is in `.kxm/prices.yaml`. Architecture review does not use Sonnet.
|
|
160
|
+
|
|
157
161
|
### Gemini 3.8 Flash
|
|
158
162
|
|
|
159
163
|
| | Native `agy` | `antigravity` Pi provider | Pi + OpenRouter |
|
|
@@ -178,7 +182,7 @@ The code differs from that decision: `.kxm/routes.yaml` admits `google/gemini-3.
|
|
|
178
182
|
|---|---|---|---|
|
|
179
183
|
| Qwen3.8 Flash | `qwen-token-plan/qwen3.8-flash`: removed from the admitted list on 2026-09-27; `qwen-token-plan` is not allowlisted | `openrouter/qwen/qwen3.8-flash`: admitted, route `pi-qwen3-8-flash-openrouter`, read-only fallback for planner and reviewer-cli | `prices.yaml` keeps both rows. |
|
|
180
184
|
| Qwen3.7 Plus | none | `openrouter/qwen/qwen3.7-plus`: route `pi-qwen3-7-plus-openrouter`, writer #2 | The only admitted Pi writer: exact model, `edit` permission. OpenRouter list on 2026-10-17 is $0.32 input and $1.28 output per 1M tokens, 1,000,000 context, tools supported. |
|
|
181
|
-
| GLM 5.3 and 5.3 Flash | `zai-coding-cn/glm-5.3` and `…/glm-5.3-flash`: removed from the admitted list on 2026-09-27; `zai-coding-cn` is not allowlisted | `openrouter/z-ai/glm-5.3-flash`: admitted, route `pi-glm-5-3-flash-openrouter`, read-only fallback for reviewer-arch | Z.ai has no native harness. |
|
|
185
|
+
| GLM 5.3 and 5.3 Flash | `zai-coding-cn/glm-5.3` and `…/glm-5.3-flash`: removed from the admitted list on 2026-09-27; `zai-coding-cn` is not allowlisted. The flash coding-plan row keeps $0.15 / $0.50 (cache read $0.03). `zai-coding-cn/glm-5.3` output is $1.40 | `openrouter/z-ai/glm-5.3-flash`: admitted, route `pi-glm-5-3-flash-openrouter`, read-only fallback for reviewer-arch. Its own tier, verified 2026-10-20: $0.047076 input, $0.12 output, $0.006 cache read | Z.ai has no native harness. The two flash rows do not share a YAML anchor. |
|
|
182
186
|
| DeepSeek V4.1 Flash | `qwen-token-plan/deepseek-v4.1-flash`: removed from the admitted list on 2026-09-27 | `deepseek/deepseek-v4.1-flash` in the OpenRouter feed | Bills a DeepSeek model through Alibaba's plan. `deepseek` is a native-vendor Pi brake, so this is not a route. |
|
|
183
187
|
|
|
184
188
|
The developer runner is stricter. Its only Pi writer is `openrouter/qwen/qwen3.7-plus`, and it does not allowlist `qwen-token-plan` or `zai-coding-cn`. Today OpenRouter is the right answer here for Qwen3.7 Plus, Qwen3.8 Flash and GLM 5.3 Flash. `qwen/qwen3-coder-plus` is retired.
|
|
@@ -1,16 +1,18 @@
|
|
|
1
1
|
# Planner bake-off, October 2026
|
|
2
2
|
|
|
3
|
-
This page records a scored comparison of Claude Fable 5.1 and Claude Sonnet 5.5 on six KXM planning tasks. It is for maintainers deciding whether the planner primary should stay Fable. Routing
|
|
3
|
+
This page records a scored comparison of Claude Fable 5.1 and Claude Sonnet 5.5 on six KXM planning tasks. It is for maintainers deciding whether the planner primary should stay Fable. Routing was unchanged during the scored run.
|
|
4
|
+
|
|
5
|
+
The fallback recommended below is now admitted. Fable stays the planner primary. `claude-claude-sonnet-5-5` (selector `anthropic/claude-sonnet-5.5`) is the next planner route, ahead of `pi-qwen3-8-flash-openrouter`. The list price is a `.kxm/prices.yaml` row, verified on OpenRouter on 2026-10-20 at $2 input and $10 output per 1M tokens. The procedure is [Harness routing](../reference/harness-routing.md).
|
|
4
6
|
|
|
5
7
|
## Recommendation
|
|
6
8
|
|
|
7
|
-
Keep Fable as the planner primary. Treat Sonnet 5.5 as
|
|
9
|
+
Keep Fable as the planner primary. Treat Sonnet 5.5 as the fallback, not a replacement.
|
|
8
10
|
|
|
9
11
|
Sonnet scored 126 and Fable scored 110, out of 150, on a blinded judge. Sonnet won four tasks and Fable won two. The two Fable wins include the Argon roster, which is the task closest to an admission decision, and Sonnet's Argon plan admitted only the medium pin and placed it after Flash. Six tasks, one judge, and a transport that is not the KXM planner route are not enough to replace the primary. List price favors Sonnet by about five to one, and a native Claude subscription records both as unmetered, so the invoice may not move.
|
|
10
12
|
|
|
11
13
|
## How this run was scored
|
|
12
14
|
|
|
13
|
-
|
|
15
|
+
At the time of the run, the planner roster in `.kxm/roles/planner.yaml` was `claude-fable` at effort medium, then `pi-qwen3-8-flash-openrouter`. The native one-shot is `claude -p --model <model> --effort medium --output-format json` with the read-only arguments in `oneShotReadOnlyArgs` for `claude`. There is no command flag that swaps the planner model without editing the role and admitting a route. `kxm routing benchmark` prints placeholder numbers and does not call a model.
|
|
14
16
|
|
|
15
17
|
This machine has no `claude` binary, no Claude auth directory, and no `ANTHROPIC_API_KEY`. The committed plans are from Cursor subagents pinned to `claude-fable-5-1-thinking-medium` and `claude-sonnet-5-5-medium`. Both received the same prompt. They were told not to read the checkout, because the landed change would leak the answer. The Argon plans still name `pi-qwen3-coder-plus-openrouter` as writer number two, which the current tree no longer has, so they do not look like a read of the solution.
|
|
16
18
|
|
|
@@ -49,7 +51,7 @@ Regenerate scores with `python3 docs/evals/planner-bakeoff-2026-10/score.py --sc
|
|
|
49
51
|
| Model | List rate per 1M | List cost | Wins |
|
|
50
52
|
| --- | --- | --- | --- |
|
|
51
53
|
| Fable 5.1 | $10 / $50, from `.kxm/prices.yaml` | $0.460 | 2 |
|
|
52
|
-
| Sonnet 5.5 | $2 / $10
|
|
54
|
+
| Sonnet 5.5 | $2 / $10. The scored estimate read the inventory, because `.kxm/prices.yaml` had no row yet. The admitted row is the same rate. | $0.089 | 4 |
|
|
53
55
|
|
|
54
56
|
Input tokens are identical because the prompts were identical. Wall time for the wave is 154 seconds, shared.
|
|
55
57
|
|
|
@@ -151,7 +153,7 @@ Both refused a store and refused invented schema versions. Sonnet stopped at cha
|
|
|
151
153
|
- The judge saw condensations. Weekly is a one-point result and could flip. Argon, the reviewer switch, writer number two, and the journal gap are wider.
|
|
152
154
|
- The judge is one model, GPT-5.6 Sol, which is the CLI critic family. It was blind to the author and not blind to the shipped outcome.
|
|
153
155
|
- Token counts and list cost are estimates. Provider usage was not returned. A Claude subscription would record `costBasis: unmetered` for both models.
|
|
154
|
-
- Sonnet's price
|
|
156
|
+
- When these plans were scored, Sonnet's price was not in `.kxm/prices.yaml`. The list estimate came from the inventory. The admitted fallback now has that $2 / $10 row, verified on OpenRouter on 2026-10-20.
|
|
155
157
|
- Cursor subagents are not `claude -p` and not the KXM planner route. Effort was medium on both, matching the roster.
|
|
156
158
|
- Pull request 398, the plan-link repair, was not run. The six tasks are the five roster and docs slices from 401 through 405, plus the open Runtime journal gap.
|
|
157
159
|
- Plans were instructed not to use tools. A subagent that ignored that instruction could have read the landed diff. The Argon plans still describe the pre-change writer number two, which argues against that leak, and it is not proof.
|
|
@@ -1150,6 +1150,7 @@ kxm routes list
|
|
|
1150
1150
|
```
|
|
1151
1151
|
|
|
1152
1152
|
```text
|
|
1153
|
+
admitted anthropic/claude-sonnet-5.5
|
|
1153
1154
|
admitted anthropic/fable
|
|
1154
1155
|
admitted google/gemini-3.8-flash-high
|
|
1155
1156
|
admitted google/gemini-3.8-flash-medium
|
|
@@ -1162,6 +1163,7 @@ admitted openrouter/qwen/qwen3.8-flash
|
|
|
1162
1163
|
admitted openrouter/z-ai/glm-5.3-flash
|
|
1163
1164
|
admitted xai/grok-4.7
|
|
1164
1165
|
planner claude-fable
|
|
1166
|
+
planner claude-claude-sonnet-5-5
|
|
1165
1167
|
planner pi-qwen3-8-flash-openrouter
|
|
1166
1168
|
reviewer-arch claude-fable
|
|
1167
1169
|
reviewer-arch pi-glm-5-3-flash-openrouter
|
|
@@ -1181,7 +1183,7 @@ kxm routes list --json
|
|
|
1181
1183
|
```
|
|
1182
1184
|
|
|
1183
1185
|
```text
|
|
1184
|
-
{"schema":"kxm.cli-result.v1","ok":true,"command":"routes list","policy":{"schema":"kxm.routes.v2","updatedAt":"2026-10-
|
|
1186
|
+
{"schema":"kxm.cli-result.v1","ok":true,"command":"routes list","policy":{"schema":"kxm.routes.v2","updatedAt":"2026-10-20T22:40:00.000Z","admitted":["anthropic/claude-sonnet-5.5","anthropic/fable","google/gemini-3.8-flash-high","google/gemini-3.8-flash-medium","google/gemini-4-argon-high","google/gemini-4-argon-medium","openai/gpt-5.6-sol","openai/gpt-6.1-sol","openrouter/qwen/qwen3.7-plus","openrouter/qwen/qwen3.8-flash","openrouter/z-ai/glm-5.3-flash","xai/grok-4.7"],"disabled":[]},"membership":["planner claude-fable","planner claude-claude-sonnet-5-5","planner pi-qwen3-8-flash-openrouter","reviewer-arch claude-fable","reviewer-arch pi-glm-5-3-flash-openrouter","reviewer-cli codex-gpt-6-1-sol","reviewer-cli pi-qwen3-8-flash-openrouter","reviewer-cli codex-gpt-5-6-sol","writer grok-grok-4-7","writer pi-qwen3-7-plus-openrouter","writer agy-gemini-4-argon-high","writer agy-gemini-4-argon-medium","writer agy-gemini-3-8-flash-medium","writer agy-gemini-3-8-flash-high"]}
|
|
1185
1187
|
```
|
|
1186
1188
|
|
|
1187
1189
|
### `kxm routes count`
|
|
@@ -1082,6 +1082,13 @@ routes:
|
|
|
1082
1082
|
roles: [planner, reviewer-arch]
|
|
1083
1083
|
permissions: [read-only]
|
|
1084
1084
|
status: admitted
|
|
1085
|
+
claude-claude-sonnet-5-5:
|
|
1086
|
+
harness: claude
|
|
1087
|
+
model: claude-sonnet-5.5
|
|
1088
|
+
vendor: anthropic
|
|
1089
|
+
roles: [planner]
|
|
1090
|
+
permissions: [read-only]
|
|
1091
|
+
status: admitted
|
|
1085
1092
|
codex-gpt-6-1-sol:
|
|
1086
1093
|
harness: codex
|
|
1087
1094
|
model: gpt-6.1-sol
|
|
@@ -1098,7 +1105,7 @@ routes:
|
|
|
1098
1105
|
status: admitted
|
|
1099
1106
|
lineup: # routes admitted for each role, preference order
|
|
1100
1107
|
writer: [grok-grok-4-7, pi-qwen3-7-plus-openrouter, agy-gemini-4-argon-high, agy-gemini-4-argon-medium, agy-gemini-3-8-flash-medium, agy-gemini-3-8-flash-high]
|
|
1101
|
-
planner: [claude-fable, pi-qwen3-8-flash-openrouter]
|
|
1108
|
+
planner: [claude-fable, claude-claude-sonnet-5-5, pi-qwen3-8-flash-openrouter]
|
|
1102
1109
|
reviewer-arch: [claude-fable, pi-glm-5-3-flash-openrouter]
|
|
1103
1110
|
reviewer-cli: [codex-gpt-6-1-sol, pi-qwen3-8-flash-openrouter, codex-gpt-5-6-sol]
|
|
1104
1111
|
required_critics:
|
|
@@ -1112,6 +1119,11 @@ model_origins: # required for every Pi route model
|
|
|
1112
1119
|
sha256: 10e11cfa572ef4891e514d229fa8b7f0f355b31e6481315a6dd763bbe44244a1
|
|
1113
1120
|
```
|
|
1114
1121
|
|
|
1122
|
+
The planner lineup is `claude-fable`, then `claude-claude-sonnet-5-5`
|
|
1123
|
+
(selector `anthropic/claude-sonnet-5.5`, list price $2 input and $10 output
|
|
1124
|
+
per 1M tokens), then `pi-qwen3-8-flash-openrouter`. Fable stays primary.
|
|
1125
|
+
The comparison is the [October 2026 planner bake-off](../evals/planner-bakeoff-2026-10.md).
|
|
1126
|
+
|
|
1115
1127
|
Validated with `validateRosterDocument` from `scripts/roster-policy.mjs`,
|
|
1116
1128
|
reading evidence from this repository's history. The lineup order is not a
|
|
1117
1129
|
selection order: the assignment manifest names the harness and model, and the
|
|
@@ -1299,8 +1311,13 @@ node --disable-warning=ExperimentalWarning --experimental-strip-types scripts/re
|
|
|
1299
1311
|
`--dry-run` prints the summary and writes nothing. Exit 2 means a referenced
|
|
1300
1312
|
model would be kept after leaving the catalog. The workflow pushes a non-empty
|
|
1301
1313
|
diff to `automation/model-refresh` and opens or updates one pull request with
|
|
1302
|
-
|
|
1303
|
-
|
|
1314
|
+
a GitHub App installation token (`KXM_REFRESH_APP_ID` and
|
|
1315
|
+
`KXM_REFRESH_APP_PRIVATE_KEY`). The App is installed on `kontextmind/kxm`
|
|
1316
|
+
only, with Contents read and write and Pull requests read and write. A missing
|
|
1317
|
+
secret fails the job and names both secrets. Setup is in
|
|
1318
|
+
[Refresh model prices and inventory](../contributing/development.md#refresh-model-prices-and-inventory).
|
|
1319
|
+
`GITHUB_TOKEN` posts the `model-catalog-guard` status and dispatches `ci.yml`
|
|
1320
|
+
on that branch. `ci.yml` does not run on a push to `automation/model-refresh`.
|
|
1304
1321
|
|
|
1305
1322
|
## Personalization settings (`kxm.config.v1`)
|
|
1306
1323
|
|
|
@@ -406,6 +406,8 @@ A larger context window on the OpenRouter route does not make OpenRouter an allo
|
|
|
406
406
|
|
|
407
407
|
**KXM picks the native route, and fails closed when `claude` is logged out.** Pi's `anthropic` provider may report `ready`, and OpenRouter lists the same model. Neither may stand in, and the brake refuses both. This is the motivating case for the whole rule. The operator runs `claude auth login`, and the run waits until then.
|
|
408
408
|
|
|
409
|
+
The planner roster keeps `claude-fable` first. The next route is `claude-claude-sonnet-5-5`: harness `claude`, model `claude-sonnet-5.5`, vendor `anthropic`, selector `anthropic/claude-sonnet-5.5`, permission `read-only`, effort `medium`. `pi-qwen3-8-flash-openrouter` stays after that, and it is the other-vendor fallback. Architecture review stays `claude-fable`. The [October 2026 planner bake-off](../evals/planner-bakeoff-2026-10.md) scored Sonnet 5.5 at 126 and Fable at 110 out of 150. Sonnet won four of six tasks. List price favors Sonnet by about five to one, and that sample was not enough to replace the primary, so Sonnet is the fallback. OpenRouter's live catalog on 2026-10-20 (`https://openrouter.ai/api/v1/models`, id `anthropic/claude-sonnet-5.5`) lists $2 input and $10 output per 1M tokens, cache read $0.10, cache write $2.50, context 1,000,000. That standard tier is the `.kxm/prices.yaml` row. The batch id is a different catalog row and is not admitted.
|
|
410
|
+
|
|
409
411
|
### Gemini 3.8 Flash
|
|
410
412
|
|
|
411
413
|
| | Native `agy` | `antigravity` Pi provider | Pi + OpenRouter |
|
|
@@ -526,8 +528,9 @@ OpenRouter list prices in `.kxm/prices.yaml` and `.kxm/models/inventory.yaml`
|
|
|
526
528
|
go stale as models are added, removed, and repriced. A Monday 13:00 UTC
|
|
527
529
|
workflow, `.github/workflows/refresh-models.yml`, fetches the public OpenRouter
|
|
528
530
|
models API and opens one pull request on `automation/model-refresh` when the
|
|
529
|
-
catalog changed. The pull request
|
|
530
|
-
|
|
531
|
+
catalog changed. The pull request is opened with a GitHub App token. App
|
|
532
|
+
setup is in [Refresh model prices and inventory](../contributing/development.md#refresh-model-prices-and-inventory).
|
|
533
|
+
The pull request body lists models added, removed, and repriced. A route or roster model that disappeared, or whose input or output
|
|
531
534
|
rate moved by more than 20 percent, is listed first. A disappeared referenced
|
|
532
535
|
model stays in the inventory with `missingUpstream: true`, and the
|
|
533
536
|
`model-catalog-guard` check fails until someone removes the reference or
|
|
@@ -22,7 +22,8 @@ This catalog names common multi-agent workflows by area and lists, for each role
|
|
|
22
22
|
|
|
23
23
|
The catalog is a four-level taxonomy: **Area → Workflow → Stage → Role**. Each area groups related workflows, each workflow lists its stages in order, and each role belongs to one stage, with a short domain description and up to five ranked candidate models.
|
|
24
24
|
|
|
25
|
-
- **Candidates are dated research.** The lists come from a documentation snapshot taken on 2026-09-06. Prices (USD per million input and output tokens), context windows and capability notes were not re-verified after that date. Verify them before you dispatch work, and read every quality note as a research claim, not a guarantee.
|
|
25
|
+
- **Candidates are dated research.** The lists come from a documentation snapshot taken on 2026-09-06. Prices (USD per million input and output tokens), context windows and capability notes were not re-verified after that date, except for the retired writer model below. Verify them before you dispatch work, and read every quality note as a research claim, not a guarantee.
|
|
26
|
+
- **Writer #2 is Qwen3.7 Plus.** `qwen/qwen3-coder-plus` left the OpenRouter catalog (404) and is not a roster route. Candidate lines that named it now name `qwen/qwen3.7-plus` at the 2026-10-17 list price, $0.32 input and $1.28 output per 1M tokens, 1M context. This repository's writer #2 is the route `pi-qwen3-7-plus-openrouter` (model `openrouter/qwen/qwen3.7-plus`). The writer roster, in order, is `grok-grok-4-7`, `pi-qwen3-7-plus-openrouter`, `agy-gemini-4-argon-high`, `agy-gemini-4-argon-medium`, `agy-gemini-3-8-flash-medium`, `agy-gemini-3-8-flash-high`. [Harness routing](harness-routing.md) is the admission record.
|
|
26
27
|
- **Candidates are not admission.** A model ID here is a research identifier, not a route selector. Your project admits routes in `.kxm/routes.yaml`, and `kxm harness list` shows which harnesses are installed and signed in. [Harness routing](harness-routing.md) explains when to use a native harness and when an aggregator.
|
|
27
28
|
- **Selection is per role.** Areas are navigation only; they never pool unrelated roles into one ranking. Model, harness, platform, modality and required tools are routing attributes, not areas.
|
|
28
29
|
- **Gates stay deterministic.** Where a role is a critic next to a gate, the gate (tests, type checks, linters) decides pass or fail, and the model reviews what a gate cannot check.
|
|
@@ -34,7 +35,7 @@ An interactive `kxm init` offers to install the Software Engineering workflows w
|
|
|
34
35
|
| Tier | Price band | Context window | Example models | Typical work |
|
|
35
36
|
|---|---|---|---|---|
|
|
36
37
|
| **Tier 0: Filter and ingestion** | $0.03 - $0.20 / M | 1.0M - 1.31M | DeepSeek-V4-Flash, Qwen-3.7-Flash, GLM-5.3-Flash, GPT-5.6-Luna | High-throughput telemetry, raw log ingestion, triage, video pre-filtering, and initial inbox classification. |
|
|
37
|
-
| **Tier 1: Workhorse** | $0.30 - $1.00 / M | 262k - 1.05M | Gemini-3.8-Flash, Qwen-3-
|
|
38
|
+
| **Tier 1: Workhorse** | $0.30 - $1.00 / M | 262k - 1.05M | Gemini-3.8-Flash, Qwen-3.7-Plus, DeepSeek-V4-Pro, Devstral-2512 | Routine code generation, multimodal visual QA, Text-to-SQL, AST diff patching, and fast tool dispatching. |
|
|
38
39
|
| **Tier 2: Precision and critic** | $1.25 - $4.00 / M | 200k - 1.05M | GPT-5.6-Sol, Grok-4.6, Claude Sonnet 5, OpenAI o3, DeepSeek-R1, Codex 5.3 | Primary code writing, formal contract generation, concurrency race diagnosis, and causal inference. |
|
|
39
40
|
| **Tier 3: Architecture** | $5.00 - $15.00 / M | 1.0M - 1.05M | Claude Fable 5.1, Claude Opus 5, GPT-6-Astra-Pro (escalation only) | Architecture review, executive briefs, high-stakes legal redlining, and RFC review. |
|
|
40
41
|
|
|
@@ -144,7 +145,7 @@ This cross-reference points each software and security workflow at the KXM pages
|
|
|
144
145
|
1. **`openai/gpt-5.6-sol`** (1.05M ctx | $2.00 / $10.00) — Premier schema contract generator; 100% compliant OpenAPI 3.1, Protobuf v3, and JSON schemas.
|
|
145
146
|
2. **`deepseek/deepseek-v4-pro-0813`** (1.05M ctx | $0.58 / $1.74) — High-throughput Zod/Pydantic validation pipeline synthesis.
|
|
146
147
|
3. **`google/gemini-3.8-flash`** (1.05M ctx | $0.75 / $3.75) — Fast translation of data dictionaries into TypeScript interfaces.
|
|
147
|
-
4. **`qwen/qwen3-
|
|
148
|
+
4. **`qwen/qwen3.7-plus`** (1M ctx | $0.32 / $1.28) — 1M-context contract verification across monorepo boundaries.
|
|
148
149
|
5. **`anthropic/claude-fable-5.1`** (1M ctx | $10.00 / $50.00) — Reserved for mission-critical authentication and security contract definitions.
|
|
149
150
|
|
|
150
151
|
#### Role: Scaffold Build Specialist
|
|
@@ -155,7 +156,7 @@ This cross-reference points each software and security workflow at the KXM pages
|
|
|
155
156
|
|
|
156
157
|
1. **`x-ai/grok-4.6`** (500k ctx | $2.00 / $6.00) — Fast repository builder; resolves path aliases, links, and workspace configs cleanly.
|
|
157
158
|
2. **`mistralai/devstral-2512`** (262k ctx | $0.40 / $2.00) — Developer-focused open model; produces clean Makefiles, Taskfiles, and tool configs.
|
|
158
|
-
3. **`qwen/qwen3-
|
|
159
|
+
3. **`qwen/qwen3.7-plus`** (1M ctx | $0.32 / $1.28) — Coordinates cross-package build configs and dependency lockfiles in 1M context.
|
|
159
160
|
4. **`openai/gpt-5.3-codex`** (400k ctx | $1.75 / $14.00) — Complex CI/CD workflows and multi-stage container build optimizations.
|
|
160
161
|
5. **`kwaipilot/kat-coder-pro-v2.5`** (262k ctx | $0.74 / $2.96) — Resilient project scaffolding and bundler configuration.
|
|
161
162
|
|
|
@@ -166,7 +167,7 @@ This cross-reference points each software and security workflow at the KXM pages
|
|
|
166
167
|
*Domain:* Implements domain entities, SQL queries/migrations, ORM persistence, concurrency primitives, and transactional boundaries.
|
|
167
168
|
|
|
168
169
|
1. **`x-ai/grok-4.6`** (500k ctx | $2.00 / $6.00) — Strong first-pass implementation that passes deterministic verification gates with minimal rework.
|
|
169
|
-
2. **`qwen/qwen3-
|
|
170
|
+
2. **`qwen/qwen3.7-plus`** (1M ctx | $0.32 / $1.28) — 1M-context open-weight anchor; generates performant database layers and CRUD services.
|
|
170
171
|
3. **`deepseek/deepseek-v4-pro-0813`** (1.05M ctx | $0.58 / $1.74) — Exceptional database logic, indexing, and edge-case domain implementation.
|
|
171
172
|
4. **`openai/gpt-5.3-codex`** (400k ctx | $1.75 / $14.00) — Algorithmic precision in Rust, Go, Python, and TypeScript concurrent systems.
|
|
172
173
|
5. **`kwaipilot/kat-coder-pro-v2.5`** (262k ctx | $0.74 / $2.96) — Multi-file backend logic implementation adhering to project coding patterns.
|
|
@@ -191,7 +192,7 @@ This cross-reference points each software and security workflow at the KXM pages
|
|
|
191
192
|
|
|
192
193
|
1. **`openai/gpt-5.6-sol`** (1.05M ctx | $2.00 / $10.00) — Flawless SDK synthesis, webhook signature validation, and API adapter error handling.
|
|
193
194
|
2. **`x-ai/grok-4.6`** (500k ctx | $2.00 / $6.00) — Robust glue code, rate-limiting backoff algorithms, and token refresh loops.
|
|
194
|
-
3. **`qwen/qwen3-
|
|
195
|
+
3. **`qwen/qwen3.7-plus`** (1M ctx | $0.32 / $1.28) — Ingests full third-party API documentation to emit typed wrapper clients.
|
|
195
196
|
4. **`deepseek/deepseek-v4-pro-0813`** (1.05M ctx | $0.58 / $1.74) — Low-cost mapping of disparate vendor payloads into internal domain models.
|
|
196
197
|
5. **`google/gemini-3.8-flash`** (1.05M ctx | $0.75 / $3.75) — High-speed webhook listener and protocol transformation adapter.
|
|
197
198
|
|
|
@@ -310,7 +311,7 @@ This cross-reference points each software and security workflow at the KXM pages
|
|
|
310
311
|
*Domain:* Generates declarative Terraform/OpenTofu, Pulumi, Kubernetes CRDs, and VPC networking definitions.
|
|
311
312
|
|
|
312
313
|
1. **`x-ai/grok-4.6`** (500k ctx | $2.00 / $6.00) — Fast, deterministic Terraform/Kubernetes manifest implementation.
|
|
313
|
-
2. **`qwen/qwen3-
|
|
314
|
+
2. **`qwen/qwen3.7-plus`** (1M ctx | $0.32 / $1.28) — 1M context whole-infrastructure state dependency resolution.
|
|
314
315
|
3. **`openai/gpt-5.3-codex`** (400k ctx | $1.75 / $14.00) — Complex cloud provider networking and peering configurations.
|
|
315
316
|
4. **`google/gemini-3.8-flash`** (1.05M ctx | $0.75 / $3.75) — High-speed validation of cloud resources and linting.
|
|
316
317
|
5. **`mistralai/devstral-2512`** (262k ctx | $0.40 / $2.00) — Lightweight Helm chart and Docker Compose generator.
|
|
@@ -366,7 +367,7 @@ This cross-reference points each software and security workflow at the KXM pages
|
|
|
366
367
|
*Domain:* Authors concise, accurate developer and operator documentation, ensuring clear terminology, correct command flags, and consistent formatting without marketing drift.
|
|
367
368
|
|
|
368
369
|
1. **`x-ai/grok-4.6`** (500k ctx | $2.00 / $6.00) — Rapid, structured Markdown authoring that follows repository conventions.
|
|
369
|
-
2. **`qwen/qwen3-
|
|
370
|
+
2. **`qwen/qwen3.7-plus`** (1M ctx | $0.32 / $1.28) — High-context technical writer; coordinates cross-file references across large documentation sets.
|
|
370
371
|
3. **`anthropic/claude-sonnet-5`** (1M ctx | $2.00 / $10.00) — Fluid technical documentation authoring with clear instructional hierarchy.
|
|
371
372
|
4. **`openai/gpt-5.3-codex`** (400k ctx | $1.75 / $14.00) — Accurate technical guides, CLI flag references, and runnable examples.
|
|
372
373
|
5. **`deepseek/deepseek-v4-pro-0813`** (1.05M ctx | $0.58 / $1.74) — Cost-effective multi-page documentation generation and reference expansion.
|
|
@@ -412,7 +413,7 @@ This cross-reference points each software and security workflow at the KXM pages
|
|
|
412
413
|
|
|
413
414
|
1. **`anthropic/claude-opus-5`** (1M ctx | $5.00 / $25.00) — Master design token taxonomist; color space (OKLCH) and scale hierarchy.
|
|
414
415
|
2. **`anthropic/claude-sonnet-5`** (1M ctx | $2.00 / $10.00) — Multi-platform token transformation (W3C Design Tokens to CSS/iOS/Android).
|
|
415
|
-
3. **`qwen/qwen3-
|
|
416
|
+
3. **`qwen/qwen3.7-plus`** (1M ctx | $0.32 / $1.28) — Monorepo theme implementation and code generation.
|
|
416
417
|
4. **`google/gemini-3.8-flash`** (1.05M ctx | $0.75 / $3.75) — Fast token validation and contrast ratio auditing.
|
|
417
418
|
5. **`openai/gpt-5.4`** (1.05M ctx | $2.50 / $15.00) — Enterprise design system cross-platform consistency.
|
|
418
419
|
|
|
@@ -455,7 +456,7 @@ This cross-reference points each software and security workflow at the KXM pages
|
|
|
455
456
|
*Domain:* Apple CoreHaptics (`.ahap` waveforms), Android `VibrationEffect` compositions, JSI hardware bridges, and tactile throttling.
|
|
456
457
|
|
|
457
458
|
1. **`mistralai/codestral-2508`** (256k ctx | $0.30 / $0.90) — Low-latency, precise hardware API bindings (Swift/Kotlin/C++).
|
|
458
|
-
2. **`qwen/qwen3-
|
|
459
|
+
2. **`qwen/qwen3.7-plus`** (1M ctx | $0.32 / $1.28) — High-throughput cross-platform haptic wrapper synthesizer.
|
|
459
460
|
3. **`anthropic/claude-sonnet-5`** (1M ctx | $2.00 / $10.00) — Fine-grained haptic feedback design and event mapping.
|
|
460
461
|
4. **`openai/gpt-5.4`** (1.05M ctx | $2.50 / $15.00) — Hardware sensor integration and battery lifecycle optimization.
|
|
461
462
|
5. **`openai/gpt-5.6-luna`** (1.05M ctx | $0.20 / $1.20) — Fast AHAP waveform JSON serialization.
|
|
@@ -488,7 +489,7 @@ This cross-reference points each software and security workflow at the KXM pages
|
|
|
488
489
|
|
|
489
490
|
1. **`openai/gpt-5.3-codex`** (400k ctx | $1.75 / $14.00) — Flawless asynchronous event loop (Tokio/TEA) and POSIX termios handling.
|
|
490
491
|
2. **`openai/gpt-5.6-sol`** (1.05M ctx | $2.00 / $10.00) — Flagship CLI and sub-process navigation specialist; signal cleanup.
|
|
491
|
-
3. **`qwen/qwen3-
|
|
492
|
+
3. **`qwen/qwen3.7-plus`** (1M ctx | $0.32 / $1.28) — High-precision Rust/Go async event handling and state dispatch.
|
|
492
493
|
4. **`anthropic/claude-opus-5`** (1M ctx | $5.00 / $25.00) — Complex modal keybinding architectures (Vim/Emacs emulation).
|
|
493
494
|
5. **`anthropic/claude-sonnet-5`** (1M ctx | $2.00 / $10.00) — Clean command routing and keyboard navigation schemas.
|
|
494
495
|
|
|
@@ -520,7 +521,7 @@ This cross-reference points each software and security workflow at the KXM pages
|
|
|
520
521
|
|
|
521
522
|
1. **`anthropic/claude-sonnet-5`** (1M ctx | $2.00 / $10.00) — Gold standard for semantic HTML, ARIA tree hierarchies, and focus management.
|
|
522
523
|
2. **`google/gemini-3.8-flash`** (1.05M ctx | $0.75 / $3.75) — Automated WCAG 2.2 color contrast and visual touch-target auditor.
|
|
523
|
-
3. **`qwen/qwen3-
|
|
524
|
+
3. **`qwen/qwen3.7-plus`** (1M ctx | $0.32 / $1.28) — High-throughput AST accessibility linter and automated ARIA fixer.
|
|
524
525
|
4. **`anthropic/claude-opus-5`** (1M ctx | $5.00 / $25.00) — Cognitive load and neurodiverse accessibility compliance evaluation.
|
|
525
526
|
5. **`openai/gpt-5.4`** (1.05M ctx | $2.50 / $15.00) — Screen-reader script simulation and compliance reporting.
|
|
526
527
|
|
|
@@ -663,7 +664,7 @@ This cross-reference points each software and security workflow at the KXM pages
|
|
|
663
664
|
*Domain:* Emits executable FFmpeg filtergraphs, OpenTimelineIO (OTIO) JSON, and Remotion/DaVinci Resolve Python scripts.
|
|
664
665
|
|
|
665
666
|
1. **`openai/gpt-5.3-codex`** (400k ctx | $1.75 / $14.00) — Frontier code generation for complex multi-input FFmpeg filtergraphs and OTIO structures.
|
|
666
|
-
2. **`qwen/qwen3-
|
|
667
|
+
2. **`qwen/qwen3.7-plus`** (1M ctx | $0.32 / $1.28) — 1M-context Remotion/React-video and Python automation specialist at low cost.
|
|
667
668
|
3. **`anthropic/claude-opus-5`** (1M ctx | $5.00 / $25.00) — Multi-track timecode arithmetic, drop-frame calculations, and nested timeline logic.
|
|
668
669
|
4. **`google/gemini-3.8-flash`** (1.05M ctx | $0.75 / $3.75) — Inspects raw asset metadata directly and constructs execution CLI commands.
|
|
669
670
|
5. **`mistralai/devstral-2512`** (262k ctx | $0.40 / $2.00) — Lightweight Bash and Python timeline glue scripts.
|
|
@@ -707,7 +708,7 @@ This cross-reference points each software and security workflow at the KXM pages
|
|
|
707
708
|
*Domain:* Translates natural language questions into performant SQL queries (CTEs, window functions) across enterprise warehouses.
|
|
708
709
|
|
|
709
710
|
1. **`openai/gpt-5.3-codex`** (400k ctx | $1.75 / $14.00) — Complex nested SQL queries, CTEs, and window functions.
|
|
710
|
-
2. **`qwen/qwen3-
|
|
711
|
+
2. **`qwen/qwen3.7-plus`** (1M ctx | $0.32 / $1.28) — Ingests 1,000-table enterprise data dictionaries in 1M context.
|
|
711
712
|
3. **`deepseek/deepseek-v4-pro`** (1.05M ctx | $0.63 / $1.25) — High-throughput Text-to-SQL generation.
|
|
712
713
|
4. **`anthropic/claude-opus-5`** (1M ctx | $5.00 / $25.00) — Ambiguous business metric semantic translation.
|
|
713
714
|
5. **`google/gemini-3.8-flash`** (1.05M ctx | $0.75 / $3.75) — Ultra-fast schema resolution and join mapping.
|
|
@@ -721,7 +722,7 @@ This cross-reference points each software and security workflow at the KXM pages
|
|
|
721
722
|
1. **`openai/o3`** (200k ctx | $2.00 / $8.00) — Query execution plan optimization and index utilization logic.
|
|
722
723
|
2. **`deepseek/deepseek-r1-0528`** (164k ctx | $0.50 / $2.15) — High-efficiency algorithmic query rewriting.
|
|
723
724
|
3. **`openai/gpt-5.3-codex`** (400k ctx | $1.75 / $14.00) — Database engine-specific syntax correction (Postgres/Snowflake/BigQuery).
|
|
724
|
-
4. **`qwen/qwen3-
|
|
725
|
+
4. **`qwen/qwen3.7-plus`** (1M ctx | $0.32 / $1.28) — Cost-efficient automated query correction loop.
|
|
725
726
|
5. **`anthropic/claude-sonnet-5`** (1M ctx | $2.00 / $10.00) — Enterprise data governance and query compliance.
|
|
726
727
|
|
|
727
728
|
#### Role: BI Dashboard Formatter
|
|
@@ -751,7 +752,7 @@ This cross-reference points each software and security workflow at the KXM pages
|
|
|
751
752
|
*Domain:* Writes vectorized, performant Python code for feature engineering, statistical modeling, and ML pipelines.
|
|
752
753
|
|
|
753
754
|
1. **`openai/gpt-5.3-codex`** (400k ctx | $1.75 / $14.00) — Complex numerical analysis, PyTorch/Scikit pipelines.
|
|
754
|
-
2. **`qwen/qwen3-
|
|
755
|
+
2. **`qwen/qwen3.7-plus`** (1M ctx | $0.32 / $1.28) — High-capacity Python data science code generator with 1M context.
|
|
755
756
|
3. **`mistralai/codestral-2508`** (256k ctx | $0.30 / $0.90) — Extremely low-cost Polars/Pandas data pipeline implementation.
|
|
756
757
|
4. **`anthropic/claude-opus-5`** (1M ctx | $5.00 / $25.00) — Complex econometric and Bayesian model formulation.
|
|
757
758
|
5. **`deepseek/deepseek-v4-pro-0813`** (1.05M ctx | $0.58 / $1.74) — Large-scale data ingestion and transformation scripts.
|
|
@@ -1033,7 +1034,7 @@ This cross-reference points each software and security workflow at the KXM pages
|
|
|
1033
1034
|
*Domain:* Translates trace observations into isolated, runnable reproduction unit/integration tests and scripts.
|
|
1034
1035
|
|
|
1035
1036
|
1. **`x-ai/grok-4.6`** (500k ctx | $2.00 / $6.00) — Fast, repo-accurate test writer; minimal boilerplate without hallucinating dependencies.
|
|
1036
|
-
2. **`qwen/qwen3-
|
|
1037
|
+
2. **`qwen/qwen3.7-plus`** (1M ctx | $0.32 / $1.28) — Ingests full test frameworks; generates parameterized reproduction suites.
|
|
1037
1038
|
3. **`openai/gpt-5.3-codex`** (400k ctx | $1.75 / $14.00) — Specialized mocking of network calls, clocks, and internal database states.
|
|
1038
1039
|
4. **`anthropic/claude-sonnet-5`** (1M ctx | $2.00 / $10.00) — Parameterized property-based regression test harnesses (Hypothesis/QuickCheck).
|
|
1039
1040
|
5. **`mistralai/devstral-2512`** (262k ctx | $0.40 / $2.00) — Concise, executable unit-test reproductions.
|
|
@@ -1066,7 +1067,7 @@ This cross-reference points each software and security workflow at the KXM pages
|
|
|
1066
1067
|
|
|
1067
1068
|
1. **`openai/gpt-5.3-codex`** (400k ctx | $1.75 / $14.00) — Surgical security patch generator using secure coding primitives.
|
|
1068
1069
|
2. **`x-ai/grok-4.6`** (500k ctx | $2.00 / $6.00) — Rapid patch application that passes deterministic verification cleanly.
|
|
1069
|
-
3. **`qwen/qwen3-
|
|
1070
|
+
3. **`qwen/qwen3.7-plus`** (1M ctx | $0.32 / $1.28) — High-throughput defensive refactoring across large repos.
|
|
1070
1071
|
4. **`anthropic/claude-sonnet-5`** (1M ctx | $2.00 / $10.00) — Applies defensive validation without breaking valid user flows.
|
|
1071
1072
|
5. **`bytedance-seed/seed-2.0-code`** (262k ctx | $0.50 / $3.00) — Web and client-side sanitization hardening.
|
|
1072
1073
|
|
package/package.json
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"$schema": "https://json.schemastore.org/claude-code-plugin-manifest.json",
|
|
3
3
|
"name": "kxm",
|
|
4
4
|
"displayName": "KXM",
|
|
5
|
-
"version": "0.7.
|
|
5
|
+
"version": "0.7.193",
|
|
6
6
|
"description": "Headless multi-agent orchestration, durable workflows, and a live operator dashboard for Pi and Claude Code",
|
|
7
7
|
"author": {
|
|
8
8
|
"name": "KontextMind",
|
|
@@ -25462,7 +25462,7 @@ function sessionTokenFixHint(policy) {
|
|
|
25462
25462
|
}
|
|
25463
25463
|
|
|
25464
25464
|
// plugins/kxm/src/mcp-server.ts
|
|
25465
|
-
var VERSION = "0.7.
|
|
25465
|
+
var VERSION = "0.7.193";
|
|
25466
25466
|
var CONFIGURE_PLUGIN = "/plugin configure kxm@kxm";
|
|
25467
25467
|
var inbox = /* @__PURE__ */ new Map();
|
|
25468
25468
|
var notifiedInbox = /* @__PURE__ */ new Set();
|
package/plugins/kxm/package.json
CHANGED
|
@@ -11,7 +11,7 @@ import { deliverInboxNotification } from "./inbox.ts";
|
|
|
11
11
|
import type { HubEvent, MessageRecord } from "./protocol.ts";
|
|
12
12
|
import { sessionTokenFixHint } from "./session-token-hint.ts";
|
|
13
13
|
|
|
14
|
-
const VERSION = "0.7.
|
|
14
|
+
const VERSION = "0.7.193";
|
|
15
15
|
const CONFIGURE_PLUGIN = "/plugin configure kxm@kxm";
|
|
16
16
|
const inbox = new Map<string, MessageRecord>();
|
|
17
17
|
const notifiedInbox = new Set<string>();
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { existsSync, readdirSync, readFileSync } from "node:fs";
|
|
2
2
|
import { join } from "node:path";
|
|
3
|
-
import { isAlias, isMap, isSeq, parse, parseDocument, stringify, type YAMLMap } from "yaml";
|
|
3
|
+
import { isAlias, isMap, isSeq, parse, parseDocument, stringify, type YAMLMap, type YAMLSeq } from "yaml";
|
|
4
4
|
import type { PriceCatalog } from "./price-calc.ts";
|
|
5
5
|
import { hashPriceCatalog, parsePriceCatalog } from "./prices.ts";
|
|
6
6
|
import {
|
|
@@ -131,7 +131,9 @@ function priceRowTokens(row: LoosePriceRow): string[] {
|
|
|
131
131
|
if (row.model.includes("/")) add(row.model);
|
|
132
132
|
else add(`${row.provider}/${row.model}`);
|
|
133
133
|
// Aliases on native and OpenRouter rows point at the catalog id. A different
|
|
134
|
-
// plan (qwen-token-plan, zai-coding-cn) keeps its own rate
|
|
134
|
+
// plan (qwen-token-plan, zai-coding-cn) keeps its own rate. A YAML anchor that
|
|
135
|
+
// a non-OpenRouter row depends on is not rewritten: the OpenRouter row is
|
|
136
|
+
// detached onto its own tier and the plan row keeps the anchored rates.
|
|
135
137
|
const trackAliases = new Set(["anthropic", "openai", "google", "xai", "openrouter"]);
|
|
136
138
|
if (trackAliases.has(row.provider)) {
|
|
137
139
|
for (const alias of row.aliases ?? []) add(alias.includes("/") ? alias : `${row.provider}/${alias}`);
|
|
@@ -250,6 +252,71 @@ function writeTierRates(map: YAMLMap, previous: InventoryPrice, incoming: Invent
|
|
|
250
252
|
return changed;
|
|
251
253
|
}
|
|
252
254
|
|
|
255
|
+
function mapString(row: YAMLMap, key: string): string | undefined {
|
|
256
|
+
const value = row.get(key);
|
|
257
|
+
return typeof value === "string" ? value : undefined;
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
function soleTier(row: YAMLMap): { tiers: YAMLSeq; tier: unknown } | undefined {
|
|
261
|
+
const tiers = row.get("tiers", true);
|
|
262
|
+
if (!isSeq(tiers) || tiers.items.length !== 1) return undefined;
|
|
263
|
+
return { tiers, tier: tiers.items[0] };
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
function anchorName(tier: unknown): string | undefined {
|
|
267
|
+
if (isMap(tier) && tier.anchor) return tier.anchor;
|
|
268
|
+
if (isAlias(tier)) return tier.source;
|
|
269
|
+
return undefined;
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
function nonOpenRouterDependsOn(models: YAMLSeq, anchor: string): boolean {
|
|
273
|
+
for (const row of models.items) {
|
|
274
|
+
if (!isMap(row) || mapString(row, "provider") === "openrouter") continue;
|
|
275
|
+
const sole = soleTier(row);
|
|
276
|
+
if (sole && anchorName(sole.tier) === anchor) return true;
|
|
277
|
+
}
|
|
278
|
+
return false;
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
function rateTierNode(doc: ReturnType<typeof parseDocument>, rates: InventoryPrice, anchor?: string): YAMLMap {
|
|
282
|
+
const node = doc.createNode({
|
|
283
|
+
inputPerMillion: rates.inputPerMillion,
|
|
284
|
+
outputPerMillion: rates.outputPerMillion,
|
|
285
|
+
cacheReadPerMillion: rates.cacheReadPerMillion,
|
|
286
|
+
cacheWritePerMillion: rates.cacheWritePerMillion,
|
|
287
|
+
});
|
|
288
|
+
if (!isMap(node)) throw new Error("price tier must be a map");
|
|
289
|
+
if (anchor) node.anchor = anchor;
|
|
290
|
+
return node;
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
/**
|
|
294
|
+
* Gives an OpenRouter row its own tier. The shared anchor, and every
|
|
295
|
+
* non-OpenRouter row that uses it, keep the rates they had.
|
|
296
|
+
*/
|
|
297
|
+
function detachOpenRouterTier(doc: ReturnType<typeof parseDocument>, models: YAMLSeq, row: YAMLMap, anchor: string, incoming: InventoryPrice): boolean {
|
|
298
|
+
const sole = soleTier(row);
|
|
299
|
+
if (!sole) return false;
|
|
300
|
+
const { tiers, tier } = sole;
|
|
301
|
+
if (isAlias(tier)) {
|
|
302
|
+
tiers.items[0] = rateTierNode(doc, incoming);
|
|
303
|
+
return true;
|
|
304
|
+
}
|
|
305
|
+
if (!isMap(tier) || tier.anchor !== anchor) return false;
|
|
306
|
+
const previous = tierRates(tier.toJSON() as Record<string, unknown>);
|
|
307
|
+
if (!previous) return false;
|
|
308
|
+
for (const other of models.items) {
|
|
309
|
+
if (!isMap(other) || other === row || mapString(other, "provider") === "openrouter") continue;
|
|
310
|
+
const alias = soleTier(other);
|
|
311
|
+
if (!alias || !isAlias(alias.tier) || alias.tier.source !== anchor) continue;
|
|
312
|
+
delete tier.anchor;
|
|
313
|
+
alias.tiers.items[0] = rateTierNode(doc, previous, anchor);
|
|
314
|
+
tiers.items[0] = rateTierNode(doc, incoming);
|
|
315
|
+
return true;
|
|
316
|
+
}
|
|
317
|
+
return false;
|
|
318
|
+
}
|
|
319
|
+
|
|
253
320
|
function updatePrices(text: string, updates: Map<string, InventoryPrice>, date: string): { text: string; dateChanged: boolean } {
|
|
254
321
|
if (updates.size === 0) return { text, dateChanged: false };
|
|
255
322
|
const doc = parseDocument(text);
|
|
@@ -271,9 +338,14 @@ function updatePrices(text: string, updates: Map<string, InventoryPrice>, date:
|
|
|
271
338
|
if (typeof id !== "string" || !updates.has(id)) continue;
|
|
272
339
|
const incoming = updates.get(id);
|
|
273
340
|
if (!incoming) continue;
|
|
274
|
-
const
|
|
275
|
-
if (!
|
|
276
|
-
const tier =
|
|
341
|
+
const sole = soleTier(row);
|
|
342
|
+
if (!sole) continue;
|
|
343
|
+
const { tier } = sole;
|
|
344
|
+
const name = anchorName(tier);
|
|
345
|
+
if (name && mapString(row, "provider") === "openrouter" && nonOpenRouterDependsOn(models, name)) {
|
|
346
|
+
if (detachOpenRouterTier(doc, models, row, name, incoming)) wrote = true;
|
|
347
|
+
continue;
|
|
348
|
+
}
|
|
277
349
|
const target = isMap(tier) ? tier : (isAlias(tier) ? maps.get(String(tier.source)) : undefined);
|
|
278
350
|
if (!target || seen.has(target)) continue;
|
|
279
351
|
seen.add(target);
|
package/scripts/harness-run.mjs
CHANGED
|
@@ -156,7 +156,7 @@ export const ROUTES = Object.freeze({
|
|
|
156
156
|
provider: "anthropic",
|
|
157
157
|
roles: Object.freeze(["planner", "reviewer-arch"]),
|
|
158
158
|
permissions: Object.freeze(["read-only"]),
|
|
159
|
-
models: Object.freeze(["fable"]),
|
|
159
|
+
models: Object.freeze(["fable", "claude-sonnet-5.5"]),
|
|
160
160
|
efforts: Object.freeze(["low", "medium", "high", "xhigh", "max"]),
|
|
161
161
|
auth: Object.freeze({ args: ["auth", "status"], loginHint: "claude auth login" }),
|
|
162
162
|
},
|