{
 "tool": "eclipse-till-mcp",
 "version": "0.1.0",
 "bench_date": "2026-10-25",
 "bench_version": "0.1.0",
 "environment": "local",
 "qualifier": "local",
 "verdict": "CERTIFIED(local)",
 "checks": [
  {
   "id": "T1",
   "name": "cap semantics: price==cap + all-in>cap refuses; all-in==cap exactly settles",
   "verdict": "pass",
   "evidence": "bench-paid-run: price 50.00 + fee 2.00 + tax 1.50 = all-in 53.50; mandate capped at the PRICE (50.00) refused MANDATE_CAP_EXCEEDED with zero purchases created; mandate capped at exactly the ALL-IN (53.50) settles DELIVERED, mandate_spent = 53.50"
  },
  {
   "id": "T2",
   "name": "quote binding: v1 settles at v1 terms after v2 issues; new quotes bind v2",
   "verdict": "pass",
   "evidence": "v1 quote issued at all-in 53.50; operator sku_pricing_set created v2 (60.00, new terms_hash, supersedes v1, v1 record intact); the live v1 quote still settled at 53.50 with the receipt citing v1 terms_hash; a new quote binds v2 (all-in 62.40)"
  },
  {
   "id": "T3",
   "name": "PRICING_NOT_SET is unbuyable by name",
   "verdict": "pass",
   "evidence": "bench-owned SKU with no pricing record: catalog_price renders purchasable=false / PRICING_NOT_SET (a fact, not a $0) and quote_get refuses by the same name"
  },
  {
   "id": "T4",
   "name": "unknowable tax blocks the quote by name",
   "verdict": "pass",
   "evidence": "SKU with tax status 'unknown': quote_get refused QUOTE_BLOCKED_TAX_BASIS by name \u2014 no quote issued, no zero guessed; the catalog surface carries the same block flag"
  },
  {
   "id": "T5",
   "name": "mandate forgery battery: every refusal by its named class",
   "verdict": "pass",
   "evidence": "wrong-key signature -> MANDATE_SIGNATURE_INVALID; cap altered post-signing -> MANDATE_SIGNATURE_INVALID; seller mismatch -> MANDATE_SELLER_MISMATCH; sku mismatch -> MANDATE_SKU_MISMATCH; allowlist miss -> MANDATE_ALLOWLIST_MISS; expired -> MANDATE_EXPIRED; revoked -> MANDATE_REVOKED; forgery attempts receipted + present in the anomaly queue"
  },
  {
   "id": "T6",
   "name": "mandate replay across two quotes refused by name",
   "verdict": "pass",
   "evidence": "mandate settled quote q-0011; the SAME mandate (id+nonce) presented against a new quote is refused MANDATE_REPLAY naming the bound quote \u2014 idempotency is quote-keyed, never reusable across quotes"
  },
  {
   "id": "T7",
   "name": "idempotency: same-quote retry x3 = one purchase, one ledger entry, spend unchanged",
   "verdict": "pass",
   "evidence": "purchase_execute x3 on one quote+mandate: one purchase_id (p-0004), exactly one seller ledger settlement entry, mandate_spent charged once (62.4)"
  },
  {
   "id": "T8",
   "name": "approval park: identity-bound approval only; park past expiry = EXPIRED, zero charge",
   "verdict": "pass",
   "evidence": "over-threshold purchase parked AWAITING_BUYER_APPROVAL with no settlement and zero spend; approval attempted as a DIFFERENT buyer refused BUYER_APPROVAL_IDENTITY_MISMATCH and the park survived; the parked buyer approved -> DELIVERED, spent = all-in; a second park held past quote expiry -> QUOTE_EXPIRED, purchase EXPIRED, zero charge, no ledger settlement"
  },
  {
   "id": "T9",
   "name": "no pressure / override / custody verbs exist on either surface",
   "verdict": "pass",
   "evidence": "19 pressure/override/custody verb names (nudge, remind, countdown, threshold_nudge, delivery_override, refund_block, mandate_widen, hold_funds, payout, force_delivery, seller_approve, ...) absent from BOTH dispatch tables and refused -32602 by direct call on both surfaces"
  },
  {
   "id": "T10",
   "name": "entitlement: buyer-bound, offline-verifiable, revocation reasoned + cited",
   "verdict": "pass",
   "evidence": "wrong presenter -> ENTITLEMENT_BUYER_MISMATCH by name; rightful presenter verifies; token also verifies (a) standalone against the seller public key with NO Till state and (b) from a server running on a COPY of the state moved to another directory; revocation without a reason refused REVOKE_REASON_REQUIRED; with reason 'bench:fraud-probe' verify fails ENTITLEMENT_REVOKED citing that reason"
  },
  {
   "id": "T11",
   "name": "non-delivery: window lapse auto-refunds on a plain status read, ZERO operator calls",
   "verdict": "pass",
   "evidence": "never-delivers SKU settled ENTITLED; status read at +30s still ENTITLED; plain buyer-surface status read at +61s (window 60s) -> REFUNDED with refund_automatic=true / non_delivery_auto, entitlement revoked in the same transition, compensating ledger entry -31.2, mandate spend restored to 0 \u2014 with ZERO operator-surface calls in the interval (suite op-call log asserted) and no block/override verb in existence (T9)"
  },
  {
   "id": "T12",
   "name": "voluntary refund outside policy refused citing class + window + terms hash",
   "verdict": "pass",
   "evidence": "delivered metered purchase: voluntary refund refused REFUND_POLICY_CLASS citing consumed_metered + the quote's terms_hash; delivered paid-run purchase at window+1s: refused REFUND_OUTSIDE_WINDOW citing unconditional_window(3600s) + terms_hash; both purchases remain DELIVERED \u2014 policy is code, not persuasion"
  },
  {
   "id": "T13",
   "name": "wash purchase settles, flagged, excluded from ranking_input, kept in raw ledger",
   "verdict": "pass",
   "evidence": "seller-anchored (wash) buyer purchase SETTLES DELIVERED \u2014 money is money \u2014 but is flagged related_party in the raw ledger, appears in excluded_from_ranking, is absent from ranking_input (a clean purchase is present), and is queued as a wash_candidate anomaly"
  },
  {
   "id": "T14",
   "name": "value_class 'test' on every artifact (outputs + state scan)",
   "verdict": "pass",
   "evidence": "scanned every bench output payload + the full state file: 170 value_class fields, the set of values is exactly {'test'} \u2014 quotes, purchases, entitlements, receipts, and ledger entries are all sandbox-labeled"
  },
  {
   "id": "T15",
   "name": "surfaces disjoint; operator names on buyer surface = gibberish refusals",
   "verdict": "pass",
   "evidence": "dispatch tables disjoint (10 buyer / 5 operator); all 5 operator names called on the buyer surface return code -32602 with the identical message template as a gibberish name (only the echoed name differs, as it does for gibberish itself) \u2014 no oracle; buyer verbs likewise unknown on the operator surface; operator verbs with a wrong token refused OPERATOR_AUTH_REQUIRED"
  },
  {
   "id": "T16",
   "name": "no Stripe / x402 / network code in the tree (source grep)",
   "verdict": "pass",
   "evidence": "grep over executable code tokens only (comments/docstrings stripped via tokenize) in every .py file in the product tree: zero occurrences of 'stripe' or 'x402' \u2014 the words appear ONLY in prose stating no real rail exists; no Stripe/x402 code in B0, as claimed"
  },
  {
   "id": "U1",
   "name": "auth enforced",
   "verdict": "na",
   "evidence": "local stdio transport \u2014 buyer/operator authority is process ownership in B0 (the standing house U1 note); hosted-transport auth is a B1 design item carried in the manifest not_tested. The fixture operator-token gate that does exist is exercised in T15"
  },
  {
   "id": "U2",
   "name": "schema valid on both surfaces",
   "verdict": "pass",
   "evidence": "tools/list on both surfaces: every tool carries name + inputSchema (10 buyer, 5 operator)"
  },
  {
   "id": "U3",
   "name": "no network surface (source-level)",
   "verdict": "pass",
   "evidence": "source scan of server.py + till_engine.py + signing.py: no urllib/urlopen/requests/http.client/socket/subprocess call sites \u2014 the server is pure local stdio"
  },
  {
   "id": "U4",
   "name": "no secret leak",
   "verdict": "pass",
   "evidence": "secret scan over all bench outputs + the state file: no credential-shaped strings (the seller private key lives only in the bench /tmp key file and is never rendered)"
  },
  {
   "id": "U5",
   "name": "sane errors",
   "verdict": "pass",
   "evidence": "missing-arg call and unknown-tool call both return structured errors; no tracebacks or stack data in any payload"
  },
  {
   "id": "U6",
   "name": "process health",
   "verdict": "pass",
   "evidence": "ping answers on both surface processes; initialize latency recorded at setup (buyer + operator servers healthy)"
  },
  {
   "id": "U7",
   "name": "audit completeness (independent chain verify + two-sided receipts)",
   "verdict": "pass",
   "evidence": "receipt hash chain independently recomputed in-suite (sha256 over prev + canonical entry): 63 receipts valid; buyer_receipt / seller_ledger_entry pairs share settlement refs (two-sided, spec 7.3); forgery violations and pricing-version events are receipted in the same chain"
  },
  {
   "id": "U8",
   "name": "bench isolation",
   "verdict": "pass",
   "evidence": "workspace product state byte-identical before/after bench"
  }
 ],
 "notes": [
  "Local scope: B0 is sandbox-only by design \u2014 the bench catalog, buyers, mandates, operator token, and seller key are all bench-owned fixtures seeded into /tmp state; the builder's fixtures.json is never read by this suite.",
  "B1 real rails (Stripe card, x402) are owner-gated with a counsel note and are not tested; the manifest not_tested list carries them verbatim.",
  "U1 is na: B0 transport is local stdio (auth = process ownership boundary, the standing house note); the fixture operator token gate is exercised functionally in T15/T2."
 ],
 "history": "append-only; prior runs retained in results/"
}