A field the library only shows or hands on reads as itself when it carries the
schema's own type, and as absent (undefined) otherwise: absent, null or of
any other JSON type. A display field never fails the call or the screen enter
that carries it, because a recorded answer is only a sample of what the server
may send (“Reading What the Server Sends: Recorded Answers Are Samples, Not the
Whole Set”).
A field the library itself decides on does not use this: an id it sends in a
later request, a cursor it pages with, a flag that picks a branch stays its own
schema and is required — with one exception. An id on a row of a list is
Shown(IdAsText): a row the server sends without its id is still a row, so
it stays listed under its own identity key (a rowKey: the id, or a positional
fallback), and only the row's action refuses, naming the field — never the
screen's enter or the whole answer. So a screen's data and an answer's decode
schema state the fields the library acts on, wrap every other field in Shown,
and use Shown(IdAsText) for a list row's id. The two-tier rule is written once
in spec/screens-scenario-references-and-openapp.md, next to the open
server-list rule.
The public types follow: a display field is T | undefined, so a caller reads
a missing badge as absent.
A field the library only shows or hands on reads as itself when it carries the schema's own type, and as absent (
undefined) otherwise: absent,nullor of any other JSON type. A display field never fails the call or the screen enter that carries it, because a recorded answer is only a sample of what the server may send (“Reading What the Server Sends: Recorded Answers Are Samples, Not the Whole Set”).A field the library itself decides on does not use this: an id it sends in a later request, a cursor it pages with, a flag that picks a branch stays its own schema and is required — with one exception. An id on a row of a list is
Shown(IdAsText): a row the server sends without its id is still a row, so it stays listed under its own identity key (arowKey: the id, or a positional fallback), and only the row's action refuses, naming the field — never the screen's enter or the whole answer. So a screen'sdataand an answer's decode schema state the fields the library acts on, wrap every other field inShown, and useShown(IdAsText)for a list row's id. The two-tier rule is written once inspec/screens-scenario-references-and-openapp.md, next to the open server-list rule.The public types follow: a display field is
T | undefined, so a caller reads a missing badge as absent.