Skip to content

Commit 3e2d4de

Browse files
sametbasbugclaude
andcommitted
Record the production door opening and how its keys travelled
Also records the two verifications worth repeating: the digest algorithm was proved against a digest already stored in staging rather than against itself, and the live probes cover the paths where a mistake would be silent — the refusals that must not carry a location header, and the token endpoint's answer to a wrong client secret. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
1 parent 70e7ce9 commit 3e2d4de

1 file changed

Lines changed: 34 additions & 0 deletions

File tree

‎docs/V6_PROJECT_LEDGER.md‎

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2193,3 +2193,37 @@ Anything under `docs/archive/` describes an earlier state and is frozen. Read it
21932193
them: not a bug in the door, an artefact of skipping the site's own entry
21942194
point. Replacing that button is the next step, and it is the step that makes
21952195
the fragment/query mismatch disappear.
2196+
- The door opened in production on 12 August. Order: generate the two secrets
2197+
and the client secret in one run, register the client in production D1, then
2198+
push — the deploy uploads the secrets with the same Worker version that needs
2199+
them, so there is no window where the code is newer than its keys. The two
2200+
secrets are GitHub repository secrets travelling in the deploy's
2201+
`--secrets-file`, alongside the Google pair and the MCP secrets; the workflow
2202+
refuses to deploy if either is empty.
2203+
- The signing key never touched this machine's disk, its keychain, or a terminal
2204+
line. One script generated the key, the token pepper and Rota's client secret,
2205+
piped the first two into `gh secret set` over stdin, put the third on the
2206+
clipboard for the Supabase field, and wrote only the HMAC digest into the
2207+
registration SQL. Stdin rather than argv on purpose: argv is visible in `ps`.
2208+
Production and staging hold different keys and different client secrets, so a
2209+
staging key can never sign a production token — the kids differ too
2210+
(`orbit-oidc-2026-08-12` vs `-08-11`).
2211+
- Before trusting that script, its digest algorithm was checked against reality
2212+
rather than against itself: recomputing the digest from the staging pepper and
2213+
the staging client secret reproduced the digest already stored in staging D1.
2214+
A registration script that computes the wrong digest would produce a client
2215+
that authenticates nowhere, and the failure would surface only at the token
2216+
exchange.
2217+
- Live production probes: discovery and JWKS answer 200 with exactly one public
2218+
key (no `d`), pairwise subjects, ES256 only, S256 only; a registered client
2219+
with an allowed redirect and no session is parked with a 600-second
2220+
`__Host-orbit_site_return` cookie; an unknown client and a registered client
2221+
naming an unlisted redirect both answer 400 with no `location`; the token
2222+
endpoint answers 401 both with no credentials and with a wrong client secret;
2223+
userinfo answers 401 without a token and with a forged one. Feed, agents,
2224+
healthz and the site itself are unchanged.
2225+
- Still staging-bound at this point: Supabase's provider record points at the
2226+
staging issuer, so the anime site's sign-in runs through staging until the
2227+
issuer and client secret are switched by hand. That switch and the anime
2228+
repository's push belong together — one without the other leaves the live site
2229+
pointing at the wrong Orbit.

0 commit comments

Comments
 (0)