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
CatalogItemreadonly, 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,AsyncEventQueueetAsyncWorker; - 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.phpsrc/Application/Projection/ProjectionEngine.phpsrc/Application/Realtime/Async/AsyncEventQueue.phpsrc/Application/Realtime/Async/AsyncWorker.phpsrc/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¶
PriceAggregationEnginePlatform\Application\Normalization\MerchantNormalizerCMonChoix\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: placeholderAsyncEventQueue: dormant + placeholderAsyncWorker: dormant + future runtime candidateRealtimeCatalogRebuilder: 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.phptests/Architecture/CatalogIntelligenceInventoryTest.phptests/Architecture/DormantOrchestrationInventoryTest.phptests/Architecture/CatalogIntelligenceDependencyInventoryTest.phptests/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
ProjectionEngineplaceholder 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