MCP & CLI

One engine, two front doors. The jevitate CLI is for people and scripts; the MCP server is a convenience for agents that could run the CLI anyway. Every CLI command is reachable over MCP and every MCP tool from the CLI, except a short list kept human-only on purpose.

The CLI

Without --json, a command prints a short human summary: the verdict, key counts, each finding with its fingerprint, where the result is, and a next: line. With --json, stdout is exactly one line: the {v, ok, data} envelope, or {v, ok: false, error: {code, message}}. The exit code is the same either way (exit codes).

CommandWhat it does
initset up: API keys, agent skills, MCP registration, the repo's .jevitate/; --uninstall removes what it installed, --claude-md adds a CLAUDE.md pointer block, --codeowners <@team> writes a CODEOWNERS block for the approval files
explorea bounded mission: goal (default), --strategy coverage | exploratory | adversarial | usability, or --feature <name>; --from-journey starts it inside a promoted Journey
explore-author-journeyexplore toward a goal and author an unpromoted Journey from the verified path
record / recordingrecord a flow by demonstration; diff, postdoc, fit and promote values in takes
journeylist, find, lint (--fix), verify --mutate, review (--stale, --full), migrate --step-ids|--labels, anchor add|remove, anchors (--suggest), promote (--reviewed-hash, --accept-unvetted, --accept-findings, --proposal, --reject-proposal), run, annotate, demo and publish Journeys; list a Journey's anchors
sweepmany explore missions from one targets file (.tsv or .json): concurrency, --resume, one cross-target deduped sweep.result.json
loginsign a persona in from credentials in named environment variables and save its storage state (CLI only)
persona / jobreview and approve catalog personas and job stories (review is also over MCP; approve is CLI only); job draft-outcomes <jobId> [--count 1-3] drafts desired outcomes
catalogcatalog status (jobs x personas coverage, stale approvals; --require-approvals, --allow-channels), catalog analyze (conflicts, duplicates, gaps) and catalog export --format journeeze-bundle --out <dir> (--check, --product-name)
connect / publishconnect journeeze (CLI only) saves a reference to the Journeeze upload key; publish journeeze [--dry-run] uploads the catalog bundle (JOURNEEZE_UPLOAD_KEY in CI)
locator-healthper step, the locator rung and whether it meets the test-id convention, with a fix for the app (--journey, --run, --baseline)
campaigncampaign run: many journey-anchored missions, one deduped report; preflights first (--skip-preflight)
demodemo one aspect from a sentence (a DRAFT), then demo approve
verify-fixreplay a finding in fresh sessions: fixed only if absent on every replay; --allow / --env replay under a corrected allow list
regressioncapture a failure as a committed regression; run it
ledgerkeep a finding's repro by fingerprint, so it can be re-checked long after its run
checkthe CI gate: a suite within a budget; JUnit, SARIF, JSON and a report; --require-approvals fails missing, stale or non-tty approvals (--allow-channels pr-review re-verifies pull-request approvals); --max-brittle-steps gates on locator health
report / diff / baselineone deduped defect list; new / resolved / flaky between runs; named baselines
invariantsvalidate declared-invariant files
uxoffline usability review of a saved Recording
loadrun a promoted Journey as a load test
missionmission targets; queue, drain and read queued missions
inboxthe human-in-the-loop inbox, as the MCP tools see it
sourcedistributed Journey sources (git), behind a trust and terms-of-use gate
siteper-site policies for Journey runs: pacing, throttles, budgets, quiet hours; site policy rules lists every safety rule and whether it can be waived
profileisolated credential/data sets
aicheck (live, with each provider), configure or replace the model gateway keys
doctorresource governance on this machine: host load, browser slots, orphaned browsers (--cleanup closes them)
logsprune run output under .jevitate/logs; logs triage re-triages a finished run (CLI only)
mcpthe allowlisted MCP stdio server
uithe local approval dashboard (loopback only)

