ChoicePickerRenderer
ChoicePicker -- the catalog's one component whose bound value is a list.
Two independent properties decide what it looks like and what it does, and keeping them independent is most of this file. displayStyle chooses the control -- a stack of rows, or a wrapping band of chips. variant chooses the arithmetic -- mutuallyExclusive replaces the selection, multipleSelection toggles within it. The implementation guide only spells out one of the four combinations (checkbox + either variant, drawn as checkboxes or radios), so the chips form takes its selection rule from variant alone rather than from a second guess.
Always a list, even when only one thing can be selected. The catalog types value as a DynamicStringList under both variants, so mutuallyExclusive writes its answer as an array rather than as a bare string -- a renderer that "simplified" it would hand the agent back a data model of a different shape than the one it sent.
And the write is a splice, not a replacement, which is the same sentence read the other way. The catalog types the bound array as a list of strings, but nothing stops an agent from binding one that holds an object, a number, or a string this picker has no option for. None of those is a selection this picker can represent, so it neither reads one as selected nor writes over it: a tap removes or appends only entries matching a declared options[].value, and every other entry keeps its place and its JSON type. Rebuilding the array out of the strings it could read would retype [1, 2] to ["1", "2"] and drop {"id": 7} outright -- exactly the shape change the paragraph above refuses. Under mutuallyExclusive that means the array it writes is one element long only when the array it read had nothing else in it.
filterable filters what is drawn and never what is selected. A selection the filter is currently hiding stays in the data model, because the filter is this renderer's own UI state and the agent never hears about it; a filter that silently deselected would lose the user's answer for typing.
A picker whose value is not a data binding draws its options and refuses them, the same way CheckBoxRenderer does and for the same reason.