Optionaloptions: ClassifyAnswerOptionsThe (contact type, field) pair a contact annotation binds to, or null — its only identity.
Derived outcome the UI renders; status is the raw at-rest column beside it.
As-persisted numeric-as-string; NULL falls back to the form's default downstream.
annotations.is_exclusive — whether ticking one option unticks the rest. Null means nobody
recorded it, which sends the editor back to matching v1's sentence in annotationPrompt.
Why this field is blank, as a stable code; null for rows written before reasons were persisted.
How many of a sub-field answer's boxes hold a value, from the per-coordinate statuses in the cell — no extra query, no extra payload beyond two integers. Null for a simple answer and for any row written before per-coordinate statuses existed.
Decoded union — see form-answers.codec for the shapes.
Whether "Revert to AI answer" has anything to restore: a human replaced this answer AND the pipeline's own answer is still on the row.
A boolean, not the value. The value is a second full copy of a chart-derived answer and this shape rides
getAnswers, which the review screen polls every five seconds;revertAnswerreads the one row it needs when the button is actually pressed.