# Changelog of Truck1 Scraper — European Commercial Vehicles (`rastriq/truck1-scraper`) Actor

- **URL**: https://apify.com/rastriq/truck1-scraper/changelog.md
- **Full Actor documentation**: https://apify.com/rastriq/truck1-scraper.md

## Changelog

### 0.6.19 — pool de IPs por path + Retry-After (2026-10-08)

- Input oculto `proxyRotation` (default false) y `proxyCountries` (default \["DE"]). Con rotacion, cada path toma su propia sesion Decodo (pais x puerto, 60 min sticky); un 403/429/error de red enfria ese slot (Retry-After o 60 s) y cambia a otro; 8 intentos por pagina; cookies del path se limpian al cambiar de IP. Log `[proxy]` por path y resumen final.
- 403/429 respeta `Retry-After` (tope 60 s) tambien sin rotacion; sin cabecera, backoff de 0.6.18.

### Unreleased — convención tiempo_uso

- `tiempo_uso` (ftp28) = horas; si no hay, km (formato numérico bare, p. ej. "422193"). Nuevas `ext_tiempo_uso_unidad` (h|km|null) y `ext_tiempo_uso_calidad` (horas_igual_km|cero|null). Preloaded deriva de lo almacenado (`_apply_uso`, idempotente). English: `hours` sin cambios (solo horas); unidad/calidad null si `hours` es null. Declaradas en dataset_schema.

### 0.6.16 — checkpoint por mes/path + push por página

- Checkpoint `CHECKPOINT_{YYYY-MM}_{path}` (store `truck1-checkpoints`, módulo `rastriq_ckpt`), solo modo admin; `done` únicamente con fin natural. Sustituye al checkpoint sin mes que se borraba al terminar.
- `scrape_category` entrega la página completa y comunica el fin (`natural_end` / `incomplete` + motivo); 5×403/429, ALTCHA, red, 404 en p1, p1 con HTML pequeño y `max_pages` ya no cuentan como fin. Página k>1 vacía: 1 reintento y `pending_end`.
- Escritura por página (lista) con 3 intentos; ids reservados bajo lock y liberados si el push falla; el checkpoint avanza solo tras el push. Se elimina `push_item`.
- Plan de paths persistido por categoría (`PLAN_{mes}_{cat}`); input oculto `forceRestart`.
- IDs existentes solo por campos de id; 3 fallos → `RuntimeError` antes de escribir.
- `_snapshot_dataset_name` debe empezar por `zz-` (si no, `Actor.fail`); dataset resuelto por id.
- Resumen `[ckpt] RESUMEN x/y paths INCOMPLETOS`; SUMMARY añade `incomplete_paths` y `skipped_done`.
