contract assurance · 80-formal.md · 81-engineering.md · 82-consumer.md · 83-gate.md · guide · card
Engineering gates and the quality harness
How the tree is written, built and checked: one home per capability, test placement, build
targets and artifacts, and the harness that turns read-path quality into a red or green
verdict. The gate that runs these checks, the target ledger and the release tag live in
spec/83-gate.md.
The tree, the checks over it, and the two verdicts they produce:
structure-tree
One home per capability, the one enforcement decision module, adapters, mirror annotations and derived-artifact checks.
one-hometestEnforcement, control-plane state, credential resolution, statement guarding and visibility each resolve to one implementation in the engine; a surface reaches one through the engine route or the registered view compiling it in.Why
P5duplicated-capabilitytestA surface or crate carrying a second implementation of an engine capability, in any language, or a hand-written copy of an engine constant, raisesCapabilityDuplicated, naming both sites.Why
P5capability-registrytestspec/capabilities.tomlnames each capability ofone-homewith one home path and one or more defining symbols; an absent registry, a missing or doubled capability, an absent home or an undefined symbol raisesCapabilityHomeUnresolved.bound-constanttestA[limit]entry whoselimit-constnames<file>::<NAME>holds a constant that file defines outside tests at the bound, in its unit or another unit of its kind; a mismatch or an absent constant raisesBoundConstantDrift.Why
because the fragment is the one home of a bound’s value, and a constant drifting from it changes behavior while the clause states the old numbercross-languagetestThe crate-graph stage matches Rust, TypeScript, JavaScript and Python functions, types and constants outside a home by name folded to lowercase without separators, against its symbols and its literal constants’ names and values.decision-moduletestOne module owns the enforcement decision; a gateway and the engine reaching the same verdict execute it, compiled native and to WebAssembly from one pinned source.adaptertestA surface with no engine process on its request path implements an adapter against the engine’s ports.Why
P5derivation-checktestA generated artifact declares the check that fails once its source moves, and the gate’s schema stage runs that check.mirror-exemptiontestA review-time restatement of a build-time rule is admitted where its site carries amirrors: <clause id>comment naming the clause it restates; an unannotated restatement staysduplicated-capability.Why
because a reviewer-facing check sometimes restates a rule, and the annotation keeps the engine its one home and the copy traceable to itmirror-unresolvedtestAmirrors:comment in a tracked file undercrates/,tools/orapps/naming no clause ofspec/spec.lock.jsonraisesMirrorUnresolvedin the schema stage, naming the file and line.Why
because an annotation naming nothing exempts a copy while tying it to no rule it could drift from
test
Assertion construction, guard validation, suite placement, test-first and acceptance tests, and the connector test kit.
presence-before-absencetestA test whose central claim is an absence first constructs the condition it names and verifies that condition obtains.Why
P7vacuous-exclusiontestAn exclusion assertion —all, or a negatedany— in a tracked test file undercrates/ortools/, over a collection no earlier statement of its function shows non-empty, raisesVacuousAssertionin the test-first stage.Why
P7guard-fires-both-waystestA guard is validated against the fixture that motivated it and against the state it stands against, passing on the first and failing on the second.one-integration-binarytestA crate’s integration tests compile in one target,tests/integration/main.rs, which declares each suite as a module selected by path.Why
because each file directly undertests/links its own static binary, hundreds of MiB for an engine-linked cratefeature-gated-suitetestA feature-gated suite carries a module-levelcfgattribute at the head of its module file and compiles to nothing while its feature is off.global-state-locktestA suite contending process-global state acquires a named lock the integration binary’s root module owns; every suite touching that state takes the same lock.Why
because a lock declared inside one suite leaves another suite free to race the same stateown-processtestA test needing its own process sits in a top-level file stating why at its site; a thread-scoped log capture is such a test.connector-kittestThe connector authoring toolkit ships a conformance suite — discovery returns valid schemas, an opened table yields a finite stream, a position round-trips — plus recorded-HTTP fixture replay and property tests over position monotonicity.test-firsttestA change altering Rust source undercrates/ortools/adds or alters a test under a package’stests/that fails against the base commit’s source; a change without one raisesTestNotFirst.test-first-scopetestThe test-first stage builds each changed test file’s target against the base source with every feature enabled, then runs exactly the tests under that file’s top-level module; a target failing to compile there counts as failing.base-evidencetestTest-first reports assertion failures, compilation failures and bounded test executions separately; infrastructure faults followbase-unrunnableand supply no failing-test evidence.base-run-boundtestOne test-first execution against the base, its build excluded, runs for at most 300 s; a run past the bound is killed with its process group and counts as failing.base-unrunnabletestA base invocation whose output reports a full disk, an unloadable manifest or an unfetchable dependency raisesTestFirstBaseUnrunnableinstead of a verdict.Why
because such a fault fails at base whatever the tests assert, and reading it as red admits an untested changerefactor-trailertestA commit carrying the trailerTest-First: refactorexempts the source it alters fromtest-first; the rest of the range stays held, and the workspace stage alone holds that commit.Why
because a behavior-preserving change has no failing test to write, and the existing suite is its specificationcomment-onlytestA source file whose diff from the base alters only//comment lines and blank lines needs no test undertest-first, with or without the trailer.Why
because a squash merge drops each commit’s trailer, and a comment change has no behavior a test could observeacceptance-surfacetestAn acceptance test drives a built binary through its command line, MCP or HTTP surface; a workspace package among the acceptance package’s dependencies raisesAcceptanceLinksEngine.
build
Target directories, the engine-linked invocation, linked query functions, build targets, release artifacts and the dependency allowlist.
target-dir-per-stagetestEach cargo stage builds into a target directory of its own, reclaimed once the stage passes.Why
because stages under different feature unification share no artifacts, and peak disk is then one stagecheckout-artifactstest.cargo/config.tomlnames the checkout root, and every workspace package’s build script folds its canonical path into the package fingerprint, so a shared target directory recompiles workspace packages per checkout while unchanged dependencies stay fresh.runtime-checkouttestReusable test helpers resolve the workspace root and tested binary from explicit runtime inputs bound to the invocation; cached helpers carry no compile-time checkout path deciding which source or binary runs.one-engine-buildtestThe workspace stage builds every engine-linked package in one cargo invocation over the union of their features, and the store adapter’s suites resolved withoutreadlink no SQL engine, so the features stage compiles one copy.Why
because one cargo invocation compiles the engine once, and a store-adapter suite asserting through SQL links a second copy into the no-readfeatures runstaged-feature-runstestA defect appearing under one feature combination alone is reached by a staged nightly run, one command per container.linked-query-functionstestColumnar file reading and statement serialization link into every build linking the SQL engine, and the read path loads no extension while serving.runtime-extension-loadtestA read path loading an extension into a binary that statically links the SQL engine raisesExtensionAutoloadRefused.debug-infotestDevelopment and test profiles carry line-tables-only debug information for workspace code and none for dependencies.Why
because every engine-linked test binary embeds the bundled engine, and full debug information multiplies each past a sandbox’s diskrelease-profiletestRelease builds compile with thin link-time optimization, one codegen unit per crate and symbols stripped, and unwind on panic.Why
because the run keeper survives a panicking job only by unwinding to its guardprofile-buildtestThe features stage tests each package under every feature set its manifest lists infeature-runs: each other package has its own nightly check; each binary feature run has separate nightly checks for differential tests and all remaining tests.Why
because one cold build of the binary under one feature set fills most of a stage’s wall clock, and a listed set reaches what none and all misscontainer-imagetestThe repository’sDockerfilebuilds one profile,contextful-fullby default, as a static binary for thePLATFORMandRUST_TARGETits arguments name, and ships it in a shell-free runtime image as a non-root user over a declared store volume.release-imagetestEach profile’s release image is an OCI index of alinux/amd64and alinux/arm64manifest;contextful-ci imageassembles each from the profile’sx86_64oraarch64musl release binary, with theDockerfile’s runtime user, volume and entrypoint.Why
because arm64 hosts pull the same tag natively, and each release cell already holds its target’s binary, so no image compiles twiceimage-binary-mismatchtestA binary whose ELF machine differs from its target’s, or whose program headers name a dynamic interpreter, raisesImageBinaryMismatch, naming the target.Why
because a mislabelled layer runs only under emulation, and a dynamic binary finds no C library in the static runtimetargetstestAll three profiles cross-compile tox86_64-unknown-linux-muslandaarch64-unknown-linux-musl; edge and full also build foraarch64-apple-darwinandx86_64-apple-darwin.windows-targettestWindows targets are excluded from the release matrix; no profile publishes Windows artifacts.wasi-probetestNo profile ships awasm32-wasip2release; a scheduled-tier ledger entry builds the edge profile for it and holds the compressed artifact toedge-budget.release-artifacttestEach profile ships a release archive with a SHA-256 checksum and an SBOM, a package-manager formula and an independently tagged container image; the bare formula name and the install script resolve to the full profile.release-buildertestThe release command usescargo buildby default andcargo zigbuildunder--builder zigbuild, forwarding the selected target and profile features.Why
because Cloudflare Linux builds Darwin targets through Zig while the local release command keeps its native build pathrelease-metadatatestEach release cell writes a JSON record naming its profile, target, archive, SHA-256 digest and SBOM.Why
because distributed release cells need a small authenticated input for formula generationformula-manifesttestThe formula command accepts a manifest covering every release matrix cell once, with matching asset names and SHA-256 digests, and writes formulas and SHA256SUMS without local archives.Why
because one aggregation sandbox need not download every archive to produce formulaslicence-fieldtestEvery workspace package undercrates/ortools/declareslicense = "Apache-2.0", inherited from[workspace.package]; a package declaring another value or none raisesPackageLicenceMissing, naming its manifest.Why
because cargo-deny, cargo-about and SBOM generators read the manifest field, not theLICENSEfile, so an unlicensed package fails a consumer’s licence checkdependency-allowlisttestThe connector authoring dependency allowlist carriesregexandserde_jsonat its depth limit; a profile graph reachingfancy-regex,pcre2,onigorserde_json’sunbounded_depthfeature raisesDependencyAllowlistViolation, naming the profile and path.Why
because a backtracking matcher or a parser without a depth limit lets one hostile record pin a core or exhaust the stack
Scenarios
assurance.build.checkout-artifacts: WHEN checkout A and checkout B build different source into one target directory, THEN B’s integration tests, doctests and binary execute B’s behavior on cold and warm builds, and their shared dependency stays fresh.assurance.build.runtime-checkout: WHEN a helper cached from checkout A receives checkout B’s runtime inputs, THEN its workspace operations and binary execution reach B alone.
evaluate
The read-path quality harness: case format, deterministic metrics and floors, judged dimensions, the reader and the judge.
real-read-pathtestAn evaluation run ingests, indexes, retrieves, reads, judges and scores through the surfaces a caller uses, and the harness adds no storage or runtime primitive.through-the-storetestThe corpus loads through the real store, and the retriever under test callsranked-callwith the options a caller passes.Why
because an unordered full-scan retriever cannot go red when ranking breakspolicy-labelstestAn evaluation corpus carries zone and row-policy labels in its table declarations, and a run reads it through the access-control path under one admitted credential.unlabeled-corpustestA run over a corpus whose tables declare no zone or row policy, with nolocal:zone passed as--zone, raisesEvalCorpusUnlabeledbefore any row lands.case-formattestA case carries an id, a corpus path relative to its case file, a question, tags, and an expected block of answer, artifacts, edges, entities, must-cite, must-abstain, must-not-retrieve, time anchor and recency bound.row-referencetestA case names a row as<table>#<key>, the key joining the row’s declared primary-key values with commas, and the runner keys each returned row the same way.regression-casetestA case taggedregressionis a regression case, and its must-not-retrieve set scoresforbidden-row-rate.corpus-layouttestA corpus is a directory holdingcontextful.toml, its table declarations and policy labels, and onerows/<table>.jsonlper table.run-commandtestcontextful eval run --goldens <file>loads the case file, lands and folds each referenced corpus into a scratch store at--landed-at, the Unix epoch by default, reads every case, and writes the run report.Why
because an undated row landed at the epoch predates every question’s window, so a replay scores alike on any dayentity-commandtestcontextful eval entity-evidence --manifest <file>loads versioned synthetic or licensed adjudicated fixtures throughthrough-the-store, resolving mentions through knowledge cards, following requested predicates through keyed recall, and comparing ordinary ranked evidence retrieval.entity-eligibilitytestBoth entity-evidence arms receive identical evidence admitted by keyed recall under the case anchor and one reader credential; fixed adjudicated tuples grant no answer credit to later, expired, superseded, inaccessible or unresolved evidence.entity-metricstestEntity-evidence reports canonical entity accuracy, eligible-claim recall, ordered relationship-path correctness, citation resolution and appropriate abstention independently under deterministic labels; model judgments occupy separate labels.entity-baselinetestEntity-evidence baselines bind fixture version, manifest digest, corpus digest and run configuration, extendingmetric-pathwithentity_evidence.<arm>.<metric>; versioned ledger entries collectrecordrecords.legstestEach case callsranked-callthree times at limit k: the lexical leg with the question alone, the vector leg with an embedding and an empty query, the hybrid leg with both.stub-embeddertestThe deterministic tier embeds every row and question with a seeded feature-hashing stub embedder; a corpus row or a case carrying its own embedding keeps it.semantic-cachetesttest--semantic-manifesthashes corpus, held-out labels, development queries, configuration, and the model’s license, embedding configuration and artifacts at an immutable revision; a changed, unhashed or symbolically linked input or a second table raisesEvalSemanticCacheUnverifiedbeforethrough-the-store.Why
because model quality needs real vectors whose provenance and inputs survive offline replaysemantic-inputstestA missing, non-finite, zero-norm or mismatched vector, a relocated held-out file, an overlapping development query or a configuration difference raisesEvalSemanticInputRejectedbefore retrieval; every leg consumes the same verified cases and corpus.Why
because a cache fallback or corpus substitution changes the experiment while preserving its namesemantic-reporttestSemantic reports carrydeterministic-tierwith sample counts and case-bootstrap uncertainty; a comparable baseline reports overall and per-slice regressions under the pinned tolerance.semantic-separatetestSemantic quality reports use their own tier and input identity, exclude answer judging and deterministic mechanics verdicts, and compare baselines only for matching corpus, labels, model and configuration identities.run-verdicttestA run holds its report to the floors and, given--baseline, to that file; either red verdict exits non-zero, and--update-baselineappliesraise-onlyon green alone.convertertestEach benchmark and application ground truth converts once into the case format through its own converter, and the runner reads nothing else.systems-metricstestTokens per query, latency and cost report beside the quality figures, bucketed by corpus size in tokens relative to the reader’s context window.checkpointtestA run appends each case’s result as JSONL, and a crash re-runs the in-flight case.run-reporttestA run report carries one field per gated metric, the sample count behind each mean, the run block, the per-slice breakdown, and the tally of cases sampled, dropped and unscored.
deterministic metrics
Ranked metrics and floors computed with no model call.
deterministic-tiertestRecall@k, R-precision, hit-rate@k, reciprocal rank and nDCG@k run with no model call, reported per leg — lexical, vector, hybrid — and per slice.distinct-top-ktestMembership in the top k is distinct, and a repeated id counts once.absent-truthtestA ranked metric over a case with no relevant set is NaN and drops out of every aggregate; an empty ranking against a non-empty relevant set scores zero.precision-floortestPrecision at rank min(k, R), R being the relevant-set size, holds at or above 60 percent.Why
because precision@k caps at R/k, below the floor whenever R is smallforbidden-row-ratetestA row named in a must-not-retrieve set holds at 0 percent of a regression case’s returned rows.duplicate-row-ratetestA repeated table-and-row-key pair holds at 0 percent of the ranking.in-window-ratetestA case declaring a recency bound holds its in-window rate at or above 95 percent.abstentiontestA must-abstain case returns zero rows.truth-per-surfacetestExpected artifacts score the artifact retriever and expected edges score the edge retriever, reported apart; edge truth with no edge surface configured counts in an unscored tally.
judged tier
The reader and the pinned judge score answers through the model endpoint.
judged-dimensionstestThe reading stage adds four judged dimensions: answer accuracy; abstention, as correct-refusal and hallucination-on-unknown rates; citation faithfulness; and temporal correctness against the bitemporal columns.grounded-readertestThe harness reader answers from retrieved rows alone, and the deterministic tier substitutes a stub reader.model-endpointtestThe judge and the reader reach a model throughmodel-endpoint, and the harness holds no credential.judgetestThe judge is one pinned open-weights instruct model, called once per judged item at temperature zero; a judge swap is a full re-baseline.Why
because a majority vote at temperature zero samples one mode and adds cost without reducing variancejudged-runtestcontextful eval run --tier judgedreads and judges every case through the endpoint and model--endpointand--modelname, stamping that model in the run block; the deterministic tier judges with the stubs.cutoff-flagstestcontextful eval runtakes--snapshot,--pretrain-cutoffand--posttrain-cutofffor the reader and--judge-snapshot,--judge-pretrain-cutoffand--judge-posttrain-cutofffor the judge, each cutoff value a month and its tag, as2024-10:documented.judged-cutoffstestA judged run block stamps the reader’s and the judge’s snapshot ids and theircutoffs.Why
because a score from a model trained past a case’s resolution measures recall, not reading
Scenarios
assurance.evaluate.policy-labels: WHEN a regression case names a row another agent owns underowner = subject.agent, THEN no leg returns it and the hybrid forbidden-row rate reads 0.assurance.evaluate.cutoff-flags: WHEN a run passes--pretrain-cutoff 2024-10:documentedand no--posttrain-cutoff, THEN the reader’s post-training cutoff compares as each call’s own instant.assurance.evaluate.judged-cutoffs: WHEN a judged run passes--judge-posttrain-cutoff 2025-03:estimated, THEN the run block carries that cutoff taggedestimatedbeside the judge’s snapshot id.
baseline
Holding a run against committed baselines and absolute floors, intervals, golden custody and case generation.
filetestA baseline file carries a reserved run block{k, tier, model, samples}and one entry per gated metric: a bare number at the run’s dead band, or an object overriding the band.default-dead-bandtestA rate-valued entry with no override gates at a 2 percent dead band.rank-quality-dead-bandtestThe ranked-quality entry gates at a 3 percent dead band.band-unitstestA band carries its metric’s own units, and a count entry is pinned at zero with no band.metric-pathtestAn entry names a metric by the report’s field path:retrieval.<modality>.<metric>,edge_retrieval.<modality>.<metric>,judge.<dimension>,latency_ms,n_cases, orslices.<tag>.before a bare<metric>or any of these butlatency_ms.sample-counttestEvery mean-valued path takes a.nsuffix naming its sample count.Why
because blanking one case’s truth lifts a NaN-filtered mean without moving the case countunresolvable-pathtestA path resolving to nothing, a mean over fewer than 30 cases, a malformed entry or a non-finite band raisesBaselinePathUnresolvedbefore the suite runs.Why
P7run-stamp-drifttestA run block differing from the run’s own configuration raisesBaselineRunStampMismatchbefore the suite runs.Why
P7cutoff-blocktestA judged baseline’s run block carries the reader’s and the judge’s snapshot ids andcutoffs, sorun-stamp-driftrefuses a run under a changed snapshot or cutoff.Why
because a score from a model trained later measures more recall, not better readingintervaltestEach judged figure reports a 95 percent percentile-bootstrap interval over cases from 1000 resamples.raise-onlytestA baseline update runs after every gate and floor passes, moves each improved entry to its measured value, moves none in the worse direction, and adds no path.floors-are-absolutetestAn absolute floor gates independently of every committed value.floor-coveragetestA report lacking a floor’s figure on any leg of itsretrievalsurface breaches that floor; only a forbidden-row or in-window rate over no case holds.offlinetestThe gate is a local command comparing the report against in-tree baselines and floors, reporting both verdicts, with or without a trace store reachable.trace-storetestA trace store records run history and curation staging, and decides no verdict.golden-custodytestVersion-controlled JSONL underevals/cases/is the canonical golden set, one loader is its only ingestion door, and a reviewer’s edit reaches the gate as a change to the tree.answer-key-in-the-storetestAn artifact path normalizing under the evaluation directory, reached by a manifest lint or a connector, raisesGoldenSetIngested.generated-redactiontestA golden mined from a live query or promoted from a labeled outcome passeswrite-timebefore commit; a case it cannot redact raisesGoldenRedactionFailed.promotion-sourcetestOnly an adjudicated outcome label promotes into a golden set; a self-rated row does not.generatorstestThree generators draft candidate cases from the deployment’s store — entity-to-fact-to-edge walks, composed edge chains, and questions about absent entities — and a human approves each before commit.draft-commandtestcontextful eval draftreads the declared entity, fact and edge tables through one admitted session, runs the three generators, and writes their candidates as case lines; it commits nothing.commit-commandtestcontextful eval commitappends each draft an--approve <id>=<reviewer>names, redacted under the declaration’s removal rules, to the named case file; an id the file already holds refuses the commit.held-outtestRetrieval and synthesis are tuned on no gate input.rotationtestThe native set rotates on a cadence, a sample of its truth is reviewed on each rotation, and a comparison across generations resolves through the pinned run stamp.native-gatetestA native benchmark generated from a real corpus is the red or green gate; public benchmark sets run beside it as held-out comparison and decide nothing.public-corporatestA public benchmark corpus enters through a fetch-manifest entry naming its URL, its dataset’s terms and a SHA-256 digest, and is never committed; fetched bytes under another digest raisePublicCorpusDigestMismatch.Why
because a corpus whose bytes drift scores another benchmark under the same nametrace-exporttestA run touching a deployed store with a hosted trace endpoint configured raisesTraceExportOutOfPerimeter; hosted collection serves runs over public or synthetic fixtures alone.
backtest
Historical evaluations, called backtests: bounded cases, model-knowledge controls, label intervals and splits, execution metadata, planted leaks and replayable trajectories. Financial return-series and execution profiles are consumer-selected applications of this flow (domain-neutral).
bounded-casetestA bounded case carries a horizon, an instant each of its reads passes asavailable-as-of; its trajectory is the ordered tool calls, queries and retrieved documents its run records.checkpoint-routetestA reader, derive engine or embedder naming a checkpoint family resolves each bounded case to the newest family checkpoint whose post-trainingcutoffsprecedes the case’s horizon.Why
because date-bounded checkpoints remove memorized outcomes at the sourcecutoff-slicetestA backtest report places each case by its resolution instant minus the reader’s post-training cutoff and states leakage against a declared reference, a cutoff discontinuity or a clean control model, never a bare pre/post gap.cutoff-sensitivitytestThe report repeatscutoff-slicewith eachestimatedcutoff moved across its declared uncertainty interval, and states the minimum detectable effect.Why
because finding no leakage bounds it and does not certify its absencelatest-armtestA case set run under a checkpoint family also runs the family’s latest checkpoint as a paired arm, and the report states the latest-minus-routed difference.Why
because the latest-minus-dated gap isolates the leakage premiumanswer-key-onlytestA judge scores a case resolved before the judge’s post-training cutoff against the case’s stored expected answer alone.Why
because a judge reasoning about an outcome may remember itrun-stamptestBeyondjudged-cutoffs, taken throughcutoff-flags, a backtest run block stamps the derive engine’s and embedder’s snapshot ids and cutoffs, the temperature, seed, prompt digest and tool-schema version.Why
because two runs differing in any of these are two trials, and a report cannot slice on a value it never recordedlabel-intervaltestEvery bounded case declares its label interval[t0, t1], the span its outcome is observed over; a bounded case without one raisesEvalLabelIntervalMissingbefore any of its reads.Why
because purge and embargo need each label’s span, and a label observed past the horizon is the leak itselfsplittestA split purges each training case whose label interval overlaps a test case’s, and embargoes each training case starting within a declared span after a test fold ends.Why
because serially correlated labels carry a test fold’s outcome into adjacent training casestrial-ledgertestA financial return-series profile records each run against its case set as a trial row and computes the deflated Sharpe ratio from trial count, Sharpe variance, series length, skew and kurtosis.Why
because the deflated Sharpe needs every trial’s Sharpe, not a reported countseed-repeatstestA configuration runs its declared repeat count; its repeats count as one trial, and the report shows their spread.universe-tabletestA case evaluating changing membership names a membership table declaring valid time andavailable_time; a case naming literal identifiers reports under a separatefixed-universeslice.Why
because a fixed identifier list names only the members known when the case was writtenfill-instanttestA financial execution profile fills each decision at the first price available strictly after the decision’s recorded instant.execution-componenttestA backtest report stamps its declared execution component’s digest and parameters underdomain-neutral; a report without one raisesEvalExecutionUndeclared.planted-futuretestEach bounded case plants a row available after its horizon in every table it reads; a planted row in the case’s trajectory fails the case.Why
because a planted row proves the bound held on the path the case took, not only in its configurationplanted-delistingtestA financial universe profile plants a member delisted inside its window; the case fails unless its trajectory holds that member’s delisting return.Why
because survivorship shows as a missing delisting return, which no aggregate figure revealsleak-scoretestThe case’s judge model scores each retrieved document 0 to 4 against a reference answer from rows available before the horizon, landing one row per document and case horizon; the report gives Brier per leak tier.trajectory-checktestA bounded case fails when a call in its trajectory lacks thebound-entryattributes, or a retrieved document scores at or above the case’s declared leak threshold.Why
because a bound proves the configuration, and leaked page content passes the boundquery-findingtestA recorded query naming an entity first available after the case’s horizon lands a finding naming the call.Why
because a model that remembers the outcome steers its queries toward ittrajectory-replaytestcontextful eval replay <run>re-serves each recorded response without reading the store and reproduces the run report’s digest.Why
because a backtest a third party cannot re-score is a claim, not evidencereplay-roottestA backtest run report carries the signed audit-chain root covering its run’sbound-entryentries.Why
because the root lets a verifier prove each replayed response is the one the run recorded
Scenarios
assurance.backtest.planted-future: WHEN a bounded case’s trajectory returns the row planted one day after its horizon, THEN the case fails and the report names the call that returned it.
forecast
Probability forecasts over consumer-declared outcomes: freeze instant, settlement, lead time, imputation, coverage, reference baselines and separate scoring tracks. Reference baselines belong to an explicitly selected profile (domain-neutral).
forecast-casetestA forecast case carries a freeze instant, a resolution statement naming its vintage, a resolution instant and a probability answer; a backtest forecast case is abounded-casewhose horizon is its freeze instant.resolved-before-freezetestA backtest forecast case whose resolution instant precedes its freeze instant raisesEvalCaseResolvedBeforeFreeze.Why
because a question picked after its answer is known leaks through its own existencesettlementtestA forecast case settles through the label join withingrace-window, and its scores report ascalibration-reportgroups them.Why
because one settlement path keeps a forecast’s Brier score comparable with an application’s calibrationlead-timetestAn answer recorded less than the case’s declared minimum lead before resolution scores on a separate track.Why
because an answer given near resolution reads the outcome rather than forecasting itreference-baselinetestA consumer-selected profile supplies freeze-instant reference probabilities as available rows, and the report shows each forecaster’s score improvement over that baseline.imputedtestA missing answer scores as probability 0.5 for a dataset case; a reference case instead uses its freeze-instant reference probability.Why
because dropping a missing answer rewards abstaining on hard questionscoverage-floortestA forecaster answering below 95 percent of a round’s cases is reported unranked.Why
because imputation alone still lets a forecaster pick its questionsno-evidence-baselinetestEach round also scores a forecaster given the question text alone, and the report subtracts its Brier score from each forecaster’s.Why
because which questions exist can reveal their answers without any retrievaltracks-separatetestBacktest, prospective, tool-free and tool-using scores never pool into one figure.
Scenarios
assurance.forecast.resolved-before-freeze: WHEN a backtest forecast case freezes on2014-06-01and resolved on2014-05-20, THEN the run raisesEvalCaseResolvedBeforeFreezebefore reading the case.
unsettled: Which consumer-selected reference anchors difficulty-adjusted probability scores across case sets? owner: eval affects: assurance.forecast
Shapes
A baseline file:
{
"_run": { "k": 10, "tier": "judged", "model": "pinned-open-weights", "samples": 1 },
"retrieval.hybrid.recall_at_k": 0.71,
"retrieval.hybrid.recall_at_k.n": 184,
"retrieval.hybrid.ndcg_at_k": { "value": 0.63, "band": 0.03 },
"retrieval.hybrid.ndcg_at_k.n": 184,
"judge.citation_faithfulness": 0.82,
"judge.citation_faithfulness.n": 184,
"latency_ms": { "value": 480, "band": 60 },
"n_cases": 184
}
A case:
{
"id": "edge-chain-0117",
"corpus": "native/r3",
"question": "Which supplier does the northern plant share with the coastal plant?",
"expected": {
"answer": "Meridian Castings",
"artifacts": [["supplier_notes", "b7f1c2"], ["plant_registry", "0a44de"]],
"edges": [["plant:north", "supplied_by", "supplier:meridian"]],
"entities": ["supplier:meridian"],
"must_cite": ["supplier_notes"],
"must_abstain": false,
"time_anchor": "<RFC 3339 instant>"
},
"tags": ["multi_hop", "entity_resolution"]
}