From 507c87168cba64eb55e2f710fa2d58df3f9de458 Mon Sep 17 00:00:00 2001 From: Claude Date: Fri, 4 Sep 2026 08:46:40 +0000 Subject: [PATCH 1/3] docs(kane-cli): sync new sections from testmuCom (partial, in progress) Ports the kane-cli doc updates merged into testmuCom via PR #3479 ("sync public docs with the GitHub user guide") into Mintlify MDX on stage-mintlify. This is an in-progress commit; more files land in follow-up commits as the conversion completes. So far: - New: docs/kane-cli-testrun.mdx - Updated: kane-cli-assurance-automation, kane-cli-configuration, kane-cli-testmd, kane-cli-tms-integration (new sections merged in) - docs.json: nav entries for kane-cli-testrun and the upcoming kane-cli-testmd-composition / kane-cli-testmd-running / kane-cli-troubleshooting-sharp pages Co-Authored-By: Claude Sonnet 5 Claude-Session: https://claude.ai/code/session_01WajQp3gGPGEqW5GA59RoSU --- docs.json | 18 +++- docs/kane-cli-assurance-automation.mdx | 6 +- docs/kane-cli-configuration.mdx | 64 +++++++++++- docs/kane-cli-testmd.mdx | 118 ++++++++++++++++++++++ docs/kane-cli-testrun.mdx | 133 +++++++++++++++++++++++++ docs/kane-cli-tms-integration.mdx | 36 ++++++- 6 files changed, 364 insertions(+), 11 deletions(-) create mode 100644 docs/kane-cli-testrun.mdx diff --git a/docs.json b/docs.json index 7307b8fdb..00960970b 100644 --- a/docs.json +++ b/docs.json @@ -65,7 +65,15 @@ "docs/kane-cli-variables-and-context", "docs/kane-cli-configuration", "docs/kane-cli-tms-integration", - "docs/kane-cli-testmd" + { + "group": "Test.md", + "pages": [ + "docs/kane-cli-testmd", + "docs/kane-cli-testmd-composition", + "docs/kane-cli-testmd-running" + ] + }, + "docs/kane-cli-testrun" ] }, { @@ -156,7 +164,13 @@ "pages": [ "docs/kane-cli-cli-reference", "docs/kane-cli-error-codes", - "docs/kane-cli-troubleshooting", + { + "group": "Troubleshooting", + "pages": [ + "docs/kane-cli-troubleshooting", + "docs/kane-cli-troubleshooting-sharp" + ] + }, "docs/kane-cli-changelog" ] } diff --git a/docs/kane-cli-assurance-automation.mdx b/docs/kane-cli-assurance-automation.mdx index 8b7fc5b13..cf377e995 100644 --- a/docs/kane-cli-assurance-automation.mdx +++ b/docs/kane-cli-assurance-automation.mdx @@ -35,6 +35,8 @@ Rule of thumb: `agent` when something can read the pause and answer (an AI agent The same matrix drives `maintain reconcile`, with two reconcile-specific rules: no headless mode ever archives anything — ARCHIVE decisions wait for an interactive session — and a `ci`-mode run that hits a decision needing a human **stores the plan and exits `2`** (the work isn't lost; walk the stored plan interactively or apply it in `agent` mode). +`context ingest` follows the matrix with one extra rule *(0.7.1)*: it lands the files and then runs the extraction under the given mode — except `--mode ci`, or piped stdin without any `--mode`, which **lands only** (exit `0`, with a stderr guidance line naming the next command). Two extraction dials also matter headless: `--trust hold` holds everything new for review instead of committing it (headless-only; `ci` refuses the flag entirely with exit `2`), and `--trust auto` is the default everywhere. + ## Exit codes Consistent across extract, design, and the maintain commands that embed them: @@ -43,8 +45,8 @@ Consistent across extract, design, and the maintain commands that embed them: |---|---| | `0` | Complete. | | `1` | Runtime failure. For extract and design, a `ci`-mode fail-close on a high-risk question also exits `1`; reconcile's `ci` fail-close stores the plan and exits `2` instead. | -| `2` | Usage / auth / refusal — bad flags, failed input validation, no store, bare non-TTY without `--mode`, missing `--yes` on a destructive command. Nothing was mutated. | -| `3` | **Paused and resumable** — the only meaning of 3. A session is saved; resume it within 24 hours. | +| `2` | Usage / auth / refusal — bad flags, failed input validation, no store, bare non-TTY without `--mode`, missing `--yes` on a destructive command. Nothing was mutated — with two durable exceptions: a merged ingest whose *extraction* refused keeps its landed sources (the run says they're safe), and reconcile's `ci` fail-close keeps its stored plan. | +| `3` | **Paused and resumable** — the only meaning of 3. A session is saved; resume it within 24 hours. Since 0.7.1 sessions are durable from the first turn, so a crash that left a checkpoint also exits `3` and names the exact resume command (a crash before anything durable — or a failed pause save — still exits `1`). | ## The NDJSON stream (`--mode agent`) diff --git a/docs/kane-cli-configuration.mdx b/docs/kane-cli-configuration.mdx index 8a3287539..9b8e8e10e 100644 --- a/docs/kane-cli-configuration.mdx +++ b/docs/kane-cli-configuration.mdx @@ -70,6 +70,7 @@ Empty fields are shown as `(none)`. The `chrome` path is empty by default, in wh | `target` | `"desktop"` \| `"emulator"` \| `"simulator"` | `"desktop"` | Default run target. `desktop` runs the Chrome browser; `emulator` and `simulator` run against a virtual Android or iOS device (macOS Apple Silicon only). See [Mobile Target](#mobile-target). | `kane-cli config set-target ` | | `device` | string \| null | `null` | Default mobile device, by name, serial, `ip:port`, or udid. When empty, a TTY run prompts once and saves the choice; a non-interactive run needs `--device` or this key set. Ignored on the `desktop` target. | `kane-cli config set-device ` | | `app` | string \| null | `null` | Default app under test for mobile runs: a build path (`.apk` or `.zip`) or an uploaded app id. Ignored on the `desktop` target. | `kane-cli config set-app ` | +| `bug_detection` | `"off"` \| `"stop"` \| `"continue"` | `"off"` | Whether the agent flags suspected product bugs while authoring. See [Bug detection](#bug-detection). | `kane-cli config set-bug-detection `, or per-run `--bug-detection` | | `code_export.enabled` | boolean | `false` | Generate code export after upload completes. | TUI menu, or `--code-export` flag | | `code_export.language` | `"python"` \| `"javascript"` | `"python"` | Output language for generated code. Accepts `python` or `javascript`. | `--code-language ` | | `code_export.skip_validation` | boolean | `true` | Skip post-codegen worker-side validation. | TUI menu, or `--skip-code-validation` | @@ -90,13 +91,31 @@ The format is `WIDTHxHEIGHT` (lowercase `x` separator). Width must be between 80 In TUI mode, the same setting can be edited through an interactive window-size picker. +### Default start URL + +kane-cli needs a start URL for the first navigation of a run. It resolves one in this order, first match wins: + +1. The `--url ` flag on `kane-cli run` / `kane-cli testmd run`. +2. (test.md only) the `url:` key in the file's frontmatter. +3. The configured `default_url` — set with `config set-url`. + +```bash +kane-cli config set-url https://app.example.com +``` + +Bare domains are accepted and normalized — `config set-url example.com` stores `https://example.com`. The value is rejected without changing the saved config if it is not a valid URL. The built-in playground value (`https://kaneai-playground.lambdatest.io`) counts as "unset", so a fresh install behaves as if no default were configured. + +In TUI mode, set the same value with `/config set-url `, or pick **Default URL** from the interactive `/config` menu. + +If none of the three sources supplies a URL, kane-cli falls back to a site named in the objective itself (e.g. "Go to amazon.com and …"). When nothing provides a start URL at all, an interactive terminal asks you for one, while a non-interactive (CI) run fails — pass `--allow-missing-url` to a non-TTY run to proceed from the browser's current page instead. See [Run options](/docs/kane-cli-modes/#run-options). + ### Test Manager Project ```bash kane-cli config project ``` -In a TTY, this opens an interactive project picker. The picker fetches the projects available to your active profile, lets you search and arrow-key through them, and saves the chosen `project_id` and `project_name`. Login is required before the picker can fetch projects. +In a TTY, this opens an interactive project picker. The picker fetches the projects available to your active profile, lets you search and arrow-key through them, and saves the chosen `project_id` and `project_name`. Login is required before the picker can fetch projects. Either OAuth or basic-auth credentials are sufficient — you no longer have to also store a username/access-key pair to use the picker. You can also set a project ID directly without the picker: @@ -104,6 +123,10 @@ You can also set a project ID directly without the picker: kane-cli config project ``` +In a non-interactive shell (CI, pipes), pass an explicit ``. To discover the right ID first, use `kane-cli projects list` (see [Test Manager Integration](/docs/kane-cli-tms-integration/)). + +If you don't configure a project at all, kane-cli auto-resolves a sensible default when the first run starts — see "Auto-default on first run" in [Test Manager Integration](/docs/kane-cli-tms-integration/). + See [Test Manager Integration](/docs/kane-cli-tms-integration/) for how project selection feeds into uploads. ### Test Manager Folder @@ -112,7 +135,7 @@ See [Test Manager Integration](/docs/kane-cli-tms-integration/) for how project kane-cli config folder ``` -Opens an interactive folder picker for the currently selected project. Folders are searchable and shown with their hierarchy. You must have a project selected first. +Opens an interactive folder picker for the currently selected project. Folders are searchable and shown with their hierarchy. The picker writes both `folder_id` and `folder_name`. You must have a project selected first. OAuth and basic-auth profiles are both supported. To set a folder ID without the picker: @@ -120,8 +143,14 @@ To set a folder ID without the picker: kane-cli config folder ``` +For scripted discovery in non-TTY contexts, use `kane-cli folders list` — see [Test Manager Integration](/docs/kane-cli-tms-integration/). + See [Test Manager Integration](/docs/kane-cli-tms-integration/) for how folder selection feeds into uploads. +### Self-healing for stale IDs + +If a previously-configured project or folder later becomes unusable (deleted, renamed, you lost access, or you typed an invalid ID by accident), kane-cli detects the bad ID on the next run, clears it, and auto-resolves a new default instead of letting the run proceed with a dead value and silently failing the upload. To rebind explicitly, run `kane-cli config project` again (or `kane-cli projects list` followed by `kane-cli config project `). + ### Mode ```bash @@ -152,11 +181,27 @@ kane-cli config set-app ./builds/app-debug.apk A run reads these as its defaults. Override any of them for a single run with `--target`, `--device`, and `--app`. Setup and the full list of accepted app formats are in [Mobile Testing](/docs/kane-cli-mobile/). +### Bug detection + +```bash +kane-cli config set-bug-detection continue +``` + +`bug_detection` controls whether the agent watches for **product bugs** — not test failures — while it authors steps. When enabled, the agent can flag a suspicious behaviour mid-run (a broken flow, a wrong value, an error where none should be); the suspicion is investigated, and either rejected (the run continues, nothing fails) or confirmed as a product bug: + +- **`off`** (default) — no bug detection; behaviour is identical to previous releases. +- **`stop`** — a confirmed product bug fails the step and ends the run. +- **`continue`** — the confirmed bug is recorded (in the run result and the [evidence pack](/docs/kane-cli-evidence/)) and the run keeps going. + +This applies to **authoring** steps only. Replayed steps don't need it: a failed replay is always investigated automatically, regardless of this setting. + +Override the saved value for a single run with `--bug-detection ` on `kane-cli run`, `kane-cli testmd run`, or `kane-cli testrun run`. The setting appears in the TUI Config screen as **Bug Detection** and in `kane-cli config show` output. + ### Code Export The `code_export` block enables and configures generated code output produced after a successful Test Manager upload. There is no `kane-cli config` subcommand for this block. Set it from one of: -- **The TUI** — open the config menu, choose Code Export, and toggle the `enabled` and `skip_validation` switches. +- **The TUI** — open the config menu, choose Code Export, and toggle the `enabled` and `skip_validation` switches. The TUI writes the change back to `tui-config.json`. - **Per-run flags** on `kane-cli run`: - `--code-export` to enable for this run only - `--code-language ` to pick the output language (`python` or `javascript`) @@ -202,6 +247,19 @@ Headless mode is per-run; there is no persistent setting. It is the right choice The Chrome window dimensions for both headed and headless modes come from the `window_size` setting. See [Window Size](#window-size) above to update them. +### Chrome environment variables + +A handful of environment variables control how kane-cli locates and launches Chrome. They are read from the process environment, not from `tui-config.json`, so they are convenient for CI and one-off overrides. + +| Variable | Effect | +|----------|--------| +| `KANE_CLI_CHROME_PATH` | Absolute path to the Chrome binary. Use it when Chrome is installed somewhere kane-cli does not search by default. | +| `KANE_CLI_SKIP_BROWSER_DOWNLOAD` | Any truthy value (`1` / `true` / `yes`) bypasses the Chrome-availability startup check; kane-cli then uses whatever `chrome` resolves on `PATH`. Useful in air-gapped or pre-provisioned CI images. | +| `KANE_CLI_CDP_TIMEOUT_MS` | Per-attempt timeout, in milliseconds, for Chrome to become reachable over the DevTools Protocol. Default `30000`. Raise it on slow or cold CI runners. | +| `KANE_CLI_CDP_RETRIES` | Extra Chrome launch attempts after the first when CDP readiness fails. Default `2` (so up to three attempts total); set `0` for a single attempt. Each retry uses a short backoff. | + +The CDP timeout and retry settings only affect transient launch failures (Chrome started but did not become reachable in time) — a missing or invalid binary fails immediately without retrying. See [Chrome failed to launch](/docs/kane-cli-troubleshooting/#chrome-failed-to-launch) for the matching troubleshooting steps. + --- ## Resetting Settings diff --git a/docs/kane-cli-testmd.mdx b/docs/kane-cli-testmd.mdx index 96461d6af..4eebc723b 100644 --- a/docs/kane-cli-testmd.mdx +++ b/docs/kane-cli-testmd.mdx @@ -78,16 +78,23 @@ headless: true | Key | Scope | Description | |-----|-------|-------------| | `mode` | root | `testing` (default) or `action`. Testing mode pushes through auth walls for negative-test assertions. Action mode halts on auth walls. | +| `url` | root only | Start URL for the test's first step. Bare domains are normalized to `https://`. Overridden by the `--url` flag; falls back to the configured `default_url`. See [Default start URL](/docs/kane-cli-configuration/). | +| `tags` | root only | Labels for selecting tests in batch runs. Accepts a YAML list, a bracketed inline list (`tags: [smoke, checkout]`), or a bare comma string (`tags: smoke, checkout`). Tags are trimmed, lowercased, and de-duplicated. Shown by `kane-cli testmd list` and the interactive picker; selected with [`testrun --tags`](/docs/kane-cli-testrun/#selecting-tests); recorded in the run's [evidence pack](/docs/kane-cli-evidence/). | | `max_steps` | root + step | Max agent reasoning steps per step. Default: `30` | | `timeout` | root + step | Hard kill per step, in seconds | | `headless` | root | Run Chrome with no visible window | | `variables` | root + step | Variables with `{{name}}` syntax, same format as [Variables & Context](/docs/kane-cli-variables-and-context/) | +| `session_context` | root + per-step | Pre-loaded prior-run context for the agent. | | `code_export` | root + step | Generate Playwright code after the run | | `code_language` | root + step | `python` or `javascript` for code export | | `global_context` / `local_context` | root + step | Inline Markdown or file path for agent context | | `target` | root | Where the test runs: a browser transport (`chrome`, the default, `cdp`, or `ws`) or a mobile target (`emulator` or `simulator`, macOS Apple Silicon). See [Mobile Target](#mobile-target). | | `app` | root | Mobile only. The app under test: a build path (emulator `.apk`, simulator `.zip`) or an uploaded `APP…` id. Required with a mobile target, rejected with a browser target. | | `no_reset` | root | Mobile only. Keep the app's existing state between runs instead of resetting it. | +| `chrome_profile` | root only | Named Chrome profile under `~/.testmuai/kaneai/chrome-profiles/`. | +| `cdp_endpoint` | root only | Reuse an external Chrome over CDP. | +| `ws_endpoint` | root only | LambdaTest / Playwright WebSocket endpoint. | +| `on_lock_conflict` | root only | Policy when another user holds the lock on this test in Test Manager. See [Lock conflicts](/docs/kane-cli-testmd-running/#lock-conflicts). | ### Mobile Target @@ -111,6 +118,11 @@ The nested form, `target: {platform, app}`, is not accepted. The parser refuses Mobile tests run with `kane-cli testmd run`. A batch run does not support mobile members: a `_test.md` with a mobile target is rejected up front, before the suite runs. Setup is covered in [Mobile Testing](/docs/kane-cli-mobile/). +### Root-only vs root-or-per-step + +- **Root only** — Chrome settings (`target`, `chrome_profile`, `cdp_endpoint`, `ws_endpoint`, `headless`), the mobile keys (`app`, `no_reset`), `url`, `mode`, `tags`, and `on_lock_conflict`. These apply to the whole run; setting them on an individual step is a parse error. +- **Root or per-step** — everything else can appear in the per-step `yaml` block to override the frontmatter for that step only. + ### Title and Steps After the frontmatter, add a `# H1` title for the test. This is purely decorative. Kane CLI ignores everything before the first `## ` heading. @@ -132,6 +144,39 @@ Click submit and verify the confirmation banner. Setting `optional: true` tells Kane CLI that a failure on this step should not fail the overall test. The run continues to the next step. +### `optional` + +`optional: true` marks a step as soft-failing. If the step fails: + +- The overall run does **not** halt. +- Subsequent steps still execute. +- The step is reported as failed in `Result.md` with an `(optional)` suffix. + +Default is `false`, in which case any failure stops the run and marks the remaining steps as skipped. + +`optional` is allowed on every prose step. On an `@import` step it is allowed only at the top level of a test file — see [Composing tests with @import](/docs/kane-cli-testmd-composition/#optional-imports). + +### Step body shapes + +The body of a step (everything after the optional `yaml` block) must be exactly one of: + +- **A prose objective** — one or more lines of natural language describing what the agent should do. A step body follows the same rules as any objective, so end it in a check of the result and phrase actions as goals — see [Writing objectives](/docs/kane-cli-modes/). +- **An `@import`** — a single line of the form `@import ` and nothing else. + +Mixing prose and `@import` in the same body is a parse error. + +```markdown +## OK — prose +Click the cart icon and verify two items are listed. + +## OK — import +@import ./helpers/login.md + +## NOT OK — both +Click the cart icon. +@import ./helpers/login.md +``` + --- ## Replay and Cascade Rule @@ -187,6 +232,75 @@ Extract repeating flows (login, setup, cookie banner dismissal) into helper file Editing a helper re-authors that step in **every test that imports it**, plus everything after the import in those tests. The same cascade rule applies. +Full detail: [Composing tests with @import](/docs/kane-cli-testmd-composition/). + +--- + +## Variables + +Variables let you parameterise objectives with reusable values and secrets. Reference a variable inside any prose objective using its placeholder syntax (default `{{name}}`): + +```markdown +## Sign in +Open the login page and sign in as {{tester_email}} with password {{tester_password}}. +``` + +### Defining variables in a test.md + +Variables can be set in three places inside a `_test.md` file, in order of increasing specificity: + +````markdown +--- +variables: + tester_email: + value: "alice@example.com" + tester_password: + value: "s3cret-pa55" + secret: true +--- + +## Switch to the staging tenant +```yaml +variables: + tenant: "staging-eu" +``` +Open https://{{tenant}}.example.com and verify the login page loads. +```` + +Shorthand `name: "value"` works too — `tester_email: "alice@example.com"` is equivalent to `tester_email: { value: "alice@example.com" }`. + +| Field | Required | Type | Default | Description | +|---|---|---|---|---| +| `value` | yes | string | — | The variable's value. Entries without `value` are rejected. | +| `secret` | no | boolean | `false` | When `true`, the value is masked in logs and routed to the secrets store. | +| `syntax` | no | string | `{{}}` | Custom placeholder syntax. | + +### Secrets + +Secrets are variables with `secret: true`. They are masked in displayed output, redacted in `Result.md`, and routed to TestmuAI's secrets store instead of being synced as plain Test Manager variables. + +```yaml +variables: + api_key: + value: "sk-live-abc123" + secret: true +``` + +--- + +## Context + +Context files are plain Markdown text that the agent reads alongside your objective. Use them for standing instructions — coding conventions, accounts to use, sites to avoid. + +```yaml +--- +global_context: "~/work/team-conventions.md" +local_context: ".testmuai/project-notes.md" +--- +``` + +You can pass either a file path (resolved at runtime) or inline Markdown text. See [Variables and context](/docs/kane-cli-variables-and-context/#context-files) for the full discovery rules. + --- ## Recording a Test from a Live Session @@ -199,6 +313,8 @@ kane-cli run "Search for noise-cancelling headphones on amazon.com" --name amazo On exit, Kane CLI writes the test file to `.testmuai/tests/amazon-search_test.md`. Move that file into your repo and re-run it with `testmd run`. +The recorded file is a regular `_test.md` — it is parsed and executed exactly like a hand-written one, and you can edit it freely. + Without `--name`, ad-hoc runs are ephemeral and nothing is written to disk. @@ -215,6 +331,8 @@ Without `--name`, ad-hoc runs are ephemeral and nothing is written to disk. | `kane-cli testmd export ` | Regenerate code export from existing recordings (no browser launch) | | `kane-cli testmd delete ` | Delete the test and its `output-/` cache locally. Does NOT delete from Test Manager | +Full detail: [Running test.md files](/docs/kane-cli-testmd-running/). + --- ## Flags for `testmd run` diff --git a/docs/kane-cli-testrun.mdx b/docs/kane-cli-testrun.mdx new file mode 100644 index 000000000..bfe764825 --- /dev/null +++ b/docs/kane-cli-testrun.mdx @@ -0,0 +1,133 @@ +--- +title: "Batch runs with testrun" +sidebarTitle: "Batch Runs (testrun)" +description: "Run many authored _test.md files as one execution with kane-cli testrun run: tag and regex selection, parallel workers, preflight, dry runs, exit codes and a single sealed evidence pack." +keywords: ['kane cli testrun', 'batch test run', 'parallel', 'tags', 'evidence pack', 'testmu ai'] +"og:description": "Run many authored _test.md files as one execution with kane-cli testrun run: tag and regex selection, parallel workers, preflight, dry runs, exit codes and a single sealed evidence pack." +--- + +import AgentSkillCallout from "/snippets/AgentSkillCallout.mdx"; + +--- + + + +`kane-cli testrun run` executes many authored `_test.md` files as **one execution** — one summary, one exit code, and one sealed [evidence pack](/docs/kane-cli-evidence/) for the whole suite. + +```bash +kane-cli testrun run # every *_test.md under the cwd +kane-cli testrun run tests/checkout_test.md tests/login_test.md # explicit paths +kane-cli testrun run --tags smoke --parallel 4 # select by tags, 4 workers +``` + +Use `testrun` when you have a suite of committed tests to run together — nightly regression, pre-merge smoke, release gates. For a single test, `kane-cli testmd run` is all you need. + +## Selecting tests + +Members come either from explicit paths (each must end in `_test.md`) or, when no paths are given, from a recursive walk of the current directory. Two filters then apply, in order: + +- **`--match `** — keep tests whose project-relative path matches the regex. +- **`--tags `** — keep tests whose [`tags:` frontmatter](/docs/kane-cli-testmd/#yaml-frontmatter) matches **any** of the given tags (case-insensitive). Repeat the flag or pass a comma-separated list; `--tags smoke,checkout` and `--tags smoke --tags checkout` are equivalent. + +Duplicates are removed and the final list runs in a stable order. + +```bash +kane-cli testrun run --match 'tests/e2e/.*' --tags smoke +``` + +## Preflight + +Before anything runs, every member is checked: + +- *(0.8.4)* **It need not be authored** — a member with no recording classifies as an **author** member: the agent authors it during the run, and afterwards the authored and replayed evidence consolidates into one published execution (best-effort — when consolidation can't complete, the evidence stays split rather than lost). Before 0.8.4, unauthored members failed preflight (`missing_meta` / `not_authored`). +- **All members must belong to one org and one project** — a testrun is one execution in Test Manager, so it can't span projects. + +A member can fail preflight for these reasons: + +| Reason | Meaning | Fix | +|---|---|---| +| `org_mismatch` | Belongs to a different organisation than the rest | Check with `kane-cli testmd status ` | +| `project_mismatch` | Belongs to a different project than the rest | Check with `kane-cli testmd status `; run project-by-project | + +If any member fails preflight, the plan is invalid and **nothing runs** (exit `2`). The offenders print to stderr: + +``` +error: plan invalid — 2 offending test(s): + tests/other_org_test.md: org_mismatch + tests/other_project_test.md: project_mismatch +``` + +> **Mobile is not supported in a batch run.** A `_test.md` with a mobile [`target:`](/docs/kane-cli-testmd/#mobile-target) (`emulator` / `simulator`) is rejected up front, before the suite runs. Run mobile tests one at a time with `kane-cli testmd run `. + +## Running + +| Flag | Description | Default | +|---|---|---| +| `--match ` | Filter candidates by project-relative path regex | — | +| `--tags ` | ANY-match on frontmatter tags (repeatable or comma-separated) | — | +| `--parallel ` | Worker count | `1` | +| `--on-failure ` | `continue` \| `fail-fast` | `continue` | +| `--name