Generated 2026-07-30 from a fresh scan of the 110 issues still open in TanStack/table, cross-referenced against the two 2026-07-26 audits (issues-gpt.md, issues-claude.md) and re-verified against current v9 alpha source (post module-level-fns perf refactor; 9.0.0-beta.61 era, which includes PR #6458 merged 2026-07-29).
- 61 issues can close now without a new PR — including 2 newly fixed by #6458 and 2 duplicates of a canonical selection issue.
- 49 issues should remain open: 10 verified & urgent, 37 valid, 2 needing investigation.
- 115 of the 225 issues from the July 26 audits were closed between then and today; zero new issues have been filed since. Every currently open issue was covered by both prior audits.
- Where the two audits disagreed (27 issues), each was re-adjudicated against current source: 9 resolved to close, 18 to keep open.
- 17 already-open PRs target keep-open issues (see table below); landing or porting them to
alphawould clear roughly a third of the keep-open list.
- v9 baseline:
9.0.0-beta.61(source branch includes the module-level-fns perf refactor) - Method: 9 parallel investigation agents; per-issue checks of issue threads (activity after 2026-07-26), current
packages/table-core/srcsource, and open/merged PRs. No fixes applied, no PRs opened, no repo files modified. - Verdict rule: disagreements between the prior audits were resolved by re-reading current source; "Verified & Urgent" means the defect was re-confirmed live in current code on a default or documented path.
| Category | Count | Recommended action |
|---|---|---|
| Was fixed in V9 | 14 | Close; behavior is correct in current alpha (2 fixed by #6458 this week). |
| Wrong Library Direction | 32 | Close with the documented/headless-library boundary. |
| Junk Issue | 11 | Close as support-only, malformed, user error, or unreproducible-v8-era. |
| Couldn't Reproduce | 2 | Close unless a current minimal reproduction is supplied. |
| Duplicate | 2 | Close as duplicates of canonical #6049. |
| Verified & Urgent | 10 | Keep open and prioritize. |
| Valid | 37 | Keep open; many have fix PRs waiting to land or port. |
| Maybe & Needs Investigation | 2 | Keep only for additional triage. |
| Total | 110 | 61 close candidates; 49 keep open. |
Ranked by user impact. Fixing the top four clusters closes or unblocks ~20 issues.
- #6078 —
process is not definedcrash (Verified & Urgent, high). Rawprocess.env.NODE_ENVreads survive into the publisheddist(packages/table-core/dist/utils.js) becausetsdown.config.tshas nodefine; any bundler-less consumer (importmap/CDN) gets a hardReferenceError, and v9 dropped the v8 UMD escape hatch. PR #6185 targetsmainonly — needs an alpha port. - Global-filter eligibility cluster — canonical #4673 (+ #4783, #4919, #5138). Default
getColumnCanGlobalFilterstill samples onlyflatRows[0]and requires string/number, and the AND incolumn_getCanGlobalFiltermeans explicitenableGlobalFilter: truecan never opt back in — search silently returns nothing. Pending PRs: #6252/#6438 (nullish scan), #6439 (explicit opt-in). One combined fix closes three issues as duplicates. - Parent/child selection reconciliation — canonical #6049 (+ #5116, #5398; close #4878/#5416 as duplicates). Deselecting a descendant never removes the ancestor id, so
getIsSelected()andgetIsSomeSelected()can both be true and the shipped expanding example renders a parent fully checked with an unselected child. One refactor oftable_toggleAllRowsSelected/mutateRowIsSelectedplausibly fixes five open issues plus the closed-set #4349 family. - Auto-reset first-run guard — #5968. v9 dropped v8's
registeredfirst-run guard:memofiresonAfterUpdateon the first computation, so the very firstgetRowModel()schedulestable_autoResetExpanded/table_autoResetPageIndex, wiping controlledexpandedand any initialpageIndexon mount (andtable_resetPageIndex(table, true)hard-codes 0, ignoringinitialState). row._valuesCachenever invalidated — #4485 / #5363 (high).createCoreRowModelmemoizes on[options.data]only, so a newcolumns/accessorFnsilently serves stale values into rendering, sorting, and filtering — the documented "memoize columns" pattern yields wrong data. v8 PR #5582 shows the approach.- #6007 —
inNumberRangematchesnullas 0 (Verified & Urgent, high). NoresolveDataValue, sonull/''/falsecoerce to 0 and pass any zero-spanning range; this is the auto-selected default filter for number columns. PR #6313 open. - #5770 — group-column visibility (Valid, high). Explicit
columnVisibility: { groupId: false }is ignored; Kevin already approved fixing it in the alpha ("Only in the alpha. Want to limit breaking changes in main.") and the alpha is the only window for this breaking change.
| PR | Fixes | Status |
|---|---|---|
| #6439 | #4673/#5138 (explicit enableGlobalFilter opt-in) |
Open |
| #6252 / #6438 | #4783/#4919 (scan past nullish first row) | Open |
| #6431 | #4309 (single-sort replace branch) | Open |
| #6313 | #6007 (exclude non-numeric from inNumberRange) |
Open |
| #6361 | #5987 (maxLeafRowFilterDepth flatRows) |
Open |
| #6417 | #6081 (refresh custom faceted values) | Open |
| #6443 | #5801 (reset expansion on data change) | Open (base beta) |
| #5790 / #6177 | #5173 (isSubRowSelected with unselectable children) |
Open |
| #6075 | #6074 (columnFiltersMeta wipe) |
Open, targets v8 main — needs alpha port |
| #5823 | #5822 (pinned-row lookup crash) | Open since 2024-12, targets v8 — needs alpha port |
| #6185 | #6078 (process.env in dist) |
Open, targets v8 — needs alpha port |
| #6186 | #6077 (Vue empty-string hydration) | Open, targets v8 — needs alpha port |
| #6116 | #6115 (expand-all writes non-expandable ids) | Open, targets v8 — needs alpha port |
| #6184 | #6136 (no-op toggleExpanded rerender) | Open, targets v8 — needs alpha port |
| #6176 | #6175 (example server.allowedHosts) |
Open |
| #5031 | #4703-adjacent pageIndex clamp | Open, targets v8 |
| #5582 | #4485/#5363 (_valuesCache invalidation approach) |
Open, targets v8 — port concept to alpha |
- #4634 — "Cannot update a component while rendering a different component" when filtering with downshift combobox — The warning's source (v8's
useState-backedonStateChangecalling setState during render) no longer exists; v9 holds state in Store atoms, and PR #6458 (merged 2026-07-29) defers render-phase state publication to the commit phase, eliminating this warning class. - #4759 — Cannot toggle selection of grouped row to deselect its children — v9's
row_toggleSelecteddropped v8's early return andmutateRowIsSelectedrecurses into subRows while only writing selectable ids, so an unselectable group row now toggles its children on and off as requested. - #4794 — unnecessary rerenders of every row and cell in examples/react/editable-data — The targeted example no longer exists and the v8 root cause (all state in one
useState) is gone: v9 state is atom-backed withuseTableselectors andtable.Subscribe, demonstrated in the spreadsheet example. The liveflexRender-remount subtopic from recent comments deserves a fresh v9-scoped issue when closing. - #4879 — row selection not working for grouped rows (flat data) — Group rows never enter
rowSelectionin v9 (toggle-all walks pre-grouped flat rows;mutateRowIsSelectedskips unselectable rows), and the example checkbox pattern adopted in #6364 renders both reported flows correctly. - #5026 — Can't perform a React state update on a component that hasn't mounted yet — Kevin's 2026-07-27 comment attributed this to controlled
options.statesyncing during render; PR #6458 (merged 2026-07-29) landed exactly that fix, deferring publication of controlled state to the commit phase. v8 will not be patched. - #5162 — custom Data within expanding example Crashing browser — The v8 crash was the unstable-
dataauto-reset-expanded render loop; in v9table_autoResetExpandedfires only from the grouped row model and pagination resets are no-op-guarded, so the loop cannot occur. - #5605 — cell.getIsAggregated should not check for zero length subrows —
cell_getIsAggregatednow keys offrow.groupingColumnIdplus a resolved aggregation fn with nosubRows.lengthterm, exactly the requested behavior. - #5617 — Unexpected behavior of array filterFns (arrIncludes, arrIncludesAll, arrIncludesSome) —
filterFn_arrIncludesAll/arrIncludesSomenow bail on!Array.isArray(dataValue), and the newfilterFn_arrHascovers the scalar-in-filter-array semantic the reporter proposed. - #5620 — Table v8 expanding - incorrect state of parent checkbox when selecting subrows — The v8
toggleSelectedearly return that skipped clearing children is gone; deselecting a parent now clears its subrows. The remaining half is the documented indeterminate-state pattern. - #5836 — Request: Implement Uncontrolled State Behavior for Expanded Rows — v9's atomic state model delivers observe-without-controlling: leave
onExpandedChangealone and subscribe totable.atoms.expanded(or use an external atom), so the table keeps owning state while the app gets notifications. - #5882 — alpha: getting the memo() function when calling
column.getFacetedUniqueValues()— Fixed during alpha;column_getFacetedUniqueValuesnow returns the invokedMap, and the Qwik context it was reported from no longer exists in v9. - #6158 — Event
onPaginationChangeis triggered on every history push in RSC — Real in v8 (auto-reset calledsetPageIndex(0)with no equality check, producing the URL-sync loop); v9'stable_resetPageIndexreturns early whennewPageIndex === currentPageIndex. - #6224 — alpha:
useTablecauses "Cannot update a component (SubscribeBound) while rendering" after setOptions moved to render body — Fixed by PR #6458 (merged 2026-07-29, in9.0.0-beta.61):useTablenow callstable_setOptions(..., { syncExternalState: false })in the render body and publishes captured controlled state in a layout effect viatable_publishExternalState, so no store subscriber is notified during render. Ask the reporter to confirm on beta.61. - #6450 — "Cannot update a component while rendering a different component" while using controlled expanded state — Duplicate root cause of #6224; PR #6458's summary explicitly cites this issue as the report it fixes. Close as fixed, asking for confirmation on beta.61.
- #4498 — [React] Row selection does not reset after upgrading from v7 to v8 — Row selection is id-keyed and intentionally persists across data changes;
resetRowSelection(),toggleAllRowsSelected(false), and stablegetRowIdare the supported answers, already in the thread. - #4628 — When sorting on date grouped column of year is not taken into account — Group rows sort by the column's aggregated value, and default
aggregationFn: 'auto'resolves tosumfor numbers, so summed timestamps look random;aggregationFn: 'min'/'max'on the date column yields the expected order (test-verified). Intentional pipeline semantics with a config fix. - #4771 — getIsAllRowsSelected returns unexpected result when using manual pagination —
getIsAllRowsSelectedis defined over the loaded rows; the page-aware APIs (getIsAllPageRowsSelected/getToggleAllPageRowsSelectedHandler) are the documented answer. - #4781 — Pagination and Row Selection — Server-side "select all" cannot materialize ids the client never received; v9 also added
toggleAllRowsSelected(false, { deselectAll: true })for clearing unloaded pages. - #4785 — rowSpan doesn't work with useFlexLayout and useResizeColumns — Targets v7's removed plugin hooks; flex/absolute layouts fundamentally cannot preserve native rowSpan semantics, and v7 is frozen.
- #4797 — Manual Pagination doesnt reset PageIndex when Manual Column Filtering. (server-side, v8) — With manual pagination the table cannot distinguish a filter change from a page fetch; the docs explicitly transfer reset policy to the app's filter handler.
- #4812 — Row selection acting strange when using fully controlled table — Under manual pagination
row.iddefaults torow.index, so ids repeat per page; a stablegetRowIdis the documented requirement and resolved the report. - #4848 — incorrect Row ID in "Pagination Controlled" react example — Same root story as #4812; index-default row ids are by design and the targeted v8 example no longer exists in v9.
- #4872 — Use columnOrder and initialize it, then the group column is always at the end —
columnOrderorders leaf column ids by design; seed withgetAllLeafColumns().map(c => c.id). Optional docs clarification only. - #4880 — columnSizing state gets out of sync with actual column sizes when used with a full width table —
columnSizingstores logical widths and table-core never reads DOM geometry; awidth: 100%table's browser-distributed widths will always diverge. The actionable ask underneath is #4825 (flex-redistribution resize) — close into it. - #4905 — Filtered row disappears if its cell value was changed — Filtered row models are pure derivations of data plus filter state; a row edited out of an active filter correctly disappears (reporter concedes as much).
- #4906 — Column pinning inconsistence — Group-column
getIsPinnedis a documented column-level summary; the per-region header-group APIs are the correct rendering signal, which the reporter found. - #4970 — Expanded rows become hidden within the table — Default
paginateExpandedRows: truepaginates sub-rows alongside parents;paginateExpandedRows: falseis the documented option and resolved it for two commenters. - #4994 — Incorrect pagination behavior with autoResetPageIndex set to true when deleting rows — Despite the title, the reporter runs
autoResetPageIndex: falseand expects the table to still adjustpageIndexwhen page count shrinks; the pagination guide documents that opting out means handling resets yourself. The adjacent real clamp gap is tracked by #4703 and PR #5031. - #5120 — Fixed width is not applying for fix width column along with Full width table, Column Resizing and Column visibility. —
column.getSize()is correct; aw-fulltable withtable-layout: autotreats widths as hints. Usetable-layout: fixedwithgetSize()widths. - #5305 — Vue Query's
onPaginationChangehas incorrect union type/unexpected behavior —Updater<T> = T | ((old: T) => T)is the library-wide state contract; the correct narrowing pattern is shown in the v9 Vue table-state guide and in-thread. - #5405 — Unable to access Map entries with array keys by value in getFacetedUniqueValues function — Identity-keyed Map entries for array values are the documented default; the
getUniqueValuescolumn option exists for exactly this case and is documented in the v9 faceting guide. - #5455 —
useQwikTable(options)causes vite to crash in dev mode — The Qwik adapter could not survive Qwik's serialization model and was removed from the repo (commit620590e58); there is no Qwik surface in v9 to fix. - #5500 — sortingFn: 'alphanumeric' returns numbers last — Numbers-after-letters is an intentional branch in the chunked comparator, preserved to avoid silently reordering existing tables; digits-first is a two-line custom sort fn shown in the issue.
- #5536 — useQwikTable undefined sorting handlers [QwikCity] — Qwik's QRL serialization boundary dropped the method-bearing instance; the Qwik adapter was removed in v9 (same territory as #5455).
- #5594 — Grouping by not using subRows — Grouping deliberately operates on the current level and leaves a
getSubRowshierarchy intact; v9's pluggable row-model factories make a recursive groupBy a supported userland customization. - #5710 — when i useing thead Grouping. only set subHeader enableColumnFilter work, parent Column didn't work — Filtering applies to leaf columns with an accessor; a group column has no row value to filter, confirmed by the maintainer in-thread (2024-08-15).
- #5792 — [Feature] Keep sorting order after changing row information — Row models are pure derivations with no mutation tracking;
manualSortingor row pinning give full ordering control in userland. - #5800 — Function getIsSomeSelected() return false when has one child — Documented as "some but not all": with one child selected, all sub-rows are selected, so
falseis correct andgetIsAllSubRowsSelected()returnstrue. - #5870 — Column resizing doesn't respect
clientWidth, bad experience with limited width tables — Core resize math is absolute-pixel correct; the runaway values came from the v8 percentage-based example (not in v9), and clamping to renderedclientWidthrequires DOM measurement a headless core deliberately does not do. - #5935 — New Rows bring from infinite scroll are coming with Expand = False if I collapse any row —
ExpandedStateis eithertrueor an explicit id map by design; the supported escape hatch for defaulting newly-loaded rows to expanded is the documentedgetIsRowExpandedoption. - #6010 — From Docs Full width Resizable example - on resizing a particular column its effecting columns previous to it — The handler writes only the dragged column's size; the neighbor shift is browser auto table-layout on a
width: 100%table. A spreadsheet-style algorithm is a rendering strategy the consumer owns (or lands via #4825). - #6061 — sortUndefined and Excel like sorting —
sortUndefinedmatches literalundefinedonly, by documentation and implementation; normalizingnull/''in anaccessorFnis the intended pattern, already posted in-thread. - #6091 — [Docs] Document how to do pivoting — Pivoting was a v6/v7 plugin removed in v8; there is no inconsistent doc to fix and no built-in pivot API planned. Grouping + aggregation + userland column generation is the answer.
- #6102 — [v7+] Collapse header group — Feature request against EOL v7 for UI-affordance state the library deliberately does not own; buildable from
columnVisibilityplus a placeholder column. - #6109 — Incorrect TanStack Table behavior when using virtualized rows inside hidden tabs — The reporter's own stack trace and proposed guard live in
@tanstack/react-virtual's measurement of adisplay: nonecontainer; refile at TanStack/virtual. - #6243 — Chrome renderer freeze when TanStack row model gates a Suspense child — Table's role is supplying a synchronous
rows.length; the freeze mechanism is a thrown timer-backed promise under Suspense in a Chrome production preview, and no row-model path can wedge a renderer process. Point to stabledatarefs and redirect to facebook/react or Chromium.
- #4901 — Table row count change causes scrolling on Chrome when table is height limited — Pure CSS/Radix layout problem in the reporter's shadcn markup; both in-thread fixes confirmed working by follow-up commenters.
- #4917 — Manual Pagination doesn't update
table.getRowModel().rows- it shows all results — User error answered three times:manualPagination: truedeclares thatdatais already the current page. - #4929 — Infinite loop caused by combining virtual scroll and grouping — Root-caused in-thread to unstable references (
data: data || []per render) triggering the documented auto-reset loop; not a grouping/virtualization interaction. - #4942 — Cell's filterFn never gets called — Column
filterFnruns forcolumnFilters; global filtering deliberately resolves the table-levelglobalFilterFn. The v9 guide now states this explicitly. - #5033 — VSCode Intellisense is very slow with @tanstack/react-table 8.9.2 — Repro field is literally
*; the reporter's own update attributes the slowdown to the surrounding file's other imports. v9 fully rewrote the type graph; invite a refile with a reproducible v9 project. - #5045 — Order + filter with formatted data — Support question with a dead sandbox; raw accessor +
cellformatter + custom per-columnfilterFn/sortingFnalready covers it. - #5047 — react-beautiful-dnd does not work with react-table v8 — Works locally per the reporter, fails only in the sandbox, filed upstream at hello-pangea/dnd#661 and abandoned; Table owns no drag/drop layout.
- #5093 — Dropdown in header fires the sorting fn. — Consumer-side event bubbling from a sort toggle attached to the
<th>;e.stopPropagation()stands and the follow-up supplied no repro. - #5352 — When using virtual tables, high memory usage has always been unable to be reduced. — Feb 2024 v8 solid-table heap screenshots from a third-party Storybook demo; no minimal repro, zero comments in 2.5 years, and v9's prototype-based rows rewrote the allocation profile being measured. Ask for a v9 repro with measurements.
- #6018 — Can react-table v7 be safely used with React 19? — Support question about an EOL major (last release 2022); the supported path is v8/v9.
- #6024 — Performance Issue on table! — Vague 3,000×3,000-cell v8 report with no profile; pagination/virtualization is the answer and nothing is actionable without a fresh v9 repro.
- #4852 — Resizing a column makes other columns resized when changing the size property — A core test shows resizing a leaf writes exactly one
columnSizingentry; residual visual shifting is native full-width CSS layout (conceptually tracked under #4825). - #6048 — enableSortingRemoval doesnt seem to be working with manualSorting — The toggle cycle never consults
manualSortingand a 4-case matrix test cycles removal correctly; neither the reporter nor the Feb 2026 confirmer supplied a repro. The plausible real mechanism (auto-sort-dir flip on server data swap) is tracked by #5147/#5832.
- #4878 — row selection not working for nested rows (
getSubRows) — Half fixed (the #6364 example checkbox pattern covers select-all-children); the remaining half (deselecting a child leaves the parent id inrowSelection) is exactly the root cause tracked by canonical #6049. Close with a pointer. - #5416 — Selection of subrows not working correctly — Both symptoms reduce to the missing upward reconciliation in
mutateRowIsSelected; identical root cause to #6049, which states the scenarios more precisely.
- #4673 — Global filter doesn't run when accessor key points to an object — high; canonical for the global-filter cluster. Default
getColumnCanGlobalFiltersamples onlyflatRows[0]and requires string/number (globalFilteringFeature.ts:30-37), and the AND incolumn_getCanGlobalFiltermeans explicitenableGlobalFilter: truecan never override — a customglobalFilterFnis silently skipped. PR #6439 open. This issue exercises both facets (nullish scan + opt-in), so keep it as canonical. - #4783 — Global Filter Fails When First Row Value is Undefined — high. Same first-row-sampling defect: a column whose row-0 value is
undefined/nullis silently excluded from global filtering, returning empty search results on the default path. PRs #6252/#6438 open. Closeable as duplicate of #4673 once one fix merges. - #4919 — Filter not working if accessorFn returns null for any row — high. The column-filter half is fixed in v9 (
column_getAutoFilterFnscans past nullish), but the global-filter half persists. Same cluster and pending PRs as #4783. - #5173 — row.getIsSomeSelected returning true for row with disabled subrows — medium.
isSubRowSelected(rowSelectionFeature.utils.ts:909-941) still initializesallChildrenSelected = trueand never clears it when all children are non-selectable, returning'all'with zero selected rows and propagating bogussomeSelectedupward. Two open fix PRs (#5790, #6177) — land one on alpha. - #5363 —
getValuecache not invalidating whenaccessorFnis updated — high.row_getValueservesrow._valuesCacheforever andcreateCoreRowModelmemoizes on[options.data]only, so swapping columns/accessorFnsilently feeds stale values into rendering, sorting, and filtering. v8 PR #5582 shows the fix approach; same root cause as #4485/#4702. - #5822 — Pinning aggregation rows then ungrouping causes a hard error — medium.
table_getPinnedRowsstill calls the throwingtable.getRow(rowId, true)unguarded (rowPinningFeature.utils.ts:126), so a pinned synthetic group id crashesgetTopRows()/getBottomRows()after ungrouping. Reporter's fix PR #5823 open and unreviewed since 2024-12. - #5968 — Invoking
table.getRowModel()causes rows to collapse — high. v9 dropped v8's first-run auto-reset guard:memofiresonAfterUpdateon the first computation andcreateGroupedRowModelforcesrowInputsChanged = trueon that first run, so the firstgetRowModel()schedulestable_autoResetExpanded/table_autoResetPageIndex— wiping controlledexpandedand any initialpageIndexon mount (table_resetPageIndex(table, true)hard-codes 0, ignoringinitialState). Canonical survivor of the #5970/#6025/#6030 cluster (all since closed). - #6007 — When using filterVariant: 'range' and filtering with a min value of 0, null values are also included in the results — high.
filterFn_inNumberRangehas noresolveDataValue, sonull/''/falsecoerce to 0 and match any zero-spanning range — and it is the auto-selected default filter for number columns. SiblinginDateRangealready does this correctly. PR #6313 open. - #6049 — Row Selection: Incorrect Parent Row Selection Behavior with Nested Data — high; canonical for the selection-reconciliation cluster. Deselecting descendants never removes the ancestor id and
row_getIsSelectedreads only its own id, so a parent can reportgetIsSelected()andgetIsSomeSelected()true simultaneously; the shipped expanding example renders it fully checked with an unselected child, andgetSelectedRowModel()keeps the stale parent. Close #4878/#5416 into this. - #6078 —
process is not definedwhen used in Vanilla JS (without Node.js) — high. Rawprocess.env.NODE_ENVreads persist in source (~14 sites) and survive into the published build (packages/table-core/dist/utils.js) becausetsdown.config.tshas nodefine; any bundler-less consumer gets a hardReferenceError, and v9 dropped the v8 UMD escape hatch. PR #6185 targets v8mainonly — needs an alpha fix.
High priority
- #4485 — React: accessor function don't trigger when data is outside of exported component — Same
_valuesCachedefect as #5363, kept for the columns-swap case: a brand-newcolumnsarray with a newaccessorFnstill serves stale values, so the documented "memoize columns on a dependency" pattern silently yields wrong data. One invalidation change fixes both. - #5770 — Parent columns in groups are not respecting the isVisible value we're passing in —
column_getIsVisibleshort-circuits oncolumn.columns.lengthand returnschildColumns.some(getIsVisible), so an explicitcolumnVisibility: { groupId: false }is ignored whenever any child is visible. Kevin approved the fix direction in-thread ("Only in the alpha. Want to limit breaking changes in main."); the alpha is the only window and nothing has landed.
Medium priority
- #4309 — toggleSorting preserve the multi selection — In non-multi mode,
replaceis chosen only when the column is not the last sorted entry (rowSortingFeature.utils.ts:253-262), so clicking the last sorted column preserves all other sorts while clicking an earlier one replaces — same gesture, two behaviors. PR #6431 open. - #4825 — implement full width resize handler — The redistribute-delta-into-next-column mode still doesn't exist and is pure
ColumnSizingStatemath (no DOM measurement), so the headless-boundary objection fails. Canonical tracking issue for #4880/#4852/#6010-family demand. - #4946 — enableMultiRemove attribute is invalid —
column_toggleSortingcallscolumn_getNextSortingOrder(column)with nomultiargument, so the documented option is dead on every path including the recommended handler. - #5008 — Median aggregation fails if null values —
aggregationFn_medianbails toundefinedon the first non-number whilemean/sum/min/maxskip nullish values; now documented as-is, making it intentional-by-inertia rather than by design. - #5116 — getToggleAllRowsSelectedHandler doesn't take into account enableSubRowSelection property — Four select-all paths disagree:
table_toggleAllRowsSelectedignoresrow_getCanSelectSubRows, the page variant honors it, andtable_getIsAllPageRowsSelectedstill requires sub-rows selected, so the page header checkbox can never render checked withenableSubRowSelection: false. Contradicts docs; distinct from the #6049 cluster. - #5138 — column.enableGlobalFilter is not considered in the default implemenation of table.getColumnCanGlobalFilter — The opt-in half of the #4673 cluster; PR #6439 targets exactly this. Workaround exists (custom
getColumnCanGlobalFilter), hence medium; closeable as duplicate once the fix lands. - #5147 — Sorting direction not updating properly with manual sorting and same values on current page —
column_getAutoSortDirderives direction fromflatRows[0]only, so a manual-sorting server data swap flips the toggle cycle and silently drops a state.sortDescFirstis the documented workaround; shares root cause with #5832. - #5202 — The header object has the 'rowSpan' property, but there is an issue where it is not applied —
Header.rowSpanis 0 for every header in every table shape (buildHeaderGroups.tsupdateHeaderSpans); dead public API that should be implemented or removed before v9 stable. - #5397 — there is a bug when you try sticky pin column group —
table_getColumnOffsetsbuilds offsets from visible leaf columns only, socolumn_getStart/getAfterfall through to?? 0for group columns and pinned group headers stack at offset 0.header.getStart()is correct, giving a workaround. - #5398 — Toggle select all rows doesn't respect
canSelect()condition — Deselect branches unconditionally delete while select branches guard onrow_getCanSelect; a commenter documents the guard existed in PR #5061 commit b76bb8d and was dropped in 42f7595 — a regression, not a design decision. - #5497 — Column visibility APIs do not work with column groups —
column_toggleVisibilitywrites a dead state key for group ids whilecolumn_getIsVisiblederives from children, andcolumn_getCanHideadvertises hideability it cannot deliver. - #5653 — Custom sortingFn not being run when row key is undefined — The default
sortUndefined: 1short-circuits before invoking the user's sortFn for undefined pairs, anddocs/framework/react/guide/sorting.md:430describesfalseincorrectly ("considered tied" vs actually passing undefined through). At minimum a docs defect plus a legitimate pass-through-mode request. - #5778 — ColumnGrouping.getDefaultColumnDef should not return aggregatedCell — The aggregation feature unconditionally injects a default
aggregatedCelland FlexRender resolvesaggregatedCell ?? cell, so a user'scellformatter can never win on aggregated cells without theaggregatedCell: nullworkaround. Small breaking change that belongs in the alpha. - #5801 — autoResetExpanded not reset the expanded state on data change in V8 — In v9,
table_autoResetExpandedis wired only from the grouped row model, so expanding-without-grouping never auto-resets on data change. Fix PR #6443 (basebeta) implements the audit's fix note; close via that PR when it lands. - #5832 — Unexpected sorting behavior arises due to the implementation in the @tanstack/table-core library — Same
column_getAutoSortDirfirst-row sampling as #5147: a leading null flips the auto direction and the cycle silently drops a state. - #5833 —
flatRowscontains duplicate sub-rows when pagination is enabled —_createPaginatedRowModel's walk pushes each row then recurses intosubRows, butrowsis alreadyexpandRows()-flattened, so expanded children land inflatRowstwice. - #5908 — Wrong type for
GlobalFilterTableState—globalFilter: anylets a nested{ globalFilter }object type-check viasatisfiesand silently misbehave, and theanypoisonsTableState. Widen tounknownor a threaded generic during the alpha. - #5971 —
Table<RowType>is not assignable toTable<unknown>— Re-verified with a scratch tsc 6.0.3 compile: assignment still fails throughoptionsStoreatom invariance into contravariant option callbacks. The variance programme already fixed Table→Table_Internal; finishing the job fits current maintainer direction. - #5987 — getFacetedRowModel inconsistently respects maxLeafRowFilterDepth: 0 —
filterRowModelFromRootkeeps parents' originalsubRowsbut never pushes those descendants intoflatRows/rowsById, so facet counts under-count. PR #6361 open. - #6074 — filterFromLeafRows causes columnFiltersMeta to get wiped —
filterRowModelFromLeafscopies onlycolumnFilterswhen rebuilding rows, droppingcolumnFiltersMetaand breaking the fuzzy-filter + rank-sort recipe. One-line fix; PR #6075 (v8) needs an alpha port. - #6081 — Custom
getFacetedUniqueValuesdoes not update on rerenders — Two cache layers freeze server-side faceting results (per-column factory cache +memoDeps: [facetedRowModel.flatRows]), making the documented "Custom Server-Side Faceting" recipe non-functional. PR #6417 open. - #6101 —
filterFn.autoRemoveignored for empty strings —shouldAutoRemoveFilterORs the customautoRemoveresult with a hardcoded empty-string check, so a customautoRemovereturning false for''can never win — filtering for empty strings is impossible. - #6115 — Expanding API including rows that dont include a subRow —
row_toggleExpandedmaterializesexpanded === trueby writing every id fromrowsByIdwith no expandability filter, polluting state and skewinggetExpandedDepth. PR #6116 (v8) needs an alpha port. - #6230 — HeaderContext and CellContext types should use ReactTable —
CellContext.tableis typed as coreTablewhile the runtime object in React carriesSubscribe/FlexRender, and docs pushtable.Subscribeinside cell renderers, so users hit type errors on real APIs. Kevin acknowledged the gap in-thread (2026-04-29); fix lives in the adapter via module augmentation, not core.
Low priority
- #4512 — Column resizing on scaled transformation —
header_getResizeHandlercaptures raw viewportclientXwith no scale input, so resizing drifts by the factor k undertransform: scale(k). Needs an API decision (scale option or derived scale). - #4939 — setting
enableExpandinghas no effect. —row_toggleExpandedandtable_toggleAllRowsExpandednever consultrow_getCanExpand, unlike the selection twin which guards its imperative path. Cross-feature inconsistency, trivial fix; the documented handler path works. - #5019 — Solid Table: Examples from docs cause unnecessary rerenders of components when data updates — Every v9 Solid example still uses
<For>, which recreates all row DOM on data change, and the Solid guides contain no<Index>/<Key>/createStoreguidance. Docs plus one fine-grained example; the in-thread solution works. - #5275 — A table doesn't get updated when a defaultColumn changes —
constructColumnbakes the default def in at construction whilegetAllColumnsmemoizes on[options.columns]only, yetgetDefaultColumnDefitself re-memoizes on[options.defaultColumn]— the table reports the new default while columns keep the old one. Defect or docs gap; fix has a tradeoff around inlinedefaultColumnobjects. - #5850 — Table: Row selection is not cleaned up when table data is removed. — By-design as filed, but the thread converged on
table.removeRowSelection(ids)which Kevin explicitly agreed to add to the v9 alpha; no such helper exists yet. Keep as an accepted enhancement. - #5864 — Add
mode()aggregation function to find most common unique value. — Tree-shakeable individual aggregation fns make this near-zero-cost; the reporter supplied a tested implementation. - #5909 — TableState does not account for options.state properties being set as undefined —
table_syncExternalStateToBaseAtomsstill writesundefinedslices into base atoms with no guard (survives the #6458 refactor), violating the non-optionalTableStatetype. Downstream code is defensive, so a type-contract violation rather than a visible failure. - #6077 — [Vue] Hydration error in
FlexRenderwhen column is an empty string — VueflexRenderreturns string results verbatim, so an empty-string cell produces an SSR text-node mismatch. PR #6186 (v8) needs an alpha port. - #6136 — Calling row.toggleExpanded(bool) triggers re-render even without state change —
table_setExpandedinvokesonExpandedChangeunconditionally even for no-op updates, so controlled-state consumers get spurious callbacks; the uncontrolled atom path already bails on identity. PR #6184 (v8) needs an alpha port. - #6175 — Unable to view examples in Codesandbox without forking — No example Vite config on
alphasetsserver.allowedHosts, so CodeSandbox devbox embeds are blocked by Vite's host check. PR #6176 open. - #6302 — Accessor key does not have the same typing as Form's name key —
accessorKeyis(string & {}) | keyof TDatawhilecolumnHelper.accessoralready constrains toDeepKeys<TData>; the library ships the requested type and simply doesn't use it on the raw ColumnDef form. Gated on a TS-perf check against wideTData.
- #5696 — Table using insane amount of memory even with virtualisation when scrolling —
row_getAllCellsstill materializes a Cell per leaf column per row intorow._cellsCache(now a WeakMap) retained for the lifetime of a stable columns reference, so column virtualization does not avoid rows×cols cell construction. Prior scratch estimate ~122 B/cell (~470 MB extrapolated at 2000×2000); needs a fresh browser heap profile separating table vs virtual vs renderer cost. - #6011 — virtual columns experimental can not scroll smoothly when nearing the end — The repro is this repo's own shipped
virtualized-columns-experimentalexample, so even if the root cause is TanStack Virtual measurement, the fix is plausibly example-side (row virtualizermeasureElementchanging total height mid-drag). One cheap experiment (fixed rowestimateSizeoroverflow-y: scroll) decides between fixing the example and transferring to the Virtual repo.
| # | Root cause | Open issues | Status |
|---|---|---|---|
| 1 | v9 dropped v8's first-run auto-reset guard; first getRowModel() wipes controlled/initial expanded/pageIndex |
#5968 (canonical; #5970/#6025/#6030 already closed) | Unfixed; table_resetPageIndex(table, true) also ignores initialState |
| 2 | Global-filter eligibility decided from flatRows[0]; explicit enableGlobalFilter: true cannot override |
#4673 (canonical), #4783, #4919, #5138 | PRs #6252/#6438/#6439 open |
| 3 | row._valuesCache never invalidated when columns/accessorFn change |
#4485, #5363 (#4702 closed) | v8 PR #5582 open; port concept to alpha |
| 4 | Parent/child selection never reconciled upward | #6049 (canonical), #5116, #5398; close #4878/#5416 as dups | Unfixed; one refactor fixes the family |
| 5 | column_getAutoSortDir samples flatRows[0] |
#5147, #5832 | Unfixed; sortDescFirst workaround |
| 6 | Non-multi sort toggle preserves other sorts on the last-sorted column | #4309 (#6070 closed) | PR #6431 open |
| 7 | Group (non-leaf) columns second-class in visibility/offsets | #5497, #5770, #5397 (#4872/#5577 closed as docs-direction) | Unfixed; #5770 has maintainer-approved direction |
| 8 | v8-targeted fix PRs never ported to alpha | #6074, #6077, #6078, #6115, #6136, #5822 | Six open PRs against main need alpha ports |
- #6224 / #6450: were Verified & Urgent in both audits; fixed by PR #6458 (merged 2026-07-29) —
useTablenow defers controlled-state publication to a layout effect. Close both. - #5026 / #4634: same fix family; the 2026-07-27 maintainer comment plus #6458 flips them from open questions to closeable.
- #6078: was Maybe/Valid; escalated to Verified & Urgent — the
process.envreads demonstrably survive into the published v9 dist and there is no workaround. - #4994: was Verified & Urgent in the GPT audit; flips to close — the reporter explicitly opted out with
autoResetPageIndex: false, and the docs assign reset responsibility to the app; the real clamp gap is tracked by #4703 (closed) and PR #5031. - #4878 / #5416: keep-verdicts consolidated into close-as-duplicate of canonical #6049.
- #5850: GPT's close verdict overturned — Kevin committed in-thread to adding
removeRowSelection(ids)to the v9 alpha; the helper does not exist yet.