docs/plans/2026-03-15-phase-4-table-execution.md
Complete the phase-4 table slice only. Add high-ROI non-React logic coverage for merge-heavy table behavior plus the remaining small sizing and selection helpers in packages/table/src/lib.
table coverage is decent on insert/basic-query seams but still light on the merge cluster that carries the real branchy behavior.mergeTableCellssplitTableCelldeleteRowWhenExpandeddeleteColumnWhenExpandedsetTableColSizesetTableRowSizemoveSelectionFromCelldeleteRowWhenExpanded only removes rows when the expanded selection spans the full row width of the first selected row.deleteColumnWhenExpanded only removes a column when the expanded selection spans both the first and last table rows.task.mdc, testing.mdc, and tdd.mergeTableCellssplitTableCelldeleteRowWhenExpandeddeleteColumnWhenExpandedsetTableColSizesetTableRowSizemoveSelectionFromCellmoveSelectionFromCell so it proves real movement from 21 to 22 instead of accidentally passing with the selection already at the destination.bun test packages/table/src/lib/merge/tableMergeBehavior.spec.tsx packages/table/src/lib/transforms/tableSelectionAndSizing.spec.tsxbun test packages/table/src/libbun run test:slowest -- --top 15 packages/table/src/libpnpm installpnpm turbo build --filter=./packages/table
@platejs/resizablerolldown on Node 20.12.1 calling node:util.styleText with ['underline', 'gray']pnpm turbo typecheck --filter=./packages/tablepnpm lint:fixpackage reality: deleteRowWhenExpanded is narrower than its name sounds. It only deletes rows when the expanded selection covers the full width of the first selected row.package reality: deleteColumnWhenExpanded only deletes a column when the expanded selection spans the first and last rows of the table.package reality: splitTableCell owns missing-row creation, so the honest split test is the row-creation branch, not only the easy “fill an existing row” path.verification blocker: package build is still blocked outside the slice by the same external rolldown + Node 20.12.1 styleText failure, here reached through @platejs/resizable.