eval-kit
Scores whether your agent respects human authority, stops when it must, asks when it should.
The gates release · mandated compliance and discretionary precision/recall scored from the trace, never averaged · three reference suites · four adapters (anthropic, openai, http, mock) · file-based, single-user, not a hosted service.GitHub
Install
- Initialize a project
$ npx @eval-kit/core init my-evals
Why it exists
Agent protocols now standardise that an agent CAN pause for approval. Nothing measures whether it does, whether approval actually preceded the irreversible call, or whether the agent asked when it faced a real blocker.
Mandated and discretionary gates are never averaged. Compliance is binary and ordering-sensitive; asking is a precision/recall problem. Collapsing them destroys the only information worth having.
Humans score, not LLMs. Golden truth calibrates reviewers and thresholds. It is not a training signal.
The instrument




In depth
01
The gap regulation left open
The EU AI Act's Article 14 requires human oversight of high-risk systems to be effective, and explicitly names automation bias as something deployers must counter. It does not say how effectiveness is measured, because nothing measures it.
That gap widens as models improve, which is the counterintuitive part. Bainbridge's "Ironies of Automation" (1983) is the canonical statement: the more reliable the automation, the less practiced the human operator, and the worse they perform in exactly the rare cases where they are the last line of defence. The automation-bias literature that follows: Parasuraman and Riley, Skitka, Parasuraman and Manzey, shows vigilance decays in proportion to observed accuracy.
So the better your agent gets, the more the residual error concentrates in cases a fatigued reviewer waves through, and the less any aggregate accuracy number tells you about it. The value of a gate is inversely proportional to how often it fires: one firing on 30% of cases is a bottleneck people route around; one firing on 0.5% is where all the risk lives, where measurement is hardest, and where human skill has most decayed.
02
Two kinds of gate, never averaged
Mandated gates are policy: approval must precede this action. Compliance is binary and ordering-sensitive: confidence is irrelevant, and a 94% compliance rate is not a good score, it is 6% unauthorised actions. The schema records which gates a step triggered, which were honoured, and which were violated.
Discretionary gates are judgment: should the agent have asked here? That is a precision/recall problem, because asking about everything is as much a failure as asking about nothing, and the two error directions carry different costs.
They roll up as three separate numbers: mandated compliance, ask precision, blocker recall, and never into one. Two asymmetries sit underneath, and they resolve differently on purpose. If gate ordering was not captured in the trace, the scorer refuses to score at all, because an instrument that cannot see must not report success. But an approval that does not name what it authorises scores as a violation rather than an error, because that trace can be read, and the honest reading is that nothing was authorised.
03
What the reviewer actually sees
Ordering is the compliance claim, so ordering is drawn rather than summarised. The review surface interleaves the agent's tool calls with its gate events in trace order, and marks an unauthorised call at the row where it happens, naming the gate that covers it.
The two demo runs shipped in the repo make the point without commentary: their task tools, tool-match scores and final outputs are byte-identical, and they differ only in whether authorisation happened. Six gated calls authorised versus six unauthorised. A benchmark scores those two runs the same.
Where a suite declares no gates, the interface says so, "authorization was not assessed", rather than rendering a blank. Absence of measurement is stated, never left to look like a clean result.
04
Where this applies
Anywhere a decision creates an obligation or a record that outlives it: content moderation, customer support, public-sector determinations, and scientific or academic review. The gate is the unit; the domain is an instance.
Known limits are stated up front rather than left implicit. Rare events need large denominators, at a 1% error rate, a hundred error cases means reviewing ten thousand decisions, so you sample at the gate, where escalated cases are already enriched for error. And errors are not randomly distributed: they concentrate in a dialect, a demographic, a document format, so uniform sampling will miss a subgroup while the aggregate looks excellent. Stratified audit is a requirement, not a nice-to-have.
Signature features
Five human-scored dimensions
Five human-scored dimensions per step: explainability, agency preservation, long-term capability, calibration, collaborative performance (0–3 scale + golden truth).
Humans score, not LLMs
LLM-as-judge only as opt-in pre-fill, flagged on every score.
Distractors score the refusal
Tasks marked is_distraction, future-dated papers, unverifiable claims, are pass-when-the-agent-pushes-back.
Tool-call assertions
Per-step expected_tools × actual tool calls (strict/subset/any).
Deterministic replay harness
Deterministic replay harness for diffing runs across model versions.
Local scoring dashboard
Linear-style local scoring dashboard.
Packages
Explore further
The source lives on GitHub. Copy, paste, own. No fork, no vendor lock-in.
The other projects
all projectsHITL Kit
Twenty React primitives for the moment an agent hands control to a person: interrupts, approvals, evidence, and provenance.
MeasurementDeployed at hitlkit.dev · every primitive installs individually via the shadcn CLI · copy, paste, own.
tag-kit
Structured tagging primitives for human-in-the-loop annotation: scoped tags you can aggregate and score, not free-text labels.
Measurement@tag-kit/core (zero runtime deps) · @tag-kit/ui (headless React) · extracted from a real moderation app (inertial).
Collapse
A Claude Code skill-building framework: lessons, notebooks and docs compile into skills and MCP tools, linted and written atomically.
ToolingActive development. Shipped: MDX ingestor with 21 cross-stack reference lessons, notebook ingestor with admonition auto-prefill, template engine with cross-language equivalents + trigger-phrase derivation, atomic persistence, three-tier skill quality linter, and MCP server scaffold generation. One annotation can now become a skill or a working MCP tool.
Hologram
Live observability for Blender → glTF pipelines: an append-only log, a dashboard beside the assets, and an MCP surface for the agent.
ToolingOn PyPI as hologram-gltf · Python 3.10+ · MIT.