Repository navigation
fix: close the open findings from the 2026-09-24 site audit - #115
Conversation
- AUD-001: the landing page groups its sections in a <main> landmark. - AUD-002: the build writes /terms and /privacy copies of the app shell whose canonical and og:url name their own route. Vercel serves them before the SPA fallback, so no canonical changes in JavaScript. - AUD-003: the login title is an h1 styled like the CardTitle it replaces. - AUD-004: a missing or expired share uses maybeSingle(), so PostgREST answers 200 with no row instead of 406. - AUD-005: the 404 page no longer logs console.error. - AUD-006: vercel.json sends no-store for / as it does for /index.html. Regression coverage: the public page sweep visits an unknown route, the agentic sweep visits a missing share and an unknown route and records PostgREST 406s, and the full-stack page fixture fails on console.error and failed local requests. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
|
Warning Review limit reachedEnable usage-based reviews in Billing to review now. Otherwise, wait until the next included review is available. Next included review available in 10 minutes. View limit detailsLimit details: You’ve used the included review currently available. Review configuration: ⚙️ Run configuration
📒 Files selected for processing (9)
Note 🎁 Summarized by CodeRabbit FreeYour organization is on the Free plan. CodeRabbit will generate a high-level summary and a walkthrough for each pull request. For a comprehensive line-by-line review, please upgrade your subscription to CodeRabbit Essentials by visiting https://app.coderabbit.ai/settings/billing. Comment |
The pages are lazy chunks, so DOMContentLoaded can fire before the page mounts and logs anything. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
The full-stack fixture and agentic sweep changes can only be proven on the shared local stack. They land separately from the audit fixes. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
|
Real-app evidence at b6d26e7, staging-pinned build with staging Supabase. Desktop 1280×800 and Pixel 5: landing (has desktop-flow.webmmobile-flow.webm |
|
Codex review (gpt-6.1-sol, high). Round 1 on 885e6f0 had two findings:
Round 2 on b6d26e7: no findings. |
|
Local stand-in for CI at b6d26e7. GitHub Actions jobs die in about 2 seconds with zero steps because the account is out of minutes.
|








Fixes the six findings still open from the 2026-09-24 site audit (AUD-001 to AUD-006). Each was rechecked on
mainat 0058704 before the fix.Changes
<main>on the landing page.LandingPagenow wraps Hero through FinalCTA in<main>. Navbar and Footer stay outside it.selfCanonicalShellsinvite.config.ts) writesdist/terms/index.htmlanddist/privacy/index.html. Each is the built shell with itscanonicalandog:urlset to its own route. Vercel serves a real file before the SPA rewrite, the same way it already serves the static SEO pages inpublic/. The build fails ifindex.htmlstops carrying the tags the plugin rewrites.public/sitemap.xmlalready lists/,/termsand/privacy, so it is unchanged./expocit/sourcesis not in the sitemap and keeps the shell's canonical.h1with CardTitle's classes, so it looks the same. The signed-out/appredirect lands on the same page.SharedPagecallsget_shared_itemwith.maybeSingle(). PostgREST answers 200 with no row, and the existing "no longer available" card renders.console.erroron the 404 page. Removed./is cacheable.vercel.jsonsends the sameno-storeheader for/as for/index.html, andsrc/test/vercel-deployment-config.test.tspins it. The audit pointed atnginx.conf, but the repo has no such file; Vercel is the only production host.Not changed: AUD-007. Hidden paths like
/.envstill return the SPA shell with a 200. That is accepted for now.Regression coverage
AUD-005 can come back without anyone noticing, so the existing public-page sweep now checks for it:
e2e/public-pages.spec.tsvisits an unknown route in all three languages. Every route now waits for itsh1before the console errors are read, because the pages are lazy chunks. With the oldNotFoundthe 404 visit fails on404 Error: User attempted to access non-existent route.The stack-backed coverage moved to the follow-up branch
test/audit-stack-coverage, which gets its own PR once the shared local stack is free. That covers the stricter full-stack page fixture (fail onconsole.errorand on first-party 4xx/5xx) and the agentic missing-share and 404 visits with PostgREST 406 capture. Codex round 1 found that the stricter fixture needstolerateentries for specs that fail on purpose, such as a wrong demo code or a provider 500. Getting those right needs a real stack run, and four threads were queued on the one stack, so it doesn't block these fixes.Verification
GitHub Actions jobs die in about 2 seconds with no logs because the account is out of Actions minutes, so the checks were run locally (see the verify comment for the result at the final head).
npm run lint,npm run typecheck,npm testandnpm run buildpass. The build writes the two shells, and they differ fromindex.htmlonly incanonicalandog:url.e2e/public-pages.spec.ts,e2e/login.spec.tsande2e/navigation-performance.spec.tspass on desktop and mobile Chromium.vercel curl):/termsand/privacy(with or without a trailing slash) serve their own canonical, and/,/loginand unknown routes keep the landing canonical./now sendsno-store, no-cache, must-revalidate, proxy-revalidate, max-age=0, the same as/index.html.npm run dev:previewand staging's real Supabase. The landing page has onemain./loginand the signed-out/appredirect have oneh1, "Sign in to DebateLab", with the same computed font, weight, line height and colour as the oldh3. A bogus/share/<code>callsget_shared_item, gets 200, and shows "This shared content is no longer available". An unknown route shows the 404 page. None of these logged a console error or got a 4xx/5xx.406 POST /rest/v1/rpc/get_shared_item,console.error: Failed to load resource: the server responded with a status of 406, andconsole.error: 404 Error: User attempted to access non-existent route.Screenshots and recordings are in the comment below.
🤖 Generated with Claude Code