Define the local evaluation task
A synthetic batch grader requires exactly one candidate for every declared case ID. Candidate values are not graded until missing and extra case IDs are checked. An empty expected set is an invalid evaluation definition; an empty candidate list against three expected cases is incomplete, not a vacuous pass.
- Validate a nonempty expected set
- Find missing and extra candidate IDs
- Only then permit content grading
Coverage failures remain incomplete; do not synthesize outputs for missing cases.
Use the filled cases
| Case | Supplied input | Expected structured output | Decision and reason |
|---|---|---|---|
| Candidate file empty | {"expected":["C1","C2","C3"],"candidates":[]} | {"status":"incomplete","missing":["C1","C2","C3"],"extra":[]} | All three candidates are missing, so no content pass rate is established. |
| All expected IDs present | {"expected":["C1","C2"],"candidates":["C2","C1"]} | {"status":"ready-to-grade","missing":[],"extra":[]} | Coverage is complete; content grading is a subsequent step. |
| Expected case list empty | {"expected":[],"candidates":[]} | {"status":"invalid-definition"} | An empty test definition cannot establish complete evaluated coverage. |
Work the no-evaluation-definition case. Which output is required, and why?
Show the worked answer
{"status":"invalid-definition"} — An empty test definition cannot establish complete evaluated coverage.
Run the self-contained evaluator
import assert from 'node:assert/strict';
function evaluate(x){
if(!x.expected.length)return {status:'invalid-definition'};const missing=x.expected.filter(id=>!x.candidates.includes(id)).sort(),extra=x.candidates.filter(id=>!x.expected.includes(id)).sort();
return {status:missing.length+extra.length?'incomplete':'ready-to-grade',missing,extra};
}
const cases = [
{
"id": "empty-candidates",
"input": {
"expected": [
"C1",
"C2",
"C3"
],
"candidates": []
},
"expected": {
"status": "incomplete",
"missing": [
"C1",
"C2",
"C3"
],
"extra": []
}
},
{
"id": "full-candidates",
"input": {
"expected": [
"C1",
"C2"
],
"candidates": [
"C2",
"C1"
]
},
"expected": {
"status": "ready-to-grade",
"missing": [],
"extra": []
}
},
{
"id": "no-evaluation-definition",
"input": {
"expected": [],
"candidates": []
},
"expected": {
"status": "invalid-definition"
}
}
];
for (const c of cases) assert.deepEqual(evaluate(c.input), c.expected, c.id);
console.log(JSON.stringify({checked:cases.length,caseIds:cases.map(c=>c.id)}));
Use a separate duplicate-key check before this coverage step. A ready-to-grade disposition is not a pass on any candidate’s factual content.