# Ingestion planifiée

# Ingestion planifiée

> _Dernière mise à jour : 2026-05-10_

## Pourquoi

- Lancer une grosse ingestion la nuit pour ne pas bouffer ton quota Claude pendant la journée
- Étaler 3 jeux à ingérer sans tous les lancer en parallèle
- Programmer une ingestion d'extension pour quand le jeu de base sera lui-même fini

## Comment

Dans le wizard `/add-game` étape 2, coche "Démarrer plus tard" et choisis une date/heure.

Contraintes : doit être dans le futur, max +7 jours.

## Que se passe-t-il en interne

1. Le PDF est uploadé sur disque immédiatement (`/app/pdfs/...`)
2. La ligne `games` est créée avec `ingestStatus='scheduled'` + `ingestScheduledAt`
3. Un `setTimeout` est armé dans `src/cron/ingest-scheduler.ts` pour déclencher `startIngestJob(gameId)` à l'heure prévue
4. Le PDF n'est PAS analysé tant que l'heure n'est pas atteinte

## Si tu redémarres le container avant l'heure

Au boot, `restoreScheduledOnBoot()` relit la BDD et re-programme tous les timers en attente. Si une date est déjà passée pendant le redémarrage, le job démarre immédiatement avec une grace de 1 seconde.

## Annuler une ingestion planifiée

`DELETE /api/games/:id/scheduled` (via `/admin` → Games → bouton Annuler) :

1. Clear le timer
2. Supprime le PDF du disque
3. Supprime la ligne SQLite

Renvoie 409 si le jeu est déjà passé en `running` ou `done`.

## Distinction reprise après quota

Le même mécanisme (`scheduleIngestStart`) est réutilisé pour la pause auto en cas de quota Claude. Côté UI, le motif est différencié (`reason: 'quota'` vs `'user'`) pour afficher la bonne copie. Pour l'utilisateur c'est transparent : laisse tourner, ça reprendra tout seul.