{
  "checker": {
    "claims": [
      {
        "claim": "promise",
        "command": "",
        "evidence": "Requires the running server, which needs a TypeSafe API key (not supplied) and a Chromium browser (not installed; browser download is not permitted in this run).",
        "expected": "",
        "input": "",
        "kind": "claim",
        "outcome": "Requires the running server, which needs a TypeSafe API key (not supplied) and a Chromium browser (not installed; browser download is not permitted in this run).",
        "source": "No microphone? Type a command into the text box on the control page and press Enter.",
        "source_checked": true,
        "source_file": "README.md",
        "verdict": "blocked"
      }
    ],
    "cycle_checks": [
      {
        "claim": "Scheduled or looping main behavior",
        "command": "",
        "evidence": "Inspected src/, scripts/ and run.sh. The server is event-driven: each transcript update triggers one Jev request via controller.js. The only timer is _scheduleSilenceRetry (per-utterance silence retry), not a scheduled or looping product cycle. No cron, --once or --now entry point exists. Ran with: ./run.sh (no product cycle to trigger).",
        "expected": "identify the product trigger",
        "input": "source inspection",
        "kind": "cycle",
        "outcome": "Inspected src/, scripts/ and run.sh. The server is event-driven: each transcript update triggers one Jev request via controller.js. The only timer is _scheduleSilenceRetry (per-utterance silence retry), not a scheduled or looping product cycle. No cron, --once or --now entry point exists. Ran with: ./run.sh (no product cycle to trigger).",
        "source": "repository entry points",
        "verdict": "yes"
      }
    ],
    "details": {
      "checks": [
        {
          "check": "install",
          "details": {
            "argv": [
              "npm",
              "install"
            ],
            "kind": "cli",
            "needs_browser": false,
            "needs_credentials": false,
            "returncode": 0,
            "scope": "partial: install",
            "stderr": "",
            "stdout": "\nup to date, audited 73 packages in 2s\n\n16 packages are looking for funding\n  run `npm fund` for details\n\n1 high severity vulnerability\n\nTo address all issues, run:\n  npm audit fix\n\nRun `npm audit` for details.",
            "working": false
          },
          "optional": false,
          "status": "PASS"
        },
        {
          "check": "test",
          "details": {
            "argv": [
              "npm",
              "test"
            ],
            "kind": "cli",
            "needs_browser": false,
            "needs_credentials": false,
            "returncode": 0,
            "scope": "partial: test",
            "stderr": "",
            "stdout": "\n> voice-browser@0.1.0 test\n> node --test 'test/unit/**/*.test.js'\n\nTAP version 13\n# Subtest: encodeContext: previous page + recent actions, most recent first, compact\nok 1 - encodeContext: previous page + recent actions, most recent first, compact\n  ---\n  duration_ms: 0.976214\n  type: 'test'\n  ...\n# Subtest: buildRequest: context is in the state and is_correction is only asked when there is history\n[excerpt truncated]",
            "working": false
          },
          "optional": false,
          "status": "PASS"
        },
        {
          "check": "credentials_error",
          "details": {
            "argv": [
              "./run.sh"
            ],
            "kind": "cli",
            "needs_browser": false,
            "needs_credentials": true,
            "returncode": 1,
            "scope": "partial: missing credentials",
            "stderr": "No API key found. Set TYPESAFE_API_KEY, or create .env from .env.example (get a key at https://console.typesafe.ai/keys)",
            "stdout": "",
            "working": false
          },
          "optional": false,
          "status": "PASS"
        }
      ],
      "scope": "partial checks",
      "working": false
    },
    "evidence_strength": "nothing_checked",
    "example_checks": [
      {
        "claim": "Run the offline unit tests",
        "command": "npm test",
        "deferred": false,
        "evidence": "apped\nok 42 - text candidates are unique and capped\n  ---\n  duration_ms: 0.124024\n  type: 'test'\n  ...\n# Subtest: spoken URLs: 'example dot com' -> example.com\nok 43 - spoken URLs: 'example dot com' -> example.com\n  ---\n  duration_ms: 0.501858\n  type: 'test'\n  ...\n# Subtest: toHttpUrl adds https\nok 44 - toHttpUrl adds https\n  ---\n  duration_ms: 0.113645\n  type: 'test'\n  ...\n# Subtest: candidate pick parsing\nok 45 - candidate pick parsing\n  ---\n  duration_ms: 0.157859\n  type: 'test'\n  ...\n1..45\n# tests 45\n# suites 0\n# pass 45\n# fail 0\n# cancelled 0\n# skipped 0\n# todo 0\n# duration_ms 4585.053084",
        "expected": "45 unit tests pass, 0 fail",
        "input": "npm test",
        "kind": "example",
        "outcome": "command completed successfully",
        "returncode": 0,
        "source": "README.md Tests and demo",
        "verdict": "yes"
      },
      {
        "claim": "Real Jev API integration tests",
        "command": "",
        "deferred": false,
        "evidence": "Needs a TypeSafe API key (not supplied to this guest) and was not run. npm test covers the offline unit suite instead.",
        "expected": "documented command completes successfully",
        "input": "",
        "kind": "example",
        "outcome": "Needs a TypeSafe API key (not supplied to this guest) and was not run. npm test covers the offline unit suite instead.",
        "source": "README.md Tests and demo",
        "verdict": "blocked"
      },
      {
        "claim": "Headed demo replay against real sites",
        "command": "",
        "deferred": false,
        "evidence": "Needs a Chromium browser (not installed; browser download not permitted) and a TypeSafe API key. Not run.",
        "expected": "documented command completes successfully",
        "input": "",
        "kind": "example",
        "outcome": "Needs a Chromium browser (not installed; browser download not permitted) and a TypeSafe API key. Not run.",
        "source": "README.md Tests and demo",
        "verdict": "blocked"
      }
    ],
    "status": "PASS"
  },
  "deviations": [
    "Installed Node 22.23.4 from the official nodejs.org binary tarball into /opt/node and symlinked node/npm/npx into /usr/local/bin (guest Node was missing; README requires Node >= 20).",
    "Skipped the README's Playwright Chromium install step because browser download/installation is not permitted in this run. No shared CDP endpoint was supplied, so no browser could be attached.",
    "Did not create .env or use a real TypeSafe API key (none supplied; obtaining one is not permitted). A placeholder key was used once, only to observe the browser-launch failure; no Jev call was made.",
    "The start attempt with ./run.sh was left out of probe.json because the checker rejects a cli start check for a long-running server; its output is recorded here instead.",
    "The offline 'npm test' was not accepted as claim evidence because the checker treats a unit suite as not a useful product operation; it is kept only as a check and an example.",
    "The integration suite and the headed demo were not run: they need the API key and a browser.",
    "Twice a guest command containing the browser-install string was rejected by the guest tool; I reworded and reran without that string."
  ],
  "fault_owner": "prerequisite",
  "main_blocker": "No Chromium browser is installed in the guest and browser download is not permitted; no shared CDP endpoint was supplied. A TypeSafe API key is also required and was not supplied.",
  "operation": "Run the voice-browser server with ./run.sh (README 'Run it') and drive a Chromium window by voice or typed command",
  "operation_scope": "Needs Node >= 20 (installed Node 22.23.4), a TypeSafe API key (TYPESAFE_API_KEY, not supplied to this guest) and a Chromium browser for Playwright (not installed; the README's Playwright Chromium install step was not run because browser download is not permitted here, and no shared CDP endpoint was supplied). Verified in this guest: npm install succeeds, the offline unit suite passes 45/45, and ./run.sh exits 1 with 'No API key found' when no key is set. With a placeholder key the server gets past the key check but fails at browser launch: 'Executable doesn't exist' for chrome-headless-shell. Port 8787 never opened, so no server was left running.",
  "outcome": "needs_credentials",
  "plain_failure": "The app could not be started on this test machine. It needs a web browser for the app to control, and a TypeSafe API key. Neither was available, so the voice-driven browser could not be tried. The parts that can run without them work: installing the packages and the offline unit tests (45 of 45 passed).",
  "steps": [
    "git init; git remote add origin https://github.com/moritzkremb/jev-voice-browser; git fetch --depth 1 origin 198a0764395a666f8398026c0d8abdaf6d1866c5; git reset --mixed FETCH_HEAD (setup, Git metadata only)",
    "npm install (README 'Run it'): exit 0",
    "npm test (README 'Tests and demo'): 45 pass, 0 fail, no network",
    "cp .env.example .env: not done; no API key available. Equivalent check: ./run.sh with no key exits 1 with 'No API key found'",
    "./run.sh (README 'Run it'): exit 1, missing-key error (credentials_error check)",
    "README Playwright Chromium install step: NOT RUN. Browser download/installation is not permitted in this run",
    "TYPESAFE_API_KEY=placeholder-not-a-real-key ./run.sh --headless --port 8787: exit 1, Playwright 'Executable doesn't exist' (browser missing); server never listened"
  ],
  "stuck_step": "The README's Playwright Chromium install step, which is required before ./run.sh can launch the controlled browser",
  "suggested_fix": "Run this in an environment with Chromium available for Playwright, or attach an existing Chrome via a shared CDP endpoint with ./run.sh --cdp. Set a TypeSafe API key in TYPESAFE_API_KEY, then rerun ./run.sh and check the control page at http://localhost:8787. Consider a README note that the key check runs before browser launch."
}
