PD-236 — Recherche backend par tokens déterministes (consommation PD-42)¶
1. Objectif¶
La présente spécification définit, de manière canonique, contractuelle et testable, le comportement attendu du backend en tant que consommateur de la primitive cryptographique définie dans PD-42.
Cette User Story couvre l’indexation, la persistance et la recherche server-side par égalité stricte sur des tokens de recherche déterministes (T_kw), sans jamais re-définir ni altérer les règles cryptographiques, de canonicalisation ou de dérivation de clés.
Le backend agit comme un système opaque vis-à-vis du sens des keywords et se limite à manipuler des tokens et métadonnées conformes à PD-42.
Aucune implémentation logicielle n’est décrite dans ce document.
2. Périmètre / Hors périmètre¶
2.1 Inclus¶
- Réception de tokens T_kw et métadonnées conformes à PD-42.
- Persistance backend des couples (T_kw, resource_id, métadonnées).
- Recherche server-side par égalité stricte de T_kw.
- Validation de conformité des métadonnées (algorithm_id, canonicalization_id, k_search_scope).
- Gestion des erreurs contractuelles backend.
- Observabilité et auditabilité des opérations.
2.2 Hors périmètre¶
- Génération, canonicalisation ou tokenisation des keywords (réservé à PD-42).
- Accès, stockage ou interprétation de keywords en clair.
- Recherche plein texte, floue, partielle, sémantique ou par similarité.
- Scoring, ranking ou pondération des résultats.
- Protection contre les attaques par analyse de fréquence ou dictionnaire.
Ce risque est explicitement accepté : l’exposition potentielle aux attaques par analyse de fréquence/dictionnaire ne constitue pas une non-conformité contractuelle au titre de PD-236.
Les éléments hors périmètre sont explicitement non testables dans le cadre de la présente spécification.
3. Définitions¶
- T_kw : token de recherche déterministe produit conformément à PD-42, au format défini par l’algorithm_id déclaré (cf. PD-42 §4.3 ; pour DET-HMAC-SHA256-B64T22-V1 : Base64 RFC 4648 URL-safe sans padding, longueur 22).
- Métadonnées PD-42 : ensemble {algorithm_id, canonicalization_id, k_search_scope}.
- index_id : identifiant logique de l’index backend.
- M_I : métadonnées PD-42 de référence d’un index I, fixées à l’initialisation.
- Index backend : structure logique associant des T_kw à des resource_id pour un index_id donné, conforme à M_I.
- Recherche backend : opération de sélection de resource_id par égalité stricte sur T_kw.
- Keyword en clair : valeur textuelle non tokenisée fournie au backend via un champ explicitement qualifié de keyword dans le contrat d’API.
- Client conforme PD-42 : composant amont respectant intégralement PD-42.
4. Invariants (non négociables)¶
| ID | Invariant | Justification |
|---|---|---|
| INV-01 | Le backend ne reçoit ni ne persiste de keyword en clair | Cloisonnement et conformité PD-42 |
| INV-02 | Toute recherche repose uniquement sur l’égalité stricte de T_kw | Déterminisme et testabilité |
| INV-03 | Pour un index_id donné, les métadonnées PD-42 {algorithm_id, canonicalization_id, k_search_scope} sont strictement identiques pour toutes les entrées et requêtes | Prévention des incohérences d’index |
| INV-04 | Un mismatch de métadonnées entraîne un rejet explicite | Sécurité et auditabilité |
| INV-05 | Le backend ne déduit aucune information sémantique à partir de T_kw (principe non testable a priori) | Neutralité applicative |
5. Flux nominaux¶
5.0 Index et métadonnées de référence¶
- Chaque index backend est identifié par un index_id.
- Les métadonnées de référence M_I sont fixées à la création de l’index ou lors de la première indexation acceptée.
- M_I est immuable pour la durée de vie de l’index ; tout changement relève d’une migration hors périmètre.
- Toute requête d’indexation ou de recherche doit fournir des métadonnées M_req strictement identiques à M_I (égalité champ-à-champ), sinon ERR-BE-04.
5.1 Indexation backend¶
- Le backend reçoit un ensemble de couples (T_kw, resource_id) accompagnés des métadonnées PD-42.
- Le backend vérifie la présence des métadonnées et leur conformité à M_I.
- Le backend vérifie la conformité du format de T_kw selon PD-42 et l’algorithm_id déclaré.
- Le backend persiste uniquement T_kw, resource_id et métadonnées.
- Aucune transformation de T_kw n’est effectuée.
5.2 Recherche backend¶
- Le backend reçoit une requête contenant un T_kw et ses métadonnées.
- Le backend valide la cohérence des métadonnées avec M_I.
- Le backend vérifie la conformité du format de T_kw selon PD-42 et l’algorithm_id déclaré.
- Le backend effectue une recherche par égalité stricte sur T_kw.
- Le backend retourne l’ensemble (non ordonné) des resource_id associés.
5bis. Diagrammes¶
5bis.1 Diagramme de séquence — Indexation backend (§5.1)¶
sequenceDiagram
participant C as Client conforme PD-42
participant B as Backend PD-236
participant DB as Persistence
C->>B: POST /index {T_kw[], resource_id, metadata PD-42}
activate B
B->>B: Vérifier présence T_kw (sinon ERR-BE-01)
B->>B: Vérifier format T_kw vs algorithm_id (sinon ERR-BE-02)
B->>B: Vérifier présence métadonnées (sinon ERR-BE-03)
alt Index existant (M_I défini)
B->>B: Comparer M_req vs M_I champ-à-champ
Note right of B: INV-03 — métadonnées identiques<br/>pour toutes les entrées
B-->>C: ERR-BE-04 si mismatch
else Première indexation (M_I non défini)
B->>DB: Fixer M_I = M_req (immuable)
Note right of DB: M_I figé pour la durée<br/>de vie de l’index
end
B->>B: Vérifier absence keyword clair (sinon ERR-BE-05 + audit)
Note right of B: INV-01 — jamais de keyword en clair
B->>DB: Persister (T_kw, resource_id, métadonnées)
Note right of DB: Aucune transformation de T_kw<br/>INV-02 — égalité stricte préservée
DB-->>B: OK
B-->>C: 200 OK
deactivate B 5bis.2 Diagramme de séquence — Recherche backend (§5.2)¶
sequenceDiagram
participant C as Client conforme PD-42
participant B as Backend PD-236
participant DB as Persistence
C->>B: GET /search {T_kw, metadata PD-42}
activate B
B->>B: Vérifier présence T_kw (sinon ERR-BE-01)
B->>B: Vérifier format T_kw vs algorithm_id (sinon ERR-BE-02)
B->>B: Vérifier présence métadonnées (sinon ERR-BE-03)
B->>B: Comparer M_req vs M_I champ-à-champ (sinon ERR-BE-04)
Note right of B: INV-03 — cohérence métadonnées<br/>INV-04 — rejet explicite si mismatch
B->>DB: SELECT resource_id WHERE T_kw = ? (égalité stricte)
Note right of DB: INV-02 — recherche par<br/>égalité stricte uniquement
DB-->>B: {resource_id[]}
B-->>C: 200 {resource_id[]} (ensemble non ordonné)
deactivate B 5bis.3 Diagramme d’états — Cycle de vie d’un index backend (§5.0)¶
stateDiagram-v2
[*] --> CREATED : Création index_id
CREATED --> INITIALIZED : Première indexation acceptée<br/>(M_I fixé, immuable)
Note right of INITIALIZED : INV-03 — M_I identique<br/>pour toutes les entrées
INITIALIZED --> INITIALIZED : Indexation conforme (M_req == M_I)
INITIALIZED --> INITIALIZED : Recherche conforme (M_req == M_I)
INITIALIZED --> REJECTED : Mismatch M_req ≠ M_I
Note right of REJECTED : INV-04 — rejet explicite<br/>ERR-BE-04
REJECTED --> INITIALIZED : Nouvelle requête conforme
INITIALIZED --> [*] : Migration/purge (hors périmètre §10) 6. Cas d’erreur¶
| ID | Situation | Résultat attendu |
|---|---|---|
| ERR-BE-01 | Absence de T_kw | Rejet explicite |
| ERR-BE-02 | T_kw non conforme au format défini par PD-42 pour l’algorithm_id déclaré | Rejet explicite |
| ERR-BE-03 | Métadonnées PD-42 absentes ou incomplètes | Rejet explicite |
| ERR-BE-04 | Mismatch algorithm_id / canonicalization_id / k_search_scope | Rejet explicite |
| ERR-BE-05 | Tentative d’injection de keyword en clair (champ explicitement qualifié de keyword) | Rejet explicite + audit |
Tout rejet explicite : - inclut un code d’erreur ERR-BE-xx et une raison contractuelle, - n’entraîne aucun effet de bord (aucune persistance/modification d’état), - pour ERR-BE-05, déclenche un événement d’audit.
7. Critères d’acceptation (testables)¶
| ID | Critère | Observable |
|---|---|---|
| CA-01 | Indexation possible uniquement avec T_kw valide (format PD-42) | Persistance contrôlée |
| CA-02 | Recherche retourne exactement l’ensemble attendu | Comparaison d’ensemble |
| CA-03 | Aucun keyword en clair n’est stocké | Inspection backend |
| CA-04 | Toute incohérence de métadonnées est rejetée | Codes d’erreur |
| CA-05 | Ajout de nouvelles ressources n’altère pas les index existants | Non-régression |
8. Scénarios de test (Given / When / Then)¶
Les scénarios de test sont définis dans PD-236-tests.md et couvrent l’ensemble des invariants et critères d’acceptation testables ; INV-05 est un principe non testable a priori.
9. Hypothèses explicites¶
| ID | Hypothèse | Impact si faux |
|---|---|---|
| H-01 | Les clients amont sont conformes à PD-42 | Résultats incohérents |
| H-02 | Le backend ne requiert aucune sémantique métier sur les keywords | Dérive fonctionnelle |
10. Points à clarifier¶
- Politique de migration des index en cas d’évolution de PD-42.
- Mapping protocolaire des codes ERR-BE-xx (HTTP/GRPC, format de réponse).
- Stratégie de purge ou de reconstruction d’index.
Références¶
- Epic : PD-186 BACKEND CORE
- Dépendance normative : PD-42 — Recherche déterministe chiffrée
- Repos concernés : backend