Repeatable List
An ordered list of rows a reader can add to and remove from, each row's fields supplied by the caller. Rows are keyed by an opaque server id, never an index, and both controls are submit buttons so the whole form body travels with them.
Examples
Rows with an opaque key
Each row submits a hidden `keywords.row` field holding its key, repeated in DOM order — the order is read off that repetition rather than from a number that has to be kept in step with it. Naming a row's fields `keywords[0]`, `keywords[1]` instead breaks the moment a middle row goes: the next submit carries 0 and 2, and per-row errors keyed by index then point at the wrong rows.
Nothing added yet
An empty list says so. Without a message it renders as a legend and an add button with nothing between them, which reads as a section that failed to load.
Rejected, with the reason
The message hangs off the fieldset and is announced once, as with the other grouped fields.