Skip to content

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_definition already carries dueAt, assignAt, maxScore, gradeCategoryId, scoreScaleId, rubricSchema, deliveryProfile: server-anchored, scoringPolicy: server.
  • assessment_attempt (states started → submitted → evaluated → finalized) is the hand-in container; uploaded files are submission_artifact rows (attempt-bound, artifactUri/artifactHash).
  • assessment_score carries evaluationSource: auto | human | hybrid, evaluatedByPersonId, isFinal; feedback_entry is the instructor comment; gradebook_entry’s status enum is literally not_submitted | submitted | partially_graded | graded | exempt | retracted.
  • QTI authoring already produces extendedText (essay) and uploadInteraction (file) items.
  • finalize-service already routes a server-anchored attempt with un-auto-scorable items to a non-final human/hybrid score + gradebook partially_graded (ADR-0019 O1).
  • Erasure is already wired end-to-end: submission_artifact is cascade (and the executor returns the artifact URIs so the uploaded files are deleted from Storage), assessment_attempt/ gradebook_entry/item_session are sever, feedback_entry/gradebook_entry.comment scrub.

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.

  • 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_entry to 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.
  • A human-grading completion surface must be builtfinalize-service flags pendingHumanEvaluation but nothing completes it. A teacher (offering teacher/co-teacher membership, or org/platform admin) scores each pending item_session server-side; the system re-runs aggregateItemSessions (auto subtotal + human scores) → final assessment_score → gradebook graded → attempt finalized. This benefits every human/hybrid-scored assessment, not just assignments.
  • Two interactions become deliverable. extendedTextInteraction and uploadInteraction have no Mantine skin today; both are built. Upload uses the established TUS-direct-to-Storage + API-finalize pattern (as qti-item-asset), writing submission_artifact, into a new dedicated learner-submission-artifacts bucket 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_payload is currently retained on sever for 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_possiblemaxScore, due_atdueAt, allowed_attemptsmaxAttempts, 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 landAssignment layer on top.