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

3.5 KiB

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