This is a fictional training project. A support coordinator wants to preview tickets
from a CSV file before any later import is approved. In this round you write
intent.md to instruct Claude how to implement that feature in a future round.
Do not implement the feature now. Change only intent.md.
The repository already has src/tickets.mjs and its tests. That code is the stable
ticket representation. A future implementation may add only
src/import-tickets.mjs and tests/import-tickets.test.mjs. It must not alter the
existing ticket module, the grading workflow, or Claude's instruction loader.
No UI, database, network calls, file writes or package dependencies are needed.
The proposed preview takes CSV text and returns a result without changing any data:
- Require a
titlecolumn; an optionalprioritycolumn is allowed. Reject other, missing, or duplicate column names and malformed rows withunknown-column. - Trim surrounding whitespace from values. Reject an empty title with
empty-title. - Priorities are
low,normal,urgent; missing or blank priority becomesnormal. Reject anything else withinvalid-priority. - Accept at most 100 data rows. Check this before validating row values; more rows
produces
row-limit. An empty CSV with no header producesunknown-column. - Respect CSV quoting (for example, a title containing a comma).
- Success is
{"tickets":[{"title":"...","priority":"normal"}]}in input order. Failure is{"error":"error-code"}. No partial success is returned. - Verification commands are
npm testandgit diff --check.
Keep the six headings in intent.md: Goal, Scope, Constraints, Plan, Acceptance,
and Verification. Under each, write at least 30 characters of useful, original prose.
Explain the outcome, boundaries, implementation sequence, and observable completion
checks. Tell Claude to ask before implementing or expanding scope. Avoid placeholders.
Include exactly one fenced json block with this contract shape:
{
"schema": 1,
"change": "ticket-csv-preview",
"allowed_changes": ["src/import-tickets.mjs", "tests/import-tickets.test.mjs"],
"protected_paths": ["src/tickets.mjs", ".github/", "CLAUDE.md"],
"non_goals": ["ui", "database", "network"],
"requirements": {
"columns": ["title", "priority"],
"default_priority": "normal",
"valid_priorities": ["low", "normal", "urgent"],
"reject_unknown_columns": true,
"reject_empty_title": true,
"max_rows": 100,
"side_effects": "preview-only"
},
"verification": ["npm test", "git diff --check"],
"approval": "ask-before-implementation",
"acceptance_cases": [
{
"csv": "title,priority\nPrinter issue,urgent\n",
"expected": {"tickets":[{"title":"Printer issue","priority":"urgent"}]}
}
]
}The example contains only one case. Add correctly predicted cases covering all seven
categories: valid explicit priority, default priority, a quoted title containing a
comma, empty title, unknown column, invalid priority, and too many rows. You may use
"repeat": 101 on a one-data-row case to represent 101 copies without a long document.
Otherwise omit repeat; the input is used once. All expected results must be correct.
The JSON gives the checker objective facts to verify; the prose makes the document
useful for a human and Claude. The JSON alone is not a complete intent document.
Twenty published checks are worth five points each (100 total): document structure, Claude import, scope and constraints, contract values, verification/approval, correct examples, and coverage of all seven categories. The trusted checker recomputes the example outputs; writing a desired score or asserting that examples pass has no effect.
This is a deterministic contract score, not an AI judgment of writing quality. During the rehearsal, the facilitator will separately discuss clarity, contradictions, and whether Claude follows the intent. A machine score cannot certify those qualities.
Only intent.md may change from the starter files. Changed scaffolding, symlinks,
oversized input, invalid UTF-8 or an unreadable submission cannot earn an official
passing result. No student code is executed by the checker.