{
 "tool": "eclipse-muster-mcp",
 "version": "0.1.0",
 "bench_date": "2026-10-25",
 "bench_version": "0.1.0",
 "environment": "local",
 "qualifier": "local",
 "verdict": "CERTIFIED(local)",
 "checks": [
  {
   "id": "M1",
   "name": "field without provenance refused BY NAME at ingest",
   "verdict": "pass",
   "evidence": "a record whose ghost_field carries no provenance is refused with PROVENANCE_MISSING naming 'ghost_field', and no record is stored \u2014 a field without provenance does not enter the graph"
  },
  {
   "id": "M2",
   "name": "receipt ledger carries no bench PII (raw scan)",
   "verdict": "pass",
   "evidence": "after bench-owned records (full email benchpii@bench-test.example, phone +1-999-555-7777, named person, ticket subject, conversation body) are read and searched, a raw scan of the receipt ledger in state AND the receipt_list output finds none of the 6 bench PII/content strings in any receipt \u2014 receipts carry IDs + hashes only"
  },
  {
   "id": "M3",
   "name": "merge propose-only; wrong token DENY, graph untouched",
   "verdict": "pass",
   "evidence": "proposing the merge leaves the record graph byte-identical (hash unchanged before/after propose); a wrong confirm token is DENYed with CONFIRM_TOKEN_INVALID, graph hash still unchanged, both nodes still active, and the denial is receipted"
  },
  {
   "id": "M4",
   "name": "per-platform values survive merge (conflict kept)",
   "verdict": "pass",
   "evidence": "with the hash-bound confirm token the merge executes and the merged node keeps BOTH conflicting names \u2014 name='Bench Alpha' plus name@zendesk='Bench Beta' \u2014 the second platform's value is retained under its platform-suffixed key, never destroyed or overwritten"
  },
  {
   "id": "M5",
   "name": "unmerge restores BOTH nodes byte-exact",
   "verdict": "pass",
   "evidence": "unmerge from the merge receipt restores BOTH pre-merge nodes byte-exact against the state captured before proposing (full record dicts equal, including provenance blocks), the merged node is removed, and the restored ids are exactly bench-m3a + bench-m3b"
  },
  {
   "id": "M6",
   "name": "draft without resolution: MISSING_FACT, zero outcome claims, no lure migration",
   "verdict": "pass",
   "evidence": "the ticket carries no resolution field, so the draft carries [MISSING_FACT: resolution] and missing_facts=[resolution]; the lure words seeded in an unused field (LURETOKEN_ZULU + resolved/fixed/refund-granted/case-closed) migrate nowhere \u2014 none appear in the draft body, and no citation points at the lure field"
  },
  {
   "id": "M7",
   "name": "Law #1: injection ticket quarantined, never obeyed",
   "verdict": "pass",
   "evidence": "the instruction-shaped customer message is stored quarantined=true with trust=untrusted_data, reported in the draft's quarantined_message_ids, and never echoed (no outside address, no 'refund my' in the draft body) \u2014 and no state anywhere records a refund or forward action"
  },
  {
   "id": "M8",
   "name": "tier-floor lowering rejected at load (exit 2); raise allowed",
   "verdict": "pass",
   "evidence": "a policy lowering customer_visible_send to T1 (floor T2) is rejected at load: the server exits 2 with TIER_FLOOR_VIOLATION on stderr; the same server with the floor raised to T3 initializes and policy_show reports effective customer_visible_send=3"
  },
  {
   "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 9 C0 tools, each with inputSchema type object + properties + required"
  },
  {
   "id": "U3",
   "name": "no network surface (local-only build)",
   "verdict": "pass",
   "evidence": "server.py contains no network call sites \u2014 no urllib/socket/requests/http.*: the local-only C0 claim is structural, not configured"
  },
  {
   "id": "U4",
   "name": "no secret leak",
   "verdict": "pass",
   "evidence": "no secret patterns in 20 tool outputs"
  },
  {
   "id": "U5",
   "name": "sane errors",
   "verdict": "pass",
   "evidence": "unknown record/proposal/ticket -> 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 (['record_ingested', 'record_read', 'merge_proposed', 'merge_execute_denied', 'merge_executed', 'merge_unmerged', 'draft_created'] present as a subsequence); 18 receipts, seq strictly increasing, chain valid \u2014 including the merge_execute_denied receipt, so the refusal is audited"
  },
  {
   "id": "U8",
   "name": "bench isolation",
   "verdict": "pass",
   "evidence": "workspace product state byte-identical before/after bench"
  }
 ],
 "notes": [
  "Local scope: C0 core over caller-fed records; no platform is contacted, no credential exists, no send happens here (U3 verifies the no-network claim structurally).",
  "Live platform ingestion and cross-adapter identity proposals are C1 items (manifest not_tested); the mechanics are proven here on bench-owned records."
 ],
 "history": "append-only; prior runs retained in results/"
}