Aller au contenu

BC-067B — Dormant Runtime Retirement Decision

Status: HISTORICAL For the current architecture, see: ./dependances.md, ../runtime/overview.md, ./bc-067d-reference-core-final-certification.md.

Projet : /mnt/data/cmonchoix-platform Branche : bc-048-samsung-wearable-enrichment

Verdict

BC-067B est fermable.

Décision globale

RETIREMENT_DECISION: REDUCE_TO_REFERENCE_CORE

BC-067A a déjà verrouillé DO_NOT_ACTIVATE. BC-067B ajoute la seconde moitié de la décision : il ne faut pas garder toute la chaîne dormante indéfiniment telle quelle.

La meilleure décision au 15 juillet 2026 est :

  • conserver un noyau de référence très limité ;
  • préparer le retrait futur des placeholders et shells runtime dormants ;
  • ne supprimer aucun code dans BC-067B elle-même.

Synthèse par composant

Component Decision Justification BC de mise en œuvre
CatalogIntelligenceEngine KEEP_AS_REFERENCE seul composant portant encore des règles métier directement testées sur repository canonique aucune requise pour le garder
ProjectionEngine RETIRE moteur placeholder, sans comportement projection utile prouvé BC-067C or dedicated BC
ProjectionCatalogWiring RETIRE wiring de compatibilité autour d’un moteur placeholder, sans consumer live BC-067C or dedicated BC
EventSubscriberRegistry RETIRE valeur limitée à la chaîne realtime dormante, remplaçable par tests de caractérisation BC-067C or dedicated BC
AsyncEventQueue RETIRE queue mémoire purement test/prototype, non production-ready, concept déjà couvert ailleurs BC-067C or dedicated BC
AsyncWorker RETIRE worker dormant sans consumer live ni logique unique indispensable BC-067C or dedicated BC
RealtimeCatalogRebuilder REDUCE_TO_REFERENCE_CORE garde encore un flow unique ranking -> intelligence et l’extraction aggregateId/productId, mais pas un avenir runtime live BC-067C or dedicated BC

Inventaire final

Component Rôle Consumers prod Consumers tests Valeur actuelle
CatalogIntelligenceEngine mise à jour d’intelligence catalogue via repository canonique 0 3 référence architecturale / règles métier testables
ProjectionEngine replay/dispatch placeholder 0 2 placeholder / prototype
ProjectionCatalogWiring wiring de compatibilité store -> writer 1 interne seulement 1 compatibilité / prototype
EventSubscriberRegistry registre ordonné d’abonnés 0 3 orchestration cohérente locale
AsyncEventQueue FIFO mémoire 0 3 test helper / placeholder
AsyncWorker consommateur de queue dormant 0 2 test helper / prototype
RealtimeCatalogRebuilder orchestration ranking -> intelligence 0 2 référence de design / orchestration cohérente

Note : le seul “consumer prod” encore visible est ProjectionCatalogWiring -> new ProjectionEngine() à l’intérieur même de la chaîne. Il ne constitue pas un consumer live plugin/runtime.

Preuve d’usage

Component Production use Test use Reflection Serialization Verdict
CatalogIntelligenceEngine non oui non non keep as reference
ProjectionEngine non live oui non non retire
ProjectionCatalogWiring interne à la chaîne seulement oui non non retire
EventSubscriberRegistry non oui non non retire
AsyncEventQueue non oui non non retire
AsyncWorker non oui non non retire
RealtimeCatalogRebuilder non oui non non reduce to reference core

Preuves structurantes :

  • aucun import plugin/runtime live ;
  • aucun hook WordPress, cron, CLI, HTTP, worker runtime ;
  • aucune reflection prouvée ;
  • aucun FQCN sérialisé/persisté prouvé ;
  • les usages restent confinés à src/ et aux tests.

Valeur réelle conservée

Component Valeur de test Valeur de compat Valeur de design Coût de maintenance
CatalogIntelligenceEngine élevée moyenne élevée moyen
ProjectionEngine faible faible faible moyen
ProjectionCatalogWiring moyenne moyenne faible moyen
EventSubscriberRegistry moyenne faible moyenne faible
AsyncEventQueue moyenne faible faible moyen
AsyncWorker moyenne faible faible moyen
RealtimeCatalogRebuilder élevée moyenne élevée moyen

Focus CatalogIntelligenceEngine

Élément Unique Dupliqué Retirable
agrégation min/max/best avant persist oui non prouvé non
normalisation marchands dans metadata['offers'] oui non prouvé non
no-op si item absent oui non prouvé non
shell realtime autour non oui, via RealtimeCatalogRebuilder oui

Décision :

  • conserver CatalogIntelligenceEngine ;
  • retirer plus tard l’orchestration dormante autour ;
  • ne pas confondre ce service métier testable avec la chaîne runtime inactive.

Focus ProjectionEngine

Capability Implémentée Placeholder Utilisée
rebuildAll() appelle replayAll() oui non oui, tests
dispatch product.created partiel oui tests seulement
construction de read model non oui non
projection utile persistée non oui non

Décision :

  • candidat clair au retrait futur.

Focus ProjectionCatalogWiring

Consumer Reason Replaceable
ProjectionCatalogWiring::build() construit ProjectionEngine placeholder oui
ProjectionCatalogWiringCompatibilityTest couvre le pont vers CatalogProjectionWriter oui

