{"id":"test-exit-interpret","title":"Interpret a test run: pass, no-tests, skipped, flaky, infra-failure from runner, exit code and counts","description":"Reads a finished test run (runner, exit code, optional version, flags, caller-parsed counts, optional go test output, optional per-attempt exit codes) and says whether tests actually passed, ran nothing, were all skipped, passed only on retry, or never ran properly (timeout, signal, internal error). Encodes only exit-code semantics the runners document: pytest 0-5, node:test, mocha (failure count or POSIX codes, --fail-zero since 9.1.0), cargo test, go test summary lines; jest and vitest exit codes are not documented so those need counts. A timeout or signal is never a pass. status pass = verified green; fail = anything else conclusive; unknown/unsupported = the evidence does not settle it. Does not run tests or parse reporter output beyond go test's ok, FAIL, --- FAIL and panic lines. passWithNoTests is honoured only for jest and vitest, and only with exit code 0 (or none).","roi":"Stops 'exit 0 / no tests collected' and 'timed out' from being reported to a user as 'tests pass'.","audience":"agent-infra","package":"execution-safety-kit","channels":["x402","mcp"],"endpoint":{"method":"POST","url":"https://agents.writerslogic.com/api/v1/test-exit-interpret","path":"/api/v1/test-exit-interpret","contentType":"application/json"},"price":{"amount":"0.005","currency":"USDC","network":"base","perCall":true,"failedCallsCharged":false},"inputSchema":{"type":"object","additionalProperties":false,"required":["runner"],"properties":{"runner":{"type":"string","enum":["pytest","jest","vitest","node-test","go-test","cargo-test","mocha"]},"exitCode":{"type":"integer","minimum":0,"maximum":255,"description":"Process exit status. Omit when the process was killed by a signal or timed out."},"signal":{"type":"string","maxLength":20,"description":"Terminating signal name, e.g. SIGKILL."},"timedOut":{"type":"boolean","description":"True when the harness gave up waiting."},"version":{"type":"string","maxLength":30,"pattern":"^[0-9]+(\\.[0-9]+){0,2}$","description":"Runner version, e.g. 10.4.0. Needed only for version-gated flags."},"flags":{"type":"object","additionalProperties":false,"properties":{"passWithNoTests":{"type":"boolean"},"failZero":{"type":"boolean"},"posixExitCodes":{"type":"boolean"}}},"counts":{"type":"object","additionalProperties":false,"description":"Counts parsed by the caller from the runner's own report.","properties":{"total":{"type":"integer","minimum":0,"maximum":10000000},"passed":{"type":"integer","minimum":0,"maximum":10000000},"failed":{"type":"integer","minimum":0,"maximum":10000000},"skipped":{"type":"integer","minimum":0,"maximum":10000000},"todo":{"type":"integer","minimum":0,"maximum":10000000},"flaky":{"type":"integer","minimum":0,"maximum":10000000,"description":"Tests that failed then passed on retry."}}},"output":{"type":"string","maxLength":50000,"description":"go test output (only ok, FAIL, --- FAIL and panic: lines are read)."},"attemptExitCodes":{"type":"array","minItems":2,"maxItems":20,"items":{"type":"integer","minimum":0,"maximum":255},"description":"Exit codes of repeated runs of the same tests, to detect flakiness. Interpreted with the same runner rules."}}},"resultSchema":{"type":"object","properties":{"status":{"type":"string","enum":["pass","fail","unknown","unsupported"],"description":"pass: every rule held. fail: a rule was violated (see witnesses). unknown: the input lacks the evidence to decide. unsupported: outside what this engine covers. Missing evidence is never a pass."},"verdict":{"type":"string","enum":["pass","fail","no-tests","skipped","flaky","infra-failure","interrupted","unknown"]},"reason":{"type":"string"},"rule":{"type":"string"},"failedCount":{"type":"integer","description":"mocha default mode only: failed tests = exit code."},"attemptVerdicts":{"type":"array","items":{"type":"string"}},"docs":{"type":"string","description":"Source of the runner semantics used."},"witnesses":{"type":"array","items":{"type":"object","properties":{"ruleId":{"type":"string"},"detail":{"type":"string"},"path":{"type":"string","description":"JSON pointer or dotted path into the input."},"offset":{"type":"integer"},"index":{"type":"integer"},"expected":{"description":"What the rule required."},"actual":{"description":"What the input had."}}}},"versions":{"type":"object","description":"Every semantic dependency of this answer (engine, tables and their as-of dates, tokenizer, calendar, rounding profile)."},"limits":{"type":"array","items":{"type":"string"}},"deterministic":{"type":"boolean","description":"Always true: pure code, no model."}}},"outputSchema":{"type":"object","properties":{"data":{"type":"object","properties":{"status":{"type":"string","enum":["pass","fail","unknown","unsupported"],"description":"pass: every rule held. fail: a rule was violated (see witnesses). unknown: the input lacks the evidence to decide. unsupported: outside what this engine covers. Missing evidence is never a pass."},"verdict":{"type":"string","enum":["pass","fail","no-tests","skipped","flaky","infra-failure","interrupted","unknown"]},"reason":{"type":"string"},"rule":{"type":"string"},"failedCount":{"type":"integer","description":"mocha default mode only: failed tests = exit code."},"attemptVerdicts":{"type":"array","items":{"type":"string"}},"docs":{"type":"string","description":"Source of the runner semantics used."},"witnesses":{"type":"array","items":{"type":"object","properties":{"ruleId":{"type":"string"},"detail":{"type":"string"},"path":{"type":"string","description":"JSON pointer or dotted path into the input."},"offset":{"type":"integer"},"index":{"type":"integer"},"expected":{"description":"What the rule required."},"actual":{"description":"What the input had."}}}},"versions":{"type":"object","description":"Every semantic dependency of this answer (engine, tables and their as-of dates, tokenizer, calendar, rounding profile)."},"limits":{"type":"array","items":{"type":"string"}},"deterministic":{"type":"boolean","description":"Always true: pure code, no model."}}},"_provenance":{"type":"object","description":"C2PA-aligned manifest and W3C VC 2.0 (eddsa-jcs-2022) issued by the hub DID; verify at POST /api/v1/verify-provenance"}},"required":["data","_provenance"]},"example":{"runner":"pytest","exitCode":5},"openapiOperation":{"operationId":"test_exit_interpret","summary":"Interpret a test run: pass, no-tests, skipped, flaky, infra-failure from runner, exit code and counts","description":"Reads a finished test run (runner, exit code, optional version, flags, caller-parsed counts, optional go test output, optional per-attempt exit codes) and says whether tests actually passed, ran nothing, were all skipped, passed only on retry, or never ran properly (timeout, signal, internal error). Encodes only exit-code semantics the runners document: pytest 0-5, node:test, mocha (failure count or POSIX codes, --fail-zero since 9.1.0), cargo test, go test summary lines; jest and vitest exit codes are not documented so those need counts. A timeout or signal is never a pass. status pass = verified green; fail = anything else conclusive; unknown/unsupported = the evidence does not settle it. Does not run tests or parse reporter output beyond go test's ok, FAIL, --- FAIL and panic lines. passWithNoTests is honoured only for jest and vitest, and only with exit code 0 (or none).\n\nPrice: 0.005 USDC on Base (x402).","x-x402-price-usdc":"0.005","x-x402-amount":"5000","x-payment-info":{"protocols":["x402"],"price":{"mode":"fixed","currency":"USD","amount":"0.005"}},"x-audience":"agent-infra","x-sample-url":"https://agents.writerslogic.com/api/v1/samples/test-exit-interpret","security":[{"x402":[]},{"apiKey":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["runner"],"properties":{"runner":{"type":"string","enum":["pytest","jest","vitest","node-test","go-test","cargo-test","mocha"]},"exitCode":{"type":"integer","minimum":0,"maximum":255,"description":"Process exit status. Omit when the process was killed by a signal or timed out."},"signal":{"type":"string","maxLength":20,"description":"Terminating signal name, e.g. SIGKILL."},"timedOut":{"type":"boolean","description":"True when the harness gave up waiting."},"version":{"type":"string","maxLength":30,"pattern":"^[0-9]+(\\.[0-9]+){0,2}$","description":"Runner version, e.g. 10.4.0. Needed only for version-gated flags."},"flags":{"type":"object","additionalProperties":false,"properties":{"passWithNoTests":{"type":"boolean"},"failZero":{"type":"boolean"},"posixExitCodes":{"type":"boolean"}}},"counts":{"type":"object","additionalProperties":false,"description":"Counts parsed by the caller from the runner's own report.","properties":{"total":{"type":"integer","minimum":0,"maximum":10000000},"passed":{"type":"integer","minimum":0,"maximum":10000000},"failed":{"type":"integer","minimum":0,"maximum":10000000},"skipped":{"type":"integer","minimum":0,"maximum":10000000},"todo":{"type":"integer","minimum":0,"maximum":10000000},"flaky":{"type":"integer","minimum":0,"maximum":10000000,"description":"Tests that failed then passed on retry."}}},"output":{"type":"string","maxLength":50000,"description":"go test output (only ok, FAIL, --- FAIL and panic: lines are read)."},"attemptExitCodes":{"type":"array","minItems":2,"maxItems":20,"items":{"type":"integer","minimum":0,"maximum":255},"description":"Exit codes of repeated runs of the same tests, to detect flakiness. Interpreted with the same runner rules."}}},"example":{"runner":"pytest","exitCode":5}}}},"responses":{"200":{"description":"Paid result with provenance","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","properties":{"status":{"type":"string","enum":["pass","fail","unknown","unsupported"],"description":"pass: every rule held. fail: a rule was violated (see witnesses). unknown: the input lacks the evidence to decide. unsupported: outside what this engine covers. Missing evidence is never a pass."},"verdict":{"type":"string","enum":["pass","fail","no-tests","skipped","flaky","infra-failure","interrupted","unknown"]},"reason":{"type":"string"},"rule":{"type":"string"},"failedCount":{"type":"integer","description":"mocha default mode only: failed tests = exit code."},"attemptVerdicts":{"type":"array","items":{"type":"string"}},"docs":{"type":"string","description":"Source of the runner semantics used."},"witnesses":{"type":"array","items":{"type":"object","properties":{"ruleId":{"type":"string"},"detail":{"type":"string"},"path":{"type":"string","description":"JSON pointer or dotted path into the input."},"offset":{"type":"integer"},"index":{"type":"integer"},"expected":{"description":"What the rule required."},"actual":{"description":"What the input had."}}}},"versions":{"type":"object","description":"Every semantic dependency of this answer (engine, tables and their as-of dates, tokenizer, calendar, rounding profile)."},"limits":{"type":"array","items":{"type":"string"}},"deterministic":{"type":"boolean","description":"Always true: pure code, no model."}}},"_provenance":{"type":"object","description":"C2PA-aligned manifest and W3C VC 2.0 (eddsa-jcs-2022) issued by the hub DID; verify at POST /api/v1/verify-provenance"}},"required":["data","_provenance"]}}}},"400":{"description":"Invalid request (no payment consumed)","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string"}}}}}},"401":{"description":"Invalid X-API-KEY","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string"}}}}}},"402":{"description":"Payment required or invalid","content":{"application/json":{"schema":{"type":"object","description":"x402 v2 PaymentRequired (also base64 in the PAYMENT-REQUIRED header)","properties":{"x402Version":{"type":"integer"},"error":{"type":"string"},"code":{"type":"string"},"resource":{"type":"object"},"accepts":{"type":"array","items":{"type":"object"}},"extensions":{"type":"object"}}}}}},"502":{"description":"Upstream failure; the payment is released or not settled","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string"}}}}}}}},"links":{"docs":"https://agents.writerslogic.com/docs/test-exit-interpret/","docsJson":"https://agents.writerslogic.com/docs/test-exit-interpret.json","sample":"https://agents.writerslogic.com/api/v1/samples/test-exit-interpret","openapi":"https://agents.writerslogic.com/openapi.json","catalog":"https://agents.writerslogic.com/api/v1/catalog","verifyProvenance":"https://agents.writerslogic.com/api/v1/verify-provenance","index":"https://agents.writerslogic.com/docs/index.json"}}