Bank
{ "format": "exam-bench-bank", "format_version": 1,
"meta": { "title", "presentation", "front_page": [], "answer_sheet": [],
"symbols": { "multiple": "Ψ", "penalty": "" } },
"defaults": { "points": 1, "wrong_discounts": false, "penalty_fraction": 0.5, "penalty_per_option": false },
"taxonomy": { … }, // optional, documents / checks uc: values
"groups": [ { "id", "tag", "symbol", "title", "intro", "outro", "keep_together", "order" } ],
"questions": [ … ] }
Question
{ "id": "def-threat", "type": "single", // single | multiple | open
"active": true, // false = kept, never exported
"tags": ["uc:defensive", "topic:threat-concepts"],
"group": "case-1", // optional: join a group by id
"text": "…",
"score": { "points": 1, "wrong_discounts": true, "penalty": 0.5 },
"choices": [ { "text": "…", "correct": true, "justification": "" },
{ "text": "None of the others.", "correct": false, "fixed": true } ],
"notes": "author-only, never printed" }
- score.wrong_discounts — a wrong answer costs penalty points (default: points × defaults.penalty_fraction)
- score.penalty_per_option — on a multiple question, charge the penalty for each wrong option marked instead of once; the ZipGrade key then lists every combination of options with its points
- tags — lowercase, namespace:value. Questions sharing a group's tag, or a tag ticked in Versions → "Keep together by tag", are never separated
- groups[].symbol — optional mark (e.g. ★) exported as group_symbol on every member, for the template to append to the question
- fixed — choice keeps its place (last) when choices are shuffled; "None of the others/above" is fixed automatically
- open questions have answer_lines, expected_answer, rubric and no choices; they are not on the ZipGrade sheet
- Full reference: exam-bank-spec.md