docmeta:evals:1.0.0-proposal.2
The question it answers: what must be true of this page? A common vocabulary for per-page quality assertions. Any grader, judge, or CI tool can implement it, and other schemas can compose on top of it.
Four page-level keys. Three carry the reserved eval- prefix, and the
fourth is evals itself. Any other eval-* key at the page root is
rejected.
| Key | Type | Notes |
|---|---|---|
evals |
string, or non-empty list of entries | One assertion, or the list |
eval-suite |
string, non-empty | A named suite from the implementer’s config. On an id collision, the page’s entry wins |
eval-skip |
boolean (default false) | Skip the page’s evals. Tooling reports the skip |
eval-provenance |
list of entries | The machine-proposal trail, one entry per model |
An entry takes one of three forms. It can be a string shorthand, meaning an
AI-judged assertion at error severity. It can be a use: reference to an eval
defined in config. Or it can be an inline definition. An inline definition can
carry:
id(required, kebab-case) andassertiontype:capabilityorregressiongrader, and for AI gradersprovider,model(the judging model) andruns(ensemble runs, 1 to 50)target: what the grader receives. The options arebody(the default, with frontmatter stripped),raw(the file verbatim), andfrontmatter(the parsed frontmatter alone). It can also be an object naming a companion file, withsource: fileplus apathrelative to the page’s directory.weight: a positive number, default 1, that sets how much this eval’s outcome moves an aggregate scoreevidence, andexampleswith one or several pass/fail anchors- the command family:
command,success-exit-codes,timeout-ms,generated-assertion-hash options,severity(error,warning, orinfo; defaulterror),severity-map, andskip
A use: reference may override skip, type, severity, options, and
weight. It may not override provider, model, runs or target. Those say
how the tool executes, and a named eval must read the same bytes on every page
that uses it.
Graders
Section titled “Graders”ai is the default: a model or an agent, chosen per eval with
provider. command runs an executable, with {file} as the page path.
human puts the entry in a review queue. tool:* names an integration,
and that namespace is open. The first three stay closed because schema
conditionals branch on them. ai and human require an assertion.
command requires an assertion or a command. Omitting the command is
the generation contract: tooling generates a check script from the
assertion and writes command and generated-assertion-hash back. An
entry carrying a command must say grader: command, and a hash is never
legal without its command.
Examples
Section titled “Examples”evals: The documented install command matches the current package name.eval-suite: how-toevals: - id: install-command-current assertion: The install command matches the current package name. - id: links-resolve grader: command command: ["npx", "linkinator", "{file}"] - id: install-verified assertion: The Helm install steps produce a Ready operator pod. grader: human severity: warning - id: description-says-what-for assertion: The description says what the reader can do after reading. target: frontmatter weight: 2 runs: 3Design decisions
Section titled “Design decisions”- Flat, like the rest of the family. There is no settings object. The
list is the value, and the settings are page-level
eval-*keys. Because the page root is open, the schema rejects anyeval-*key other than the three above. That gives the root the property a closed container would have: a misspelled key fails instead of being ignored. Inproposal.1this was a request to implementers; one implementer honoured it and one did not, soproposal.2encodes it. - Ids are required on object entries. The string shorthand is the only id-less form. Names derived from position orphan cached verdicts whenever entries move.
- Errors name the actual fault. Entries branch with
if/thenrather thanoneOf, so a misspelled field inside an object is reported against that key instead of collapsing to “must be string”. weightscores; it does not judge. It changes how much an outcome moves a suite or run total, and never the eval’s own pass or fail. The binary outcome is what SARIF, JUnit and findings baselines consume downstream. Zero is excluded: a weightless eval is a silent disable, andskipalready means that, visibly.targetselects the bytes;evidencehints where to look. A deterministic grader has nothing to focus on, but can still be pointed at the frontmatter or a companion file. So the selector is structural, and every grader honours it. The name istargetrather thanfocusfor the same reason: it selects data, and it does not collide withevidence.runsandmodelbelong toaievals. A conditional makesprovider,runsandmodellegal only with theaigrader.runsis capped at 50 because runs multiply cost directly.modelalso lets an eval name a judge other than the model that wrote the page. That turns the self-preference warning thatgenerated-byin ai-context enables into something a tool can act on.eval-provenanceis the family’s machine-proposal trail (see ai-context). Entries are deleted under human review, and a surviving entry means machine-proposed evals nobody has checked.
What reviewers should poke at
Section titled “What reviewers should poke at”Three questions. Is the encoded eval- prefix rejection an acceptable
constraint on the page root? Is the split between closed structural
graders and the open tool:* namespace the right one? (Its artifact-side
counterpart is a fully open list,
for reasons stated there.) And should a page be able to set runs and
model inline at all, given that a use: reference cannot?