From 547836e04b759f6e767ee31c880d40bc95dd0f11 Mon Sep 17 00:00:00 2001 From: "Kevin Carter (via Claude)" Date: Sat, 4 Jul 2026 12:13:13 +0000 Subject: [PATCH] exam: persist exam_response_areas.meta on canvas replace-save (WS-2 item 4) The full-replace save dropped the rich region meta (figure name/description, OMR geometry). Add meta to ResponseAreaPayload + the replace insert so a named context figure survives a round-trip. Pairs with the app carrying name/description through. Co-Authored-By: Claude Opus 4.8 Claude-Session: https://claude.ai/code/session_01GruxHXxfdp4kZCgAMVFgvV --- routers/exam/schemas.py | 3 +++ routers/exam/templates.py | 1 + 2 files changed, 4 insertions(+) diff --git a/routers/exam/schemas.py b/routers/exam/schemas.py index 099de21..9b2e502 100644 --- a/routers/exam/schemas.py +++ b/routers/exam/schemas.py @@ -80,6 +80,9 @@ class ResponseAreaPayload(BaseModel): ] = None # Optional Context differentiation (v1 generic; future graph/chart/data_table/diagram/code_block/passage). context_type: Optional[str] = None + # Rich recognition payload (75-exam-marker-region-meta.sql): figure name/description, OMR geometry, unit… + # Carried on canvas save so a named context figure survives a round-trip. + meta: Optional[Dict[str, Any]] = None source: Literal["manual", "ai"] = "manual" confirmed: bool = True confidence: Optional[float] = Field(default=None, ge=0, le=1) diff --git a/routers/exam/templates.py b/routers/exam/templates.py index 66d0fb8..c4b6d66 100644 --- a/routers/exam/templates.py +++ b/routers/exam/templates.py @@ -1143,6 +1143,7 @@ async def replace_template( "kind": ra.kind, "response_form": ra.response_form, "context_type": ra.context_type, # 73: optional Context differentiation + "meta": ra.meta, # 75: rich recognition payload (name/description/OMR/…) "source": ra.source, "confirmed": ra.confirmed, "confidence": ra.confidence,