{
 "tool": "eclipse-book-mcp",
 "version": "0.1.0",
 "bench_date": "2026-10-25",
 "bench_version": "0.1.0",
 "environment": "local",
 "qualifier": "local",
 "verdict": "CERTIFIED(local)",
 "checks": [
  {
   "id": "B1",
   "name": "criteria edit mid-position: one-word change -> CRITERIA_CHANGED event + receipt; position keeps as-of-entry, flag set",
   "verdict": "pass",
   "evidence": "one-word criteria edit (Gazette->Register) mid-position: ingest returned CRITERIA_CHANGED with distinct old/new hashes; position_get keeps criteria_as_of_entry = v1 verbatim, criteria_current = v2, criteria_changed_since_entry=true; instrument carries 2 criteria versions; a criteria_changed receipt is on the ledger"
  },
  {
   "id": "B2",
   "name": "resolution_verify against a WRONG source refused by name; correct source verifies",
   "verdict": "pass",
   "evidence": "verification naming 'A Random Blog' refused with RESOLUTION_SOURCE_MISMATCH naming the criteria's own source ('Bench Official Gazette'); state stayed REPORTED; verify against the named source -> VERIFIED"
  },
  {
   "id": "B3",
   "name": "DISPUTED blocks verification until cleared",
   "verdict": "pass",
   "evidence": "DISPUTED is first-class: verify with the correct source but no dispute_cleared refused RESOLUTION_DISPUTED; with dispute_cleared=true the same verify promotes to VERIFIED"
  },
  {
   "id": "B4",
   "name": "fee math recomputed independently (all-in buy AND sell, per-unit + total); event-contract max payout attached",
   "verdict": "pass",
   "evidence": "fee math recomputed in Decimal from raw levels (bid 100.00 / ask 100.50, 50bps): buy total 404.01 (fee 2.01, per-unit 101.0025) and sell total 398 (fee 2, per-unit 99.5) match the quote exactly; event-contract quote carries max_payout_for_size=100 for size 100 and the CURRENT verbatim criteria attached"
  },
  {
   "id": "B5",
   "name": "missing schedule AND stale schedule -> FEE_UNVERIFIED while bid/ask still serve",
   "verdict": "pass",
   "evidence": "missing schedule: fee_status NO_SCHEDULE, both all-in fields FEE_UNVERIFIED, bid/ask still served (10 / 10.1); stale schedule (fetched 2026-10-01, 24h freshness, quoted 2026-10-25): fee_status STALE, all-in FEE_UNVERIFIED, price still served \u2014 a wrong number is never quoted; seeded coinbase schedule reads back 60bps FRESH over MCP"
  },
  {
   "id": "B6",
   "name": "probability scan: planted keys in provenance, criteria-object field name, nested trading_window \u2014 never emitted; verbatim carriers refused by name",
   "verdict": "pass",
   "evidence": "provenance: ingest REFUSED PROBABILITY_FIELD_FORBIDDEN; its instrument_get refuses identically (fail-closed read); criteria-object field name: sibling key 'probability_basis' dropped at ingest \u2014 absent from ingest + get outputs; nested trading_window metadata: ingest REFUSED PROBABILITY_FIELD_FORBIDDEN; suite-wide output scan: zero probability-shaped keys emitted in any successful response"
  },
  {
   "id": "B7",
   "name": "UNMAPPED native status preserved verbatim",
   "verdict": "pass",
   "evidence": "native status 'pending_review_bench' (no core mapping supplied) surfaces as status UNMAPPED with the native string preserved verbatim on ingest and get \u2014 never coerced to the nearest familiar state"
  },
  {
   "id": "B8",
   "name": "order_draft: DRAFT only, NOT_EVALUATED mandate note, receipt ref; off-allowlist type refused",
   "verdict": "pass",
   "evidence": "order_draft yields a DRAFT record only: venue_order_id null, mandate_ref null, mandate_pre_eval = NOT_EVALUATED_M0_DATA_ONLY stated on the record, receipt_ref present; type ICEBERG refused ORDER_TYPE_NOT_IN_V1_ALLOWLIST"
  },
  {
   "id": "B9",
   "name": "capability denylist by enumeration: exactly the 17 M0 tools; placement/withdraw/account/advice names refused",
   "verdict": "pass",
   "evidence": "tools/list == exactly the 17 manifest tools; 24 forbidden/invented names (placement, withdraw, transfer, account, api-key, advice, halt/resume, probability_get) each refused -32602; venue_status states order_tools ABSENT + account_tools ABSENT + capability M0_DATA_ONLY"
  },
  {
   "id": "U1",
   "name": "auth enforced",
   "verdict": "na",
   "evidence": "local stdio transport has no credential layer to test \u2014 process ownership is the boundary (the standing U1 note); hosted transport auth is a later phase, owner-gated"
  },
  {
   "id": "U2",
   "name": "schema valid",
   "verdict": "pass",
   "evidence": "all 17 tools carry name + description + object inputSchema with every required field declared in properties"
  },
  {
   "id": "U3",
   "name": "no network surface (source-level)",
   "verdict": "pass",
   "evidence": "source-level scan of server.py + book_engine.py: no socket/urllib/requests/http.client/urlopen tokens \u2014 no network code path exists in M0"
  },
  {
   "id": "U4",
   "name": "no secret leak",
   "verdict": "pass",
   "evidence": "secret-pattern scan over 65 collected responses: clean"
  },
  {
   "id": "U5",
   "name": "sane errors",
   "verdict": "pass",
   "evidence": "unknown instrument -> isError payload INSTRUMENT_NOT_FOUND (no crash, no stack); server answers ping afterwards"
  },
  {
   "id": "U6",
   "name": "process health",
   "verdict": "pass",
   "evidence": "initialize + ping healthy; initialize latency 0.0 ms"
  },
  {
   "id": "U7",
   "name": "audit completeness (receipt chain recomputed independently)",
   "verdict": "pass",
   "evidence": "receipt chain recomputed independently in the suite (sha256 over prev + canonical entry): 19 receipts valid end-to-end, and every lifecycle event type the probes caused is on the ledger"
  },
  {
   "id": "U8",
   "name": "bench isolation",
   "verdict": "pass",
   "evidence": "workspace product state byte-identical before/after bench"
  }
 ],
 "notes": [
  "Local scope: M0 is data-only with no network code path \u2014 all probes ran against bench-owned instruments, books, positions, and fee schedules in /tmp state, driven through the core's own MCP tools.",
  "Live venue reads are NOT tested: no live transport exists in the package; the manifest not_tested carries this verbatim (M1/M2 are owner-gated).",
  "U1 is na: local stdio transport \u2014 process ownership is the boundary; no credential layer exists to test.",
  "Probability-law carriers behaved differently by construction and the card records which: provenance and trading_window are stored verbatim, so the guard REFUSED the ingest (PROBABILITY_FIELD_FORBIDDEN); the criteria object is projected to {text, source_ref} at ingest, so a probability-named sibling field is dropped and appears in no output. The law (never emit) held in all three carriers.",
  "Observation (non-failing): a probability-poisoned provenance ingest raises at the guard AFTER the instrument + receipt are written, so the poisoned instrument persists in state and its instrument_get raises the same refusal \u2014 fail-closed on every read, but the write is not transactional. Recommend the guard run pre-commit at M1 hardening."
 ],
 "history": "append-only; prior runs retained in results/"
}