[backport core/1.48] fix(workspace): show subscribe prompt for ended subscriptions - #14511
Conversation
- Treat `subscription_status: ended` as terminal even when `is_active`
and paid-plan metadata lag behind.
- Show the subscribe prompt instead of a stale Standard plan.
- Keep cloud billing mocks internally consistent and add component and
end-to-end regression coverage.
The subscription panel required `ended` **and** `is_active=false`. When
the terminal status arrived first, stale active/plan data suppressed the
subscribe prompt.
```mermaid
flowchart LR
subgraph BEFORE[Before]
direction TB
B1[Billing state loads] --> B2{"ended AND is_active=false?"}
B2 -- Yes --> B3[Show subscribe prompt]
B2 -- "No: ended + stale active" --> B4[Show stale Standard plan]
end
subgraph AFTER[After]
direction TB
A1[Billing state loads] --> A2{"subscription_status = ended?"}
A2 -- Yes --> A3[Show subscribe prompt]
A2 -- No --> A4{"Active paid plan?"}
A4 -- Yes --> A5[Show current plan]
A4 -- No --> A3
end
```
- `SubscriptionPanelContentWorkspace.vue`: ended status now takes
precedence over stale paid-plan guards.
- `CloudWorkspaceMockHelper.ts`: `current_plan_slug` always has a
matching plan.
- Tests retain stale active/paid/team-plan state so the regression
specifically verifies ended-status precedence.
- Component tests: 42 passed
- Cloud Playwright regression: 1 passed
- App and browser typechecks
- Formatting, lint, commit hooks, and `knip`
|
Important Review skippedIgnore keyword(s) in the title. ⛔ Ignored keywords (2)
Please check the settings in the CodeRabbit UI or the ⚙️ Run configurationConfiguration used: Path: .coderabbit.yaml Review profile: ASSERTIVE Plan: Pro Plus Run ID: You can disable this status message by setting the Use the checkbox below for a quick retry:
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
🎨 Storybook: ✅ Built — View Storybook🎭 Playwright: ✅ 1763 passed, 0 failed📊 Browser Reports
📦 Bundle Size
⚡ Performance Report
Show regressions
All metrics
Historical variance (last 15 runs)
Trend (last 15 commits on main)
Raw data{
"timestamp": "2026-07-31T22:26:53.753Z",
"gitSha": "29e4aa6a95ed80868c62f2f3dfd491cdb2f75a48",
"branch": "backport-14504-to-core-1.48",
"measurements": [
{
"name": "canvas-idle",
"durationMs": 2196.6879999999946,
"styleRecalcs": 10,
"styleRecalcDurationMs": 7.997999999999998,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 474.032,
"heapDeltaBytes": 3433724,
"heapUsedBytes": 71200720,
"domNodes": 20,
"jsHeapTotalBytes": 20578304,
"scriptDurationMs": 18.804,
"eventListeners": 6,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.659999999999975,
"p95FrameDurationMs": 16.699999999999818
},
{
"name": "canvas-idle",
"durationMs": 2055.2579999999807,
"styleRecalcs": 10,
"styleRecalcDurationMs": 7.271,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 506.069,
"heapDeltaBytes": -22733368,
"heapUsedBytes": 45455536,
"domNodes": 20,
"jsHeapTotalBytes": 19656704,
"scriptDurationMs": 16.901000000000003,
"eventListeners": 4,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.699999999999818
},
{
"name": "canvas-mouse-sweep",
"durationMs": 1789.2369999999858,
"styleRecalcs": 73,
"styleRecalcDurationMs": 33.238,
"layouts": 12,
"layoutDurationMs": 3.6249999999999996,
"taskDurationMs": 794.648,
"heapDeltaBytes": -1634932,
"heapUsedBytes": 66336816,
"domNodes": 56,
"jsHeapTotalBytes": 21102592,
"scriptDurationMs": 107.617,
"eventListeners": 4,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.66333333333335,
"p95FrameDurationMs": 16.699999999999818
},
{
"name": "canvas-mouse-sweep",
"durationMs": 1872.3260000000437,
"styleRecalcs": 76,
"styleRecalcDurationMs": 39.785000000000004,
"layouts": 12,
"layoutDurationMs": 3.595,
"taskDurationMs": 934.474,
"heapDeltaBytes": -16285944,
"heapUsedBytes": 51481712,
"domNodes": -273,
"jsHeapTotalBytes": 21491712,
"scriptDurationMs": 123.11899999999999,
"eventListeners": -148,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.66333333333332,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "canvas-zoom-sweep",
"durationMs": 1756.2839999999937,
"styleRecalcs": 32,
"styleRecalcDurationMs": 16.159,
"layouts": 6,
"layoutDurationMs": 0.727,
"taskDurationMs": 381.096,
"heapDeltaBytes": 7237244,
"heapUsedBytes": 75216540,
"domNodes": 77,
"jsHeapTotalBytes": 20578304,
"scriptDurationMs": 18.113999999999997,
"eventListeners": 19,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "canvas-zoom-sweep",
"durationMs": 1736.6269999999986,
"styleRecalcs": 32,
"styleRecalcDurationMs": 16.869,
"layouts": 6,
"layoutDurationMs": 0.691,
"taskDurationMs": 367.71999999999997,
"heapDeltaBytes": 7255940,
"heapUsedBytes": 75149908,
"domNodes": 77,
"jsHeapTotalBytes": 20316160,
"scriptDurationMs": 18.608999999999998,
"eventListeners": 19,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.66333333333335,
"p95FrameDurationMs": 16.799999999999272
},
{
"name": "dom-widget-clipping",
"durationMs": 589.0919999999937,
"styleRecalcs": 12,
"styleRecalcDurationMs": 7.623000000000001,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 369.76,
"heapDeltaBytes": -12254460,
"heapUsedBytes": 55490500,
"domNodes": 20,
"jsHeapTotalBytes": 21626880,
"scriptDurationMs": 55.00899999999999,
"eventListeners": 0,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "dom-widget-clipping",
"durationMs": 556.6850000000159,
"styleRecalcs": 12,
"styleRecalcDurationMs": 7.491000000000001,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 367.779,
"heapDeltaBytes": -12264232,
"heapUsedBytes": 55630416,
"domNodes": 20,
"jsHeapTotalBytes": 20840448,
"scriptDurationMs": 55.34,
"eventListeners": 0,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "large-graph-idle",
"durationMs": 2048.291000000006,
"styleRecalcs": 10,
"styleRecalcDurationMs": 8.256,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 665.034,
"heapDeltaBytes": 6521168,
"heapUsedBytes": 65268616,
"domNodes": -272,
"jsHeapTotalBytes": 4784128,
"scriptDurationMs": 93.062,
"eventListeners": -144,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.66333333333335,
"p95FrameDurationMs": 16.799999999999272
},
{
"name": "large-graph-idle",
"durationMs": 2038.821999999982,
"styleRecalcs": 9,
"styleRecalcDurationMs": 7.132,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 676.296,
"heapDeltaBytes": 7271980,
"heapUsedBytes": 66004512,
"domNodes": -274,
"jsHeapTotalBytes": 5308416,
"scriptDurationMs": 97.90199999999999,
"eventListeners": -142,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "large-graph-pan",
"durationMs": 2138.286999999991,
"styleRecalcs": 68,
"styleRecalcDurationMs": 13.221,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 1218.157,
"heapDeltaBytes": -3943108,
"heapUsedBytes": 55789312,
"domNodes": -276,
"jsHeapTotalBytes": 5570560,
"scriptDurationMs": 390.781,
"eventListeners": -142,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.800000000000182
},
{
"name": "large-graph-pan",
"durationMs": 2162.292999999977,
"styleRecalcs": 68,
"styleRecalcDurationMs": 14.478000000000002,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 1279.798,
"heapDeltaBytes": 4817100,
"heapUsedBytes": 65211332,
"domNodes": -279,
"jsHeapTotalBytes": 4988928,
"scriptDurationMs": 410.576,
"eventListeners": -144,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.66333333333335,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "large-graph-zoom",
"durationMs": 3180.0680000000057,
"styleRecalcs": 65,
"styleRecalcDurationMs": 14.996999999999996,
"layouts": 60,
"layoutDurationMs": 8.039000000000001,
"taskDurationMs": 1512.383,
"heapDeltaBytes": -1637888,
"heapUsedBytes": 59909292,
"domNodes": -281,
"jsHeapTotalBytes": 8192000,
"scriptDurationMs": 548.933,
"eventListeners": -148,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.800000000000182
},
{
"name": "large-graph-zoom",
"durationMs": 3179.9230000000307,
"styleRecalcs": 66,
"styleRecalcDurationMs": 16.459000000000003,
"layouts": 60,
"layoutDurationMs": 7.929,
"taskDurationMs": 1507.905,
"heapDeltaBytes": -3343096,
"heapUsedBytes": 58018108,
"domNodes": -280,
"jsHeapTotalBytes": 7929856,
"scriptDurationMs": 522.1060000000001,
"eventListeners": -148,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "minimap-idle",
"durationMs": 2013.9639999999872,
"styleRecalcs": 8,
"styleRecalcDurationMs": 6.370999999999998,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 667.967,
"heapDeltaBytes": 6451036,
"heapUsedBytes": 67049112,
"domNodes": -277,
"jsHeapTotalBytes": 4521984,
"scriptDurationMs": 93.15400000000001,
"eventListeners": -144,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.799999999999272
},
{
"name": "minimap-idle",
"durationMs": 2037.8509999999324,
"styleRecalcs": 8,
"styleRecalcDurationMs": 6.169999999999998,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 675.006,
"heapDeltaBytes": 7126076,
"heapUsedBytes": 67477288,
"domNodes": -277,
"jsHeapTotalBytes": 3997696,
"scriptDurationMs": 100.72499999999998,
"eventListeners": -144,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.66333333333335,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "subgraph-dom-widget-clipping",
"durationMs": 608.854000000008,
"styleRecalcs": 46,
"styleRecalcDurationMs": 11.871999999999998,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 417.388,
"heapDeltaBytes": -11841016,
"heapUsedBytes": 56193516,
"domNodes": 18,
"jsHeapTotalBytes": 21889024,
"scriptDurationMs": 124.81500000000001,
"eventListeners": 8,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "subgraph-dom-widget-clipping",
"durationMs": 600.5269999999427,
"styleRecalcs": 45,
"styleRecalcDurationMs": 9.142000000000001,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 399.30100000000004,
"heapDeltaBytes": -12169128,
"heapUsedBytes": 55931452,
"domNodes": 16,
"jsHeapTotalBytes": 22151168,
"scriptDurationMs": 120.48199999999999,
"eventListeners": 6,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "subgraph-idle",
"durationMs": 1993.9190000000053,
"styleRecalcs": 10,
"styleRecalcDurationMs": 6.971000000000002,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 438.5849999999999,
"heapDeltaBytes": 3458488,
"heapUsedBytes": 71448712,
"domNodes": 20,
"jsHeapTotalBytes": 20840448,
"scriptDurationMs": 13.109999999999998,
"eventListeners": 4,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.66999999999998,
"p95FrameDurationMs": 16.800000000000182
},
{
"name": "subgraph-idle",
"durationMs": 2011.2440000000333,
"styleRecalcs": 10,
"styleRecalcDurationMs": 7.330999999999999,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 501.582,
"heapDeltaBytes": -21607060,
"heapUsedBytes": 46315596,
"domNodes": -273,
"jsHeapTotalBytes": 20180992,
"scriptDurationMs": 14.342,
"eventListeners": -148,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.800000000000182
},
{
"name": "subgraph-mouse-sweep",
"durationMs": 1739.768999999967,
"styleRecalcs": 78,
"styleRecalcDurationMs": 34.24099999999999,
"layouts": 16,
"layoutDurationMs": 3.9140000000000006,
"taskDurationMs": 766.35,
"heapDeltaBytes": -20972032,
"heapUsedBytes": 47003844,
"domNodes": -272,
"jsHeapTotalBytes": 20443136,
"scriptDurationMs": 84.09800000000001,
"eventListeners": -148,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.800000000000182
},
{
"name": "subgraph-mouse-sweep",
"durationMs": 1708.8619999999537,
"styleRecalcs": 75,
"styleRecalcDurationMs": 34.653000000000006,
"layouts": 16,
"layoutDurationMs": 4.314,
"taskDurationMs": 785.457,
"heapDeltaBytes": -20608328,
"heapUsedBytes": 47311632,
"domNodes": -273,
"jsHeapTotalBytes": 20967424,
"scriptDurationMs": 90.115,
"eventListeners": -148,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "subgraph-transition-enter",
"durationMs": 1384.7489999999993,
"styleRecalcs": 19,
"styleRecalcDurationMs": 29.026999999999997,
"layouts": 15,
"layoutDurationMs": 11.099999999999998,
"taskDurationMs": 899.2419999999998,
"heapDeltaBytes": 29240144,
"heapUsedBytes": 99414568,
"domNodes": 13673,
"jsHeapTotalBytes": 16252928,
"scriptDurationMs": 30.149999999999995,
"eventListeners": 2371,
"totalBlockingTimeMs": 123,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "viewport-pan-sweep",
"durationMs": 8204.903000000002,
"styleRecalcs": 251,
"styleRecalcDurationMs": 38.224,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 4265.269,
"heapDeltaBytes": 11433344,
"heapUsedBytes": 72166048,
"domNodes": -273,
"jsHeapTotalBytes": 6823936,
"scriptDurationMs": 1255.5559999999998,
"eventListeners": -128,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.66333333333338,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "viewport-pan-sweep",
"durationMs": 8237.717999999972,
"styleRecalcs": 249,
"styleRecalcDurationMs": 40.33,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 4350.423,
"heapDeltaBytes": 9890308,
"heapUsedBytes": 69132092,
"domNodes": -276,
"jsHeapTotalBytes": 6561792,
"scriptDurationMs": 1307.086,
"eventListeners": -128,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.799999999999272
},
{
"name": "vue-large-graph-idle",
"durationMs": 17252.12300000004,
"styleRecalcs": 0,
"styleRecalcDurationMs": 0,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 17223.240999999998,
"heapDeltaBytes": -59257204,
"heapUsedBytes": 165866320,
"domNodes": -8312,
"jsHeapTotalBytes": -16715776,
"scriptDurationMs": 534.772,
"eventListeners": -16389,
"totalBlockingTimeMs": 0,
"frameDurationMs": 17.776666666666763,
"p95FrameDurationMs": 16.799999999999272
},
{
"name": "vue-large-graph-idle",
"durationMs": 17492.400999999973,
"styleRecalcs": 0,
"styleRecalcDurationMs": 0,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 17476.669,
"heapDeltaBytes": -57665000,
"heapUsedBytes": 167186204,
"domNodes": -8312,
"jsHeapTotalBytes": -13307904,
"scriptDurationMs": 525.423,
"eventListeners": -16387,
"totalBlockingTimeMs": 0,
"frameDurationMs": 18.33666666666662,
"p95FrameDurationMs": 16.799999999999272
},
{
"name": "vue-large-graph-pan",
"durationMs": 21930.42600000001,
"styleRecalcs": 160,
"styleRecalcDurationMs": 21.763999999999978,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 21903.073,
"heapDeltaBytes": -46515932,
"heapUsedBytes": 166233256,
"domNodes": -8312,
"jsHeapTotalBytes": -15929344,
"scriptDurationMs": 903.493,
"eventListeners": -16381,
"totalBlockingTimeMs": 409,
"frameDurationMs": 18.33666666666662,
"p95FrameDurationMs": 16.799999999999272
},
{
"name": "vue-large-graph-pan",
"durationMs": 21535.708,
"styleRecalcs": 152,
"styleRecalcDurationMs": 20.909999999999982,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 21502.384,
"heapDeltaBytes": -58567856,
"heapUsedBytes": 174683056,
"domNodes": -8312,
"jsHeapTotalBytes": -14704640,
"scriptDurationMs": 878.1709999999999,
"eventListeners": -16381,
"totalBlockingTimeMs": 483,
"frameDurationMs": 17.776666666666642,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "workflow-execution",
"durationMs": 487.07600000000184,
"styleRecalcs": 13,
"styleRecalcDurationMs": 18.824,
"layouts": 2,
"layoutDurationMs": 0.433,
"taskDurationMs": 118.069,
"heapDeltaBytes": -15935888,
"heapUsedBytes": 51083556,
"domNodes": 130,
"jsHeapTotalBytes": 7995392,
"scriptDurationMs": 9.617,
"eventListeners": 67,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "workflow-execution",
"durationMs": 477.4639999999408,
"styleRecalcs": 11,
"styleRecalcDurationMs": 18.987000000000002,
"layouts": 3,
"layoutDurationMs": 0.6580000000000001,
"taskDurationMs": 110.785,
"heapDeltaBytes": -16057664,
"heapUsedBytes": 51025816,
"domNodes": 117,
"jsHeapTotalBytes": 7208960,
"scriptDurationMs": 9.190999999999999,
"eventListeners": 65,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.66333333333332,
"p95FrameDurationMs": 16.800000000000182
}
]
} |
📄 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 @@
## core/1.48 #14511 +/- ##
==========================================
Coverage 79.32% 79.32%
==========================================
Files 1746 1746
Lines 99331 99332 +1
Branches 32588 32589 +1
==========================================
+ Hits 78794 78795 +1
Misses 20135 20135
Partials 402 402
Flags with carried forward coverage won't be shown. Click here to find out more.
🚀 New features to boost your workflow:
|
Summary
Backport of #14504 to
core/1.48.subscription_status: endedas terminal even when paid-plan metadata is stale.Validation
knippush hook