The canonical, framework-agnostic table controller — instance #3 of the
BIMETAL component family. Built on @bimetal/headless-core, so it shares the
identity-stable getSnapshot/subscribe contract and the errors-as-state
surface; the framework packages are pure bindings.
createTableController owns every grid decision: column sort, inline cell
editing with focus-commit, search and column filters, add/delete row, selection,
column resize/reorder, virtualization and undo. Ships the ARIA grid contract.
A readOnly controller is a hard guard, not a hidden button: every mutating
intent is refused at the controller, so no binding gap can let a display-only
grid mutate state.
The cut line is the family's: DOM measurement and listener registration belong
to the framework; every if belongs here.