{
  "checker": {
    "claims": [
      {
        "claim": "Web UI starts with abogen-web and is served on port 8808",
        "command": "<guest-path>",
        "evidence": "SmokeSuper\":{\"language\":\"en\",\"provider\":\"supertonic\",\"speed\":1.0,\"total_steps\":5,\"voice\":\"M1\"}}\n",
        "expected": "HTTP server on 127.0.0.1:8808 returns the saved voice profile list",
        "input": "abogen-web",
        "kind": "claim",
        "outcome": "Real input produced the expected result: SmokeSuper",
        "source": "Then open http://localhost:8808 and drag in your documents. Jobs run in the background worker and the browser updates automatically.",
        "source_checked": true,
        "source_file": "README.md",
        "verdict": "yes"
      }
    ],
    "cycle_checks": [
      {
        "claim": "Scheduled or looping main behavior",
        "command": "",
        "evidence": "abogen-web, abogen-cli and abogen are one-shot server/GUI entry points (pyproject.toml scripts); no cron, scheduler, or webhook loop found in README or webui routes",
        "expected": "identify the product trigger",
        "input": "source inspection",
        "kind": "cycle",
        "outcome": "abogen-web, abogen-cli and abogen are one-shot server/GUI entry points (pyproject.toml scripts); no cron, scheduler, or webhook loop found in README or webui routes",
        "source": "repository entry points",
        "verdict": "yes"
      }
    ],
    "details": {
      "argv": [
        "<guest-path>"
      ],
      "bytes": 98,
      "kind": "http",
      "response_checked": true,
      "response_excerpt": "SmokeSuper\":{\"language\":\"en\",\"provider\":\"supertonic\",\"speed\":1.0,\"total_steps\":5,\"voice\":\"M1\"}}\n",
      "scope": "product operation",
      "status": 200,
      "url": "http://127.0.0.1:8808/api/voice-profiles",
      "working": true
    },
    "evidence_strength": "readme_checked",
    "example_checks": [
      {
        "claim": "Documented test suite (CI workflow pytest tests/)",
        "command": "<guest-path> tests/test_voice_resolution.py -q",
        "deferred": false,
        "evidence": ".............................                                            [100%]\n29 passed in 1.35s",
        "expected": "documented command completes successfully",
        "input": "<guest-path> tests/test_voice_resolution.py -q",
        "kind": "example",
        "outcome": "command completed successfully",
        "returncode": 0,
        "source": ".github/workflows/test_pip.yml",
        "verdict": "yes"
      }
    ],
    "status": "PASS"
  },
  "deviations": [
    "Probe/claims use the http kind; abogen is not an MCP server",
    "/api/jobs/<id> documented in README returned 404 in this build",
    "libgl1 needed for PyQt6 tests; QT_QPA_PLATFORM=offscreen needed for headless runs"
  ],
  "fault_owner": "repo",
  "main_blocker": null,
  "operation": "Web UI text-to-audiobook conversion with default Kokoro voice af_alloy (POST /wizard/text then POST /wizard/finish)",
  "operation_scope": "abogen-web job submission and conversion",
  "outcome": "working",
  "plain_failure": "Web UI conversion job ends in Failed status with 'must be real number, not NoneType'",
  "steps": [
    "git pin to 654ec6d6fd35ae55db427dde2b570cfe06114e90",
    "apt install espeak-ng and libgl1 (system deps)",
    "uv venv --python 3.12 and uv pip install -e .[dev]",
    "abogen-web started on 8808",
    "voice profile SmokeSuper created via POST /api/voice-profiles and read back",
    "pytest tests/ (QT_QPA_PLATFORM=offscreen): 1615 passed",
    "conversion job submitted: failed with 'Voice af_alloy failed to resolve: must be real number, not NoneType' then 'Conversion failed'"
  ],
  "stuck_step": "conversion job execution: conversion_executor logs base speed with %.2f while plain Kokoro voice resolution returns speed None",
  "suggested_fix": "Default speed to a float (e.g. 1.0) when resolve_voice_target returns None for plain kokoro/supertonic specs, or guard the %.2f log formatting"
}
