{
  "checker": {
    "claims": [
      {
        "claim": "Smitline exposes call tools to MCP-capable agents such as Claude Desktop",
        "command": "sudo -n docker exec -i smitline smitline mcp tools/call {\"tool\": \"list_voices\", \"arguments\": {}}",
        "evidence": "marin\\\",\\\"voices\\\":[\\\"marin\\\",\\\"vesper\\\",\\\"quartz\\\",\\\"ripple\\\",\\\"willow\\\",\\\"stone\\\",\\\"gleam\\\",\\\"meridian\\\",\\\"bossa\\\",\\\"tempo\\\",\\\"beacon\\\",\\\"delta\\\",\\\"cinder\\\"]}\"}], \"structuredContent\": {\"default\": \"marin\", \"voices\": [\"marin\", \"vesper\", \"quartz\", \"ripple\", \"willow\", \"stone\", \"gleam\", \"meridian\", \"bossa\", \"tempo\", \"beacon\", \"delta\", \"cinder\"]}, \"isError\": false}",
        "expected": "the GPT-Live voice list, default marin",
        "input": "{\"tool\": \"list_voices\", \"arguments\": {}}",
        "kind": "claim",
        "outcome": "Real input produced the expected result: marin",
        "source": "**Works with your agent.** Claude Code, Codex, Cursor, Claude Desktop, OpenClaw, Hermes, and anything that can use MCP, a CLI or a REST API.",
        "source_checked": true,
        "source_file": "README.md",
        "verdict": "yes"
      },
      {
        "claim": "Calls need your own OpenAI key; without it the brief check reports the missing key",
        "command": "sudo -n docker exec -i smitline smitline mcp tools/call {\"tool\": \"check_call_brief\", \"arguments\": {\"channel\": \"phone\", \"to\": \"+14155550142\", \"objective\": \"Book a table for 4 at 7pm\", \"onBehalfOf\": \"Sam\"}}",
        "evidence": "openai is not configured: set OPENAI_API_KEY\\\"],\\\"carried\\\":0}\"}], \"structuredContent\": {\"ok\": false, \"brief\": {\"channel\": \"phone\", \"to\": \"+14155550142\", \"onBehalfOf\": \"Sam\", \"objective\": \"Book a table for 4 at 7pm\", \"mayAgreeTo\": [], \"mustNotShare\": [], \"maxMinutes\": 10, \"rehearsal\": false}, \"problems\": [\"Smitline calls people between 8:00 AM and 9:00 PM their time. It is 9:10 PM for +14155550142 (America/Los_Angeles). Try again later, or set afterHours to true if the user confirms this person expects a call now.\", \"openai is not configured: set OPENAI_API_KEY\"], \"carried\": 0}, \"isError\": fal",
        "expected": "ok false with problem 'openai is not configured'",
        "input": "{\"tool\": \"check_call_brief\", \"arguments\": {\"channel\": \"phone\", \"to\": \"+14155550142\", \"objective\": \"Book a table for 4 at 7pm\", \"onBehalfOf\": \"Sam\"}}",
        "kind": "claim",
        "outcome": "Real input produced the expected result: openai is not configured",
        "source": "**Runs on your computer.** One Docker container, your own OpenAI and phone keys, open source under Apache-2.0.",
        "source_checked": true,
        "source_file": "README.md",
        "verdict": "yes"
      }
    ],
    "cycle_checks": [
      {
        "claim": "Scheduled or looping main behavior",
        "command": "",
        "evidence": "Entry points inspected (start-*.sh, Dockerfile, packages/cli, meeting-runtime, control-panel). No cron, --once/--now, or product scheduler loop was found. The only setInterval calls are console UI refresh timers in control-panel/app.js and calls.js. The daemon is a request-driven HTTP/MCP server; calls are placed on demand, not on a schedule.",
        "expected": "identify the product trigger",
        "input": "source inspection",
        "kind": "cycle",
        "outcome": "Entry points inspected (start-*.sh, Dockerfile, packages/cli, meeting-runtime, control-panel). No cron, --once/--now, or product scheduler loop was found. The only setInterval calls are console UI refresh timers in control-panel/app.js and calls.js. The daemon is a request-driven HTTP/MCP server; calls are placed on demand, not on a schedule.",
        "source": "repository entry points",
        "verdict": "yes"
      }
    ],
    "details": {
      "argv": [
        "sudo",
        "-n",
        "docker",
        "exec",
        "-i",
        "smitline",
        "smitline",
        "mcp"
      ],
      "kind": "mcp",
      "scope": "product operation",
      "serverInfo": {
        "name": "smitline",
        "version": "0.3.0"
      },
      "tool_result": {
        "content": [
          {
            "text": "{\"default\":\"marin\",\"voices\":[\"marin\",\"vesper\",\"quartz\",\"ripple\",\"willow\",\"stone\",\"gleam\",\"meridian\",\"bossa\",\"tempo\",\"beacon\",\"delta\",\"cinder\"]}",
            "type": "text"
          }
        ],
        "isError": false,
        "structuredContent": {
          "default": "marin",
          "voices": [
            "marin",
            "vesper",
            "quartz",
            "ripple",
            "willow",
            "stone",
            "gleam",
            "meridian",
            "bossa",
            "tempo",
            "beacon",
            "delta",
            "cinder"
          ]
        }
      },
      "tool_result_checked": true,
      "tool_schema_bytes": 22031,
      "tools": [
        "start_call",
        "check_call_brief",
        "wait_for_call",
        "get_call",
        "list_calls",
        "save_call_note",
        "list_contacts",
        "send_call_instruction",
        "reply_to_call_request",
        "end_call",
        "transfer_call_to_me",
        "list_voices",
        "get_profile",
        "update_profile"
      ],
      "working": true
    },
    "evidence_strength": "readme_checked",
    "example_checks": [
      {
        "claim": "The smitline CLI lists GPT-Live voices inside the running container",
        "command": "sudo -n docker exec smitline smitline voices",
        "deferred": false,
        "evidence": "{\n  \"default\": \"marin\",\n  \"voices\": [\n    \"marin\",\n    \"vesper\",\n    \"quartz\",\n    \"ripple\",\n    \"willow\",\n    \"stone\",\n    \"gleam\",\n    \"meridian\",\n    \"bossa\",\n    \"tempo\",\n    \"beacon\",\n    \"delta\",\n    \"cinder\"\n  ]\n}",
        "expected": "JSON with default marin",
        "input": "voices",
        "kind": "example",
        "outcome": "command completed successfully",
        "returncode": 0,
        "source": "README.md Prefer to set it up yourself? / docs/agents.md CLI",
        "verdict": "yes"
      }
    ],
    "status": "PASS"
  },
  "deviations": [
    "Docker was not installed in the guest; installed docker.io via apt with sudo (the README requires Docker but the guest lacked it).",
    "Probes use 'sudo -n docker exec' because the ubuntu user is not in the docker group.",
    "Used the README's phone-only docker run to avoid mounting the Docker socket; the meeting option was not exercised.",
    "Node 22 and the documented npm test and meeting-image test suite were not run; they are repo tests, not product operations.",
    "No OpenAI key or phone provider credentials are available in this guest, so no call was placed; the README says keys go on the local setup <email>:8095, which was not completed.",
    "The smitline container is intentionally left RUNNING after the run: the probe, claims and examples call 'docker exec smitline smitline mcp/voices', which need it up for the checker replay. Stop it with: sudo docker rm -f smitline (the console on 127.0.0.1:8095 and the stdio MCP are the only processes; they are the product's own runtime, not background processes I spawned separately)."
  ],
  "fault_owner": "prerequisite",
  "main_blocker": null,
  "operation": "Run the Smitline container from the README and call its MCP tools (list_voices works; placing a phone call needs an OpenAI key)",
  "operation_scope": "Linux Ubuntu 24.04 guest, Docker Engine 29.1.3 installed via apt (sudo), image ghcr.io/kaelorlabs/smitline pulled from GHCR, phone-only run (no Docker socket).",
  "outcome": "working",
  "plain_failure": "The Smitline app starts and its agent tools respond, but it cannot place a phone call here because it has no OpenAI key or phone account. Adding those keys on its local setup page is needed to test calls.",
  "steps": [
    "sudo apt-get install -y docker.io (Docker prerequisite from README 'What you need'; Docker was missing, installed 29.1.3)",
    "sudo systemctl start docker",
    "docker run -d --name smitline --restart unless-stopped --network host -v smitline:/data ghcr.io/kaelorlabs/smitline (README 'Prefer to set it up yourself?', phone-only variant)",
    "curl http://127.0.0.1:8095/calls returned 200",
    "smitline mcp over stdio: tools/call list_voices returned default marin and 13 voices",
    "smitline mcp: tools/call check_call_brief returned ok false, problem 'openai is not configured: set OPENAI_API_KEY'",
    "docker exec smitline smitline voices returned the voice list",
    "docker stop smitline",
    "docker stop smitline then docker start smitline were needed because the first stop broke the checker replay; final container state: running"
  ],
  "stuck_step": "Placing a call: the brief check fails with 'openai is not configured: set OPENAI_API_KEY'",
  "suggested_fix": "Provide an OpenAI key with GPT-Live access and a SignalWire or Twilio account, enter them on the setup page at http://127.0.0.1:8095 (not in chat), then rerun the check_call_brief and a real call."
}
