{
 "tool": "eclipse-cluster-mcp",
 "version": "0.1.0",
 "bench_date": "2026-10-25",
 "bench_version": "0.1.0",
 "environment": "simulator",
 "qualifier": "simulator",
 "verdict": "CERTIFIED(simulator)",
 "checks": [
  {
   "id": "C1",
   "name": "ECDSA-signed image with provenance passes (strict)",
   "verdict": "pass",
   "evidence": "openssl-ECDSA-signed image + DSSE/SLSA provenance -> verdict PASS, all 10 gate checks PASS, receipt seq 1"
  },
  {
   "id": "C2",
   "name": "Ed25519-signed image passes (sig-only policy)",
   "verdict": "pass",
   "evidence": "Ed25519-signed image under policy naming its key -> PASS; provenance checks NA (policy does not require provenance)"
  },
  {
   "id": "C3",
   "name": "unknown signer fails signature_valid",
   "verdict": "pass",
   "evidence": "signature by key B (absent from trust bundle) -> signature_valid FAIL + signer_matches_policy FAIL: an unknown signer fails at the cryptographic check"
  },
  {
   "id": "C4",
   "name": "in-bundle but not-in-policy signer fails distinctly",
   "verdict": "pass",
   "evidence": "signature by key C verifies cryptographically (in trust bundle) but policy names only key-a -> signature_valid PASS, signer_matches_policy FAIL: distinct failure from the unknown-signer case (C3)"
  },
  {
   "id": "C5",
   "name": "unsigned image fails signature_present",
   "verdict": "pass",
   "evidence": "unsigned image -> signature_present FAIL, verdict FAIL (no default pass exists)"
  },
  {
   "id": "C6",
   "name": "tampered payload digest fails binding check",
   "verdict": "pass",
   "evidence": "genuine key-a signature over a payload naming a DIFFERENT image's digest -> signature_valid PASS, payload_digest_matches FAIL: substitution caught at the binding check"
  },
  {
   "id": "C7",
   "name": "missing required provenance fails (strict)",
   "verdict": "pass",
   "evidence": "validly signed image without attestation under the strict policy -> provenance_present FAIL, verdict FAIL (signature alone does not satisfy a provenance requirement)"
  },
  {
   "id": "C8",
   "name": "non-allowlisted registry fails with zero contact",
   "verdict": "pass",
   "evidence": "policy allows ghcr.io only; stub-host image -> registry_allowlisted FAIL and the stub recorded ZERO new requests (the gate made no registry contact)"
  },
  {
   "id": "C9",
   "name": "unreachable registry fails closed, receipted",
   "verdict": "pass",
   "evidence": "allowlisted but unreachable registry (127.0.0.1:1) -> manifest_resolved FAIL, verdict FAIL, and the failure itself is receipted (seq 9)"
  },
  {
   "id": "C11",
   "name": "unknown policy fails closed",
   "verdict": "pass",
   "evidence": "unknown policy_id -> policy_loaded FAIL, verdict FAIL: the gate fails closed rather than inventing a policy"
  },
  {
   "id": "C10",
   "name": "receipt chain valid; tamper detected",
   "verdict": "pass",
   "evidence": "receipt_list chain_valid=true over 10 verdicts; one flipped hex char in a copied ledger -> product read_receipts chain_valid=false (tamper detected)"
  },
  {
   "id": "U1",
   "name": "auth enforced",
   "verdict": "na",
   "evidence": "local stdio transport: no credential layer exists to test; the gate consumes only anonymous registry tokens issued by the registry itself"
  },
  {
   "id": "U2",
   "name": "schema valid",
   "verdict": "pass",
   "evidence": "tools/list returns exactly the 3 tools, each with inputSchema type object + properties + required"
  },
  {
   "id": "U3",
   "name": "read-only registry surface; no unscoped fetch",
   "verdict": "pass",
   "evidence": "registry client issues GET only (no POST/PUT/DELETE/PATCH anywhere); server.py and sigverify.py hold no network code \u2014 all fetching is confined to the registry host parsed from the image reference plus the token realm that registry itself names in its 401 challenge"
  },
  {
   "id": "U4",
   "name": "no secret leak",
   "verdict": "pass",
   "evidence": "no secret patterns and no private-key material in 11 tool outputs (policy_show exposes fingerprints only)"
  },
  {
   "id": "U5",
   "name": "sane errors",
   "verdict": "pass",
   "evidence": "missing image -> error; unknown tool -> error; malformed line survived (policy_show answers); unknown method -> -32601"
  },
  {
   "id": "U6",
   "name": "process health",
   "verdict": "pass",
   "evidence": "initialize answered in 110 ms; ping ok"
  },
  {
   "id": "U7",
   "name": "audit completeness (passes and failures receipted)",
   "verdict": "pass",
   "evidence": "ledger receipts PASS and FAIL verdicts alike (10 entries, every one an image_verification with strictly increasing seq, chain valid) \u2014 failures are audited, not hidden"
  },
  {
   "id": "U8",
   "name": "bench isolation",
   "verdict": "pass",
   "evidence": "workspace product state byte-identical before/after bench"
  }
 ],
 "notes": [
  "Simulator scope: registry is a local stub on loopback serving openssl-signed cosign-layout fixtures; no live registry, no container runtime exists or is required (K0 gate only).",
  "K1-K3 runtime/orchestration phases are not built and are not tested. Keyless/Fulcio signatures are refused by design in v0.1 (covered by C5-family fail-closed paths)."
 ],
 "history": "append-only; prior runs retained in results/"
}