Promise. The output block is the allowlist. An inapplicable field is omitted. An applicable empty field is JSON null. Pages and sections add no data level, so moving a field between steps does not change the JSON.
Absent means absent
A field the person was never asked about does not appear. No nulls to filter out downstream.
Blank means blank
An applicable field the person left empty is null — which is a real answer, not a missing one.
Steps do not add levels
Pages and sections are presentation. Moving a field from step one to step three does not change the JSON.
form intake version = "1.0" {
field postcode {
type = string
when = country == "GB"
}
output {
postcode: string
}
}
A confirmation, a PDF, or an email should be a projection of $form.output. FormScript does not generate the PDF; it makes the payload trustworthy enough to project.