Every flag of every command is in the generated reference, docs/cli.md, or jevitate <command> --help.

Set up an agent: jevitate init

jevitate init                               # keys, skills, MCP registration, .jevitate/
jevitate init --dry-run                     # show what it would install or register; write nothing
jevitate init --uninstall                   # remove the skill files and marked blocks init installed (--force for edited ones)
jevitate init --claude-md                   # also keep a pointer block in the project's CLAUDE.md
jevitate init --codeowners "@acme/qa"       # a marked CODEOWNERS block for the approval files
jevitate init --skip-keys                   # also: --skip-skills, --skip-mcp, --skip-project
jevitate init --replace-keys                # prompt for new keys even when some are stored
jevitate ai status                          # each key, its provider and source, checked live (exit 2 if bad)
jevitate ai status --no-verify              # offline / CI: presence and source only
jevitate init --targets claude-code,codex,cursor
jevitate mcp --print-config claude          # or cursor | codex | json: print the snippet only

init installs skills into every agent runtime it detects, registers the MCP server, and creates the repo's .jevitate/. A file or entry you edited is never overwritten without --force; on a conflict, init prints the snippet instead. Run without a terminal, it never prompts for keys: it reports which are missing and still exits 0.

Keys are checked with their provider by one live, non-billable auth call: valid, invalid, unreachable or missing, plus a flag for a key that looks like another provider's. ai status exits 2 when a key is invalid or could not be checked, and ai setup never stores a key that fails the check. Runs that use the live AI check once at startup and stop with E_AI_SETUP_REQUIRED (exit 64) on a rejected key. Offline or in CI, pass --no-verify to ai status, ai setup or init, and set JEVITATE_NO_KEY_VERIFY=1 for runs. A key value is never printed, logged or sent to a model. Judgment (Jev) runs on either TYPESAFE_API_KEY or OPENROUTER_API_KEY (0.8.0); with both, the TypeSafe key wins, and --jev-provider typesafe|openrouter (MCP jevProvider, env JEVITATE_JEV_PROVIDER, the flag winning over the env var) pins one. ai status shows the route, key and model, for example judgment: ready via OpenRouter (model ~typesafe/jev-latest; no TypeSafe key set).

RuntimeDetected bySkills go toMCP registered in
Claude Code~/.claude exists~/.claude/skills/the project's .mcp.json
Codex~/.codex existsa managed block in ~/.codex/AGENTS.md~/.codex/config.toml
Cursor.cursor/ in the current directory.cursor/rules/.cursor/mcp.json
any other agentalways.agent/skills/ plus a managed block in ./AGENTS.mdjevitate mcp --print-config json

The skills: jevitate-getting-started (the entry point), jevitate-explore (run a bounded mission), jevitate-mission-scope (read a diff and decide what to test), jevitate-run-journey, jevitate-record, jevitate-demo, jevitate-verify-fix, jevitate-ci-check, jevitate-test-campaign (plan and run a whole-release test campaign), jevitate-ux-review, jevitate-load-test and jevitate-sources. A prompt to paste for each runtime is on the homepage.

The MCP server: jevitate mcp

A stdio server that exposes an allowlist of domain tools and nothing else. The served tool list is checked against the allowlist in @jevitate/mcp-facade, and a parity test fails the build when a CLI command or flag has no MCP decision.

