fix(test): restore typecheck:browser after the ingest-types seat fields - #14714
Conversation
🎭 Playwright: ✅ 1787 passed, 0 failed · 2 flaky📊 Browser Reports
📦 Bundle: 8.25 MB gzip ⚪ 0 BDetailsSummary
Category Glance App Entry Points — 3.64 kB (baseline 3.64 kB) • ⚪ 0 BMain entry bundles and manifests Status: 1 unchanged Graph Workspace — 1.35 MB (baseline 1.35 MB) • ⚪ 0 BGraph editor runtime, canvas, workflow orchestration Status: 2 unchanged Views & Navigation — 112 kB (baseline 112 kB) • ⚪ 0 BTop-level views, pages, and routed surfaces Status: 17 unchanged Panels & Settings — 551 kB (baseline 551 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 — 124 kB (baseline 124 kB) • ⚪ 0 BModals, dialogs, drawers, and in-app editors Status: 7 unchanged UI Components — 71.1 kB (baseline 71.1 kB) • ⚪ 0 BReusable component library chunks Status: 15 unchanged Data & Services — 3.48 MB (baseline 3.48 MB) • ⚪ 0 BStores, services, APIs, and repositories Status: 17 unchanged Utilities & Hooks — 386 kB (baseline 386 kB) • ⚪ 0 BHelpers, composables, and utility bundles Status: 36 unchanged Vendor & Third-Party — 15.7 MB (baseline 15.7 MB) • ⚪ 0 BExternal libraries and shared vendor chunks Status: 16 unchanged Other — 12.8 MB (baseline 12.8 MB) • ⚪ 0 BBundles that do not match a named category Status: 281 unchanged ⚡ Performance Report
Show regressions
All metrics
Historical variance (last 15 runs)
Trend (last 15 commits on main)
Raw data{
"timestamp": "2026-08-04T23:14:08.514Z",
"gitSha": "11cc9c9b3d0b1cc86001c315f725fcf7666a96ee",
"branch": "glary/fix-browser-test-billing-types",
"measurements": [
{
"name": "canvas-idle",
"durationMs": 2067.225999999977,
"styleRecalcs": 10,
"styleRecalcDurationMs": 8.004,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 518.6890000000001,
"heapDeltaBytes": 5372592,
"heapUsedBytes": 69505120,
"domNodes": 20,
"jsHeapTotalBytes": 25165824,
"scriptDurationMs": 16.704000000000004,
"eventListeners": 4,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.66333333333335,
"p95FrameDurationMs": 16.699999999999818
},
{
"name": "canvas-idle",
"durationMs": 2030.9240000000273,
"styleRecalcs": 9,
"styleRecalcDurationMs": 6.053000000000001,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 443.87399999999997,
"heapDeltaBytes": 5411052,
"heapUsedBytes": 69386120,
"domNodes": 18,
"jsHeapTotalBytes": 25427968,
"scriptDurationMs": 14.358,
"eventListeners": 4,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.800000000000182
},
{
"name": "canvas-mouse-sweep",
"durationMs": 1905.0249999999949,
"styleRecalcs": 74,
"styleRecalcDurationMs": 38.266,
"layouts": 12,
"layoutDurationMs": 3.701,
"taskDurationMs": 859.5390000000001,
"heapDeltaBytes": -13028900,
"heapUsedBytes": 51055556,
"domNodes": -279,
"jsHeapTotalBytes": 24621056,
"scriptDurationMs": 122.491,
"eventListeners": -153,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "canvas-mouse-sweep",
"durationMs": 1825.2709999999865,
"styleRecalcs": 74,
"styleRecalcDurationMs": 34.969,
"layouts": 12,
"layoutDurationMs": 3.5770000000000004,
"taskDurationMs": 866.579,
"heapDeltaBytes": -11755672,
"heapUsedBytes": 52163980,
"domNodes": -279,
"jsHeapTotalBytes": 23572480,
"scriptDurationMs": 107.1,
"eventListeners": -153,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.800000000000182
},
{
"name": "canvas-zoom-sweep",
"durationMs": 1740.542000000005,
"styleRecalcs": 31,
"styleRecalcDurationMs": 15.906,
"layouts": 6,
"layoutDurationMs": 0.6070000000000001,
"taskDurationMs": 366.342,
"heapDeltaBytes": 8618468,
"heapUsedBytes": 72639484,
"domNodes": 77,
"jsHeapTotalBytes": 24903680,
"scriptDurationMs": 17.862,
"eventListeners": 19,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "canvas-zoom-sweep",
"durationMs": 1756.8280000000414,
"styleRecalcs": 32,
"styleRecalcDurationMs": 16.489000000000004,
"layouts": 6,
"layoutDurationMs": 0.7260000000000001,
"taskDurationMs": 375.311,
"heapDeltaBytes": 8666464,
"heapUsedBytes": 72650804,
"domNodes": 78,
"jsHeapTotalBytes": 24379392,
"scriptDurationMs": 17.986,
"eventListeners": 19,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "dom-widget-clipping",
"durationMs": 614.0680000000032,
"styleRecalcs": 12,
"styleRecalcDurationMs": 14.825999999999999,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 377.64200000000005,
"heapDeltaBytes": -11066696,
"heapUsedBytes": 52962708,
"domNodes": 20,
"jsHeapTotalBytes": 25690112,
"scriptDurationMs": 56.046,
"eventListeners": 0,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.66333333333332,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "dom-widget-clipping",
"durationMs": 606.4170000000217,
"styleRecalcs": 12,
"styleRecalcDurationMs": 8.722000000000001,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 372.296,
"heapDeltaBytes": -11499724,
"heapUsedBytes": 52665880,
"domNodes": 20,
"jsHeapTotalBytes": 25690112,
"scriptDurationMs": 54.54,
"eventListeners": 0,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "large-graph-idle",
"durationMs": 2040.9859999999753,
"styleRecalcs": 9,
"styleRecalcDurationMs": 7.369000000000001,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 657.0799999999999,
"heapDeltaBytes": 6997344,
"heapUsedBytes": 66362432,
"domNodes": -281,
"jsHeapTotalBytes": 3252224,
"scriptDurationMs": 88.76700000000001,
"eventListeners": -149,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.799999999999272
},
{
"name": "large-graph-idle",
"durationMs": 2032.54000000004,
"styleRecalcs": 8,
"styleRecalcDurationMs": 6.483000000000002,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 671.335,
"heapDeltaBytes": 6796668,
"heapUsedBytes": 66231792,
"domNodes": -283,
"jsHeapTotalBytes": 2727936,
"scriptDurationMs": 92.884,
"eventListeners": -149,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.799999999999272
},
{
"name": "large-graph-pan",
"durationMs": 2156.0289999999895,
"styleRecalcs": 69,
"styleRecalcDurationMs": 14.112999999999998,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 1171.025,
"heapDeltaBytes": 1515416,
"heapUsedBytes": 62461376,
"domNodes": -282,
"jsHeapTotalBytes": 5017600,
"scriptDurationMs": 390.426,
"eventListeners": -147,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.670000000000012,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "large-graph-pan",
"durationMs": 2145.9479999999758,
"styleRecalcs": 69,
"styleRecalcDurationMs": 14.755,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 1206.483,
"heapDeltaBytes": 4826512,
"heapUsedBytes": 65217160,
"domNodes": -284,
"jsHeapTotalBytes": 3706880,
"scriptDurationMs": 398.874,
"eventListeners": -149,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.699999999999818
},
{
"name": "large-graph-zoom",
"durationMs": 3147.3829999999907,
"styleRecalcs": 65,
"styleRecalcDurationMs": 14.762,
"layouts": 60,
"layoutDurationMs": 7.774,
"taskDurationMs": 1403.289,
"heapDeltaBytes": 23309608,
"heapUsedBytes": 85287764,
"domNodes": 12,
"jsHeapTotalBytes": 7602176,
"scriptDurationMs": 504.2850000000001,
"eventListeners": 8,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.800000000000182
},
{
"name": "large-graph-zoom",
"durationMs": 3145.5530000000635,
"styleRecalcs": 65,
"styleRecalcDurationMs": 14.829000000000002,
"layouts": 60,
"layoutDurationMs": 8.01,
"taskDurationMs": 1443.0620000000001,
"heapDeltaBytes": 23012556,
"heapUsedBytes": 85456396,
"domNodes": 12,
"jsHeapTotalBytes": 7340032,
"scriptDurationMs": 512.624,
"eventListeners": 8,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.699999999999818
},
{
"name": "minimap-idle",
"durationMs": 2050.5530000000363,
"styleRecalcs": 9,
"styleRecalcDurationMs": 7.6290000000000004,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 680.5409999999999,
"heapDeltaBytes": 7003504,
"heapUsedBytes": 67417968,
"domNodes": -282,
"jsHeapTotalBytes": 4038656,
"scriptDurationMs": 90.35400000000001,
"eventListeners": -179,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "minimap-idle",
"durationMs": 2036.202000000003,
"styleRecalcs": 8,
"styleRecalcDurationMs": 6.922999999999998,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 656.9910000000001,
"heapDeltaBytes": 6897472,
"heapUsedBytes": 67464028,
"domNodes": -284,
"jsHeapTotalBytes": 4038656,
"scriptDurationMs": 89.476,
"eventListeners": -147,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.66333333333335,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "subgraph-dom-widget-clipping",
"durationMs": 574.7799999999756,
"styleRecalcs": 46,
"styleRecalcDurationMs": 9.199,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 392.89599999999996,
"heapDeltaBytes": -10982532,
"heapUsedBytes": 53300380,
"domNodes": 18,
"jsHeapTotalBytes": 25952256,
"scriptDurationMs": 119.567,
"eventListeners": 6,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.66333333333332,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "subgraph-dom-widget-clipping",
"durationMs": 588.7109999999893,
"styleRecalcs": 46,
"styleRecalcDurationMs": 9.55,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 401.605,
"heapDeltaBytes": -10487576,
"heapUsedBytes": 53715760,
"domNodes": 18,
"jsHeapTotalBytes": 25952256,
"scriptDurationMs": 120.19200000000001,
"eventListeners": 6,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.699999999999818
},
{
"name": "subgraph-idle",
"durationMs": 2006.2490000000253,
"styleRecalcs": 9,
"styleRecalcDurationMs": 6.899000000000001,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 435.87600000000003,
"heapDeltaBytes": 5193140,
"heapUsedBytes": 69359652,
"domNodes": 18,
"jsHeapTotalBytes": 24903680,
"scriptDurationMs": 12.255,
"eventListeners": 4,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.66333333333332,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "subgraph-idle",
"durationMs": 2031.6009999999665,
"styleRecalcs": 10,
"styleRecalcDurationMs": 7.702999999999999,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 482.73599999999993,
"heapDeltaBytes": 5071508,
"heapUsedBytes": 69247568,
"domNodes": 20,
"jsHeapTotalBytes": 25427968,
"scriptDurationMs": 12.505,
"eventListeners": 4,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.800000000000182
},
{
"name": "subgraph-mouse-sweep",
"durationMs": 1708.071000000018,
"styleRecalcs": 76,
"styleRecalcDurationMs": 33.315999999999995,
"layouts": 16,
"layoutDurationMs": 4.204000000000001,
"taskDurationMs": 760.7429999999999,
"heapDeltaBytes": -17199020,
"heapUsedBytes": 46912688,
"domNodes": -282,
"jsHeapTotalBytes": 22786048,
"scriptDurationMs": 81.885,
"eventListeners": -153,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.66333333333332,
"p95FrameDurationMs": 16.800000000000182
},
{
"name": "subgraph-mouse-sweep",
"durationMs": 1760.51300000006,
"styleRecalcs": 79,
"styleRecalcDurationMs": 35.095,
"layouts": 16,
"layoutDurationMs": 4.005,
"taskDurationMs": 772.9240000000001,
"heapDeltaBytes": -17732992,
"heapUsedBytes": 46369624,
"domNodes": -277,
"jsHeapTotalBytes": 23310336,
"scriptDurationMs": 79.889,
"eventListeners": -153,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.799999999999272
},
{
"name": "subgraph-transition-enter",
"durationMs": 1400.7760000000076,
"styleRecalcs": 17,
"styleRecalcDurationMs": 28.275999999999996,
"layouts": 13,
"layoutDurationMs": 12.583,
"taskDurationMs": 903.407,
"heapDeltaBytes": 31024332,
"heapUsedBytes": 99454904,
"domNodes": 13673,
"jsHeapTotalBytes": 15466496,
"scriptDurationMs": 34.446000000000005,
"eventListeners": 2375,
"totalBlockingTimeMs": 121,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "viewport-pan-sweep",
"durationMs": 8221.540000000005,
"styleRecalcs": 249,
"styleRecalcDurationMs": 38.291,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 4234.253,
"heapDeltaBytes": 11144420,
"heapUsedBytes": 71116544,
"domNodes": -283,
"jsHeapTotalBytes": 5541888,
"scriptDurationMs": 1293.62,
"eventListeners": -133,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.66333333333332,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "viewport-pan-sweep",
"durationMs": 8237.619999999992,
"styleRecalcs": 249,
"styleRecalcDurationMs": 39.837,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 4278.307,
"heapDeltaBytes": 10541736,
"heapUsedBytes": 70406908,
"domNodes": -283,
"jsHeapTotalBytes": 4231168,
"scriptDurationMs": 1281.5189999999998,
"eventListeners": -133,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "vue-large-graph-idle",
"durationMs": 17723.075999999994,
"styleRecalcs": 0,
"styleRecalcDurationMs": 0,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 17696.994,
"heapDeltaBytes": -58642492,
"heapUsedBytes": 167276132,
"domNodes": -8312,
"jsHeapTotalBytes": -8069120,
"scriptDurationMs": 555.2320000000001,
"eventListeners": -16385,
"totalBlockingTimeMs": 0,
"frameDurationMs": 17.776666666666642,
"p95FrameDurationMs": 16.799999999999272
},
{
"name": "vue-large-graph-idle",
"durationMs": 17052.153999999973,
"styleRecalcs": 0,
"styleRecalcDurationMs": 0,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 17022.328999999998,
"heapDeltaBytes": -36786348,
"heapUsedBytes": 166831452,
"domNodes": -8312,
"jsHeapTotalBytes": -9379840,
"scriptDurationMs": 556.0690000000001,
"eventListeners": -16389,
"totalBlockingTimeMs": 0,
"frameDurationMs": 18.889999999999905,
"p95FrameDurationMs": 16.799999999999272
},
{
"name": "vue-large-graph-pan",
"durationMs": 20924.492000000042,
"styleRecalcs": 145,
"styleRecalcDurationMs": 18.600999999999978,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 20890.157000000003,
"heapDeltaBytes": -21784532,
"heapUsedBytes": 177128968,
"domNodes": -8312,
"jsHeapTotalBytes": -7872512,
"scriptDurationMs": 917.464,
"eventListeners": -16385,
"totalBlockingTimeMs": 190,
"frameDurationMs": 18.889999999999905,
"p95FrameDurationMs": 16.799999999999272
},
{
"name": "vue-large-graph-pan",
"durationMs": 21727.49699999997,
"styleRecalcs": 155,
"styleRecalcDurationMs": 20.599000000000032,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 21703.524,
"heapDeltaBytes": -39303104,
"heapUsedBytes": 166844684,
"domNodes": -8312,
"jsHeapTotalBytes": -8069120,
"scriptDurationMs": 869.095,
"eventListeners": -16383,
"totalBlockingTimeMs": 639,
"frameDurationMs": 17.776666666666642,
"p95FrameDurationMs": 16.799999999999272
},
{
"name": "workflow-execution",
"durationMs": 447.78099999996357,
"styleRecalcs": 15,
"styleRecalcDurationMs": 21.099,
"layouts": 4,
"layoutDurationMs": 1.5430000000000001,
"taskDurationMs": 116.15299999999999,
"heapDeltaBytes": 5394020,
"heapUsedBytes": 68595332,
"domNodes": 134,
"jsHeapTotalBytes": 5242880,
"scriptDurationMs": 11.452999999999998,
"eventListeners": 97,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.800000000000182
},
{
"name": "workflow-execution",
"durationMs": 449.65000000001965,
"styleRecalcs": 12,
"styleRecalcDurationMs": 17.161,
"layouts": 2,
"layoutDurationMs": 0.44800000000000006,
"taskDurationMs": 103.221,
"heapDeltaBytes": 5083296,
"heapUsedBytes": 68170088,
"domNodes": 121,
"jsHeapTotalBytes": 5505024,
"scriptDurationMs": 11.654000000000002,
"eventListeners": 97,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.800000000000182
}
]
} |
📝 WalkthroughWalkthroughBilling fixtures now include maximum and occupied seat counts. Team plan values derive from shared capacity and current team members. Pricing deep-link fixtures include seat data for active team and standard billing states. ChangesBilling seat fixtures
Estimated code review effort: 1 (Trivial) | ~5 minutes Possibly related PRs
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 |
📄 Knowledge reviewDosu skipped reviewing this PR because your organization has used its |
Codecov Report✅ All modified and coverable lines are covered by tests. @@ Coverage Diff @@
## main #14714 +/- ##
==========================================
+ Coverage 78.34% 78.74% +0.40%
==========================================
Files 1793 1794 +1
Lines 109162 104790 -4372
Branches 31120 32124 +1004
==========================================
- Hits 85522 82519 -3003
+ Misses 23143 21826 -1317
+ Partials 497 445 -52
Flags with carried forward coverage won't be shown. Click here to find out more. 🚀 New features to boost your workflow:
|
There was a problem hiding this comment.
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (1)
browser_tests/fixtures/data/cloudWorkspace.ts (1)
77-78: 🎯 Functional Correctness | 🟠 Major | ⚡ Quick winRemove duplicate
max_seatsandoccupied_seatsdefinitions from all billing fixtures. Later object members overwrite the earlier values, and Biome reports duplicate object keys.
browser_tests/fixtures/data/cloudWorkspace.ts#L77-L78: remove the duplicate pair and retain the shared-constant values at Lines 86-87.browser_tests/fixtures/data/cloudWorkspace.ts#L96-L97: remove the duplicate pair and retain the inactive values at Lines 103-104.browser_tests/tests/dialogs/pricingTableDeepLink.spec.ts#L91-L92: remove the duplicate pair or update the original fields so only the intended30/4values remain.browser_tests/tests/dialogs/pricingTableDeepLink.spec.ts#L111-L112: remove the duplicate pair and retain one1/1definition.🤖 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 `@browser_tests/fixtures/data/cloudWorkspace.ts` around lines 77 - 78, Remove duplicate max_seats and occupied_seats object members at browser_tests/fixtures/data/cloudWorkspace.ts:77-78, retaining the shared-constant values at lines 86-87; remove the duplicates at lines 96-97, retaining the inactive values at lines 103-104. In browser_tests/tests/dialogs/pricingTableDeepLink.spec.ts:91-92, keep only the intended 30/4 definitions, and at lines 111-112 retain only one 1/1 definition.Source: Linters/SAST tools
🤖 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.
Outside diff comments:
In `@browser_tests/fixtures/data/cloudWorkspace.ts`:
- Around line 77-78: Remove duplicate max_seats and occupied_seats object
members at browser_tests/fixtures/data/cloudWorkspace.ts:77-78, retaining the
shared-constant values at lines 86-87; remove the duplicates at lines 96-97,
retaining the inactive values at lines 103-104. In
browser_tests/tests/dialogs/pricingTableDeepLink.spec.ts:91-92, keep only the
intended 30/4 definitions, and at lines 111-112 retain only one 1/1 definition.
ℹ️ Review info
⚙️ Run configuration
Configuration used: Path: .coderabbit.yaml
Review profile: ASSERTIVE
Plan: Pro Plus
Run ID: ed7f7e12-e193-42c0-902a-5a789e0ca71c
📒 Files selected for processing (2)
browser_tests/fixtures/data/cloudWorkspace.tsbrowser_tests/tests/dialogs/pricingTableDeepLink.spec.ts
Pull request was closed
6a40902 to
b1861ab
Compare
…-Org#14716) *PR Created by the Glary-Bot Agent* --- Fixes [FE-1503](https://linear.app/comfyorg/issue/FE-1503/bug-canvas-navigation-setting-resets-to-custom-after-page-refresh). > Stacked on Comfy-Org#14714, which repairs `typecheck:browser` on `main`. Review that first; this PR targets its branch so the diff stays clean. ## Problem Pick a Navigation Mode, refresh, and the dropdown reads **Custom** — while the Left Mouse Click Behavior / Mouse Wheel Scroll radios still show the preset you chose. `Comfy.Canvas.NavigationMode` is stored independently of the two overrides it implies, and the three were kept in sync by cross-writes in `onChange`. Two separate paths destroyed the stored mode. **1. The preset cascade read a stale mode.** `applySettingLocally` fired `onChange` *before* committing the new value: ```ts const oldValue = get(key) if (newValue === oldValue) return undefined onChange(settingsById.value[key], newValue, oldValue) // fired first settingValues.value[key] = typedNewValue // committed second ``` So selecting `standard` cascaded into `setMany`, and `LeftMouseClickBehavior.onChange` read `NavigationMode` as the value it was replacing (`legacy`), concluded `select` no longer matched it, and wrote `NavigationMode = 'custom'`. Captured from one dropdown click: ``` POST /settings/Comfy.Canvas.NavigationMode "custom" ← spurious POST /settings {LeftMouseClickBehavior:"select", MouseWheelScroll:"panning"} POST /settings/Comfy.Canvas.NavigationMode "standard" ``` Three concurrent writes, two to the same key. ComfyUI's `app_settings.py` has an `await request.json()` between its file read and write, so these whole-file read-modify-writes are not atomic and the last one to land wins. **2. A mode stored before 1.27.4 was overruled by the override defaults.** `addSetting` replays `onChange` for every setting at registration. The overrides shipped in 1.27.4; `NavigationMode` shipped in 1.25.0. Anyone who chose a mode in between has only the mode on record, so the overrides load as their defaults — `panning`/`zoom`, which describe `legacy`. The override handlers saw the mismatch and rewrote the mode to `custom` on the first load after upgrading, with no user interaction. Deterministic, and it explains "has been there for quite some time" on both Windows and Mac. Once `custom` is stored the handlers no-op, so it never recovers. This also isn't purely cosmetic: `useCanvasInteractions` gates on `NavigationMode === 'standard'` exactly, so the standard-mode wheel path silently turns off. ## Fix - **Commit the value before firing `onChange`** so a cascade observes the mode it is applying. This removes the spurious write entirely, leaving one write per key. - **Treat a stored preset as authoritative.** On the registration replay, a stored preset now supplies the overrides that were never stored, instead of being overruled by their defaults. The preset pairs move into one `CANVAS_NAVIGATION_PRESETS` map rather than being restated per branch. Muting the override handlers during registration was the smaller change and I started there, but review caught that it only fixes the label: the dropdown would read Standard while the canvas still panned and zoomed like Legacy. Making the preset supply its missing overrides fixes both, and affected profiles self-heal on next load. ## Tests Written first, and each fails on `main`: | Test | On `main` | |---|---| | picking a preset never persists custom | `Received array: ["custom", "standard"]` | | keeps the stored preset through load | `Expected "standard"`, `Received "custom"` | | applies the stored preset to the overrides | `Expected "select"`, `Received "panning"` | The third is the one that would have caught the label-only fix. The unit test in `settingStore.test.ts` pins the ordering contract directly (`['default','default']` vs `['default','newvalue']` without the fix), since it governs every setting, not just this cluster. ## Verification Reproduced and confirmed end to end against a local ComfyUI backend. Seeded a pre-1.27.4 profile (`NavigationMode: 'standard'`, overrides absent) and loaded the page with no user interaction: **Before** — `comfy.settings.json` silently rewritten to `custom`; dropdown reads Custom while the radios still show the Standard pair:  **After** — mode holds, and the overrides materialise to `select`/`panning` so label and behaviour agree:  - 3 Playwright tests + `settingStore` unit test: fail on `main`, pass here - `canvasSettings.spec.ts`: 5 pre-existing failures in this sandbox (headless canvas drag + screenshot baselines) — identical set on clean `main`; baseline 8 passed → 10 passed here - `pnpm test:unit`: 3 pre-existing failing files (`previewAny`, `onboardingCloudRoutes`, `GraphView`), confirmed failing on clean `main`, none in the settings domain - `pnpm typecheck`, `typecheck:browser`, `lint`, `format:check`, `knip` — all clean ## Follow-ups (not in scope here) - `Comfy.Canvas.NavigationMode` would be better derived from the two overrides than stored as a third key — one source of truth, no cross-setting cascade. That removes this bug class rather than this instance. - `POST /settings` and `POST /settings/{id}` in ComfyUI's `app/app_settings.py` do non-atomic read-modify-write of one JSON file with an `await` between read and write, so any concurrent setting writes can lose updates. - [FE-1507](https://linear.app/comfyorg/issue/FE-1507/ops-run-typecheckbrowser-unconditionally-so-browser-tests-type-errors) — make `typecheck:browser` unconditional in CI. ## Screenshots   --------- Co-authored-by: Glary-Bot <glary-bot@users.noreply.github.com>
PR Created by the Glary-Bot Agent
Problem
pnpm typecheck:browserfails onmainwith 9 errors across 4 files.[chore] Update Ingest API types from cloud@9cd6161(#13499) mademax_seatsandoccupied_seatsrequired on the generatedBillingStatusResponse, without updating the browser-test billing fixtures that construct it.That commit touched only
packages/ingest-types/src/{index,types.gen,zod.gen}.ts— zero files underbrowser_tests/.typecheck:browserruns in.github/actions/lint-format-verify/action.ymlbehind adorny/paths-filteronbrowser_tests/**, so the check was skipped on both its PR run and its push tomain, and it merged red.Change
Adds the two required fields to the four base fixtures the others spread from:
TEAM_BILLING_STATUSandENDED_STANDARD_BILLING_STATUSinbrowser_tests/fixtures/data/cloudWorkspace.tsACTIVE_TEAM_STATUSandACTIVE_STANDARD_STATUSinbrowser_tests/tests/dialogs/pricingTableDeepLink.spec.tsACTIVE_CREATOR_STATUS,LEGACY_ACTIVE_STANDARD_STATUSandRECOVERED_3DS_STATUSspread from those bases, andCloudWorkspaceMockHelper/endedSubscription.spec.tsconsume the exported constants, so all 9 errors clear from these four edits.Nothing outside the generated types reads either field — the only
.max_seatsconsumer insrc/isuseBillingContext.ts:197, which readsPlan.max_seats, a different object — so this is type conformance only and does not change what any test exercises.The team fixture derives both values from the seat count already declared beside it (
TEAM_MAX_SEATS,DEFAULT_TEAM_MEMBERS.length) rather than restating30/4, so the billing status and the plan cannot drift apart.Verification
pnpm typecheck:browser— 9 errors before, 0 afterpnpm typecheck,pnpm lint,pnpm format:check,pnpm knip— all cleanNotes
Prerequisite for the Canvas Navigation fix PR, which adds a
browser_tests/spec and therefore triggers this check.Filed FE-1507 to make
typecheck:browserunconditional so this class of breakage cannot merge again — the gate currently triggers on the test directory changing, while these types break when the types those tests consume change.