@kontextmind/kxm 0.7.145 → 0.7.147
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/README.md +20 -2
- package/.kxm/agents/{coordinator.yaml → planner.yaml} +2 -0
- package/.kxm/agents/{critic-arch.yaml → reviewer-arch.yaml} +2 -0
- package/.kxm/agents/{critic-cli.yaml → reviewer-cli.yaml} +2 -0
- package/.kxm/agents/{implementer.yaml → writer.yaml} +2 -0
- package/.kxm/roles/planner.yaml +4 -2
- package/.kxm/roles/reviewer-arch.yaml +4 -2
- package/.kxm/roles/reviewer-cli.yaml +4 -2
- package/.kxm/roles/writer.yaml +6 -3
- package/.kxm/workflows/default.yaml +20 -12
- package/.kxm/workflows/land.yaml +1 -1
- package/.kxm/workflows/{review-arch-only.yaml → reviewer-arch-only.yaml} +7 -3
- package/.kxm/workflows/{review-cli-only.yaml → reviewer-cli-only.yaml} +7 -3
- package/.kxm/workflows/{implement-only.yaml → writer-only.yaml} +8 -4
- package/CHANGELOG.md +48 -8
- package/docs/README.md +1 -1
- package/docs/adr/ADR-0002-browser-automation-steel-doks.md +8 -5
- package/docs/adr/ADR-0005-obscura-default-playwright.md +4 -3
- package/docs/adr/ADR-0006-machine-account-names.md +90 -0
- package/docs/adr/ADR-0007-steel-caddy-authentik.md +97 -0
- package/docs/adr/README.md +3 -1
- package/docs/contributing/harness-routing-internals.md +17 -11
- package/docs/contributing/operating-rules.md +13 -1
- package/docs/guides/agent-skills.md +1 -1
- package/docs/guides/browser-automation.md +44 -28
- package/docs/kb/how-credentials-retrieved-safely.md +22 -23
- package/docs/kb/how-to-connect-playwright-to-steel.md +8 -5
- package/docs/kb/how-to-recover-expired-session-or-orphan.md +11 -10
- package/docs/kb/why-automation-opened-different-browser.md +4 -3
- package/docs/operations/deploy.md +31 -0
- package/docs/operations/troubleshooting.md +23 -1
- package/docs/prompts/browser-diagnose-recover.md +2 -2
- package/docs/prompts/browser-start.md +1 -1
- package/docs/reference/cli-reference.md +23 -24
- package/docs/reference/config-reference.md +69 -62
- package/docs/reference/configuration.md +9 -7
- package/docs/reference/harness-routing.md +6 -5
- package/docs/reference/workflow-catalog.md +3 -3
- package/package.json +3 -3
- package/plugins/kxm/.claude-plugin/plugin.json +1 -1
- package/plugins/kxm/dist/cli.js +1145 -805
- package/plugins/kxm/dist/mcp-server.js +1 -1
- package/plugins/kxm/dist/runtime-supervisor.js +636 -308
- package/plugins/kxm/dist/runtime.js +710 -382
- package/plugins/kxm/dist/server.js +49 -5
- package/plugins/kxm/package.json +1 -1
- package/plugins/kxm/skills/kxm-browser-auth/SKILL.md +11 -12
- package/plugins/kxm/skills/kxm-browser-diagnostics/SKILL.md +5 -4
- package/plugins/kxm/skills/kxm-browser-explore/SKILL.md +4 -3
- package/plugins/kxm/skills/kxm-browser-session/SKILL.md +5 -5
- package/plugins/kxm/skills/kxm-browser-verify/SKILL.md +1 -1
- package/plugins/kxm/skills/kxm-project-setup/SKILL.md +3 -3
- package/plugins/kxm/src/browser.ts +12 -9
- package/plugins/kxm/src/cli/project.ts +2 -1
- package/plugins/kxm/src/cli/roles.ts +3 -4
- package/plugins/kxm/src/engine.ts +9 -6
- package/plugins/kxm/src/mcp-server.ts +1 -1
- package/plugins/kxm/src/modes.ts +1 -1
- package/plugins/kxm/src/policy-draft.mjs +11 -5
- package/plugins/kxm/src/project-config.ts +49 -11
- package/plugins/kxm/src/runtime-service.ts +2 -1
- package/plugins/kxm/src/template.ts +39 -10
- package/plugins/kxm/src/workflow-manager.ts +34 -28
- package/plugins/kxm/src/workforce-names.d.mts +38 -0
- package/plugins/kxm/src/workforce-names.mjs +317 -0
- package/schemas/agent.schema.json +7 -0
- package/schemas/model.schema.json +12 -0
- package/schemas/workflow.schema.json +14 -0
- package/scripts/harness-run.mjs +1 -1
- package/scripts/native-critic.mjs +5 -5
- package/scripts/roster-policy.mjs +9 -3
- package/scripts/workforce-lint.mjs +18 -0
|
@@ -188,7 +188,7 @@ The starter `defaultHarness: pi` and `npm test` gate are generic settings, not r
|
|
|
188
188
|
- Global options: `--json` and `--dry-run` only; `--workspace` exits 2 with `workspace_option_unsupported`.
|
|
189
189
|
- `--project-id` must match `prj_` followed by 6 to 128 letters, digits, `_`, or `-`. `--repository` is repeatable; each value must be `<id>=<absolute path>`, and a repeated ID fails with `repository_binding_argument_duplicate`.
|
|
190
190
|
- Needs a Git repository. Does not need a hub or the Runtime.
|
|
191
|
-
- Writes `.kxm/project.yaml`, `.kxm/agents/
|
|
191
|
+
- Writes `.kxm/project.yaml`, `.kxm/agents/planner.yaml`, `.kxm/agents/writer.yaml`, `.kxm/gates.yaml`, `.kxm/repo/repo.yaml`, `.kxm/workflows/default.yaml`, and `.kxm/template-provenance.yaml`, using a `.kxm-init-transaction` directory at the Git root while a create or repair is in flight. `planner.yaml` keeps the alias `coordinator`, and `writer.yaml` keeps the alias `implementer`. Repository bindings are written under the user state root, never into Git. `--dry-run` writes nothing.
|
|
192
192
|
- On an interactive terminal without `--json` or `--dry-run`, a successful create or join offers to install shell completion (suppress with `KXM_SKIP_COMPLETION_PROMPT=1`) and to write workflow-guide agents (suppress with `KXM_SKIP_GUIDE_SETUP_PROMPT=1`). Guided setup keeps a role only when one of its guide candidates is on a fixed map of reviewed harness/model pairs and that harness is authenticated; it writes the agent and workflow files, appends those selectors to `.kxm/routes.yaml`, and skips every other candidate. Google candidates are not on the map and are always skipped, because the Runtime's Pi one-shot cannot reach Google's `antigravity` Pi provider yet (see [Harness routing](harness-routing.md#google-through-the-antigravity-pi-provider)).
|
|
193
193
|
- JSON keys: `action` (`planned`, `created`, `joined`, `repaired`, `resumed`, or `validated`), `mode`, `inspectedFrom`, `projectRoot`, `changesRequired`, `legacyInputs`, `issues`, `configRevision`, `files`, `plannedOnly`, and, when relevant, `guidance`, `localBindingFile`, `bindingsChanged`, `repairPlan`, `resumePending`, `transactionKind`.
|
|
194
194
|
- Exit 0 for every completed action and every dry-run plan. Exit 1 when the result is planning-only (legacy state, blocked repair, partial state without provenance) or for `initialization_failed` (with `issues`) and `initialization_io_failed`. A planning-only text result prints the reason and then one `<file>: <code>: <message>` line per validation issue, for example `.kxm/workflows/first.yaml: gate_outcome_impossible: ...`.
|
|
@@ -200,7 +200,7 @@ kxm init --dry-run --json
|
|
|
200
200
|
```
|
|
201
201
|
|
|
202
202
|
```text
|
|
203
|
-
{"schema":"kxm.cli-result.v1","ok":true,"command":"init","action":"planned","mode":"create","inspectedFrom":"/work/proj","projectRoot":"/work/proj","changesRequired":true,"legacyInputs":[],"issues":[],"files":[".kxm/agents/
|
|
203
|
+
{"schema":"kxm.cli-result.v1","ok":true,"command":"init","action":"planned","mode":"create","inspectedFrom":"/work/proj","projectRoot":"/work/proj","changesRequired":true,"legacyInputs":[],"issues":[],"files":[".kxm/agents/planner.yaml",".kxm/agents/writer.yaml",".kxm/gates.yaml",".kxm/models/claude-fable.yaml",".kxm/models/grok-grok-4-6.yaml",".kxm/project.yaml",".kxm/repo/repo.yaml",".kxm/roles/planner.yaml",".kxm/roles/writer.yaml",".kxm/routes.yaml",".kxm/template-provenance.yaml",".kxm/workflows/default.yaml"],"plannedOnly":true}
|
|
204
204
|
```
|
|
205
205
|
|
|
206
206
|
Create the project:
|
|
@@ -419,7 +419,7 @@ kxm trust diff
|
|
|
419
419
|
|
|
420
420
|
```text
|
|
421
421
|
permission diff: sha256:80457232cbfc… -> sha256:7428fde55ca4…
|
|
422
|
-
EXPANSION .kxm/agents/
|
|
422
|
+
EXPANSION .kxm/agents/planner.yaml /repositories/control repository-access changed (expansion)
|
|
423
423
|
1 expansion(s) require explicit reviewed trust action
|
|
424
424
|
```
|
|
425
425
|
|
|
@@ -452,7 +452,7 @@ kxm trust check
|
|
|
452
452
|
|
|
453
453
|
```text
|
|
454
454
|
permission diff: sha256:80457232cbfc… -> sha256:7428fde55ca4…
|
|
455
|
-
EXPANSION .kxm/agents/
|
|
455
|
+
EXPANSION .kxm/agents/planner.yaml /repositories/control repository-access changed (expansion)
|
|
456
456
|
1 expansion(s) require explicit reviewed trust action
|
|
457
457
|
trust check failed: review every expansion above before merging
|
|
458
458
|
```
|
|
@@ -462,7 +462,7 @@ kxm trust check --json
|
|
|
462
462
|
```
|
|
463
463
|
|
|
464
464
|
```text
|
|
465
|
-
{"schema":"kxm.cli-result.v1","ok":false,"command":"trust check",...,"requiresReview":true,"expansions":1,"narrowings":0,"neutralChanges":0,"changes":[{"resource":".kxm/agents/
|
|
465
|
+
{"schema":"kxm.cli-result.v1","ok":false,"command":"trust check",...,"requiresReview":true,"expansions":1,"narrowings":0,"neutralChanges":0,"changes":[{"resource":".kxm/agents/planner.yaml","path":"/repositories/control","field":"repository-access","direction":"expansion",...}]}
|
|
466
466
|
```
|
|
467
467
|
|
|
468
468
|
<a id="hub-commands"></a>
|
|
@@ -1069,7 +1069,7 @@ Lists admitted and disabled routes.
|
|
|
1069
1069
|
|
|
1070
1070
|
No command-specific options.
|
|
1071
1071
|
|
|
1072
|
-
- Reads only. JSON keys: `policy` (`schema`, `updatedAt`, `admitted`, `disabled`) and `membership` (strings `<role> <route-id>` from `.kxm/roles/*.yaml`). `policy` has no `roles` field. A model file named by no roster
|
|
1072
|
+
- Reads only. JSON keys: `policy` (`schema`, `updatedAt`, `admitted`, `disabled`) and `membership` (strings `<role> <route-id>` from `.kxm/roles/*.yaml`). `policy` has no `roles` field. A model file named by no roster is absent from `membership`, and this repository's workforce lint fails on that file.
|
|
1073
1073
|
|
|
1074
1074
|
```bash
|
|
1075
1075
|
kxm routes list
|
|
@@ -1083,18 +1083,17 @@ admitted openai/gpt-5.6-sol
|
|
|
1083
1083
|
admitted openrouter/qwen/qwen3-coder-plus
|
|
1084
1084
|
admitted openrouter/qwen/qwen3.8-flash
|
|
1085
1085
|
admitted openrouter/z-ai/glm-5.3-flash
|
|
1086
|
-
admitted qwen-token-plan/deepseek-v4.1-flash
|
|
1087
|
-
admitted qwen-token-plan/qwen3.8-flash
|
|
1088
|
-
admitted qwen-token-plan/qwen3.8-max
|
|
1089
1086
|
admitted xai/grok-4.7
|
|
1090
|
-
|
|
1091
|
-
|
|
1092
|
-
|
|
1093
|
-
reviewer-arch
|
|
1094
|
-
reviewer-cli sol
|
|
1095
|
-
|
|
1096
|
-
writer
|
|
1097
|
-
writer
|
|
1087
|
+
planner claude-fable
|
|
1088
|
+
planner pi-qwen3-8-flash-openrouter
|
|
1089
|
+
reviewer-arch claude-fable
|
|
1090
|
+
reviewer-arch pi-glm-5-3-flash-openrouter
|
|
1091
|
+
reviewer-cli codex-gpt-5-6-sol
|
|
1092
|
+
reviewer-cli pi-qwen3-8-flash-openrouter
|
|
1093
|
+
writer grok-grok-4-7
|
|
1094
|
+
writer pi-qwen3-coder-plus-openrouter
|
|
1095
|
+
writer agy-gemini-3-8-flash-high
|
|
1096
|
+
writer agy-gemini-3-8-flash-medium
|
|
1098
1097
|
```
|
|
1099
1098
|
|
|
1100
1099
|
```bash
|
|
@@ -1102,7 +1101,7 @@ kxm routes list --json
|
|
|
1102
1101
|
```
|
|
1103
1102
|
|
|
1104
1103
|
```text
|
|
1105
|
-
{"schema":"kxm.cli-result.v1","ok":true,"command":"routes list","policy":{"schema":"kxm.routes.v2","updatedAt":"2026-09-
|
|
1104
|
+
{"schema":"kxm.cli-result.v1","ok":true,"command":"routes list","policy":{"schema":"kxm.routes.v2","updatedAt":"2026-09-27T00:00:00.000Z","admitted":["anthropic/fable","google/gemini-3.8-flash-high","google/gemini-3.8-flash-medium","openai/gpt-5.6-sol","openrouter/qwen/qwen3-coder-plus","openrouter/qwen/qwen3.8-flash","openrouter/z-ai/glm-5.3-flash","xai/grok-4.7"],"disabled":[]},"membership":["planner claude-fable","planner pi-qwen3-8-flash-openrouter","reviewer-arch claude-fable","reviewer-arch pi-glm-5-3-flash-openrouter","reviewer-cli codex-gpt-5-6-sol","reviewer-cli pi-qwen3-8-flash-openrouter","writer grok-grok-4-7","writer pi-qwen3-coder-plus-openrouter","writer agy-gemini-3-8-flash-high","writer agy-gemini-3-8-flash-medium"]}
|
|
1106
1105
|
```
|
|
1107
1106
|
|
|
1108
1107
|
### `kxm routes count`
|
|
@@ -1247,10 +1246,10 @@ kxm role add demo-role --description "Demo role" --dry-run --json
|
|
|
1247
1246
|
{"schema":"kxm.cli-result.v1","ok":true,"command":"role add","roleId":"demo-role","id":"demo-role","filePath":"/work/proj/.kxm/roles/demo-role.yaml","scope":"local","dryRun":true,"planned":[{"action":"write","target":"/work/proj/.kxm/roles/demo-role.yaml"}]}
|
|
1248
1247
|
```
|
|
1249
1248
|
|
|
1250
|
-
Add a reviewer whose primary route is `fable
|
|
1249
|
+
Add a reviewer whose primary route is `claude-fable`, with `grok-grok-4-7` second (Not run):
|
|
1251
1250
|
|
|
1252
1251
|
```bash
|
|
1253
|
-
kxm role add reviewer --description "Independent reviewer" --route fable
|
|
1252
|
+
kxm role add reviewer --description "Independent reviewer" --route claude-fable --route grok-grok-4-7 --skills kxm
|
|
1254
1253
|
```
|
|
1255
1254
|
|
|
1256
1255
|
```bash
|
|
@@ -1307,7 +1306,7 @@ kxm role get writer --json
|
|
|
1307
1306
|
```
|
|
1308
1307
|
|
|
1309
1308
|
```text
|
|
1310
|
-
{"schema":"kxm.cli-result.v1","ok":true,"command":"role get","roleId":"writer","scope":"local","filePath":"/work/kxm/.kxm/roles/writer.yaml","role":{"schema":"kxm.role.v2","id":"writer","purpose":"writer","permission":"edit","description":"Primary implementation agent.","skills":[],"roster":[{"route":"grok-
|
|
1309
|
+
{"schema":"kxm.cli-result.v1","ok":true,"command":"role get","roleId":"writer","scope":"local","filePath":"/work/kxm/.kxm/roles/writer.yaml","role":{"schema":"kxm.role.v2","id":"writer","purpose":"writer","permission":"edit","description":"Primary implementation agent.","skills":[],"roster":[{"route":"grok-grok-4-7","effort":"medium"},{"route":"pi-qwen3-coder-plus-openrouter","effort":"medium"},{"route":"agy-gemini-3-8-flash-high"},{"route":"agy-gemini-3-8-flash-medium"}]}}
|
|
1311
1310
|
```
|
|
1312
1311
|
|
|
1313
1312
|
Captured from this checkout with `node scripts/kxm.mjs role get writer --json`. The path is shortened to `/work/kxm`.
|
|
@@ -1317,13 +1316,13 @@ kxm role modify writer --add-skill kxm --dry-run --json
|
|
|
1317
1316
|
```
|
|
1318
1317
|
|
|
1319
1318
|
```text
|
|
1320
|
-
{"schema":"kxm.cli-result.v1","ok":true,"command":"role modify","roleId":"writer","id":"writer","role":{"schema":"kxm.role.v2","id":"writer","purpose":"writer","permission":"edit","description":"Primary implementation agent.","skills":["kxm"],"roster":[{"route":"grok-
|
|
1319
|
+
{"schema":"kxm.cli-result.v1","ok":true,"command":"role modify","roleId":"writer","id":"writer","role":{"schema":"kxm.role.v2","id":"writer","purpose":"writer","permission":"edit","description":"Primary implementation agent.","skills":["kxm"],"roster":[{"route":"grok-grok-4-7","effort":"medium"},{"route":"pi-qwen3-coder-plus-openrouter","effort":"medium"},{"route":"agy-gemini-3-8-flash-high"},{"route":"agy-gemini-3-8-flash-medium"}]},"filePath":"/work/kxm/.kxm/roles/writer.yaml","scope":"local","dryRun":true,"planned":[{"action":"write","target":"/work/kxm/.kxm/roles/writer.yaml"}]}
|
|
1321
1320
|
```
|
|
1322
1321
|
|
|
1323
1322
|
Add an existing route to a role's roster (Not run):
|
|
1324
1323
|
|
|
1325
1324
|
```bash
|
|
1326
|
-
kxm role modify reviewer --add-route fable
|
|
1325
|
+
kxm role modify reviewer --add-route claude-fable --add-skill kxm-peer
|
|
1327
1326
|
```
|
|
1328
1327
|
|
|
1329
1328
|
### `kxm role resume`
|
|
@@ -1411,7 +1410,7 @@ Refusals (exit 1): `lane_missing`, `lane_dirty`, `lane_run_open`, `lane_git_fail
|
|
|
1411
1410
|
|
|
1412
1411
|
Creates the lane when the record is absent (same rules as `create`), refuses `lane_run_open` when the last run is not settled, then runs the same path as `kxm run --lane <unit> --brief <file>` and `kxm runs drive <runId> --lane <unit>`. `--wait` and `--timeout-ms` are passed through. The run id is stored on the record. Prints the run envelope and the drive result. That open-run check may start the Runtime supervisor; `--dry-run` only attaches to a supervisor that is already running. `kxm lane status` never starts the supervisor.
|
|
1413
1412
|
|
|
1414
|
-
`--brief` is required. `--workflow` defaults to the lane project's `defaultWorkflow`. `--base` applies only when the lane is created. A live agent step uses the step `timeoutMs` when it is set, otherwise the project `limits.agentStepTimeoutMs` (default 3,600,000). This repository's `
|
|
1413
|
+
`--brief` is required. `--workflow` defaults to the lane project's `defaultWorkflow`. `--base` applies only when the lane is created. A live agent step uses the step `timeoutMs` when it is set, otherwise the project `limits.agentStepTimeoutMs` (default 3,600,000). This repository's `writer-only`, `reviewer-arch-only`, and `reviewer-cli-only` workflows are the lane forms of the retired transport recipes. `implement-only`, `review-arch-only`, and `review-cli-only` still resolve.
|
|
1415
1414
|
|
|
1416
1415
|
Refusals (exit 1): `brief_unreadable`, `lane_unit_invalid`, `lane_exists`, `lane_base_unresolved`, `lane_run_open`, `lane_git_failed`, `lane_not_project`, `lanes_unreadable`.
|
|
1417
1416
|
|
|
@@ -55,7 +55,7 @@ to add.
|
|
|
55
55
|
.kxm/project.yaml ── repositories[] ──> .kxm/repo/repo.yaml (+ env.yaml) in each repository
|
|
56
56
|
│ defaultWorkflow, defaultHarness, limits
|
|
57
57
|
▼
|
|
58
|
-
.kxm/workflows/<id>.yaml ── coordinator ──> .kxm/agents/
|
|
58
|
+
.kxm/workflows/<id>.yaml ── coordinator ──> .kxm/agents/planner.yaml
|
|
59
59
|
│ steps[]
|
|
60
60
|
├─ kind agent | moa | approval | wait ──> .kxm/agents/<id>.yaml
|
|
61
61
|
│ ├─ role ──> .kxm/roles/<role>.yaml
|
|
@@ -361,13 +361,14 @@ tool call, shell commands included, and neither confines the process to the
|
|
|
361
361
|
checkout. A live write step on any other harness is handed off; see
|
|
362
362
|
[Steps the Runtime does not execute yet](#steps-the-runtime-does-not-execute-yet).
|
|
363
363
|
|
|
364
|
-
Example (the shape `kxm init` writes for `
|
|
364
|
+
Example (the shape `kxm init` writes for `writer`):
|
|
365
365
|
|
|
366
366
|
```yaml
|
|
367
|
-
# .kxm/agents/
|
|
367
|
+
# .kxm/agents/writer.yaml. The filename is the agent id, and it matches role.
|
|
368
368
|
schema: kxm.agent.v1
|
|
369
369
|
purpose: Implement the approved change within the declared repository scope.
|
|
370
370
|
role: writer # .kxm/roles/writer.yaml -> .kxm/models/<route>.yaml
|
|
371
|
+
aliases: [implementer] # deprecated id; still resolves, with a warning
|
|
371
372
|
tools:
|
|
372
373
|
preset: workspace-writer # coordinator | read-only | workspace-writer | tests-writer
|
|
373
374
|
allow: [read, edit, write, bash]
|
|
@@ -383,9 +384,10 @@ network: provider-only # none | provider-only | restricted | host
|
|
|
383
384
|
resultSchema: kxm.assignment-result.v1
|
|
384
385
|
```
|
|
385
386
|
|
|
386
|
-
`kxm init` creates `
|
|
387
|
-
(`role: writer`) without `harness` or `model`, and admits
|
|
388
|
-
and `xai/grok-4.6` in `.kxm/routes.yaml`.
|
|
387
|
+
`kxm init` creates `planner` (`role: planner`, alias `coordinator`) and `writer`
|
|
388
|
+
(`role: writer`, alias `implementer`) without `harness` or `model`, and admits
|
|
389
|
+
`anthropic/fable` and `xai/grok-4.6` in `.kxm/routes.yaml`. The model files are
|
|
390
|
+
`claude-fable` and `grok-grok-4-6`. An interactive `kxm init` can add
|
|
389
391
|
workflow-guide agents for reviewed pairs whose harness is authenticated, and
|
|
390
392
|
admits their selectors too, but skips Google guide candidates because the
|
|
391
393
|
Runtime cannot reach the `antigravity` Pi provider yet. `kxm run` and the
|
|
@@ -408,7 +410,8 @@ bytes.
|
|
|
408
410
|
| Field | Type and allowed values | Required, default | What reads it |
|
|
409
411
|
|---|---|---|---|
|
|
410
412
|
| `schema` | `kxm.model.v2` | Required | Loader |
|
|
411
|
-
| `id` |
|
|
413
|
+
| `id` | `<harness>-<model-slug>[-<provider>]`, 1 to 64 characters | Optional; the filename is the id | Loader. This repository's workforce lint requires the pattern |
|
|
414
|
+
| `aliases` | Deprecated route ids, at most 16 | Optional | Still resolve to this file; a warning names the canonical id |
|
|
412
415
|
| `harness` | Identifier, 1 to 64 characters | Required | Developer ceilings and dispatch membership |
|
|
413
416
|
| `model` | String, 1 to 200 characters | Required | Dispatch membership (`model`, `vendor/model`, `harness/model`) |
|
|
414
417
|
| `vendor` | String, 1 to 64 characters | Required | The lab that trained the model, not the biller |
|
|
@@ -425,7 +428,8 @@ bytes.
|
|
|
425
428
|
|
|
426
429
|
```yaml
|
|
427
430
|
schema: kxm.model.v2
|
|
428
|
-
id: grok-
|
|
431
|
+
id: grok-grok-4-7 # <harness>-<model-slug>; "." in the model id is "-"
|
|
432
|
+
aliases: [grok-native] # deprecated id; still resolves, with a warning
|
|
429
433
|
harness: grok
|
|
430
434
|
model: grok-4.7
|
|
431
435
|
vendor: xai
|
|
@@ -666,11 +670,11 @@ the reason, field, and detail. The Runtime uses these reasons:
|
|
|
666
670
|
| `gate_uncertain_blocked` | The run is `blocked_uncertain` and waits for an external signal or an operator |
|
|
667
671
|
|
|
668
672
|
Example (validated with `kxm init --json` and compiled with
|
|
669
|
-
`compileKxmWorkflow`). Besides the `
|
|
670
|
-
the `critic-claude` profile shown above, it needs a `
|
|
671
|
-
`
|
|
672
|
-
`
|
|
673
|
-
|
|
673
|
+
`compileKxmWorkflow`). Besides the `writer` and `reviewer-arch` agents and
|
|
674
|
+
the `critic-claude` profile shown above, it needs a `planner` agent (the
|
|
675
|
+
workflow coordinator; `coordinator` still resolves as an alias), a
|
|
676
|
+
`reviewer-cli` agent, and a second profile tagged `critic`, `critic-sol`
|
|
677
|
+
(`openai/gpt-5.6-sol`). Routes, not agent files, name the harness and model.
|
|
674
678
|
The two providers among the `critic` candidates satisfy
|
|
675
679
|
`distinctBy: [provider]` with `target: 2`.
|
|
676
680
|
|
|
@@ -678,7 +682,7 @@ The two providers among the `critic` candidates satisfy
|
|
|
678
682
|
# .kxm/workflows/review.yaml — the filename is the workflow id.
|
|
679
683
|
schema: kxm.workflow.v1
|
|
680
684
|
description: Plan, implement, review with two critics, verify, approve, and wait for CI.
|
|
681
|
-
coordinator:
|
|
685
|
+
coordinator: planner # agent id; omitted value falls back to "coordinator", an alias of planner
|
|
682
686
|
limits:
|
|
683
687
|
maxTransitions: 12 # required once any back-edge exists
|
|
684
688
|
maxRunDurationMs: 14400000
|
|
@@ -688,7 +692,7 @@ planHash: # capture the approved plan when "plan" pass
|
|
|
688
692
|
stageId: plan
|
|
689
693
|
evidenceKey: plan
|
|
690
694
|
requirePlanHash: # writing steps after "plan" must be listed here
|
|
691
|
-
-
|
|
695
|
+
- writer
|
|
692
696
|
- verify
|
|
693
697
|
steps:
|
|
694
698
|
- id: plan
|
|
@@ -704,19 +708,20 @@ steps:
|
|
|
704
708
|
- key: plan
|
|
705
709
|
kind: artifact
|
|
706
710
|
on:
|
|
707
|
-
passed:
|
|
711
|
+
passed: writer # shorthand transition: a step id
|
|
708
712
|
blocked:
|
|
709
713
|
target: $terminal
|
|
710
714
|
terminalStatus: failed
|
|
711
715
|
|
|
712
|
-
- id:
|
|
716
|
+
- id: writer
|
|
713
717
|
kind: agent
|
|
714
|
-
agent:
|
|
718
|
+
agent: writer
|
|
719
|
+
aliases: [implement]
|
|
715
720
|
maxAttempts: 3
|
|
716
721
|
repositories:
|
|
717
722
|
control: write
|
|
718
723
|
assignments:
|
|
719
|
-
allowedAgents: [
|
|
724
|
+
allowedAgents: [writer]
|
|
720
725
|
minimum: 1
|
|
721
726
|
target: 1
|
|
722
727
|
maximum: 1
|
|
@@ -734,13 +739,13 @@ steps:
|
|
|
734
739
|
|
|
735
740
|
- id: review
|
|
736
741
|
kind: moa # panel of agents
|
|
737
|
-
agent:
|
|
742
|
+
agent: reviewer-arch # primary agent; must be in allowedAgents
|
|
738
743
|
model:
|
|
739
744
|
tag: critic # intersected with each agent's own model ceiling
|
|
740
745
|
repositories:
|
|
741
746
|
control: read
|
|
742
747
|
assignments:
|
|
743
|
-
allowedAgents: [
|
|
748
|
+
allowedAgents: [reviewer-arch, reviewer-cli]
|
|
744
749
|
minimum: 2
|
|
745
750
|
target: 2
|
|
746
751
|
maximum: 2
|
|
@@ -754,14 +759,14 @@ steps:
|
|
|
754
759
|
kind: assignment-result
|
|
755
760
|
producerPolicy:
|
|
756
761
|
minimumProducers: 2
|
|
757
|
-
eligibleAgents: [
|
|
762
|
+
eligibleAgents: [reviewer-arch, reviewer-cli]
|
|
758
763
|
acceptedStatuses: [passed]
|
|
759
764
|
degradation:
|
|
760
765
|
minimumProducers: 1
|
|
761
766
|
on:
|
|
762
767
|
passed: verify
|
|
763
768
|
changes-requested: # back-edge: needs maxTransitions
|
|
764
|
-
target:
|
|
769
|
+
target: writer
|
|
765
770
|
maxTransitions: 2
|
|
766
771
|
|
|
767
772
|
- id: verify
|
|
@@ -777,7 +782,7 @@ steps:
|
|
|
777
782
|
on:
|
|
778
783
|
passed: approve
|
|
779
784
|
implementation-failure:
|
|
780
|
-
target:
|
|
785
|
+
target: writer
|
|
781
786
|
maxTransitions: 2
|
|
782
787
|
|
|
783
788
|
- id: approve
|
|
@@ -807,9 +812,9 @@ steps:
|
|
|
807
812
|
terminalStatus: failed
|
|
808
813
|
```
|
|
809
814
|
|
|
810
|
-
This example validates, but a live drive would be handed off at `
|
|
811
|
-
(write access), at `review` (`
|
|
812
|
-
`approve` and `ci` (dispatched to `coordinator`, which
|
|
815
|
+
This example validates, but a live drive would be handed off at `writer`
|
|
816
|
+
(write access), at `review` (`reviewer-arch` uses a profile selector), and at
|
|
817
|
+
`approve` and `ci` (dispatched to `coordinator`, which resolves to `planner`). Use
|
|
813
818
|
it as a field reference; the
|
|
814
819
|
[worked example](#worked-example-a-minimal-two-step-project) is one that runs.
|
|
815
820
|
|
|
@@ -822,7 +827,7 @@ compiles and pins the plan, then drives it live, or without models with
|
|
|
822
827
|
`kxm workflow add <id>` a one-step scaffold, under `.kxm/workflows/` (or
|
|
823
828
|
`~/.config/kxm/workflows/` with `--scope global`, which the loader never
|
|
824
829
|
reads). Both are valid `kxm.workflow.v1` definitions that use only what
|
|
825
|
-
`kxm init` creates: the `coordinator` and `implementer`
|
|
830
|
+
`kxm init` creates: the `planner` and `writer` agents (`coordinator` and `implementer` remain aliases), the `control`
|
|
826
831
|
repository, and the `test` gate. The templates route gate failures on
|
|
827
832
|
`implementation-failure`. A local add is checked by the project loader first:
|
|
828
833
|
if the project would not load with the new file, it is refused with
|
|
@@ -931,9 +936,9 @@ purpose: writer
|
|
|
931
936
|
permission: edit
|
|
932
937
|
description: Primary implementation agent.
|
|
933
938
|
roster:
|
|
934
|
-
- route: grok-
|
|
939
|
+
- route: grok-grok-4-7
|
|
935
940
|
effort: medium
|
|
936
|
-
- route:
|
|
941
|
+
- route: pi-qwen3-coder-plus-openrouter
|
|
937
942
|
effort: medium
|
|
938
943
|
```
|
|
939
944
|
|
|
@@ -1027,50 +1032,51 @@ independent vendors`, and `retired .kxm/roster.json present`.
|
|
|
1027
1032
|
|
|
1028
1033
|
```yaml
|
|
1029
1034
|
# Assembled by scripts/roster-policy.mjs from .kxm/roles/*.yaml and .kxm/models/*.yaml.
|
|
1035
|
+
# Route ids are <harness>-<model-slug>[-<provider>]. The first critic in each
|
|
1036
|
+
# lineup is the required critic. Later entries are read-only fallbacks.
|
|
1030
1037
|
routes:
|
|
1031
|
-
grok-
|
|
1038
|
+
grok-grok-4-7:
|
|
1032
1039
|
harness: grok
|
|
1033
|
-
model: grok-4.
|
|
1040
|
+
model: grok-4.7 # native harnesses take a bare model id
|
|
1034
1041
|
vendor: xai
|
|
1035
1042
|
roles: [writer]
|
|
1036
1043
|
permissions: [edit]
|
|
1037
1044
|
status: admitted # admitted | retired
|
|
1038
|
-
|
|
1045
|
+
pi-qwen3-coder-plus-openrouter:
|
|
1039
1046
|
harness: pi
|
|
1040
1047
|
model: openrouter/qwen/qwen3-coder-plus # Pi: allowed provider prefix + vendor/model
|
|
1041
1048
|
vendor: alibaba
|
|
1042
1049
|
roles: [writer]
|
|
1043
1050
|
permissions: [edit]
|
|
1044
1051
|
status: admitted
|
|
1045
|
-
fable
|
|
1052
|
+
claude-fable:
|
|
1046
1053
|
harness: claude
|
|
1047
1054
|
model: fable
|
|
1048
1055
|
vendor: anthropic
|
|
1049
1056
|
roles: [planner, reviewer-arch]
|
|
1050
1057
|
permissions: [read-only]
|
|
1051
1058
|
status: admitted
|
|
1052
|
-
sol
|
|
1059
|
+
codex-gpt-5-6-sol:
|
|
1053
1060
|
harness: codex
|
|
1054
1061
|
model: gpt-5.6-sol
|
|
1055
1062
|
vendor: openai
|
|
1056
1063
|
roles: [reviewer-cli]
|
|
1057
1064
|
permissions: [read-only]
|
|
1058
1065
|
status: admitted
|
|
1059
|
-
lineup: # routes admitted for each role
|
|
1060
|
-
writer: [grok-
|
|
1061
|
-
planner: [fable-
|
|
1062
|
-
reviewer-arch: [fable-
|
|
1063
|
-
reviewer-cli: [sol-
|
|
1066
|
+
lineup: # routes admitted for each role, preference order
|
|
1067
|
+
writer: [grok-grok-4-7, pi-qwen3-coder-plus-openrouter, agy-gemini-3-8-flash-high, agy-gemini-3-8-flash-medium]
|
|
1068
|
+
planner: [claude-fable, pi-qwen3-8-flash-openrouter]
|
|
1069
|
+
reviewer-arch: [claude-fable, pi-glm-5-3-flash-openrouter]
|
|
1070
|
+
reviewer-cli: [codex-gpt-5-6-sol, pi-qwen3-8-flash-openrouter]
|
|
1064
1071
|
required_critics:
|
|
1065
|
-
review-arch: fable
|
|
1066
|
-
review-cli: sol
|
|
1072
|
+
review-arch: claude-fable
|
|
1073
|
+
review-cli: codex-gpt-5-6-sol
|
|
1067
1074
|
model_origins: # required for every Pi route model
|
|
1068
1075
|
openrouter/qwen/qwen3-coder-plus:
|
|
1069
1076
|
vendor: alibaba
|
|
1070
1077
|
evidence:
|
|
1071
|
-
source:
|
|
1072
|
-
|
|
1073
|
-
sha256: 358d436dbf1b6f3904252afba167e643d33d597d16148ac1286b1c21b81448a4
|
|
1078
|
+
source: plans/evidence/route-qwen-openrouter-pi.md
|
|
1079
|
+
sha256: b15f8a54adc398b33e75609e959076eee310bf4ff6623d0b8470ea3da95e6c54
|
|
1074
1080
|
```
|
|
1075
1081
|
|
|
1076
1082
|
Validated with `validateRosterDocument` from `scripts/roster-policy.mjs`,
|
|
@@ -1685,8 +1691,8 @@ Directory layout (inside a Git repository):
|
|
|
1685
1691
|
└── .kxm/
|
|
1686
1692
|
├── project.yaml
|
|
1687
1693
|
├── repo/repo.yaml
|
|
1688
|
-
├── agents/
|
|
1689
|
-
├── agents/
|
|
1694
|
+
├── agents/planner.yaml
|
|
1695
|
+
├── agents/writer.yaml
|
|
1690
1696
|
├── gates.yaml
|
|
1691
1697
|
├── routes.yaml
|
|
1692
1698
|
└── workflows/default.yaml
|
|
@@ -1717,11 +1723,13 @@ repositoryId: control
|
|
|
1717
1723
|
defaultAccess: write
|
|
1718
1724
|
```
|
|
1719
1725
|
|
|
1720
|
-
`.kxm/agents/
|
|
1726
|
+
`.kxm/agents/planner.yaml` (every workflow needs its coordinator agent):
|
|
1721
1727
|
|
|
1722
1728
|
```yaml
|
|
1723
1729
|
schema: kxm.agent.v1
|
|
1724
1730
|
purpose: Coordinate the pinned workflow.
|
|
1731
|
+
role: planner
|
|
1732
|
+
aliases: [coordinator]
|
|
1725
1733
|
tools:
|
|
1726
1734
|
preset: coordinator
|
|
1727
1735
|
defaultRepositoryAccess: read
|
|
@@ -1731,15 +1739,13 @@ network: provider-only
|
|
|
1731
1739
|
resultSchema: kxm.assignment-result.v1
|
|
1732
1740
|
```
|
|
1733
1741
|
|
|
1734
|
-
`.kxm/agents/
|
|
1742
|
+
`.kxm/agents/writer.yaml`:
|
|
1735
1743
|
|
|
1736
1744
|
```yaml
|
|
1737
1745
|
schema: kxm.agent.v1
|
|
1738
1746
|
purpose: Implement the requested change in the control repository.
|
|
1739
|
-
|
|
1740
|
-
|
|
1741
|
-
provider: xai
|
|
1742
|
-
model: grok-4.6
|
|
1747
|
+
role: writer
|
|
1748
|
+
aliases: [implementer]
|
|
1743
1749
|
tools:
|
|
1744
1750
|
preset: workspace-writer
|
|
1745
1751
|
defaultRepositoryAccess: none
|
|
@@ -1765,13 +1771,14 @@ gates:
|
|
|
1765
1771
|
```yaml
|
|
1766
1772
|
schema: kxm.workflow.v1
|
|
1767
1773
|
description: Implement a change, then run the test suite.
|
|
1768
|
-
coordinator:
|
|
1774
|
+
coordinator: planner
|
|
1769
1775
|
limits:
|
|
1770
1776
|
maxTransitions: 4
|
|
1771
1777
|
steps:
|
|
1772
|
-
- id:
|
|
1778
|
+
- id: writer
|
|
1773
1779
|
kind: agent
|
|
1774
|
-
agent:
|
|
1780
|
+
agent: writer
|
|
1781
|
+
aliases: [implement]
|
|
1775
1782
|
maxAttempts: 2
|
|
1776
1783
|
repositories:
|
|
1777
1784
|
control: write
|
|
@@ -1798,7 +1805,7 @@ steps:
|
|
|
1798
1805
|
target: $terminal
|
|
1799
1806
|
terminalStatus: completed
|
|
1800
1807
|
implementation-failure:
|
|
1801
|
-
target:
|
|
1808
|
+
target: writer
|
|
1802
1809
|
maxTransitions: 2
|
|
1803
1810
|
```
|
|
1804
1811
|
|
|
@@ -1814,11 +1821,11 @@ disabled: []
|
|
|
1814
1821
|
|
|
1815
1822
|
Why each piece is there:
|
|
1816
1823
|
|
|
1817
|
-
- `
|
|
1824
|
+
- `writer` routes a failure straight to a terminal `failed` status and
|
|
1818
1825
|
declares `failed`, the outcome the producer falls back to.
|
|
1819
1826
|
- `verify` declares `implementation-failure`, the outcome a failing command
|
|
1820
1827
|
produces. Routing that edge on `failed` instead is refused when the project
|
|
1821
|
-
loads (`gate_outcome_impossible`). The edge back to `
|
|
1828
|
+
loads (`gate_outcome_impossible`). The edge back to `writer` makes it a
|
|
1822
1829
|
back-edge, so it carries `maxTransitions: 2` and the workflow carries
|
|
1823
1830
|
`limits.maxTransitions`.
|
|
1824
1831
|
- The gate step lists `control: write`; the Runtime refuses command gate steps
|
|
@@ -1841,9 +1848,9 @@ kxm runs drive <runId> --simulated --wait # model-free drive; runs npm test f
|
|
|
1841
1848
|
|
|
1842
1849
|
The simulated drive records `passed` for the agent step, runs `npm test` in the
|
|
1843
1850
|
project root, and settles `completed` when it exits 0. When `npm test` fails,
|
|
1844
|
-
the run returns to `
|
|
1845
|
-
`
|
|
1846
|
-
today, because the `
|
|
1851
|
+
the run returns to `writer` and fails with `budget_step_attempts` once
|
|
1852
|
+
`writer` has used its two attempts. A live drive of this workflow is refused
|
|
1853
|
+
today, because the `writer` step has write access (see
|
|
1847
1854
|
[Steps the Runtime does not execute yet](#steps-the-runtime-does-not-execute-yet)).
|
|
1848
1855
|
Stop the Runtime afterwards with `kxm runtime stop`.
|
|
1849
1856
|
|
|
@@ -200,21 +200,23 @@ The Runtime supervisor runs `kxm run` workflows and syncs their summaries to the
|
|
|
200
200
|
|
|
201
201
|
## Browser automation
|
|
202
202
|
|
|
203
|
-
Playwright testing and verification use Obscura. Steel is for human takeover, MFA, and the live session viewer. `resolveBrowserCdpEndpoint()` in `plugins/kxm/src/browser.ts` returns the CDP URL. `resolveBrowserCdpConnect()` returns that URL and the handshake headers, and `connectBrowserOverCdp()` passes them to `chromium.connectOverCDP`. `node scripts/obscura.mjs` downloads pinned Obscura v0.2.3 and serves it. See [Browser automation](../guides/browser-automation.md).
|
|
203
|
+
Playwright testing and verification use Obscura. Steel is for remote and hosted browsing, human takeover, MFA, and the live session viewer. `resolveBrowserCdpEndpoint()` in `plugins/kxm/src/browser.ts` returns the CDP URL. `resolveBrowserCdpConnect()` returns that URL and the handshake headers, and `connectBrowserOverCdp()` passes them to `chromium.connectOverCDP`. `node scripts/obscura.mjs` downloads pinned Obscura v0.2.3 and serves it. Steel needs `kxm` 0.7.135 or newer. See [Browser automation](../guides/browser-automation.md) and [ADR-0007](../adr/ADR-0007-steel-caddy-authentik.md).
|
|
204
204
|
|
|
205
205
|
| Variable | Default | Effect |
|
|
206
206
|
|---|---|---|
|
|
207
|
-
| `KXM_BROWSER` | `obscura` | `obscura` selects the Obscura CDP URL and sends no Steel headers. `steel` selects `
|
|
207
|
+
| `KXM_BROWSER` | `obscura` | `obscura` selects the Obscura CDP URL and sends no Steel headers. `steel` selects `/v1/devtools` plus `Authorization` and requires a session id. Any other value throws |
|
|
208
208
|
| `OBSCURA_CDP_URL` | `http://127.0.0.1:${OBSCURA_PORT:-9222}` | CDP URL passed to `chromium.connectOverCDP()`. When set, it wins over `OBSCURA_PORT` for that URL |
|
|
209
209
|
| `OBSCURA_PORT` | `9222` | TCP port for `obscura serve`. Used in the default CDP URL when `OBSCURA_CDP_URL` is unset. The launcher refuses to start when this port disagrees with the port in `OBSCURA_CDP_URL` |
|
|
210
|
-
| `STEEL_API_URL` |
|
|
210
|
+
| `STEEL_API_URL` | `https://steel.kontextmind.com` | Base URL of the Steel API. `steel.theneuro.me` is an alias of that server |
|
|
211
211
|
| `STEEL_UI_URL` | `$STEEL_API_URL/ui` | Base URL of the Steel session viewer |
|
|
212
|
-
| `STEEL_AUTH_HEADER` | unset | Full `Authorization` value.
|
|
212
|
+
| `STEEL_AUTH_HEADER` | unset | Full `Authorization` value. First among the Steel auth variables |
|
|
213
213
|
| `STEEL_AUTH_BASIC` | unset | `base64(user:token)`, with or without a leading `Basic` prefix. Sent as `Authorization: Basic` |
|
|
214
|
-
| `STEEL_AUTH_USER` | unset | Authentik username
|
|
214
|
+
| `STEEL_AUTH_USER` | unset | Authentik username `svc-steel`. Used with `STEEL_AUTH_TOKEN`. An incomplete pair fails closed |
|
|
215
215
|
| `STEEL_AUTH_TOKEN` | unset | Authentik app password. Used with `STEEL_AUTH_USER` |
|
|
216
|
-
| `STEEL_API_KEY` |
|
|
217
|
-
| `USE_PASS_CLI` | enabled | Set to `false` to
|
|
216
|
+
| `STEEL_API_KEY` | unset | Deprecated. Steel and Caddy do not enforce it. The three variables above override it. The library warns once |
|
|
217
|
+
| `USE_PASS_CLI` | enabled | Set to `false` to skip the legacy `STEEL_API_KEY` lookup. That lookup does not authenticate |
|
|
218
|
+
|
|
219
|
+
`STEEL_AUTH_HEADER`, then `STEEL_AUTH_BASIC`, then `STEEL_AUTH_USER` with `STEEL_AUTH_TOKEN`, override `STEEL_API_KEY`. Load field `basic_auth` from 1Password vault `kontextmind`, item `Steel (svc-steel)`, with `op read` into `STEEL_AUTH_BASIC`. Do not write the value to disk. The CDP path is `/v1/devtools` with an `Authorization` header. Sessions return `websocketUrl` `wss://steel.kontextmind.com/`.
|
|
218
220
|
|
|
219
221
|
Obscura's own `OBSCURA_TIMEZONE` (default `Europe/Berlin`) and `OBSCURA_CDP_TOKEN` (required only for a non-loopback bind) are read by the Obscura process, not by KXM.
|
|
220
222
|
|
|
@@ -117,7 +117,7 @@ role: writer
|
|
|
117
117
|
|
|
118
118
|
### Model file
|
|
119
119
|
|
|
120
|
-
This is the native route, from `.kxm/models/grok-
|
|
120
|
+
This is the native route, from `.kxm/models/grok-grok-4-7.yaml` (alias `grok-native`):
|
|
121
121
|
|
|
122
122
|
```yaml
|
|
123
123
|
harness: grok
|
|
@@ -151,14 +151,15 @@ permission: edit
|
|
|
151
151
|
description: Primary implementation agent.
|
|
152
152
|
# Rotation priority = order. Effort default: medium for implementation.
|
|
153
153
|
roster:
|
|
154
|
-
- route: grok-
|
|
154
|
+
- route: grok-grok-4-7
|
|
155
155
|
effort: medium
|
|
156
|
-
- route:
|
|
156
|
+
- route: pi-qwen3-coder-plus-openrouter
|
|
157
157
|
effort: medium
|
|
158
|
-
- route: gemini-
|
|
158
|
+
- route: agy-gemini-3-8-flash-high
|
|
159
|
+
- route: agy-gemini-3-8-flash-medium
|
|
159
160
|
```
|
|
160
161
|
|
|
161
|
-
`grok-
|
|
162
|
+
`grok-grok-4-7` resolves to `.kxm/models/grok-grok-4-7.yaml`: harness `grok`, model `grok-4.7`, vendor `xai`, status `admitted`, permission `edit`. `pi-qwen3-coder-plus-openrouter` is harness `pi`, model `openrouter/qwen/qwen3-coder-plus`, vendor `alibaba`. `agy-gemini-3-8-flash-high` is harness `agy`, model `gemini-3.8-flash-high`, vendor `google`. `kxm role list` prints the first route id as the primary, for example `(grok-grok-4-7)`. The previous ids (`grok-native`, `qwen-openrouter-pi`, `gemini-agy`) are aliases.
|
|
162
163
|
|
|
163
164
|
Dispatch resolves a step from the agent `role`, then `.kxm/roles/<role>.yaml`, then the selected `.kxm/models/<route>.yaml`. That model file carries `harness`, `model`, `vendor`, `status`, and `permissions`. The engine walks the roster in order and uses the first admitted route whose model file is readable. A missing or unreadable model file is a refusal (`roster_model_unreadable` at load, `producer_route_unsupported` at dispatch), not a skip to the next entry. A route file that names a harness the model cannot run on still fails closed with `harness_unhosted_model`.
|
|
164
165
|
|
|
@@ -1096,9 +1096,9 @@ These three files live in this repository's `.kxm/workflows`. `kxm init` does no
|
|
|
1096
1096
|
|
|
1097
1097
|
| Workflow | Runs through |
|
|
1098
1098
|
|---|---|
|
|
1099
|
-
| `
|
|
1100
|
-
| `
|
|
1101
|
-
| `
|
|
1099
|
+
| `writer-only` | `kxm lane run`. `implement-only` still resolves to this file. |
|
|
1100
|
+
| `reviewer-arch-only` | `kxm lane run`. `review-arch-only` still resolves to this file. |
|
|
1101
|
+
| `reviewer-cli-only` | `kxm lane run`. `review-cli-only` still resolves to this file. |
|
|
1102
1102
|
|
|
1103
1103
|
## Related
|
|
1104
1104
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@kontextmind/kxm",
|
|
3
|
-
"version": "0.7.
|
|
3
|
+
"version": "0.7.147",
|
|
4
4
|
"description": "KXM local-first multi-agent orchestration and operator dashboard",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"author": "KontextMind",
|
|
@@ -45,11 +45,11 @@
|
|
|
45
45
|
"typecheck": "tsc --noEmit",
|
|
46
46
|
"lint:docs": "markdownlint-cli2",
|
|
47
47
|
"check:versions": "node scripts/check-versions.mjs",
|
|
48
|
-
"check": "npm run typecheck && npm run lint:docs && npm run check:versions",
|
|
48
|
+
"check": "npm run typecheck && npm run lint:docs && npm run check:versions && node scripts/workforce-lint.mjs",
|
|
49
49
|
"verify": "npm test && npm run check && npm run check:generated",
|
|
50
50
|
"validate:claude": "claude plugin validate . --strict && claude plugin validate plugins/kxm --strict",
|
|
51
51
|
"validate:ci": "npm run test:coverage && npm run check && npm pack --dry-run",
|
|
52
|
-
"validate:pr": "npm run build && npm run typecheck && node scripts/run-bounded.mjs 1200000 node --disable-warning=ExperimentalWarning --experimental-strip-types --test --test-force-exit --test-concurrency=4 test/core/artifacts-exist.test.ts test/core/ci-contract.test.ts test/core/envelope.test.ts test/core/envelope-contract.test.ts test/core/protocol.test.ts test/core/repo-root.test.ts test/core/routes-count.test.ts test/core/smoke.test.ts test/core/version-surfaces.test.ts && npm run check:versions && node scripts/check-generated.mjs",
|
|
52
|
+
"validate:pr": "npm run build && npm run typecheck && node scripts/run-bounded.mjs 1200000 node --disable-warning=ExperimentalWarning --experimental-strip-types --test --test-force-exit --test-concurrency=4 test/core/artifacts-exist.test.ts test/core/ci-contract.test.ts test/core/envelope.test.ts test/core/envelope-contract.test.ts test/core/protocol.test.ts test/core/repo-root.test.ts test/core/routes-count.test.ts test/core/smoke.test.ts test/core/version-surfaces.test.ts && npm run check:versions && node scripts/workforce-lint.mjs && node scripts/check-generated.mjs",
|
|
53
53
|
"validate": "npm run validate:ci && npm run validate:claude",
|
|
54
54
|
"test:packages": "npx nx run-many -t test --output-style=static",
|
|
55
55
|
"check:packages": "npx nx run-many -t build,test:coverage,typecheck --output-style=static",
|
|
@@ -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.147",
|
|
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",
|