ToolWhat it doesFrom the CLI
find_capabilities, list_journeys search promoted Journeys; list every Journey journey find, journey list
run_journey run a promoted Journey: params, storageState, env/baseUrl, headed/slowMo, recordVideo, screenshots, viewport/device, fixtures, selfHeal with changes/changeNote and heal budgets journey run
annotate_journey draft each step's objective and expected result; approve: true applies the reviewed draft journey annotate (--approve)
demo_journey replay a Journey as a narrated demo: video (.webm + .vtt) and/or guide (.md) journey demo
promote_journey, publish_journey promote a local Journey (refused when its assertions can't prove its outcome; only the CLI's --accept-weak waives that; reviewedHash binds it to the reviewed sheet, and an MCP promotion is recorded as an agent approval; proposal / rejectProposal + reason accept or reject a pending self-heal revision); publish one to a source journey promote, journey publish
review_journey, review_persona, review_job the read-only review sheet for a Journey, persona or job (readiness: true, real: true add the readiness layers); review_journey with stale: true and no id lists the Journeys whose approval is stale; strict: true (0.14.0) fails on any attention item journey review (--stale), persona review, job review
draft_job_outcomes draft 1-3 desired outcomes for a catalog job (jobId, count; real or fakeAi) marked provenance ai_draft; never approves job draft-outcomes
export_catalog_bundle write the catalog as a Journeeze catalog bundle (format, out inside the project, check, productName); never uploads catalog export --format journeeze-bundle
publish_to_journeeze export the bundle and upload it to the connected Journeeze product (dryRun, productName); takes and returns no key publish journeeze
locator_health read-only, advisory: per step, the locator rung and whether it meets the test-id convention, with a fix for the app (journey, run, baseline) locator-health
catalog_status, analyze_catalog jobs x personas coverage, stale approvals and how each approval was made; catalog analysis (real: true adds Jev classification); catalog_status takes strict (0.14.0) catalog status (--strict), catalog analyze
catalog_draft, journey_link 0.14.0: add a DRAFT persona or job (never approved); set or clear a Journey's catalog links (job, persona, unlinkJob, unlinkPersona; an unknown id is refused) catalog draft, journey link
journey_anchor_add, journey_anchor_remove add or remove a named anchor on a Journey (journeyId, name, step; add also description, probe); the step id is written at once; on a promoted Journey the approval goes stale and the result carries needsReapproval and reapproveCommand (0.13.0) journey anchor add, journey anchor remove
lint_journey the assertions that can't prove a Journey's outcome; fix: true stamps the step id of number-only anchors (on a promoted Journey the approval goes stale, 0.13.0) journey lint (--fix)
verify_journey prove each assertion can fail: replay with a write step skipped, its write aborted, or a typed value emptied; 0.16.0: a non-secret param swapped or truncated (swap-param, truncate-param); 0.17.0 to 0.19.0: guard-param and, in 0.19.0, targeted proof with a control replay; 0.20.0: declared metadata.targetedProofs plans and suggestedTargetedProofs journey verify --mutate
create_demo, approve_demo a DRAFT demo of one aspect on a named, non-production environment; approve it demo "<aspect>" / demo create, demo approve
author_journey explore toward a goal and author an unpromoted Journey; success is an array of check strings; takes the goal-run arguments of explore-author-journey except the operator-only secret ones explore-author-journey
queue_exploration, run_queued_missions, get_mission_result queue a bounded mission against a promoted target, drain the queue, read its typed result mission queue, mission run, mission result
run_exploration run explore directly, every strategy, within its budget; fromJourney + atStep start it inside a promoted Journey; 0.8.0 adds tags, jevProvider, allowControl, minEffort and authCheck explore
run_sweep many explore missions from a targets file: targets, concurrency, resume, out, stopOnEnvFailure, baseUrl/env, tags, fixture (0.13.0), the forwarded safety and media flags including allowControl, real/fakeAi/jevProvider; the targets and out paths are confined, log sources stay operator-only sweep
verify_fix re-check a finding: env (replay under a named environment's current allow list; allow is refused, CLI only), replays, recordVideo (before/after), screenshots, storageState, viewport/device, invariants, fixtures verify-fix
run_check, get_report, diff_runs, baselines the CI gate (maxBrittleSteps is the opt-in locator-health gate); the deduped report; a run diff; named baselines check, report, diff, baseline
ledger, regressions the repro ledger; committed regressions (capture/run) ledger, regression
mission_targets targets missions may run against (add/list/update/promote) mission target
chain_journeys, journey_readiness, journey_bundle 0.17.0 to 0.19.0: chain a discover Journey and a prepare-only reply Journey over approved requests (params are the discover Journey's producer params); one readiness receipt for a Journey or linked pair; a local review bundle. None approves or promotes anything journey chain, journey readiness, journey bundle
journey_anchors, run_campaign a Journey's named anchors (suggest: true proposes some, advisory); a campaign of journey-anchored missions with one deduped report (allowDestructive, allowWrites, deny, paid, invariants, recordVideo, screenshots, evidenceVideo, skipPreflight) journey anchors, campaign run
run_load_test, ux_review, validate_invariants a load test; an offline UX review; invariant file validation load run, ux, invariants validate
recordings, sources, site_policy, profiles, prune_logs, get_ai_status Recording tools (0.16.0: the propose action drafts an unpromoted binding Journey from two or more takes; diff and postdoc return value hints and redacted constants, never typed text); Journey sources; site policies; profiles; log retention; which keys are configured, their source and a live validity check (never a value) recording (incl. recording propose), source, site policy / site simulate, profile, logs prune, ai status
queue_retrieval, queue_action, get_command ask a person for input or a decision; poll the item (burn-after-read) inbox queue-retrieval, inbox queue-action, inbox command
approve_action, cancel_command human-only: always refused over MCP inbox approve / inbox cancel refuse the same way; use jevitate ui
list_incoming, get_thread, get_site_health pending items; an item's redacted thread; health and build identity inbox list, inbox show, inbox health
ai_generate_text model-assisted text, gated on configured keys ai generate

Not reachable over MCP, on purpose

CLI commandWhy
mcpthe MCP server itself
uithe local human dashboard, where a person approves or cancels inbox items
initlocal machine setup: harness config, skills, interactive key entry
ai setupinteractive secret entry: a key never passes through a model
loginmints a persona session from credentials in the operator's environment; a model never sees or drives it (the pre-flight authCheck and a persona's refresh are available over MCP)
connect journeeze (connect_journeeze is forbidden)it handles the Journeeze upload key: a person names where it is kept or types it hidden, and only a reference is saved. A key never passes through a model or an MCP argument
journey migratea one-time rewrite of the repo's Journeys (--step-ids mints stable step ids, which changes every promoted Journey's hash) that the operator runs once and commits
persona approve, job approveapproving catalog items is a person's decision: it needs an interactive terminal and a typed confirmation, and --accept-findings is a CLI flag only
recorda person clicks through the app while it records (author_journey is the agent's way)
source trust (and source add --accept-tou)trusting a third-party Journey or accepting Terms of Use is a person's decision
doctorhost maintenance for the operator (it signals processes on this machine); the same orphan sweep runs before every browser-driving tool, and results report it in hostHealth.resources

How the tools behave

  • A tool that mirrors a command takes typed, closed arguments named after its flags (--storage-state → storageState), runs that command in process, and returns {exitCode, data}: the command's own envelope data and exit code.
  • Exit 0, 1, 3, 4 and 5 are answers (1 = defects found or still reproduces; 5 = a self-heal revision is pending review, never a pass — run_journey returns it as exitCode: 5). Exit 2 (proved nothing) and every refusal come back as MCP errors, never a pass: {error: "invalid_args" | "refused", code, message, exitCode}.
  • Every path argument must resolve inside the project the server runs in or ~/.jevitate/. Operator-only settings are never MCP arguments: shell hooks, the browser binary and switches, which environment variable a secret is read from, server-log sources, and store directories. Set those in ~/.jevitate/targets.json or on the CLI.
  • A run on one Journey, finding or suite returns when it is done. Open-ended exploration of a promoted target is queue and poll: queue_exploration → run_queued_missions (or jevitate mission run) → get_mission_result.
  • Tools that launch a browser take an extension array of unpacked extension directories and the resource limits maxBrowsers and maxBrowserMemory; --ignore-host-load stays the operator's call.

geolocation, replyQuietMs and successWhen (including each) are MCP arguments where the CLI flag applies.

Mid-run secret commands are operator-only

A cmd: secret source and --allow-secret-cmd run a command on this machine, so they are never an MCP argument or a suite option. Set them on the CLI.

Signal triage is operator-only

jevitate logs triage and --log-triage have no MCP tool or argument. Sending log text to the judgment model is the operator's decision, so a request never turns it on. The operator opts a target in with "logTriage": true in ~/.jevitate/targets.json (queued and MCP runs) or on a check suite item or target. MCP callers then get relatedLogs on each defect in every result and in get_report. run_campaign takes the safety and media options; log sources, hooks and triage stay on the CLI.

Explicitly forbidden. browser_click, browser_fill, page_evaluate, run_selector, navigate_url, get_dom, get_cookies, approve_persona, approve_job and connect_journeeze are never served. An agent asks for a mission or a Journey; it never drives the page.

Sweeps, tags and persona sessions (0.8.0)

jevitate sweep --targets <file.tsv|file.json> runs many explore missions with --concurrency, --resume, --stop-on-env-failure and --out; MCP run_sweep mirrors it. --tag key=value stamps a run, and MCP run tools take a tags object. jevitate login mints a persona session and is CLI-only: it reads the operator's credential environment variables, so no MCP tool exists for it. See Sweeps & Personas.

0.9.0: heal proposals, pinned browser

journey run and check take --self-heal with --changes / --change-note and the --heal-max-* budgets, and a heal exits 5 (healed-pending-review). journey promote <id> --proposal <pid> accepts a proposal and --reject-proposal <pid> --reason rejects it (over MCP: promote_journey with proposal or rejectProposal + reason). jevitate install-browser installs the Chromium revision jevitate pins into the shared browsers directory without removing other revisions; jevitate browser-path prints it (--json, --export); jevitate doctor reports a missing pinned browser. jevitate sweep adds --no-host-starved-retry, and jevitate login --api is CLI-only.

0.10.0: Journeeze, outcomes, step ids, locator health

Four MCP tools are new: export_catalog_bundle, publish_to_journeeze, draft_job_outcomes and locator_health. review_journey takes stale, and run_check takes maxBrittleSteps. connect_journeeze is on the forbidden list: entering an upload key is a person's act at a terminal (jevitate connect journeeze), and no key ever passes through a model or an MCP argument. publish_to_journeeze takes none; jevitate resolves the key itself (its secret store, or JOURNEEZE_UPLOAD_KEY in CI) and never returns it. export_catalog_bundle writes only inside the project. The pr-review approval channel is never one a caller can set: no MCP argument grants it. Node 22 or later is required. See Catalog & Sign-off and locator health.

0.11.0: anchors, preflight, slow steps

Two MCP tools are new: journey_anchor_add and journey_anchor_remove. New arguments: lint_journey fix, journey_anchors suggest, run_journey stepResponseTimeoutMs, run_campaign skipPreflight, publish_to_journeeze productName and verify_fix env. verify_fix refuses allow: an MCP caller never names origins, so verify-fix --allow stays CLI only. An adversarial run's transcript reads a finding a blocked write caused as an environment fault. See anchors, campaign preflight, slow steps and verify-fix.

0.12.0: review sheet and step labels

No MCP tool is new. review_journey returns the same JSON sheet with additive fields (attention, per-step checks, file, anchors and locator, summary.intent, proof.endStateText). journey review --full and journey promote --full are CLI only, and so is journey migrate --labels (a repo rewrite that replays the app and that the operator runs and commits). Upload fixtures outside the project, or sensitive ones, are refused over MCP as on the CLI. See the review sheet, step labels and upload fixtures.

0.13.0: anchors on promoted Journeys, sweep fixtures

No MCP tool is new. journey_anchor_add, journey_anchor_remove and lint_journey with fix now work on a promoted Journey; the add and remove results carry needsReapproval and reapproveCommand, and the re-approval stays a person's step. run_sweep takes fixture (the sweep-wide upload fixture, confined like every upload fixture). The sweep browser launch flags (--browser-arg, --browser-executable, --browser-channel, --extension, --max-browsers, --max-browser-memory, --ignore-host-load) are CLI only, the operator's setting, as on every browser-driving command. See anchors on a promoted Journey and sweeps.

0.14.0: scope regions, navigation guard, promotion-ready

Two MCP tools are new: catalog_draft and journey_link. New arguments: run_exploration.scopeRegion (a list of descriptors; adversarial, coverage and exploratory only), run_exploration.blockOffAllowlistNavigation (mission sessions only), journey_anchor_add.region, review_journey.strict and catalog_status.strict. A suite item takes scopeRegion and blockOffAllowlistNavigation. See scope regions, the navigation guard and promotion-ready.

0.15.0: http checks, allowed origins, recorded fixtures

No MCP tool is new. author_journey takes fixtures and fixtureIdentity (recorded on the Journey as metadata.fixtures) and maps allowWrites; like run_exploration it omits the backend-log flags. http: checks work in MCP success strings. run_journey and verify_journey take no allow argument: they use the Journey's recorded metadata.allowedOrigins (the CLI's journey run|verify --allow adds more), and they reuse the recorded fixtures with no argument. See split-origin apps, http checks and recorded fixtures.

