Skip to main content

Ajouter un jeu

Ajouter un jeu

Dernière mise à jour : 2026-05-10

Réservé aux users avec canAddGames = true (admins par défaut, autres comptes : à toi de toggler dans /admin → Users).

Wizard /add-game (3 étapes)

Tu cherches le jeu sur BoardGameGeek (API XML v2). Tu sélectionnes le résultat → ses metadata (image, méchaniques, catégories, type) sont rapatriées et stockées dans la ligne games.

Si le jeu n'existe pas sur BGG (rare), tu peux skip cette étape et entrer le nom à la main.

Étape 2 — Upload PDF + métadonnées

  • Le PDF : drag & drop ou file picker. Stocké sur disque dans /app/pdfs/<slug>-<timestamp>.pdf, jamais dans git.
  • Type de contenu :
    • base : règles principales du jeu
    • extension : à rattacher à un parent existant (détection de conflits activée)
    • advanced_rules : variantes/modes avancés d'un parent
    • faq : FAQ officielle d'un parent
  • Langue des règles : fr ou en (impacte HyDE — le passage hypothétique sera généré dans la bonne langue + traduit côté backend).
  • Démarrer plus tard (optionnel) : champ datetime, max +7 jours. Cf. page suivante.

Étape 3 — Ingest ritual

Si tu démarres tout de suite, tu vois un suivi SSE en temps réel des actes :

  1. Lecture : pdfjs-dist extrait le texte
  2. Reconnaissance optique (OCR — uniquement si PDF scanné, auto-détecté)
  3. Découpage : chunking sémantique (paragraphes + overlap)
  4. Structuration : Claude analyse l'arbre chapitre/section/sous-section
  5. Analyse contextuelle : Claude génère 1-2 phrases de contexte par chunk (Contextual Retrieval B, 10 SSH parallèles, cache JSON)
  6. Compréhension : embeddings TEI bge-m3 (batch de 32)
  7. Archivage : push Qdrant
  8. Conflits (extensions seulement) : compare aux chunks du parent, détecte replaces/modifies/extends
  9. PNG : pdftoppm rend chaque page en image 300 DPI dans /app/pdfs/images/<slug>/page-XX.png

Durée typique : 5-15 min selon taille du PDF + utilisation Claude (quota).

Pause quota Claude

Si pendant l'ingestion le CLI Claude renvoie son message « Usage limit reached, reset at HH:MM », l'app :

  1. Flush les caches JSON (contextual-llm + conflict-detect)
  2. Passe la ligne en ingestStatus='scheduled' avec ingestScheduledAt = resetAt + 2 min
  3. Émet un event SSE quota_pause → l'UI affiche un panneau dédié
  4. Re-déclenche runIngestion automatiquement à l'heure de reset
  5. La reprise re-utilise les caches JSON → aucun chunk n'est retraité, zéro perte

Tu n'as rien à faire — laisse tourner.

Si l'ingestion plante

  • ingestStatus='error' en BDD
  • Logs serveur : tail -f /app/data/logs/server.log (docker exec boardgame-referee tail -f /app/data/logs/server.log)
  • Possible relancer en supprimant le jeu (/admin → Games → bouton Retirer) puis le re-uploadant