Skip to content

Fix production smoke health configuration#103

Merged
BASIC-BIT merged 1 commit into
mainfrom
chore/deployed-health-config-docs
May 30, 2026
Merged

Fix production smoke health configuration#103
BASIC-BIT merged 1 commit into
mainfrom
chore/deployed-health-config-docs

Conversation

@BASIC-BIT
Copy link
Copy Markdown
Owner

What changed

  • Documents the expected IaC/config posture for deployed health environment variables.
  • Ignores local Vercel project metadata generated by vercel link.
  • Narrows hosted production smoke to public routes that do not require Playwright-only fixtures.

Why

The manual production smoke health workflow was now wired, but failed because hosted smoke still expected fixture-backed profile/search data that production intentionally does not expose.

Testing

Risk

Production smoke coverage is intentionally narrower in hosted mode; full fixture-backed route checks still run locally/CI where Playwright fixtures are enabled.

Continues #100.

@vercel
Copy link
Copy Markdown

vercel Bot commented May 30, 2026

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
vr-dex-web Ready Ready Preview, Comment May 30, 2026 10:08am

Request Review

@github-actions
Copy link
Copy Markdown

Playwright Data-Flow Preview

Outcome: success
Run: https://github.com/BASIC-BIT/VRDex/actions/runs/26681155781
Artifact: playwright-data-flow

Captured flow:

  • test-gated profile submission form
  • gated helper rejection without the Playwright token
  • Convex profile creation
  • submission success state
  • public profile page readback
  • discovery search readback

Artifacts include screenshots, traces, and recorded video for the flow run.

@github-actions
Copy link
Copy Markdown

Playwright Image Diff

Outcome: success
Run: https://github.com/BASIC-BIT/VRDex/actions/runs/26681155781
Artifact: playwright-image-diff

Changed screenshot baselines: none in this PR.

This check compares public route screenshots against committed baselines. Inline images show only added or modified baseline PNGs.

@github-actions
Copy link
Copy Markdown

Playwright Public Screenshot Preview

Outcome: success
Run: https://github.com/BASIC-BIT/VRDex/actions/runs/26681155781
Artifact: playwright-public-preview

Screenshots: all public route checks passed on desktop and mobile.

Full screenshot set is available in the artifact. Pixel diff baselines are handled by the separate Playwright Image Diff check.

@BASIC-BIT BASIC-BIT marked this pull request as ready for review May 30, 2026 10:11
@chatgpt-codex-connector
Copy link
Copy Markdown

You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard.
To continue using code reviews, add credits to your account and enable them for code reviews in your settings.

@BASIC-BIT BASIC-BIT merged commit 2a5e172 into main May 30, 2026
18 checks passed
@BASIC-BIT BASIC-BIT deleted the chore/deployed-health-config-docs branch May 30, 2026 10:12
@greptile-apps
Copy link
Copy Markdown

greptile-apps Bot commented May 30, 2026

Greptile Summary

This PR narrows the hosted production smoke suite to six fixture-free public routes, documents the expected environment variable posture for E2E helpers across environments, and formalises the IaC-first rule in AGENTS.md and strategy docs.

  • public-routes.smoke.spec.ts now selects productionSmokeRoutes when PLAYWRIGHT_BASE_URL is set, falling back to the full capturedRoutes set locally; the narrower list is defined in public-routes.ts as a string-name filter over capturedRoutes.
  • Documentation in convex-environments.md and vercel-preview.md explicitly scopes VRDEX_ENABLE_E2E_HELPERS and related tokens to dev/staging only, with a clear prohibition on production exposure.
  • .vercel is added to .gitignore to prevent local project metadata from being committed.

Confidence Score: 4/5

Safe to merge; the production smoke narrowing is intentional and correct today, but the string-name filter in productionSmokeRoutes has no guard against silent zero-test runs if routes are renamed.

The string-name filter that builds productionSmokeRoutes will silently yield an empty list if any of the six hardcoded names is later renamed, causing the entire hosted smoke suite to pass with zero tests and provide false confidence about production health.

apps/web/e2e/public-routes.ts and apps/web/e2e/public-routes.smoke.spec.ts warrant a second look for the empty-filter and broad-signal concerns.

Important Files Changed

Filename Overview
apps/web/e2e/public-routes.smoke.spec.ts Route selection switched on PLAYWRIGHT_BASE_URL presence; the signal is too broad and could unintentionally narrow coverage on dev/staging hosted runs
apps/web/e2e/public-routes.ts Adds productionSmokeRoutes via string-name filter; no guard against the filtered list being empty, which would silently produce a zero-test suite
.gitignore Adds .vercel to gitignore to prevent local Vercel project metadata from being committed
AGENTS.md Adds Infrastructure and environment rule, formalising the IaC-first posture that was previously undocumented
docs/deployment/convex-environments.md Documents hosted E2E helper env vars for dev/staging and explicitly prohibits enabling them on production
docs/deployment/vercel-preview.md Documents IaC-first posture for repo secrets and scopes E2E helper env vars to dev/staging only
docs/planning/engineering-strategy.md Aligns engineering strategy doc with the new IaC-first rule added to AGENTS.md
docs/testing/playwright-visual-preview.md Clarifies that hosted smoke covers production-safe public routes only, not fixture-backed routes