Queue missions from the CLI

mission queue, mission run and mission result use the same queue as MCP (~/.jevitate/missions/), so what one queues the other sees.

# register a target: UNPROMOTED, so nothing can be queued against it yet
jevitate mission target add spa --name "App" \
  --authorized-origin http://127.0.0.1:5193 --api-origin http://127.0.0.1:18582 \
  --base-url http://127.0.0.1:5193/settings
jevitate mission target promote spa          # a human act: only promoted targets are queueable

jevitate mission queue spa --strategy coverage --route '/settings/**'   # what queue_exploration does
jevitate mission run --once --real           # drain what is queued now (--watch keeps polling)
jevitate mission result <missionId>          # what get_mission_result reports; exits with its code
  • Queueable strategies: goal-based (a goal and a success check), coverage, exploratory, adversarial and feature. Usability is not queueable; run it directly.
  • A mission reaches only its target's --authorized-origin plus its --api-origins, and the target is re-checked (promoted only) when the mission runs.
  • A queued mission may ask for media next to its result (--record-video, --evidence-video, --screenshots) and a --persona name from ~/.jevitate/targets.json; never a path. Queued missions stay headless.
  • Without --real or --fake-ai, model-driven missions stay queued (reported as skipped) and only feature missions run.
  • mission result exits with the result's own code (0 clean · 1 defects · 2 broken run · 3 hang · 4 intermittent); a mission still queued or running exits 2.

