Designing a form for a healthcare workflow is not like designing a form for, say, a contact page. The mental model has to be different. A blank field on a contact form means the user didn’t have anything to say. A blank field on an intake form might mean the user didn’t have anything to say, or it might mean the clinician decided the question wasn’t relevant, or it might mean the system asked a question the patient didn’t understand. Those three things have very different clinical implications, and you can’t tell them apart by looking at the data.

The compromise we landed on is to make ‘not asked’ a first-class value, distinct from ‘asked and not answered’ and from ‘asked and answered with empty’. It’s a small thing — a tri-state field instead of nullable — and it adds friction to data entry. But it’s the difference between a downstream report being able to say ‘this patient was screened and the screen was negative’ versus ‘we don’t know whether this patient was screened’. Those are very different sentences.

The other half of the complexity is conditional logic. A real intake form has hundreds of fields, and most of them are hidden most of the time, surfaced only when a previous answer indicates they’re relevant. We model this as a DAG, not as nested if-statements, and that decision has paid for itself many times over. You can reason about a graph; you cannot reason about a thousand-line if block.

Lesson, broadly: in domains where the data leaves the screen and affects a human, the most important questions aren’t about layout or accessibility. They’re about what the empty state means.