docs: expand PR guidelines in CONTRIBUTING.md and AGENTS.md#14078
docs: expand PR guidelines in CONTRIBUTING.md and AGENTS.md#14078christian-byrne wants to merge 3 commits into
Conversation
Defer reactive state updates for progress and progress_state events to requestAnimationFrame callbacks. Multiple progress events within the same frame are coalesced — only the latest value is applied. Pending RAFs are cancelled on unbindExecutionEvents and execution completion.
Adds full PR workflow detail sourced from team guidelines: comment types, resolution rules (authors vs reviewers), deferral process, reviewer decision guide, and disagreement escalation. Adds agent-specific rule in AGENTS.md prohibiting agents from resolving review comments when they are the PR author.
📝 WalkthroughWalkthroughThe PR adds review-comment resolution guidance, expands contributor review workflows, introduces ChangesReview governance documentation
RAF progress batching
Estimated code review effort: 3 (Moderate) | ~25 minutes Sequence Diagram(s)sequenceDiagram
participant WebSocket
participant executionStore
participant RAFCoalescer
participant ProgressState
WebSocket->>executionStore: progress event
executionStore->>RAFCoalescer: enqueue latest payload
RAFCoalescer->>executionStore: apply on animation frame
executionStore->>ProgressState: update progress
executionStore->>RAFCoalescer: cancel on reset or node transition
Possibly related PRs
Suggested reviewers: Important Pre-merge checks failedPlease resolve all errors before merging. Addressing warnings is optional. ❌ Failed checks (1 warning, 1 inconclusive)
✅ Passed checks (4 passed)
✨ Finishing Touches📝 Generate docstrings
🧪 Generate unit tests (beta)
Comment |
🎨 Storybook: ✅ Built — View Storybook🎭 Playwright: ✅ 1730 passed, 0 failed · 1 flaky📊 Browser Reports
📦 Bundle: 8.08 MB gzip 🔴 +190 BDetailsSummary
Category Glance App Entry Points — 3.64 kB (baseline 3.64 kB) • ⚪ 0 BMain entry bundles and manifests
Status: 1 added / 1 removed Graph Workspace — 1.25 MB (baseline 1.25 MB) • 🟢 -83 BGraph editor runtime, canvas, workflow orchestration
Status: 1 added / 1 removed / 1 unchanged Views & Navigation — 112 kB (baseline 112 kB) • ⚪ 0 BTop-level views, pages, and routed surfaces
Status: 12 added / 12 removed / 4 unchanged Panels & Settings — 551 kB (baseline 551 kB) • ⚪ 0 BConfiguration panels, inspectors, and settings screens
Status: 11 added / 11 removed / 15 unchanged User & Accounts — 29.1 kB (baseline 29.1 kB) • ⚪ 0 BAuthentication, profile, and account management bundles
Status: 7 added / 7 removed / 3 unchanged Editors & Dialogs — 121 kB (baseline 121 kB) • ⚪ 0 BModals, dialogs, drawers, and in-app editors
Status: 5 added / 5 removed / 1 unchanged UI Components — 64.7 kB (baseline 64.7 kB) • ⚪ 0 BReusable component library chunks
Status: 6 added / 6 removed / 8 unchanged Data & Services — 3.37 MB (baseline 3.37 MB) • 🔴 +1.21 kBStores, services, APIs, and repositories
Status: 14 added / 14 removed / 3 unchanged Utilities & Hooks — 357 kB (baseline 357 kB) • ⚪ 0 BHelpers, composables, and utility bundles
Status: 15 added / 15 removed / 20 unchanged Vendor & Third-Party — 15.7 MB (baseline 15.7 MB) • ⚪ 0 BExternal libraries and shared vendor chunks Status: 16 unchanged Other — 12.4 MB (baseline 12.4 MB) • 🟢 -41 BBundles that do not match a named category
Status: 67 added / 67 removed / 207 unchanged ⚡ Performance Report
Show regressions
All metrics
Historical variance (last 15 runs)
Trend (last 15 commits on main)
Raw data{
"timestamp": "2026-07-24T03:13:24.242Z",
"gitSha": "f80fa493d434a9d5367926c20be9b79274974f3e",
"branch": "contributing/pr-guidelines-docs",
"measurements": [
{
"name": "canvas-idle",
"durationMs": 2047.348999999997,
"styleRecalcs": 9,
"styleRecalcDurationMs": 8.480999999999998,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 631.119,
"heapDeltaBytes": 3864936,
"heapUsedBytes": 71375124,
"domNodes": 18,
"jsHeapTotalBytes": 20324352,
"scriptDurationMs": 25.303,
"eventListeners": 6,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.699999999999818
},
{
"name": "canvas-idle",
"durationMs": 2026.3429999999971,
"styleRecalcs": 9,
"styleRecalcDurationMs": 7.679,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 522.31,
"heapDeltaBytes": 3846244,
"heapUsedBytes": 71390468,
"domNodes": 18,
"jsHeapTotalBytes": 20062208,
"scriptDurationMs": 21.18,
"eventListeners": 4,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.800000000000182
},
{
"name": "canvas-mouse-sweep",
"durationMs": 1836.7400000000202,
"styleRecalcs": 72,
"styleRecalcDurationMs": 37.6,
"layouts": 12,
"layoutDurationMs": 3.645,
"taskDurationMs": 942.567,
"heapDeltaBytes": -17441660,
"heapUsedBytes": 49985032,
"domNodes": -264,
"jsHeapTotalBytes": 21237760,
"scriptDurationMs": 123.93500000000002,
"eventListeners": -133,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.800000000000182
},
{
"name": "canvas-mouse-sweep",
"durationMs": 1891.2619999999833,
"styleRecalcs": 75,
"styleRecalcDurationMs": 41.632,
"layouts": 12,
"layoutDurationMs": 3.9090000000000003,
"taskDurationMs": 946.5760000000001,
"heapDeltaBytes": -14234872,
"heapUsedBytes": 53309080,
"domNodes": -268,
"jsHeapTotalBytes": 22024192,
"scriptDurationMs": 125.36900000000001,
"eventListeners": -133,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.800000000000182
},
{
"name": "canvas-zoom-sweep",
"durationMs": 1754.3430000000058,
"styleRecalcs": 33,
"styleRecalcDurationMs": 20.878,
"layouts": 6,
"layoutDurationMs": 0.7759999999999998,
"taskDurationMs": 439.58399999999995,
"heapDeltaBytes": 7137716,
"heapUsedBytes": 74689336,
"domNodes": 78,
"jsHeapTotalBytes": 20586496,
"scriptDurationMs": 26.522000000000006,
"eventListeners": 19,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.66333333333332,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "canvas-zoom-sweep",
"durationMs": 1717.6240000000007,
"styleRecalcs": 31,
"styleRecalcDurationMs": 17.758000000000003,
"layouts": 6,
"layoutDurationMs": 0.692,
"taskDurationMs": 415.977,
"heapDeltaBytes": 7157548,
"heapUsedBytes": 74602112,
"domNodes": 76,
"jsHeapTotalBytes": 20586496,
"scriptDurationMs": 24.85,
"eventListeners": 19,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.800000000000182
},
{
"name": "dom-widget-clipping",
"durationMs": 605.6730000000243,
"styleRecalcs": 10,
"styleRecalcDurationMs": 6.879999999999999,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 392.616,
"heapDeltaBytes": -12270748,
"heapUsedBytes": 55378292,
"domNodes": 16,
"jsHeapTotalBytes": 21372928,
"scriptDurationMs": 58.571,
"eventListeners": 0,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.699999999999818
},
{
"name": "dom-widget-clipping",
"durationMs": 581.2779999999975,
"styleRecalcs": 10,
"styleRecalcDurationMs": 6.569999999999999,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 388.14700000000005,
"heapDeltaBytes": -11847900,
"heapUsedBytes": 55585420,
"domNodes": 16,
"jsHeapTotalBytes": 21110784,
"scriptDurationMs": 58.349,
"eventListeners": 0,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.66333333333332,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "large-graph-idle",
"durationMs": 2027.0300000000248,
"styleRecalcs": 9,
"styleRecalcDurationMs": 9.061000000000003,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 802.3720000000001,
"heapDeltaBytes": 7132284,
"heapUsedBytes": 66066564,
"domNodes": -267,
"jsHeapTotalBytes": 4268032,
"scriptDurationMs": 121.17100000000002,
"eventListeners": -129,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.800000000000182
},
{
"name": "large-graph-idle",
"durationMs": 2041.5219999999863,
"styleRecalcs": 8,
"styleRecalcDurationMs": 8.02,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 792.3270000000001,
"heapDeltaBytes": 6680416,
"heapUsedBytes": 65830752,
"domNodes": -268,
"jsHeapTotalBytes": 4530176,
"scriptDurationMs": 121.13799999999999,
"eventListeners": -129,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.66999999999998,
"p95FrameDurationMs": 16.799999999999272
},
{
"name": "large-graph-pan",
"durationMs": 2182.53500000003,
"styleRecalcs": 69,
"styleRecalcDurationMs": 15.855000000000004,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 1331.939,
"heapDeltaBytes": 5698784,
"heapUsedBytes": 65211784,
"domNodes": -269,
"jsHeapTotalBytes": 5521408,
"scriptDurationMs": 433.377,
"eventListeners": -127,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.800000000000182
},
{
"name": "large-graph-pan",
"durationMs": 2170.468000000028,
"styleRecalcs": 68,
"styleRecalcDurationMs": 14.903999999999996,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 1319.9950000000001,
"heapDeltaBytes": 4753336,
"heapUsedBytes": 64953536,
"domNodes": -272,
"jsHeapTotalBytes": 4472832,
"scriptDurationMs": 422.17199999999997,
"eventListeners": -129,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.66999999999998,
"p95FrameDurationMs": 16.699999999999818
},
{
"name": "large-graph-zoom",
"durationMs": 3309.8430000000008,
"styleRecalcs": 64,
"styleRecalcDurationMs": 15.169000000000002,
"layouts": 60,
"layoutDurationMs": 8.686000000000002,
"taskDurationMs": 1630.1720000000003,
"heapDeltaBytes": 3695944,
"heapUsedBytes": 65108860,
"domNodes": -274,
"jsHeapTotalBytes": 6627328,
"scriptDurationMs": 560.132,
"eventListeners": -133,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.800000000000182
},
{
"name": "large-graph-zoom",
"durationMs": 3310.9940000000506,
"styleRecalcs": 64,
"styleRecalcDurationMs": 15.576999999999996,
"layouts": 60,
"layoutDurationMs": 8.667,
"taskDurationMs": 1619.642,
"heapDeltaBytes": 2788768,
"heapUsedBytes": 64280664,
"domNodes": -275,
"jsHeapTotalBytes": 7413760,
"scriptDurationMs": 581.405,
"eventListeners": -133,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.66999999999998,
"p95FrameDurationMs": 16.799999999999272
},
{
"name": "minimap-idle",
"durationMs": 2041.5229999999838,
"styleRecalcs": 8,
"styleRecalcDurationMs": 7.453000000000001,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 795.5139999999998,
"heapDeltaBytes": 6546436,
"heapUsedBytes": 66736760,
"domNodes": -269,
"jsHeapTotalBytes": 4792320,
"scriptDurationMs": 125.11800000000001,
"eventListeners": -129,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.66333333333332,
"p95FrameDurationMs": 16.800000000000182
},
{
"name": "minimap-idle",
"durationMs": 2074.304999999981,
"styleRecalcs": 8,
"styleRecalcDurationMs": 13.902999999999999,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 836.053,
"heapDeltaBytes": 6907776,
"heapUsedBytes": 66745928,
"domNodes": -267,
"jsHeapTotalBytes": 4268032,
"scriptDurationMs": 125.253,
"eventListeners": -127,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.800000000000182
},
{
"name": "subgraph-dom-widget-clipping",
"durationMs": 634.2209999999682,
"styleRecalcs": 46,
"styleRecalcDurationMs": 9.705,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 423.8670000000001,
"heapDeltaBytes": -11409892,
"heapUsedBytes": 56205488,
"domNodes": 18,
"jsHeapTotalBytes": 21897216,
"scriptDurationMs": 122.342,
"eventListeners": 6,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.800000000000182
},
{
"name": "subgraph-dom-widget-clipping",
"durationMs": 622.2330000000511,
"styleRecalcs": 47,
"styleRecalcDurationMs": 11.117999999999999,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 414.593,
"heapDeltaBytes": -11766772,
"heapUsedBytes": 55952092,
"domNodes": 20,
"jsHeapTotalBytes": 21897216,
"scriptDurationMs": 123.29200000000002,
"eventListeners": 8,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "subgraph-idle",
"durationMs": 2039.1690000000153,
"styleRecalcs": 10,
"styleRecalcDurationMs": 10.637,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 549.45,
"heapDeltaBytes": 3563104,
"heapUsedBytes": 71178368,
"domNodes": 20,
"jsHeapTotalBytes": 20586496,
"scriptDurationMs": 20.376,
"eventListeners": 4,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "subgraph-idle",
"durationMs": 2013.3819999999787,
"styleRecalcs": 11,
"styleRecalcDurationMs": 10.732000000000001,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 544.499,
"heapDeltaBytes": 3343584,
"heapUsedBytes": 70854584,
"domNodes": 22,
"jsHeapTotalBytes": 20586496,
"scriptDurationMs": 20.179999999999996,
"eventListeners": 4,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "subgraph-mouse-sweep",
"durationMs": 1732.894999999985,
"styleRecalcs": 77,
"styleRecalcDurationMs": 40.034,
"layouts": 16,
"layoutDurationMs": 4.5649999999999995,
"taskDurationMs": 870.805,
"heapDeltaBytes": -21546912,
"heapUsedBytes": 45943684,
"domNodes": -267,
"jsHeapTotalBytes": 20713472,
"scriptDurationMs": 100.184,
"eventListeners": -133,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.66333333333335,
"p95FrameDurationMs": 16.699999999999818
},
{
"name": "subgraph-mouse-sweep",
"durationMs": 1695.9940000000415,
"styleRecalcs": 76,
"styleRecalcDurationMs": 38.153,
"layouts": 16,
"layoutDurationMs": 4.651,
"taskDurationMs": 806.573,
"heapDeltaBytes": -5758684,
"heapUsedBytes": 61809764,
"domNodes": 64,
"jsHeapTotalBytes": 21372928,
"scriptDurationMs": 96.628,
"eventListeners": 4,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "subgraph-transition-enter",
"durationMs": 1400.3739999999425,
"styleRecalcs": 19,
"styleRecalcDurationMs": 30.971,
"layouts": 15,
"layoutDurationMs": 11.889000000000001,
"taskDurationMs": 1018.1429999999998,
"heapDeltaBytes": 29346508,
"heapUsedBytes": 96246388,
"domNodes": 13673,
"jsHeapTotalBytes": 15990784,
"scriptDurationMs": 38.329,
"eventListeners": 2371,
"totalBlockingTimeMs": 122,
"frameDurationMs": 16.66333333333332,
"p95FrameDurationMs": 16.799999999999272
},
{
"name": "viewport-pan-sweep",
"durationMs": 8287.289999999985,
"styleRecalcs": 249,
"styleRecalcDurationMs": 42.658,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 4666.403,
"heapDeltaBytes": 8247840,
"heapUsedBytes": 69435324,
"domNodes": -265,
"jsHeapTotalBytes": 7327744,
"scriptDurationMs": 1370.776,
"eventListeners": -113,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.670000000000012,
"p95FrameDurationMs": 16.799999999999272
},
{
"name": "viewport-pan-sweep",
"durationMs": 8348.44099999998,
"styleRecalcs": 250,
"styleRecalcDurationMs": 43.884,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 4696.735000000001,
"heapDeltaBytes": 10941808,
"heapUsedBytes": 69498708,
"domNodes": -267,
"jsHeapTotalBytes": 6541312,
"scriptDurationMs": 1399.289,
"eventListeners": -111,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.799999999999272
},
{
"name": "vue-large-graph-idle",
"durationMs": 18340.574000000004,
"styleRecalcs": 0,
"styleRecalcDurationMs": 0,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 18320.101000000002,
"heapDeltaBytes": -59682440,
"heapUsedBytes": 166733268,
"domNodes": -8311,
"jsHeapTotalBytes": -12517376,
"scriptDurationMs": 608.1600000000001,
"eventListeners": -16382,
"totalBlockingTimeMs": 0,
"frameDurationMs": 17.776666666666763,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "vue-large-graph-idle",
"durationMs": 18261.697000000026,
"styleRecalcs": 0,
"styleRecalcDurationMs": 0,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 18245.565999999995,
"heapDeltaBytes": -28933716,
"heapUsedBytes": 181212732,
"domNodes": -8311,
"jsHeapTotalBytes": -12259328,
"scriptDurationMs": 572.951,
"eventListeners": -16382,
"totalBlockingTimeMs": 0,
"frameDurationMs": 17.776666666666642,
"p95FrameDurationMs": 16.799999999999272
},
{
"name": "vue-large-graph-pan",
"durationMs": 22047.454000000016,
"styleRecalcs": 154,
"styleRecalcDurationMs": 23.757000000000026,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 22012.78,
"heapDeltaBytes": -41500824,
"heapUsedBytes": 167833928,
"domNodes": -8319,
"jsHeapTotalBytes": -14880768,
"scriptDurationMs": 937.7059999999999,
"eventListeners": -16374,
"totalBlockingTimeMs": 427,
"frameDurationMs": 17.773333333333238,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "vue-large-graph-pan",
"durationMs": 21906.98999999995,
"styleRecalcs": 156,
"styleRecalcDurationMs": 23.20100000000003,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 21852.764,
"heapDeltaBytes": -42931088,
"heapUsedBytes": 166637228,
"domNodes": -8311,
"jsHeapTotalBytes": -12783616,
"scriptDurationMs": 882.8399999999999,
"eventListeners": -16378,
"totalBlockingTimeMs": 519,
"frameDurationMs": 18.333333333333332,
"p95FrameDurationMs": 16.80000000000291
},
{
"name": "workflow-execution",
"durationMs": 461.7080000000442,
"styleRecalcs": 14,
"styleRecalcDurationMs": 21.675,
"layouts": 3,
"layoutDurationMs": 0.7410000000000001,
"taskDurationMs": 117.33900000000001,
"heapDeltaBytes": -16049992,
"heapUsedBytes": 50755008,
"domNodes": 124,
"jsHeapTotalBytes": 7479296,
"scriptDurationMs": 10.427999999999997,
"eventListeners": 67,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "workflow-execution",
"durationMs": 467.9640000000518,
"styleRecalcs": 14,
"styleRecalcDurationMs": 22.098,
"layouts": 3,
"layoutDurationMs": 0.73,
"taskDurationMs": 116.65899999999999,
"heapDeltaBytes": -16246180,
"heapUsedBytes": 50377404,
"domNodes": 119,
"jsHeapTotalBytes": 7741440,
"scriptDurationMs": 9.911,
"eventListeners": 65,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.699999999999818
}
]
} |
There was a problem hiding this comment.
Actionable comments posted: 3
🤖 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 `@CONTRIBUTING.md`:
- Line 297: Update both fenced code blocks in CONTRIBUTING.md, including the
blocks around the referenced locations, to specify an explicit language
identifier such as text immediately after the opening fence. Keep the existing
block contents unchanged.
- Around line 270-272: Reflow the changed prose in the Markdown guidance,
including the lines around “Re-review,” “Merging,” and the referenced sections,
so each line is at most 80 columns. Use indented continuation lines and preserve
the exact guidance and Markdown structure.
In `@src/stores/executionStore.ts`:
- Around line 483-491: The progress-state flow around handleProgressState and
_applyProgressState currently coalesces events globally, dropping updates from
concurrent jobs. Buffer pending ProgressStateWsMessage values by prompt_id,
coalesce or schedule the buffered batches without last-write-wins across jobs,
and apply each buffered job update so nodeProgressStatesByJob and preview
cleanup run for every prompt_id.
🪄 Autofix (Beta)
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: 3b7522c8-5ba1-422d-8d1e-f69646978a6f
📒 Files selected for processing (6)
AGENTS.mdCONTRIBUTING.mdsrc/stores/executionStore.test.tssrc/stores/executionStore.tssrc/utils/rafBatch.test.tssrc/utils/rafBatch.ts
👮 Files not reviewed due to content moderation or server errors (1)
- src/stores/executionStore.test.ts
| 6. **Assign Reviewer**: When ready, set one person as `Assignee` — they'll receive a Slack notification. Use git blame and context to pick someone relevant. | ||
| 7. **Re-review**: After addressing comments, re-assign to the reviewer (and optionally ping them in Slack) | ||
| 8. **Merging**: Merge once all `Assignees` have approved and you feel all comments are addressed. Don't wait for non-assignee approvals unless they've added themselves as `Assignee`. |
There was a problem hiding this comment.
📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win
Wrap changed Markdown lines to 80 columns.
These changed prose lines exceed the repository’s 80-column Markdown rule. Reflow them across indented continuation lines without changing the guidance.
As per coding guidelines, Markdown files must use an 80-column width.
Also applies to: 306-306, 309-309, 334-335
🤖 Prompt for 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.
In `@CONTRIBUTING.md` around lines 270 - 272, Reflow the changed prose in the
Markdown guidance, including the lines around “Re-review,” “Merging,” and the
referenced sections, so each line is at most 80 columns. Use indented
continuation lines and preserve the exact guidance and Markdown structure.
Source: Coding guidelines
|
|
||
| If you want to defer non-critical feedback to a follow-up PR, use: | ||
|
|
||
| ``` |
There was a problem hiding this comment.
📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win
Add language identifiers to the fenced blocks.
markdownlint reports MD040 for both fences. Use an explicit identifier such as text:
-```
+```textAlso applies to: 313-313
🧰 Tools
🪛 markdownlint-cli2 (0.23.0)
[warning] 297-297: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
🤖 Prompt for 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.
In `@CONTRIBUTING.md` at line 297, Update both fenced code blocks in
CONTRIBUTING.md, including the blocks around the referenced locations, to
specify an explicit language identifier such as text immediately after the
opening fence. Keep the existing block contents unchanged.
Source: Linters/SAST tools
| const progressStateCoalescer = | ||
| createRafCoalescer<ProgressStateWsMessage>(_applyProgressState) | ||
|
|
||
| function handleProgressState(e: CustomEvent<ProgressStateWsMessage>) { | ||
| const { nodes, prompt_id: jobId } = e.detail | ||
| progressStateCoalescer.push(e.detail) | ||
| } | ||
|
|
||
| function _applyProgressState(detail: ProgressStateWsMessage) { | ||
| const { nodes, prompt_id: jobId } = detail |
There was a problem hiding this comment.
🎯 Functional Correctness | 🟠 Major | 🏗️ Heavy lift
🧩 Analysis chain
🏁 Script executed:
#!/bin/bash
# Inspect how many concurrent jobs can emit progress_state and whether the backend interleaves prompt_ids.
rg -nP -C3 'progress_state|nodeProgressStatesByJob|runningJobIds' src/stores/executionStore.tsRepository: Comfy-Org/ComfyUI_frontend
Length of output: 4127
🏁 Script executed:
#!/bin/bash
set -euo pipefail
# Locate the coalescer implementation and all progress_state emitters/usages.
rg -n "createRafCoalescer|progress_state" src . -g '!**/dist/**' -g '!**/build/**'
# Read the coalescer implementation if found.
coalescer_file=$(rg -l "createRafCoalescer" src . -g '!**/dist/**' -g '!**/build/**' | head -n 1 || true)
if [ -n "${coalescer_file:-}" ]; then
echo
echo "=== ${coalescer_file} ==="
wc -l "$coalescer_file"
sed -n '1,220p' "$coalescer_file"
fiRepository: Comfy-Org/ComfyUI_frontend
Length of output: 13684
🏁 Script executed:
#!/bin/bash
set -euo pipefail
# Inspect the execution store around the progress_state handling and related job bookkeeping.
sed -n '430,540p' src/stores/executionStore.ts
printf '\n===\n'
sed -n '800,870p' src/stores/executionStore.tsRepository: Comfy-Org/ComfyUI_frontend
Length of output: 5767
🏁 Script executed:
#!/bin/bash
set -euo pipefail
echo "=== src/utils/rafBatch.ts ==="
sed -n '1,220p' src/utils/rafBatch.ts
echo
echo "=== relevant executionStore tests ==="
sed -n '1380,1615p' src/stores/executionStore.test.ts
echo
echo "=== app comment around multi-preview ==="
sed -n '820,850p' src/scripts/app.tsRepository: Comfy-Org/ComfyUI_frontend
Length of output: 9413
Buffer progress_state per prompt_id before coalescing.
createRafCoalescer is last-write-wins, so two progress_state events from different jobs in the same frame will collapse to the later one. Since _applyProgressState updates nodeProgressStatesByJob[jobId] and preview cleanup is explicitly used for multiple concurrent previews, the earlier job can miss its per-job state update and preview-revocation side effects for that frame. A per-job buffer/map would avoid dropping concurrent updates.
🤖 Prompt for 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.
In `@src/stores/executionStore.ts` around lines 483 - 491, The progress-state flow
around handleProgressState and _applyProgressState currently coalesces events
globally, dropping updates from concurrent jobs. Buffer pending
ProgressStateWsMessage values by prompt_id, coalesce or schedule the buffered
batches without last-write-wins across jobs, and apply each buffered job update
so nodeProgressStatesByJob and preview cleanup run for every prompt_id.
Codecov Report✅ All modified and coverable lines are covered by tests. @@ Coverage Diff @@
## main #14078 +/- ##
==========================================
- Coverage 78.96% 78.92% -0.05%
==========================================
Files 1697 1698 +1
Lines 114162 114493 +331
Branches 37538 36956 -582
==========================================
+ Hits 90153 90368 +215
- Misses 23399 23507 +108
- Partials 610 618 +8
Flags with carried forward coverage won't be shown. Click here to find out more.
... and 12 files with indirect coverage changes 🚀 New features to boost your workflow:
|
Summary
CONTRIBUTING.mdPR submission section with full team workflow: draft PRs, assignee conventions, comment types (nit:, required, discussion), comment resolution rules (reviewer vs author), deferral process via Coderabbit tracking issues, reviewer decision guide, and disagreement escalationAGENTS.mdprohibiting agents from resolving review comments on PRs where they are the author — instructs them to reply in-thread and re-assign insteadTest plan
CONTRIBUTING.mddiff for accuracy against team guidelinesAGENTS.mddiff for clarity and correct placement under Agent-only rules