chore(hub): schema 1 van de device-handtekening verwijderen #170

Merged
janpeter merged 3 commits from chore/hub-signature-drop-v1 into main 2026-08-15 07:59:21 +02:00
Owner

Sluitstuk van IDEA-183 (Task 6 uit het plan). De overgang is voorbij: schema v2 is live, de TestFlight-build met v2 draait op het toestel, en er is precies één actief apparaat in hub_devices — dat toestel, vier minuten vóór deze wijziging nog gezien. Niets spreekt nog v1.

Wat eruit gaat

  • buildCanonicalString (v1) en de schemakeuze in withSignedDevice. Er is nu één pad: elk ondertekend verzoek wordt als v2 geverifieerd.
  • De server leest X-Hub-Sig-Version niet meer. De iOS-client blijft hem sturen — onschadelijk, en hem weghalen zou een tweede lockstep-deploy kosten voor niets. Er is expliciet een test die aantoont dat een verzoek zónder die header gewoon authenticeert, zodat de header echt vestigiaal is en niet stilzwijgend verplicht.
  • De +-weigering verliest haar schema === 2-voorwaarde en geldt vanaf nu voor élk ondertekend verzoek.

De volgorde was de eis, niet de stijl

Zeven bestanden tekenden verzoeken met buildCanonicalString; zes daarvan zouden omvallen op het moment dat de v1-tak verdwijnt. Commit 1 migreert die zes naar één gedeelde helper in __tests__/lib/hub/test-signing.tsmet de productiecode nog dual-schema, en groen — en pas commit 2 verwijdert v1. git show bevestigt die scheiding: commit 1 raakt uitsluitend __tests__/, commit 2 draagt de lib/hub/-wijzigingen. Zes kopieën van één contract was precies de vorm die deze bug veroorzaakte; er is er nu één.

Een achtste gebruiker (__tests__/lib/hub/signature-scheme.test.ts) die het plan miste, is meegenomen.

Testaantal

2047 → 2044. Alle vier verdwenen tests waren v1-specifiek (de default-terugval zonder header, de twee sabotage-kruisingen, en de disjunctheidstest tussen v1 en v2), plus één nieuwe test erbij voor de vestigiale header. De review heeft die vier bij naam nagelopen in plaats van het verschil aan te nemen.

Verificatie

  • Wegwerp-clone-gate groen op 090be14: npm ci && npm run verify && npm run build && git diff --exit-code.
  • npm run verify: 250 bestanden, 2044 tests.
  • Geen Swift gewijzigd.

Na merge is er geen weg terug naar een oudere app-build — die tekent v1 en krijgt dan 401. Dat is de bewuste keuze die met deze PR wordt gemaakt.

🤖 Generated with Claude Code

Sluitstuk van IDEA-183 (Task 6 uit het plan). De overgang is voorbij: schema v2 is live, de TestFlight-build met v2 draait op het toestel, en er is precies **één** actief apparaat in `hub_devices` — dat toestel, vier minuten vóór deze wijziging nog gezien. Niets spreekt nog v1. ## Wat eruit gaat - `buildCanonicalString` (v1) en de schemakeuze in `withSignedDevice`. Er is nu één pad: elk ondertekend verzoek wordt als v2 geverifieerd. - De server leest `X-Hub-Sig-Version` niet meer. De iOS-client blijft hem sturen — onschadelijk, en hem weghalen zou een tweede lockstep-deploy kosten voor niets. **Er is expliciet een test die aantoont dat een verzoek zónder die header gewoon authenticeert**, zodat de header echt vestigiaal is en niet stilzwijgend verplicht. - De `+`-weigering verliest haar `schema === 2`-voorwaarde en geldt vanaf nu voor élk ondertekend verzoek. ## De volgorde was de eis, niet de stijl Zeven bestanden tekenden verzoeken met `buildCanonicalString`; zes daarvan zouden omvallen op het moment dat de v1-tak verdwijnt. Commit 1 migreert die zes naar één gedeelde helper in `__tests__/lib/hub/test-signing.ts` — **met de productiecode nog dual-schema, en groen** — en pas commit 2 verwijdert v1. `git show` bevestigt die scheiding: commit 1 raakt uitsluitend `__tests__/`, commit 2 draagt de `lib/hub/`-wijzigingen. Zes kopieën van één contract was precies de vorm die deze bug veroorzaakte; er is er nu één. Een achtste gebruiker (`__tests__/lib/hub/signature-scheme.test.ts`) die het plan miste, is meegenomen. ## Testaantal 2047 → 2044. Alle vier verdwenen tests waren v1-specifiek (de default-terugval zonder header, de twee sabotage-kruisingen, en de disjunctheidstest tussen v1 en v2), plus één nieuwe test erbij voor de vestigiale header. De review heeft die vier bij naam nagelopen in plaats van het verschil aan te nemen. ## Verificatie - Wegwerp-clone-gate groen op `090be14`: `npm ci && npm run verify && npm run build && git diff --exit-code`. - `npm run verify`: 250 bestanden, 2044 tests. - Geen Swift gewijzigd. **Na merge is er geen weg terug naar een oudere app-build** — die tekent v1 en krijgt dan 401. Dat is de bewuste keuze die met deze PR wordt gemaakt. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
Zes bestanden tekenden hun signed Request elk in een eigen lokale helper
met een licht andere vorm — zes kopieën van hetzelfde contract, precies
de vorm die IDEA-183 veroorzaakte. Verplaats de v2-bekwame signedRequest
uit route-helpers.test.ts naar de gedeelde test-signing.ts (naast
makeDevice), default op sigVersion: 2, en laat de zes bestanden hem
importeren. inbox-route.test.ts behoudt zijn dunne get(query)-wrapper.

