Follow-ups from the review of #149 (closes #66):
- providers/aws/services/elasticache/client.go ~100: a reservation with a nil ProductDescription gets Engine "", so its dedupe key never matches and the check fails open. Log a warning, and treat an empty engine as matching any engine for the cache service (fail closed).
- AWS lets Redis OSS reserved nodes cover Valkey nodes. A manually bought Redis RI won't dedupe a 'valkey' recommendation. Normalize redis and valkey to one engine family for ElastiCache dedupe.
- Nit: memorydb/client_test.go claims to catch parser drift but hardcodes 'redis' instead of building the rec through parseMemoryDBDetails.
Follow-ups from the review of #149 (closes #66):