Files
adam-acs/.kiro/tasks/state-machine-single-session.md
T
Kevin L'HereecandContinue aad93911e4 feat: TR-069 CWMP state machine hardening + exchange viewer improvements
- TR-069 CWMP state machine hardening (14 phases): shared event utility,
  multi-event routing, GPN circuit breaker, IdleState GPN guard, expanded
  GPN fault codes, CriticalReadsState, ConfigEval GPN guard, task queue
  race condition fix, explicit error handling, terminal states
  (OperationalState/PartialOperationalState), consolidated reclassify,
  crash pattern detection, removed enqueueImmediate, state flow wiring
- Fix SOAP Fault not processed by state machine (soap-env:Fault detection)
- Fix GPN circuit breaker not persisting after session drops
- Fix CriticalReadsState GPV response parsing (xsi:type normalization)
- Fix CriticalReadsState not processing GPV response values
- Skip SPV when device is already compliant (ProvisioningCode check)
- Add Device.DeviceInfo.ModelName to critical reads GPV
- Fix TypeError on DeviceDetail parameters view (null guards)
- Log empty 204 responses in exchange trace UI
- TR-181 catalog: type corrections and new entries (+6640 lines)
- SequenceViewer: replace session-nav buttons with compact dropdown select
- SequenceViewer: fix CPE/ACS lifeline headers wrapping to 2 lines
- Add 20 unit tests for state machine fixes (SOAP Fault, GPN circuit
  breaker, CriticalReads, stale session, ConfigEval/ComplianceUpdate skips)

Generated with [Continue](https://continue.dev)

Co-Authored-By: Continue <noreply@continue.dev>
2026-06-08 12:49:00 +00:00

79 lines
3.5 KiB
Markdown

# Tâche : Refactoring State Machine — Session unique
## Objectif
Refactorer la `MainStateMachine` pour que tout le workflow d'onboarding se fasse en **une seule session CWMP**, sans déclencher de `ScheduleInform`.
## Flow attendu (session unique)
```
CPE → ACS : Inform (BOOTSTRAP)
ACS → CPE : InformResponse
CPE → ACS : POST vide
ACS → CPE : GetParameterNames
CPE → ACS : Fault (9003 si non supporté) OU GetParameterNamesResponse (si supporté)
ACS → CPE : GetParameterValues (lectures critiques)
CPE → ACS : GetParameterValuesResponse
ACS → CPE : SetParameterValues (ProvisioningCode + PeriodicInformInterval)
CPE → ACS : SetParameterValuesResponse
ACS → CPE : 204 (fin de session)
```
## Flow actuel (problème)
```
Session 1 (BOOTSTRAP):
Inform → InformResponse → Empty → SPV → SPVResponse → 204
Session 2 (SCHEDULED - déclenchée par ScheduleInform):
Inform → InformResponse → Empty → GPV → GPVResponse → GPN → Fault → 204
Session 3 (PERIODIC):
Inform → InformResponse → Empty → SPV → SPVResponse → 204
```
## Problèmes identifiés
1. **Le GPV critique est servi par la task queue AVANT la state machine** — le `continue()` dans `state_machine_manager.ts` servait les queued tasks en priorité sur la state machine (corrigé partiellement)
2. **L'ordre des états n'est pas optimal** — actuellement `IdleState → DiscoveringParams → ConfigEval → ComplianceUpdate → ExecutingCommands`, mais le GPV critique est hors de la state machine (dans la task queue)
3. **Le SCHEDULED est déclenché par l'équipement** suite au changement du PeriodicInformInterval — l'ACS ne l'envoie pas explicitement mais le CPE refait un Inform avec event SCHEDULED après avoir accepté le SPV
## Changements requis
### 1. Intégrer le GPV critique dans la state machine
Au lieu d'enqueuer le GPV via `manager.enqueueImmediate()` dans le controller, l'ajouter comme état dans la state machine :
```
IdleState → DiscoveringParametersState (GPN) → CriticalReadsState (GPV) → ConfigurationEvaluationState → ComplianceUpdateState (SPV) → ExecutingCommandsState → CompletedState
```
### 2. Ne pas retenter GPN si gpnStatus est déjà "unsupported"
Dans `IdleState`, vérifier `device.gpnStatus` :
- Si `'unsupported'` → skip directement à `CriticalReadsState`
- Si `'unknown'` ou `'supported'` → tenter GPN
### 3. Supprimer les enqueue critiques du controller
Retirer le bloc `enqueueImmediate(device, 'get_parameter_values', criticalPaths)` du `cwmp_controller.ts` — c'est la state machine qui gère.
## Fichiers impactés
| Fichier | Changement |
|---------|-----------|
| `app/services/cwmp/main_state_machine.ts` | Ajouter `CriticalReadsState`, réordonner les états |
| `app/services/cwmp/state_machine_manager.ts` | Simplifier `continue()` (plus de task queue priority) |
| `app/controllers/cwmp_controller.ts` | Retirer `enqueueImmediate` pour GPV |
| `tests/unit/services/main_state_machine.spec.ts` | Adapter les tests |
| `tests/unit/services/cwmp/main_state_machine_extended.spec.ts` | Adapter |
## Critères de succès
- [ ] Un BOOTSTRAP frais produit une seule session : `Inform → GPN → Fault/Response → GPV → SPV → 204`
- [ ] Un PERIODIC sur un device connu (gpnStatus=unsupported) : `Inform → SPV → 204` (pas de GPN)
- [ ] Pas de session SCHEDULED superflue (le GPV/GPN est fait dans la session BOOTSTRAP)
- [ ] Tous les tests unitaires passent
- [ ] Le genieacs-sim (Huawei, GPN supporté) continue de fonctionner
- [ ] Le simulateur Livebox (GPN non supporté) provisionne correctement en 1 session