Skip to content

Latest commit

 

History

History
210 lines (171 loc) · 42.6 KB

File metadata and controls

210 lines (171 loc) · 42.6 KB

TanStack Table remaining open-issue audit

Generated 2026-07-30, updated 2026-08-01 and again 2026-08-02 to remove closed entries. This audit now covers the 94 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).

Result

  • 52 issues can close now without a new PR.
  • 42 issues should remain open: 6 verified & urgent, 34 valid, 2 needing investigation.
  • 131 of the 225 issues from the July 26 audits are now closed; 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.
  • 9 already-open PRs target keep-open issues (see table below); landing or porting them to beta would clear a chunk of the keep-open list.

Audit baseline

  • 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/src source, 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.

Summary

Category Count Recommended action
Was fixed in V9 9 Close; behavior is correct in current alpha.
Wrong Library Direction 31 Close with the documented/headless-library boundary.
Junk Issue 10 Close as support-only, malformed, user error, or unreproducible-v8-era.
Couldn't Reproduce 0 Close unless a current minimal reproduction is supplied.
Duplicate 2 Close as duplicates of canonical #6049.
Verified & Urgent 6 Keep open and prioritize.
Valid 34 Keep open; many have fix PRs waiting to land or port.
Maybe & Needs Investigation 2 Keep only for additional triage.
Total 94 52 close candidates; 42 keep open.

Fix-first priority list

Ranked by user impact. Fixing the top four clusters closes or unblocks ~20 issues.

  1. #6078 — process is not defined crash (Verified & Urgent, high). Raw process.env.NODE_ENV reads survive into the published dist (packages/table-core/dist/utils.js) because tsdown.config.ts has no define; any bundler-less consumer (importmap/CDN) gets a hard ReferenceError, and v9 dropped the v8 UMD escape hatch. PR #6185 targets main only — needs an alpha port.
  2. Parent/child selection reconciliation — canonical #6049 (+ #5116, #5398; close #4878/#5416 as duplicates). Deselecting a descendant never removes the ancestor id, so getIsSelected() and getIsSomeSelected() can both be true and the shipped expanding example renders a parent fully checked with an unselected child. One refactor of table_toggleAllRowsSelected/mutateRowIsSelected plausibly fixes five open issues plus the closed-set #4349 family.
  3. Auto-reset first-run guard — #5968. v9 dropped v8's registered first-run guard: memo fires onAfterUpdate on the first computation, so the very first getRowModel() schedules table_autoResetExpanded/table_autoResetPageIndex, wiping controlled expanded and any initial pageIndex on mount (and table_resetPageIndex(table, true) hard-codes 0, ignoring initialState).
  4. row._valuesCache never invalidated — #4485 / #5363 (high). createCoreRowModel memoizes on [options.data] only, so a new columns/accessorFn silently serves stale values into rendering, sorting, and filtering — the documented "memoize columns" pattern yields wrong data. v8 PR #5582 shows the approach.
  5. #6007 — inNumberRange matches null as 0 (Verified & Urgent, high). No resolveDataValue, so null/''/false coerce to 0 and pass any zero-spanning range; this is the auto-selected default filter for number columns. PR #6313 open.
  6. #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.

Open PRs to land or port

PR Fixes Status
#6313 #6007 (exclude non-numeric from inNumberRange) Open
#6361 #5987 (maxLeafRowFilterDepth flatRows) Open
#6443 #5801 (reset expansion on data change) Open (base beta)
#6075 #6074 (columnFiltersMeta wipe) Open, targets v8 main — needs beta port
#6186 #6077 (Vue empty-string hydration) Open, targets v8 — needs beta port
#6116 #6115 (expand-all writes non-expandable ids) Open, targets v8 — needs beta port
#6184 #6136 (no-op toggleExpanded rerender) Open, targets v8 — needs beta port
#5031 #4703-adjacent pageIndex clamp Open, targets v8
#5582 #4485/#5363 (_valuesCache invalidation approach) Open, targets v8 — port concept to beta

