fix(smoke): robustness for log-habit modal + paywall plans-load - #289
Conversation
…-habit The create-habit modal (AppOverlay) closes on submit, but its backdrop briefly intercepts pointer events during the close animation. The test clicked the new row's status toggle immediately after submit, so the click timed out (60s). Wait for the form to be hidden first. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
The /upgrade radiogroup only renders once useSubscriptionPlans() resolves. On the first real smoke run the plans query did not resolve within the 15s default, so the assertion failed and rolled back a healthy deploy. Give the plan selector + checkout 30s (a total plans failure still fails). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
|
The latest updates on your projects. Learn more about Vercel for GitHub. 1 Skipped Deployment
|
There was a problem hiding this comment.
Code Review: PR #289
Scope: PR #289 - fix(smoke): robustness for log-habit modal + paywall plans-load
Recommendation: APPROVE
Summary
Two apps/web/e2e/ smoke test files were hardened against timing failures. The log-habit fix correctly waits for the create-modal to fully close before interacting with the new row (eliminating the backdrop click-intercept race). The paywall fix raises the assertion timeout to 30s to tolerate cold-start serverless latency on the first post-deploy plan query. No production code was changed.
Findings
Critical
None
High
None
Medium
None
Low / Info
None
Subagents
| Agent | Verdict |
|---|---|
| parity-checker | N/A - smoke tests are web-only by design (CLAUDE.md: no mobile E2E) |
| i18n-syncer | N/A - no user-facing strings changed |
| contract-aligner | N/A - no shared types or API contracts changed |
| security-reviewer | N/A - no orbit-api code changed |
Validation
| Check | Result |
|---|---|
| Lint | N/A - E2E test files only; no production lint gate |
| Type check | N/A - no source types changed |
| Tests | N/A - no unit tests changed |
| Build (api) | N/A - no backend touched |
What is good
- await expect(titleInput).toBeHidden() is the right fix: it anchors to the actual DOM state that unblocks the backdrop, not an arbitrary sleep. Robust and intention-revealing.
- Scoping the 30s timeout only to the two assertions that need it (radiogroup + checkout CTA) rather than raising the global Playwright timeout keeps the test suite fast for every other assertion.
- PR body clearly distinguishes test-robustness fixes from app regressions, which is exactly the right framing.
- Diff is minimal: 4 lines changed, no production code, no scope creep.
Recommendation
Clean, targeted fixes with no correctness, parity, contract, or security concerns. Ready to merge.
|



Context
The prod smoke suite (#253) reached its flows for the first time once #288 fixed the BFF 204 that was breaking setup. It then failed 2 of 5 flows — both test-robustness, not app regressions (setup + Astra-create-habit + auth + create-habit + cleanup all pass).
Fixes
AppOverlay) closes on submit, but its backdrop briefly intercepts pointer events during the close animation; the test clicked the new row's toggle immediately and the click timed out (60s). Wait for the form to be hidden first./upgrade's plan radiogroup renders only onceuseSubscriptionPlans()resolves; on a cold post-deploy serverless start the query didn't resolve within the 15s default. Give the radiogroup + checkout 30s (a total plans failure still fails the test).No production code touched —
apps/web/e2e/**only.🤖 Generated with Claude Code