--========================================================================================== -- 78. exam_questions.command_word + preamble — richer recognition carried by the analyse contract v2 (WS-2) --========================================================================================== -- The extraction service (docling-exam-spike analyse.py v2, scripts/ANALYSE-CONTRACT.md) now carries two -- fields the thin v1 bridge dropped: -- * command_word — the primary command verb per part (calculate / explain / suggest / describe …), from -- structure.command_words / part_info.primary. Drives the question-tree command pill + future filtering. -- * preamble — the stem prose that introduces a question/part (structure.preamble_by_label), as a -- jsonb sidecar {n, text:[…lines], nontext:[{kind,cls,page}], bands:[{page,y0,y1}]}. Kept as jsonb (not -- a column per line) so the tree/doc view can show the stem and the canvas can locate its band. The -- preamble band is ALSO emitted as a drawable context region (context_type='preamble'); this column is -- the authoritative text for the outline view. -- Both nullable; containers/parts without a detected command/preamble stay null. Additive + idempotent. alter table public.exam_questions add column if not exists command_word text; alter table public.exam_questions add column if not exists preamble jsonb; comment on column public.exam_questions.command_word is 'Primary command verb for a leaf part (calculate/explain/suggest/describe/…), from the analyse contract v2 (structure command_words / part_info). Null for container questions or when none detected.'; comment on column public.exam_questions.preamble is 'Stem prose introducing this question/part, from the analyse contract v2 (structure.preamble_by_label): {n, text:[lines], nontext:[{kind,cls,page}], bands:[{page,y0,y1}]}. Authoritative text for the outline view; the band is also drawn as a context_type=preamble region.';