The row an AI answer becomes, minus the run it belongs to — the whole translation, so the dry run
produces byte-identical answers without inventing a form_runs id it will never write. status and
noAnswerReason are narrowed to present because this function always decides both; the row type
leaves them optional for the callers that write only some columns.
The row an AI answer becomes, minus the run it belongs to — the whole translation, so the dry run produces byte-identical answers without inventing a
form_runsid it will never write.statusandnoAnswerReasonare narrowed to present because this function always decides both; the row type leaves them optional for the callers that write only some columns.