{
  "checker": {
    "claims": [
      {
        "claim": "The MCP analyze tool returns a printability risk grade for a mesh file without repairing it",
        "command": "/tmp/pg-venv/bin/printguard-aholo tools/call {\"tool\": \"printguard_analyze_printability\", \"arguments\": {\"file_or_url\": \"<guest-path>\", \"height_mm\": 20.04}}",
        "evidence": "\u2026969.1}, \\\"overhang\\\": {\\\"threshold_deg\\\": 45, \\\"bad_area_mm2\\\": 0.0, \\\"bad_frac\\\": 0.0, \\\"bed_contact_mm2\\\": 396.8, \\\"bridge_lookup_mm\\\": 10.0, \\\"pitch_mm\\\": 0.15, \\\"method\\\": \\\"\u60ac\u5782\u9762\u6cbf\u91cd\u529b\u65b9\u5411\u5728 raw \u4f53\u7d20\u7f51\u683c\u5411\u4e0b\u63a2\u6d4b\uff08\u91cf\u5316 \u00b11*pitch\uff09\\\", \\\"open_area_mm2\\\": 0.0, \\\"open_frac\\\": 0.0, \\\"bridged_area_mm2\\\": 0.0, \\\"bridged_frac\\\": 0.0}, \\\"wall_thickness\\\": {\\\"verdict\\\": \\\"warn\\\", \\\"min_wall_mm\\\": 0.84, \\\"threshold_mm\\\": 0.8, \\\"pitch_mm\\\": 0.12, \\\"thin_spots_mm\\\": [[2.6, 0.4, 0.4], [2.6, 0.5, 0.4], [2.6, 0.6, 0.4]], \\\"method\\\": \\\"voxel EDT medial, T=2D-p\uff08round \u91cf\u5316\u8865\u507f\uff0c\u91cf\u5316 \u00b12*pitch\uff09\\\"}}, \\\"risk\\\": {\\\"grade\\\": \\\"S\\\", \\\"score\\\"",
        "expected": "risk grade S",
        "input": "{\"tool\": \"printguard_analyze_printability\", \"arguments\": {\"file_or_url\": \"<guest-path>\", \"height_mm\": 20.04}}",
        "kind": "claim",
        "outcome": "Real input produced the expected result: 969.1",
        "source": "| `printguard_analyze_printability` | \u53ea\u4f53\u68c0\u4e0d\u4fee\u590d\uff1a\u6c34\u5bc6\u6027\u3001\u60ac\u5782\u3001\u58c1\u539a\u3001\u95f4\u9699\u3001\u98ce\u9669\u8bc4\u5206 | `file_or_url` / `height_mm` |",
        "source_checked": true,
        "source_file": "README.md",
        "verdict": "yes"
      },
      {
        "claim": "The documented selftest runs 8 synthetic cases and reports a pass",
        "command": "/tmp/pg-venv/bin/python printguard.py selftest",
        "evidence": "SELFTEST PASS\n",
        "expected": "SELFTEST PASS",
        "input": "none",
        "kind": "claim",
        "outcome": "Real input produced the expected result: SELFTEST PASS",
        "returncode": 0,
        "source": "- `python printguard.py selftest`\uff1a8 \u4e2a\u5408\u6210\u7528\u4f8b",
        "source_checked": true,
        "source_file": "README.md",
        "verdict": "yes"
      }
    ],
    "cycle_checks": [
      {
        "claim": "Scheduled or looping main behavior",
        "command": "",
        "evidence": "Inspected README.md, pyproject.toml, printguard.py and mcp_server.py entrypoints (selftest, analyze, repair, printguard-aholo MCP stdio/streamable-http server). No cron, scheduler, polling loop, webhook or --once/--now trigger is documented; GitHub Actions CI schedules are excluded.",
        "expected": "identify the product trigger",
        "input": "source inspection",
        "kind": "cycle",
        "outcome": "Inspected README.md, pyproject.toml, printguard.py and mcp_server.py entrypoints (selftest, analyze, repair, printguard-aholo MCP stdio/streamable-http server). No cron, scheduler, polling loop, webhook or --once/--now trigger is documented; GitHub Actions CI schedules are excluded.",
        "source": "repository entry points",
        "verdict": "yes"
      }
    ],
    "details": {
      "argv": [
        "/tmp/pg-venv/bin/printguard-aholo"
      ],
      "kind": "mcp",
      "scope": "product operation",
      "serverInfo": {
        "name": "PrintGuard_Aholo",
        "version": "1.30.0"
      },
      "tool_result": {
        "content": [
          {
            "text": "{\"bbox_mm\": [20.04, 20.04, 8.52], \"checks\": {\"watertight\": {\"watertight\": true, \"winding\": true, \"boundary_edges\": 0, \"nonmanifold_edges\": 0, \"degenerate_faces\": 0, \"volume_mm3\": 969.1}, \"overhang\": {\"threshold_deg\": 45, \"bad_area_mm2\": 0.0, \"bad_frac\": 0.0, \"bed_contact_mm2\": 396.8, \"bridge_lookup_mm\": 10.0, \"pitch_mm\": 0.15, \"method\": \"\u60ac\u5782\u9762\u6cbf\u91cd\u529b\u65b9\u5411\u5728 raw \u4f53\u7d20\u7f51\u683c\u5411\u4e0b\u63a2\u6d4b\uff08\u91cf\u5316 \u00b11*pitch\uff09\", \"open_area_mm2\": 0.0, \"open_frac\": 0.0, \"bridged_area_mm2\": 0.0, \"bridged_frac\": 0.0}, \"wall_thickness\": {\"verdict\": \"warn\", \"min_wall_mm\": 0.84, \"threshold_mm\": 0.8, \"pitch_mm\": 0.12, \"thin_spots_mm\": [[2.6, 0.4, 0.4], [2.6, 0.5, 0.4], [2.6, 0.6, 0.4]], \"method\": \"voxel EDT medial, T=2D-p\uff08round \u91cf\u5316\u8865\u507f\uff0c\u91cf\u5316 \u00b12*pitch\uff09\"}}, \"risk\": {\"grade\": \"S\", \"score\": 95.0}, \"file\": \"<guest-path>\"}",
            "type": "text"
          }
        ],
        "isError": false
      },
      "tool_result_checked": true,
      "tool_schema_bytes": 3010,
      "tools": [
        "printguard_start_job",
        "printguard_check_job",
        "printguard_analyze_printability"
      ],
      "working": true
    },
    "evidence_strength": "readme_checked",
    "example_checks": [
      {
        "claim": "Analyze a mesh from the command line and write a JSON report",
        "command": "/tmp/pg-venv/bin/python printguard.py analyze output/thin_plate.stl --json /tmp/pg-probe/analyze/report.json",
        "deferred": false,
        "evidence": "2\": 396.8,\n   \"bridge_lookup_mm\": 10.0,\n   \"pitch_mm\": 0.15,\n   \"method\": \"\u60ac\u5782\u9762\u6cbf\u91cd\u529b\u65b9\u5411\u5728 raw \u4f53\u7d20\u7f51\u683c\u5411\u4e0b\u63a2\u6d4b\uff08\u91cf\u5316 \u00b11*pitch\uff09\",\n   \"open_area_mm2\": 0.0,\n   \"open_frac\": 0.0,\n   \"bridged_area_mm2\": 0.0,\n   \"bridged_frac\": 0.0\n  },\n  \"wall_thickness\": {\n   \"verdict\": \"warn\",\n   \"min_wall_mm\": 0.84,\n   \"threshold_mm\": 0.8,\n   \"pitch_mm\": 0.12,\n   \"thin_spots_mm\": [\n    [\n     2.6,\n     0.4,\n     0.4\n    ],\n    [\n     2.6,\n     0.5,\n     0.4\n    ],\n    [\n     2.6,\n     0.6,\n     0.4\n    ]\n   ],\n   \"method\": \"voxel EDT medial, T=2D-p\uff08round \u91cf\u5316\u8865\u507f\uff0c\u91cf\u5316 \u00b12*pitch\uff09\"\n  }\n },\n \"risk\": {\n  \"grade\": \"S\",\n  \"score\": 95.0\n }\n}",
        "expected": "risk grade S in stdout",
        "input": "output/thin_plate.stl",
        "kind": "example",
        "outcome": "command completed successfully",
        "returncode": 0,
        "source": "README.md / printguard.py analyze subcommand",
        "verdict": "yes"
      },
      {
        "claim": "Repair a non-watertight mesh and export a repaired STL",
        "command": "/tmp/pg-venv/bin/python printguard.py repair output/sphere_with_holes.stl -o /tmp/pg-probe/repair/sphere_repaired.stl",
        "deferred": false,
        "evidence": "  \"bridge_lookup_mm\": 10.0,\n    \"pitch_mm\": 0.15,\n    \"method\": \"\u60ac\u5782\u9762\u6cbf\u91cd\u529b\u65b9\u5411\u5728 raw \u4f53\u7d20\u7f51\u683c\u5411\u4e0b\u63a2\u6d4b\uff08\u91cf\u5316 \u00b11*pitch\uff09\",\n    \"open_area_mm2\": 97.5,\n    \"open_frac\": 0.0682,\n    \"bridged_area_mm2\": 23.6,\n    \"bridged_frac\": 0.0165\n   },\n   \"wall_thickness\": {\n    \"verdict\": \"pass\",\n    \"min_wall_mm\": 20.04,\n    \"threshold_mm\": 0.8,\n    \"pitch_mm\": 0.12,\n    \"thin_spots_mm\": [\n     [\n      10.0,\n      10.0,\n      10.0\n     ]\n    ],\n    \"method\": \"voxel EDT medial, T=2D-p\uff08round \u91cf\u5316\u8865\u507f\uff0c\u91cf\u5316 \u00b12*pitch\uff09\"\n   }\n  },\n  \"risk\": {\n   \"grade\": \"A\",\n   \"score\": 86.4\n  }\n },\n \"output\": \"/tmp/pg-probe/repair/sphere_repaired.stl\"\n}",
        "expected": "risk grade A after repair",
        "input": "output/sphere_with_holes.stl",
        "kind": "example",
        "outcome": "command completed successfully",
        "returncode": 0,
        "source": "README.md / printguard.py repair subcommand",
        "verdict": "yes"
      }
    ],
    "status": "PASS"
  },
  "deviations": [
    "Selftest was OOM-killed (exit 137) on the 3.9 GB VM; added a 4 GB swapfile via sudo (disposable guest setup) and it passed. CI runs on a larger GitHub runner.",
    "README's MCP config uses uvx printguard-aholo@latest from PyPI; I instead ran the console script built from the pinned checkout so the test exercises the pinned source.",
    "First MCP probe used height_mm=8.52 and returned grade A (min wall 0.36 mm) because height_mm rescales the mesh to the given target size; CLI analyze uses native size and returned S. Re-ran with native height 20.04 (matches CLI, grade S). This was a probe-input mistake, not a product bug, but the height_mm semantics are not obvious from the README.",
    "Initial MCP expected_text '\"grade\": \"S\"' did not match because the tool result is JSON nested in JSON (escaped quotes); switched to the specific returned value 969.1 (volume_mm3).",
    "checker path /inputs/coldpass-preflight.py does not exist in this guest; used <guest-path> with the same flags. Selftest writes its outputs to workspace output/ (product-generated)."
  ],
  "fault_owner": null,
  "main_blocker": null,
  "operation": "Install PrintGuard_Aholo from the pinned checkout and run its documented selftest, analyze and repair CLI commands plus the printguard-aholo MCP analyze tool, all checked by the checker's replay.",
  "operation_scope": "Linux guest (Ubuntu, 2 vCPU, 3.9 GB RAM + 4 GB swap added). Python 3.12.3 venv at /tmp/pg-venv (README requires Python >=3.11). Offline CPU-only operations; no AHOLO_API_KEY needed for analysis/repair. Generation tools (printguard_start_job, Lux3D) were not exercised because they need an AHOLO API key and remote service.",
  "outcome": "working",
  "plain_failure": null,
  "steps": [
    "python3 -m venv /tmp/pg-venv; /tmp/pg-venv/bin/pip install . (from pyproject.toml, installs printguard-aholo console script)",
    "/tmp/pg-venv/bin/python printguard.py selftest  (README quality check; SELFTEST PASS after adding swap)",
    "/tmp/pg-venv/bin/python printguard.py analyze output/thin_plate.stl --json <fresh path>",
    "/tmp/pg-venv/bin/python printguard.py repair output/sphere_with_holes.stl -o <fresh path>  (risk D->A)",
    "/tmp/pg-venv/bin/printguard-aholo MCP stdio server: tools/call printguard_analyze_printability (file_or_url, height_mm=20.04) returned grade S, volume_mm3 969.1"
  ],
  "stuck_step": null,
  "suggested_fix": "None required for the tested operations. Consider documenting that MCP analyze height_mm rescales the mesh and that selftest needs about 4+ GB RAM."
}
