Printer normalization architecture¶
Printer normalization is generic product knowledge. The historical entry points remain ccx_norm_apply_printer_family_v1(), ccx_norm_apply_printer_enrichment_v1(), and ccx_norm_apply_printer_family_routing_v1().
The implementation now lives under norm/products/printer/:
10-family.php
20-enrichment.php
30-family-routing.php
90-compose.php
10-family.php owns printer versus printer-accessory classification and initial printer type. 20-enrichment.php owns printer-family, consumable-family, color, duplex, Wi-Fi, and paper-format enrichment. 30-family-routing.php owns the later routing pass driven by enriched printer and consumable families.
The former files 35-printer-family.php, 45-printer-enrichment.php, and 50-printer-family-routing.php are compatibility facades. They load products/printer/90-compose.php and contain no printer SQL.
This extraction is structural only. Existing orchestrator call sites and runtime ordering are intentionally preserved. Product-family recognition remains generic; source-feed-specific behavior belongs in merchant rule modules.
The boundary is characterized by tests/Runtime/PrinterProductBoundaryContractTest.php.