{
 "tool": "eclipse-dispatch-mcp",
 "version": "0.1.0",
 "bench_date": "2026-10-25",
 "bench_version": "0.1.0",
 "environment": "local",
 "qualifier": "local",
 "verdict": "CERTIFIED(local)",
 "checks": [
  {
   "id": "D1",
   "name": "syndication creates drafts over real stub HTTP",
   "verdict": "pass",
   "evidence": "canonical draft -> preview (beehiiv/ghost DRAFT_API, substack PREP_PACK, beehiiv draft-only constraint surfaced as an adaptation diff) -> approve -> syndicate: beehiiv and Ghost drafts were created over real local HTTP against the bench's stub servers (one POST each, payload status 'draft' recorded server-side, stub ids returned); Substack received a paste pack (post.md + checklist.txt in bench state) with remote_status 'not_written'"
  },
  {
   "id": "D2",
   "name": "no publish/send method on the adapters",
   "verdict": "pass",
   "evidence": "introspection of the shipped adapter classes: BeehiivAdapter and GhostAdapter expose create_draft/analytics and no method whose name contains 'publish' or 'send'; the MCP tool list likewise has no publish/send tool \u2014 the absence is structural (beehiiv keeps publishing in-app by platform design), not a runtime flag"
  },
  {
   "id": "D3",
   "name": "Substack writes refused by name (ReadOnlyRefusal)",
   "verdict": "pass",
   "evidence": "direct write attempts against the Substack adapter (create_draft and publish) both raise the named ReadOnlyRefusal stating the adapter is READ-ONLY and that no sanctioned Substack write surface exists \u2014 Substack gets a paste pack, never a write (D1 confirms the pack path)"
  },
  {
   "id": "D4",
   "name": "approval is hash-bound: four refusal paths",
   "verdict": "pass",
   "evidence": "all four refusal paths hold: syndication before approval -> 'not approved'; wrong token against a live approval -> 'does not match'; a silent in-place body edit after approval (approval record intact, hash moved) -> 'APPROVAL INVALIDATED' naming both hashes; re-creating the draft as v2 resets approval -> 'not approved' again"
  },
  {
   "id": "D5",
   "name": "analytics: definitions labeled, never blended",
   "verdict": "pass",
   "evidence": "every figure in the unified report carries platform + platform_metric + the platform's own definition; open_rate (3 figures, 3 distinct definitions \u2014 beehiiv counts MPP machine opens, Ghost excludes privacy-relay prefetch, Substack uses its own attribution) -> combined null, flagged DEFINITIONS_DIFFER; revenue (period gross vs MRR) -> likewise refused; subscribers (identical definition, count) -> combined 4,315 = the exact sum of the three platform figures"
  },
  {
   "id": "D6",
   "name": "receipt chain valid; tamper detected",
   "verdict": "pass",
   "evidence": "verify_receipt_chain=true over the bench run's 12 receipts (draft_created / preview_pack / draft_approved / syndicated_draft / analytics_report); a deep copy with one altered receipt detail -> false (tamper detected)"
  },
  {
   "id": "U1",
   "name": "auth enforced",
   "verdict": "na",
   "evidence": "local stdio transport: no credential layer exists to test; process ownership is the boundary"
  },
  {
   "id": "U2",
   "name": "schema valid",
   "verdict": "pass",
   "evidence": "tools/list returns exactly the 6 tools, each with inputSchema type object + properties + required"
  },
  {
   "id": "U3",
   "name": "network surface is loopback-stub only",
   "verdict": "pass",
   "evidence": "the only HTTP traffic in this run was 2 POSTs to bench-started stub servers on 127.0.0.1 (ephemeral ports, wired via the documented env base URLs); server.py + adapters.py contain no hardcoded external platform endpoint \u2014 live wiring is env-supplied and owner-gated, untested here by design"
  },
  {
   "id": "U4",
   "name": "no secret leak",
   "verdict": "pass",
   "evidence": "no secret patterns in 15 tool outputs"
  },
  {
   "id": "U5",
   "name": "sane errors",
   "verdict": "pass",
   "evidence": "unknown draft preview -> error; unknown tool -> error; syndication of unknown draft -> error; malformed line survived (receipt_list answers); unknown method -> -32601"
  },
  {
   "id": "U6",
   "name": "process health",
   "verdict": "pass",
   "evidence": "initialize answered in 132 ms; ping ok"
  },
  {
   "id": "U7",
   "name": "audit completeness",
   "verdict": "pass",
   "evidence": "ledger covers the run in order ['draft_created', 'preview_pack', 'draft_approved', 'syndicated_draft', 'analytics_report']; 12 receipts (incl. one syndicated_draft per platform), seq strictly increasing, hash chain valid"
  },
  {
   "id": "U8",
   "name": "bench isolation",
   "verdict": "pass",
   "evidence": "workspace product state byte-identical before/after bench"
  }
 ],
 "notes": [
  "Local scope: stub adapters on loopback \u2014 the beehiiv/Ghost adapters ran over real local HTTP against stub servers started by this bench (127.0.0.1, ephemeral ports); no external host was contacted and no live platform wiring exists to test (beehiiv signup is an owner Wave-2 item).",
  "D0 + D1-core only: the reader face (D2) and any publish path are unbuilt by design; the beehiiv adapter's missing publish method is probed by introspection (D2)."
 ],
 "history": "append-only; prior runs retained in results/"
}