Assignments are human-scored Assessments — no separate submission domain
Status: accepted
Builds on ADR-0001 (QTI is the canonical assessment model), ADR-0010 (native authoring converged
onto QTI — the native standard is retired), ADR-0019 (server-anchored delivery + O1 human-evaluation
routing), ADR-0014 (erasure-is-anonymization), ADR-0012 (OneRoster is a projection, the gradebook is
neutral), and ADR-0022 (Common Cartridge decompose-and-land). Pre-launch and conform-ed is ours
([[feedback_no_legacy_pre_launch]]).
The trigger (and the premise it falsifies)
Section titled “The trigger (and the premise it falsifies)”The question arrived from ADR-0022’s long tail: a Common Cartridge assignment resource has no
native home, so it quarantines — what would it take to land it? The companion analysis
(docs/design/cc-long-tail-landing-analysis.md) sized it as L — “needs a new Assignment +
Submission domain”. Grounding the schema falsifies that premise. The entire chain an assignment
needs already exists and was built for exactly this shape:
assessment_definitionalready carriesdueAt,assignAt,maxScore,gradeCategoryId,scoreScaleId,rubricSchema,deliveryProfile: server-anchored,scoringPolicy: server.assessment_attempt(statesstarted → submitted → evaluated → finalized) is the hand-in container; uploaded files aresubmission_artifactrows (attempt-bound,artifactUri/artifactHash).assessment_scorecarriesevaluationSource: auto | human | hybrid,evaluatedByPersonId,isFinal;feedback_entryis the instructor comment;gradebook_entry’s status enum is literallynot_submitted | submitted | partially_graded | graded | exempt | retracted.- QTI authoring already produces
extendedText(essay) anduploadInteraction(file) items. finalize-servicealready routes a server-anchored attempt with un-auto-scorable items to a non-finalhuman/hybridscore + gradebookpartially_graded(ADR-0019 O1).- Erasure is already wired end-to-end:
submission_artifactiscascade(and the executor returns the artifact URIs so the uploaded files are deleted from Storage),assessment_attempt/gradebook_entry/item_sessionaresever,feedback_entry/gradebook_entry.commentscrub.
The decision
Section titled “The decision”An assignment is not a separate concept. It is an Assessment (ADR-0001) that is server-anchored
and human-scored over a constructed-response (extendedText) and/or uploadInteraction Item. The
learner’s hand-in is an Attempt — never a “Submission” (a banned term, reserved against Attempt in
CONTEXT.md); uploaded files are submission_artifacts; the grade flows through assessment_score
into the neutral gradebook_entry exactly as any other Assessment’s does. No assignment_definition
table, no parallel submission domain, no second gradable concept.
This makes “native assignments” a product feature whose substance is CC-independent — completing
the human-evaluation loop ADR-0019 O1 began — with Common Cartridge assignment import as one thin
entry point on top (the established ADR-0022 “land once the capability exists” pattern). The CONTEXT.md
Assessment entry is updated to record this and to add Assignment to its _Avoid_ list.
Considered options
Section titled “Considered options”- A separate Assignment + Submission domain (rejected). The analysis doc’s original recommendation.
It would duplicate attempt/score/artifact/feedback that already exist, and — fatally — force
gradebook_entryto stop being per-(assessment_definition, person)and become per-(gradable thing, person), bending a core ADR-0012 invariant. It also reintroduces “Submission” as a first-class entity, which CONTEXT.md deliberately bans. Rejected: more code, more concepts, contradicts the glossary and ADR-0001/0010. - Assignment as a QTI Assessment (chosen). Reuses the whole chain; converges with ADR-0001/0010; inherits the already-wired erasure story; the only net-new work is delivering two interactions and completing (not inventing) the human-grading loop.
Consequences
Section titled “Consequences”- A human-grading completion surface must be built —
finalize-serviceflagspendingHumanEvaluationbut nothing completes it. A teacher (offering teacher/co-teacher membership, or org/platform admin) scores each pendingitem_sessionserver-side; the system re-runsaggregateItemSessions(auto subtotal + human scores) → finalassessment_score→ gradebookgraded→ attemptfinalized. This benefits every human/hybrid-scored assessment, not just assignments. - Two interactions become deliverable.
extendedTextInteractionanduploadInteractionhave no Mantine skin today; both are built. Upload uses the established TUS-direct-to-Storage + API-finalize pattern (as qti-item-asset), writingsubmission_artifact, into a new dedicatedlearner-submission-artifactsbucket with owner-scoped RLS — kept separate from authoring/admin buckets because the access + erasure model is learner-PII (a DB-owner migration). - Erasure is tightened, not added.
item_session.response_payloadis currently retained onseverfor item statistics (an ADR-0014 accepted residual-content risk). Assignments make free-text the primary content, so the executor gains a content-aware scrub of free-text/extendedText responses (and upload refs) while retaining MCQ-style numeric/index responses for stats; a guard test enforces it. - No research Consent gate. Grading is operational use under the org’s delegated authority (ADR-0008); Consent attaches only if a submission is later pulled into a Research Projection.
- CC mapping is best-effort and never quarantines the definition. The assignment definition always
lands (instructions → item prompt,
points_possible→maxScore,due_at→dueAt,allowed_attempts→maxAttempts, summative); the submission interaction is best-effort (online_text→ extendedText,online_upload→ uploadInteraction,online_url→ text,on_paper/none→ instructions-only with direct teacher grading,external_tool→ instructions-only + note, since the LTI consumer is deferred). - Sequenced as two increments: (1) native human-graded assignments (grading loop + the two skins +
the erasure scrub), shippable and valuable with zero CC; (2) the thin CC
landAssignmentlayer on top.