MotorSignal-App/docs/website-deployment-2026-10-...

9.8 KiB

Scoped website deployment — October 4, 2026

Deployed commit: 8b3a7aa29290b58a9456a564785e9c73cd8e3093 on deploy/website-20261004. Only five reviewed product files and three regression files were committed. No push was performed. Website HTTP/artifact smoke passed. A subsequent administrator configuration resolved the credential blocker for the user-confirmed production authenticated empty-state workflow; populated production discovery remains untested. This report update did not rebuild, redeploy, restart, rerun configuration, or independently recheck production.

Included scope

Fix Product files
Personal discovery accepts absent/null clubId website/app/api/group-rides/route.ts
Successful session revocation forwards 204 without a body website/app/api/account/sessions/route.ts; website/app/api/account/sessions/[sessionId]/route.ts
Radar clears cached presence and stops obsolete listeners after errors/revocation website/components/group-rides/live-pack-radar.tsx
Requested ride identity survives Leave Pack/reload; denied rides do not become simulated packs website/components/group-rides/group-rides-management.tsx

Regression files: website/tests/community-personal-rides.test.ts, website/tests/website-session-proxy.test.ts, and website/tests/radar-access-lifecycle.test.tsx. The commit contains 180 insertions and 16 deletions across these eight files. Product differences are 49 insertions and 16 deletions, with no authentication, rule, entitlement, or dependency-version changes.

QA fixtures, emulator configuration, regression source, test-support files, environment files, evidence, caches, and Windows dependency trees were excluded from the production payload. The regression tests remain in the deployment Git commit but are not runtime package contents. Next's generated external-package alias is recreated as a relative Linux link to the verified existing Firebase Admin package.

Production configuration and build

  • Fresh build from the clean deployment commit; the main workspace's demo .next was not used or changed.
  • Browser Firebase project verified at deployment was motoapp-d22e0; served client assets contained its production options. At cutover, Firebase Admin retained the same production project fallback with no runtime project override; subsequent administrator runtime configuration is recorded above.
  • Build explicitly set FIREBASE_PROJECT_ID and GCLOUD_PROJECT to motoapp-d22e0; emulator/QA settings were stripped before environment loading. No environment files loaded in the build. At cutover, the production service also had no emulator flags/hosts or environment files. The later runtime configuration does not change this build evidence.
  • Backend URL verified at deployment was https://api.motorsignal.app; service listened on 127.0.0.1:3001 under motorsignal. Systemd configuration was not modified by the deployment phase; the later administrator configuration was separate.
  • The pre-existing dependency junction caused runner/build-path problems. It and the old deployment build were preserved under the ignored evidence subdirectories. A fresh npm ci --no-audit --no-fund installed 344 packages from the unchanged committed lockfile. There were no version upgrades.
  • Fresh Next/Turbopack build and TypeScript passed. Three known tracing warnings remain in the unchanged telemetry route at lines 37, 42, and 71. Earlier junction builds and their warnings were discarded, not deployed.
  • Runtime versions checked on Linux: Next 16.3.4, React/React DOM 19.1.1, Firebase Admin 14.4.0. Firebase browser SDK 12.18.0 is bundled.
  • Build ID: oo8nnoCyk_My8qXXYMOcr. Artifact SHA-256: 2d9874f1fb23e8e22e5f700ead1db6ac90882063af4b9d5b82f0ec7a0482c0f9.

Verification

Check Result
Focused Vitest: three regression files plus group-rides-page.test.tsx 31 tests passed, four files, exit 0
Deployment revision contract test PASS
Fresh production build, TypeScript, artifact scan PASS; no isolated project/session/emulator endpoint contamination
Linux candidate on loopback 3102 PASS; target revision, account/group pages, 13 client assets, protected API 401 responses; process stopped
Public HTTPS /api/version PASS; exact deployed SHA and no-store
Public HTTPS account/group pages and 13 client assets PASS; every asset hash matches the fresh package
Unauthenticated discovery/session APIs PASS; both return 401
Existing authenticated session: My Pack PASS; ten existing rides displayed; no sign-in or record mutation performed
Existing authenticated session: real radar PASS for an existing empty ride; authenticated mode, empty-state message, zero simulated-pilot cards; left radar view without leaving the ride
Authenticated community discovery Initially BLOCKED with credential-loading 500; subsequent production empty state PASS — user-confirmed No Community Rides Scheduled. Populated production discovery remains UNTESTED

