{
 "tool": "eclipse-meter-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": "retry attribution: chains resolve (retry-of-retry, before-parent, cross-batch, cross-provider)",
   "verdict": "pass",
   "evidence": "retry chains resolve across scrambled order: b-1003 (ingested FIRST, before its parent existed in the batch) -> b-1002 -> b-1001; b-1007 in a LATER batch on a DIFFERENT provider (bench-provider-y) extends the chain cross-batch + cross-provider; root carries no parent"
  },
  {
   "id": "M2",
   "name": "orphan retry degrades honestly; retry share recomputed independently",
   "verdict": "pass",
   "evidence": "orphan retry (parent b-9999-missing) keeps its parent_source_ref, renders parent_resolved=false / parent_call_ref=null \u2014 degraded honestly, never dropped: it is inside the totals and the retry share recomputed independently from raw bench inputs matches exactly (retry 8.5 of 58.75 USD, share 0.1447)"
  },
  {
   "id": "M3",
   "name": "N-CHECK: signed records verify OFFLINE w/ pubkey only, no server state; tamper names the record",
   "verdict": "pass",
   "evidence": "N-CHECK PROVEN: attestation copied out and verified in a fresh process with NO ECLIPSE_METER_* env, NO server state, NO product key \u2014 exported pubkey only: all 13 record signatures + the export signature verify; tampering ONE record's amount fails verification naming exactly that record (cr_055caef80293bd13a96d) and breaks the export signature. Observation: verify per the export note's literal wording ('minus signature' only) verifies 0/13 \u2014 the signed body also excludes signer_fingerprint; note should name both fields (see NOTES)."
  },
  {
   "id": "M4",
   "name": "duplicates: same batch twice skipped by count, totals unchanged",
   "verdict": "pass",
   "evidence": "the full bench batch A re-ingested: accepted=0, duplicates_skipped=6, rollup groups byte-identical before/after, record count still 13 \u2014 no double-count"
  },
  {
   "id": "M5",
   "name": "unit separation: USD vs test_credits vs invented unit never comingled",
   "verdict": "pass",
   "evidence": "rollup units are exactly {USD, test_credits} with independent totals (USD 58.75 / credits 42.5); the bench record carrying an invented 'bench_credits' unit normalized to the adapter's USD \u2014 caller data cannot inject a unit, and no rollup ever sums across units"
  },
  {
   "id": "M6",
   "name": "UNMAPPED kind preserved verbatim (both adapters)",
   "verdict": "pass",
   "evidence": "both unmappable kinds render category UNMAPPED with the native label preserved verbatim (model-api 'cache_write', wallet-ledger 'bench_mystery'), category_mapped=false, and each ingest reported unmapped=1 \u2014 never dropped, never guessed"
  },
  {
   "id": "M7",
   "name": "L8: no figure reachable without methodology_version on any read path",
   "verdict": "pass",
   "evidence": "L8 holds on every read path (5 rollup groupings, record list filtered + full, budget posture, adapter list, receipt list): an independent walker found no dict carrying a figure key (amount/total/spend/budget/remaining/retry/pct/share) without methodology_version in scope; every stored record itself carries methodology_version=meter-1.0"
  },
  {
   "id": "M8",
   "name": "L3: denylist + bench enforcement/budget verbs refused; no budget-setting verb or store exists",
   "verdict": "pass",
   "evidence": "tools/list is exactly the 7 manifest tools; all 55 forbidden names refused -32602 (37 builder L3 denylist + 18 bench-added enforcement/budget shapes incl. set_budget, enforce_budget, block_spend, throttle_agent); budgets exist ONLY as budget_posture call data \u2014 the string '\"budgets\"' appears nowhere in persisted state, so no budget-setting verb or store exists"
  },
  {
   "id": "M9",
   "name": "budget posture: math recomputed incl. boundaries; absent budget = named state",
   "verdict": "pass",
   "evidence": "posture math recomputed independently for 7 bench budgets incl. boundaries: 98.5%% APPROACHING, exactly 100.0%% still APPROACHING (OVER is strictly >100), exactly 80.0%% APPROACHING, 170%% OVER, zero budget -> ZERO_BUDGET with pct_used null (no division, no invented figure), unmatched provider -> spend 0 / UNDER / 0 records; absent budgets arg returns budgets_supplied=0 with the named note \u2014 no zero-budget posture is assumed"
  },
  {
   "id": "M10",
   "name": "key-material probes refused by name, receipted, never stored",
   "verdict": "pass",
   "evidence": "4 key-material shapes refused by name (bare 64-hex as agent, xprv string as provider, 'seed phrase' text as filter, 12-word mnemonic as agent): KEY_MATERIAL_REFUSED on every one, 4 incident receipts written, and no probe value, fragment, or probed record id appears anywhere in persisted state; server alive after"
  },
  {
   "id": "M11",
   "name": "adapter losslessness: raw retained verbatim; normalization field-checked",
   "verdict": "pass",
   "evidence": "losslessness: all 13 bench raw records are retained verbatim (field-for-field equal to what was sent, incl. extra fields input_tokens / model / bench_note), each record's provenance raw_hash matches the storage key of its raw copy; normalized records match independent extraction (agent hash, provider, Decimal amount, ts, native kind) and every record is signed at ingest. Observation: the raw_hash is computed over the raw record PLUS an internal _idx field that is stripped before storage, so the reference is internally consistent but not recomputable from the stored raw alone (see NOTES)"
  },
  {
   "id": "M12",
   "name": "no verdict-y language about spend in any output (observations only)",
   "verdict": "pass",
   "evidence": "verdict-language scan over ALL 29 bench outputs: zero verdict-y terms (wasteful, waste, overspend, overspending, excessive, abuse) outside the standing disclaimers; budget states are arithmetic labels (UNDER/APPROACHING/OVER vs owner-stated figures) and rollup outliers render with standing='observation \u2014 not a verdict...' \u2014 Meter observes, it does not judge spend"
  },
  {
   "id": "U1",
   "name": "auth enforced",
   "verdict": "na",
   "evidence": "local stdio transport; auth is the process ownership boundary (standing house note) \u2014 no credential layer exists in v0"
  },
  {
   "id": "U2",
   "name": "schema valid",
   "verdict": "pass",
   "evidence": "tools/list: 7 tools, each with an object inputSchema + properties; initialize returns serverInfo eclipse-meter 0.1.0"
  },
  {
   "id": "U3",
   "name": "no network surface (source-level)",
   "verdict": "pass",
   "evidence": "source-level: no network token (socket / urllib / requests / http.client / urlopen) in any package .py \u2014 ingest is fixture-transport only, structurally"
  },
  {
   "id": "U4",
   "name": "no secret leak",
   "verdict": "pass",
   "evidence": "secret scan clean over all outputs and the bench state file; the bench private key integer appears in no output"
  },
  {
   "id": "U5",
   "name": "sane errors",
   "verdict": "pass",
   "evidence": "foreseeable errors all named: ADAPTER_NOT_FOUND, INGEST_RECORD_INVALID (missing ts \u2014 Meter invents none), ROLLUP_GROUP_INVALID, LIVE_INGEST_NOT_AVAILABLE (live request refused, never downgraded to fixtures), BUDGET_INVALID (bad scope); an attestation for an unknown agent is a valid empty export, not a crash; no tracebacks, no -32603 anywhere"
  },
  {
   "id": "U6",
   "name": "process health",
   "verdict": "pass",
   "evidence": "ping answers; initialize latency 0 ms recorded"
  },
  {
   "id": "U7",
   "name": "audit completeness (receipt chain)",
   "verdict": "pass",
   "evidence": "fresh ledger: ingest + attest -> exactly 2 receipts in order (meter_ingested, cost_attested), hash chain valid, and receipt_list itself emits none"
  },
  {
   "id": "U8",
   "name": "bench isolation",
   "verdict": "pass",
   "evidence": "workspace product state byte-identical before/after bench"
  }
 ],
 "notes": [
  "Local scope: v0 is fixture-transport only by design \u2014 bench state, bench signing keypair, and all usage batches are bench-owned in /tmp; the builder's fixture batches are never ingested by this suite (own-suite claims were verified against them separately, 17/17 + smoke).",
  "Live provider ingest is NOT BUILT (spec section 5.5, per-adapter credential go) and is not_tested; the live transport request is probed only for its named refusal.",
  "U1 is na: transport is local stdio (auth = process ownership boundary, the standing house note).",
  "N-CHECK (novelty): mechanism = signed, retry-attributed cost records that verify OFFLINE against a pinned key after export. Distinguishing test = M3: the attestation is copied to /tmp and verified in a fresh process with NO server state and NO product key \u2014 only the exported pubkey. A FinOps dashboard export (CSV/picture) cannot pass this test; if Meter's export could not either, the verdict would be NOVELTY_UNPROVEN.",
  "Product observation (non-failing, M3): the export's verify_note says verify over 'record minus signature', but the signed body also excludes signer_fingerprint \u2014 a verifier following the note literally fails on genuine records. Mechanism proven with the correct body; the note should be corrected to name both excluded fields.",
  "Product observation (non-failing, M11): provenance raw_hash is computed over the raw record plus an internal _idx field stripped before storage \u2014 the reference is internally consistent (record hash == storage key, raw retained verbatim) but not independently recomputable from the stored raw alone; hashing the stored form would close it.",
  "Bench-suite self-defect disclosure: run 1 (PARTIAL card retained append-only) had M11 untestable \u2014 the suite assumed raw_hash = sha(sent raw); the engine hashes raw+_idx. Suite corrected to locate stored raws by value and assert internal consistency; no product code was touched."
 ],
 "history": "append-only; prior runs retained in results/"
}