# Prompt 4: Auditoría de suscripciones, gasto hormiga y solapamientos

Este prompt no lleva ni un dato tuyo. Pégalo tal cual: lo que devuelve es un script,
y el script lo corres tú en tu máquina contra tus archivos.

---

Eres un programador Python senior. Ya tengo `movimientos_limpios.json` con los
movimientos clasificados (campos: `fecha`, `merchant_normalizado`, `descripcion_original`,
`importe`, `clase`, y opcionalmente `tarjeta`).

Necesito un script `auditar_suscripciones.py` que responda cinco preguntas que el total
mensual no responde. **Sin llamadas de red**: solo librería estándar (`json`, `csv`, `re`,
`datetime`, `collections`, `statistics`, `pathlib`). Si crees que necesitas algo más,
pregúntame antes en vez de importarlo.

## 1. Recurrencia por cadencia, no por lista de palabras

Una lista de keywords solo encuentra lo que ya está en la lista. Detecta recurrencia por
comportamiento:

- Agrupa por `merchant_normalizado`.
- Calcula los días entre cargos consecutivos.
- Es recurrente si hay 2 o más cargos y la **mediana** de esa diferencia cae cerca de un
  ciclo conocido: 7 ± 2 (semanal), 30 ± 6 (mensual), 90 ± 12 (trimestral), 365 ± 30 (anual).
- Usa mediana y no promedio: un cargo doble o un mes saltado tuerce el promedio y no la mediana.
- Guarda `cadencia_dias` y el ciclo detectado.

Trata la lista de keywords como señal secundaria, para marcar lo que la cadencia no
alcanzó a ver por falta de historia.

## 2. Costo anualizado

Para cada suscripción calcula `anualizado` proyectando su ciclo a 12 meses
(mensual × 12, trimestral × 4, semanal × 52, anual × 1). Usa el importe **más reciente**,
no el promedio: si subió de precio, lo que vas a pagar el año que viene es el nuevo.

## 3. Aumentos de precio silenciosos

Para cada merchant recurrente compara el primer importe con el último. Si la diferencia
supera 3 %, registra `primer_importe`, `ultimo_importe`, `subio_pct` y la fecha del
primer cargo con el importe nuevo.

Ignora variaciones por tipo de cambio si el cargo trae moneda extranjera; si no puedes
distinguirlo, márcalo como `posible_tipo_cambio: true` en vez de afirmar que subió.

## 4. Gasto hormiga

Aparte de las suscripciones, lista los comercios ordenados por **número de cargos**, no
por total. Para cada uno: `count`, `ticket_promedio`, `mensual` (normalizado a 30 días) y
`anualizado`. Deja los 10 primeros. Es el gasto que no se siente porque nunca es grande.

## 5. Solapamientos

Clasifica cada suscripción en un `grupo` por lo que hace, no por cómo se llama:
`video`, `musica`, `almacenamiento`, `ia`, `gimnasio`, `noticias`, `telecom`, `seguros`, `otros`.

Usa reglas explícitas y déjalas visibles al principio del script para que yo pueda
editarlas. Emite un renglón por cada grupo con **dos o más servicios**, con el total
mensual y anualizado del grupo.

No recomiendes cuál cancelar: solo enseña el grupo, los servicios y lo que suman. La
decisión no es del script.

## Salida

Escribe `auditoria.json` con las claves `suscripciones`, `hormiga` y `solapamientos`
según la estructura de la receta, e imprime en consola un resumen legible:

```
SUSCRIPCIONES  12 detectadas · 1,890/mes · 22,680/año
  ↑ 2 subieron de precio en el periodo
GASTO HORMIGA  top 3 por frecuencia: OXXO (21), UBER (14), STARBUCKS (11)
SOLAPAMIENTOS  video: 3 servicios · 447/mes
```

Al final, agrega un bloque `para_revisar` con las preguntas que el script **no** puede
responder y que dependen de mis contratos:

- ¿Mi plan de celular ya incluye alguno de estos servicios?
- ¿Mi tarjeta trae membresías o meses de cortesía que estoy pagando aparte?
- ¿Hay un paquete del mismo proveedor que cubra lo que compro suelto?
- ¿Alguno de estos me sale más barato en anual?

Que las imprima con la lista concreta de servicios detectados al lado, para que yo pueda
ir a preguntar con datos en la mano.
