Skip to content

Passkey rpId migration (phases 1–2), a census, and two accessibility fixes - #293

Merged
abraraaa merged 3 commits into
mainfrom
claude/update-exercise-weights-4eg3W
Aug 20, 2026
Merged

Passkey rpId migration (phases 1–2), a census, and two accessibility fixes#293
abraraaa merged 3 commits into
mainfrom
claude/update-exercise-weights-4eg3W

Conversation

@abraraaa

@abraraaa abraraaa commented Aug 18, 2026

Copy link
Copy Markdown
Owner

Passkey migration

Every credential — including ones minted this week — is scoped to rpId theforged.fit. An rpId is fixed at creation, so clearing that is a re-enrolment, not a data migration. Window closes 2026-11-16 (90 days).

  • Registration from a heatwayve origin mints under heatwayve.app. The legacy origin still mints legacy: no reverse Related Origin Requests document exists, so a ceremony genuinely on the old domain cannot claim the native rpId.
  • Both verify routes pass the rpId set as expectedRPID and store the one the library actually matched (registrationInfo.rpID / authenticationInfo.rpID). The rpId is never inferred.
  • Login backfills the rpId onto older credentials from the verified assertion, riding the existing counter write rather than adding a second one.
  • login-options plans a single-rpId ceremony and offers only that pool, preferring native. Keyless credentials are no longer offered — a ceremony using one fails at verification after costing a prompt.

tests/auth-server.test.js pinned the old "one rpId forever" contract; those expectations are updated, and the fail-closed properties they guarded (localhost isolation, preview hosts, lookalike hosts) are kept and broadened.

Census

GET /api/diag/passkey-census, CRON_SECRET-gated, read-only. Verifiable vs keyless credentials, stray sibling blobs, minting either side of the flip, rpId split — and a proposed photo kill list for the sunset, split into profiles that lose their lock at the sunset versus profiles already claimable today.

It reports only. No delete path exists in this branch. The route imports no writer and exposes only GET, both asserted by tests.

Accessibility

Viewport no longer locks maximumScale/userScalable; BugReportSheet's textarea goes 14px → 16px so iOS still never zooms on focus. .forge-page is the <main> landmark, and the four routes that rendered their own are divs.


Lint, 1037 tests and the build pass.

Not in this branch: the sunset predicate. After 2026-11-16 login-options correctly reports "no passkey" for a legacy-only profile, but hasRealPasskey still counts legacy credentials, so /api/auth/check and the sync DELETE gate would disagree with it. That is phase 4, along with the prompt UI and the photo wipe.

The viewport locked maximumScale/userScalable, blocking zoom for anyone
who magnifies; BugReportSheet's textarea goes 14px -> 16px so iOS still
never zooms on focus. .forge-page is now the main landmark, and the four
routes that rendered their own <main> are divs. Both are tested.
@vercel

vercel Bot commented Aug 18, 2026

Copy link
Copy Markdown
Contributor

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

Project Deployment Actions Updated (UTC)
project-forge Ready Ready Preview Aug 18, 2026 2:26pm

Request Review

Reports what is actually in the credential store: verifiable vs keyless
legacy credentials, stray sibling blobs, and how many credentials are
bound to the theforged.fit rpId. CRON_SECRET-gated, reads only, and
tested to stay that way.
@abraraaa abraraaa changed the title Restore pinch-zoom and give the document a main landmark Accessibility fixes, and a read-only passkey census Aug 18, 2026
Registration from a heatwayve origin now mints under rpId heatwayve.app;
the legacy origin still mints legacy, since no reverse Related Origin
Requests document exists. Both verify routes accept the rpId set and
store the one the library matched, and login backfills it onto older
credentials from the verified assertion.

Login plans a single-rpId ceremony and offers only that pool's
credentials, preferring native. Sunset is 2026-11-16.

The census also reports which profiles' photos a sunset wipe would
target. It reports only — no delete path exists.
@abraraaa abraraaa changed the title Accessibility fixes, and a read-only passkey census Passkey rpId migration (phases 1–2), a census, and two accessibility fixes Aug 18, 2026
@abraraaa
abraraaa merged commit 713e906 into main Aug 20, 2026
7 checks passed
@abraraaa
abraraaa deleted the claude/update-exercise-weights-4eg3W branch August 20, 2026 11:38
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.

2 participants