Moves the table-pure helpers (no engine selection/normalize/marks
dependencies) from `engine/operations.ts` to `extensions/table/utils.ts`:
- createTableGrid (2×2 default, clamped 1..12 × 1..8)
- tableCellPathFromContainer (3-tuple path resolver)
- tableOptions / tableCellOptions (option-bag readers)
- tableColumnCount (max-cells-across-rows, min 1)
- createEmptyTableRow (N-cell row factory)
- insertTableCellInRow / deleteTableCellFromRow (cell ops over a row)
- WordsTableCellPath type alias
The 6 *mixed* helpers (currentTableCellPath, selectTableCell,
setTableCellTextAlign, updateCurrentTableCell, updateCurrentTable,
preserveTableFormattingSelection) still live in operations.ts — they
read private engine state and can only move once F2.3i full lands a
visitor pattern that injects those engine APIs as parameters.
clampInteger stays duplicated locally in utils.ts (9 LoC, generic
numeric helper) instead of being exported from the engine, to keep
the extension's surface tight. If a third caller emerges, promote to
a shared location.
149/149 tests pass in the full words soma scope. TS check clean in
extensions+engine area.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>