@kontextmind/kxm 0.7.119 → 0.7.120

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.
@@ -11,7 +11,7 @@
11
11
  "name": "kxm",
12
12
  "source": "./plugins/kxm",
13
13
  "description": "Durable workflows, peer agents, and kxm tui",
14
- "version": "0.7.119",
14
+ "version": "0.7.120",
15
15
  "category": "development",
16
16
  "tags": ["kxm", "multi-agent", "workflows", "mcp"]
17
17
  }
package/CHANGELOG.md CHANGED
@@ -6,6 +6,19 @@ All notable user-facing changes are documented here. The project follows [Semant
6
6
 
7
7
  ### Added
8
8
 
9
+ - **`kxm lane` keeps one git worktree per unit beside the control checkout.**
10
+ `create`, `list`, `status`, `drop` and `run` store a 0600 record in
11
+ `.kxm/state/lanes.json` keyed by the resolved base sha, and `drop` never
12
+ deletes the branch. `kxm run --brief <file>` and `--lane <unit>` start that
13
+ work, and `--lane` is also accepted by `kxm runs status`, `drive`, `receipt`
14
+ and `cancel`. The `just worktree` and `just worktree-drop` recipes now call
15
+ those verbs. The refusals a user can see are `lane_exists`, `lane_missing`,
16
+ `lane_base_unresolved`, `lane_dirty`, `lane_run_open`, `brief_unreadable` and
17
+ `brief_and_prompt`. A live writer step through `kxm lane run` is still
18
+ bounded by the Runtime's 120 second one-shot timeout until the configurable
19
+ limit lands. See the
20
+ [CLI reference](docs/reference/cli-reference.md#kxm-lane).
21
+
9
22
  - **Claude-only workflow recommendations now fail honestly when execution is unavailable.**
10
23
  `suggest` honors explicit harness constraints, uses flat installable IDs and verified
11
24
  capability-appropriate routes, refuses unchecked existing definitions, and never substitutes a
@@ -337,6 +350,13 @@ All notable user-facing changes are documented here. The project follows [Semant
337
350
  persisting a projection write, so a read cannot mutate run state or surface a
338
351
  false `run_projection_divergent`.
339
352
 
353
+ ### Removed
354
+
355
+ - **`.kxm/template-provenance.yaml` was removed from this project, a repository
356
+ change rather than a product change,** because the installed kxm no longer
357
+ recognizes its recorded revision and a project without the file validates as
358
+ ready.
359
+
340
360
  ### Fixed
341
361
 
342
362
  - **A local `kxm workflow add` writes only what the project loader accepts, where it reads
@@ -17,7 +17,7 @@ a KXM product feature.
17
17
 
18
18
  - A clean control checkout of this repository whose `HEAD` is an ancestor of
19
19
  `origin/main`. The runner loads `.kxm/roster.yaml` only from there.
20
- - A separate worktree for the writer. `just worktree <unit>` creates one from
20
+ - A separate worktree for the writer. `kxm lane create <unit>` creates one from
21
21
  `origin/main`.
22
22
  - [`just`](https://github.com/casey/just), plus the harness CLIs the roster
23
23
  admits, installed and logged in. `node scripts/kxm.mjs harness list` shows
@@ -58,7 +58,7 @@ Every top-level `kxm` command is owned by exactly one skill. A skill can own sev
58
58
  | `kxm-peer` | `peer` | Delegate to, fan out to, await and answer other agents |
59
59
  | `kxm-workflow` | `workflow`, `gate` | Record journal entries, pass checkpoints and wait on signed callbacks |
60
60
  | `kxm-definitions` | `role` | Inspect or edit roles, role hosts and model rosters without granting writer admission |
61
- | `kxm-runs` | `run`, `runs` | Create, drive, inspect and cancel runs, or smoke-test a workflow model-free |
61
+ | `kxm-runs` | `run`, `runs`, `lane` | Create, drive, inspect and cancel runs, manage worktree lanes, or smoke-test a workflow model-free |
62
62
  | `kxm-context-memory` | `context`, `memory`, `explain` | Recall what the project knows, explain a context footprint, record memory candidates |
63
63
  | `kxm-skill-lifecycle` | `skills` | Turn a repeated practice into a governed skill candidate |
64
64
  | `kxm-routing-improve` | `routing`, `improve` | Find what KXM learned and what repeats, and read recorded route spend |
@@ -14,7 +14,7 @@ Output shown under examples was captured from a source checkout, inside a throwa
14
14
  - Setup: [`init`](#kxm-init), [`config`](#kxm-config), [`completion`](#kxm-completion), [`trust`](#kxm-trust)
15
15
  - Hub and sessions: [`hub`](#kxm-hub-view), [`session`](#kxm-session), [`dash`](#kxm-dash), [`studio`](#kxm-studio)
16
16
  - Harnesses, models, and roles: [`harness`](#kxm-harness), [`auth`](#kxm-auth), [`update`](#kxm-update), [`models`](#kxm-models), [`routes`](#kxm-routes), [`role`](#kxm-role)
17
- - Running work: [`run`](#kxm-run), [`runs`](#kxm-runs), [`runtime`](#kxm-runtime), [`agent`](#kxm-agent), [`workflow`](#kxm-workflow), [`gate`](#kxm-gate), [`peer`](#kxm-peer), [`task`](#kxm-task), [`goal`](#kxm-goal), [`suggest`](#kxm-suggest), [`explain`](#kxm-explain)
17
+ - Running work: [`lane`](#kxm-lane), [`run`](#kxm-run), [`runs`](#kxm-runs), [`runtime`](#kxm-runtime), [`agent`](#kxm-agent), [`workflow`](#kxm-workflow), [`gate`](#kxm-gate), [`peer`](#kxm-peer), [`task`](#kxm-task), [`goal`](#kxm-goal), [`suggest`](#kxm-suggest), [`explain`](#kxm-explain)
18
18
  - Context and learning: [`context`](#kxm-context), [`memory`](#kxm-memory), [`skills`](#kxm-skills), [`improve`](#kxm-improve), [`routing`](#kxm-routing), [`prices`](#kxm-prices)
19
19
  - Operations: [`backup`](#kxm-backup), [`restore`](#kxm-restore), [`tenant`](#kxm-tenant), [`ssh`](#kxm-ssh), [`help`](#kxm-help)
20
20
  - [Known behavior gaps](#known-behavior-gaps)
@@ -143,7 +143,7 @@ Exit 2 covers an unknown command or option, a missing argument or required optio
143
143
  |---|---|---|
144
144
  | Project files under `<project>/.kxm/` (reviewed in Git) | `project.yaml`, `agents/`, `workflows/`, `gates.yaml`, `repo/`, `template-provenance.yaml`, `routes.yaml`, `models/inventory.yaml`, `roles/`, `role-hosts.yaml`, `modes.yaml`, `prices.yaml` | `init`, `trust`, `run`, `models`, `routes`, `role`, `workflow definitions\|add\|remove\|modify`, `explain`, `studio` |
145
145
  | Local project records under `<project>/.kxm/` | `config.yaml` (project scope), `goals/`, `tasks/`, `memory/`, `skills/`, `candidates/`, `backups/`, `run/ssh-sockets/` | `config`, `goal`, `task`, `memory`, `skills`, `improve`, `backup`, `ssh` |
146
- | Workspace directories (`.kxm/state`, `.kxm/logs`, `.kxm/assets`, `.kxm/config`; moved by `--workspace` or `KXM_*_DIR`) | hub SQLite store `state/kxm.db` (or `KXM_DATA_PATH`), `state/hub.pid`, `state/session-brief.json`, `logs/telemetry.jsonl`, `logs/kxm-hub.jsonl`, `assets/sessions/`, `assets/workflows/`, `assets/improvements/`, `assets/retrospectives/`, legacy `config/agents.json` and `config/gates.json` | `hub`, `session`, `dash`, `agent worker`, `workflow list\|get\|export`, `gate`, `improve`, `routing report` |
146
+ | Workspace directories (`.kxm/state`, `.kxm/logs`, `.kxm/assets`, `.kxm/config`; moved by `--workspace` or `KXM_*_DIR`) | hub SQLite store `state/kxm.db` (or `KXM_DATA_PATH`), `state/hub.pid`, `state/session-brief.json`, `state/lanes.json` (mode 0600 lane records), `logs/telemetry.jsonl`, `logs/kxm-hub.jsonl`, `assets/sessions/`, `assets/workflows/`, `assets/improvements/`, `assets/retrospectives/`, legacy `config/agents.json` and `config/gates.json` | `hub`, `session`, `dash`, `lane`, `agent worker`, `workflow list\|get\|export`, `gate`, `improve`, `routing report` |
147
147
  | User config directory (`KXM_USER_CONFIG_DIR`, default `~/.config/kxm`) | `config.yaml` (user scope), `session.token`, global `roles/` and `workflows/`, `role-hosts.yaml`, `completions/` | `config --scope user`, `auth token`, `session brief\|token`, `role`/`workflow` with `--scope global`, `studio serve`, `completion install` |
148
148
  | User state root (`KXM_STATE_HOME`; macOS `~/Library/Application Support/KXM`; Linux `$XDG_STATE_HOME/kxm` or `~/.local/state/kxm`; Windows `%LOCALAPPDATA%\KXM`) | `hub-env.json` (persisted hub credentials), `hub-binding.json`, `runtime/` (Runtime supervisor registry and per-project run stores), `update.yaml`, repository bindings | `hub start\|bind\|unbind`, every hub client, `run`, `runs`, `runtime`, `tenant status`, `update`, `init --repository`, and (read-only, the project's run store) `improve` and `routing report` |
149
149
 
@@ -157,6 +157,7 @@ Exit 2 covers an unknown command or option, a missing argument or required optio
157
157
  | Start or bind a hub | [`kxm hub start`](#kxm-hub-start), [`kxm hub bind`](#kxm-hub-bind), [`kxm hub view`](#kxm-hub-view) |
158
158
  | Check harness installs and authentication | [`kxm harness list`](#kxm-harness-list), [`kxm update --dry-run`](#kxm-update) |
159
159
  | Create and drive a run | [`kxm run`](#kxm-run), [`kxm runs drive`](#kxm-runs-drive), [`kxm runtime status`](#kxm-runtime-status) |
160
+ | Work in an isolated checkout | [`kxm lane`](#kxm-lane), [`kxm run --lane`](#kxm-run) |
160
161
  | Inspect runs | [`kxm runs list`](#kxm-runs-list), [`kxm runs status`](#kxm-runs-status), [`kxm runs receipt`](#kxm-runs-receipt), [`kxm tenant status`](#kxm-tenant-status), [`kxm workflow list`](#kxm-workflow-list) |
161
162
  | Message peers | [`kxm peer list`](#kxm-peer-list), [`kxm peer send`](#kxm-peer-send), [`kxm peer await`](#kxm-peer-await), [`kxm peer fanout`](#kxm-peer-fanout) |
162
163
  | Operate gates and evidence | [`kxm gate validate`](#kxm-gate-validate), [`kxm gate artifacts-exist`](#kxm-gate-artifacts-exist), [`kxm gate signal`](#kxm-gate-signal), [`kxm workflow checkpoint`](#kxm-workflow-checkpoint) |
@@ -1382,19 +1383,71 @@ dry run: resume workflow run wf_dry_run (stage: review)
1382
1383
  would write /work/proj/.kxm/state/kxm.db (workflow_runs wf_dry_run, one workflow_journal decision)
1383
1384
  ```
1384
1385
 
1386
+ ## `kxm lane`
1387
+
1388
+ One lane is one git worktree, one branch named the unit, and one recorded base sha. The record lives in the control checkout's state directory, `.kxm/state/lanes.json` (`kxm.lanes.v1`, mode 0600). The worktree path is `../<control-dir-basename>-<unit>`, next to the control checkout. Creating a lane resolves the base ref to a sha and does not fetch. There is no push, merge, pull request, or branch delete. Selecting a lane sets the discovery cwd to that lane's path and rebuilds workspace directories from it; `KXM_WORKDIR` still selects the workspace root when it is set, so the lane path is the workspace root only when `KXM_WORKDIR` is unset.
1389
+
1390
+ ```text
1391
+ kxm lane create <unit> [--base <ref>]
1392
+ kxm lane list
1393
+ kxm lane status <unit>
1394
+ kxm lane drop <unit> [--force]
1395
+ kxm lane run <unit> --brief <file> [--workflow <id>] [--base <ref>] [--wait] [--timeout-ms <n>]
1396
+ ```
1397
+
1398
+ ```bash
1399
+ kxm lane run omp-align-p1 --brief .kxm/briefs/omp-align-p1.md --wait
1400
+ ```
1401
+
1402
+ ### `kxm lane create`
1403
+
1404
+ Resolves `<ref>` (default `origin/main`) with `git rev-parse --verify <ref>^{commit}` in the control checkout, then `git worktree add -b <unit> <path> <sha>`. The new worktree must contain `.kxm/project.yaml`. Writes the record and prints it.
1405
+
1406
+ | Option | Argument | Default | Description |
1407
+ |---|---|---|---|
1408
+ | `--base` | `<ref>` | `origin/main` | Ref to resolve before adding the worktree |
1409
+
1410
+ Refusals (exit 1): `lane_unit_invalid`, `lane_exists` (record, path, or branch already present), `lane_base_unresolved` (the text names `git fetch origin`), `lane_not_project` (worktree removed again), `lane_git_failed`, `lanes_unreadable`.
1411
+
1412
+ ### `kxm lane list`
1413
+
1414
+ Prints one line per lane: unit, branch, base sha, `dirty` (porcelain line count), `ahead` and `behind` against the recorded base sha, and `exists`. JSON key: `lanes`.
1415
+
1416
+ ### `kxm lane status`
1417
+
1418
+ The list row for one unit, plus `status` of `lastRunId` when the Runtime supervisor is already running and answers. Otherwise `status=unknown`. `kxm lane status` never starts the Runtime supervisor.
1419
+
1420
+ Refusals (exit 1): `lane_missing`, `lane_unit_invalid`, `lanes_unreadable`.
1421
+
1422
+ ### `kxm lane drop`
1423
+
1424
+ Removes the worktree and the record. Refuses `lane_dirty` when porcelain is nonempty, and `lane_run_open` when `lastRunId` is set and that run is not `completed`, `failed`, or `cancelled`. `--force` overrides both. `git worktree remove --force` is used only with `--force`. The branch is not deleted; the text says so (`branchDeleted: false`). Unless `--force` is set, drop may start the Runtime supervisor to check whether the lane's last run is still open; `--dry-run` only attaches to a supervisor that is already running. `kxm lane status` never starts the supervisor.
1425
+
1426
+ Refusals (exit 1): `lane_missing`, `lane_dirty`, `lane_run_open`, `lane_git_failed`.
1427
+
1428
+ ### `kxm lane run`
1429
+
1430
+ 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.
1431
+
1432
+ `--brief` is required. `--workflow` defaults to the lane project's `defaultWorkflow`. `--base` applies only when the lane is created. A live writer step through this verb is subject to the Runtime's one-shot process timeout, which is 120 seconds until `limits.agentStepTimeoutMs` lands, so long implementation briefs should use `just impl-bg` until then (see section 4 of `plans/plan-lane-cli.md`).
1433
+
1434
+ Refusals (exit 1): `brief_unreadable`, `lane_unit_invalid`, `lane_exists`, `lane_base_unresolved`, `lane_run_open`, `lane_git_failed`, `lane_not_project`, `lanes_unreadable`.
1435
+
1385
1436
  ## `kxm run`
1386
1437
 
1387
1438
  ```text
1388
- kxm run <workflow> [prompt...]
1439
+ kxm run <workflow> [--brief <file>] [--lane <unit>] [prompt...]
1389
1440
  ```
1390
1441
 
1391
1442
  Create a KXM run without executing steps. The run pins the project's `homeRuntimeId`, config revision, and executor and tool policy revisions. Events store the prompt's SHA-256; its full text is kept in a local mode-0600 sidecar, `run-events.db.run-prompts.json`, and dispatch refuses a hash mismatch (`run_prompt_mismatch`). The Runtime supervisor starts if needed. Output explicitly reports no execution, live prerequisites, and separate drive/status/receipt commands. Use `kxm runs drive <runId> --wait` for supported live one-shot calls; no hub or Pi worker is required. `--simulated` is a model-free experiment, not evidence that implementation ran. Local runs are inspected with `kxm runs`, not the webhook-only `kxm workflow get`.
1392
1443
 
1393
1444
  - Arguments: `<workflow>`, Workflow id to run (a file under `.kxm/workflows/`); `[prompt...]`, Run prompt (events keep its hash; the full text is kept in a local 0600 sidecar file).
1394
- - No command-specific options. Refuses `--workspace` (exit 2).
1445
+ - `--brief <file>` reads that file from the invocation directory, trims it, and uses the text as the prompt. The JSON envelope includes `brief` set to the path as given. `--brief` together with a positional prompt is `brief_and_prompt`. A file that cannot be read is `brief_unreadable`.
1446
+ - `--lane <unit>` selects the recorded worktree before project discovery. A missing lane is `lane_missing`. A last run that is not settled is `lane_run_open`.
1447
+ - Refuses `--workspace` (exit 2, `workspace_option_unsupported`).
1395
1448
  - Needs a KXM project. Starts and uses the Runtime; no hub needed. Honors `--dry-run`, which validates the project and prints the plan without starting the supervisor.
1396
1449
  - JSON keys: `idempotent`, `run` (`runId`, `homeRuntimeId`, `status`, `configRevision`), `supervisor` (`runtimeId`, `port`, `started`), and `execution` (`status: not_started`, `mode: live`, `defaultHarness`, `authentication: not_checked`, `prerequisites`, `nextSteps`). Dry run: `projectRoot`, `workflowId`, `configRevision`, `defaultHarness`, `prerequisites`. The obsolete `phase: pre-3a` field is no longer returned.
1397
- - Errors: `workflow_required` (exit 2), `project_required`, `run_workflow_unknown`, `run_failed` with `issues` (any invalid file in the project fails the load, for example `gate_outcome_impossible`), `run_io_failed` (exit 1).
1450
+ - Errors: `workflow_required` (exit 2), `project_required`, `run_workflow_unknown`, `brief_and_prompt`, `brief_unreadable`, `lane_missing`, `lane_run_open`, `run_failed` with `issues` (any invalid file in the project fails the load, for example `gate_outcome_impossible`), `run_io_failed` (exit 1).
1398
1451
  - The `default` workflow that `kxm init` writes does not set `limits.maxAgentTimeMs`, so it can be driven. A workflow that sets that limit is created, but `kxm runs drive` refuses it with `run_handoff_required` (`limit_unsupported`); projects from older `kxm init` templates carry it on `default`.
1399
1452
 
1400
1453
  ```bash
@@ -1436,12 +1489,12 @@ Reads and drives runs through the Runtime supervisor. Every subcommand needs a K
1436
1489
  ### `kxm runs status`
1437
1490
 
1438
1491
  ```text
1439
- kxm runs status <runId>
1492
+ kxm runs status <runId> [--lane <unit>]
1440
1493
  ```
1441
1494
 
1442
1495
  Show the projected status of a run, including durable drive receipt state (open / receipt verified / unsettled / orphaned).
1443
1496
 
1444
- - Arguments: `<runId>`, Run id. No command-specific options. Reads run state, but starts the supervisor if needed (not under `--dry-run`).
1497
+ - Arguments: `<runId>`, Run id. `--lane <unit>` discovers the project from that lane's worktree (`lane_missing` when the record or path is absent, `lane_unit_invalid` when the unit is not a KXM identifier, `lanes_unreadable` when the record cannot be read). Reads run state, but starts the supervisor if needed (not under `--dry-run`).
1445
1498
  - Text: `run <id>: <status> (workflow <id>, updated <time>)`, plus a drive line such as `drive <id>: open`, `completed (receipt verified)`, `unsettled <reason>`, `handoff`, `cancelled (<reason>)`, or `no receipt (orphaned)`.
1446
1499
  - JSON keys: `run` (`runId`, `status`, `workflowId`, `configRevision`, `updatedAt`, ...), `drive` (`driveId`, `mode`, `openedAt`, `receipt`, `verified`, `divergence`).
1447
1500
  - Errors: `project_required`, `run_status_failed`, `run_status_io_failed` (exit 1).
@@ -1467,7 +1520,7 @@ kxm runs status --dry-run refused: the Runtime supervisor is not running and --d
1467
1520
  ### `kxm runs drive`
1468
1521
 
1469
1522
  ```text
1470
- kxm runs drive <runId> [--simulated] [--wait] [--timeout-ms <n>]
1523
+ kxm runs drive <runId> [--simulated] [--wait] [--timeout-ms <n>] [--lane <unit>]
1471
1524
  ```
1472
1525
 
1473
1526
  Opens a drive of the run. With `--simulated`, a model-free producer reports every agent step as passed. Without `--simulated` the drive runs in live mode: each agent step invokes its harness through a one-shot producer, and the agent's model must be an admitted route (otherwise `producer_route_not_admitted`; there is no fallback model). A read-only step runs with the harness's read-only flags. A step with `write` access runs with an audited writer profile, which only `pi` and `grok` have; it must be a single assignment in a project whose `limits.maxConcurrentRuns` is 1, and, when `.kxm/roster.yaml` exists, its route must be on the roster's writer lineup. Otherwise the drive hands the run off with `step_unsupported`. Around each live attempt the Runtime fingerprints the checkout with `git status` and `git diff`: a write step settles `passed` only when the checkout changed (routing metadata `authored: true`), and a read-only step that changed it settles `failed` (`authoringWitness: readonly_mutated`).
@@ -1477,8 +1530,9 @@ Opens a drive of the run. With `--simulated`, a model-free producer reports ever
1477
1530
  | `--simulated` | none | off | Use the model-free simulation producer |
1478
1531
  | `--wait` | none | off | Wait until a drive receipt is recorded; exits 0 only for a VERIFIED COMPLETED settlement |
1479
1532
  | `--timeout-ms` | `<n>` | `60000` | Wait timeout in milliseconds (default 60000, max 600000) |
1533
+ | `--lane` | `<unit>` | none | Discover the project from this lane's worktree |
1480
1534
 
1481
- - Arguments: `<runId>`, Run id.
1535
+ - Arguments: `<runId>`, Run id. `--lane` refuses `lane_missing` when the record or path is absent, and also `lane_unit_invalid` and `lanes_unreadable`.
1482
1536
  - `--timeout-ms` applies only with `--wait` and must be an integer from 1 to 600000 (`run_drive_timeout_invalid`, exit 1).
1483
1537
  - Mutates run state. Honors `--dry-run`.
1484
1538
  - JSON keys without `--wait`: `runId`, `driveId`, `poll`, `mode`, `status` (`accepted`). With `--wait`: `receipt`, `verified`; a timeout prints `error: "timeout"`.
@@ -1511,7 +1565,7 @@ Not run: starts the Runtime and writes run events.
1511
1565
  ### `kxm runs receipt`
1512
1566
 
1513
1567
  ```text
1514
- kxm runs receipt <runId> [--all]
1568
+ kxm runs receipt <runId> [--all] [--lane <unit>]
1515
1569
  ```
1516
1570
 
1517
1571
  Print the newest drive receipt for a run.
@@ -1519,8 +1573,9 @@ Print the newest drive receipt for a run.
1519
1573
  | Option | Argument | Default | Description |
1520
1574
  |---|---|---|---|
1521
1575
  | `--all` | none | off | Print the capped receipt list for the run |
1576
+ | `--lane` | `<unit>` | none | Discover the project from this lane's worktree |
1522
1577
 
1523
- - Arguments: `<runId>`, Run id. Text mode prints the newest receipt's settlement as JSON; `--all` prints the list. Starts the supervisor if needed (not under `--dry-run`).
1578
+ - Arguments: `<runId>`, Run id. Text mode prints the newest receipt's settlement as JSON; `--all` prints the list. Starts the supervisor if needed (not under `--dry-run`). `--lane` refuses `lane_missing` when the record or path is absent, and also `lane_unit_invalid` and `lanes_unreadable`.
1524
1579
  - JSON keys: `receipt`, or `receipts` with `--all`. Exit 1 with `no_receipts` when the run was never driven.
1525
1580
 
1526
1581
  ```bash
@@ -1532,12 +1587,12 @@ Not run: starts the Runtime supervisor.
1532
1587
  ### `kxm runs cancel`
1533
1588
 
1534
1589
  ```text
1535
- kxm runs cancel <runId>
1590
+ kxm runs cancel <runId> [--lane <unit>]
1536
1591
  ```
1537
1592
 
1538
1593
  Durably request cancellation of a run: records `run.cancel_requested` then `run.status_changed`. Cancelling a terminal run is an idempotent no-op.
1539
1594
 
1540
- - Arguments: `<runId>`, Run id. No command-specific options.
1595
+ - Arguments: `<runId>`, Run id. `--lane <unit>` discovers the project from that lane's worktree (`lane_missing` when the record or path is absent, `lane_unit_invalid` when the unit is not a KXM identifier, `lanes_unreadable` when the record cannot be read).
1541
1596
  - Mutates run state. Honors `--dry-run`.
1542
1597
  - JSON keys: `idempotent`, `run` (`runId`, `status`).
1543
1598
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kontextmind/kxm",
3
- "version": "0.7.119",
3
+ "version": "0.7.120",
4
4
  "description": "KXM local-first multi-agent orchestration and operator dashboard",
5
5
  "type": "module",
6
6
  "author": "KontextMind",
@@ -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.119",
5
+ "version": "0.7.120",
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",