Close now

Was fixed in V9 (9)

Wrong Library Direction (31)

Junk Issue (10)

Duplicates (2)

Keep open

Verified & Urgent (6)

  • #4919 — Filter not working if accessorFn returns null for any rowhigh. The column-filter half is fixed in v9 (column_getAutoFilterFn scans past nullish), but the global-filter half persists. Same cluster and pending PRs as #4783.
  • #5363 — getValue cache not invalidating when accessorFn is updatedhigh. row_getValue serves row._valuesCache forever and createCoreRowModel memoizes on [options.data] only, so swapping columns/accessorFn silently feeds stale values into rendering, sorting, and filtering. v8 PR #5582 shows the fix approach; same root cause as #4485/#4702.
  • #5968 — Invoking table.getRowModel() causes rows to collapsehigh. v9 dropped v8's first-run auto-reset guard: memo fires onAfterUpdate on the first computation and createGroupedRowModel forces rowInputsChanged = true on that first run, so the first getRowModel() schedules table_autoResetExpanded/table_autoResetPageIndex — wiping controlled expanded and any initial pageIndex on mount (table_resetPageIndex(table, true) hard-codes 0, ignoring initialState). 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 resultshigh. filterFn_inNumberRange has no resolveDataValue, so null/''/false coerce to 0 and match any zero-spanning range — and it is the auto-selected default filter for number columns. Sibling inDateRange already does this correctly. PR #6313 open.
  • #6049 — Row Selection: Incorrect Parent Row Selection Behavior with Nested DataFIX IMPLEMENTED 2026-08-02 (pending PR). Maintainer decision: upward reconciliation is opt-in, not default — new deselectParents flag on ToggleSelectedOptions prunes ancestor ids on deselect (toggleSelected + Shift-range paths). Scenario 1 (bottom-up select) was already covered by the recommended checked expression, now taught in the guide's canonical snippet. Close #4878/#5416 into this when the PR lands.
  • #6078 — process is not defined when used in Vanilla JS (without Node.js)high. Raw process.env.NODE_ENV reads persist in source (~14 sites) and survive into the published build (packages/table-core/dist/utils.js) because tsdown.config.ts has no define; any bundler-less consumer gets a hard ReferenceError, and v9 dropped the v8 UMD escape hatch. PR #6185 targets v8 main only — needs an alpha fix.

Valid (34)

High priority

Medium priority

Low priority

Maybe & Needs Investigation (2)

  • #5696 — Table using insane amount of memory even with virtualisation when scrollingrow_getAllCells still materializes a Cell per leaf column per row into row._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-experimental example, so even if the root cause is TanStack Virtual measurement, the fix is plausibly example-side (row virtualizer measureElement changing total height mid-drag). One cheap experiment (fixed row estimateSize or overflow-y: scroll) decides between fixing the example and transferring to the Virtual repo.

Root-cause clusters (updated from the July 26 audits)

# 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 #4919, #5138 Fixed by merged PRs #6438/#6439; remaining issues can close
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 Fix implemented 2026-08-02 (opt-in deselectParents + select-all eligibility + deselect guard); pending PR
5 column_getAutoSortDir samples flatRows[0] #5147, #5832 Unfixed; sortDescFirst workaround
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 beta #6074, #6077, #6078, #6115, #6136 Five open PRs against main need beta ports

Changes vs the July 26 audits

  • #6224 / #6450: were Verified & Urgent in both audits; fixed by PR #6458 (merged 2026-07-29) — useTable now 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.env reads 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.

Changes in the 2026-08-02 update

  • #5173 (Verified & Urgent) closed — fixed on beta by PR #6491 (isSubRowSelected returns false when no subRows are selectable). Stale v8 PRs #5790 (closed) and #6177 (still open) are superseded.
  • #5822 (Verified & Urgent) closed — fixed on beta by PR #6493 (row pinning after ungrouping). Stale v8 PR #5823 (still open) is superseded.
  • #6176 merged on main, so the #6175 example-config row was removed from the land-or-port table.