fix(deploy): rewrites pointed at .html under cleanUrls, so / was a 404 - #27
Merged
Conversation
interlock.marcellelabs.io served every asset correctly — view model, arm-view.mjs, styles, fonts all 200 — but /, /cockpit and /storyboard returned 404 while /media/hac-341/cockpit returned 200. cleanUrls strips .html from the output filesystem: the page is served at /media/hac-341/cockpit, and /media/hac-341/cockpit.html survives only as a 308 redirect rule. A rewrite destination is resolved against that filesystem rather than re-run through the redirect table, so a destination ending in .html points at a path that no longer exists internally. The probe that isolates it: /media/hac-341/cockpit.html gives 308 -> 200 externally, but the identical string as a rewrite destination gives 404. That is only possible if destinations resolve pre-redirect. Dropping .html from the three destinations fixes it. cleanUrls stays on — the alternative hands a judge a .html URL. The deep links in media/hac-341/README.md are unaffected: the 308 preserves the query string, so ?run=...&state=run.local.perturbed still lands on 200. No evidence, gate or cockpit source touched.
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
|
Codecov Report✅ All modified and coverable lines are covered by tests. 📢 Thoughts on this report? Let us know! |
qmarcelle
added a commit
that referenced
this pull request
Aug 23, 2026
…kit (#33) ## `/` and `/cockpit` rendered nothing `vercel.json` rewrites `/` and `/cockpit` onto `media/hac-341/cockpit.html`. A rewrite serves those bytes without changing the request URL, and a document-relative specifier resolves against the *request* URL — so import { armView } from './lib/arm-view.mjs' resolved to `/lib/arm-view.mjs` and aborted. Same for `./lib/guide.mjs` and the `./evidence/view-model.json` fetch. Both entry points returned HTTP 200 and rendered a blank page with the body text "Skip to the run". Confirmed against the live deployment: `/media/hac-341/cockpit.html` renders 1628 characters, `/` and `/cockpit` render 15. These are the two URLs a judge visits. #27 made `/` stop 404ing; it did not make it work. Nothing caught it because every gate loads the file path directly, which is the one path where the relative form happens to resolve. The three references are now anchored at `/media/hac-341/`, and the cockpit gate refuses a document-relative import or fetch statically — no server, no deployment, and it fails on the specifier rather than on the blank page. One negative proof. ## Cold-read kit `media/hac-341/cold-read/` — moderator script and per-reader response sheet. Status is READY_FOR_HUMAN_TEST: prepared, not run, nothing claimed. It names the public custom domain, because every `*.vercel.app` URL for this project is behind Vercel SSO (`ssoProtection: all_except_custom_domains`) and would send a cold reader to a login page. All six tester URLs verified 200 logged out. The sheet records verbatim answers rather than scores, and lists the automatic failures — inferring Agent Runtime or Agent Gateway, collapsing the two proof classes into one experiment, reading ALLOW as authorized or EXECUTED as OBSERVED — as overriding any score. pnpm run check exit 0, 645 tests, typecheck clean.
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.



interlock.marcellelabs.ioserved every asset correctly but returned 404 on/,/cockpitand/storyboard. The cockpit itself was deployed and healthy the whole time — only the pretty URLs were broken.Evidence
//cockpit/storyboard/media/hac-341/cockpit/media/hac-341/cockpit.htmlevidence/view-model.json·lib/arm-view.mjs·assets/styles.css·assets/fonts/*.woff2Cause
cleanUrls: truestrips.htmlfrom Vercel's output filesystem. The page is served at/media/hac-341/cockpit;/media/hac-341/cockpit.htmlsurvives only as a 308 redirect rule.A rewrite destination is resolved against that filesystem, not re-run through the redirect table. So
destination: "/media/hac-341/cockpit.html"points at a path that no longer exists internally, and all three rewrites fell through to 404.The probe that isolates it:
/media/hac-341/cockpit.htmlgives 308 → 200 when requested externally, but the identical string as a rewrite destination gives 404. That is only possible if destinations resolve pre-redirect.Fix
Drop
.htmlfrom the three destinations. Three lines, no other change.cleanUrlsstays on — turning it off would fix the 404 too, but it hands a judge a.htmlURL, which is the worse trade for a judge-facing surface.Not affected
The deep links in
media/hac-341/README.mdstill work as written: the 308 preserves the query string, so?run=hac330-local&proof=local&state=run.local.perturbedlands on 200 with the query intact. Verified against the live domain.No evidence, gate, capture or cockpit source touched. 9 gates PASS on this branch.