fix(assets): harden cursor-pagination in-flight tracking and loaded-id check#12996
fix(assets): harden cursor-pagination in-flight tracking and loaded-id check#12996mattmillerai wants to merge 1 commit into
Conversation
…d check Split flat-output in-flight promise tracking into separate refresh and loadMore slots so a refresh fired during an in-flight loadMore always runs its own reset path rather than coalescing into the loadMore result. Add loadedJobIds Set that records every raw job id walked in fetchHistoryAssets (not just displayable ones), cleared on reset, so a page of all-failed / no-preview jobs does not false-negative the loadMore dedup check.
|
No actionable comments were generated in the recent review. 🎉 ℹ️ Recent review info⚙️ Run configurationConfiguration used: Path: .coderabbit.yaml Review profile: CHILL Plan: Pro Plus Run ID: 📒 Files selected for processing (2)
📝 WalkthroughWalkthroughThe Asset store concurrency and deduplication fixes
Estimated code review effort🎯 3 (Moderate) | ⏱️ ~20 minutes Poem
🚥 Pre-merge checks | ✅ 6 | ❌ 1❌ Failed checks (1 warning)
✅ Passed checks (6 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. ✨ Finishing Touches📝 Generate docstrings
🧪 Generate unit tests (beta)
Comment |
🎨 Storybook: ✅ Built — View Storybook🎭 Playwright: ✅ 1671 passed, 0 failed · 1 flaky📊 Browser Reports
📦 Bundle: 7.45 MB gzip 🔴 +140 BDetailsSummary
Category Glance App Entry Points — 46.7 kB (baseline 46.7 kB) • ⚪ 0 BMain entry bundles and manifests
Status: 1 added / 1 removed Graph Workspace — 1.25 MB (baseline 1.25 MB) • ⚪ 0 BGraph editor runtime, canvas, workflow orchestration
Status: 1 added / 1 removed Views & Navigation — 95.3 kB (baseline 95.3 kB) • ⚪ 0 BTop-level views, pages, and routed surfaces
Status: 9 added / 9 removed / 3 unchanged Panels & Settings — 525 kB (baseline 525 kB) • ⚪ 0 BConfiguration panels, inspectors, and settings screens
Status: 11 added / 11 removed / 15 unchanged User & Accounts — 19.9 kB (baseline 19.9 kB) • ⚪ 0 BAuthentication, profile, and account management bundles
Status: 6 added / 6 removed / 3 unchanged Editors & Dialogs — 112 kB (baseline 112 kB) • ⚪ 0 BModals, dialogs, drawers, and in-app editors
Status: 4 added / 4 removed / 1 unchanged UI Components — 57.2 kB (baseline 57.2 kB) • ⚪ 0 BReusable component library chunks
Status: 5 added / 5 removed / 8 unchanged Data & Services — 266 kB (baseline 266 kB) • ⚪ 0 BStores, services, APIs, and repositories
Status: 13 added / 13 removed / 3 unchanged Utilities & Hooks — 3.32 MB (baseline 3.32 MB) • 🔴 +417 BHelpers, composables, and utility bundles
Status: 14 added / 14 removed / 16 unchanged Vendor & Third-Party — 15.3 MB (baseline 15.3 MB) • ⚪ 0 BExternal libraries and shared vendor chunks Status: 16 unchanged Other — 10.4 MB (baseline 10.4 MB) • ⚪ 0 BBundles that do not match a named category
Status: 62 added / 62 removed / 89 unchanged ⚡ Performance Report
Show regressions
All metrics
Historical variance (last 15 runs)
Trend (last 15 commits on main)
Raw data{
"timestamp": "2026-06-19T07:48:16.229Z",
"gitSha": "1f12487b5108d6fbe7902505b18866601fefb45e",
"branch": "matt/fe-1103-harden-assets-cursor-pagination-in-flight-tracking",
"measurements": [
{
"name": "canvas-idle",
"durationMs": 2057.9499999999484,
"styleRecalcs": 8,
"styleRecalcDurationMs": 6.577000000000001,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 407.72300000000007,
"heapDeltaBytes": -2378128,
"heapUsedBytes": 56334080,
"domNodes": 16,
"jsHeapTotalBytes": 25165824,
"scriptDurationMs": 21.244,
"eventListeners": 6,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "canvas-idle",
"durationMs": 2032.224000000042,
"styleRecalcs": 7,
"styleRecalcDurationMs": 6.767999999999998,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 471.664,
"heapDeltaBytes": -2439760,
"heapUsedBytes": 56449140,
"domNodes": 14,
"jsHeapTotalBytes": 26476544,
"scriptDurationMs": 24.312,
"eventListeners": 4,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.66333333333335,
"p95FrameDurationMs": 16.699999999999818
},
{
"name": "canvas-mouse-sweep",
"durationMs": 1780.7150000000433,
"styleRecalcs": 72,
"styleRecalcDurationMs": 33.73800000000001,
"layouts": 12,
"layoutDurationMs": 3.7049999999999996,
"taskDurationMs": 739.911,
"heapDeltaBytes": -3952400,
"heapUsedBytes": 62238628,
"domNodes": 54,
"jsHeapTotalBytes": 22331392,
"scriptDurationMs": 111.262,
"eventListeners": 4,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "canvas-mouse-sweep",
"durationMs": 1874.225000000024,
"styleRecalcs": 79,
"styleRecalcDurationMs": 42.913000000000004,
"layouts": 12,
"layoutDurationMs": 3.549,
"taskDurationMs": 815.037,
"heapDeltaBytes": -7156616,
"heapUsedBytes": 51172528,
"domNodes": 62,
"jsHeapTotalBytes": 24641536,
"scriptDurationMs": 130.92100000000002,
"eventListeners": 4,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "canvas-zoom-sweep",
"durationMs": 1753.1349999999861,
"styleRecalcs": 32,
"styleRecalcDurationMs": 18.578999999999997,
"layouts": 6,
"layoutDurationMs": 0.737,
"taskDurationMs": 333.37600000000003,
"heapDeltaBytes": 1886924,
"heapUsedBytes": 60222852,
"domNodes": 78,
"jsHeapTotalBytes": 25165824,
"scriptDurationMs": 25.683000000000003,
"eventListeners": 19,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.800000000000182
},
{
"name": "canvas-zoom-sweep",
"durationMs": 1727.3280000000568,
"styleRecalcs": 31,
"styleRecalcDurationMs": 18.660999999999998,
"layouts": 6,
"layoutDurationMs": 0.7970000000000002,
"taskDurationMs": 338.947,
"heapDeltaBytes": 1521688,
"heapUsedBytes": 60310244,
"domNodes": 76,
"jsHeapTotalBytes": 27000832,
"scriptDurationMs": 23.858,
"eventListeners": 19,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.800000000000182
},
{
"name": "dom-widget-clipping",
"durationMs": 591.6709999999625,
"styleRecalcs": 12,
"styleRecalcDurationMs": 7.862000000000001,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 359.328,
"heapDeltaBytes": 8809168,
"heapUsedBytes": 67155044,
"domNodes": 20,
"jsHeapTotalBytes": 17825792,
"scriptDurationMs": 63.236,
"eventListeners": 0,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.66333333333335,
"p95FrameDurationMs": 16.699999999999818
},
{
"name": "dom-widget-clipping",
"durationMs": 594.7340000000167,
"styleRecalcs": 12,
"styleRecalcDurationMs": 8.284,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 365.991,
"heapDeltaBytes": 7633672,
"heapUsedBytes": 65973504,
"domNodes": 20,
"jsHeapTotalBytes": 18874368,
"scriptDurationMs": 65.73499999999999,
"eventListeners": 0,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.663333333333338,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "large-graph-idle",
"durationMs": 2068.102999999951,
"styleRecalcs": 10,
"styleRecalcDurationMs": 7.755999999999999,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 553.91,
"heapDeltaBytes": -23573172,
"heapUsedBytes": 59272320,
"domNodes": -291,
"jsHeapTotalBytes": 2985984,
"scriptDurationMs": 102.076,
"eventListeners": -195,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.66333333333332,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "large-graph-idle",
"durationMs": 2010.0909999999885,
"styleRecalcs": 10,
"styleRecalcDurationMs": 10.347999999999999,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 591.894,
"heapDeltaBytes": -7982036,
"heapUsedBytes": 62075524,
"domNodes": 20,
"jsHeapTotalBytes": 10891264,
"scriptDurationMs": 111.27100000000002,
"eventListeners": 4,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "large-graph-pan",
"durationMs": 2104.424999999992,
"styleRecalcs": 69,
"styleRecalcDurationMs": 20.571999999999996,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 1009.515,
"heapDeltaBytes": 9433296,
"heapUsedBytes": 82510188,
"domNodes": 18,
"jsHeapTotalBytes": 8970240,
"scriptDurationMs": 372.011,
"eventListeners": 4,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "large-graph-pan",
"durationMs": 2164.6329999999807,
"styleRecalcs": 69,
"styleRecalcDurationMs": 21.576,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 1207.421,
"heapDeltaBytes": 10316760,
"heapUsedBytes": 83491676,
"domNodes": 16,
"jsHeapTotalBytes": 12378112,
"scriptDurationMs": 425.46500000000003,
"eventListeners": 6,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.66333333333332,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "large-graph-zoom",
"durationMs": 3067.3639999999978,
"styleRecalcs": 64,
"styleRecalcDurationMs": 19.923000000000002,
"layouts": 60,
"layoutDurationMs": 8.594000000000001,
"taskDurationMs": 1265.962,
"heapDeltaBytes": 12846072,
"heapUsedBytes": 68235304,
"domNodes": 12,
"jsHeapTotalBytes": 6815744,
"scriptDurationMs": 474.012,
"eventListeners": 8,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.66333333333332,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "large-graph-zoom",
"durationMs": 3150.4979999999705,
"styleRecalcs": 64,
"styleRecalcDurationMs": 20.080000000000005,
"layouts": 60,
"layoutDurationMs": 9.055,
"taskDurationMs": 1350.3930000000003,
"heapDeltaBytes": 13482116,
"heapUsedBytes": 69093408,
"domNodes": 10,
"jsHeapTotalBytes": 7602176,
"scriptDurationMs": 501.06700000000006,
"eventListeners": 8,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "minimap-idle",
"durationMs": 1992.6700000000324,
"styleRecalcs": 8,
"styleRecalcDurationMs": 7.323999999999997,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 512.642,
"heapDeltaBytes": 10423012,
"heapUsedBytes": 73261116,
"domNodes": 16,
"jsHeapTotalBytes": 6029312,
"scriptDurationMs": 87.991,
"eventListeners": 4,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.699999999999818
},
{
"name": "minimap-idle",
"durationMs": 2006.7869999999175,
"styleRecalcs": 9,
"styleRecalcDurationMs": 9.263,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 631.127,
"heapDeltaBytes": -9295352,
"heapUsedBytes": 64405028,
"domNodes": 18,
"jsHeapTotalBytes": 8531968,
"scriptDurationMs": 106.84500000000001,
"eventListeners": 6,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.66333333333332,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "subgraph-dom-widget-clipping",
"durationMs": 571.550000000002,
"styleRecalcs": 48,
"styleRecalcDurationMs": 12.179999999999998,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 375.10999999999996,
"heapDeltaBytes": 13181276,
"heapUsedBytes": 70547256,
"domNodes": 22,
"jsHeapTotalBytes": 18874368,
"scriptDurationMs": 122.87899999999999,
"eventListeners": 6,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.700000000000273
},
{
"name": "subgraph-dom-widget-clipping",
"durationMs": 593.6480000000302,
"styleRecalcs": 47,
"styleRecalcDurationMs": 11.742,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 394.3,
"heapDeltaBytes": 7550604,
"heapUsedBytes": 66211908,
"domNodes": 20,
"jsHeapTotalBytes": 17825792,
"scriptDurationMs": 134.296,
"eventListeners": 6,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.663333333333338,
"p95FrameDurationMs": 16.799999999999272
},
{
"name": "subgraph-idle",
"durationMs": 1998.0170000000044,
"styleRecalcs": 11,
"styleRecalcDurationMs": 8.872000000000002,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 374.018,
"heapDeltaBytes": -2525408,
"heapUsedBytes": 56211144,
"domNodes": 22,
"jsHeapTotalBytes": 26476544,
"scriptDurationMs": 16.327,
"eventListeners": 4,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.66333333333332,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "subgraph-idle",
"durationMs": 1998.1210000000829,
"styleRecalcs": 9,
"styleRecalcDurationMs": 9.071,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 402.621,
"heapDeltaBytes": 23958076,
"heapUsedBytes": 75838636,
"domNodes": 18,
"jsHeapTotalBytes": 14942208,
"scriptDurationMs": 19.664,
"eventListeners": 4,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.66333333333332,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "subgraph-mouse-sweep",
"durationMs": 1741.1009999999578,
"styleRecalcs": 76,
"styleRecalcDurationMs": 43.051,
"layouts": 16,
"layoutDurationMs": 4.62,
"taskDurationMs": 712.82,
"heapDeltaBytes": -13172248,
"heapUsedBytes": 55558740,
"domNodes": -222,
"jsHeapTotalBytes": 17215488,
"scriptDurationMs": 93.721,
"eventListeners": -199,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.670000000000012,
"p95FrameDurationMs": 16.800000000000182
},
{
"name": "subgraph-mouse-sweep",
"durationMs": 1701.2509999999565,
"styleRecalcs": 76,
"styleRecalcDurationMs": 40.353,
"layouts": 16,
"layoutDurationMs": 4.236,
"taskDurationMs": 707.3910000000001,
"heapDeltaBytes": 15430104,
"heapUsedBytes": 74152904,
"domNodes": 65,
"jsHeapTotalBytes": 25165824,
"scriptDurationMs": 98.87599999999999,
"eventListeners": 4,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "subgraph-transition-enter",
"durationMs": 1383.6860000000115,
"styleRecalcs": 17,
"styleRecalcDurationMs": 28.927,
"layouts": 4,
"layoutDurationMs": 12.584999999999999,
"taskDurationMs": 846.8979999999999,
"heapDeltaBytes": 4638152,
"heapUsedBytes": 80233116,
"domNodes": 13833,
"jsHeapTotalBytes": 17039360,
"scriptDurationMs": 41.839,
"eventListeners": 2529,
"totalBlockingTimeMs": 156,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "viewport-pan-sweep",
"durationMs": 8164.035999999953,
"styleRecalcs": 252,
"styleRecalcDurationMs": 62.086999999999996,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 3587.607,
"heapDeltaBytes": -2624364,
"heapUsedBytes": 67547772,
"domNodes": 22,
"jsHeapTotalBytes": 17358848,
"scriptDurationMs": 1193.6299999999999,
"eventListeners": 20,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.670000000000012,
"p95FrameDurationMs": 16.799999999999272
},
{
"name": "viewport-pan-sweep",
"durationMs": 8214.845000000081,
"styleRecalcs": 251,
"styleRecalcDurationMs": 64.435,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 3978.144,
"heapDeltaBytes": -2748036,
"heapUsedBytes": 67601304,
"domNodes": 20,
"jsHeapTotalBytes": 17620992,
"scriptDurationMs": 1270.502,
"eventListeners": 20,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "vue-large-graph-idle",
"durationMs": 14290.475000000015,
"styleRecalcs": 1,
"styleRecalcDurationMs": 2.246999999999999,
"layouts": 1,
"layoutDurationMs": 3.4330000000000056,
"taskDurationMs": 14264.975,
"heapDeltaBytes": -21979712,
"heapUsedBytes": 169621264,
"domNodes": -3308,
"jsHeapTotalBytes": 23826432,
"scriptDurationMs": 647.3249999999999,
"eventListeners": -16470,
"totalBlockingTimeMs": 829,
"frameDurationMs": 17.223333333333237,
"p95FrameDurationMs": 16.799999999999272
},
{
"name": "vue-large-graph-idle",
"durationMs": 14501.773999999954,
"styleRecalcs": 0,
"styleRecalcDurationMs": 0,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 14487.880000000001,
"heapDeltaBytes": -32419060,
"heapUsedBytes": 178317856,
"domNodes": -3308,
"jsHeapTotalBytes": 20418560,
"scriptDurationMs": 645.754,
"eventListeners": -16470,
"totalBlockingTimeMs": 0,
"frameDurationMs": 17.219999999999953,
"p95FrameDurationMs": 16.80000000000291
},
{
"name": "vue-large-graph-pan",
"durationMs": 16736.059000000012,
"styleRecalcs": 110,
"styleRecalcDurationMs": 24.977000000000025,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 16712.777000000002,
"heapDeltaBytes": -29639584,
"heapUsedBytes": 167803796,
"domNodes": -3308,
"jsHeapTotalBytes": 16748544,
"scriptDurationMs": 922.6780000000001,
"eventListeners": -16468,
"totalBlockingTimeMs": 45,
"frameDurationMs": 17.220000000000073,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "vue-large-graph-pan",
"durationMs": 16198.027000000024,
"styleRecalcs": 91,
"styleRecalcDurationMs": 22.603999999999957,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 16161.367000000002,
"heapDeltaBytes": -10360556,
"heapUsedBytes": 184086056,
"domNodes": -3306,
"jsHeapTotalBytes": 20332544,
"scriptDurationMs": 912.533,
"eventListeners": -16470,
"totalBlockingTimeMs": 65,
"frameDurationMs": 17.776666666666642,
"p95FrameDurationMs": 16.799999999999272
},
{
"name": "workflow-execution",
"durationMs": 452.2829999999658,
"styleRecalcs": 17,
"styleRecalcDurationMs": 24.746,
"layouts": 5,
"layoutDurationMs": 1.4920000000000002,
"taskDurationMs": 122.534,
"heapDeltaBytes": 5475096,
"heapUsedBytes": 65210012,
"domNodes": 168,
"jsHeapTotalBytes": 3145728,
"scriptDurationMs": 22.568,
"eventListeners": 69,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666682,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "workflow-execution",
"durationMs": 465.59000000002015,
"styleRecalcs": 17,
"styleRecalcDurationMs": 24.637,
"layouts": 5,
"layoutDurationMs": 1.5,
"taskDurationMs": 129.412,
"heapDeltaBytes": 5230176,
"heapUsedBytes": 64972744,
"domNodes": 157,
"jsHeapTotalBytes": 2883584,
"scriptDurationMs": 24.716,
"eventListeners": 69,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.700000000000728
}
]
} |
Codecov Report✅ All modified and coverable lines are covered by tests. @@ Coverage Diff @@
## main #12996 +/- ##
=======================================
Coverage 76.09% 76.10%
=======================================
Files 1572 1572
Lines 88193 88206 +13
Branches 26554 26494 -60
=======================================
+ Hits 67109 67125 +16
+ Misses 20426 20423 -3
Partials 658 658
Flags with carried forward coverage won't be shown. Click here to find out more.
... and 5 files with indirect coverage changes 🚀 New features to boost your workflow:
|
ELI5
Two subtle bugs in the assets store cursor-pagination:
Refresh dropped during loadMore: refreshing the assets list while a "load more" was already in flight would coalesce both calls into the same promise. The refresh's reset block (clearing offsets, pagination state, seen-ids) was silently skipped, so the refresh returned stale loadMore data instead of a clean page.
All-failed page triggers false reset: the dedup check for "have we already loaded this job" only tracked IDs of displayable assets (completed jobs with a preview). A page of all-failed or preview-less jobs added nothing to
loadedIds, so on the next loadMore those same raw jobs would pass the dedup gate again. In the worst case an all-failed head page could make the pagination logic think nothing had been seen yet.What changed
src/stores/assetsStore.tsflatOutputInFlightintoflatOutputRefreshInFlight+flatOutputLoadMoreInFlight. Each call type now guards against its own concurrent duplicate; a refresh during an in-flight loadMore launches an independent request and runs its full reset path.loadedJobIdsSet infetchHistoryAssets. Every rawJobListItemid (regardless of displayability) is recorded intoloadedJobIdson each fetch and cleared on reset. The loadMore dedup check still usesloadedIds(display-asset ids) to decide whether to insert into the visible list, but pagination now correctly accounts for all walked jobs.Testing
describe('in-flight tracking: refresh vs loadMore')under the flat-output suite: verifies refresh + loadMore fire independent requests, and that concurrent refreshes still coalesce.describe('assetsStore - loadedJobIds (all-job dedup)'): verifies a head page of all-failed jobs does not false-negative the loadMore dedup check, and thatloadedJobIdsis cleared on reset.pnpm vitest run src/stores/assetsStore.test.ts— 69 tests, all green. No repo-wide typecheck or test suite invoked.