The browser restored an existing Firebase session after navigation. Initial HTTP-only evidence saying authentication was not run is superseded by authenticated-readonly.json; no credentials were exported or new session sign-in performed. The management route's HTTP 200 credential-check skeleton is expected: its redirect runs only after client Auth resolution. The initial HTTP-redirect assertion was corrected after source inspection.

Backup inspection proved Firebase Admin initialization source was unchanged. Old and new standalone server configurations embedded only the deployment-revision variable. At deployment verification, the service had neither FIREBASE_SERVICE_ACCOUNT nor GOOGLE_APPLICATION_CREDENTIALS configured. The deployment phase did not modify credential-loading configuration. An authenticated request before cutover was not independently recorded, so the initial credential failure is not falsely claimed as a verified pre-deployment outcome.

On 2026-10-04, the administrator subsequently reported applying the separately prepared runtime configuration: credential probes passed, the website restarted, revision remained 8b3a7aa, guest discovery returned 401, and post-restart credential/discovery failures were zero. In the administrator's existing signed-in Group Ride Hub, No Community Rides Scheduled appeared. These are user-confirmed production results, not independent agent retests; no raw authenticated HTTP status/JSON was supplied in this follow-up. Populated production discovery remains untested. See docs/website-firebase-admin-blocker-2026-10-04.md for the attributed follow-up and preserved original blocker evidence.

No production fixture creation, ride creation, session revocation, Leave Pack, access revocation, or presence publication was performed. Their behavioral coverage remains the prior isolated verification and current focused regression tests. Billing, PostgreSQL, R2, Android, Firestore rules, and unrelated backend services were not expanded or modified. The existing Tailwind CDN warning was observed and left unchanged.

Cutover and rollback

The existing website-only packaging/restart process was retained, with shipping-and-launch safeguards: Linux candidate smoke, verified full backup before activation, preserved previous runtime, and automatic rollback on activation failure. The global /opt/motorsignal/current link was not moved. Backend and nginx PIDs, active states, restart counters, and backend path remained unchanged. Only motorsignal-website restarted; its automatic restart count remains zero. Previous static assets were retained for existing tabs, without overwriting fresh assets; all active server code is from the new build.

Rollback archive:

/home/motorsignal-admin/rollback-website-69662eae-to-8b3a7aa-20261004.tar.gz

SHA-256: 6e70037312d16d8967334e790cfad68e2d82df40a943db2261630f1174723712. Its old server and build-ID contents were compared before cutover. The prior runtime is preserved at /opt/motorsignal/releases/20260920-master-7efd29a/website/.next.rollback-8b3a7aa29290.

Rollback command on the verified VPS, if authorized/needed:

python3 /home/motorsignal-admin/deploy-scoped-8b3a7aa29290.py rollback

The helper restores the preserved runtime and original five source files, server and package metadata, restarts only the website, and verifies previous revision 69662eae46b92b2d824558b40a82fd487d15ba1b. Rollback is ready and verified structurally; it was not activated merely to test it.

Commands, evidence, and preservation

Commands used direct bundled node.exe, installed Vitest/Next entry points, npm ci, git diff --check, explicit eight-file staging and local commit, scp, the scoped Python deployment helper, and read-only HTTP/browser checks. No broad QA suites were repeated. Build/deployment helper sources and exact settings are retained in output/deployment/20261004-scoped/.

Primary evidence: focused-tests.json, production-config.json, production-build-result.json, production-build.log, artifact-scan.json, package.json, candidate-smoke.json, deployment-result.json, production-smoke.json, authenticated-readonly.json, credential-baseline.json, baseline.json, and git-final.json.

The temporary candidate process and agent-created browser tab were closed; the user's existing signed-in session was not signed out. Owned staging directories, failed-build diagnostics, production package, previous local dependency junction/build, rollback archive, and old live runtime remain recoverable. No existing data was deleted. Main branch/HEAD remain release/v1.0.2-build102-community-feed / bd278cdfd3619242a3056c6a2738abb0aff70feb; preservation audit checks all 117 original dirty/untracked file hashes. Deployment worktree is clean at the scoped commit. Full final status, including untracked evidence additions, is in git-final.json.