{
 "tool": "eclipse-forecast-mcp",
 "version": "0.1.0",
 "bench_date": "2026-10-25",
 "bench_version": "0.1.0",
 "environment": "local",
 "qualifier": "local",
 "verdict": "CERTIFIED(local)",
 "checks": [
  {
   "id": "F1",
   "name": "token<->outcome SWAP TRAP: outcomes listed No-first, expensive book on the No token \u2014 mapping follows the VENUE arrays (quote direction proves it)",
   "verdict": "pass",
   "evidence": "outcomes listed ['No','Yes'] with clobTokenIds [tok-swap-no, tok-swap-yes] and the No book priced HIGH (0.70/0.72): quote(outcome=Yes) = bid 0.28 / ask 0.30 from tok-swap-yes, quote(outcome=No) = 0.70 / 0.72 from tok-swap-no \u2014 the mapping follows the venue arrays, not price ranking and not a Yes-first assumption; all-in Yes buy recomputed at the seeded 75bps matches"
  },
  {
   "id": "F2",
   "name": "liquidity boundary: $999.50 at best -> THIN; exactly $1,000 and $1,000.50 -> FRAGILE",
   "verdict": "pass",
   "evidence": "liquidity boundary at the core's $1,000 notional-at-best-ask floor: cond-bench-thin-under=THIN@999.5; cond-bench-thin-edge=FRAGILE@1000; cond-bench-thin-over=FRAGILE@1000.5 \u2014 THIN is strictly below the floor, the exact-$1,000 book is FRAGILE, not THIN"
  },
  {
   "id": "F3",
   "name": "money_class REAL on every output that carries one; no PLAY anywhere",
   "verdict": "pass",
   "evidence": "every money_class value across 10 collected adapter outputs is REAL (21 occurrences); no PLAY label anywhere on this real-money venue's surface"
  },
  {
   "id": "F4",
   "name": "edited-fixture criteria flow: position opened pre-edit in shared core state keeps v1; sync names the CRITERIA_CHANGED event",
   "verdict": "pass",
   "evidence": "position opened via the Book core on the shared state BEFORE the edit; forecast_sync(edited) returns exactly one CRITERIA_CHANGED event for the instrument with distinct hashes; the position keeps criteria_as_of_entry = v1 verbatim with criteria_changed_since_entry=true while the market's current criteria is v2 and both versions are retained"
  },
  {
   "id": "F5",
   "name": "DISPUTED resolution is first-class on the adapter surface",
   "verdict": "pass",
   "evidence": "the bench fixture's disputed UMA-shaped resolution surfaces on the adapter as state DISPUTED / verification DISPUTED \u2014 a first-class state, not REPORTED-with-a-footnote and never VERIFIED"
  },
  {
   "id": "F6",
   "name": "circumvention + trading denylist by enumeration; us_trading_surface ABSENT stated",
   "verdict": "pass",
   "evidence": "tools/list == exactly the 8 data tools; 21 forbidden names refused -32602 \u2014 including the circumvention shapes vpn_route / geo_bypass / proxy_route and the trading shapes place_order / trade / create_api_key / account_get; venue_status states us_trading_surface ABSENT"
  },
  {
   "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); live transport auth is a later phase, owner-gated"
  },
  {
   "id": "U2",
   "name": "schema valid",
   "verdict": "pass",
   "evidence": "all 8 tools carry name + description + object inputSchema with required fields declared"
  },
  {
   "id": "U3",
   "name": "no network surface (source-level)",
   "verdict": "pass",
   "evidence": "source-level scan of the adapter server: 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 38 collected responses: clean"
  },
  {
   "id": "U5",
   "name": "sane errors",
   "verdict": "pass",
   "evidence": "unknown market -> isError MARKET_NOT_FOUND (no crash); server answers ping afterwards"
  },
  {
   "id": "U6",
   "name": "process health",
   "verdict": "pass",
   "evidence": "initialize + ping healthy on both the adapter and the shared-state Book client; initialize latency 0.1 ms"
  },
  {
   "id": "U7",
   "name": "audit completeness (shared ledger chain)",
   "verdict": "pass",
   "evidence": "the shared suite ledger, read through the adapter: chain_valid=true over 10 receipts, including the criteria_changed and position_opened events this suite caused through two different servers on one state file"
  },
  {
   "id": "U8",
   "name": "bench isolation",
   "verdict": "pass",
   "evidence": "workspace product state byte-identical before/after bench"
  }
 ],
 "notes": [
  "Local scope: M0 runs over fixture-shaped Gamma/CLOB payloads behind the transport seam \u2014 all probes ran against bench-owned fixture files + bench state in /tmp; no live Gamma/CLOB read was attempted.",
  "Live public reads, Polymarket US (QCX), and UMA state beyond the fixture set are NOT tested; the manifest not_tested carries these verbatim.",
  "U1 is na: local stdio transport \u2014 process ownership is the boundary; no credential layer exists to test.",
  "Cross-adapter parity (same logical book through the Strike Coinbase-shaped path vs this CLOB path, identical normalized Book + identical quote math) is evidenced as check S6 on the Strike scorecard (eclipse-strike-mcp-2026-10-25), which spawns this adapter with parity fixtures.",
  "Fee freshness is deterministic in this suite: quotes pass as_of 2026-10-25T13:00:00Z against the core-seeded polymarket_global schedule (fetched 2026-10-25T00:00Z, 24h freshness) \u2014 FRESH by 13h, stated so the card does not depend on wall-clock run time."
 ],
 "history": "append-only; prior runs retained in results/"
}