facebook/react · error · Error
476
476
Error message
Expected the form instance to be a HostComponent. This is a bug in React.
What it means
startHostTransition is the reconciler entry react-dom uses when a host <form> starts an action transition (form action={fn} submit, or the reset/submit plumbing behind React-controlled forms). Its contract is that the fiber passed in is a host component; a fiber with any other tag violates that contract, and React reports it as an internal bug rather than a user error.
Source
Thrown at packages/react-reconciler/src/ReactFiberHooks.js:3273
'If this is due to a subscription please re-write it to use React provided hooks. ' +
'Otherwise concurrent mode guarantees are off the table.',
);
}
}
}
}
}
const noop = () => {};
export function startHostTransition<F>(
formFiber: Fiber,
pendingState: TransitionStatus,
action: (F => mixed) | null,
formData: F,
): void {
if (formFiber.tag !== HostComponent) {
throw new Error(
'Expected the form instance to be a HostComponent. This ' +
'is a bug in React.',
);
}
const stateHook = ensureFormComponentIsStateful(formFiber);
const queue: UpdateQueue<
Thenable<TransitionStatus> | TransitionStatus,
BasicStateAction<Thenable<TransitionStatus> | TransitionStatus>,
> = stateHook.queue;
startHostActionTimer(formFiber);
startTransition(
formFiber,
queue,
pendingState,View on GitHub (pinned to eafeac097b)
Solutions
- Make react and react-dom resolve to the exact same version (check the lockfile and dedupe)
- File an issue with the <form action> repro if versions already match
- Audit any custom renderer or library calling startHostTransition/requestFormReset directly
- Reproduce on stable React to confirm it is an experimental-integration issue
Defensive patterns
Strategy: try-catch
Try / catch
// Internal invariant on the form-action path: boundary keeps the rest of the app usable
<ErrorBoundary fallback={<PlainFormWithoutAction/>} onError={(e, info) => fileIssueWithVersions(e, info)}>
<FormWithServerAction />
</ErrorBoundary> Prevention
- Install react and react-dom as exact-matching versions and dedupe the lockfile
- Do not call form-action internals (requestFormReset/startHostTransition) from custom renderer code
- Test form action={fn} flows after every React upgrade
- Keep a working plain onSubmit fallback while form actions are adopted
When it happens
Trigger: The form-action machinery is invoked with a fiber whose tag is not HostComponent — typically from version-skewed react-dom calling a mismatched reconciler, or a custom renderer/wrapper reaching into requestFormReset/startHostTransition for a non-DOM element.
Common situations: Installing react and react-dom from different releases (or duplicated copies resolving differently); forks/custom renderers reusing form-action internals; experimental builds where the form-action protocol changed between packages.
Related errors
- 349
- 485
- Cannot requestFormReset() inside a startGestureTransition. T
- An unsupported type was passed to use(): ${String(usable)}
- Unknown Fiber. Needs to be a function component to inspect h
AI-assisted analysis of facebook/react@eafeac097b (2026-08-21).
Data as JSON: /api/errors/a9ead1ce97b305a8.
Report an issue: GitHub.