2026-08-07 — marvelousdb: dashboard de cobertura + boton de reporte de imagen

Contexto: el usuario pidio una metrica visible de imagenes cubiertas/por cubrir en la web, una comparativa por universo, y un boton para marcar un personaje como “no cubierto”.

Implementacion

  • API:
    • GET /api/stats: por universo (total/covered/missing/pct), totales, reported, y missingCharacters (ids sin imagen). isCovered(id, raw): reportado? no | cache local? si | thumbnail usable en BD? si.
    • POST /api/characters/:id/report y DELETE .../report: Set persistente en data/reported-images.json (sobrevive reinicios y vive en el volumen de Fly). charThumb ignora cache+DB url para reportados → placeholder.
  • Web: proxy /api ahora reenvia POST/DELETE (express.json). Ruta /coverage con barra general + barras comparativas por universo (estilo cameradecision) + listado de pendientes. Link “Coverage” en el nav.
  • Vista character: boton “Image missing or wrong — mark as uncovered” (fetch POST via proxy, feedback “Marked!…”).
  • cache-images.js: al arrancar poda del indice los ids reportados (se re-cachean); los reportados entran a la cola de faltantes aunque tengan thumbnail en BD; la pasada —wikia los excluye (no re-descargar lo reportado).

Verificacion

  • 26/26 tests (nuevos: stats coherentes, report re-queue + placeholder + stats + undo).
  • /coverage 200 con % por universo; POST report via proxy 200; unreport 200.
  • reported-images.json queda vacio tras los tests.

Pendiente (usuario)

  • Correr npm run cache:images -- --browserrun (o la pasada que prefiera) para llenar los ~420 faltantes; los reportados se re-cachean solos en la siguiente corrida.