UNPKG

@kontextmind/kxm

Version:

KXM local-first multi-agent orchestration and operator dashboard

292 lines (211 loc) • 13.3 kB
# Run your first workflow A [workflow](../glossary.md#workflow) is a reviewed YAML file in `.kxm/workflows/` that the local [Runtime](../glossary.md#runtime) runs step by step. In this tutorial you add a workflow from a built-in template, review and commit it, and drive a run to a verified completion without calling any model. [Understand the workflow](#understand-the-workflow) then explains what you ran. ## Before you begin - The `kxm` CLI. See [Install KXM](install.md#install-the-cli). - A KXM project whose `.kxm/` is committed to Git. Steps [1](quickstart-claude-code.md#1-initialize-the-project) and [2](quickstart-claude-code.md#2-ignore-runtime-state-and-commit-kxm) of the Claude Code quick start create one. - Nothing else. The drive in this tutorial is simulated, so it needs no model credentials, and runs work without a hub: the Runtime sends run summaries to the bound hub whenever one is running. ## How a first run works A new workflow reaches a finished run through one human decision: your reviewed commit. ```mermaid flowchart LR A["Add .kxm/workflows/first.yaml"] -->|"kxm init"| B[Validated] B -->|"kxm trust diff"| C[Expansion listed] C -->|"you review and commit"| D[Trusted] D -->|"kxm run"| E[Run created] E -->|"kxm runs drive --simulated"| F[Run completed] F -->|"kxm runs status"| G[Receipt verified] ``` ## 1. Add a workflow from a template From the repository root: ```bash kxm workflow add first --template spec-and-plan ``` Expected output: ```text Added workflow 'first' to local (<repo-root>/.kxm/workflows/first.yaml) ``` The file name is the workflow ID, so this workflow is `first`. The `spec-and-plan` template writes this file, `.kxm/workflows/first.yaml`: ```yaml schema: kxm.workflow.v1 description: Plan a change, then review the plan. Both steps run as the coordinator agent and only read the repository. coordinator: coordinator limits: maxTransitions: 8 steps: - id: plan kind: agent agent: coordinator maxAttempts: 3 repositories: control: read on: passed: review-arch failed: target: $terminal terminalStatus: failed - id: review-arch kind: agent agent: coordinator maxAttempts: 3 repositories: control: read on: passed: target: $terminal terminalStatus: completed failed: target: plan maxTransitions: 2 ``` Each step's `on` map routes an outcome to the next step. A failed review sends the work back to `plan` at most twice: ```mermaid flowchart LR plan -->|passed| review[review-arch] plan -->|failed| failed([failed]) review -->|passed| completed([completed]) review -->|failed, at most 2 times| plan ``` ## 2. Validate the workflow ```bash kxm init kxm workflow definitions ``` Expected output: ```text validated KXM project at <repo-root> WORKFLOW DEFINITIONS: default [local] 3 steps (roles: coordinator, implementer) Plan, implement, and verify a local change. first [local] 2 steps (roles: coordinator) Plan a change, then review the plan. Both steps run as the coordinator agent and only read the repository. ``` If a file is invalid, `kxm init` exits 1 and prints one `<file>: <code>: <message>` line per problem. ## 3. Review the change and commit it ```bash kxm trust diff kxm trust check ``` Expected output of `kxm trust diff`: ```text permission diff: sha256:<old-revision>… -> sha256:<new-revision>… EXPANSION .kxm/workflows/first.yaml added (expansion) 1 expansion(s) require explicit reviewed trust action ``` `kxm trust check` prints the same lines, adds `trust check failed: review every expansion above before merging`, and exits 1. A new workflow is an [expansion](../glossary.md#expansion) of what agents may do, so read it: which agents run each step, and what access each step has to each repository. When you agree with it, commit it yourself: ```bash git add .kxm/workflows/first.yaml git commit -m "Add the first workflow" kxm trust check ``` Expected output: ```text permission diff: sha256:<revision>… -> sha256:<revision>… no authority-bearing or prose changes ``` > [!IMPORTANT] > Your reviewed commit is the approval. `kxm trust` has only `diff` and `check`, and no command approves an expansion for you. ## 4. Plan the run ```bash kxm run first "Plan a hello script" --dry-run ``` Expected output: ```text run plan: workflow first at sha256:<revision>… (no run created) ``` The hash is the project's configuration revision, the same one `kxm trust diff` prints; a run pins it. Keep secrets out of run prompts. ## 5. Create the run ```bash kxm run first "Plan a hello script" ``` Creation output includes: ```text run created: run_<id> (home rtm_<id>…, config sha256:<revision>…) No steps executed. Project default harness: pi; per-agent harness settings take precedence. ``` The remaining output lists live prerequisites and the commands for `runs drive`, `runs status`, and `runs receipt`. A created run is not an executed workflow; the deliberate simulation below does not require a live authenticated model. `kxm run` starts the Runtime supervisor if it is not running. Check the new run, using the run ID from the output: ```bash kxm runs status run_<id> ``` Expected output: ```text run run_<id>: created (workflow first, updated <timestamp>) ``` ## 6. Drive the run ```bash kxm runs drive run_<id> --simulated --wait ``` Expected output, one line: ```text {"budget":null,"closedAt":"<timestamp>","driveId":"drv_<id>","homeRuntimeId":"rtm_<id>","lastSequence":41,"logHash":"sha256:[redacted]","mode":"simulated","openedAt":"<timestamp>","openedSequence":4,"producer":{"closed":false,"id":"driver-simulated"},"projectId":"prj_<id>","runId":"run_<id>","schema":"kxm.drive-receipt.v1","settlement":{"kind":"terminal","reason":"","status":"completed"}} ``` The simulated producer answers every agent step with `passed` and calls no model or harness, so the run moves from `plan` to `review-arch` to `completed`. `--wait` blocks until the [drive receipt](../glossary.md#drive-receipt) is recorded, for 60 seconds by default (`--timeout-ms`, up to 600000), and exits 0 only for a verified completed run. ## 7. Check the result ```bash kxm runs status run_<id> kxm runs receipt run_<id> kxm runs list ``` Expected output: ```text run run_<id>: completed (workflow first, updated <timestamp>) drive drv_<id>: completed (receipt verified) {"kind":"terminal","reason":"","status":"completed"} run_<id> completed first <timestamp> ``` `receipt verified` means the Runtime checked the drive receipt against the run's event log. ## 8. Stop the Runtime supervisor ```bash kxm runtime stop ``` Expected output: ```text runtime supervisor rtm_<id> stopping ``` You have added, reviewed, run and verified a workflow. ## Understand the workflow ### What the file says The file is a `kxm.workflow.v1` definition. `coordinator` names the agent that owns the run, and `limits.maxTransitions` caps the step-to-step moves one run may make. Each step has an `id`, a `kind` (`agent` here), the `agent` that performs it, a `maxAttempts` limit, access per repository (`none`, `read` or `write`, at most the agent's own), and an `on` map that routes each outcome to the next step or to `$terminal` with a `terminalStatus`. A transition back to an earlier step needs its own `maxTransitions`. [Workflow files](../reference/config-reference.md#kxmworkflowsidyaml-kxmworkflowv1) lists every field, its limits and its error codes, and the [worked example](../reference/config-reference.md#worked-example-a-minimal-two-step-project) shows a workflow written by hand. The [Workflow definition reference](../reference/workflow-definitions.md) compares the two kinds of workflow KXM runs. ### Other templates `kxm workflow add` has three built-in templates. Add `--dry-run` to see the path without writing the file. | Template | Steps | Use it for | |---|---|---| | `spec-and-plan` | `plan`, then `review-arch`, both run by the `coordinator` agent with read-only access | A first workflow: it writes nothing and runs no test command | | `implement-and-verify` | `implement`, then the `test` gate; a failing gate sends the work back to `implement` | Changes checked by your test command | | `dual-critic-review` | `implement`, two reviews, then the `test` gate | Changes that need two reviews before the tests | ### Simulated and live drives `--simulated` replaces model calls, not your commands. Gate steps run their command from `.kxm/gates.yaml` in both modes, so a failing test fails the gate even in a simulated drive. | | Simulated (`--simulated`) | Live (no flag) | |---|---|---| | Agent steps | Report `passed` without calling a model | Call the agent's harness in a one-shot, read-only mode | | Gate steps | Run the gate's command | Run the gate's command | | Needs | Nothing | An admitted route for each agent's model (`kxm routes admit`) | | Non-gate steps with `write` access | Run, but change no files | Refused: the run is handed off. Gate steps are exempt | | Cost | None | Model usage on your accounts | > [!WARNING] > Without `--simulated`, `kxm runs drive` calls live harnesses. An agent whose model is not an admitted route fails with `producer_route_not_admitted`. Read [Harness routing](../reference/harness-routing.md) before your first live drive. A live step with `write` access runs only on a harness with an audited writer profile (`pi` or `grok`), as a single assignment, in a project whose `limits.maxConcurrentRuns` is 1, and only on a route in the writer roster under `.kxm/roles/writer.yaml`; any other live write step is handed off. A live write step settles `passed` only when the checkout changed, and a read-only step that changes the checkout settles `failed`. Gate steps are exempt. The read-only `spec-and-plan` template needs none of this. ### Why start with `first` and not `default` `kxm init` also writes a `default` workflow. Its coordinator plans on `claude` / `anthropic/fable`, its implementer writes the checkout on `grok` / `xai/grok-4.6`, and a `test` gate runs `npm test`; `kxm init` admits exactly those two models in `.kxm/routes.yaml`. You can drive it, but even a simulated drive runs `npm test` in your checkout, and a live drive spends both subscriptions and passes the implement step only when Grok changes the checkout. `first` calls no model and runs no command, so it is the safer first run. [Steps the Runtime does not execute yet](../reference/config-reference.md#steps-the-runtime-does-not-execute-yet) lists every setting that makes a drive hand the run off. ### Two kinds of runs `kxm run` and `kxm runs` manage Runtime runs like this one. A hub workflow run is different: a signed webhook or `kxm workflow start` creates it, and `kxm workflow list` and the `kxm_workflow_*` tools show it. `kxm workflow list` never shows a Runtime run. See [Run webhook workflows](../guides/webhook-workflows.md). ## Troubleshooting | Message or symptom | Cause | Fix | |---|---|---| | `run_handoff_required` naming `limits.maxAgentTimeMs` | The workflow declares an agent-time budget, which the Runtime does not enforce; a project from an older `kxm init` template has one on `default` | Cancel the run, remove the limit or use `first` | | `trust check failed: review every expansion above before merging` | The workflow is not committed | Review it, then commit it | | `workflow <id> does not exist in this project` | The ID is not a local workflow | Use an ID from `kxm workflow definitions` marked `[local]` | | `gate_outcome_impossible` from `kxm init` | A gate step routes failure on `failed` | Declare `implementation-failure` on the gate step | | `--wait` exits 1 with settlement `failed` | A step failed, for example a gate that kept failing (`budget_edge`) | Read the reason with `kxm runs receipt run_<id>`, then fix the step or the command | | A run stays `preparing` or `running` | The run was handed off | Run `kxm runs cancel run_<id>` | ## Next steps - Let Claude do it in your next project. With the [Claude Code plugin](quickstart-claude-code.md) installed, the `kxm-project-setup` skill runs `kxm init`, then `kxm workflow add first --template spec-and-plan`, the trust checks and a simulated drive. It stops twice for you to review and commit `.kxm/`: after `kxm init`, and after it adds the workflow. Claude never commits `.kxm/` itself, and tokens, starting the hub and the plugin's configuration stay with you. In Claude Code: ```text Set up KXM in this repository and run a first workflow. ``` - Learn from runs: `kxm improve report` proposes improvement candidates from live runs. It leaves simulated attempts out, so for now it reports `0 record(s)`. See [Continuous improvement](../guides/continuous-improvement.md). - Give agents project context: Claude calls `kxm_context` with its role and task before planning. See [Context and memory](../guides/context-and-memory.md). - Watch agents and workflows live with `kxm dash`: [Monitor KXM](../operations/monitoring.md#watch-live-work-with-kxm-dash). - Write richer workflows: [Workflow catalog](../reference/workflow-catalog.md) and [Workflow definition reference](../reference/workflow-definitions.md).