PD-80 — Décomposition step 6a
- Story : PD-80 — Scellement instantané < 1h
- Date : 2026-03-12
- Stratégie : séquentiel (11 modules, dépendances linéaires)
Parallelization
mode: sequential
reason: >
Les 11 modules ont des dépendances d'import entre eux (entity → service → processor → module).
Un mode by_level apporterait peu de gain car les interfaces sont partagées.
tasks:
- id: T1
module: CC-80-11
agent: agent-developer
description: Migration DDL — table urgent_seals + enum + index
files: ["src/database/migrations/*-CreateUrgentSeals.ts"]
- id: T2
module: CC-80-01
agent: agent-developer
description: Entité UrgentSeal + enums + machine d'états close-world
files: ["src/modules/urgent-seal/entities/**", "src/modules/urgent-seal/enums/**", "src/modules/urgent-seal/guards/**"]
depends_on: [T1]
- id: T3
module: CC-80-09
agent: agent-developer
description: Configuration + validation clamp + check NTP
files: ["src/modules/urgent-seal/services/seal-config.service.ts"]
depends_on: [T2]
- id: T4
module: CC-80-05
agent: agent-developer
description: Service crypto DEK (envelope encryption HSM)
files: ["src/modules/urgent-seal/services/seal-crypto.service.ts"]
depends_on: [T2]
- id: T5
module: CC-80-08
agent: agent-developer
description: Service métriques Prometheus (4 métriques + P95)
files: ["src/modules/urgent-seal/services/seal-metrics.service.ts"]
depends_on: [T3]
- id: T6
module: CC-80-02
agent: agent-developer
description: Service admission (quota + rate-limit + DTO)
files: ["src/modules/urgent-seal/services/admission.service.ts", "src/modules/urgent-seal/dto/**"]
depends_on: [T2, T3, T4]
- id: T7
module: CC-80-06
agent: agent-developer
description: Service notification multi-canal (push + email + webhook)
files: ["src/modules/urgent-seal/services/seal-notification.service.ts"]
depends_on: [T2]
- id: T8
module: CC-80-03
agent: agent-developer
description: Processor TSA prioritaire (retries + transitions retour)
files: ["src/modules/urgent-seal/processors/priority-tsa.processor.ts"]
depends_on: [T2, T4, T5]
- id: T9
module: CC-80-04
agent: agent-developer
description: Processor ancrage prioritaire (mini-batch Merkle)
files: ["src/modules/urgent-seal/processors/priority-anchor.processor.ts"]
depends_on: [T2, T4, T5, T7]
- id: T10
module: CC-80-07
agent: agent-developer
description: Worker réconciliation (lock Redis + scan orphelins)
files: ["src/modules/urgent-seal/services/seal-reconciliation.service.ts"]
depends_on: [T2, T3]
- id: T11
module: CC-80-09
agent: agent-developer
description: Scheduler timeout + Controller API + Module NestJS
files: ["src/modules/urgent-seal/schedulers/**", "src/modules/urgent-seal/controllers/**", "src/modules/urgent-seal/urgent-seal.module.ts"]
depends_on: [T2, T3, T5, T6, T7, T8, T9, T10]
Manifest des tâches
| # | Module | Description | Agent | Dépend de |
| T1 | CC-80-11 | Migration DDL | developer | — |
| T2 | CC-80-01 | Entité + enums + machine d'états | developer | T1 |
| T3 | CC-80-09 | Config + clamp + NTP | developer | T2 |
| T4 | CC-80-05 | Crypto DEK (envelope encryption) | developer | T2 |
| T5 | CC-80-08 | Métriques Prometheus | developer | T3 |
| T6 | CC-80-02 | Admission (quota + rate-limit) | developer | T2,T3,T4 |
| T7 | CC-80-06 | Notification multi-canal | developer | T2 |
| T8 | CC-80-03 | Processor TSA prioritaire | developer | T2,T4,T5 |
| T9 | CC-80-04 | Processor ancrage mini-batch | developer | T2,T4,T5,T7 |
| T10 | CC-80-07 | Worker réconciliation | developer | T2,T3 |
| T11 | CC-80-10+09 | Timeout scheduler + Controller + Module | developer | T2-T10 |
Stubs inter-PD
| Dépendance | Story | Interface attendue | Stub requis |
| TsaService | PD-39 | requestTimestamp(hash): TsaToken | Non (existant) |
| MerkleService | PD-54 | buildTree(hashes): MerkleResult | Non (existant) |
| AnchorService | PD-55 | anchor(merkleRoot): AnchorResult | Non (existant) |
| FreemiumService | PD-84 | checkQuota(userId, plan): boolean | Non (existant) |
| NotificationDispatch | PD-105 | sendPush(userId, payload) | Non (existant) |
| CryptoModule (HSM) | PD-35 | wrapKey(dek, kekId): Buffer | Non (existant) |
| AuditModule | PD-31 | emit(event): void | Non (existant) |
Aucun stub n'est requis — toutes les dépendances inter-PD sont existantes dans le backend.