The 11 field types available on an input step, and the modifiers any field can take.
Defined in platform/contracts/src/authoring-fields.ts.
| Type | Stores | Notes |
|---|---|---|
bool | boolean | Checkbox. |
string | string | Single line. |
string-multiline | string | Textarea. |
number | number | |
decimal_string | string | Decimal held as a string to avoid float loss. Use for token amounts. |
datetime | string | |
dropdown | string | Requires values[], or choices.recipe for a list computed from the current instant (see choice lists). |
file-single | file ref | ProcessFileRef; the file itself lives under PROCESS_FILES_ROOT. |
file-multiple | file refs | |
item_list | array of rows | Repeating group. Requires subInputs[]. Nesting is allowed. |
header | nothing | Display only — never written to context. |
header takes headerLevel (section by default, or subsection) and may use
defaultValue as subtitle HTML.
Any field may carry these.
| Modifier | Effect |
|---|---|
title | Label. Required. |
mandatory | Blocks Continue until populated. Hidden and read-only fields are not enforced. |
hint | Tooltip beside the label. |
placeholder | string, string-multiline, number, decimal_string only. |
visibleExpression | Show/hide. A hidden mandatory field does not block. |
values[] | Options for dropdown. Changing them is a template change. |
choices | dropdown only, instead of values[]: { recipe }, an expression over the current instant alone that returns the options. Checked again on the server whenever a value is written. See choice lists. |
permissions[] | Per-field editability (OR). Users without a match see it read-only. Empty or omitted means anyone who can act on the step. Same matching rules as step-level permissions. |
readOnly | Renders as resolved text from defaultValue. This is how view-control fields are built. |
defaultValue | Read-only: the template to resolve. Editable: the initial value. Both support ${path} and {{ expression }}. |
downloadFilename | Read-only fields only. Adds a download button saving resolved defaultValue under this name. Supports {{ expression }} — e.g. payload-{{ todayIsoDate() }}.json. Use for generated payloads instead of copy-paste. |
subInputs[] | item_list only. The fields making up one row. |
An input step's inputs[] accepts either a leaf field or a subroutine reference
(TemplateStepInputSubroutine, domain/shared/src/authoring.ts):
{ type: "subroutine", key: "curve_verify", subroutineId: "safe_ui_verification", params: {…} }
A subroutine is a reusable group of fields defined in TypeScript under
the Domain library, expanded into generic leaf fields at authoring/compilation by
expandTemplateInputSubroutines().
params typically carries prefix, URLs, titles, fieldHints, and mandatoryKeys.
Compare like-for-like compiled presentations or normalized source. Public Process views already contain generic expanded fields; the browser must not re-run domain macro expansion.
An input step writes to context[stepKey], keyed by field key:
context.s01_deal_registration = {
_dealName: "Acme",
_prime: "Spark",
}
Every write appends a StepContextAuditEntry. Fields the caller lacks permission for
are filtered out before the merge — a rejected field write is silently dropped, not an
error.