The inbox, from the CLI and in jevitate ui

When an agent needs a person (an approval, a value or a review) it queues an inbox item. The inbox commands call the same handlers the MCP server does, over ~/.jevitate/inbox:

jevitate inbox list                  # pending items (list_incoming)
jevitate inbox show <id>             # an item's redacted thread (get_thread)
jevitate inbox command <id>          # poll it as the agent does (get_command)
jevitate inbox command <id> --reveal # consume the human's unread input and print it
jevitate inbox health                # pending count, oldest age, build (get_site_health)
jevitate ui                          # where a person approves, rejects or answers
  • inbox command keeps get_command's burn-after-read rule: if a person handed back input that hasn't been read, it refuses (E_INBOX_INPUT_PENDING, exit 64) and consumes nothing; --reveal consumes it and prints it.
  • Approving or cancelling stays human-only: inbox approve / inbox cancel (and MCP approve_action / cancel_command) always refuse.
  • jevitate ui is a local, single-user dashboard on http://127.0.0.1:4180 (--port to change it). It binds to loopback only and mints a per-session capability token, so a stray browser tab can't drive approvals.

Record by demonstration

jevitate record opens a headed browser on an authorized origin, lets you drive the flow, and captures it into a Recording. The authorized-target guard runs before any browser opens. Press Enter (or Ctrl+C) to end the take; it is saved either way.

