Décomposition Multi-Agents — PD-107 Authentification Biométrique iOS¶
Version : 1.0 Date : 2026-02-14 Auteur : Claude (Orchestrateur) Phase : 6a — Décomposition
1. Configuration Git¶
| Branche | Rôle | Agent |
|---|---|---|
feature/PD-107-biometric-auth | Production | Claude |
feature/PD-107-biometric-auth-eval | Shadow mode évaluation | Qwen |
Mode : Dual-branch (shadow mode actif pour Qwen sur Phase 6)
2. Agents assignés¶
| Agent | Rôle | Modèle | Temperature | Tâches |
|---|---|---|---|---|
agent-developer | Développement code | Claude (claude -p) | 0.2 | T1-T14 |
agent-qa-unit | Tests unitaires | Claude (claude -p) | 0.2 | T15, T16 |
agent-qa-ihm | Tests E2E Detox | Claude (claude -p) | 0.2 | T17 |
Qwen (branche -eval) : Exécute les mêmes tâches T1-T17 via /ollama -a factual -m qwen2.5-coder:32b
3. Décomposition des 17 tâches¶
Phase 1 : Infrastructure native (2 tâches)¶
| # | Tâche | Agent | Contract | Fichiers | Dépendances | Durée est. |
|---|---|---|---|---|---|---|
| T1 | Module natif iOS Keychain | agent-developer | CC-107-T1 | ios/ProbatioVault/BiometricKeychainModule.swift, ios/ProbatioVault/BiometricKeychainModule.m | - | 2h |
| T2 | Bridge TypeScript Keychain | agent-developer | CC-107-T2 | src/services/biometricKeychain.ts, src/services/biometricKeychain.types.ts | T1 | 1h |
Invariants critiques Phase 1 : - kSecAccessControlBiometryCurrentSet OBLIGATOIRE - kSecAttrAccessibleWhenUnlockedThisDeviceOnly OBLIGATOIRE - Mapping erreurs iOS → domaine (CC-107-T2)
Phase 2 : Services core (3 tâches)¶
| # | Tâche | Agent | Contract | Fichiers | Dépendances | Durée est. |
|---|---|---|---|---|---|---|
| T3 | Refactor BiometricService | agent-developer | CC-107-T3 | src/services/biometric.ts (refactor) | T2 | 1.5h |
| T4 | PolicyEngine | agent-developer | CC-107-T4 | src/services/policyEngine.ts | - | 1h |
| T5 | UnlockOrchestrator | agent-developer | CC-107-T5 | src/services/unlockOrchestrator.ts | T3, T4 | 2h |
Changements critiques T3 (migration PD-99) : - Supprimer storeBiometricCredentials(email, password) ❌ - Ajouter storeUnlockSecret(derivedKey) ✅ - Utiliser BiometricKeychain au lieu de SecureStore
Phase 3 : Audit & Logging (2 tâches)¶
| # | Tâche | Agent | Contract | Fichiers | Dépendances | Durée est. |
|---|---|---|---|---|---|---|
| T6 | AuditService (file locale) | agent-developer | CC-107-T6 | src/services/auditService.ts, src/services/auditQueue.ts | - | 1.5h |
| T7 | Intégration audit → orchestrator | agent-developer | CC-107-T7 | src/services/unlockOrchestrator.ts (update) | T5, T6 | 0.5h |
Configuration queue audit :
AUDIT_QUEUE_CONFIG = {
maxEvents: 1000,
maxAgeHours: 72,
retryBackoffMs: [1000, 5000, 30000, 60000, 300000],
maxRetries: 10,
}
Phase 4 : Hooks React (2 tâches)¶
| # | Tâche | Agent | Contract | Fichiers | Dépendances | Durée est. |
|---|---|---|---|---|---|---|
| T8 | useBiometricSettings hook | agent-developer | CC-107-T8 | src/hooks/useBiometricSettings.ts | T5 | 1h |
| T9 | useAppUnlock hook | agent-developer | CC-107-T9 | src/hooks/useAppUnlock.ts | T5, T8 | 1h |
Intégration existante : - Utiliser useAutoLock (PD-174) pour détection inactivité - Synchroniser avec useSecurityStore (PD-174)
Phase 5 : UI Components (3 tâches)¶
| # | Tâche | Agent | Contract | Fichiers | Dépendances | Durée est. |
|---|---|---|---|---|---|---|
| T10 | BiometricPrompt component | agent-developer | CC-107-T10 | src/components/unlock/BiometricPrompt.tsx | T9 | 1h |
| T11 | PasswordFallback component | agent-developer | CC-107-T11 | src/components/unlock/PasswordFallback.tsx | T9 | 1h |
| T12 | BiometricSettingsScreen | agent-developer | CC-107-T12 | src/screens/settings/BiometricSettingsScreen.tsx | T8, T10 | 1.5h |
Accessibilité : - accessibilityLabel sur tous les éléments interactifs - Support VoiceOver iOS - Icônes Face ID / Touch ID selon biometryType
Phase 6 : Intégration (3 tâches)¶
| # | Tâche | Agent | Contract | Fichiers | Dépendances | Durée est. |
|---|---|---|---|---|---|---|
| T13 | Extension SecurityStore | agent-developer | CC-107-T13 | src/store/useSecurityStore.ts, src/store/useBiometricStore.ts | T8, T9 | 1h |
| T14 | Navigation + i18n | agent-developer | CC-107-T14 | src/navigation/AppNavigator.tsx, src/i18n/locales/fr/settings.json, src/i18n/locales/en/settings.json | T12 | 0.5h |
| T15 | Tests unitaires services | agent-qa-unit | CC-107-T15 | src/__tests__/services/biometric*.test.ts, src/__tests__/services/unlockOrchestrator.test.ts, etc. | T1-T7 | 2h |
Phase 7 : Tests avancés (2 tâches)¶
| # | Tâche | Agent | Contract | Fichiers | Dépendances | Durée est. |
|---|---|---|---|---|---|---|
| T16 | Tests hooks + intégration | agent-qa-unit | CC-107-T16 | src/__tests__/hooks/useBiometric*.test.ts, src/__tests__/integration/biometricFlow.test.ts | T8, T9, T15 | 1.5h |
| T17 | Tests E2E Detox | agent-qa-ihm | CC-107-T17 | e2e/biometricActivation.e2e.ts, e2e/biometricUnlock.e2e.ts, e2e/biometricFallback.e2e.ts | T10-T14 | 2h |
4. Graphe de dépendances¶
Phase 1 (Native) │ T1 ──┬──> T2
│ │
Phase 2 (Services) │ └──> T3 ──┬──> T5
│ │
│ T4 ───────┘
│
Phase 3 (Audit) │ T6 ────────────────> T7
│ │
Phase 4 (Hooks) │ └──> T8 ──┬──> T9
│ │
Phase 5 (UI) │ └──> T10, T11 ──> T12
│
Phase 6 (Intégration)│ T13 (parallel T8-T9), T14 (after T12), T15 (after T1-T7)
│
Phase 7 (Tests) │ T16 (after T15), T17 (after T14)
5. Ordre d'exécution¶
| Étape | Tâches | Parallélisme | Durée totale |
|---|---|---|---|
| 1 | T1 | - | 2h |
| 2 | T2, T4, T6 | ✅ Parallèle | 1.5h |
| 3 | T3 | - | 1.5h |
| 4 | T5, T7 | Séquentiel (T5 → T7) | 2.5h |
| 5 | T8 | - | 1h |
| 6 | T9, T13 | ✅ Parallèle | 1h |
| 7 | T10, T11 | ✅ Parallèle | 1h |
| 8 | T12, T14 | Séquentiel | 2h |
| 9 | T15 | - | 2h |
| 10 | T16, T17 | ✅ Parallèle | 2h |
Durée totale estimée : 16.5h (~2.5 jours)
6. Checklist pré-exécution¶
- Branche
feature/PD-107-biometric-authcréée - Branche
feature/PD-107-biometric-auth-evalcréée (shadow mode Qwen) - Code contracts validés (CC-107-T1 à CC-107-T17)
- Gate 5 GO (score 8.38/10)
- T1 prêt à démarrer
7. Convention de commit¶
feat(PD-107): {description}
Agent: {agent-name}
Task: {N}/17
Contract: CC-107-T{N}
Co-Authored-By: Claude <noreply@anthropic.com>
8. Critères de completion par tâche¶
Chaque tâche est considérée DONE quand :
- ✅ Code produit conforme au code contract
- ✅ Invariants vérifiés (liste dans le contract)
- ✅ Pas d'erreur TypeScript (
npx tsc --noEmit) - ✅ Commit poussé sur la branche feature
- ✅ Pas de régression ESLint