The two layers of a report
A hindcast report has an evidence layer and a scoring layer, and the second is tethered to the first. The evidence layer is a set of marked entries, each citing the trajectory:
The scoring layer is one score per dimension. The frame computes a crude corridor centre from the marker counts and rejects any score outside centre ± 0.2. A grader cannot write a number its own evidence does not support.
Null is a verdict, not a gap. An empty evidence base scores null. Writing a number over an empty base rejects the report — and so does hiding an existing evidence base behind a null.
learning.graders.score_band, shipped at 0.2.
Who sees what
Three roles, deliberately kept apart. The barriers are the point: each report-writer sees exactly one trajectory and never another writer’s report, a scorecard, or a trend.
The verifier runs on a different model from the writer on purpose. A report survives only if a different model, asked to attack it, cannot land a blocking finding. Repair rounds are bounded by
learning.graders.crew.repair_rounds, shipped at 5.
All arithmetic is frame math. An agent-written number is never trusted for aggregation. The assessor writes the decision and the rationale; the frame recomputes the numbers and validates the decision against them.
Two modes
The split manifest
The split is the authority on which trajectories are learned from and which are held out. Onesplit.yaml per exam version, versioned with the harness.
The frame checks three things at load:
- Every trajectory in the store appears exactly once.
- No family — the grouping key — appears on both sides.
- Every version carries its rationale.
split_version, and paired comparisons are only valid within one version. Comparing a score from one split version against another is not a comparison.
The scorecard
Aggregation is frame math over the admitted reports. Three rules matter more than the numbers:within-noiseis a first-class decision. It is never rounded up into a win.- Gates dominate scores. A failed gate is not offset by a good score.
- Calibration pools at buckets
0.4and0.7, with a minimum of20observations before a bucket is used.
The gauntlet
Scores tell you how a bank did. The gauntlet asks whether the learning step itself behaves, by running it on controlled input where the correct answer is known by construction.learning.graders.gauntlet.stability_tolerance. Prose being free to differ is deliberate: two runs that reach the same decisions by the same evidence have not disagreed just because they worded it differently.
Related
Development regime
Promoting a learner version
The pipeline
Where grading sits in the chain
pip install leeroo-kapso · Every page as plain text: llms.txt.