jevitate record \
  --url http://localhost:3000 \
  --intent "Check out with a saved card" \
  --retro "The confirm button moved below the fold" \
  --allow http://localhost:3000 --allow https://checkout.stripe.com
  • --url <url>: the start URL (must be an authorized origin).
  • --intent <text> / --retro <text>: your framing and an optional retrospective, carried into the Recording.
  • --allow <origin>: authorized origins (repeatable). It replaces the default (the URL's own origin), so include that too.
  • --headless: run headless. The default is headed, since a record session is a live demonstration.
  • --out <dir>: where the Recording goes (default .jevitate/logs/<date> in the project).

A recorded take is one step short of a Journey. See Journeys.

Distributed sources

A source is a git repo of shared Journeys. Adding one clones it and pins its HEAD; it never trusts anything implicitly. Trust and Terms-of-Use acceptance are separate, explicit acts, and the pin only advances on update.

# register a remote source (clone + pin its HEAD). --accept-tou
# acknowledges its declared Terms of Use so its Journeys can run
jevitate source add acme https://github.com/acme/jevitate-journeys.git --accept-tou

jevitate source list                 # registered sources + which Journeys you trust
jevitate source pull acme            # fetch new refs, never advances the pin
jevitate source update acme          # the only command that advances the pin
jevitate source trust acme checkout  # trust one Journey, bound to its content hash
jevitate source run acme checkout    # run a trusted remote Journey through the run-gate
jevitate source remove acme          # drop the clone + lock entry

Publishing a Journey to a source

jevitate journey publish shares a promoted Journey into a registered source, always on a new publish/<id> branch. It opens a PR via gh when available, or prints push instructions.

# --to is required. The Journey must be promoted first
jevitate journey publish checkout --to acme

# declare the origins it is authorized for (default: derived from its
# navigate steps) and optionally publish under a different id
jevitate journey publish checkout --to acme \
  --declare-origin https://acme.test \
  --as acme-checkout

Publishing fails closed on an unregistered source, an unpromoted Journey, a Journey that declares no origins, a materialized (non-redacted) secret value, or an origin the steps touch but the declarations don't cover.

Usability review

Findings on whether a user got the job done and where the experience got in the way. Each one is a claim code verified (a guard probe, a conflict with your product facts, or friction the run hit); Jev only categorizes and grades. Advisory: a finding never sets a non-zero exit.

# offline: review a saved Recording. --app-class calibrates the rubric
jevitate ux ./checkout.recording.json --app-class consumer --real

# optional persona + the job the flow pursues, for sharper relevance
jevitate ux ./checkout.recording.json --app-class admin \
  --persona "first-time buyer" --job "check out with a saved card" --real

# live: run usability as an exploration strategy (needs --goal + --app-class);
# --probe-guards opts in to the fail-safe destructive-control probe (prefer staging)
jevitate explore --url http://localhost:3000 \
  --strategy usability --goal "check out" --app-class consumer \
  --product .jevitate/product.json --probe-guards --real
  • --app-class is required on both paths (e.g. consumer, admin, internal).
  • ux --persona <text> is a usability persona for calibration. It is not explore --persona, which runs a mission once per signed-in session.
  • On the live path, --success checks decide whether the job was done, as on a goal run.
  • --product <file> (default .jevitate/product.json) lists plans, prices, trials and each page's intended next step; --polish rewrites recommendations with one generation call.

See Usability Review and Report Schema.