{
 "tool": "eclipse-haven-mcp",
 "version": "0.1.0",
 "bench_date": "2026-10-25",
 "bench_version": "0.1.0",
 "environment": "simulator",
 "qualifier": "simulator",
 "verdict": "CERTIFIED(simulator)",
 "checks": [
  {
   "id": "H1",
   "name": "api_token auth refused by name on EVERY tool (all 10)",
   "verdict": "pass",
   "evidence": "presenting an api_token credential is refused with TOKEN_AUTH_NOT_IMPLEMENTED on all 10 tools"
  },
  {
   "id": "H2",
   "name": "no token code path exists outside refusal/denylist (source-level)",
   "verdict": "pass",
   "evidence": "source scan finds api_token on exactly 2 lines and both are outside any authentication path: the check_auth refusal tuple (TOKEN_AUTH_NOT_IMPLEMENTED branch) and the FORBIDDEN_TOOL_NAMES denylist entry; no Authorization/X-Zendesk header construction exists anywhere in server.py"
  },
  {
   "id": "H3",
   "name": "internal-note visibility never flattens to public",
   "verdict": "pass",
   "evidence": "fixture comment c3 reads internal_note while c1/c4 read public_reply; a bench internal note appended via ticket_update also reads internal_note on re-read (never promoted) and its body never enters the public reply draft \u2014 visibility classes stay distinct end to end"
  },
  {
   "id": "H4",
   "name": "T2 update token bound to ticket + changes-hash (cross-ticket and cross-changeset replay fail)",
   "verdict": "pass",
   "evidence": "a T2 token minted for ticket 9001 + {status: solved} fails on ticket 9003 with identical changes (9003 stays pending) and fails on 9001 with {status: closed} (9001 stays open); only the exact ticket + exact changeset pairing succeeds, moving 9001 to solved"
  },
  {
   "id": "H5",
   "name": "re-draft after changed facts kills the prior send token both directions",
   "verdict": "pass",
   "evidence": "re-drafting ticket 9003 under the same draft id after a resolution is recorded moves the content hash; the OLD token is dead (send refused, no comment appended) and the NEW token sends \u2014 and what lands publicly is exactly draft 2's body"
  },
  {
   "id": "H6",
   "name": "receipt chain valid; tamper detected",
   "verdict": "pass",
   "evidence": "receipt_list reports chain_valid over 15 receipts (ticket reads/updates, drafts, send denial + send); product verifier confirms it, and a deep copy with one altered receipt detail verifies false"
  },
  {
   "id": "U1",
   "name": "auth enforced",
   "verdict": "na",
   "evidence": "no live credential layer exists in C0 to test (real OAuth grants are C1); the auth SHAPE \u2014 OAuth-only, token auth refused \u2014 is probed directly in H1/H2"
  },
  {
   "id": "U2",
   "name": "schema valid",
   "verdict": "pass",
   "evidence": "tools/list returns exactly the 10 C0 tools, each with inputSchema type object + properties + required"
  },
  {
   "id": "U3",
   "name": "no network surface (fixture-only build)",
   "verdict": "pass",
   "evidence": "server.py contains no network call sites \u2014 the fixtures-only C0 claim is structural; no Zendesk instance can be contacted by this build"
  },
  {
   "id": "U4",
   "name": "no secret leak",
   "verdict": "pass",
   "evidence": "no secret patterns in 26 tool outputs"
  },
  {
   "id": "U5",
   "name": "sane errors",
   "verdict": "pass",
   "evidence": "unknown ticket/user/org -> named errors; malformed line survived (receipt_list answers); unknown method -> -32601"
  },
  {
   "id": "U6",
   "name": "process health",
   "verdict": "pass",
   "evidence": "initialize answered in 50 ms; ping ok"
  },
  {
   "id": "U7",
   "name": "audit completeness",
   "verdict": "pass",
   "evidence": "ledger covers the run in order (['ticket_read', 'ticket_update_denied', 'reply_drafted', 'reply_send_denied', 'reply_sent'] present as a subsequence); 15 receipts, seq strictly increasing, chain valid \u2014 ALLOWs and DENYs are both receipted"
  },
  {
   "id": "U8",
   "name": "bench isolation",
   "verdict": "pass",
   "evidence": "workspace product state byte-identical before/after bench"
  }
 ],
 "notes": [
  "Simulator scope: local fixtures shaped like Zendesk REST API v2 responses; no live Zendesk instance is contacted or exists in the product (live is C1, owner-account-gated).",
  "The auth SHAPE is tested here (OAuth-only; token auth refused by construction). Real OAuth grant flows need the owner's registered app at C1 and are in the manifest not_tested list."
 ],
 "history": "append-only; prior runs retained in results/"
}