Décision :

  • le pont vers CatalogProjectionWriter doit être caractérisé ;
  • le shell de wiring n’a pas de raison forte de survivre ensuite.

Focus EventSubscriberRegistry

Il n’existe aucune preuve locale de réutilisation hors RealtimeCatalogRebuilder.

Décision :

  • pas de statut de composant générique stable ;
  • retrait futur probable avec la réduction du shell realtime.

Focus AsyncEventQueue

Capability Nécessaire aux tests Disponible ailleurs
FIFO mémoire oui oui, conceptuellement
queue durable non oui ailleurs dans le repo
retry / DLQ / claim non oui ailleurs sous autres abstractions

Décision :

  • ne surtout pas la conserver comme “fausse prod queue” ;
  • candidat naturel au retrait.

Focus AsyncWorker

Sa seule logique propre est :

  • pop d’un objet ;
  • si DomainEvent : process()
  • sinon : boot()

Cette valeur est faible et déjà contournable via tests directs du rebuilder.

Décision :

  • candidat au retrait.

Focus RealtimeCatalogRebuilder

Flow Unique Used elsewhere Candidate extraction
boot() idempotent avec abonnements oui non prouvé oui
extraction productId/aggregateId oui non prouvé oui
ranking -> intelligence->rebuild() oui non prouvé oui

Décision :

  • ne pas le garder comme shell realtime complet ;
  • réduire plus tard à un noyau de référence synchrone, ou en extraire seulement les règles utiles.

Graphe transversal

AsyncEventQueue
→ AsyncWorker
→ RealtimeCatalogRebuilder
→ EventSubscriberRegistry
→ CatalogRankingEngine
→ CatalogIntelligenceEngine
→ CatalogRepositoryInterface

ProjectionCatalogWiring
→ ProjectionEngine
→ CatalogProjectionWriter
Source Target Nécessaire si retrait partiel
AsyncEventQueue AsyncWorker non
AsyncWorker RealtimeCatalogRebuilder non
RealtimeCatalogRebuilder EventSubscriberRegistry non, si flow extrait directement
RealtimeCatalogRebuilder CatalogRankingEngine oui
RealtimeCatalogRebuilder CatalogIntelligenceEngine oui
CatalogIntelligenceEngine CatalogRepositoryInterface oui
ProjectionCatalogWiring ProjectionEngine non
ProjectionCatalogWiring CatalogProjectionWriter non, si test direct du writer conservé

Scénarios comparés

Option Gain Risque Effort Réversibilité
KEEP_ALL_DORMANT nul confusion future et dette continue faible forte
REDUCE_TO_REFERENCE_CORE bon compromis dette/valeur faible à moyen moyen forte
RETIRE_ALL dette minimale trop agressif sans extraction préalable des règles utiles moyen moyenne

Conclusion : REDUCE_TO_REFERENCE_CORE est la meilleure décision prouvable aujourd’hui.

Périmètre du noyau de référence

Ce qui doit rester comme noyau cible :

  • CatalogIntelligenceEngine
  • les tests métier qui prouvent ses règles
  • la documentation de la chaîne et de la décision
  • la caractérisation du flow ranking -> intelligence

Ce qui est candidat au retrait futur :

  • ProjectionEngine
  • ProjectionCatalogWiring
  • EventSubscriberRegistry
  • AsyncEventQueue
  • AsyncWorker
  • le shell realtime complet de RealtimeCatalogRebuilder

Risque de suppression future

Component Reflection Serialization External consumer Removal risk
CatalogIntelligenceEngine non non non live moyen
ProjectionEngine non non non faible
ProjectionCatalogWiring non non non live faible
EventSubscriberRegistry non non non faible
AsyncEventQueue non non non faible
AsyncWorker non non non faible
RealtimeCatalogRebuilder non non non moyen

Tests requis avant suppression en BC-067C+

  • no-consumer gate
  • no-reflection gate
  • no-serialization gate
  • no-plugin/runtime gate
  • behavior extraction tests
  • autoload absence test
  • removed-FQCN guard

Impact runtime

  • aucun changement runtime ;
  • aucun changement plugin ;
  • aucun sync runtime ;
  • aucun worker réel ;
  • aucun rebuild réel ;
  • aucun event réel ;
  • aucun write réel.

Conclusion

Au 15 juillet 2026 :

  • DO_NOT_ACTIVATE reste vrai ;
  • REDUCE_TO_REFERENCE_CORE est la bonne décision de retraite ;
  • BC-067B ferme donc la décision, mais pas la suppression ;
  • toute suppression réelle relève d’une BC-067C ou dédiée.

Note postérieure BC-067C

BC-067C a exécuté cette réduction sans activer de runtime :

  • CatalogIntelligenceEngine reste conservé ;
  • le noyau de référence est maintenant CatalogIntelligenceRebuildService -> CatalogIntelligenceEngine ;
  • ProjectionEngine, ProjectionCatalogWiring, EventSubscriberRegistry, AsyncEventQueue, AsyncWorker et RealtimeCatalogRebuilder ont été retirés ;
  • aucun wrapper live n’a été gardé.

Note postérieure BC-067D

BC-067D ferme la décision de retraite :

  • REDUCE_TO_REFERENCE_CORE devient l’état final certifié ;
  • le runtime demeure non activé ;
  • aucun consumer live plugin/runtime du reference core n’est prouvé.