Kane CLI by TestMu AI (Formerly LambdaTest). Use kane-cli for end-to-end browser and mobile testing in natural language: generate tests from a PRD or spec, run them on Chrome, Android and iOS, and gate CI with evidence packs.
87%
Does it follow best practices?
Run evals on this skill
Adds up to 20 points to the overall score
Low
Low-risk findings worth noting
When the user has requirements — a PRD, a spec, acceptance notes — and wants tests designed from them, wants to know what's covered, or wants the suite kept current, use the assurance commands (kane-cli context, design, cover, maintain). Do not hand-write the tests:
Everything here works over a local store (.context/ in the project directory) that the commands create and manage themselves. A folder linked to a team's shared project (it holds .testmuai/assurance.json; kane-cli 0.10.0+) works in the project instead, and its journey differs: no context review checkpoint, every session is saved explicitly, and cover gaps is refused. Follow shared-projects.md §4 there; the sections below describe the local store: a linked folder's events and refusal codes are in agent-contract.md, and the options it refuses in shared-projects.md §8. In agent mode a folder that isn't set up yet goes local unless you pass --project <id>, so settle where the work goes first (shared-projects.md §1).
Version gate — check before improvising. The assurance commands exist on kane-cli 0.6.1 and later; flags and events marked with a release (0.7.1+ … 0.8.14+) below need at least that release. On an older CLI, kane-cli context … fails as an unknown command (exit 2 with a "did you mean" suggestion) — that error means the CLI is too old, not that you typed it wrong. Confirm with kane-cli --version, tell the user to update (npm install -g @testmuai/kane-cli, or brew upgrade kane-cli), and stop — do not try to reproduce the workflow with other commands.
kane-cli context ingest ./prd.md --mode agent # 1. snapshot AND extract (0.7.1+ one flow; may pause — §2)
kane-cli context review --verdicts <file> --json # 2. CHECKPOINT: user approves use-cases
kane-cli design tests --use-case <uc-ref> --mode agent --max 8 # 3. design ACs, scenarios, tests
kane-cli context review --verdicts <file> --json # 4. CHECKPOINT: user approves the design
kane-cli testmd run .testmuai/tests/<t>_test.md --agent # 5. author each kept test once (real browser)
kane-cli testrun run --match 't-' < /dev/null # 6. batch replays from then on
kane-cli cover gaps # 7. the coverage figure, use-cases with tests, per-use-case debt
kane-cli maintain reconcile --from <new.md> --source-id <id> --mode agent # when a source changes (§11)On 0.7.1+, context ingest --mode agent lands the files and runs the extraction in one flow (one ingested event per landing, then the extract stream). Run kane-cli context extract --mode agent separately for re-runs, --source <id> pins, and resumes; on pre-0.7.1 releases run it after every ingest.
Two hard rules:
ingest, extract, review with verdicts, design, reconcile, evolve) — the store is single-writer (§8), and extraction additionally holds a store-wide lock (a concurrent extract refuses EXTRACT_LOCKED, exit 2 — wait, never delete locks).Extract, design, reconcile and evolve call the KaneAI service and consume credits. URL sources are fetched server-side, and a web page's ingest is refused when the organisation is out of credits. Everything else is local and free.
Scope: this rule applies to context extract/context ingest, design tests, maintain reconcile (§11) and, on 0.8.21+, maintain evolve. (For run/testmd/testrun, exit 3 still means timeout/cancelled.)
These commands take --mode agent — not --agent; they reject that flag, and a bare non-TTY invocation exits 2 asking for an explicit mode. In --mode agent, every question pauses the run (0.8.8+ — earlier CLIs auto-answered low/medium-risk questions with their recommended defaults and paused only on high risk):
3, emits session_paused with the session id, the questions in full (text, options, the recommended one, risk, rationale), and the verbatim resume command.3 with a session_paused carrying crashed: true (no pending_questions) and the resume command — exit 3 always means "resumable". A crash before anything durable was saved still exits 1; check context sessions --json before retrying anything paid.Three ways to resume:
# plain words — the agent maps your statement to its own questions:
kane-cli context extract --resume <sid> --mode agent --message "Account required — the update section supersedes the older text"
# by id (0.7.1+) — for precise scripted answers; each echoes a panel_resolved event:
kane-cli context extract --resume <sid> --mode agent --answer q1=1 --answer q2="https://app.example.com"
# land a new source instead of answering (0.7.1+) — the batch defers (ask_deferred), the agent
# reads the source and re-asks only what's still open:
kane-cli context extract --resume <sid> --mode agent --with-source ./addendum.mdkane-cli context sessions --json (all resumable sessions + their resume commands) and kane-cli context sessions show <sid> --json (the pending questions in wire shape). A session written by a NEWER kane-cli than the installed one lists as unknown with no resume command (0.7.1+) — that means "upgrade to resume it", not corruption. If you abandon a session deliberately, remove it with kane-cli context sessions clean <sid> — bare clean only collects expired sessions, and --all is a purge that needs explicit user authorization. (A linked folder refuses sessions show and sessions clean: kane-cli context sessions --mode agent lists the project's sessions there.)Full event schema: references/assurance-parsing.md.
kane-cli context ingest <files-or-urls...> --mode agent # lands + extracts (0.7.1+); --mode ci lands ONLY (exit 0)
kane-cli context extract --mode agent # re-run entry: sweeps every pending sourceAccepted sources (each with a size cap; oversized = FILE_TOO_LARGE, wrong type = UNSUPPORTED_MEDIA):
.txt/.md/.markdown and structured text .json/.yaml/.yml/.toml/.xml/.log (≤2MB, must be UTF-8);png/jpeg/webp (≤5MB);PDF_NO_TEXT_LAYER, password-protected PDF_ENCRYPTED;.doc refuse DOCX_ENCRYPTED_OR_LEGACY; save-as-.docx is the remedy;kane-cli context ingest https://<site>/browse/PROJ-123. Prerequisite: Jira connected in the user's LambdaTest Integrations screen (the refusal says so if not). 0.7.2+ ingests all comments (author, timestamp, body — citable; a failed comments read refuses the whole ingest); pre-0.7.2 comments were not ingested. Re-runs are unchanged/versioned like files — and an issue last ingested pre-0.7.2 versions ONCE on its next re-ingest: report that as the upgrade catching up, not a content change;kane-cli context ingest https://<site>/wiki/spaces/<KEY>/pages/<id>/… (the full URL — short-links refuse). Same Atlassian connection as Jira, but it must have Confluence access; a Jira-only connection refuses with reconnect guidance. Default id page-<id>; a body change versions the source, a no-op edit or bare version bump does not;kane-cli context ingest https://linear.app/<workspace>/issue/KEY-123 (slug/query/#comment variants converge). Prerequisite: a Linear connection (the refusal points at the Integrations screen). Comments incl. threaded replies are identity-bearing — a failed or partial comments read refuses the whole ingest; a recycled key (same key, different issue) refuses with retire/--as recovery; default id = the lowercased key (eng-42);…/document/<slug> (the slug must end in the document's 12-hex id; the connection needs document access — resync hint otherwise). Default id doc-<id>. Workspace pages (project/team/view) refuse — ingest their issues or documents individually;--as adopts a custom id, and re-pointing an adopted id at a DIFFERENT URL asks on a TTY / refuses headless. Inaccessible pages (not found, login/paywall, bot-blocked, non-HTML, too large, timeout) and private/internal addresses refuse in plain language.Remote ids share ONE space (0.8.6+): a URL whose id is already backed by a different kind of source refuses with retire/--as recovery — report it as an id collision; never retry blindly.
Landing-phase failures. 0.7.2+ is strictly NDJSON in --mode agent: a bad path, an unsupported or oversized file, a refused URL, or a misused --mode/--as arrives ON the stream as error (codes MODE_USAGE, AS_SINGLE_SOURCE, UNSUPPORTED_URL, INGEST_FAILED) + done, and nothing ever precedes the stream. On 0.7.1 the same failures end with a prose error line and exit 1/2 BEFORE any NDJSON begins — no done event. Either way it is a refusal (fix the input and re-run; sources already landed stay safe — the run says so), never a crash.
Re-ingesting changed bytes under the same id versions the source and marks everything derived from the old snapshot stale — but for a changed document, prefer maintain reconcile (§11), which does the version move AND triages the fallout.
Extract behavior to expect (0.7.1+): the sweep continues past a per-source failure (one line each; exit 1 at the end if anything failed — the failed source is read again on the next extract, which costs credits again; no --force needed). --trust hold holds everything new for the user's review instead of committing (headless-only; --mode ci refuses the flag entirely; use it one source at a time — resuming held work from a multi-source run is not yet supported). The agent cites every claim (fabrication is rejected before write), asks when the source contradicts itself, and commits proposals as derived. Watch the commit event and say it in plain language ("5 use-cases extracted from the PRD").
Promotion from derived to trusted always requires explicit user confirmation — even when the user asked for an "end-to-end" run. (In a shared project there is no review command: context review and context explain are refused in a linked folder, and use cases an agent run saves stay proposed. Run the checkpoint as shared-projects.md §4 says: show them, ask once for the batch, then design with --allow-unreviewed on a yes.) End-to-end authorizes completing the workflow, not making product-requirement judgements.
Present the material, not the counts. The commit event carries counts and ids only — to run a checkpoint, enumerate what's waiting with kane-cli context list --json --inferred (one JSON row per unreviewed node) and pull any item's full content, citations, and history with kane-cli context explain <ref> --json. Present titles, descriptions, and the cited evidence; collect the user's decisions; build the verdicts from those same refs. The same recipe runs the design checkpoint. Then land the decisions atomically:
kane-cli context review --verdicts verdicts.json --json
kane-cli context review --approve uc-a uc-b # 0.7.1+: structured flags for single decisions
kane-cli context review --skip uc-c # skip/defer leave NO fact — the item stays queuedverdicts.json is an array of {"ref": "<slug-or-cid>", "resolution": "..."} where resolution is exactly approved | edited | rejected | skipped | supersede (optional reason, edit, supersede_target). One unresolvable ref fails the whole file (exit 2, nothing lands). The structured flags (--approve/--skip/--defer) are mutually exclusive with --verdicts.
Archives need consent (0.7.1+). A --verdicts rejection no longer destroys anything — it lands as a non-destructive pending_archive fact (exit 0, loud summary). Actually archiving requires --allow-archive --because "<reason>", and --mode ci refuses archives under any flag. Never pass --allow-archive without the user's explicit instruction and their reason.
Auto-approving is allowed only when the user explicitly says so ("approve the recommended items without asking me") — and even then, enumerate everything you promoted in your summary and still surface warnings and conflicts.
kane-cli design tests --use-case <uc-ref> --mode agent --max 8--max (start at 8; narrow for a smoke slice, widen only when the requirement breadth or the user justifies it). It caps scenario+test pairs — deliverable size, NOT credits. There is no spend cap: track the usage events' total_credits and report the total. If consumption looks runaway or a turn errors, stop and report — never auto-retry a paid turn.--max makes the agent estimate a size and ask — which in agent mode is a pause.next (bypass only on explicit user instruction: --allow-unreviewed). An already-designed use-case exits 2 with the --force redesign and evolve alternatives in next. Offer the next commands to the user; never auto-run a --force.--because flag on design tests — interactively the session collects the redesign reason itself; headless --force proceeds with an auto-stamped reason.--phase <grounding|acs|scenarios|wiring|tests> (0.7.1+) re-enters a design at a phase, re-seeded from the committed earlier phases; missing predecessors exit 2 with the commands to run first in next..testmuai/tests/*_test.md, each assert step tagged with the criteria it verifies. Plus gaps (recorded, ranked missing pieces) and warnings (e.g. a test claiming more criteria than its check asserts). Citations are verified against the pinned source text before commit (0.7.1+) — a CITE_UNVERIFIED error means a citation could not be verified even after repair.*.json in the user's variable directories (names + has-value only, never values) and reuses a name that exists before inventing one. Each name it invents is declared: an empty stub lands in .testmuai/variables/assurance.json, never a value, never over an existing key. The stream tells you which: variables_declared in the tests phase, just before its commit event, and variables_summary after session_complete on a clean completion (a paused run sends only the first; schema in references/assurance-parsing.md). Surface these as a to-do — "2 variables need values: login_email, login_password — in .testmuai/variables/assurance.json" — because a designed test authored before they are filled types the placeholders as written (SKILL.md §3, Unresolved variables). Before any run of these tests, fill them: SKILL.md §3 Fill the variables before any run, asking with each row's description.kane-cli design explain <t-ref> replays why a test exists (technique, boundary values, criteria) with zero AI cost — use it when the user asks "why this test?".A freshly designed test has never been executed. On 0.8.4+ hand the set straight to kane-cli testrun run: unauthored members classify as author, the run authors them in a real browser, and afterwards the authored and replayed evidence consolidates into one published execution — best-effort: when consolidation cannot complete, evidence stays split rather than lost. --from-context (0.8.4+) selects members by assurance test ids and follows edit supersessions. Designed tests may carry {{variables}} for values the requirements never pinned (a store URL, a product name) — fill them first (SKILL.md §3), or the run types the placeholder as written. kane-cli testmd run <file> --agent remains the single-test authoring path, and on pre-0.8.4 CLIs it is REQUIRED first — testrun there refuses never-authored members (missing_meta). Evidence packs seal per references/evidence.md.
Every designed _test.md carries an assurance: block in its frontmatter: id: t-<slug> and a base: pin naming the design version the file came from. The graph follows edits through that pin (0.8.4+): an edit made on top of the current design version is adopted at the file's next testmd run / testrun run as the next version of that test — no review checkpoint, no warning — and from then on the edit IS the design; coverage, gaps and reconcile build on it. An edit made on top of an older version is kept out of the graph, and the run reports a sync warning naming the test.
So a failing authored run is never, by itself, a reason to rewrite the step. Classify the failure first (the pack's failure.yaml and the network capture it references — references/debug.md), then route it:
| The run failed because… | Do | Never |
|---|---|---|
| the app misbehaved (wrong status, missing header, wrong data) | keep the test as it is; report the finding with the evidence | edit the step until it passes |
| the requirement changed | kane-cli maintain reconcile --from <new source> --source-id <id> --mode agent (§11) | patch the step text to match the new requirement |
| the step wording sends the agent the wrong way (ambiguous target, no end state) | redesign through the CLI so the new wording is minted as a design version: offer the user kane-cli design tests --use-case <uc-ref> --force (never auto-run a --force; interactively the session collects the reason, headless it is auto-stamped) or kane-cli maintain evolve … --because "<reason>" in a terminal — cover gaps <uc-id> names the remedy in its next block | rewrite the sentence in place |
the platform cannot perform what the step asks for (a hash of a downloaded file, a request that must carry the browser's login — references/objectives-cookbook.md §3.2 and §3.5) | tell the user and stop; different wording will not make the capability appear | paste the triage's suggested_fix.summary into the step |
If you still judge a hand edit necessary, do all of the following, in order:
references/objectives-cookbook.md in full before writing a word. The edited step must be something kane-cli can actually run: an intent action with literal data, then an observable end state (§1); assertions phrased as checkpoints (§3); a direct API call only where §3.5 applies.assurance: block, the # title, the > blockquote under it, and every ## Step … heading with its @verifies tags (e.g. ## Step 4 — assert @verifies ac-…) exactly as they are — the pin and the tags tie the test to its requirement./api/orders/42/invoice returned 200 with content-disposition: attachment", not "use DevTools to intercept the response and issue a GET".kane-cli testmd run <file> --agent and read the result against the ACs the step @verifies.kane-cli cover # one coverage figure over the use-cases; --from <pack> reads one run's own figure
kane-cli cover gaps # the coverage ribbon: that figure, then one row per use-case (designed count, coverage, debt)
kane-cli cover gaps <uc-id> # 0.8.2+: the dossier — every AC of that use-case + next actions
kane-cli cover gaps --json # the nested document (the figure, designed counts, per-UC pending rows with ready_command)
kane-cli cover gaps --mode agent # 0.7.1+: same data as ONE `gaps` event + done.next[] ready-commandsIn a shared project (a linked folder): cover gaps is refused. kane-cli cover --mode agent gives the project's own figure, one coverage event then done. A coverage event with state: "computing" and no pct means the project is still working its figure out: say so, and run done.next again in a minute. A run less than 5 minutes old may not count yet (recent_run.may_not_count_yet: true); say so and offer to check again. Its done.next commands carry their agent flag (--mode agent, or --agent for testrun run): run them as given, ending a testrun run line in < /dev/null. If a next command has no agent flag, add the one that command takes before running it.
On 0.8.2+ the default cover gaps output is the coverage ribbon — a high-level band-table: one severity-ordered row per use-case with its designed count, its coverage and per-class debt counts, deliberately carrying NO commands. To act, drill in: cover gaps <uc-id> (the dossier) renders every AC of that use-case plus a next actions block — evidence first; surface its warning that re-running an authored test on a broken app may heal the test around the failure — or read --json, whose per-UC pending rows keep ready_command. --rollup no longer changes the figure: don't pass it (agent mode answers it with a warning ROLLUP_IGNORED). BREAKING at 0.8.2: --flat and gaps' --from are REMOVED and refuse (pre-0.8.2 CLIs still have the flat worklist). With a <uc-id>, --json and agent mode close the document over that use-case.
.context/ is append-only and single-writer. Never run two store-mutating commands concurrently (extract, review verdicts, design, ingest, reconcile, retire/revert/rebuild). On a lock error (EXTRACT_LOCKED, or reconcile's walk lock), another run is live: report it and wait — never delete lock files; a dead run's lock clears itself..context/, and never git merge it — two histories merge cleanly in git and brick the store on the next read. Keep it gitignored — kane-cli 0.8.14 adds .context/ to the folder's .gitignore itself when it creates the store inside a git repository — gitignore_updated on the stream, or a warning{message} when the line could not be written (relay it and add the line yourself); KANE_CONTEXT_GITIGNORE=0 keeps it out. To share it with a team, use a location (a GitHub repository, an S3-compatible bucket, or a folder) through kane-cli context sync, kane-cli context push, kane-cli context pull and kane-cli context clone (0.8.14+) — a Git repository used as a location is not the same as committing .context/. While a sync rebase is open the store refuses every other write with SYNC_REBASE_PENDING (the fence) — finish it or kane-cli context sync doctor --abort, never delete files. Rules, events and decisions: references/context-sync.md.explain, fsck and view; there use kane-cli context list --mode agent): kane-cli context list --json (nodes with trust + freshness), kane-cli context explain <ref> (a node's full recorded history, no AI), kane-cli context fsck (integrity check), kane-cli context view --no-open --out <path> (writes a self-contained HTML graph snapshot to that path — never opens a browser, never touches the graph).context retire, revert, rebuild, name --backfill) exist and take --yes headless — run them only on an explicit user request, never autonomously.| Signal | Meaning | Do |
|---|---|---|
context/design/cover is an unknown command (exit 2) | the CLI predates 0.6.1 | kane-cli --version to confirm; have the user update; stop |
| an assurance flag from this reference is unknown (exit 2) | the installed CLI predates the version that flag is marked with here (0.7.1 for most; 0.8.14 for the sync flags), or the flag is misspelled or on the wrong command | check the full command, then kane-cli --version against the feature's stated minimum; have the user update; stop |
error code NO_STORE | no .context/ here | context ingest the sources first (confirm the cwd is the project root) |
SOURCE_MISSING / BLOB_MISSING | store references a missing source | re-ingest the source file |
STALE_BASIS | the graph moved under the session | re-run the extract — it re-grounds |
HIGH_RISK_CI | a --mode ci run hit a judgement call | re-run with --mode agent and handle the pause |
EXTRACT_LOCKED (exit 2) | another extraction is live on this store | wait for it; never break locks |
TRUST_USAGE / TRUST_UNDER_CI | --trust used where it can't apply (interactive hold / any ci) | drop the flag, or run headless agent mode |
HOLD_MULTI_SOURCE (exit 2) | a --resume --with-source landing was refused — the resume carries --trust hold, or the session already holds items for review | finish the held review first; run hold one source at a time |
UC_UNREVIEWED (exit 2) | design target is unreviewed | run the review command from next; --allow-unreviewed only on explicit user instruction |
UNKNOWN_PHASE / PHASE_ORDER (exit 2) | bad --phase entry | run the predecessor commands named in next |
CITE_UNVERIFIED | a citation failed verification even after repair | report it; the item did not commit with bad provenance |
INGEST_UNAUTHORIZED_REF | a source ref not provided by the user tried to land | only user-provided paths/URLs can land — ask the user for the source |
WRONG_VERB (exit 2) | resuming a session with the wrong command family | use the resume command from sessions --json verbatim |
STRUCTURED_FLAGS_USAGE / STRUCTURED_TARGET_UNKNOWN (exit 2) | a misused --answer/structured verdict, or an unknown question/item id | fix the <id>=<value> form, or use an id from the refusal's list (it names the addressable ids) |
PAIR_MISMATCH / BINDING_MISMATCH (exit 2) | the installed release pair is broken, or the session belongs to another release | reinstall/upgrade kane-cli; a session from before an upgrade either resumes under its original release or restarts fresh (committed work is kept) |
message ends [SOURCE_HELD] (exit 2, 0.7.2+) | a reconcile head-move refused — a live session holds review items pinned to that source | finish that review first (the refusal names the session: context extract --resume <sid>), then re-run |
message ends [SESSIONS_UNREADABLE] (exit 2, 0.7.2+) | a session file can't be read, so the hold check fails closed | context sessions --json to list, context sessions clean <sid> for the broken one, then re-run |
message ends [HELD_REVIEW] (exit 2, 0.7.2+) | a headless --apply met a live held review that needs a human | have the user run kane-cli maintain reconcile --apply in a terminal — it resumes the cards agent-free |
| "this version of kane-cli is no longer supported" (runtime failure, exit 1) | the service requires a newer CLI | have the user upgrade, then retry |
media refusals (PDF_*, DOCX_*, ENCODING_UNSUPPORTED, UNSUPPORTED_MEDIA, FILE_TOO_LARGE) | the source file can't be ingested as-is | relay the message — each names its remedy (save-as, split, re-encode) |
| a remote URL refuses because its id is backed by a different kind of source (0.8.6+) | cross-provider id collision — remote ids share one space | retire the existing source, or adopt the new one with --as; never retry blindly |
| lock held | another assurance run is live | wait for it; never break locks |
sync_error code SYNC_REBASE_PENDING (exit 2, 0.8.14+) | a sync rebase is open on this store — the fence refuses every other write | the user finishes it (kane-cli context sync, answering decisions) or closes it (kane-cli context sync doctor --abort); never delete files — references/context-sync.md §7 |
sync_error code SYNC_BEHIND / SYNC_DIVERGED (exit 3, 0.8.14+) | the location has records this store has not pulled / both sides added work — a pull or a rebase is needed, not a failure | relay the remedy verbatim (kane-cli context pull <name>, or --rebase on the user's go-ahead) — references/context-sync.md §6 |
sync_behind event on an extract/design/reconcile stream (0.8.14+) | advisory: the location has moved past this store | one line ("origin has records you have not pulled"); the run continues |
sync_error code SYNC_STORE_BUSY (exit 2, 0.8.14+) | a sync verb met a live session or lock on this store | wait; kane-cli context sync doctor when it names an interrupted rebase |
error code NO_PROPOSAL | the agent stopped before proposing use-cases for that source | re-run kane-cli context extract --mode agent once; it reads that source again and costs credits again. If it happens twice, stop, and give the person the command and the message |
a shared-project code (PROJECT_NO_ACCESS, FOLDER_CHOSEN, PROJECT_BUSY, REMOTE_UNSUPPORTED, CONFIRM_REQUIRED, PROJECT_MISMATCH, TEST_CASE_MISSING …) | a linked folder's refusal | agent-contract.md: each code with the command that recovers it |
error + done with exit 1 | runtime failure (incl. a sweep where some sources failed) | report the message; do not blindly re-run a paid command |
| auth/credit failure mid-run | token or balance problem | keep the sid, have the user fix auth/balance (kane-cli whoami, kane-cli balance), then resume |
stream ends with no done event | the process crashed — outcome unknown (the one designed exception: kane-cli context review --mode agent keeps its --json shape and ends its listings without done; read its exit code) | check context sessions --json and context list before any retry, to avoid duplicate paid work |
exit 130 | force-interrupted | extract/design: resumable only if a session_paused event was actually received. Sync verbs: the rebase state is on disk — kane-cli context sync doctor, then kane-cli context sync resumes it |
Same philosophy as SKILL.md §1 — translate, don't transcribe:
agent_activity lines (thinking/tool noise) into at most one progress remark.A changed requirements document is one command, not a re-ingest:
kane-cli maintain reconcile --from ./prd-v2.md --source-id prd --mode agentIn a linked folder reconcile takes a file, always with --source-id: kane-cli maintain reconcile --from <file> --source-id <id> --mode agent. It opens a review session that you save like any other (shared-projects.md §4), not the reconcile_* stream below. --plan, --apply, --mode ci, a missing --source-id and a URL in --from are refused (REMOTE_UNSUPPORTED); for a page's new version run kane-cli context ingest <address> --mode agent. The rest of this section is the local store's.
Never context ingest the new version first — reconcile does its own re-ingest, records the version move, and triages the fallout into rows: ADD (new use-case → design it), MODIFY (content moved → update or re-design), ARCHIVE (evidence decayed — never applied headless, always waits for the user's interactive session). It emits its own event family (reconcile_plan → reconcile_row_start/reconcile_row_end per row → reconcile_paused? → reconcile_summary → done; see references/assurance-parsing.md). Modes: agent auto-applies the safe ADD/MODIFY tier and exits 3 with the stored plan when ARCHIVE rows need a human; ci fail-closes (plan stored, exit 2); --plan is a safe staged preview. Re-running the same command is idempotent — it resumes a pending plan rather than re-billing.
0.7.2+ additions:
cover gaps with the reconcile command as its remedy, and typing steers a re-finalize of the remaining changes. Verdicts persist as they land — Ctrl+C loses nothing, and bare --apply resumes a held review as cards agent-free (no model, no network); a headless run that meets a held review refuses with a [HELD_REVIEW] message marker. While a deferred change is on the record, the store fails integrity checks and refuses commits on older kane-cli versions — machines sharing a store upgrade together.--from takes URLs. The same remote URLs ingest takes (§3): Jira/Confluence (0.7.2+), web pages (0.8.3+), Linear issues and documents (0.8.6+). --source-id is then optional — the URL carries its own id, and a contradicting --source-id refuses. Kind continuity holds both ways: a URL can't version a file-backed source and a file can't version a remote one — each refusal names the correct --from. A source ingested under a custom id (--as) is maintained by re-running that ingest with the same --as. The first reconcile of a Jira issue last ingested pre-0.7.2 may report the one-time upgrade re-version (§3) — not a content edit.verb: "reconcile" — parse per references/assurance-parsing.md.For staleness that arrived outside a reconcile, kane-cli maintain evolve <ref> re-designs the parent use-case of the entity you name (--from-stale takes every use-case with stale designs). Give a <ref> or --from-stale, never both. A fresh target exits 2 unless you pass --because "<reason>", and a use-case that was never designed exits 2 too (run design tests first). A use-case out of date only because its source changed is not evolved: as a target it exits 2 (unless --because is passed) and a --from-stale batch leaves it out, each with evolve_skipped reason: "source_changed" (and a next, when kane-cli knows the source's file, that reviews its change with kane-cli maintain reconcile …): offer the reconcile instead. In a terminal evolve states the blast radius and asks.
(0.8.21+) kane-cli maintain evolve <ref> --mode agent puts that question on the stream. A call on a stale target with no answer ends paused, exit 3: evolve_target carries the blast radius (use_case, the pairs it affects, because?), then evolve_paused carries pending_questions (one per use-case, id: "evolve:<use-case>", options proceed / decline), resume and next[] (two ready commands: proceed all, decline all), then done{paused}. Present the blast radius with the question, as with any pause (the pause loop above). Answer on the next call with --answer evolve:<use-case>=1 (or =proceed) or --answer evolve:<use-case>=2 (or =decline), repeatable; --answer needs --mode agent, and the resume command keeps --because. Nothing runs until every question is answered. A partial set pauses again on the rest, and the next commands then carry the answers already given, so a "decline the rest" command still re-designs what was answered proceed: read a next command before running it. On proceed, the design run's own events arrive between child_start and child_end stamped verb: "design". After a clean design run comes evolve_diff (superseded, minted, retained, criteria whose tests moved). A design session that pauses arrives as its own session_paused: resume that session, then run evolve again for the diff. done.next[] carries every paused session's resume, all of them, whatever the exit code. In a --from-stale batch every use-case runs whatever the earlier ones did, and a declined, never-designed or source-changed one is reported as evolve_skipped. Schema: references/assurance-parsing.md. On a CLI before 0.8.21 evolve has no --mode: suggest the user run it in a terminal rather than scripting around it.
For location setup, sync, pull, push, clone and rebase recovery, see Sharing the context store.
context name, context retire, and context revert accept --mode agent and emit an envelope ending in done. Destructive agent-mode operations require --yes even when stdin is a TTY. Other modes retain human output. Read commands use their documented --json flags; do not assume they all accept --mode.
context review --mode agent / --json returns review outcome rows on success rather than the conversational done contract. Early agent-mode errors may emit error plus done; check command-specific output and process exit.
.tessl-plugin
references
scripts