Story : PD-63 — GET /documents/:id/download Gate : 3 (CONFORMITY_CHECK) Itération : v1 Date : 2026-02-20
1. Synthèse
| Gravité | Nombre |
| Bloquant | 4 |
| Majeur | 7 |
| Mineur | 7 |
| Non applicable | 2 |
| Total valides | 18 |
2. Écarts bloquants (4)
ECT-63-01 — Audit fail-open vs fail-closed
| Champ | Valeur |
| Type | ECT (Écart technique) |
| Référence | INV-63-05, architecture PD-46 |
| Description | INV-63-05 impose une trace probatoire pour CHAQUE demande (non négociable). L'implémentation PD-46 héritée utilise un try/catch silencieux permettant un téléchargement sans audit en cas d'erreur. |
| Impact | Violation de non-répudiation. Perte de traçabilité probatoire. |
| Action requise | Modifier l'architecture pour fail-closed : si audit échoue, rejeter la requête. |
| Champ | Valeur |
| Type | DIV (Divergence) |
| Référence | §10.1, TC-NOM-05, TC-INT-01 |
| Description | La spec §10.1 demande de figer le format (URL pré-signée vs redirection HTTP) mais les tests présupposent déjà l'URL pré-signée. |
| Impact | Tests non déterministes si le format change. Incohérence Spec↔Tests. |
| Action requise | Figer dans la spec : "La réponse succès retourne une URL pré-signée S3 dans le body JSON." |
ECT-63-03 — Statuts 410/423 sans modèle de données
| Champ | Valeur |
| Type | ECT (Écart technique) |
| Référence | ERR-63-06, ERR-63-07, TC-INT-07, TC-INT-08 |
| Description | Les codes 410 (supprimé) et 423 (verrouillé) sont spécifiés et testés, mais le modèle DocumentSecure n'a ni deletedAt ni flag de verrouillage juridique. |
| Impact | Tests non implémentables. |
| Action requise | Ajouter les champs au modèle OU déclarer ces cas hors périmètre PD-63. |
ECT-63-04 — Flux partage/B2B = TODO
| Champ | Valeur |
| Type | ECT (Écart technique) |
| Référence | H-63-01, Flux B et C, TC-NOM-03, TC-NOM-04 |
| Description | H-63-01 suppose PD-46 "stable" mais DocumentAccessGuard contient des TODO pour partage et B2B. 66% des flux nominaux non testables. |
| Impact | Flux Partage et B2B non vérifiables. |
| Action requise | Compléter l'implémentation des guards partage/B2B OU créer stories dédiées et marquer hors périmètre PD-63. |
3. Écarts majeurs (7)
DIV-63-01 — Politique anti-énumération 403/404
| Champ | Valeur |
| Type | AMB (Ambiguïté) |
| Référence | §10.2, TC-SEC-11 |
| Description | Choix 403 vs 404 non tranché pour document existant mais non autorisé. Oracle d'énumération possible. |
| Action requise | Trancher : "Document existant non autorisé = 403" ou "= 404 uniforme". |
DIV-63-02 — Sémantique usage unique vs multi-usage
| Champ | Valeur |
| Type | AMB (Ambiguïté) |
| Référence | INV-63-03, §10.5 |
| Description | INV-63-03 mentionne "non réutilisable hors fenêtre" mais §10.5 demande clarification sur réutilisabilité dans la fenêtre TTL. |
| Action requise | Trancher : "URL réutilisable durant TTL" (comportement S3 natif) ou "usage unique" (nécessite token additionnel). |
DIV-63-03 — Double système de codes d'erreur
| Champ | Valeur |
| Type | DIV (Divergence) |
| Référence | ERR-63-* vs ERR-46-* |
| Description | Deux taxonomies concurrentes sans mapping formel. |
| Action requise | Créer mapping ERR-46 → ERR-63 ou unifier la taxonomie. |
DIV-63-04 — Seuil timing attack non contractuel
| Champ | Valeur |
| Type | AMB (Ambiguïté) |
| Référence | TC-SEC-12 |
| Description | "ex. <10%" n'est pas un seuil contractuel. |
| Action requise | Fixer : "Écart latence p95 ≤ 10% entre doc existant et inexistant." |
DIV-63-05 — Événements audit sans signature probatoire
| Champ | Valeur |
| Type | SEC (Sécurité) |
| Référence | H-63-03, INV-63-05 |
| Description | Événements en table PostgreSQL sans signature HSM/TSA. Force probatoire contestable. |
| Action requise | Clarifier si PD-37 (HSM audit signature) s'applique à ces événements. |
DIV-63-06 — Statuts document autorisés non spécifiés
| Champ | Valeur |
| Type | AMB (Ambiguïté) |
| Référence | Flux §5 |
| Description | Quels statuts (PENDING, SEALED, EXPIRED) autorisent le téléchargement ? |
| Action requise | Ajouter tableau : statut → téléchargeable (oui/non). |
DIV-63-07 — Granularité audit non contractualisée
| Champ | Valeur |
| Type | AMB (Ambiguïté) |
| Référence | §10.6 |
| Description | Champs audit (actor, docId, tenant, décision, timestamp) supposés mais non contractualisés. |
| Action requise | Figer le schéma d'événement audit dans la spec. |
4. Écarts mineurs (7)
| ID | Type | Description |
| MIN-63-01 | DIV | Pre-signed URL expose chemin S3 (acceptable si clés opaques) |
| MIN-63-02 | AMB | Compatibilité Glacier sans SLA (cadrage NFR) |
| MIN-63-03 | AMB | Format ID UUID/ULID non fixé |
| MIN-63-04 | AMB | Métadonnées retournées non définies |
| MIN-63-05 | AMB | Fake clock non documenté (préconditions tests) |
| MIN-63-06 | DIV | TC-INT-14 alternative non tranchée |
| MIN-63-07 | DIV | Numérotation TC-SEC incohérente |
5. Constats non applicables (2)
| ID | Description | Raison |
| NA-01 | Audit 401 non implémentable | Implémentable via interceptor global |
| NA-02 | ERR-63-08 (429) optionnel | Explicitement optionnel dans la spec |
6. Scoring préliminaire (critères Gate 3)
| Critère | Score estimé | Justification |
| Completeness | 5/10 | 4 bloquants dont 2 flux non implémentables |
| Testability | 6/10 | 7 ambiguïtés majeures, tests présupposent des clarifications |
| Clarity | 7/10 | Structure claire mais 8 points à clarifier non résolus |
| Traceability | 8/10 | Matrice TC→CA/INV complète, quelques incohérences mineures |
Moyenne : 6.5/10 → NON_CONFORME (< 7.0)
7. Verdict préliminaire
NON_CONFORME — Les 4 bloquants doivent être résolus avant nouvelle soumission.
Actions prioritaires
- Résoudre ECT-63-01 : Architecture fail-closed pour audit
- Résoudre ECT-63-02 : Figer format réponse = URL pré-signée
- Résoudre ECT-63-03 : Ajouter champs modèle OU hors périmètre
- Résoudre ECT-63-04 : Compléter guards OU hors périmètre
Points à clarifier (§10) à trancher
- §10.1 → URL pré-signée (confirmé par tests)
- §10.2 → Choix anti-énumération
- §10.5 → Multi-usage dans TTL (S3 natif)
- §10.6 → Schéma audit
Généré par : Orchestrateur Claude Date : 2026-02-20