docs(handoff): étape 3B/PR-A — et le fait que le merge a devancé le handoff - #283
Conversation
…handoff PR #282 a été mergée (d386aae) pendant que j'écrivais le handoff, et GitHub a supprimé la branche. Mon push l'a recréée : ces deux fichiers étaient donc sur une branche morte, hors de main. Reportés ici depuis main. HANDOFF CANONIQUE — double redondance : ce fichier plus le miroir dans le vault Obsidian (slug `ankora` LU dans 10_Projects/*/_index.md, jamais inféré). Le fait qu'il ajoute, et que l'historique Git ne dira pas : la production portait déjà les deux migrations AVANT le merge. Le comportement de la base a changé au moment du `db push`, pas au moment du merge — `deletion_self_insert` supprimée, `deletion_self_update` resserrée, claim_pending_deletions fermée à anon. C'est sûr parce que `deletion_requests` n'est écrit qu'en un seul endroit du code, via service_role, qui contourne la RLS : aucune insertion client n'existe. Vérifié, pas supposé. Et si la PR n'avait pas été mergée, la migration serait restée : un revert de PR ne défait pas un `db push`. MESURE AVANT PRESCRIPTION. `touch_updated_at()` est branchée sur 6 tables : la révoquer à l'aveugle pouvait casser chaque écriture de l'application. Test en trois temps, rôle authenticated avec claims JWT : updated_at remis à 2020-01-01, UPDATE -> 17:02:40.346726 (avant revoke) revoke execute … from public, anon, authenticated updated_at remis à 2020-01-01, UPDATE -> 17:02:40.368922 (APRÈS revoke) updated_at bouge toujours : le privilège EXECUTE d'une fonction de trigger est vérifié à la CRÉATION du trigger, pas à chaque déclenchement. Grant local restauré. `assert_rls_coverage()` : aucun appelant dans le dépôt. Les deux révocations de la future PR grants sont donc prouvées, pas documentées. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
|
You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard. |
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
Guide du relecteurCette PR ajoute la documentation manquante pour la PR #282 concernant la fonctionnalité de file d’attente de suppression, en précisant que le comportement de la base de données de production a changé au moment du Diagramme de séquence pour l’impact de db_push vs merge GitHub sur la productionsequenceDiagram
actor Developer
participant SupabaseCLI as Supabase_CLI
participant ProdDB as ankora_prod_db
participant GitHub as GitHub_main
Developer->>SupabaseCLI: db push
SupabaseCLI->>ProdDB: apply 20260727000001_deletion_queue.sql
SupabaseCLI->>ProdDB: apply 20260727000002_claim_grants_hardening.sql
ProdDB-->>ProdDB: deletion_self_insert removed
ProdDB-->>ProdDB: deletion_self_update restricted pending→cancelled
ProdDB-->>ProdDB: claim_pending_deletions created (EXECUTE closed to anon, authenticated)
ProdDB-->>ProdDB: purge_audit_log_older_than_12_months SECURITY INVOKER
Note over ProdDB: Production behavior changes at db push
Developer->>GitHub: merge PR_282 into main
GitHub-->>GitHub: update main branch
Note over GitHub,ProdDB: Git history reflects merge
Note over ProdDB: Database behavior was already changed by db push
Modifications au niveau des fichiers
Conseils et commandesInteragir avec Sourcery
Personnaliser votre expérienceAccédez à votre tableau de bord pour :
Obtenir de l’aide
Original review guide in EnglishReviewer's GuideThis PR adds missing documentation for PR #282 about the deletion queue feature, clarifying that production database behavior changed at the time of the db push rather than the merge, and records how function privilege revocations were empirically validated; no application code or schema is modified, only documentation files are updated and created. Sequence diagram for db_push vs GitHub merge impact on productionsequenceDiagram
actor Developer
participant SupabaseCLI as Supabase_CLI
participant ProdDB as ankora_prod_db
participant GitHub as GitHub_main
Developer->>SupabaseCLI: db push
SupabaseCLI->>ProdDB: apply 20260727000001_deletion_queue.sql
SupabaseCLI->>ProdDB: apply 20260727000002_claim_grants_hardening.sql
ProdDB-->>ProdDB: deletion_self_insert removed
ProdDB-->>ProdDB: deletion_self_update restricted pending→cancelled
ProdDB-->>ProdDB: claim_pending_deletions created (EXECUTE closed to anon, authenticated)
ProdDB-->>ProdDB: purge_audit_log_older_than_12_months SECURITY INVOKER
Note over ProdDB: Production behavior changes at db push
Developer->>GitHub: merge PR_282 into main
GitHub-->>GitHub: update main branch
Note over GitHub,ProdDB: Git history reflects merge
Note over ProdDB: Database behavior was already changed by db push
File-Level Changes
Tips and commandsInteracting with Sourcery
Customizing Your ExperienceAccess your dashboard to:
Getting Help
|
There was a problem hiding this comment.
Salut - j'ai passé en revue tes modifications et elles sont super !
Sourcery est gratuit pour l’open source - si tu apprécies nos revues, pense à les partager ✨
Original comment in English
Hey - I've reviewed your changes and they look great!
Help me be more useful! Please click 👍 or 👎 on each comment and I'll use the feedback to improve your reviews.
Deux fichiers de documentation qui devaient partir avec #282 et sont arrivés trop tard : la PR a été mergée (
d386aae) pendant que j'écrivais le handoff, GitHub a supprimé la branche, et mon push l'a recréée. Ces deux fichiers vivaient donc sur une branche morte, hors demain. Aucun code, aucune migration.1. Le handoff canonique de la session
docs/handoffs/2026-07-27-1900-etape-3b-pr-a-file-suppression-inerte.md, 9 sections selon le template. Double redondance : ce fichier et le miroir dans le vault Obsidian — slugankoralu dans10_Projects/*/_index.md, jamais inféré.2. Le fait que l'historique Git ne dira pas
Ajouté au rapport de PR à la demande de @Thierry, et c'est le point qui justifie à lui seul cette PR :
Concrètement, et indépendamment de
main:deletion_self_insertsupprimée,deletion_self_updateresserrée enpending → cancelled,claim_pending_deletionsfermée àanonetauthenticated,purge_audit_log_older_than_12_months()passée enSECURITY INVOKER.Pourquoi c'est sûr, et pourquoi ce n'est pas une supposition :
deletion_requestsn'est écrit qu'en un seul endroit du code —src/lib/gdpr/deletion.ts, viacreateServiceRoleClient(), qui contourne la RLS. Aucune insertion client n'existe. La politique retirée accordait une capacité que rien n'utilisait.Et si #282 n'avait pas été mergée : la migration serait restée. Un revert de PR sur GitHub ne défait pas un
db push. Elle est additive et ses politiques sont plus restrictives qu'avant, donc sans danger — mais présente. Revenir en arrière pour de bon demanderait une migration inverse écrite exprès.3. Mesure avant prescription
@Thierry a refusé qu'une future PR d'hygiène propose un
revokesur la foi de la documentation.touch_updated_at()est une fonction de trigger branchée sur 6 tables (accounts,charges,commitments,users,workspace_settings,workspaces) : la révoquer à l'aveugle pouvait casser chaque écriture de l'application.Mesuré en trois temps sur la pile locale, en rôle
authenticatedavec claims JWT :updated_atbouge toujours. Le privilègeEXECUTEd'une fonction de trigger est vérifié à la création du trigger, pas à chaque déclenchement. Lerevokene casse rien. Grant local restauré après la mesure.assert_rls_coverage(): aucun appelant dans le dépôt — le « Callable from CI » de20260417000002:36décrit une intention jamais réalisée.Les deux révocations de la future PR grants sont donc prouvées, pas documentées. Cette PR-là part après PR-B, décision @Thierry : ces fonctions sont invoquées par toutes les policies RLS, et ce risque ne doit pas courir en parallèle de l'armement d'une suppression de comptes.
🤖 Generated with Claude Code
Summary by Sourcery
Documenter l’état de la base de données de production et le calendrier de déploiement pour les migrations de la file de suppression, et ajouter le rapport de passation pour PR-3B-A.
Documentation :
Original summary in English
Summary by Sourcery
Document the production database state and deployment timing for the deletion queue migrations, and add the handoff report for PR-3B-A.
Documentation: