Aller au contenu

BC-066A — Catalog Intelligence & Dormant Orchestration Audit

Status: HISTORICAL For the current architecture, see: ./dependances.md, ../runtime/overview.md.

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

Verdict

BC-066A est fermable.

Aucun changement fonctionnel n’a été réalisé. Aucun fichier plugin WordPress n’a été modifié. Aucun fichier runtime miroir n’a été modifié. Aucun nouvel entrypoint n’a été ajouté.

Note postérieure BC-066B

BC-066B a confirmé que le “repository legacy” relevé ici n’était pas une vraie surface maintenue, mais un import interne résiduel dans CatalogIntelligenceEngine.

La suite de BC-066B :

  • a migré ce consumer vers CMonChoix\Platform\Domain\Catalog\Repository\CatalogRepositoryInterface ;
  • a supprimé le class_alias(...) local utilisé uniquement par le test d’orchestration ;
  • a mis en évidence un défaut latent séparé : la mutation directe d’un CatalogItem readonly, corrigée sans activer la chaîne runtime.

Le reste de la chaîne Projection/Realtime reste dormant.

Note postérieure BC-066C

BC-066C n’a pas activé cette chaîne.

Il a seulement :

  • consolidé sa classification en placeholder / orchestration retained / active dormant ;
  • ajouté des tests de caractérisation sur ProjectionEngine, AsyncEventQueue et AsyncWorker ;
  • verrouillé l’absence d’entrypoint runtime live dans le manifest et les gates.

Note postérieure BC-066D

BC-066D tranche désormais explicitement la question laissée ouverte par A/B/C :

  • décision : KEEP_DORMANT
  • aucun besoin produit live prouvé
  • aucune activation runtime autorisée
  • réouverture uniquement via une nouvelle BC dédiée

Note postérieure BC-066E

BC-066E ferme désormais BC-066 :

  • certification finale globale obtenue ;
  • inventaire, décision et frontières alignés ;
  • dette restante bornée en P2 uniquement.

Portée auditée

  • src/Application/Catalog/CatalogIntelligenceEngine.php
  • src/Application/Projection/ProjectionEngine.php
  • src/Application/Realtime/Async/AsyncEventQueue.php
  • src/Application/Realtime/Async/AsyncWorker.php
  • src/Application/Realtime/RealtimeCatalogRebuilder.php

1. Inventaire CatalogIntelligenceEngine

Élément Valeur
FQCN CMonChoix\Application\Catalog\CatalogIntelligenceEngine
Namespace CMonChoix\Application\Catalog
Consumers RealtimeCatalogRebuilder en prod source, RealtimeOrchestrationBoundaryTest en test
Inputs string $productId, array $offers
Outputs void, mutation d’un CatalogItem avant save()
Reads CatalogRepositoryInterface::findById()
Writes CatalogRepositoryInterface::save()
Exceptions aucune capture locale ; les exceptions des dépendances remontent
Runtime entrypoint aucun entrypoint runtime live prouvé

Constructeur

  • PriceAggregationEngine
  • Platform\Application\Normalization\MerchantNormalizer
  • CMonChoix\Domain\Catalog\Repository\CatalogRepositoryInterface (legacy FQCN)

Méthodes publiques

  • __construct()
  • rebuild(string $productId, array $offers): void

2. Dépendances exactes

Dependency Layer Canonical/Legacy Injected/Newed Risk
PriceAggregationEngine Application Legacy injected prototype legacy maintenu
MerchantNormalizer Application Canonical injected faible
CMonChoix\Domain\Catalog\Repository\CatalogRepositoryInterface Domain Legacy injected FQCN legacy sans alias Composer
CatalogRankingEngine Application Legacy injected via RealtimeCatalogRebuilder chaîne ranking legacy maintenue
EventSubscriberRegistry Application Legacy injected via RealtimeCatalogRebuilder orchestration dormante

3. Graphe réel prouvé

Source Target Relation Prouvée
RealtimeCatalogRebuilder CatalogRankingEngine rank() oui
RealtimeCatalogRebuilder CatalogIntelligenceEngine rebuild() oui
CatalogIntelligenceEngine PriceAggregationEngine aggregate() oui
CatalogIntelligenceEngine MerchantNormalizer normalize() oui
CatalogIntelligenceEngine CatalogRepositoryInterface findById() + save() oui
ProjectionCatalogWiring ProjectionEngine internal new() oui
AsyncWorker AsyncEventQueue pop() oui
AsyncWorker RealtimeCatalogRebuilder process() / boot() oui
CatalogIntelligenceEngine ProjectionEngine appel direct non prouvé
plugin/runtime CatalogIntelligenceEngine import direct non prouvé

4. Consumers réels

Consumer Context Production Test-only
src/Application/Realtime/RealtimeCatalogRebuilder.php constructeur oui non
tests/Application/RealtimeOrchestrationBoundaryTest.php new CatalogIntelligenceEngine(...) non oui
tests/Application/ProjectionCatalogWiringCompatibilityTest.php ProjectionCatalogWiring::build() retourne ProjectionEngine non oui

Conclusion : la chaîne est câblée dans le code source applicatif, mais aucun entrypoint runtime live n’a été prouvé hors tests.

5. Reads / writes

Operation Read/Write Target Transaction Destructive
findById($productId) read repository de read-model catalogue aucune non
save($item) write repository de read-model catalogue aucune non
RealtimeCatalogRebuilder -> CatalogIntelligenceEngine::rebuild() indirect write repository via intelligence engine aucune non

Il n’y a ni SQL direct, ni $wpdb, ni hook WordPress, ni transport HTTP/CLI.

6. Règles métier réelles

Rule Input Output Side effect
aggregation de prix offers min, max, count, best aucune avant save
normalisation merchant merchant libre ou null libellé canonisé (amazon, fnac, etc.) stocké dans metadata['offers']
ranking préalable offers ordre décroissant par score effectué dans RealtimeCatalogRebuilder
short-circuit item absent findById() === null return aucun write

7. Dette legacy

Legacy dependency Replacement Active Priority
CMonChoix\Domain\Catalog\Repository\CatalogRepositoryInterface CMonChoix\Platform\Domain\Catalog\Repository\CatalogRepositoryInterface oui P2
PriceAggregationEngine pas encore extrait oui P2
CatalogRankingEngine pas encore extrait oui P2

Point important : contrairement à la compat Product, aucun alias Composer global n’a été trouvé pour CMonChoix\Domain\Catalog\Repository\CatalogRepositoryInterface. Les tests compensent localement avec class_alias(...).

8. Orchestration dormante

Component Entrypoint live Test-only Placeholder Activation risk
ProjectionEngine non prouvé oui oui faible tant qu’aucun runtime live n’est branché
AsyncEventQueue non prouvé oui oui moyen si quelqu’un l’utilise comme vraie queue
AsyncWorker non prouvé oui non moyen car il pourrait déclencher la chaîne si branché
RealtimeCatalogRebuilder non prouvé oui non moyen car il écrit indirectement via repository

Classification :

  • ProjectionEngine : placeholder
  • AsyncEventQueue : dormant + placeholder
  • AsyncWorker : dormant + future runtime candidate
  • RealtimeCatalogRebuilder : dormant + future runtime candidate

9. Entry point safety

Entrypoint type Component Present Authorized
WP hook ensemble audité non prouvé oui
cron ensemble audité non prouvé oui
CLI command ensemble audité non prouvé oui
HTTP endpoint ensemble audité non prouvé oui
worker loop live ensemble audité non prouvé oui
bootstrap include live ensemble audité non prouvé oui
admin action ensemble audité non prouvé oui
ProjectionCatalogWiring -> new ProjectionEngine() oui, interne oui oui

10. Performance

Flow Complexity Data size Risk
ranking + rebuild O(n log n) à cause du tri dans CatalogRankingEngine linéaire en nombre d’offres duplication mémoire des offres normalisées
CatalogIntelligenceEngine seul O(n) linéaire pas de cache, pas de batch, pas de memoization

BC-066A n’introduit aucune optimisation.

11. Tests existants

Test Component Behavior protected Gap
RealtimeOrchestrationBoundaryTest rebuilder/worker/intelligence boot idempotent, forwarding worker pas d’entrypoint live
ProjectionRealtimeBoundaryTest registry/wiring/worker types et wiring mécaniques pas de preuve runtime
EventPlatformRealtimeFinalCertificationTest reliquat BC-065 dette P2 bornée pas de focus CatalogIntelligence détaillé

12. Manifest et gates ajoutés

Ajoutés :

  • tests/Architecture/fixtures/bc066_catalog_intelligence_audit.php
  • tests/Architecture/CatalogIntelligenceInventoryTest.php
  • tests/Architecture/DormantOrchestrationInventoryTest.php
  • tests/Architecture/CatalogIntelligenceDependencyInventoryTest.php
  • tests/Architecture/CatalogIntelligenceEntrypointInventoryTest.php

But :

  • empêcher un nouveau couplage plugin/runtime ;
  • empêcher un nouvel entrypoint caché ;
  • empêcher un nouveau write direct non documenté ;
  • empêcher l’oubli de la dette legacy active.

13. Risques

  • activation ultérieure de la chaîne sans traiter le FQCN repository legacy ;
  • assimilation erronée de AsyncEventQueue à une vraie queue durable ;
  • réutilisation de ProjectionEngine placeholder comme moteur complet ;
  • confusion entre “câblé dans le code” et “branché en runtime”.

14. Découpage recommandé

  • BC-066B — CatalogIntelligence boundary / dependencies
  • BC-066C — Dormant Projection/Realtime rationalization
  • BC-066D — Activation decision or retirement
  • BC-066E — Final certification

Conclusion

  • BC-066A : fermable
  • aucun changement fonctionnel réalisé
  • aucune activation runtime réalisée
  • dette restante : P2 uniquement, désormais cartographiée plus finement