Flowchart

%%{init: {'theme': 'neutral'}}%%
flowchart TD
    A[pnpm test:e2e:hosted:smoke] --> B{PLAYWRIGHT_BASE_URL set?}
    B -- Yes --> C[productionSmokeRoutes\n6 fixture-free routes]
    B -- No --> D[capturedRoutes\nfull local set]
    C --> E[filter capturedRoutes by string name]
    E --> F{all 6 names resolve?}
    F -- Yes --> G[run 6 smoke tests against hosted URL]
    F -- No / empty --> H[⚠️ suite passes vacuously\nwith 0 tests]
    D --> I[run full smoke suite locally]
Loading
Prompt To Fix All With AI
Fix the following 2 code review issues. Work through them one at a time, proposing concise fixes.

---

### Issue 1 of 2
apps/web/e2e/public-routes.ts:351-355
**Silent empty suite if names drift**

`productionSmokeRoutes` is built by filtering `capturedRoutes` on a hard-coded list of string names. If any of the six names is later renamed (or mistyped here), the filter silently drops it — and if they all disappear, the test suite passes with zero tests, giving false green on production smoke runs. There is no assertion that the filtered list is non-empty or that every listed name resolved to a route.

### Issue 2 of 2
apps/web/e2e/public-routes.smoke.spec.ts:5
**`PLAYWRIGHT_BASE_URL` as production signal narrows staging smoke coverage**

`PLAYWRIGHT_BASE_URL` is also set when running the mutation-backed hosted flow against a dev/staging target (per the docs: `set PLAYWRIGHT_BASE_URL and VRDEX_E2E_BROWSER_TOKEN`). If anyone runs this smoke spec against a dev/staging URL that does have fixture data, they'll silently exercise only the 6 production-safe routes rather than the full `capturedRoutes` set — potentially missing regressions that only surface through fixture-backed routes. A separate env var (e.g. `PLAYWRIGHT_PRODUCTION_SMOKE=true`) would make the intent explicit.

Reviews (1): Last reviewed commit: "Document deployed health config" | Re-trigger Greptile

Comment on lines +351 to +355
export const productionSmokeRoutes: CapturedRoute[] = capturedRoutes.filter((route) =>
["submit", "sign-in", "privacy-suppression", "event-new-signed-out", "server-status", "deployment"].includes(
route.name,
),
);
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Silent empty suite if names drift

productionSmokeRoutes is built by filtering capturedRoutes on a hard-coded list of string names. If any of the six names is later renamed (or mistyped here), the filter silently drops it — and if they all disappear, the test suite passes with zero tests, giving false green on production smoke runs. There is no assertion that the filtered list is non-empty or that every listed name resolved to a route.

Prompt To Fix With AI
This is a comment left during a code review.
Path: apps/web/e2e/public-routes.ts
Line: 351-355

Comment:
**Silent empty suite if names drift**

`productionSmokeRoutes` is built by filtering `capturedRoutes` on a hard-coded list of string names. If any of the six names is later renamed (or mistyped here), the filter silently drops it — and if they all disappear, the test suite passes with zero tests, giving false green on production smoke runs. There is no assertion that the filtered list is non-empty or that every listed name resolved to a route.

How can I resolve this? If you propose a fix, please make it concise.

import { capturedRoutes, productionSmokeRoutes } from "./public-routes";

for (const route of capturedRoutes) {
const routes = process.env.PLAYWRIGHT_BASE_URL ? productionSmokeRoutes : capturedRoutes;
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 PLAYWRIGHT_BASE_URL as production signal narrows staging smoke coverage

PLAYWRIGHT_BASE_URL is also set when running the mutation-backed hosted flow against a dev/staging target (per the docs: set PLAYWRIGHT_BASE_URL and VRDEX_E2E_BROWSER_TOKEN). If anyone runs this smoke spec against a dev/staging URL that does have fixture data, they'll silently exercise only the 6 production-safe routes rather than the full capturedRoutes set — potentially missing regressions that only surface through fixture-backed routes. A separate env var (e.g. PLAYWRIGHT_PRODUCTION_SMOKE=true) would make the intent explicit.

Prompt To Fix With AI
This is a comment left during a code review.
Path: apps/web/e2e/public-routes.smoke.spec.ts
Line: 5

Comment:
**`PLAYWRIGHT_BASE_URL` as production signal narrows staging smoke coverage**

`PLAYWRIGHT_BASE_URL` is also set when running the mutation-backed hosted flow against a dev/staging target (per the docs: `set PLAYWRIGHT_BASE_URL and VRDEX_E2E_BROWSER_TOKEN`). If anyone runs this smoke spec against a dev/staging URL that does have fixture data, they'll silently exercise only the 6 production-safe routes rather than the full `capturedRoutes` set — potentially missing regressions that only surface through fixture-backed routes. A separate env var (e.g. `PLAYWRIGHT_PRODUCTION_SMOKE=true`) would make the intent explicit.

How can I resolve this? If you propose a fix, please make it concise.

Note: If this suggestion doesn't match your team's coding style, reply to this and let me know. I'll remember it for next time!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant