This is a naming collision, not a Conform bug and not a react-aria bug. `getInputProps(field, { type: "checkbox" })` returns the DOM attribute names — `defaultChecked` and `required` — because it is written for a real `<input>`. react-aria's Checkbox takes `defaultSelected` and `isRequired`; its Switch takes `defaultSelected` and has no `isRequired` at all, on the grounds that a switch is never unfilled. `filterDOMProps` strips whatever it does not recognise before the props reach the DOM, so the mismatched names simply cease to exist.
Every layer that could have caught it is looking the other way. A JSX spread skips excess-property checking, so TypeScript accepts it (written out by hand the same props give TS2322). React never sees the extra attributes, so there is no unknown-prop warning. The attributes never reach the DOM, so there is nothing to notice in the inspector. The only symptom is behavioural, it appears one round trip later, and it looks like Conform failed to repopulate rather than like the control threw the value away.
Tier 1 states the principle — spread `getInputProps` onto a real `<input>`; onto a component, name the props — but its check cannot see this shape. That check looks for metadata picked off one property at a time (`name={fields.x.name}`), and a spread hands the whole object over without naming anything. This rule is the check for the case where the principle is violated invisibly.
The rule is deliberately two component names wide. The rest of the library was checked rather than assumed: TextField, SearchField, ColorField and RadioGroup take the spread happily (react-aria is uncontrolled through `defaultValue`), Select and ComboBox type `defaultValue` and accept it, and NumberField, Slider, CheckboxGroup, DateField and DatePicker already reject the spread with TS2322 — the type system carries the rule for them. Checkbox and Switch are the only two where the props are wrong *and* nothing says so.
Beware the remedy that mirrors the toggle into a hidden `<input type="hidden" name="terms">` next to it. Two controls with the same name post twice, and Conform's parser reads `{"terms":["on","on"]}` — a value your schema will reject in a way that points nowhere near the cause. No library component does this; it is only reachable by hand-rolling the fix, and the hidden input is banned in app code anyway. Use the variant instead.