Voorbereiding op het verwijderen van schema 1 (Task 6): alle hub-tests
staan groen vóór er iets uit lib/hub verdwijnt.
JP bevestigt dat de TestFlight-build op zijn toestel draait en dat er
server-side precies één actieve hub_devices-rij is; niets spreekt v1
meer. withSignedDevice bouwt nu onvoorwaardelijk buildCanonicalStringV2,
zonder schemakeuze op X-Hub-Sig-Version — de client mag de header
blijven sturen, de server leest hem niet meer. De +-weigering geldt nu
voor elk ondertekend verzoek in plaats van alleen schema 2.

buildCanonicalString en SIG_VERSION_HEADER zijn verwijderd uit
lib/hub/signature-server.ts, met hun tests. signature-scheme.test.ts
(niet in de oorspronkelijke takenlijst, maar ook een buildCanonicalString-
consument) is meeverhuisd. Het runbook is bijgewerkt: schema 1 bestaat
niet meer, de header is vestigiaal, en de verificatiematrix is
teruggebracht tot wat nog met één schema kan optreden.

Zie docs/superpowers/specs/2026-08-14-hub-signature-canonicalisatie-design.md
§8 (Opruimen).
docs(hub): twee formuleringsfouten in het handtekening-runbook
All checks were successful
CI / Lint, Typecheck, Test & Build (pull_request) Successful in 4m15s
CI / Deploy Manual (workflow_dispatch) (pull_request) Has been skipped
CI / Detect deploy-relevant changes (pull_request) Has been skipped
CI / Deploy Preview (PR) (pull_request) Has been skipped
CI / Deploy Production (main) (pull_request) Has been skipped
090be14f26
s4m-codex-reviewer left a comment

Verdict: APPROVED

Geen gekoppeld plan gevonden — beoordeeld op codekwaliteit + product-standaarden.

Findings

  • Geen findings.

De diff verwijdert schema 1 uit de hub-device-handtekening op een consistente manier: withSignedDevice bouwt onvoorwaardelijk de v2-canonical string, de oude export/headerkeuze verdwijnt, de runbooktekst is bijgewerkt, en de tests blijven de relevante contracten dekken (:/%3A, rauwe + als 400, query-manipulatie, en de vestigiale X-Hub-Sig-Version-header).

# Verdict: APPROVED Geen gekoppeld plan gevonden — beoordeeld op codekwaliteit + product-standaarden. ## Findings - Geen findings. De diff verwijdert schema 1 uit de hub-device-handtekening op een consistente manier: `withSignedDevice` bouwt onvoorwaardelijk de v2-canonical string, de oude export/headerkeuze verdwijnt, de runbooktekst is bijgewerkt, en de tests blijven de relevante contracten dekken (`:`/`%3A`, rauwe `+` als 400, query-manipulatie, en de vestigiale `X-Hub-Sig-Version`-header).
Sign in to join this conversation.
No reviewers
No labels
No milestone
No project
No assignees
2 participants
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
janpeter/Scrum4Me!170
No description provided.