Skip to content

Reference

Troubleshooting

Every receipt that is not a pass carries failure.code, failure.detail and a next_action. Start with next_action; it names the exact step for that run. The report at ~/.qaren/runs/<run-id>/report.md shows each walked line.

Refusals exit 4 and mean the run could not start or could not decide; failures exit 1.

CodeWhat happenedWhat to do
PLAN_UNPARSEABLEA plan line has no step or check the grammar knowsFix each listed line; see Write a plan
PLAN_INPUT_MISSINGA runtime input is unset or empty, or a PR login block names an undeclared oneSet each listed QAREN_INPUT_<NAME>; see Runtime inputs
JEV_UNREACHABLEThe plan needs Jev and the readiness probe did not succeedSet a valid TYPESAFE_API_KEY, or quote every target and ✓ line
JEV_AUTH_FAILEDJev rejected the keyCheck TYPESAFE_API_KEY
SCENARIO_UNREADABLE.qaren/config.yaml cannot be readCreate it with at least appId
SCENARIO_INVALIDThe configuration does not parse or fails validationFix the key a validation detail names; see Configuration
DEV_CLIENT_SCHEME_REQUIREDdevClientScheme is missing or malformedSet it to the app’s registered URI scheme
NODE_UNSUPPORTEDNode is older than 24Point nodePath at Node 24 or newer
DISK_BUDGET_EXCEEDEDUnder 1 GiB free for ~/.qaren/runs or the app, or under about 10 GiB for a clean iOS buildFree space on the volume failure.detail names, then re-run

For FRESH_INSTALL_ADMISSION_UNKNOWN or a strict-admission DEVICE_BUSY, read the probe diagnostics in failure.detail; see the authoritative fresh-install contract and iOS admission diagnostics.

CodeWhat happenedWhat to do
DEVICE_UNAVAILABLENo booted simulator, more than one, or the named one is not bootedBoot the simulator to walk on, or shut down the ones you are not testing on
DEVICE_UNAVAILABLEOn Android: no adb server answering, a version mismatch, or not exactly one booted emulatorStart the emulator, or pass --device emulator-NNNN
DEVICE_BUSYAnother run holds the device’s leaseWait for that run to finish, or clean it up with qaren cleanup <its-run-id>; a live holder is never stolen
ARTIFACT_INSTALL_FAILEDThe cached dev-client verification or installation failedFollow next_action; see the cached-install recovery contract
APP_EXITED_AT_LAUNCHThe launched app exited before it became ready; on iOS the detail cites the simulator crash reportFollow next_action, which for a missing app-embedded framework is a CocoaPods reinstall; see the launch readiness contract
CodeWhat happenedWhat to do
PLAN_STEP_FAILEDA step or check failed; the detail names the line and what was seenRead the report, fix the app or the plan, then re-run
CORE_REFUSEDThe screen layer refused; the detail starts with its own codeResolve that refusal, then re-run
BLOCK_START_MISSINGThe block’s declared start was absent; this is a typed refusal with exit code 4Follow the saved-block contract
WALK_DEADLINE_EXCEEDEDThe walk ran out of timeRaise QAREN_WALK_SECONDS, or split the plan
CANDIDATE_DRIFTEDThe working tree changed during the runRe-run against an unchanged checkout

The screen layer’s own codes appear at the start of failure.detail or in the report, not in failure.code:

Screen codeMeaning
TARGET_AMBIGUOUSA quoted target, or a phrase target’s scrolled-out name matches, matched two or more elements; each candidate is listed by kind, testID and frame. Use a unique testID or label.
TARGET_NOT_FOUNDA target did not resolve on screen
CHECK_UNSUREA literal check could not be decided from a fresh capture
VISIBILITY_UNSUREA wait ended with the target’s visibility still unsure
SCREEN_EVIDENCE_INCOMPLETEThe captured screen was not complete enough to act on safely
APP_PROCESS_CHANGEDOn iOS, the app crashed or restarted between captures
CDP_NOT_CONNECTEDThe app’s JavaScript runtime did not attach in time, or a target wait made no progress past deadlines.attach_seconds; the detail names the stalled boundary, app liveness, bundle request and host load
REACT_COVERAGE_LOSTThe JS/React connection remained lost at the end of an otherwise passing walk; the walk saves no new blocks. See the React coverage contract
CodeWhat happenedWhat to do
CLEANUP_INCOMPLETEqaren cleanup could not resolve some resourcesRe-run qaren cleanup <run-id> --json
OWNERSHIP_UNPROVENThe run’s processes were not proven goneRun qaren cleanup <run-id>, then re-run qaren pr
RUN_CANCELLEDThe run was cancelledRe-run when ready; the cleanup map names anything retained
PR_UNAVAILABLEgh could not read the pull requestCheck gh auth status and the pull request, then re-run

When a run cannot prove that a process is gone, it keeps the device lease and records what it kept. A PR worktree it cannot remove stays recorded for qaren cleanup without holding the lease. The next run on that device refuses DEVICE_BUSY until the lease is released. Run:

Terminal window
qaren cleanup <run-id> --json

It finishes the teardown from the run’s own records and releases the lease once every resource is accounted for. Do not delete locks in the configured namespace to get around it.

See the authoritative withheld media guide for reason codes, remedies, diagnostic locations and how screenshots and video retain their first cause.