Pre-release Harn is pre-1.0 — the language, standard library, and CLI may change between releases. See the release notes

Prompt-cache reports

std/llm/cache_conformance exposes the runtime cache classifier to scripts. It reads provider capabilities and saved usage; it makes no provider requests.

Interface#

report(llm: HarnessLlm, provider: string, model: string, runs: list<unknown>) -> CacheReport

Each run is either a captured usage object or a record containing usage, optional request identity hashes, and optional elapsed_ms. Preserve the captured fields, including omissions. Raw provider usage and normalized Harn usage use the same parser as the cache probe CLI.

The result contains the schema version, resolved support, normalized runs, per-classification counts, aggregate verdict, and dogfood_failure. Input tokens include cache reads and writes; fresh_input_tokens records the uncached portion. Each run retains its raw usage and missing-field evidence.

Missing measurements produce usage_unreported; contradictory counters produce provider_field_inconsistent. Neither is a measured cache miss. An empty report produces insufficient_runs on every route. Inspect the run count alongside the verdict. A first-request cache read produces cache_read_observed, including on local routes without provider prompt-cache controls. A later cache read produces cache_effective; a first-request read alone does not prove repeat-run reliability. If a supported route then reports a prompt-bearing repeat with zero reads, the verdict remains cache_supported_miss; the initial read stays visible in its run and bucket.

import { report } from "std/llm/cache_conformance"

fn main(harness: Harness) {
  const result = report(harness.llm, "anthropic", "claude-sonnet-5", [
    {input_tokens: 40, cache_read_input_tokens: 5000, output_tokens: 8},
  ])
  const run = result.runs[0]
  if run == nil {
    throw "expected one measured run"
  }
  assert_eq(run.usage.input_tokens, 5040)
  assert_eq(run.classification, "cache_effective")
}