fix(blueprint): show why an update preview timed out - #2912
Merged
Conversation
|
View your CI Pipeline Execution ↗ for commit 735f615
💡 Verify your cache is correct by running tasks in a sandbox. Read docs ↗ ☁️ Nx Cloud last updated this comment at |
Codecov Report✅ All modified and coverable lines are covered by tests. Additional details and impacted files@@ Coverage Diff @@
## staging #2912 +/- ##
========================================
Coverage 48.49% 48.49%
========================================
Files 1303 1303
Lines 28117 28117
Branches 8215 8215
========================================
Hits 13634 13634
Misses 12187 12187
Partials 2296 2296
Flags with carried forward coverage won't be shown. Click here to find out more. ☔ View full report in Codecov by Harness. 🚀 New features to boost your workflow:
|
Contributor
There was a problem hiding this comment.
No issues found across 4 files
Confidence score: 5/5
- Automated review surfaced no issues in the provided summaries.
- No files require special attention.
Tip: cubic could auto-approve low-risk PRs like this, if it thinks it's safe to merge. Learn more
Re-trigger cubic
Why: A blueprint update preview that times out says only that it timed out. Users cannot tell whether their change is too slow, something is stuck, or a retry would help. What: A timed-out preview now shows the reason underneath — which step ran out of time and after how long — the way a failed preview already shows its error. Notes: Merge before the q-core change. Reversed, engine timeouts briefly lose detail users see today. Nothing here could have failed a build: the WS layer is an unvalidated `JSON.parse`, ts-pattern matches structurally, and `.exhaustive()` checks variants rather than fields — so the dropped field was invisible to both the type checker and the tests.
Why: The comment opened by restating what the field obviously holds before reaching the part that actually matters — why the type was declared locally at all. What: It says only that the pinned ws client predates the field, and that the alias goes when the client is regenerated.
Why: The local frame type existed only to bridge a websocket client that predates the field. Keeping it would ship a cast that outlives its reason and cost a second PR to remove. What: The timeout branch reads `message` straight off the generated frame, like the error branch beside it. Notes: This does not typecheck until package.json pins a client regenerated from the openapi-spec change: `tsc` fails with one error on that line and nothing else. Jest is unaffected — the field is on the wire today, so all 24 tests pass.
Astach
force-pushed
the
fix/blueprint-preview-timeout-reason
branch
from
August 28, 2026 09:08
e07a405 to
5b2a31e
Compare
Why: The timeout branch reads a field the pinned client did not declare, so the console did not build. What: The console builds again, with the timeout reason typed the way the websocket schema declares it. Notes: The lockfile delta is that one entry; nothing else moved. `message` arrives optional and nullable, which is why the mapping keeps its `?? undefined`.
…iew-timeout-reason # Conflicts: # yarn.lock
rmnbrd
enabled auto-merge (squash)
August 28, 2026 13:18
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
What:
The preview socket's timeout branch now reads the frame's
messageand passes it to the failure panel asreason, exactly as the error branch already does. The domain outcome gains an optionalmessageto carry it.Why:
The engine now bounds a preview's terraform run and reports hitting that bound as a timeout naming which step ran out of time and after how long, which q-core publishes as
{"type":"timeout","message":...}instead of an error. The console discarded that message, so shipping the backend work alone would have been a net regression: the same condition arrives today astype=error, whose message the console does render, so users would have gone from a specific reason to "The preview timed out before completing." and nothing else.Notes:
messageis optional because two producers have no reason to report: the 12min client-side watchdog, and the gateway's own synthesized frames.TimeoutFrameexists only because the pinned qovery-ws-typescript-axios (0.1.644) predates the field. The field is on the wire today, so reading it is correct before the client bump; the generated websocket schema now declares itstring | nulland not required, so the alias can be deleted once the client is regenerated.Worth knowing for the next person: nothing here could have failed a build. The WS layer is an unvalidated
JSON.parse, ts-pattern matches structurally, and.exhaustive()checks variants rather than fields — so a dropped field is invisible to both the type checker and the tests.Screenshots / Recordings
Testing
yarn testoryarn test -u(if you need to regenerate snapshots)yarn formatyarn lintPR Checklist
.cursor/rules)feat(service): add new Terraform service) - required for semantic-releaseSummary by cubic
Blueprint update previews that time out now show why, matching how failed previews already show their error. The socket's timeout branch reads the frame's
messageand passes it to the failure panel asreason; previously the message was discarded and users saw only "The preview timed out before completing."messageis optional because the client-side watchdog and gateway frames don't always include one. The pinnedqovery-ws-typescript-axiosis bumped to 0.1.646 so the field is typed. Merge before the q-core change; reversed, engine timeouts briefly lose the detail users see today.Written for commit 735f615. Summary will update on new commits.