Mise en place de tests unitaires coté Python et Angular
Mise en place de la couverture de test directement dans le workflow : le programme ne build pas si jamais un test échoue
Passage en v0.16.2 en conséquence
Ajout du mock EnemyRepository manquant (dependance ajoutee au
constructeur lors du referencement des ennemis). Sans ce mock,
@InjectMocks injectait null -> NPE sur enemyRepository.findByCampaignId.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Dorénavant, l'IA est capable de prendre en compte le format des quêtes, chapitres, Arc.... pour proposer des blocs plus complets.
Les ennemis sont également référençables directement dans la campagne.
Les références vers les ennemis dans la partie "donjon" est en cours d'ajout
- ArcJpaEntity.type : columnDefinition VARCHAR(16) DEFAULT remplace par
length=16 + @ColumnDefault. Hibernate 6.6 recopiait la chaine brute dans son
ALTER SET DATA TYPE de migration (DDL invalide pour PostgreSQL, retente
a chaque demarrage).
- MinioConfig : la verification du bucket construisait le client via la
methode @Bean proxifiee depuis @PostConstruct, interdit par Spring 6.2
(Requested bean is currently in creation), le check ne tournait plus.
Fabrique privee directe partagee par le bean et la verification.
Verifie : 507 tests verts.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Recupere 3x top_k passages (max 24), fait noter leur pertinence par le LLM
en un appel (temperature 0, extraits tronques a 600 car.), garde les top_k
mieux notes (tri stable : a note egale l ordre cosinus est preserve).
Best-effort : echec LLM ou notes inexploitables -> classement cosinus.
Desactive par defaut (+1 appel avant le premier token) ; recommande avec
un provider cloud rapide via RAG_RERANK=true.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
A la premiere analyse d une source, chaque lot est resume (1 appel LLM,
cache disque, purge avec la source) et son resume embedde. Aux questions
suivantes, la question est comparee aux resumes et seuls les lots proches
du meilleur score (marge 0.10, plancher 3 lots) sont relus -> 3-5x moins
d appels sur un gros livre pour les questions ciblees. Selection
volontairement conservatrice ; best-effort (tout echec -> plein scan) ;
desactivable via DEEP_SUMMARY_FILTER=false (exhaustivite maximale).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Le Brain emet un evenement sources (source_id, page, score des passages
retenus) AVANT le premier token ; le Core le relaie tel quel (JSON brut) ;
l UI affiche une ligne discrete sous la reponse (ex: 12, 47, 103),
prefixee du nom de fichier si plusieurs sources. Transparence pour le MJ
et diagnostic immediat quand le RAG repond a cote.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Sur une relance conversationnelle (et ses faiblesses ?), l embedding du
dernier message seul ne contient pas le sujet -> retrieval aveugle. Un appel
LLM leger (temperature 0, uniquement a partir du 2e tour) resout les
references implicites depuis l historique ; la question autonome sert a la
RECHERCHE (chat RAG + phase MAP de l analyse approfondie), la reponse finale
voit toujours l historique complet. Best-effort : tout echec retombe sur la
question brute (comportement historique).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Brain : la phase MAP recense les PNJ NOMMES et creatures uniques (pas les
monstres generiques) avec une courte fiche fidele au livre ; dedoublonnage
inter-morceaux (description la plus complete gardee) ; payload done + npc_count.
Core : CampaignImportProposal.npcs + NpcProposal ; a l apply, creation comme
Npc de la campagne (description -> values[Description], meme convention que
les cartes d action des ateliers) avec anti-doublon par nom.
Web : section de revue PNJ a cases a cocher (coches par defaut, grises si
deja presents), compteurs de progression et recapitulatif mis a jour.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Apres la fusion des morceaux, un unique appel LLM sur le SQUELETTE de l arbre
(noms seuls, quasi gratuit) detecte les chapitres/scenes en double sous des
libelles legerement differents et les fusionne (contenus accumules, rooms
reunies). Consigne conservatrice (doute = pas de fusion) et best-effort
strict : toute erreur laisse l arbre tel quel, jamais d import perdu.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Une scene coupee entre deux morceaux perdait la moitie de ses gm_notes /
player_narration (la regle premier-non-vide-gagne jetait la suite). Les deux
champs sont desormais CONCATENES, avec dedoublonnage (overlap relu) et
remplacement si un morceau apporte une version plus complete.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Les morceaux/lots sont traites par vagues de llm_map_concurrency appels
simultanes (defaut 3, .env). L ordre narratif est preserve (fusion vague par
vague dans l ordre du livre), la resilience par morceau et les heartbeats SSE
sont conserves. Divise le temps d import d un gros livre par ~3 sur un
provider cloud ; sans effet sur Ollama local (qui sequence cote serveur).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Les bookmarks PDF (doc.get_toc, gratuits) sont injectes dans chaque prompt MAP
comme referentiel commun de nommage : les morceaux traites separement nomment
desormais les memes chapitres a l identique, et la fusion par nom du _TreeMerger
recolle les chapitres coupes au lieu de creer des doublons. Bornee (2 niveaux,
80 entrees) pour ne pas gonfler le prompt ; absente sur les scans -> inchange.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>