fix: acknowledge a new run ahead of outcome banners - #15067
Conversation
… banners A queue notification banner holds the screen for 4s and new notifications are appended to a FIFO. A run the user just triggered is therefore not acknowledged until every already-queued outcome banner has drained, so clicking Run after a batch of failures looks like it did nothing.
Outcome banners (completed/failed) report history; a run acknowledgement reports the action the user just took and is the only notification that can still inform them. Let queuedPending/queued preempt an active outcome banner and jump the pending queue, instead of waiting out a 4s FIFO drain. Acknowledgement-vs-acknowledgement ordering is unchanged.
🎭 Playwright: ✅ 1807 passed, 0 failed · 1 flaky📊 Browser Reports
🎨 Storybook: ✅ Built — View Storybook📦 Bundle: 8.71 MB gzip 🔴 +131 BDetailsSummary
Category Glance App Entry Points — 3.67 kB (baseline 3.67 kB) • ⚪ 0 BMain entry bundles and manifests
Status: 1 added / 1 removed Graph Workspace — 1.37 MB (baseline 1.36 MB) • 🔴 +875 BGraph editor runtime, canvas, workflow orchestration
Status: 1 added / 1 removed / 2 unchanged Views & Navigation — 124 kB (baseline 124 kB) • ⚪ 0 BTop-level views, pages, and routed surfaces Status: 17 unchanged Panels & Settings — 565 kB (baseline 565 kB) • ⚪ 0 BConfiguration panels, inspectors, and settings screens Status: 26 unchanged User & Accounts — 27 kB (baseline 27 kB) • ⚪ 0 BAuthentication, profile, and account management bundles Status: 10 unchanged Editors & Dialogs — 125 kB (baseline 125 kB) • ⚪ 0 BModals, dialogs, drawers, and in-app editors Status: 8 unchanged UI Components — 67.1 kB (baseline 67.1 kB) • ⚪ 0 BReusable component library chunks Status: 14 unchanged Data & Services — 3.51 MB (baseline 3.51 MB) • ⚪ 0 BStores, services, APIs, and repositories Status: 17 unchanged Utilities & Hooks — 550 kB (baseline 550 kB) • ⚪ 0 BHelpers, composables, and utility bundles Status: 38 unchanged Vendor & Third-Party — 16.3 MB (baseline 16.3 MB) • ⚪ 0 BExternal libraries and shared vendor chunks Status: 17 unchanged Other — 14.1 MB (baseline 14.1 MB) • ⚪ 0 BBundles that do not match a named category
Status: 1 added / 1 removed / 284 unchanged ⚡ Performance Report
Show regressions
All metrics
Historical variance (last 15 runs)
Trend (last 15 commits on main)
Raw data{
"timestamp": "2026-08-12T03:59:34.267Z",
"gitSha": "4769a2db51a6f3b9cb3ae77faf9c7ef333be35ec",
"branch": "fix/c2-run-acknowledgement",
"measurements": [
{
"name": "canvas-idle",
"durationMs": 2030.889000000002,
"styleRecalcs": 8,
"styleRecalcDurationMs": 7.091,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 523.7539999999999,
"heapDeltaBytes": 5822924,
"heapUsedBytes": 70333328,
"domNodes": 16,
"jsHeapTotalBytes": 24379392,
"scriptDurationMs": 17.116000000000003,
"eventListeners": 4,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.66999999999998,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "canvas-idle",
"durationMs": 2034.2279999999846,
"styleRecalcs": 8,
"styleRecalcDurationMs": 7.640000000000001,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 472.473,
"heapDeltaBytes": 5803868,
"heapUsedBytes": 70296516,
"domNodes": 16,
"jsHeapTotalBytes": 24117248,
"scriptDurationMs": 17.680999999999997,
"eventListeners": 4,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.800000000000182
},
{
"name": "canvas-mouse-sweep",
"durationMs": 1886.2480000000232,
"styleRecalcs": 74,
"styleRecalcDurationMs": 40.17100000000001,
"layouts": 12,
"layoutDurationMs": 3.407,
"taskDurationMs": 912.7470000000001,
"heapDeltaBytes": -11957360,
"heapUsedBytes": 52378556,
"domNodes": -283,
"jsHeapTotalBytes": 23306240,
"scriptDurationMs": 127.97,
"eventListeners": -153,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.800000000000182
},
{
"name": "canvas-mouse-sweep",
"durationMs": 1889.5139999999628,
"styleRecalcs": 75,
"styleRecalcDurationMs": 41.876000000000005,
"layouts": 12,
"layoutDurationMs": 3.8140000000000005,
"taskDurationMs": 933.1999999999999,
"heapDeltaBytes": -13418036,
"heapUsedBytes": 51007284,
"domNodes": -281,
"jsHeapTotalBytes": 24354816,
"scriptDurationMs": 133.409,
"eventListeners": -153,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "canvas-zoom-sweep",
"durationMs": 1754.2359999999917,
"styleRecalcs": 33,
"styleRecalcDurationMs": 18.608,
"layouts": 6,
"layoutDurationMs": 0.783,
"taskDurationMs": 395.827,
"heapDeltaBytes": 8794016,
"heapUsedBytes": 73276532,
"domNodes": 79,
"jsHeapTotalBytes": 23855104,
"scriptDurationMs": 20.302,
"eventListeners": 19,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.670000000000012,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "canvas-zoom-sweep",
"durationMs": 1765.598999999952,
"styleRecalcs": 30,
"styleRecalcDurationMs": 17.013,
"layouts": 6,
"layoutDurationMs": 0.6299999999999999,
"taskDurationMs": 394.79900000000004,
"heapDeltaBytes": 8558776,
"heapUsedBytes": 72936448,
"domNodes": 76,
"jsHeapTotalBytes": 24379392,
"scriptDurationMs": 19.449,
"eventListeners": 19,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.66333333333332,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "dom-widget-clipping",
"durationMs": 590.6330000000253,
"styleRecalcs": 11,
"styleRecalcDurationMs": 8.104,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 396.78000000000003,
"heapDeltaBytes": -11374620,
"heapUsedBytes": 53145848,
"domNodes": 18,
"jsHeapTotalBytes": 25690112,
"scriptDurationMs": 62.107,
"eventListeners": 2,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.66333333333332,
"p95FrameDurationMs": 16.799999999999272
},
{
"name": "dom-widget-clipping",
"durationMs": 588.6189999999942,
"styleRecalcs": 10,
"styleRecalcDurationMs": 7.326999999999998,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 391.167,
"heapDeltaBytes": -11111944,
"heapUsedBytes": 53219772,
"domNodes": 16,
"jsHeapTotalBytes": 25165824,
"scriptDurationMs": 62.387,
"eventListeners": 2,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "large-graph-idle",
"durationMs": 2031.693999999959,
"styleRecalcs": 8,
"styleRecalcDurationMs": 7.940000000000003,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 683.1260000000001,
"heapDeltaBytes": 6872428,
"heapUsedBytes": 66402928,
"domNodes": -284,
"jsHeapTotalBytes": 2723840,
"scriptDurationMs": 106.606,
"eventListeners": -149,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.800000000000182
},
{
"name": "large-graph-idle",
"durationMs": 2054.711999999995,
"styleRecalcs": 9,
"styleRecalcDurationMs": 9.058,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 693.746,
"heapDeltaBytes": 5324668,
"heapUsedBytes": 65278536,
"domNodes": -281,
"jsHeapTotalBytes": 3248128,
"scriptDurationMs": 108.847,
"eventListeners": -179,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.800000000000182
},
{
"name": "large-graph-pan",
"durationMs": 2220.23200000001,
"styleRecalcs": 68,
"styleRecalcDurationMs": 14.384999999999998,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 1364.68,
"heapDeltaBytes": 5045820,
"heapUsedBytes": 65724868,
"domNodes": -285,
"jsHeapTotalBytes": 4227072,
"scriptDurationMs": 454.563,
"eventListeners": -147,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.66333333333335,
"p95FrameDurationMs": 16.800000000000182
},
{
"name": "large-graph-pan",
"durationMs": 2209.5659999999953,
"styleRecalcs": 68,
"styleRecalcDurationMs": 13.036000000000003,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 1335.527,
"heapDeltaBytes": 4574384,
"heapUsedBytes": 65349300,
"domNodes": -285,
"jsHeapTotalBytes": 4489216,
"scriptDurationMs": 450.012,
"eventListeners": -149,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.800000000000182
},
{
"name": "large-graph-zoom",
"durationMs": 3249.6080000000234,
"styleRecalcs": 64,
"styleRecalcDurationMs": 14.012000000000004,
"layouts": 60,
"layoutDurationMs": 8.218,
"taskDurationMs": 1594.5049999999999,
"heapDeltaBytes": 491084,
"heapUsedBytes": 63260436,
"domNodes": -289,
"jsHeapTotalBytes": 6656000,
"scriptDurationMs": 554.7299999999999,
"eventListeners": -153,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "large-graph-zoom",
"durationMs": 3359.7559999999476,
"styleRecalcs": 63,
"styleRecalcDurationMs": 13.281999999999998,
"layouts": 60,
"layoutDurationMs": 7.447,
"taskDurationMs": 1596.7289999999998,
"heapDeltaBytes": 4930820,
"heapUsedBytes": 67857992,
"domNodes": -290,
"jsHeapTotalBytes": 6656000,
"scriptDurationMs": 560.9960000000001,
"eventListeners": -153,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.800000000000182
},
{
"name": "minimap-idle",
"durationMs": 2033.5170000000176,
"styleRecalcs": 7,
"styleRecalcDurationMs": 6.544999999999999,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 667.5530000000001,
"heapDeltaBytes": 6876036,
"heapUsedBytes": 67546540,
"domNodes": -285,
"jsHeapTotalBytes": 4558848,
"scriptDurationMs": 104.10600000000001,
"eventListeners": -149,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.66333333333335,
"p95FrameDurationMs": 16.799999999999272
},
{
"name": "minimap-idle",
"durationMs": 2039.6310000000994,
"styleRecalcs": 9,
"styleRecalcDurationMs": 8.618,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 695.0300000000001,
"heapDeltaBytes": 6958352,
"heapUsedBytes": 67570908,
"domNodes": -284,
"jsHeapTotalBytes": 3772416,
"scriptDurationMs": 106.11,
"eventListeners": -149,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.66333333333332,
"p95FrameDurationMs": 16.799999999999272
},
{
"name": "subgraph-dom-widget-clipping",
"durationMs": 577.8349999999932,
"styleRecalcs": 46,
"styleRecalcDurationMs": 10.635,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 406.903,
"heapDeltaBytes": -10609664,
"heapUsedBytes": 53896336,
"domNodes": 18,
"jsHeapTotalBytes": 25952256,
"scriptDurationMs": 120.535,
"eventListeners": 8,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.699999999999818
},
{
"name": "subgraph-dom-widget-clipping",
"durationMs": 592.0929999999771,
"styleRecalcs": 46,
"styleRecalcDurationMs": 11.126,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 416.768,
"heapDeltaBytes": -11045508,
"heapUsedBytes": 53607052,
"domNodes": 18,
"jsHeapTotalBytes": 26476544,
"scriptDurationMs": 123.369,
"eventListeners": 8,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "subgraph-idle",
"durationMs": 1991.9779999999605,
"styleRecalcs": 10,
"styleRecalcDurationMs": 8.938999999999998,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 464.77000000000004,
"heapDeltaBytes": 5612556,
"heapUsedBytes": 70090888,
"domNodes": 20,
"jsHeapTotalBytes": 24903680,
"scriptDurationMs": 13.617000000000003,
"eventListeners": 4,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.799999999999272
},
{
"name": "subgraph-idle",
"durationMs": 2017.4930000000586,
"styleRecalcs": 9,
"styleRecalcDurationMs": 8.630999999999998,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 493.104,
"heapDeltaBytes": -18834352,
"heapUsedBytes": 45873540,
"domNodes": 0,
"jsHeapTotalBytes": 22519808,
"scriptDurationMs": 13.84,
"eventListeners": 4,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.66333333333332,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "subgraph-mouse-sweep",
"durationMs": 1711.1610000000042,
"styleRecalcs": 76,
"styleRecalcDurationMs": 36.75600000000001,
"layouts": 16,
"layoutDurationMs": 3.9459999999999997,
"taskDurationMs": 801.6659999999999,
"heapDeltaBytes": -3189968,
"heapUsedBytes": 61232444,
"domNodes": 63,
"jsHeapTotalBytes": 24903680,
"scriptDurationMs": 96.542,
"eventListeners": 4,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "subgraph-mouse-sweep",
"durationMs": 1755.946999999992,
"styleRecalcs": 77,
"styleRecalcDurationMs": 40.404,
"layouts": 16,
"layoutDurationMs": 5.006,
"taskDurationMs": 871.5149999999999,
"heapDeltaBytes": -16470336,
"heapUsedBytes": 48088720,
"domNodes": -281,
"jsHeapTotalBytes": 23306240,
"scriptDurationMs": 104.55099999999999,
"eventListeners": -153,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "subgraph-transition-enter",
"durationMs": 1401.1219999999867,
"styleRecalcs": 17,
"styleRecalcDurationMs": 30.95300000000001,
"layouts": 13,
"layoutDurationMs": 12.373000000000003,
"taskDurationMs": 952.8750000000001,
"heapDeltaBytes": 31010244,
"heapUsedBytes": 99240728,
"domNodes": 13673,
"jsHeapTotalBytes": 15728640,
"scriptDurationMs": 37.23900000000001,
"eventListeners": 2375,
"totalBlockingTimeMs": 143,
"frameDurationMs": 16.666666666666636,
"p95FrameDurationMs": 16.799999999999272
},
{
"name": "viewport-pan-sweep",
"durationMs": 8640.53100000001,
"styleRecalcs": 250,
"styleRecalcDurationMs": 38.084999999999994,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 5054.135,
"heapDeltaBytes": 18719160,
"heapUsedBytes": 78338980,
"domNodes": -281,
"jsHeapTotalBytes": 9732096,
"scriptDurationMs": 1672.335,
"eventListeners": -131,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.670000000000012,
"p95FrameDurationMs": 16.80000000000109
},
{
"name": "viewport-pan-sweep",
"durationMs": 8406.00100000006,
"styleRecalcs": 249,
"styleRecalcDurationMs": 36.861000000000004,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 4670.709,
"heapDeltaBytes": 257032,
"heapUsedBytes": 59820420,
"domNodes": -283,
"jsHeapTotalBytes": 7180288,
"scriptDurationMs": 1413.559,
"eventListeners": -163,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.66333333333332,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "vue-large-graph-idle",
"durationMs": 17202.222000000005,
"styleRecalcs": 0,
"styleRecalcDurationMs": 0,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 17186.154000000002,
"heapDeltaBytes": -58648952,
"heapUsedBytes": 167337928,
"domNodes": -8312,
"jsHeapTotalBytes": -8331264,
"scriptDurationMs": 515.286,
"eventListeners": -16387,
"totalBlockingTimeMs": 0,
"frameDurationMs": 17.776666666666642,
"p95FrameDurationMs": 16.80000000000291
},
{
"name": "vue-large-graph-idle",
"durationMs": 17229.667000000063,
"styleRecalcs": 0,
"styleRecalcDurationMs": 0,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 17184.299,
"heapDeltaBytes": -36955792,
"heapUsedBytes": 167172064,
"domNodes": -8312,
"jsHeapTotalBytes": -8589312,
"scriptDurationMs": 592.3340000000001,
"eventListeners": -16389,
"totalBlockingTimeMs": 0,
"frameDurationMs": 17.77333333333336,
"p95FrameDurationMs": 16.799999999999272
},
{
"name": "vue-large-graph-pan",
"durationMs": 21114.215,
"styleRecalcs": 145,
"styleRecalcDurationMs": 17.826000000000008,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 21087.964999999997,
"heapDeltaBytes": -38720496,
"heapUsedBytes": 166735772,
"domNodes": -8312,
"jsHeapTotalBytes": -10428416,
"scriptDurationMs": 864.241,
"eventListeners": -16385,
"totalBlockingTimeMs": 296,
"frameDurationMs": 17.776666666666642,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "vue-large-graph-pan",
"durationMs": 21038.77,
"styleRecalcs": 148,
"styleRecalcDurationMs": 17.293000000000003,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 20978.87,
"heapDeltaBytes": -59885036,
"heapUsedBytes": 153889360,
"domNodes": -8312,
"jsHeapTotalBytes": -10948608,
"scriptDurationMs": 927.0560000000002,
"eventListeners": -16387,
"totalBlockingTimeMs": 268,
"frameDurationMs": 17.776666666666642,
"p95FrameDurationMs": 16.799999999999272
},
{
"name": "workflow-execution",
"durationMs": 466.254000000049,
"styleRecalcs": 11,
"styleRecalcDurationMs": 18.082,
"layouts": 3,
"layoutDurationMs": 0.5670000000000001,
"taskDurationMs": 114.384,
"heapDeltaBytes": 5065560,
"heapUsedBytes": 68869452,
"domNodes": 124,
"jsHeapTotalBytes": 4980736,
"scriptDurationMs": 9.918000000000001,
"eventListeners": 99,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "workflow-execution",
"durationMs": 519.427999999948,
"styleRecalcs": 18,
"styleRecalcDurationMs": 23.503000000000004,
"layouts": 3,
"layoutDurationMs": 1.3699999999999997,
"taskDurationMs": 138.01000000000002,
"heapDeltaBytes": 5183072,
"heapUsedBytes": 68679132,
"domNodes": 147,
"jsHeapTotalBytes": 4980736,
"scriptDurationMs": 10.525,
"eventListeners": 99,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.66333333333335,
"p95FrameDurationMs": 16.799999999999272
}
]
} |
|
No actionable comments were generated in the recent review. 🎉 ℹ️ Recent review info⚙️ Run configurationConfiguration used: Path: .coderabbit.yaml Review profile: ASSERTIVE Plan: Pro Plus Run ID: 📒 Files selected for processing (2)
📝 WalkthroughWalkthroughThe queue notification manager now prioritizes run acknowledgement banners over active or queued outcome banners. Unit and browser tests cover replacement of failed notifications and the resulting display order. ChangesQueue notification priority
Estimated code review effort: 3 (Moderate) | ~20 minutes Suggested labels: Suggested reviewers: Important Pre-merge checks failedPlease resolve all errors before merging. Addressing warnings is optional. ❌ Failed checks (1 inconclusive)
✅ Passed checks (5 passed)
✨ Finishing Touches📝 Generate docstrings
🧪 Generate unit tests (beta)
Comment |
…uests mockJobsHistory defaults to limit 200, but queueStore fetches 64, and the route matcher requires an exact limit match — so the mock never served and the outcome banner never rendered.
There was a problem hiding this comment.
Actionable comments posted: 1
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@src/composables/queue/useQueueNotificationBanners.ts`:
- Around line 111-125: Update the notification enqueue logic around
isRunAcknowledgement and pendingNotifications so acknowledgements are inserted
after existing pending acknowledgements but before the first pending outcome,
preserving FIFO order among acknowledgements. Ensure this ordering also applies
when an acknowledgement is currently active, and add a regression test covering
an active acknowledgement followed by a pending outcome and another
acknowledgement.
🪄 Autofix
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Path: .coderabbit.yaml
Review profile: ASSERTIVE
Plan: Pro Plus
Run ID: ae829ffc-e55e-4198-8c3b-3cd920c4914f
📒 Files selected for processing (3)
browser_tests/tests/queueNotificationBanners.spec.tssrc/composables/queue/useQueueNotificationBanners.test.tssrc/composables/queue/useQueueNotificationBanners.ts
Codecov Report❌ Patch coverage is
@@ Coverage Diff @@
## main #15067 +/- ##
==========================================
- Coverage 81.32% 81.18% -0.15%
==========================================
Files 1873 1882 +9
Lines 106556 107179 +623
Branches 33382 33095 -287
==========================================
+ Hits 86661 87012 +351
- Misses 19549 19793 +244
- Partials 346 374 +28
Flags with carried forward coverage won't be shown. Click here to find out more.
... and 37 files with indirect coverage changes 🚀 New features to boost your workflow:
|
An acknowledgement arriving while another acknowledgement is on screen was appended behind pending outcome banners, so a new Run waited out a stale failure banner before being acknowledged.
| const active = activeNotification.value | ||
| if (active === null || isOutcome(active)) { | ||
| clearDismissTimer() | ||
| activeNotification.value = null |
There was a problem hiding this comment.
Consider requeueing the preempted outcome ([notification, active, ...pendingNotifications.value]) instead of dropping it — the drop is permanent and timing-dependent, and also fires on spurious acks (rejected Run, late promptQueued). If dropping is intended, no test currently pins it.
There was a problem hiding this comment.
Your call, I approve if this is intended
|
|
||
| await dispatchPromptQueueing(comfyPage.page) | ||
|
|
||
| await expect(banner).toContainText('queuing') |
There was a problem hiding this comment.
This also passes on the pre-fix FIFO code: with no expect.timeout configured, the default 5s outlasts the ≤4s rotation of the failed banner. A tight timeout here (e.g. { timeout: 1000 }) plus re-asserting failed right before the dispatch would make it a real guard.
benceruleanlu
left a comment
There was a problem hiding this comment.
please see first review comment before merging
## Summary Clicking Run after a batch of jobs failed looks like it did nothing. The run *is* accepted immediately, but the banner that says so is queued behind outcome banners that each hold the screen for 4s. `useQueueNotificationBanners` keeps a single active banner plus a FIFO of pending ones (`BANNER_DISMISS_DELAY_MS = 4000`). `queueNotification` appends unconditionally, so the acknowledgement for the action the user just took waits out every already-queued "N jobs failed" banner first. Verified against the composable before the fix: with a `failed` banner active, a `promptQueueing` event leaves `currentNotification` on `failed` for the full 4s. ## Changes - **What (Before/After)**: a `queuedPending`/`queued` notification now preempts an active *outcome* (`completed`/`failed`) banner and jumps the pending queue. Before: up to 4s per already-queued banner before the user learns their run was accepted. After: immediate. Acknowledgement-vs-acknowledgement ordering is unchanged, so the existing FIFO test still passes. - **Breaking**: none. - **Dependencies**: none. ## Review Focus - The judgment call: an outcome banner reports history and is also recorded in Job History; a run acknowledgement reports the action the user just took and is the only notification that can still inform them. Dropping the former for the latter is the trade this makes. - Not fixed here, filed separately: consecutive outcome batches are neither coalesced nor capped, so N failure batches produce N serialized banners draining at 4s each. That is the "ton of job-failed toasts arriving over minutes" half of the report and is a distinct UX gap. - The delay before the failures arrive is **backend**, not frontend: the cloud job monitor batch-fails stagnated jobs on a 10s tick against `StagnationTimeouts` (Submitted 1m, Allocated 1m, PendingExecution 3m) with a single `UPDATE ... RETURNING`, then emits one `execution_error` per row in a tight loop. No frontend change can make those arrive sooner. ## How - `useQueueNotificationBanners.ts`: `queueNotification` unshifts run acknowledgements and clears an active outcome banner's dismiss timer. - Failing repro committed first (`test:` commit), then the fix. - E2E in `browser_tests/tests/queueNotificationBanners.spec.ts` drives a failed job through the mocked jobs route + WS helper, then asserts a dispatched `promptQueueing` shows immediately. - Part of FE-1586 (reported by Pablo in #comfy-creatives, 2026-08-11: "very often i click on run and it seems like it didnt work") --------- Co-authored-by: Connor Byrne <c.byrne@comfy.org>
Summary
Clicking Run after a batch of jobs failed looks like it did nothing. The run is accepted immediately, but the banner that says so is queued behind outcome banners that each hold the screen for 4s.
useQueueNotificationBannerskeeps a single active banner plus a FIFO of pending ones (BANNER_DISMISS_DELAY_MS = 4000).queueNotificationappends unconditionally, so the acknowledgement for the action the user just took waits out every already-queued "N jobs failed" banner first.Verified against the composable before the fix: with a
failedbanner active, apromptQueueingevent leavescurrentNotificationonfailedfor the full 4s.Changes
queuedPending/queuednotification now preempts an active outcome (completed/failed) banner and jumps the pending queue. Before: up to 4s per already-queued banner before the user learns their run was accepted. After: immediate. Acknowledgement-vs-acknowledgement ordering is unchanged, so the existing FIFO test still passes.Review Focus
StagnationTimeouts(Submitted 1m, Allocated 1m, PendingExecution 3m) with a singleUPDATE ... RETURNING, then emits oneexecution_errorper row in a tight loop. No frontend change can make those arrive sooner.How
useQueueNotificationBanners.ts:queueNotificationunshifts run acknowledgements and clears an active outcome banner's dismiss timer.Failing repro committed first (
test:commit), then the fix.E2E in
browser_tests/tests/queueNotificationBanners.spec.tsdrives a failed job through the mocked jobs route + WS helper, then asserts a dispatchedpromptQueueingshows immediately.Part of FE-1586 (reported by Pablo in #comfy-creatives, 2026-08-11: "very often i click on run and it seems like it didnt work")