diff --git a/ConfluentTranslator/STRUCTURE.md b/ConfluentTranslator/STRUCTURE.md
new file mode 100644
index 0000000..ba753d4
--- /dev/null
+++ b/ConfluentTranslator/STRUCTURE.md
@@ -0,0 +1,187 @@
+# Structure du projet ConfluentTranslator
+
+Ce document décrit l'organisation du projet après la réorganisation.
+
+## Arborescence
+
+```
+ConfluentTranslator/
+├── server.js # Point d'entrée principal (lance src/api/server.js)
+├── package.json # Dépendances et scripts npm
+├── .env / .env.example # Configuration environnement
+├── README.md # Documentation utilisateur
+│
+├── src/ # Code source organisé
+│ ├── api/ # Serveur et routes HTTP
+│ │ ├── server.js # Serveur Express principal
+│ │ └── adminRoutes.js # Routes d'administration
+│ ├── core/ # Logique métier
+│ │ ├── translation/ # Modules de traduction
+│ │ │ ├── confluentToFrench.js # Traduction Confluent → FR
+│ │ │ ├── contextAnalyzer.js # Analyse contextuelle
+│ │ │ └── promptBuilder.js # Construction des prompts LLM
+│ │ ├── morphology/ # Morphologie et décomposition
+│ │ │ ├── morphologicalDecomposer.js # Décomposition morphologique
+│ │ │ ├── radicalMatcher.js # Recherche par radicaux
+│ │ │ └── reverseIndexBuilder.js # Construction d'index inversés
+│ │ └── numbers/ # Traitement des nombres
+│ │ ├── numberConverter.js # Conversion FR → Confluent
+│ │ └── numberPreprocessor.js # Prétraitement des nombres
+│ └── utils/ # Utilitaires
+│ ├── auth.js # Authentification et tokens
+│ ├── lexiqueLoader.js # Chargement des lexiques
+│ ├── logger.js # Système de logs
+│ └── rateLimiter.js # Rate limiting
+│
+├── docs/ # Documentation
+│ ├── admin/ # Documentation admin
+│ │ ├── ADMIN_GUIDE.md
+│ │ └── QUICKSTART_ADMIN.md
+│ ├── security/ # Documentation sécurité
+│ │ ├── README_SECURITY.md
+│ │ ├── SECURITY_TEST.md
+│ │ └── CHANGELOG_SECURITY.md
+│ ├── dev/ # Documentation développeur
+│ │ ├── analysis/ # Analyses techniques
+│ │ │ └── ANALYSE_MOTS_PROBLEMATIQUES.md
+│ │ └── numbers/ # Documentation nombres
+│ │ └── NUMBER_PREPROCESSING.md
+│ └── changelog/ # Historique et résultats
+│ ├── COMMIT_SUMMARY.md
+│ ├── TESTS_SUMMARY.md
+│ ├── TESTS_NOMBRES_RESULTAT.md
+│ └── test-results-radical-system.md
+│
+├── tests/ # Tests
+│ ├── unit/ # Tests unitaires (.js, .json, .txt)
+│ ├── integration/ # Tests d'intégration
+│ │ └── api/ # Tests API (ex: testsAPI/)
+│ └── scripts/ # Scripts de test (.sh, .bat)
+│
+├── data/ # Données du projet
+│ ├── lexique.json # Lexique principal
+│ ├── tokens.json # Tokens d'authentification
+│ └── (autres fichiers JSON de lexique)
+│
+├── prompts/ # Prompts système pour LLM
+│ ├── proto-system.txt
+│ └── ancien-system.txt
+│
+├── public/ # Fichiers statiques
+│ ├── index.html
+│ ├── admin.html
+│ └── (autres fichiers statiques)
+│
+├── logs/ # Logs applicatifs
+│ └── (fichiers de logs générés)
+│
+├── plans/ # Plans et documentation de travail
+│ └── (documents de planification)
+│
+└── node_modules/ # Dépendances npm (généré)
+```
+
+## Principes d'organisation
+
+### src/ - Code source
+
+Le dossier `src/` contient tout le code applicatif organisé par fonction :
+
+- **api/** : Tout ce qui concerne le serveur HTTP et les routes
+- **core/** : La logique métier, subdivisée par domaine
+ - `translation/` : Traduction et analyse linguistique
+ - `morphology/` : Analyse morphologique des mots
+ - `numbers/` : Gestion spécifique des nombres
+- **utils/** : Fonctions utilitaires transverses
+
+### docs/ - Documentation
+
+Documentation organisée par audience et type :
+
+- **admin/** : Guides pour les administrateurs
+- **security/** : Documentation sécurité
+- **dev/** : Documentation technique pour développeurs
+- **changelog/** : Historique des changements et résultats de tests
+
+### tests/ - Tests
+
+Tests organisés par type :
+
+- **unit/** : Tests unitaires des modules individuels
+- **integration/** : Tests d'intégration entre modules
+- **scripts/** : Scripts shell/batch pour lancer les tests
+
+## Imports et chemins
+
+### Depuis src/api/ (server.js, adminRoutes.js)
+
+```javascript
+// Utilitaires
+require('../utils/auth')
+require('../utils/logger')
+require('../utils/lexiqueLoader')
+require('../utils/rateLimiter')
+
+// Translation
+require('../core/translation/contextAnalyzer')
+require('../core/translation/promptBuilder')
+require('../core/translation/confluentToFrench')
+
+// Morphology
+require('../core/morphology/reverseIndexBuilder')
+
+// Chemins vers ressources
+path.join(__dirname, '..', '..', 'public')
+path.join(__dirname, '..', '..', 'prompts')
+path.join(__dirname, '..', '..', 'data')
+```
+
+### Depuis src/core/translation/
+
+```javascript
+// Vers numbers
+require('../numbers/numberConverter')
+require('../numbers/numberPreprocessor')
+
+// Vers morphology
+require('../morphology/radicalMatcher')
+require('../morphology/morphologicalDecomposer')
+```
+
+### Depuis src/core/morphology/ ou src/core/numbers/
+
+```javascript
+// Vers data
+require('../../data/lexique.json')
+```
+
+## Démarrage
+
+Le point d'entrée est `server.js` à la racine qui importe `src/api/server.js` :
+
+```bash
+node server.js
+```
+
+ou
+
+```bash
+npm start
+```
+
+## Migrations futures
+
+Si nécessaire, cette structure permet facilement :
+
+- D'ajouter de nouveaux modules dans `src/core/`
+- De créer des sous-modules dans `src/api/` (ex: routes métier)
+- D'ajouter des catégories de tests
+- D'organiser la documentation par projets
+
+## Avantages
+
+- **Clarté** : Chaque fichier a sa place logique
+- **Maintenabilité** : Structure modulaire et organisée
+- **Scalabilité** : Facile d'ajouter de nouveaux modules
+- **Découvrabilité** : On trouve rapidement ce qu'on cherche
+- **Séparation des préoccupations** : Code / Docs / Tests séparés
diff --git a/ConfluentTranslator/data/tokens.json b/ConfluentTranslator/data/tokens.json
index 8f1c36e..95b245c 100644
--- a/ConfluentTranslator/data/tokens.json
+++ b/ConfluentTranslator/data/tokens.json
@@ -6,9 +6,7 @@
"apiKey": "d9be0765-c454-47e9-883c-bcd93dd19eae",
"createdAt": "2025-12-02T06:57:35.077Z",
"active": true,
- "requestsToday": 35,
- "dailyLimit": -1,
- "lastUsed": "2025-12-02T08:02:37.203Z",
+ "lastUsed": "2025-12-02T12:54:49.316Z",
"llmTokens": {
"totalInput": 0,
"totalOutput": 0,
@@ -28,19 +26,17 @@
"apiKey": "008d38c2-e6ed-4852-9b8b-a433e197719a",
"createdAt": "2025-12-02T07:06:17.791Z",
"active": true,
- "requestsToday": 100,
- "dailyLimit": 100,
- "lastUsed": "2025-12-02T08:09:45.029Z",
+ "lastUsed": "2025-12-02T12:51:17.345Z",
"llmTokens": {
- "totalInput": 0,
- "totalOutput": 0,
+ "totalInput": 40852,
+ "totalOutput": 596,
"today": {
- "input": 0,
- "output": 0,
+ "input": 40852,
+ "output": 596,
"date": "2025-12-02"
}
},
- "llmRequestsToday": 0,
+ "llmRequestsToday": 20,
"llmDailyLimit": 20
}
}
\ No newline at end of file
diff --git a/ConfluentTranslator/ADMIN_GUIDE.md b/ConfluentTranslator/docs/admin/ADMIN_GUIDE.md
similarity index 100%
rename from ConfluentTranslator/ADMIN_GUIDE.md
rename to ConfluentTranslator/docs/admin/ADMIN_GUIDE.md
diff --git a/ConfluentTranslator/QUICKSTART_ADMIN.md b/ConfluentTranslator/docs/admin/QUICKSTART_ADMIN.md
similarity index 100%
rename from ConfluentTranslator/QUICKSTART_ADMIN.md
rename to ConfluentTranslator/docs/admin/QUICKSTART_ADMIN.md
diff --git a/ConfluentTranslator/COMMIT_SUMMARY.md b/ConfluentTranslator/docs/changelog/COMMIT_SUMMARY.md
similarity index 100%
rename from ConfluentTranslator/COMMIT_SUMMARY.md
rename to ConfluentTranslator/docs/changelog/COMMIT_SUMMARY.md
diff --git a/ConfluentTranslator/TESTS_NOMBRES_RESULTAT.md b/ConfluentTranslator/docs/changelog/TESTS_NOMBRES_RESULTAT.md
similarity index 100%
rename from ConfluentTranslator/TESTS_NOMBRES_RESULTAT.md
rename to ConfluentTranslator/docs/changelog/TESTS_NOMBRES_RESULTAT.md
diff --git a/ConfluentTranslator/TESTS_SUMMARY.md b/ConfluentTranslator/docs/changelog/TESTS_SUMMARY.md
similarity index 100%
rename from ConfluentTranslator/TESTS_SUMMARY.md
rename to ConfluentTranslator/docs/changelog/TESTS_SUMMARY.md
diff --git a/ConfluentTranslator/test-results-radical-system.md b/ConfluentTranslator/docs/changelog/test-results-radical-system.md
similarity index 100%
rename from ConfluentTranslator/test-results-radical-system.md
rename to ConfluentTranslator/docs/changelog/test-results-radical-system.md
diff --git a/ConfluentTranslator/ANALYSE_MOTS_PROBLEMATIQUES.md b/ConfluentTranslator/docs/dev/analysis/ANALYSE_MOTS_PROBLEMATIQUES.md
similarity index 100%
rename from ConfluentTranslator/ANALYSE_MOTS_PROBLEMATIQUES.md
rename to ConfluentTranslator/docs/dev/analysis/ANALYSE_MOTS_PROBLEMATIQUES.md
diff --git a/ConfluentTranslator/NUMBER_PREPROCESSING.md b/ConfluentTranslator/docs/dev/numbers/NUMBER_PREPROCESSING.md
similarity index 100%
rename from ConfluentTranslator/NUMBER_PREPROCESSING.md
rename to ConfluentTranslator/docs/dev/numbers/NUMBER_PREPROCESSING.md
diff --git a/ConfluentTranslator/CHANGELOG_SECURITY.md b/ConfluentTranslator/docs/security/CHANGELOG_SECURITY.md
similarity index 100%
rename from ConfluentTranslator/CHANGELOG_SECURITY.md
rename to ConfluentTranslator/docs/security/CHANGELOG_SECURITY.md
diff --git a/ConfluentTranslator/README_SECURITY.md b/ConfluentTranslator/docs/security/README_SECURITY.md
similarity index 100%
rename from ConfluentTranslator/README_SECURITY.md
rename to ConfluentTranslator/docs/security/README_SECURITY.md
diff --git a/ConfluentTranslator/SECURITY_TEST.md b/ConfluentTranslator/docs/security/SECURITY_TEST.md
similarity index 100%
rename from ConfluentTranslator/SECURITY_TEST.md
rename to ConfluentTranslator/docs/security/SECURITY_TEST.md
diff --git a/ConfluentTranslator/public/index.html b/ConfluentTranslator/public/index.html
index 5cca0e2..079e8b1 100644
--- a/ConfluentTranslator/public/index.html
+++ b/ConfluentTranslator/public/index.html
@@ -536,7 +536,7 @@
border-radius: 6px;
display: none;
">
- Requêtes LLM: 20/20
+ Requêtes LLM: 0/20
@@ -810,24 +810,6 @@
- 🔑 API Keys (optionnel)
-
-
-
-
-
- Laisser vide pour utiliser la clé du serveur
-
-
-
-
-
-
-
- Laisser vide pour utiliser la clé du serveur
-
-
-
✓ Paramètres sauvegardés !
@@ -885,8 +867,8 @@
// User with limited requests
counter.style.display = 'block';
const limit = data.limit || 20;
- const remaining = data.remaining !== undefined ? data.remaining : (limit - (data.used || 0));
- text.textContent = `Requêtes LLM restantes: ${remaining}/${limit}`;
+ const used = data.used || 0;
+ text.textContent = `Requêtes LLM: ${used}/${limit}`;
}
} catch (error) {
console.error('Error loading LLM limit:', error);
@@ -951,9 +933,6 @@
login();
}
});
-
- // Note: LLM limit counter is updated after each translation
- // No need for automatic polling every few seconds
});
// Authenticated fetch wrapper with auto-logout on 401/403
@@ -1195,8 +1174,6 @@
document.getElementById('temp-value').textContent = settings.temperature;
document.getElementById('settings-theme').value = settings.theme;
document.getElementById('settings-verbose').checked = settings.verbose;
- document.getElementById('settings-anthropic-key').value = settings.anthropicKey;
- document.getElementById('settings-openai-key').value = settings.openaiKey;
// Apply theme
applyTheme(settings.theme);
@@ -1208,14 +1185,18 @@
};
const saveSettings = () => {
+ // Load existing settings to preserve API keys
+ const existingSettings = JSON.parse(localStorage.getItem('confluentSettings') || '{}');
+
const settings = {
provider: document.getElementById('settings-provider').value,
model: document.getElementById('settings-model').value,
temperature: parseFloat(document.getElementById('settings-temperature').value),
theme: document.getElementById('settings-theme').value,
verbose: document.getElementById('settings-verbose').checked,
- anthropicKey: document.getElementById('settings-anthropic-key').value,
- openaiKey: document.getElementById('settings-openai-key').value
+ // Preserve API keys from localStorage
+ anthropicKey: existingSettings.anthropicKey || '',
+ openaiKey: existingSettings.openaiKey || ''
};
localStorage.setItem('confluentSettings', JSON.stringify(settings));
diff --git a/ConfluentTranslator/server.js b/ConfluentTranslator/server.js
index 4e2b854..7e37497 100644
--- a/ConfluentTranslator/server.js
+++ b/ConfluentTranslator/server.js
@@ -1,872 +1,3 @@
-require('dotenv').config();
-const express = require('express');
-const path = require('path');
-const fs = require('fs');
-const { Anthropic } = require('@anthropic-ai/sdk');
-const OpenAI = require('openai');
-const {
- loadAllLexiques,
- searchLexique,
- generateLexiqueSummary,
- buildReverseIndex
-} = require('./lexiqueLoader');
-const { analyzeContext } = require('./contextAnalyzer');
-const { buildContextualPrompt, getBasePrompt, getPromptStats } = require('./promptBuilder');
-const { buildReverseIndex: buildConfluentIndex } = require('./reverseIndexBuilder');
-const { translateConfluentToFrench, translateConfluentDetailed } = require('./confluentToFrench');
-
-// Security modules
-const { authenticate, requireAdmin, createToken, listTokens, disableToken, enableToken, deleteToken, getGlobalStats, trackLLMUsage, checkLLMLimit } = require('./auth');
-const { adminLimiter } = require('./rateLimiter');
-const { requestLogger, getLogs, getLogStats } = require('./logger');
-
-const app = express();
-const PORT = process.env.PORT || 3000;
-
-// Middlewares
-app.use(express.json());
-app.use(requestLogger); // Log toutes les requêtes
-// Rate limiting: on utilise uniquement checkLLMLimit() par API key, pas de rate limit global par IP
-
-// Route protégée pour admin.html (AVANT express.static)
-// Vérifie l'auth seulement si API key présente, sinon laisse passer (le JS client vérifiera)
-app.get('/admin.html', (req, res, next) => {
- const apiKey = req.headers['x-api-key'] || req.query.apiKey;
-
- // Si pas d'API key, c'est une requête browser normale -> laisser passer
- if (!apiKey) {
- return res.sendFile(path.join(__dirname, 'public', 'admin.html'));
- }
-
- // Si API key présente, vérifier qu'elle est admin
- authenticate(req, res, (authErr) => {
- if (authErr) return next(authErr);
- requireAdmin(req, res, (adminErr) => {
- if (adminErr) return next(adminErr);
- res.sendFile(path.join(__dirname, 'public', 'admin.html'));
- });
- });
-});
-
-app.use(express.static('public'));
-
-// Load prompts
-const protoPrompt = fs.readFileSync(path.join(__dirname, 'prompts', 'proto-system.txt'), 'utf-8');
-const ancienPrompt = fs.readFileSync(path.join(__dirname, 'prompts', 'ancien-system.txt'), 'utf-8');
-
-// Load lexiques dynamically from JSON files
-const baseDir = path.join(__dirname, '..');
-let lexiques = { proto: null, ancien: null };
-let reverseIndexes = { proto: null, ancien: null };
-let confluentIndexes = { proto: null, ancien: null };
-
-function reloadLexiques() {
- console.log('Loading lexiques...');
- lexiques = loadAllLexiques(baseDir);
- reverseIndexes = {
- proto: buildReverseIndex(lexiques.proto),
- ancien: buildReverseIndex(lexiques.ancien)
- };
- confluentIndexes = {
- proto: buildConfluentIndex(lexiques.proto),
- ancien: buildConfluentIndex(lexiques.ancien)
- };
- console.log('Lexiques loaded successfully');
- console.log(`Confluent→FR index: ${Object.keys(confluentIndexes.ancien || {}).length} entries`);
-}
-
-// Initial load
-reloadLexiques();
-
-// Health check endpoint (public - for login validation)
-app.get('/api/health', (req, res) => {
- res.json({
- status: 'ok',
- timestamp: new Date().toISOString(),
- version: '1.0.0'
- });
-});
-
-// Auth validation endpoint (tests API key without exposing data)
-app.get('/api/validate', authenticate, (req, res) => {
- res.json({
- valid: true,
- user: req.user?.name || 'anonymous',
- role: req.user?.role || 'user'
- });
-});
-
-// LLM limit check endpoint - Always returns 200 with info
-app.get('/api/llm/limit', authenticate, (req, res) => {
- const apiKey = req.headers['x-api-key'] || req.query.apiKey;
- const limitCheck = checkLLMLimit(apiKey);
-
- console.log('[/api/llm/limit] Check result:', limitCheck); // Debug
-
- // TOUJOURS retourner 200 avec les données
- // Cet endpoint ne bloque jamais, il informe seulement
- res.status(200).json(limitCheck);
-});
-
-// Legacy lexique endpoint (for backward compatibility) - SECURED
-app.get('/lexique', authenticate, (req, res) => {
- // Return ancien-confluent by default (legacy behavior)
- if (!lexiques.ancien) {
- return res.status(500).json({ error: 'Lexique not loaded' });
- }
- res.json(lexiques.ancien);
-});
-
-// New lexique endpoints - SECURED
-app.get('/api/lexique/:variant', authenticate, (req, res) => {
- const { variant } = req.params;
-
- if (variant !== 'proto' && variant !== 'ancien') {
- return res.status(400).json({ error: 'Invalid variant. Use "proto" or "ancien"' });
- }
-
- if (!lexiques[variant]) {
- return res.status(500).json({ error: `Lexique ${variant} not loaded` });
- }
-
- res.json(lexiques[variant]);
-});
-
-// Stats endpoint - SECURED
-app.get('/api/stats', authenticate, (req, res) => {
- const { variant = 'ancien' } = req.query;
-
- if (variant !== 'proto' && variant !== 'ancien') {
- return res.status(400).json({ error: 'Invalid variant. Use "proto" or "ancien"' });
- }
-
- if (!lexiques[variant]) {
- return res.status(500).json({ error: `Lexique ${variant} not loaded` });
- }
-
- const lexique = lexiques[variant];
- const stats = {
- motsCF: 0, // Mots Confluent uniques
- motsFR: 0, // Mots français uniques
- totalTraductions: 0, // Total de traductions
- racines: 0, // Racines (racine, racine_sacree)
- racinesSacrees: 0, // Racines sacrées
- racinesStandards: 0, // Racines standards
- compositions: 0, // Compositions
- verbes: 0, // Verbes
- verbesIrreguliers: 0, // Verbes irréguliers
- particules: 0, // Particules grammaticales (negation, particule, interrogation, demonstratif)
- nomsPropes: 0, // Noms propres
- marqueurs: 0, // Marqueurs (temps, aspect, nombre)
- pronoms: 0, // Pronoms (pronom, possessif, relatif, determinant)
- autres: 0 // Autres types (auxiliaire, quantificateur, etc.)
- };
-
- const motsCFSet = new Set();
- const motsFRSet = new Set();
-
- // Le lexique peut avoir une structure {dictionnaire: {...}} ou être directement un objet
- const dict = lexique.dictionnaire || lexique;
-
- // Parcourir le dictionnaire
- Object.keys(dict).forEach(motFR => {
- const entry = dict[motFR];
- motsFRSet.add(motFR);
-
- if (entry.traductions) {
- entry.traductions.forEach(trad => {
- stats.totalTraductions++;
-
- // Compter les mots CF uniques
- if (trad.confluent) {
- motsCFSet.add(trad.confluent);
- }
-
- // Compter par type
- const type = trad.type || '';
- if (type === 'racine') {
- stats.racines++;
- stats.racinesStandards++;
- } else if (type === 'racine_sacree') {
- stats.racines++;
- stats.racinesSacrees++;
- } else if (type === 'composition' || type === 'racine_sacree_composee') {
- stats.compositions++;
- } else if (type === 'verbe') {
- stats.verbes++;
- } else if (type === 'verbe_irregulier') {
- stats.verbes++;
- stats.verbesIrreguliers++;
- } else if (type === 'negation' || type === 'particule' || type === 'interrogation' || type === 'demonstratif') {
- stats.particules++;
- } else if (type === 'nom_propre') {
- stats.nomsPropes++;
- } else if (type === 'marqueur_temps' || type === 'marqueur_aspect' || type === 'marqueur_nombre') {
- stats.marqueurs++;
- } else if (type === 'pronom' || type === 'possessif' || type === 'relatif' || type === 'determinant') {
- stats.pronoms++;
- } else if (type !== '') {
- stats.autres++;
- }
- });
- }
- });
-
- stats.motsCF = motsCFSet.size;
- stats.motsFR = motsFRSet.size;
-
- res.json(stats);
-});
-
-// Search endpoint - SECURED
-app.get('/api/search', authenticate, (req, res) => {
- const { q, variant = 'ancien', direction = 'fr2conf' } = req.query;
-
- if (!q) {
- return res.status(400).json({ error: 'Missing query parameter "q"' });
- }
-
- if (variant !== 'proto' && variant !== 'ancien') {
- return res.status(400).json({ error: 'Invalid variant. Use "proto" or "ancien"' });
- }
-
- const results = searchLexique(lexiques[variant], q, direction);
- res.json({ query: q, variant, direction, results });
-});
-
-// Reload endpoint (for development) - SECURED (admin only)
-app.post('/api/reload', authenticate, requireAdmin, (req, res) => {
- try {
- reloadLexiques();
- res.json({
- success: true,
- message: 'Lexiques reloaded',
- stats: {
- proto: lexiques.proto?.meta?.total_entries || 0,
- ancien: lexiques.ancien?.meta?.total_entries || 0
- }
- });
- } catch (error) {
- res.status(500).json({ error: error.message });
- }
-});
-
-// Build enhanced prompt with lexique data
-function buildEnhancedPrompt(basePrompt, variant) {
- const lexique = lexiques[variant];
- if (!lexique) return basePrompt;
-
- const summary = generateLexiqueSummary(lexique, 300);
-
- return `${basePrompt}
-
-# LEXIQUE COMPLET (${lexique.meta.total_entries} entrées)
-${summary}
-`;
-}
-
-// Debug endpoint: Generate prompt without calling LLM - SECURED
-app.post('/api/debug/prompt', authenticate, (req, res) => {
- const { text, target = 'ancien', useLexique = true } = req.body;
-
- if (!text) {
- return res.status(400).json({ error: 'Missing parameter: text' });
- }
-
- const variant = target === 'proto' ? 'proto' : 'ancien';
-
- try {
- let systemPrompt;
- let contextMetadata = null;
-
- // MÊME CODE QUE /translate
- if (useLexique) {
- const contextResult = analyzeContext(text, lexiques[variant]);
- systemPrompt = buildContextualPrompt(contextResult, variant, text);
-
- const promptStats = getPromptStats(systemPrompt, contextResult);
- contextMetadata = {
- wordsFound: contextResult.metadata.wordsFound,
- wordsNotFound: contextResult.metadata.wordsNotFound,
- entriesUsed: contextResult.metadata.entriesUsed,
- totalLexiqueSize: contextResult.metadata.totalLexiqueSize,
- tokensFullLexique: promptStats.fullLexiqueTokens,
- tokensUsed: promptStats.promptTokens,
- tokensSaved: promptStats.tokensSaved,
- savingsPercent: promptStats.savingsPercent,
- useFallback: contextResult.useFallback,
- expansionLevel: contextResult.metadata.expansionLevel
- };
- } else {
- systemPrompt = getBasePrompt(variant);
- }
-
- res.json({
- prompt: systemPrompt,
- metadata: contextMetadata,
- stats: {
- promptLength: systemPrompt.length,
- promptLines: systemPrompt.split('\n').length
- }
- });
-
- } catch (error) {
- console.error('Prompt generation error:', error);
- res.status(500).json({ error: error.message });
- }
-});
-
-// Coverage analysis endpoint (analyze French text before translation) - SECURED
-app.post('/api/analyze/coverage', authenticate, (req, res) => {
- const { text, target = 'ancien' } = req.body;
-
- if (!text) {
- return res.status(400).json({ error: 'Missing parameter: text' });
- }
-
- const variant = target === 'proto' ? 'proto' : 'ancien';
-
- try {
- // Use the same contextAnalyzer as the translation pipeline
- const contextResult = analyzeContext(text, lexiques[variant]);
- const metadata = contextResult.metadata;
-
- // Calculate recommendation
- const needsFullRoots = metadata.coveragePercent < 90;
- let recommendation;
- if (metadata.coveragePercent >= 95) {
- recommendation = 'Excellent coverage - context only';
- } else if (metadata.coveragePercent >= 90) {
- recommendation = 'Good coverage - context only';
- } else if (metadata.coveragePercent >= 70) {
- recommendation = 'Moderate coverage - consider adding roots';
- } else if (metadata.coveragePercent >= 50) {
- recommendation = 'Low coverage - full roots recommended';
- } else {
- recommendation = 'Very low coverage - full roots required';
- }
-
- res.json({
- coverage: metadata.coveragePercent,
- found: metadata.wordsFound.map(w => ({
- word: w.input,
- confluent: w.confluent,
- type: w.type,
- score: w.score
- })),
- missing: metadata.wordsNotFound.map(word => ({
- word,
- suggestions: [] // TODO: add suggestions based on similar words
- })),
- stats: {
- totalWords: metadata.wordCount,
- uniqueWords: metadata.uniqueWordCount,
- foundCount: metadata.wordsFound.length,
- missingCount: metadata.wordsNotFound.length,
- entriesUsed: metadata.entriesUsed,
- useFallback: metadata.useFallback
- },
- needsFullRoots,
- recommendation,
- variant
- });
-
- } catch (error) {
- console.error('Coverage analysis error:', error);
- res.status(500).json({ error: error.message });
- }
-});
-
-// Translation endpoint (NOUVEAU SYSTÈME CONTEXTUEL)
-app.post('/translate', authenticate, async (req, res) => {
- const { text, target, provider, model, temperature = 1.0, useLexique = true, customAnthropicKey, customOpenAIKey } = req.body;
-
- if (!text || !target || !provider || !model) {
- return res.status(400).json({ error: 'Missing parameters' });
- }
-
- // Check for custom API keys
- const usingCustomKey = !!(customAnthropicKey || customOpenAIKey);
-
- // Only check rate limit if NOT using custom keys
- if (!usingCustomKey) {
- const apiKey = req.headers['x-api-key'] || req.query.apiKey;
- const limitCheck = checkLLMLimit(apiKey);
- if (!limitCheck.allowed) {
- return res.status(429).json({
- error: limitCheck.error,
- limit: limitCheck.limit,
- used: limitCheck.used
- });
- }
- }
-
- const variant = target === 'proto' ? 'proto' : 'ancien';
-
- try {
- let systemPrompt;
- let contextMetadata = null;
-
- // NOUVEAU: Analyse contextuelle et génération de prompt optimisé
- if (useLexique) {
- const contextResult = analyzeContext(text, lexiques[variant]);
- systemPrompt = buildContextualPrompt(contextResult, variant, text);
-
- // Générer métadonnées pour Layer 2
- const promptStats = getPromptStats(systemPrompt, contextResult);
- contextMetadata = {
- wordsFound: contextResult.metadata.wordsFound,
- wordsNotFound: contextResult.metadata.wordsNotFound,
- entriesUsed: contextResult.metadata.entriesUsed,
- totalLexiqueSize: contextResult.metadata.totalLexiqueSize,
- tokensFullLexique: promptStats.fullLexiqueTokens,
- tokensUsed: promptStats.promptTokens,
- tokensSaved: promptStats.tokensSaved,
- savingsPercent: promptStats.savingsPercent,
- useFallback: contextResult.useFallback,
- expansionLevel: contextResult.metadata.expansionLevel,
- rootsUsed: contextResult.rootsFallback?.length || 0 // Nombre de racines envoyées
- };
- } else {
- systemPrompt = getBasePrompt(variant);
- }
-
- let translation;
- let rawResponse;
-
- if (provider === 'anthropic') {
- const anthropic = new Anthropic({
- apiKey: customAnthropicKey || process.env.ANTHROPIC_API_KEY,
- });
-
- const message = await anthropic.messages.create({
- model: model,
- max_tokens: 8192, // Max pour Claude Sonnet/Haiku 4.5
- temperature: temperature / 2, // Diviser par 2 pour Claude (max 1.0)
- system: systemPrompt,
- messages: [
- { role: 'user', content: text }
- ]
- });
-
- rawResponse = message.content[0].text;
- translation = rawResponse;
-
- // Track LLM usage (only increment counter if NOT using custom key)
- const apiKey = req.headers['x-api-key'] || req.query.apiKey;
- if (apiKey && message.usage && !usingCustomKey) {
- trackLLMUsage(apiKey, message.usage.input_tokens, message.usage.output_tokens);
- }
-
- } else if (provider === 'openai') {
- const openai = new OpenAI({
- apiKey: customOpenAIKey || process.env.OPENAI_API_KEY,
- });
-
- const completion = await openai.chat.completions.create({
- model: model,
- max_tokens: 16384, // Max pour GPT-4o et GPT-4o-mini
- temperature: temperature,
- messages: [
- { role: 'system', content: systemPrompt },
- { role: 'user', content: text }
- ]
- });
-
- rawResponse = completion.choices[0].message.content;
- translation = rawResponse;
-
- // Track LLM usage (only increment counter if NOT using custom key)
- const apiKey = req.headers['x-api-key'] || req.query.apiKey;
- if (apiKey && completion.usage && !usingCustomKey) {
- trackLLMUsage(apiKey, completion.usage.prompt_tokens, completion.usage.completion_tokens);
- }
- } else {
- return res.status(400).json({ error: 'Unknown provider' });
- }
-
- // Parser la réponse pour extraire Layer 1 et Layer 3
- const parsed = parseTranslationResponse(rawResponse);
-
- // Construire la réponse avec les 3 layers
- const response = {
- // Layer 1: Traduction
- layer1: {
- translation: parsed.translation
- },
-
- // Layer 2: Contexte (COT hors LLM)
- layer2: contextMetadata,
-
- // Layer 3: Explications LLM (avec COT)
- layer3: {
- analyse: parsed.analyse,
- strategie: parsed.strategie,
- decomposition: parsed.decomposition,
- notes: parsed.notes,
- wordsCreated: parsed.wordsCreated || []
- },
-
- // Compatibilité avec ancien format
- translation: parsed.translation
- };
-
- res.json(response);
-
- } catch (error) {
- console.error('Translation error:', error);
- res.status(500).json({ error: error.message });
- }
-});
-
-/**
- * Parse la réponse du LLM pour extraire les différentes sections (avec COT)
- * @param {string} response - Réponse brute du LLM
- * @returns {Object} - Sections parsées
- */
-function parseTranslationResponse(response) {
- const lines = response.split('\n');
-
- let analyse = '';
- let strategie = '';
- let translation = '';
- let decomposition = '';
- let notes = '';
- let currentSection = null;
-
- for (const line of lines) {
- const trimmed = line.trim();
-
- // Détecter les sections (nouveau format COT)
- if (trimmed.match(/^ANALYSE:/i)) {
- currentSection = 'analyse';
- continue;
- }
- if (trimmed.match(/^STRAT[ÉE]GIE:/i)) {
- currentSection = 'strategie';
- continue;
- }
- if (trimmed.match(/^(Ancien )?Confluent:/i)) {
- currentSection = 'translation';
- continue;
- }
- if (trimmed.match(/^D[ée]composition:/i)) {
- currentSection = 'decomposition';
- continue;
- }
- if (trimmed.match(/^Notes?:/i) || trimmed.match(/^Explication:/i)) {
- currentSection = 'notes';
- continue;
- }
-
- // Ajouter le contenu à la section appropriée
- if (currentSection === 'analyse' && trimmed && !trimmed.match(/^---/)) {
- analyse += line + '\n';
- } else if (currentSection === 'strategie' && trimmed && !trimmed.match(/^---/)) {
- strategie += line + '\n';
- } else if (currentSection === 'translation' && trimmed && !trimmed.match(/^---/)) {
- translation += line + '\n';
- } else if (currentSection === 'decomposition' && trimmed) {
- decomposition += line + '\n';
- } else if (currentSection === 'notes' && trimmed) {
- notes += line + '\n';
- } else if (!currentSection && trimmed && !trimmed.match(/^---/) && !trimmed.match(/^\*\*/)) {
- // Si pas de section détectée, c'est probablement la traduction
- translation += line + '\n';
- }
- }
-
- return {
- analyse: analyse.trim(),
- strategie: strategie.trim(),
- translation: translation.trim() || response.trim(),
- decomposition: decomposition.trim(),
- notes: notes.trim()
- };
-}
-
-// Raw translation endpoint (for debugging - returns unprocessed LLM output) - SECURED
-app.post('/api/translate/raw', authenticate, async (req, res) => {
- const { text, target, provider, model, useLexique = true, customAnthropicKey, customOpenAIKey } = req.body;
-
- if (!text || !target || !provider || !model) {
- return res.status(400).json({ error: 'Missing parameters' });
- }
-
- // Check for custom API keys
- const usingCustomKey = !!(customAnthropicKey || customOpenAIKey);
-
- // Only check rate limit if NOT using custom keys
- if (!usingCustomKey) {
- const apiKey = req.headers['x-api-key'] || req.query.apiKey;
- const limitCheck = checkLLMLimit(apiKey);
- if (!limitCheck.allowed) {
- return res.status(429).json({
- error: limitCheck.error,
- limit: limitCheck.limit,
- used: limitCheck.used
- });
- }
- }
-
- const variant = target === 'proto' ? 'proto' : 'ancien';
-
- try {
- let systemPrompt;
- let contextMetadata = null;
-
- if (useLexique) {
- const contextResult = analyzeContext(text, lexiques[variant]);
- systemPrompt = buildContextualPrompt(contextResult, variant, text);
-
- const promptStats = getPromptStats(systemPrompt, contextResult);
- contextMetadata = {
- wordsFound: contextResult.metadata.wordsFound,
- wordsNotFound: contextResult.metadata.wordsNotFound,
- entriesUsed: contextResult.metadata.entriesUsed,
- totalLexiqueSize: contextResult.metadata.totalLexiqueSize,
- tokensFullLexique: promptStats.fullLexiqueTokens,
- tokensUsed: promptStats.promptTokens,
- tokensSaved: promptStats.tokensSaved,
- savingsPercent: promptStats.savingsPercent,
- useFallback: contextResult.useFallback,
- expansionLevel: contextResult.metadata.expansionLevel
- };
- } else {
- systemPrompt = getBasePrompt(variant);
- }
-
- let rawResponse;
-
- if (provider === 'anthropic') {
- const anthropic = new Anthropic({
- apiKey: customAnthropicKey || process.env.ANTHROPIC_API_KEY,
- });
-
- const message = await anthropic.messages.create({
- model: model,
- max_tokens: 8192, // Max pour Claude Sonnet/Haiku 4.5
- system: systemPrompt,
- messages: [
- { role: 'user', content: text }
- ]
- });
-
- rawResponse = message.content[0].text;
-
- // Track LLM usage (only increment counter if NOT using custom key)
- const apiKey = req.headers['x-api-key'] || req.query.apiKey;
- if (apiKey && message.usage && !usingCustomKey) {
- trackLLMUsage(apiKey, message.usage.input_tokens, message.usage.output_tokens);
- }
-
- } else if (provider === 'openai') {
- const openai = new OpenAI({
- apiKey: customOpenAIKey || process.env.OPENAI_API_KEY,
- });
-
- const completion = await openai.chat.completions.create({
- model: model,
- max_tokens: 16384, // Max pour GPT-4o et GPT-4o-mini
- messages: [
- { role: 'system', content: systemPrompt },
- { role: 'user', content: text }
- ]
- });
-
- rawResponse = completion.choices[0].message.content;
-
- // Track LLM usage (only increment counter if NOT using custom key)
- const apiKey = req.headers['x-api-key'] || req.query.apiKey;
- if (apiKey && completion.usage && !usingCustomKey) {
- trackLLMUsage(apiKey, completion.usage.prompt_tokens, completion.usage.completion_tokens);
- }
- } else {
- return res.status(400).json({ error: 'Unknown provider' });
- }
-
- // Retourner la réponse BRUTE sans parsing
- res.json({
- raw_output: rawResponse,
- metadata: contextMetadata,
- length: rawResponse.length,
- lines: rawResponse.split('\n').length
- });
-
- } catch (error) {
- console.error('Translation error:', error);
- res.status(500).json({ error: error.message });
- }
-});
-
-// Batch translation endpoint - SECURED
-app.post('/api/translate/batch', authenticate, async (req, res) => {
- const { words, target = 'ancien' } = req.body;
-
- if (!words || !Array.isArray(words)) {
- return res.status(400).json({ error: 'Missing or invalid "words" array' });
- }
-
- const variant = target === 'proto' ? 'proto' : 'ancien';
- const results = {};
-
- for (const word of words) {
- const found = searchLexique(lexiques[variant], word, 'fr2conf');
- if (found.length > 0 && found[0].traductions?.length > 0) {
- results[word] = {
- found: true,
- traduction: found[0].traductions[0].confluent,
- all_traductions: found[0].traductions
- };
- } else {
- results[word] = { found: false };
- }
- }
-
- res.json({ target, results });
-});
-
-// Confluent → French translation endpoint (traduction brute) - SECURED
-app.post('/api/translate/conf2fr', authenticate, (req, res) => {
- const { text, variant = 'ancien', detailed = false } = req.body;
-
- if (!text) {
- return res.status(400).json({ error: 'Missing parameter: text' });
- }
-
- const variantKey = variant === 'proto' ? 'proto' : 'ancien';
-
- if (!confluentIndexes[variantKey]) {
- return res.status(500).json({ error: `Confluent index for ${variantKey} not loaded` });
- }
-
- try {
- if (detailed) {
- const result = translateConfluentDetailed(text, confluentIndexes[variantKey]);
- res.json(result);
- } else {
- const result = translateConfluentToFrench(text, confluentIndexes[variantKey]);
- res.json(result);
- }
- } catch (error) {
- console.error('Confluent→FR translation error:', error);
- res.status(500).json({ error: error.message });
- }
-});
-
-// NEW: Confluent → French with LLM refinement
-app.post('/api/translate/conf2fr/llm', authenticate, async (req, res) => {
- const { text, variant = 'ancien', provider = 'anthropic', model = 'claude-sonnet-4-20250514', customAnthropicKey, customOpenAIKey } = req.body;
-
- if (!text) {
- return res.status(400).json({ error: 'Missing parameter: text' });
- }
-
- // Check for custom API keys
- const usingCustomKey = !!(customAnthropicKey || customOpenAIKey);
-
- // Only check rate limit if NOT using custom keys
- if (!usingCustomKey) {
- const apiKey = req.headers['x-api-key'] || req.query.apiKey;
- const limitCheck = checkLLMLimit(apiKey);
- if (!limitCheck.allowed) {
- return res.status(429).json({
- error: limitCheck.error,
- limit: limitCheck.limit,
- used: limitCheck.used
- });
- }
- }
-
- const variantKey = variant === 'proto' ? 'proto' : 'ancien';
-
- if (!confluentIndexes[variantKey]) {
- return res.status(500).json({ error: `Confluent index for ${variantKey} not loaded` });
- }
-
- try {
- // Step 1: Get raw word-by-word translation
- const rawTranslation = translateConfluentToFrench(text, confluentIndexes[variantKey]);
-
- // Step 2: Load refinement prompt
- const refinementPrompt = fs.readFileSync(path.join(__dirname, 'prompts', 'cf2fr-refinement.txt'), 'utf-8');
-
- // Step 3: Use LLM to refine translation
- let refinedText;
-
- if (provider === 'anthropic') {
- const anthropic = new Anthropic({
- apiKey: customAnthropicKey || process.env.ANTHROPIC_API_KEY,
- });
-
- const message = await anthropic.messages.create({
- model: model,
- max_tokens: 2048,
- system: refinementPrompt,
- messages: [
- {
- role: 'user',
- content: `Voici la traduction brute mot-à-mot du Confluent vers le français. Transforme-la en français fluide et naturel:\n\n${rawTranslation.translation}`
- }
- ]
- });
-
- refinedText = message.content[0].text.trim();
-
- // Track LLM usage (only increment counter if NOT using custom key)
- const apiKey = req.headers['x-api-key'] || req.query.apiKey;
- if (apiKey && message.usage && !usingCustomKey) {
- trackLLMUsage(apiKey, message.usage.input_tokens, message.usage.output_tokens);
- }
- } else if (provider === 'openai') {
- const openai = new OpenAI({
- apiKey: customOpenAIKey || process.env.OPENAI_API_KEY,
- });
-
- const completion = await openai.chat.completions.create({
- model: model,
- messages: [
- { role: 'system', content: refinementPrompt },
- { role: 'user', content: `Voici la traduction brute mot-à-mot du Confluent vers le français. Transforme-la en français fluide et naturel:\n\n${rawTranslation.translation}` }
- ]
- });
-
- refinedText = completion.choices[0].message.content.trim();
-
- // Track LLM usage (only increment counter if NOT using custom key)
- const apiKey = req.headers['x-api-key'] || req.query.apiKey;
- if (apiKey && completion.usage && !usingCustomKey) {
- trackLLMUsage(apiKey, completion.usage.prompt_tokens, completion.usage.completion_tokens);
- }
- } else {
- return res.status(400).json({ error: 'Unsupported provider. Use "anthropic" or "openai".' });
- }
-
- // Return both raw and refined versions with detailed token info
- res.json({
- confluentText: text,
- rawTranslation: rawTranslation.translation,
- refinedTranslation: refinedText,
- translation: refinedText, // For compatibility
- tokens: rawTranslation.tokens || [],
- coverage: rawTranslation.coverage || 0,
- wordsTranslated: rawTranslation.wordsTranslated,
- wordsNotTranslated: rawTranslation.wordsNotTranslated,
- provider,
- model
- });
-
- } catch (error) {
- console.error('Confluent→FR LLM refinement error:', error);
- res.status(500).json({ error: error.message });
- }
-});
-
-// Admin routes
-const adminRoutes = require('./adminRoutes');
-app.use('/api/admin', authenticate, adminRoutes);
-
-app.listen(PORT, () => {
- console.log(`ConfluentTranslator running on http://localhost:${PORT}`);
- console.log(`Loaded: ${lexiques.ancien?.meta?.total_entries || 0} ancien entries, ${lexiques.proto?.meta?.total_entries || 0} proto entries`);
-});
+// Point d'entrée du serveur ConfluentTranslator
+// Importe le serveur depuis la structure organisée
+require('./src/api/server');
diff --git a/ConfluentTranslator/adminRoutes.js b/ConfluentTranslator/src/api/adminRoutes.js
similarity index 88%
rename from ConfluentTranslator/adminRoutes.js
rename to ConfluentTranslator/src/api/adminRoutes.js
index 99cb4c8..28b2c50 100644
--- a/ConfluentTranslator/adminRoutes.js
+++ b/ConfluentTranslator/src/api/adminRoutes.js
@@ -1,8 +1,8 @@
const express = require('express');
const router = express.Router();
-const { requireAdmin, createToken, listTokens, disableToken, enableToken, deleteToken, getGlobalStats } = require('./auth');
-const { getLogs, getLogStats } = require('./logger');
-const { adminLimiter } = require('./rateLimiter');
+const { requireAdmin, createToken, listTokens, disableToken, enableToken, deleteToken, getGlobalStats } = require('../utils/auth');
+const { getLogs, getLogStats } = require('../utils/logger');
+const { adminLimiter } = require('../utils/rateLimiter');
// Appliquer l'auth et rate limiting à toutes les routes admin
router.use(requireAdmin);
@@ -16,13 +16,13 @@ router.get('/tokens', (req, res) => {
// Créer un nouveau token
router.post('/tokens', (req, res) => {
- const { name, role = 'user', dailyLimit = 100 } = req.body;
+ const { name, role = 'user' } = req.body;
if (!name) {
return res.status(400).json({ error: 'Missing parameter: name' });
}
- const token = createToken(name, role, dailyLimit);
+ const token = createToken(name, role);
res.json({
success: true,
token: {
diff --git a/ConfluentTranslator/src/api/server.js b/ConfluentTranslator/src/api/server.js
new file mode 100644
index 0000000..914d646
--- /dev/null
+++ b/ConfluentTranslator/src/api/server.js
@@ -0,0 +1,872 @@
+require('dotenv').config();
+const express = require('express');
+const path = require('path');
+const fs = require('fs');
+const { Anthropic } = require('@anthropic-ai/sdk');
+const OpenAI = require('openai');
+const {
+ loadAllLexiques,
+ searchLexique,
+ generateLexiqueSummary,
+ buildReverseIndex
+} = require('../utils/lexiqueLoader');
+const { analyzeContext } = require('../core/translation/contextAnalyzer');
+const { buildContextualPrompt, getBasePrompt, getPromptStats } = require('../core/translation/promptBuilder');
+const { buildReverseIndex: buildConfluentIndex } = require('../core/morphology/reverseIndexBuilder');
+const { translateConfluentToFrench, translateConfluentDetailed } = require('../core/translation/confluentToFrench');
+
+// Security modules
+const { authenticate, requireAdmin, createToken, listTokens, disableToken, enableToken, deleteToken, getGlobalStats, trackLLMUsage, checkLLMLimit } = require('../utils/auth');
+const { adminLimiter } = require('../utils/rateLimiter');
+const { requestLogger, getLogs, getLogStats } = require('../utils/logger');
+
+const app = express();
+const PORT = process.env.PORT || 3000;
+
+// Middlewares
+app.use(express.json());
+app.use(requestLogger); // Log toutes les requêtes
+// Rate limiting: on utilise uniquement checkLLMLimit() par API key, pas de rate limit global par IP
+
+// Route protégée pour admin.html (AVANT express.static)
+// Vérifie l'auth seulement si API key présente, sinon laisse passer (le JS client vérifiera)
+app.get('/admin.html', (req, res, next) => {
+ const apiKey = req.headers['x-api-key'] || req.query.apiKey;
+
+ // Si pas d'API key, c'est une requête browser normale -> laisser passer
+ if (!apiKey) {
+ return res.sendFile(path.join(__dirname, '..', '..', 'public', 'admin.html'));
+ }
+
+ // Si API key présente, vérifier qu'elle est admin
+ authenticate(req, res, (authErr) => {
+ if (authErr) return next(authErr);
+ requireAdmin(req, res, (adminErr) => {
+ if (adminErr) return next(adminErr);
+ res.sendFile(path.join(__dirname, '..', '..', 'public', 'admin.html'));
+ });
+ });
+});
+
+app.use(express.static(path.join(__dirname, '..', '..', 'public')));
+
+// Load prompts
+const protoPrompt = fs.readFileSync(path.join(__dirname, '..', '..', 'prompts', 'proto-system.txt'), 'utf-8');
+const ancienPrompt = fs.readFileSync(path.join(__dirname, '..', '..', 'prompts', 'ancien-system.txt'), 'utf-8');
+
+// Load lexiques dynamically from JSON files
+const baseDir = path.join(__dirname, '..', '..');
+let lexiques = { proto: null, ancien: null };
+let reverseIndexes = { proto: null, ancien: null };
+let confluentIndexes = { proto: null, ancien: null };
+
+function reloadLexiques() {
+ console.log('Loading lexiques...');
+ lexiques = loadAllLexiques(baseDir);
+ reverseIndexes = {
+ proto: buildReverseIndex(lexiques.proto),
+ ancien: buildReverseIndex(lexiques.ancien)
+ };
+ confluentIndexes = {
+ proto: buildConfluentIndex(lexiques.proto),
+ ancien: buildConfluentIndex(lexiques.ancien)
+ };
+ console.log('Lexiques loaded successfully');
+ console.log(`Confluent→FR index: ${Object.keys(confluentIndexes.ancien || {}).length} entries`);
+}
+
+// Initial load
+reloadLexiques();
+
+// Health check endpoint (public - for login validation)
+app.get('/api/health', (req, res) => {
+ res.json({
+ status: 'ok',
+ timestamp: new Date().toISOString(),
+ version: '1.0.0'
+ });
+});
+
+// Auth validation endpoint (tests API key without exposing data)
+app.get('/api/validate', authenticate, (req, res) => {
+ res.json({
+ valid: true,
+ user: req.user?.name || 'anonymous',
+ role: req.user?.role || 'user'
+ });
+});
+
+// LLM limit check endpoint - Always returns 200 with info
+app.get('/api/llm/limit', authenticate, (req, res) => {
+ const apiKey = req.headers['x-api-key'] || req.query.apiKey;
+ const limitCheck = checkLLMLimit(apiKey);
+
+ console.log('[/api/llm/limit] Check result:', limitCheck); // Debug
+
+ // TOUJOURS retourner 200 avec les données
+ // Cet endpoint ne bloque jamais, il informe seulement
+ res.status(200).json(limitCheck);
+});
+
+// Legacy lexique endpoint (for backward compatibility) - SECURED
+app.get('/lexique', authenticate, (req, res) => {
+ // Return ancien-confluent by default (legacy behavior)
+ if (!lexiques.ancien) {
+ return res.status(500).json({ error: 'Lexique not loaded' });
+ }
+ res.json(lexiques.ancien);
+});
+
+// New lexique endpoints - SECURED
+app.get('/api/lexique/:variant', authenticate, (req, res) => {
+ const { variant } = req.params;
+
+ if (variant !== 'proto' && variant !== 'ancien') {
+ return res.status(400).json({ error: 'Invalid variant. Use "proto" or "ancien"' });
+ }
+
+ if (!lexiques[variant]) {
+ return res.status(500).json({ error: `Lexique ${variant} not loaded` });
+ }
+
+ res.json(lexiques[variant]);
+});
+
+// Stats endpoint - SECURED
+app.get('/api/stats', authenticate, (req, res) => {
+ const { variant = 'ancien' } = req.query;
+
+ if (variant !== 'proto' && variant !== 'ancien') {
+ return res.status(400).json({ error: 'Invalid variant. Use "proto" or "ancien"' });
+ }
+
+ if (!lexiques[variant]) {
+ return res.status(500).json({ error: `Lexique ${variant} not loaded` });
+ }
+
+ const lexique = lexiques[variant];
+ const stats = {
+ motsCF: 0, // Mots Confluent uniques
+ motsFR: 0, // Mots français uniques
+ totalTraductions: 0, // Total de traductions
+ racines: 0, // Racines (racine, racine_sacree)
+ racinesSacrees: 0, // Racines sacrées
+ racinesStandards: 0, // Racines standards
+ compositions: 0, // Compositions
+ verbes: 0, // Verbes
+ verbesIrreguliers: 0, // Verbes irréguliers
+ particules: 0, // Particules grammaticales (negation, particule, interrogation, demonstratif)
+ nomsPropes: 0, // Noms propres
+ marqueurs: 0, // Marqueurs (temps, aspect, nombre)
+ pronoms: 0, // Pronoms (pronom, possessif, relatif, determinant)
+ autres: 0 // Autres types (auxiliaire, quantificateur, etc.)
+ };
+
+ const motsCFSet = new Set();
+ const motsFRSet = new Set();
+
+ // Le lexique peut avoir une structure {dictionnaire: {...}} ou être directement un objet
+ const dict = lexique.dictionnaire || lexique;
+
+ // Parcourir le dictionnaire
+ Object.keys(dict).forEach(motFR => {
+ const entry = dict[motFR];
+ motsFRSet.add(motFR);
+
+ if (entry.traductions) {
+ entry.traductions.forEach(trad => {
+ stats.totalTraductions++;
+
+ // Compter les mots CF uniques
+ if (trad.confluent) {
+ motsCFSet.add(trad.confluent);
+ }
+
+ // Compter par type
+ const type = trad.type || '';
+ if (type === 'racine') {
+ stats.racines++;
+ stats.racinesStandards++;
+ } else if (type === 'racine_sacree') {
+ stats.racines++;
+ stats.racinesSacrees++;
+ } else if (type === 'composition' || type === 'racine_sacree_composee') {
+ stats.compositions++;
+ } else if (type === 'verbe') {
+ stats.verbes++;
+ } else if (type === 'verbe_irregulier') {
+ stats.verbes++;
+ stats.verbesIrreguliers++;
+ } else if (type === 'negation' || type === 'particule' || type === 'interrogation' || type === 'demonstratif') {
+ stats.particules++;
+ } else if (type === 'nom_propre') {
+ stats.nomsPropes++;
+ } else if (type === 'marqueur_temps' || type === 'marqueur_aspect' || type === 'marqueur_nombre') {
+ stats.marqueurs++;
+ } else if (type === 'pronom' || type === 'possessif' || type === 'relatif' || type === 'determinant') {
+ stats.pronoms++;
+ } else if (type !== '') {
+ stats.autres++;
+ }
+ });
+ }
+ });
+
+ stats.motsCF = motsCFSet.size;
+ stats.motsFR = motsFRSet.size;
+
+ res.json(stats);
+});
+
+// Search endpoint - SECURED
+app.get('/api/search', authenticate, (req, res) => {
+ const { q, variant = 'ancien', direction = 'fr2conf' } = req.query;
+
+ if (!q) {
+ return res.status(400).json({ error: 'Missing query parameter "q"' });
+ }
+
+ if (variant !== 'proto' && variant !== 'ancien') {
+ return res.status(400).json({ error: 'Invalid variant. Use "proto" or "ancien"' });
+ }
+
+ const results = searchLexique(lexiques[variant], q, direction);
+ res.json({ query: q, variant, direction, results });
+});
+
+// Reload endpoint (for development) - SECURED (admin only)
+app.post('/api/reload', authenticate, requireAdmin, (req, res) => {
+ try {
+ reloadLexiques();
+ res.json({
+ success: true,
+ message: 'Lexiques reloaded',
+ stats: {
+ proto: lexiques.proto?.meta?.total_entries || 0,
+ ancien: lexiques.ancien?.meta?.total_entries || 0
+ }
+ });
+ } catch (error) {
+ res.status(500).json({ error: error.message });
+ }
+});
+
+// Build enhanced prompt with lexique data
+function buildEnhancedPrompt(basePrompt, variant) {
+ const lexique = lexiques[variant];
+ if (!lexique) return basePrompt;
+
+ const summary = generateLexiqueSummary(lexique, 300);
+
+ return `${basePrompt}
+
+# LEXIQUE COMPLET (${lexique.meta.total_entries} entrées)
+${summary}
+`;
+}
+
+// Debug endpoint: Generate prompt without calling LLM - SECURED
+app.post('/api/debug/prompt', authenticate, (req, res) => {
+ const { text, target = 'ancien', useLexique = true } = req.body;
+
+ if (!text) {
+ return res.status(400).json({ error: 'Missing parameter: text' });
+ }
+
+ const variant = target === 'proto' ? 'proto' : 'ancien';
+
+ try {
+ let systemPrompt;
+ let contextMetadata = null;
+
+ // MÊME CODE QUE /translate
+ if (useLexique) {
+ const contextResult = analyzeContext(text, lexiques[variant]);
+ systemPrompt = buildContextualPrompt(contextResult, variant, text);
+
+ const promptStats = getPromptStats(systemPrompt, contextResult);
+ contextMetadata = {
+ wordsFound: contextResult.metadata.wordsFound,
+ wordsNotFound: contextResult.metadata.wordsNotFound,
+ entriesUsed: contextResult.metadata.entriesUsed,
+ totalLexiqueSize: contextResult.metadata.totalLexiqueSize,
+ tokensFullLexique: promptStats.fullLexiqueTokens,
+ tokensUsed: promptStats.promptTokens,
+ tokensSaved: promptStats.tokensSaved,
+ savingsPercent: promptStats.savingsPercent,
+ useFallback: contextResult.useFallback,
+ expansionLevel: contextResult.metadata.expansionLevel
+ };
+ } else {
+ systemPrompt = getBasePrompt(variant);
+ }
+
+ res.json({
+ prompt: systemPrompt,
+ metadata: contextMetadata,
+ stats: {
+ promptLength: systemPrompt.length,
+ promptLines: systemPrompt.split('\n').length
+ }
+ });
+
+ } catch (error) {
+ console.error('Prompt generation error:', error);
+ res.status(500).json({ error: error.message });
+ }
+});
+
+// Coverage analysis endpoint (analyze French text before translation) - SECURED
+app.post('/api/analyze/coverage', authenticate, (req, res) => {
+ const { text, target = 'ancien' } = req.body;
+
+ if (!text) {
+ return res.status(400).json({ error: 'Missing parameter: text' });
+ }
+
+ const variant = target === 'proto' ? 'proto' : 'ancien';
+
+ try {
+ // Use the same contextAnalyzer as the translation pipeline
+ const contextResult = analyzeContext(text, lexiques[variant]);
+ const metadata = contextResult.metadata;
+
+ // Calculate recommendation
+ const needsFullRoots = metadata.coveragePercent < 90;
+ let recommendation;
+ if (metadata.coveragePercent >= 95) {
+ recommendation = 'Excellent coverage - context only';
+ } else if (metadata.coveragePercent >= 90) {
+ recommendation = 'Good coverage - context only';
+ } else if (metadata.coveragePercent >= 70) {
+ recommendation = 'Moderate coverage - consider adding roots';
+ } else if (metadata.coveragePercent >= 50) {
+ recommendation = 'Low coverage - full roots recommended';
+ } else {
+ recommendation = 'Very low coverage - full roots required';
+ }
+
+ res.json({
+ coverage: metadata.coveragePercent,
+ found: metadata.wordsFound.map(w => ({
+ word: w.input,
+ confluent: w.confluent,
+ type: w.type,
+ score: w.score
+ })),
+ missing: metadata.wordsNotFound.map(word => ({
+ word,
+ suggestions: [] // TODO: add suggestions based on similar words
+ })),
+ stats: {
+ totalWords: metadata.wordCount,
+ uniqueWords: metadata.uniqueWordCount,
+ foundCount: metadata.wordsFound.length,
+ missingCount: metadata.wordsNotFound.length,
+ entriesUsed: metadata.entriesUsed,
+ useFallback: metadata.useFallback
+ },
+ needsFullRoots,
+ recommendation,
+ variant
+ });
+
+ } catch (error) {
+ console.error('Coverage analysis error:', error);
+ res.status(500).json({ error: error.message });
+ }
+});
+
+// Translation endpoint (NOUVEAU SYSTÈME CONTEXTUEL)
+app.post('/translate', authenticate, async (req, res) => {
+ const { text, target, provider, model, temperature = 1.0, useLexique = true, customAnthropicKey, customOpenAIKey } = req.body;
+
+ if (!text || !target || !provider || !model) {
+ return res.status(400).json({ error: 'Missing parameters' });
+ }
+
+ // Check for custom API keys
+ const usingCustomKey = !!(customAnthropicKey || customOpenAIKey);
+
+ // Only check rate limit if NOT using custom keys
+ if (!usingCustomKey) {
+ const apiKey = req.headers['x-api-key'] || req.query.apiKey;
+ const limitCheck = checkLLMLimit(apiKey);
+ if (!limitCheck.allowed) {
+ return res.status(429).json({
+ error: limitCheck.error,
+ limit: limitCheck.limit,
+ used: limitCheck.used
+ });
+ }
+ }
+
+ const variant = target === 'proto' ? 'proto' : 'ancien';
+
+ try {
+ let systemPrompt;
+ let contextMetadata = null;
+
+ // NOUVEAU: Analyse contextuelle et génération de prompt optimisé
+ if (useLexique) {
+ const contextResult = analyzeContext(text, lexiques[variant]);
+ systemPrompt = buildContextualPrompt(contextResult, variant, text);
+
+ // Générer métadonnées pour Layer 2
+ const promptStats = getPromptStats(systemPrompt, contextResult);
+ contextMetadata = {
+ wordsFound: contextResult.metadata.wordsFound,
+ wordsNotFound: contextResult.metadata.wordsNotFound,
+ entriesUsed: contextResult.metadata.entriesUsed,
+ totalLexiqueSize: contextResult.metadata.totalLexiqueSize,
+ tokensFullLexique: promptStats.fullLexiqueTokens,
+ tokensUsed: promptStats.promptTokens,
+ tokensSaved: promptStats.tokensSaved,
+ savingsPercent: promptStats.savingsPercent,
+ useFallback: contextResult.useFallback,
+ expansionLevel: contextResult.metadata.expansionLevel,
+ rootsUsed: contextResult.rootsFallback?.length || 0 // Nombre de racines envoyées
+ };
+ } else {
+ systemPrompt = getBasePrompt(variant);
+ }
+
+ let translation;
+ let rawResponse;
+
+ if (provider === 'anthropic') {
+ const anthropic = new Anthropic({
+ apiKey: customAnthropicKey || process.env.ANTHROPIC_API_KEY,
+ });
+
+ const message = await anthropic.messages.create({
+ model: model,
+ max_tokens: 8192, // Max pour Claude Sonnet/Haiku 4.5
+ temperature: temperature / 2, // Diviser par 2 pour Claude (max 1.0)
+ system: systemPrompt,
+ messages: [
+ { role: 'user', content: text }
+ ]
+ });
+
+ rawResponse = message.content[0].text;
+ translation = rawResponse;
+
+ // Track LLM usage (only increment counter if NOT using custom key)
+ const apiKey = req.headers['x-api-key'] || req.query.apiKey;
+ if (apiKey && message.usage && !usingCustomKey) {
+ trackLLMUsage(apiKey, message.usage.input_tokens, message.usage.output_tokens);
+ }
+
+ } else if (provider === 'openai') {
+ const openai = new OpenAI({
+ apiKey: customOpenAIKey || process.env.OPENAI_API_KEY,
+ });
+
+ const completion = await openai.chat.completions.create({
+ model: model,
+ max_tokens: 16384, // Max pour GPT-4o et GPT-4o-mini
+ temperature: temperature,
+ messages: [
+ { role: 'system', content: systemPrompt },
+ { role: 'user', content: text }
+ ]
+ });
+
+ rawResponse = completion.choices[0].message.content;
+ translation = rawResponse;
+
+ // Track LLM usage (only increment counter if NOT using custom key)
+ const apiKey = req.headers['x-api-key'] || req.query.apiKey;
+ if (apiKey && completion.usage && !usingCustomKey) {
+ trackLLMUsage(apiKey, completion.usage.prompt_tokens, completion.usage.completion_tokens);
+ }
+ } else {
+ return res.status(400).json({ error: 'Unknown provider' });
+ }
+
+ // Parser la réponse pour extraire Layer 1 et Layer 3
+ const parsed = parseTranslationResponse(rawResponse);
+
+ // Construire la réponse avec les 3 layers
+ const response = {
+ // Layer 1: Traduction
+ layer1: {
+ translation: parsed.translation
+ },
+
+ // Layer 2: Contexte (COT hors LLM)
+ layer2: contextMetadata,
+
+ // Layer 3: Explications LLM (avec COT)
+ layer3: {
+ analyse: parsed.analyse,
+ strategie: parsed.strategie,
+ decomposition: parsed.decomposition,
+ notes: parsed.notes,
+ wordsCreated: parsed.wordsCreated || []
+ },
+
+ // Compatibilité avec ancien format
+ translation: parsed.translation
+ };
+
+ res.json(response);
+
+ } catch (error) {
+ console.error('Translation error:', error);
+ res.status(500).json({ error: error.message });
+ }
+});
+
+/**
+ * Parse la réponse du LLM pour extraire les différentes sections (avec COT)
+ * @param {string} response - Réponse brute du LLM
+ * @returns {Object} - Sections parsées
+ */
+function parseTranslationResponse(response) {
+ const lines = response.split('\n');
+
+ let analyse = '';
+ let strategie = '';
+ let translation = '';
+ let decomposition = '';
+ let notes = '';
+ let currentSection = null;
+
+ for (const line of lines) {
+ const trimmed = line.trim();
+
+ // Détecter les sections (nouveau format COT)
+ if (trimmed.match(/^ANALYSE:/i)) {
+ currentSection = 'analyse';
+ continue;
+ }
+ if (trimmed.match(/^STRAT[ÉE]GIE:/i)) {
+ currentSection = 'strategie';
+ continue;
+ }
+ if (trimmed.match(/^(Ancien )?Confluent:/i)) {
+ currentSection = 'translation';
+ continue;
+ }
+ if (trimmed.match(/^D[ée]composition:/i)) {
+ currentSection = 'decomposition';
+ continue;
+ }
+ if (trimmed.match(/^Notes?:/i) || trimmed.match(/^Explication:/i)) {
+ currentSection = 'notes';
+ continue;
+ }
+
+ // Ajouter le contenu à la section appropriée
+ if (currentSection === 'analyse' && trimmed && !trimmed.match(/^---/)) {
+ analyse += line + '\n';
+ } else if (currentSection === 'strategie' && trimmed && !trimmed.match(/^---/)) {
+ strategie += line + '\n';
+ } else if (currentSection === 'translation' && trimmed && !trimmed.match(/^---/)) {
+ translation += line + '\n';
+ } else if (currentSection === 'decomposition' && trimmed) {
+ decomposition += line + '\n';
+ } else if (currentSection === 'notes' && trimmed) {
+ notes += line + '\n';
+ } else if (!currentSection && trimmed && !trimmed.match(/^---/) && !trimmed.match(/^\*\*/)) {
+ // Si pas de section détectée, c'est probablement la traduction
+ translation += line + '\n';
+ }
+ }
+
+ return {
+ analyse: analyse.trim(),
+ strategie: strategie.trim(),
+ translation: translation.trim() || response.trim(),
+ decomposition: decomposition.trim(),
+ notes: notes.trim()
+ };
+}
+
+// Raw translation endpoint (for debugging - returns unprocessed LLM output) - SECURED
+app.post('/api/translate/raw', authenticate, async (req, res) => {
+ const { text, target, provider, model, useLexique = true, customAnthropicKey, customOpenAIKey } = req.body;
+
+ if (!text || !target || !provider || !model) {
+ return res.status(400).json({ error: 'Missing parameters' });
+ }
+
+ // Check for custom API keys
+ const usingCustomKey = !!(customAnthropicKey || customOpenAIKey);
+
+ // Only check rate limit if NOT using custom keys
+ if (!usingCustomKey) {
+ const apiKey = req.headers['x-api-key'] || req.query.apiKey;
+ const limitCheck = checkLLMLimit(apiKey);
+ if (!limitCheck.allowed) {
+ return res.status(429).json({
+ error: limitCheck.error,
+ limit: limitCheck.limit,
+ used: limitCheck.used
+ });
+ }
+ }
+
+ const variant = target === 'proto' ? 'proto' : 'ancien';
+
+ try {
+ let systemPrompt;
+ let contextMetadata = null;
+
+ if (useLexique) {
+ const contextResult = analyzeContext(text, lexiques[variant]);
+ systemPrompt = buildContextualPrompt(contextResult, variant, text);
+
+ const promptStats = getPromptStats(systemPrompt, contextResult);
+ contextMetadata = {
+ wordsFound: contextResult.metadata.wordsFound,
+ wordsNotFound: contextResult.metadata.wordsNotFound,
+ entriesUsed: contextResult.metadata.entriesUsed,
+ totalLexiqueSize: contextResult.metadata.totalLexiqueSize,
+ tokensFullLexique: promptStats.fullLexiqueTokens,
+ tokensUsed: promptStats.promptTokens,
+ tokensSaved: promptStats.tokensSaved,
+ savingsPercent: promptStats.savingsPercent,
+ useFallback: contextResult.useFallback,
+ expansionLevel: contextResult.metadata.expansionLevel
+ };
+ } else {
+ systemPrompt = getBasePrompt(variant);
+ }
+
+ let rawResponse;
+
+ if (provider === 'anthropic') {
+ const anthropic = new Anthropic({
+ apiKey: customAnthropicKey || process.env.ANTHROPIC_API_KEY,
+ });
+
+ const message = await anthropic.messages.create({
+ model: model,
+ max_tokens: 8192, // Max pour Claude Sonnet/Haiku 4.5
+ system: systemPrompt,
+ messages: [
+ { role: 'user', content: text }
+ ]
+ });
+
+ rawResponse = message.content[0].text;
+
+ // Track LLM usage (only increment counter if NOT using custom key)
+ const apiKey = req.headers['x-api-key'] || req.query.apiKey;
+ if (apiKey && message.usage && !usingCustomKey) {
+ trackLLMUsage(apiKey, message.usage.input_tokens, message.usage.output_tokens);
+ }
+
+ } else if (provider === 'openai') {
+ const openai = new OpenAI({
+ apiKey: customOpenAIKey || process.env.OPENAI_API_KEY,
+ });
+
+ const completion = await openai.chat.completions.create({
+ model: model,
+ max_tokens: 16384, // Max pour GPT-4o et GPT-4o-mini
+ messages: [
+ { role: 'system', content: systemPrompt },
+ { role: 'user', content: text }
+ ]
+ });
+
+ rawResponse = completion.choices[0].message.content;
+
+ // Track LLM usage (only increment counter if NOT using custom key)
+ const apiKey = req.headers['x-api-key'] || req.query.apiKey;
+ if (apiKey && completion.usage && !usingCustomKey) {
+ trackLLMUsage(apiKey, completion.usage.prompt_tokens, completion.usage.completion_tokens);
+ }
+ } else {
+ return res.status(400).json({ error: 'Unknown provider' });
+ }
+
+ // Retourner la réponse BRUTE sans parsing
+ res.json({
+ raw_output: rawResponse,
+ metadata: contextMetadata,
+ length: rawResponse.length,
+ lines: rawResponse.split('\n').length
+ });
+
+ } catch (error) {
+ console.error('Translation error:', error);
+ res.status(500).json({ error: error.message });
+ }
+});
+
+// Batch translation endpoint - SECURED
+app.post('/api/translate/batch', authenticate, async (req, res) => {
+ const { words, target = 'ancien' } = req.body;
+
+ if (!words || !Array.isArray(words)) {
+ return res.status(400).json({ error: 'Missing or invalid "words" array' });
+ }
+
+ const variant = target === 'proto' ? 'proto' : 'ancien';
+ const results = {};
+
+ for (const word of words) {
+ const found = searchLexique(lexiques[variant], word, 'fr2conf');
+ if (found.length > 0 && found[0].traductions?.length > 0) {
+ results[word] = {
+ found: true,
+ traduction: found[0].traductions[0].confluent,
+ all_traductions: found[0].traductions
+ };
+ } else {
+ results[word] = { found: false };
+ }
+ }
+
+ res.json({ target, results });
+});
+
+// Confluent → French translation endpoint (traduction brute) - SECURED
+app.post('/api/translate/conf2fr', authenticate, (req, res) => {
+ const { text, variant = 'ancien', detailed = false } = req.body;
+
+ if (!text) {
+ return res.status(400).json({ error: 'Missing parameter: text' });
+ }
+
+ const variantKey = variant === 'proto' ? 'proto' : 'ancien';
+
+ if (!confluentIndexes[variantKey]) {
+ return res.status(500).json({ error: `Confluent index for ${variantKey} not loaded` });
+ }
+
+ try {
+ if (detailed) {
+ const result = translateConfluentDetailed(text, confluentIndexes[variantKey]);
+ res.json(result);
+ } else {
+ const result = translateConfluentToFrench(text, confluentIndexes[variantKey]);
+ res.json(result);
+ }
+ } catch (error) {
+ console.error('Confluent→FR translation error:', error);
+ res.status(500).json({ error: error.message });
+ }
+});
+
+// NEW: Confluent → French with LLM refinement
+app.post('/api/translate/conf2fr/llm', authenticate, async (req, res) => {
+ const { text, variant = 'ancien', provider = 'anthropic', model = 'claude-sonnet-4-20250514', customAnthropicKey, customOpenAIKey } = req.body;
+
+ if (!text) {
+ return res.status(400).json({ error: 'Missing parameter: text' });
+ }
+
+ // Check for custom API keys
+ const usingCustomKey = !!(customAnthropicKey || customOpenAIKey);
+
+ // Only check rate limit if NOT using custom keys
+ if (!usingCustomKey) {
+ const apiKey = req.headers['x-api-key'] || req.query.apiKey;
+ const limitCheck = checkLLMLimit(apiKey);
+ if (!limitCheck.allowed) {
+ return res.status(429).json({
+ error: limitCheck.error,
+ limit: limitCheck.limit,
+ used: limitCheck.used
+ });
+ }
+ }
+
+ const variantKey = variant === 'proto' ? 'proto' : 'ancien';
+
+ if (!confluentIndexes[variantKey]) {
+ return res.status(500).json({ error: `Confluent index for ${variantKey} not loaded` });
+ }
+
+ try {
+ // Step 1: Get raw word-by-word translation
+ const rawTranslation = translateConfluentToFrench(text, confluentIndexes[variantKey]);
+
+ // Step 2: Load refinement prompt
+ const refinementPrompt = fs.readFileSync(path.join(__dirname, 'prompts', 'cf2fr-refinement.txt'), 'utf-8');
+
+ // Step 3: Use LLM to refine translation
+ let refinedText;
+
+ if (provider === 'anthropic') {
+ const anthropic = new Anthropic({
+ apiKey: customAnthropicKey || process.env.ANTHROPIC_API_KEY,
+ });
+
+ const message = await anthropic.messages.create({
+ model: model,
+ max_tokens: 2048,
+ system: refinementPrompt,
+ messages: [
+ {
+ role: 'user',
+ content: `Voici la traduction brute mot-à-mot du Confluent vers le français. Transforme-la en français fluide et naturel:\n\n${rawTranslation.translation}`
+ }
+ ]
+ });
+
+ refinedText = message.content[0].text.trim();
+
+ // Track LLM usage (only increment counter if NOT using custom key)
+ const apiKey = req.headers['x-api-key'] || req.query.apiKey;
+ if (apiKey && message.usage && !usingCustomKey) {
+ trackLLMUsage(apiKey, message.usage.input_tokens, message.usage.output_tokens);
+ }
+ } else if (provider === 'openai') {
+ const openai = new OpenAI({
+ apiKey: customOpenAIKey || process.env.OPENAI_API_KEY,
+ });
+
+ const completion = await openai.chat.completions.create({
+ model: model,
+ messages: [
+ { role: 'system', content: refinementPrompt },
+ { role: 'user', content: `Voici la traduction brute mot-à-mot du Confluent vers le français. Transforme-la en français fluide et naturel:\n\n${rawTranslation.translation}` }
+ ]
+ });
+
+ refinedText = completion.choices[0].message.content.trim();
+
+ // Track LLM usage (only increment counter if NOT using custom key)
+ const apiKey = req.headers['x-api-key'] || req.query.apiKey;
+ if (apiKey && completion.usage && !usingCustomKey) {
+ trackLLMUsage(apiKey, completion.usage.prompt_tokens, completion.usage.completion_tokens);
+ }
+ } else {
+ return res.status(400).json({ error: 'Unsupported provider. Use "anthropic" or "openai".' });
+ }
+
+ // Return both raw and refined versions with detailed token info
+ res.json({
+ confluentText: text,
+ rawTranslation: rawTranslation.translation,
+ refinedTranslation: refinedText,
+ translation: refinedText, // For compatibility
+ tokens: rawTranslation.tokens || [],
+ coverage: rawTranslation.coverage || 0,
+ wordsTranslated: rawTranslation.wordsTranslated,
+ wordsNotTranslated: rawTranslation.wordsNotTranslated,
+ provider,
+ model
+ });
+
+ } catch (error) {
+ console.error('Confluent→FR LLM refinement error:', error);
+ res.status(500).json({ error: error.message });
+ }
+});
+
+// Admin routes
+const adminRoutes = require('./adminRoutes');
+app.use('/api/admin', authenticate, adminRoutes);
+
+app.listen(PORT, () => {
+ console.log(`ConfluentTranslator running on http://localhost:${PORT}`);
+ console.log(`Loaded: ${lexiques.ancien?.meta?.total_entries || 0} ancien entries, ${lexiques.proto?.meta?.total_entries || 0} proto entries`);
+});
diff --git a/ConfluentTranslator/morphologicalDecomposer.js b/ConfluentTranslator/src/core/morphology/morphologicalDecomposer.js
similarity index 99%
rename from ConfluentTranslator/morphologicalDecomposer.js
rename to ConfluentTranslator/src/core/morphology/morphologicalDecomposer.js
index 07d81be..7277724 100644
--- a/ConfluentTranslator/morphologicalDecomposer.js
+++ b/ConfluentTranslator/src/core/morphology/morphologicalDecomposer.js
@@ -2,7 +2,7 @@
// Système de décomposition morphologique pour le Confluent
// Permet de décomposer les mots composés selon le pattern Racine-Liaison-Racine
-const lexique = require('../data/lexique.json');
+const lexique = require('../../data/lexique.json');
// ============================================================================
// CHARGEMENT DYNAMIQUE DES LIAISONS DEPUIS LE LEXIQUE
diff --git a/ConfluentTranslator/radicalMatcher.js b/ConfluentTranslator/src/core/morphology/radicalMatcher.js
similarity index 98%
rename from ConfluentTranslator/radicalMatcher.js
rename to ConfluentTranslator/src/core/morphology/radicalMatcher.js
index 918757a..5bb7deb 100644
--- a/ConfluentTranslator/radicalMatcher.js
+++ b/ConfluentTranslator/src/core/morphology/radicalMatcher.js
@@ -2,7 +2,7 @@
// Système de recherche par radicaux pour le traducteur Confluent→Français
// Permet de trouver les formes conjuguées et dérivées à partir des racines
-const lexique = require('../data/lexique.json');
+const lexique = require('../../data/lexique.json');
// ============================================================================
// CHARGEMENT DYNAMIQUE DES SUFFIXES DEPUIS LE LEXIQUE
diff --git a/ConfluentTranslator/reverseIndexBuilder.js b/ConfluentTranslator/src/core/morphology/reverseIndexBuilder.js
similarity index 100%
rename from ConfluentTranslator/reverseIndexBuilder.js
rename to ConfluentTranslator/src/core/morphology/reverseIndexBuilder.js
diff --git a/ConfluentTranslator/numberConverter.js b/ConfluentTranslator/src/core/numbers/numberConverter.js
similarity index 100%
rename from ConfluentTranslator/numberConverter.js
rename to ConfluentTranslator/src/core/numbers/numberConverter.js
diff --git a/ConfluentTranslator/numberPreprocessor.js b/ConfluentTranslator/src/core/numbers/numberPreprocessor.js
similarity index 100%
rename from ConfluentTranslator/numberPreprocessor.js
rename to ConfluentTranslator/src/core/numbers/numberPreprocessor.js
diff --git a/ConfluentTranslator/confluentToFrench.js b/ConfluentTranslator/src/core/translation/confluentToFrench.js
similarity index 98%
rename from ConfluentTranslator/confluentToFrench.js
rename to ConfluentTranslator/src/core/translation/confluentToFrench.js
index 6f1b5fc..0378382 100644
--- a/ConfluentTranslator/confluentToFrench.js
+++ b/ConfluentTranslator/src/core/translation/confluentToFrench.js
@@ -9,8 +9,8 @@
* 5. Décomposition morphologique (nouveauté)
*/
-const { extractRadicals } = require('./radicalMatcher');
-const { decomposeWord } = require('./morphologicalDecomposer');
+const { extractRadicals } = require('../morphology/radicalMatcher');
+const { decomposeWord } = require('../morphology/morphologicalDecomposer');
/**
* Tokenize un texte Confluent
diff --git a/ConfluentTranslator/contextAnalyzer.js b/ConfluentTranslator/src/core/translation/contextAnalyzer.js
similarity index 99%
rename from ConfluentTranslator/contextAnalyzer.js
rename to ConfluentTranslator/src/core/translation/contextAnalyzer.js
index 7102c22..4f9e65e 100644
--- a/ConfluentTranslator/contextAnalyzer.js
+++ b/ConfluentTranslator/src/core/translation/contextAnalyzer.js
@@ -10,7 +10,7 @@
* 6. Conversion automatique des nombres français → Confluent
*/
-const { convertFrenchNumber, isNumber } = require('./numberConverter');
+const { convertFrenchNumber, isNumber } = require('../numbers/numberConverter');
/**
* FONCTION CENTRALE DE NORMALISATION
diff --git a/ConfluentTranslator/promptBuilder.js b/ConfluentTranslator/src/core/translation/promptBuilder.js
similarity index 99%
rename from ConfluentTranslator/promptBuilder.js
rename to ConfluentTranslator/src/core/translation/promptBuilder.js
index bedeeec..3b92122 100644
--- a/ConfluentTranslator/promptBuilder.js
+++ b/ConfluentTranslator/src/core/translation/promptBuilder.js
@@ -10,7 +10,7 @@
const fs = require('fs');
const path = require('path');
-const { preprocessNumbers } = require('./numberPreprocessor');
+const { preprocessNumbers } = require('../numbers/numberPreprocessor');
/**
* Charge le template de prompt de base depuis les fichiers
diff --git a/ConfluentTranslator/auth.js b/ConfluentTranslator/src/utils/auth.js
similarity index 87%
rename from ConfluentTranslator/auth.js
rename to ConfluentTranslator/src/utils/auth.js
index f17d1a3..3a66f7a 100644
--- a/ConfluentTranslator/auth.js
+++ b/ConfluentTranslator/src/utils/auth.js
@@ -33,8 +33,6 @@ function loadTokens() {
apiKey: uuidv4(),
createdAt: new Date().toISOString(),
active: true,
- requestsToday: 0,
- dailyLimit: -1, // illimité
// Tracking des tokens LLM
llmTokens: {
totalInput: 0,
@@ -44,10 +42,7 @@ function loadTokens() {
output: 0,
date: new Date().toISOString().split('T')[0]
}
- },
- // Rate limiting LLM (illimité pour admin)
- llmRequestsToday: 0,
- llmDailyLimit: -1
+ }
}
};
@@ -89,20 +84,7 @@ function authenticate(req, res, next) {
return res.status(403).json({ error: 'Token disabled' });
}
- // Vérifier la limite quotidienne
- const today = new Date().toISOString().split('T')[0];
- const tokenToday = token.lastUsed?.split('T')[0];
-
- if (tokenToday !== today) {
- token.requestsToday = 0;
- }
-
- if (token.dailyLimit > 0 && token.requestsToday >= token.dailyLimit) {
- return res.status(429).json({ error: 'Daily limit reached' });
- }
-
// Mettre à jour les stats
- token.requestsToday++;
token.lastUsed = new Date().toISOString();
saveTokens();
@@ -125,7 +107,7 @@ function requireAdmin(req, res, next) {
}
// Créer un nouveau token
-function createToken(name, role = 'user', dailyLimit = 100) {
+function createToken(name, role = 'user') {
const id = uuidv4();
const apiKey = uuidv4();
@@ -136,8 +118,6 @@ function createToken(name, role = 'user', dailyLimit = 100) {
apiKey,
createdAt: new Date().toISOString(),
active: true,
- requestsToday: 0,
- dailyLimit,
// Tracking des tokens LLM
llmTokens: {
totalInput: 0,
@@ -147,10 +127,7 @@ function createToken(name, role = 'user', dailyLimit = 100) {
output: 0,
date: new Date().toISOString().split('T')[0]
}
- },
- // Rate limiting LLM
- llmRequestsToday: 0,
- llmDailyLimit: 20
+ }
};
saveTokens();
@@ -166,8 +143,6 @@ function listTokens() {
apiKey: t.apiKey.substring(0, 8) + '...',
createdAt: t.createdAt,
active: t.active,
- requestsToday: t.requestsToday,
- dailyLimit: t.dailyLimit,
lastUsed: t.lastUsed
}));
}
@@ -210,8 +185,7 @@ function getGlobalStats() {
const tokenList = Object.values(tokens);
return {
totalTokens: tokenList.length,
- activeTokens: tokenList.filter(t => t.active).length,
- totalRequestsToday: tokenList.reduce((sum, t) => sum + t.requestsToday, 0)
+ activeTokens: tokenList.filter(t => t.active).length
};
}
@@ -225,7 +199,7 @@ function checkLLMLimit(apiKey) {
if (token.llmRequestsToday === undefined) {
token.llmRequestsToday = 0;
token.llmDailyLimit = token.role === 'admin' ? -1 : 20;
- saveTokens(); // Sauvegarder l'initialisation
+ saveTokens();
}
// Initialiser llmTokens.today.date si n'existe pas
diff --git a/ConfluentTranslator/lexiqueLoader.js b/ConfluentTranslator/src/utils/lexiqueLoader.js
similarity index 100%
rename from ConfluentTranslator/lexiqueLoader.js
rename to ConfluentTranslator/src/utils/lexiqueLoader.js
diff --git a/ConfluentTranslator/logger.js b/ConfluentTranslator/src/utils/logger.js
similarity index 100%
rename from ConfluentTranslator/logger.js
rename to ConfluentTranslator/src/utils/logger.js
diff --git a/ConfluentTranslator/rateLimiter.js b/ConfluentTranslator/src/utils/rateLimiter.js
similarity index 100%
rename from ConfluentTranslator/rateLimiter.js
rename to ConfluentTranslator/src/utils/rateLimiter.js
diff --git a/ConfluentTranslator/testsAPI/INDEX.md b/ConfluentTranslator/tests/integration/api/INDEX.md
similarity index 100%
rename from ConfluentTranslator/testsAPI/INDEX.md
rename to ConfluentTranslator/tests/integration/api/INDEX.md
diff --git a/ConfluentTranslator/testsAPI/QUICKSTART.md b/ConfluentTranslator/tests/integration/api/QUICKSTART.md
similarity index 100%
rename from ConfluentTranslator/testsAPI/QUICKSTART.md
rename to ConfluentTranslator/tests/integration/api/QUICKSTART.md
diff --git a/ConfluentTranslator/testsAPI/README.md b/ConfluentTranslator/tests/integration/api/README.md
similarity index 100%
rename from ConfluentTranslator/testsAPI/README.md
rename to ConfluentTranslator/tests/integration/api/README.md
diff --git a/ConfluentTranslator/testsAPI/STRUCTURE.txt b/ConfluentTranslator/tests/integration/api/STRUCTURE.txt
similarity index 100%
rename from ConfluentTranslator/testsAPI/STRUCTURE.txt
rename to ConfluentTranslator/tests/integration/api/STRUCTURE.txt
diff --git a/ConfluentTranslator/testsAPI/get-token.bat b/ConfluentTranslator/tests/integration/api/get-token.bat
similarity index 100%
rename from ConfluentTranslator/testsAPI/get-token.bat
rename to ConfluentTranslator/tests/integration/api/get-token.bat
diff --git a/ConfluentTranslator/testsAPI/quick-check.bat b/ConfluentTranslator/tests/integration/api/quick-check.bat
similarity index 100%
rename from ConfluentTranslator/testsAPI/quick-check.bat
rename to ConfluentTranslator/tests/integration/api/quick-check.bat
diff --git a/ConfluentTranslator/testsAPI/test-all.bat b/ConfluentTranslator/tests/integration/api/test-all.bat
similarity index 100%
rename from ConfluentTranslator/testsAPI/test-all.bat
rename to ConfluentTranslator/tests/integration/api/test-all.bat
diff --git a/ConfluentTranslator/testsAPI/test-authorized.bat b/ConfluentTranslator/tests/integration/api/test-authorized.bat
similarity index 100%
rename from ConfluentTranslator/testsAPI/test-authorized.bat
rename to ConfluentTranslator/tests/integration/api/test-authorized.bat
diff --git a/ConfluentTranslator/testsAPI/test-health.bat b/ConfluentTranslator/tests/integration/api/test-health.bat
similarity index 100%
rename from ConfluentTranslator/testsAPI/test-health.bat
rename to ConfluentTranslator/tests/integration/api/test-health.bat
diff --git a/ConfluentTranslator/testsAPI/test-unauthorized.bat b/ConfluentTranslator/tests/integration/api/test-unauthorized.bat
similarity index 100%
rename from ConfluentTranslator/testsAPI/test-unauthorized.bat
rename to ConfluentTranslator/tests/integration/api/test-unauthorized.bat
diff --git a/ConfluentTranslator/test-coverage.bat b/ConfluentTranslator/tests/scripts/test-coverage.bat
similarity index 100%
rename from ConfluentTranslator/test-coverage.bat
rename to ConfluentTranslator/tests/scripts/test-coverage.bat
diff --git a/ConfluentTranslator/test-coverage.sh b/ConfluentTranslator/tests/scripts/test-coverage.sh
similarity index 100%
rename from ConfluentTranslator/test-coverage.sh
rename to ConfluentTranslator/tests/scripts/test-coverage.sh
diff --git a/ConfluentTranslator/test-llm-refinement.bat b/ConfluentTranslator/tests/scripts/test-llm-refinement.bat
similarity index 100%
rename from ConfluentTranslator/test-llm-refinement.bat
rename to ConfluentTranslator/tests/scripts/test-llm-refinement.bat
diff --git a/ConfluentTranslator/test-reverse.bat b/ConfluentTranslator/tests/scripts/test-reverse.bat
similarity index 100%
rename from ConfluentTranslator/test-reverse.bat
rename to ConfluentTranslator/tests/scripts/test-reverse.bat
diff --git a/ConfluentTranslator/test-security.sh b/ConfluentTranslator/tests/scripts/test-security.sh
similarity index 100%
rename from ConfluentTranslator/test-security.sh
rename to ConfluentTranslator/tests/scripts/test-security.sh
diff --git a/ConfluentTranslator/debug-lemmatization.js b/ConfluentTranslator/tests/unit/debug-lemmatization.js
similarity index 100%
rename from ConfluentTranslator/debug-lemmatization.js
rename to ConfluentTranslator/tests/unit/debug-lemmatization.js
diff --git a/ConfluentTranslator/test-abstract-concepts.js b/ConfluentTranslator/tests/unit/test-abstract-concepts.js
similarity index 100%
rename from ConfluentTranslator/test-abstract-concepts.js
rename to ConfluentTranslator/tests/unit/test-abstract-concepts.js
diff --git a/ConfluentTranslator/test-accents.json b/ConfluentTranslator/tests/unit/test-accents.json
similarity index 100%
rename from ConfluentTranslator/test-accents.json
rename to ConfluentTranslator/tests/unit/test-accents.json
diff --git a/ConfluentTranslator/test-api-accents.js b/ConfluentTranslator/tests/unit/test-api-accents.js
similarity index 100%
rename from ConfluentTranslator/test-api-accents.js
rename to ConfluentTranslator/tests/unit/test-api-accents.js
diff --git a/ConfluentTranslator/test-apostrophe-fix.js b/ConfluentTranslator/tests/unit/test-apostrophe-fix.js
similarity index 100%
rename from ConfluentTranslator/test-apostrophe-fix.js
rename to ConfluentTranslator/tests/unit/test-apostrophe-fix.js
diff --git a/ConfluentTranslator/test-complexe.txt b/ConfluentTranslator/tests/unit/test-complexe.txt
similarity index 100%
rename from ConfluentTranslator/test-complexe.txt
rename to ConfluentTranslator/tests/unit/test-complexe.txt
diff --git a/ConfluentTranslator/test-context-skimming.js b/ConfluentTranslator/tests/unit/test-context-skimming.js
similarity index 100%
rename from ConfluentTranslator/test-context-skimming.js
rename to ConfluentTranslator/tests/unit/test-context-skimming.js
diff --git a/ConfluentTranslator/test-contextAnalyzer.js b/ConfluentTranslator/tests/unit/test-contextAnalyzer.js
similarity index 100%
rename from ConfluentTranslator/test-contextAnalyzer.js
rename to ConfluentTranslator/tests/unit/test-contextAnalyzer.js
diff --git a/ConfluentTranslator/test-cultural-text.js b/ConfluentTranslator/tests/unit/test-cultural-text.js
similarity index 100%
rename from ConfluentTranslator/test-cultural-text.js
rename to ConfluentTranslator/tests/unit/test-cultural-text.js
diff --git a/ConfluentTranslator/test-decomposition.js b/ConfluentTranslator/tests/unit/test-decomposition.js
similarity index 100%
rename from ConfluentTranslator/test-decomposition.js
rename to ConfluentTranslator/tests/unit/test-decomposition.js
diff --git a/ConfluentTranslator/test-find-roots.js b/ConfluentTranslator/tests/unit/test-find-roots.js
similarity index 100%
rename from ConfluentTranslator/test-find-roots.js
rename to ConfluentTranslator/tests/unit/test-find-roots.js
diff --git a/ConfluentTranslator/test-lemma-new.js b/ConfluentTranslator/tests/unit/test-lemma-new.js
similarity index 100%
rename from ConfluentTranslator/test-lemma-new.js
rename to ConfluentTranslator/tests/unit/test-lemma-new.js
diff --git a/ConfluentTranslator/test-lemmatize.json b/ConfluentTranslator/tests/unit/test-lemmatize.json
similarity index 100%
rename from ConfluentTranslator/test-lemmatize.json
rename to ConfluentTranslator/tests/unit/test-lemmatize.json
diff --git a/ConfluentTranslator/test-long-coverage.js b/ConfluentTranslator/tests/unit/test-long-coverage.js
similarity index 100%
rename from ConfluentTranslator/test-long-coverage.js
rename to ConfluentTranslator/tests/unit/test-long-coverage.js
diff --git a/ConfluentTranslator/test-marcher.json b/ConfluentTranslator/tests/unit/test-marcher.json
similarity index 100%
rename from ConfluentTranslator/test-marcher.json
rename to ConfluentTranslator/tests/unit/test-marcher.json
diff --git a/ConfluentTranslator/test-new-vocabulary.js b/ConfluentTranslator/tests/unit/test-new-vocabulary.js
similarity index 100%
rename from ConfluentTranslator/test-new-vocabulary.js
rename to ConfluentTranslator/tests/unit/test-new-vocabulary.js
diff --git a/ConfluentTranslator/test-nombres.js b/ConfluentTranslator/tests/unit/test-nombres.js
similarity index 100%
rename from ConfluentTranslator/test-nombres.js
rename to ConfluentTranslator/tests/unit/test-nombres.js
diff --git a/ConfluentTranslator/test-number-preprocessor.js b/ConfluentTranslator/tests/unit/test-number-preprocessor.js
similarity index 100%
rename from ConfluentTranslator/test-number-preprocessor.js
rename to ConfluentTranslator/tests/unit/test-number-preprocessor.js
diff --git a/ConfluentTranslator/test-observe.json b/ConfluentTranslator/tests/unit/test-observe.json
similarity index 100%
rename from ConfluentTranslator/test-observe.json
rename to ConfluentTranslator/tests/unit/test-observe.json
diff --git a/ConfluentTranslator/test-observent-seul.json b/ConfluentTranslator/tests/unit/test-observent-seul.json
similarity index 100%
rename from ConfluentTranslator/test-observent-seul.json
rename to ConfluentTranslator/tests/unit/test-observent-seul.json
diff --git a/ConfluentTranslator/test-prep.json b/ConfluentTranslator/tests/unit/test-prep.json
similarity index 100%
rename from ConfluentTranslator/test-prep.json
rename to ConfluentTranslator/tests/unit/test-prep.json
diff --git a/ConfluentTranslator/test-prompt-nombres.js b/ConfluentTranslator/tests/unit/test-prompt-nombres.js
similarity index 100%
rename from ConfluentTranslator/test-prompt-nombres.js
rename to ConfluentTranslator/tests/unit/test-prompt-nombres.js
diff --git a/ConfluentTranslator/test-promptBuilder.js b/ConfluentTranslator/tests/unit/test-promptBuilder.js
similarity index 100%
rename from ConfluentTranslator/test-promptBuilder.js
rename to ConfluentTranslator/tests/unit/test-promptBuilder.js
diff --git a/ConfluentTranslator/test-pronoun-system.js b/ConfluentTranslator/tests/unit/test-pronoun-system.js
similarity index 100%
rename from ConfluentTranslator/test-pronoun-system.js
rename to ConfluentTranslator/tests/unit/test-pronoun-system.js
diff --git a/ConfluentTranslator/test-pronouns.js b/ConfluentTranslator/tests/unit/test-pronouns.js
similarity index 100%
rename from ConfluentTranslator/test-pronouns.js
rename to ConfluentTranslator/tests/unit/test-pronouns.js
diff --git a/ConfluentTranslator/test-simple-nombre.js b/ConfluentTranslator/tests/unit/test-simple-nombre.js
similarity index 100%
rename from ConfluentTranslator/test-simple-nombre.js
rename to ConfluentTranslator/tests/unit/test-simple-nombre.js
diff --git a/ConfluentTranslator/test-voient-seul.json b/ConfluentTranslator/tests/unit/test-voient-seul.json
similarity index 100%
rename from ConfluentTranslator/test-voient-seul.json
rename to ConfluentTranslator/tests/unit/test-voient-seul.json
diff --git a/ConfluentTranslator/test-voit.json b/ConfluentTranslator/tests/unit/test-voit.json
similarity index 100%
rename from ConfluentTranslator/test-voit.json
rename to ConfluentTranslator/tests/unit/test-voit.json
diff --git a/ancien-confluent/README.md b/ancien-confluent/README.md
new file mode 100644
index 0000000..438efc5
--- /dev/null
+++ b/ancien-confluent/README.md
@@ -0,0 +1,119 @@
+# Ancien Confluent - Lexique
+
+Ce dossier contient le lexique complet de la langue Confluent dans sa version "ancien".
+
+## Structure
+
+```
+ancien-confluent/
+├── lexique/ # Fichiers JSON du lexique (31 catégories)
+│ ├── 00-grammaire.json
+│ ├── 01-racines-sacrees.json
+│ ├── 02-racines-standards.json
+│ └── ... (28 autres fichiers)
+│
+├── docs/ # Documentation générée
+│ └── LEXIQUE-COMPLET.md # Lexique complet en Markdown (généré)
+│
+├── generer-lexique-complet.js # Script de génération (Node.js)
+└── generer-lexique-complet.bat # Script pour Windows
+```
+
+## Génération du lexique complet
+
+Le lexique complet est généré automatiquement à partir des fichiers JSON.
+
+### Sous Linux/Mac/WSL
+
+```bash
+node generer-lexique-complet.js
+```
+
+### Sous Windows
+
+Double-cliquez sur `generer-lexique-complet.bat` ou exécutez :
+
+```cmd
+generer-lexique-complet.bat
+```
+
+### Résultat
+
+Le script génère le fichier `docs/LEXIQUE-COMPLET.md` qui contient :
+- Une table des matières cliquable
+- 31 catégories organisées
+- 835+ entrées de lexique
+- Pour chaque entrée :
+ - Le mot français
+ - La traduction en Confluent
+ - La forme liée (si applicable)
+ - Le type (racine sacrée, racine standard, etc.)
+ - Le domaine
+ - Les notes
+ - Les synonymes français
+
+## Format des fichiers JSON
+
+Chaque fichier JSON suit cette structure :
+
+```json
+{
+ "_comment": "Description de la catégorie",
+ "_mots_a_gerer": [],
+ "dictionnaire": {
+ "mot_francais": {
+ "traductions": [
+ {
+ "confluent": "motsconfluent",
+ "type": "racine_sacree",
+ "forme_liee": "form",
+ "domaine": "domaine_concept",
+ "note": "Note explicative"
+ }
+ ],
+ "synonymes_fr": ["synonyme1", "synonyme2"]
+ }
+ }
+}
+```
+
+## Statistiques
+
+- **31 catégories** de vocabulaire
+- **835+ entrées** au total
+- **19 racines sacrées** (commencent par une voyelle)
+- **67 racines standards**
+
+## Catégories disponibles
+
+1. Grammaire et Règles
+2. Racines Sacrées
+3. Racines Standards
+4. Castes
+5. Lieux
+6. Corps et Sens
+7. Actions
+8. Émotions
+9. Nature et Éléments
+10. Institutions
+11. Animaux
+12. Armes et Outils
+13. Concepts Abstraits
+14. Rituels
+15. Géographie
+16. Rôles et Titres
+17. Communication
+18. Temps
+19. Couleurs
+20. Santé et Dangers
+21. Objets et Matériaux
+22. Famille
+23. Nombres
+24. Nourriture
+25. Habitat
+26. Navigation
+27. Architecture
+28. Concepts Philosophiques
+29. Étrangers
+30. Actions Militaires
+31. Vêtements et Apparence
diff --git a/ancien-confluent/docs/LEXIQUE-COMPLET.md b/ancien-confluent/docs/LEXIQUE-COMPLET.md
new file mode 100644
index 0000000..858d696
--- /dev/null
+++ b/ancien-confluent/docs/LEXIQUE-COMPLET.md
@@ -0,0 +1,8456 @@
+# Lexique Complet du Confluent
+
+*Généré automatiquement le 02/12/2025 à 21:48:33*
+
+---
+
+## Table des matières
+
+- [Grammaire et Règles](#grammaire-et-regles)
+- [Racines Sacrées](#racines-sacrees)
+- [Racines Standards](#racines-standards)
+- [Castes](#castes)
+- [Lieux](#lieux)
+- [Corps et Sens](#corps-et-sens)
+- [Actions](#actions)
+- [Émotions](#emotions)
+- [Nature et Éléments](#nature-et-elements)
+- [Institutions](#institutions)
+- [Animaux](#animaux)
+- [Armes et Outils](#armes-et-outils)
+- [Concepts Abstraits](#concepts-abstraits)
+- [Rituels](#rituels)
+- [Géographie](#geographie)
+- [Rôles et Titres](#rôles-et-titres)
+- [Communication](#communication)
+- [Temps](#temps)
+- [Couleurs](#couleurs)
+- [Santé et Dangers](#sante-et-dangers)
+- [Objets et Matériaux](#objets-et-materiaux)
+- [Famille](#famille)
+- [Nombres](#nombres)
+- [Nourriture](#nourriture)
+- [Habitat](#habitat)
+- [Navigation](#navigation)
+- [Architecture](#architecture)
+- [Concepts Philosophiques](#concepts-philosophiques)
+- [Étrangers](#etrangers)
+- [Actions Militaires](#actions-militaires)
+- [Vêtements et Apparence](#vêtements-et-apparence)
+
+---
+
+## Grammaire et Règles
+
+### a
+
+**Confluent:** oape
+- Type: auxiliaire
+- Note: Il/elle a - auxiliaire avoir 3ème personne singulier
+
+*Synonymes français:* il a, elle a, on a
+
+---
+
+### aan
+
+**Confluent:** aan
+- Type: marqueur_temps
+- Note: Passé avec regret ou nostalgie
+
+---
+
+### ai
+
+**Confluent:** iku
+- Type: auxiliaire
+- Note: J'ai - auxiliaire avoir 1ère personne singulier présent
+
+*Synonymes français:* j'ai
+
+---
+
+### apres
+
+**Confluent:** alo
+- Type: particule
+- Note: Après/futur (réutilise marqueur futur ok)
+
+*Synonymes français:* après, demain, ensuite
+
+---
+
+### as
+
+**Confluent:** euma
+- Type: auxiliaire
+- Note: Tu as - auxiliaire avoir 2ème personne singulier
+
+*Synonymes français:* tu as
+
+---
+
+### at
+
+**Confluent:** at
+- Type: marqueur_temps
+- Note: Passé récent ou vécu directement
+
+*Synonymes français:* pendant
+
+---
+
+### aurai
+
+**Confluent:** ikuok
+- Type: auxiliaire
+- Note: Aurai - auxiliaire avoir futur (iku + marqueur futur ok)
+
+*Synonymes français:* j'aurai, tu auras, il aura, nous aurons, vous aurez, ils auront
+
+---
+
+### autour
+
+**Confluent:** mla
+- Type: particule
+- Note: Autour/spatial (réutilise particule locative no)
+
+*Synonymes français:* près, proche, alentour
+
+---
+
+### avais
+
+**Confluent:** ikuat
+- Type: auxiliaire
+- Note: Avais - auxiliaire avoir imparfait (iku + marqueur passé at)
+
+*Synonymes français:* j'avais, tu avais, il avait, nous avions, vous aviez, ils avaient
+
+---
+
+### avant
+
+**Confluent:** isu
+- Type: particule
+- Note: Avant/passé (réutilise marqueur passé at)
+
+*Synonymes français:* hier, auparavant
+
+---
+
+### avez
+
+**Confluent:** aila
+- Type: auxiliaire
+- Note: Vous avez - auxiliaire avoir 2ème personne pluriel
+
+*Synonymes français:* vous avez
+
+---
+
+### avons
+
+**Confluent:** uila
+- Type: auxiliaire
+- Note: Nous avons - auxiliaire avoir 1ère personne pluriel
+
+*Synonymes français:* nous avons
+
+---
+
+### ce
+
+**Confluent:** ko
+- Type: determinant
+- Note: Démonstratif (radical ko-)
+
+*Synonymes français:* cet, cette, ces
+
+---
+
+### ces
+
+**Confluent:** tovasu
+- Type: demonstratif
+- Note: Démonstratif pluriel (ces, ceux-ci)
+
+*Synonymes français:* ceux, celles
+
+---
+
+### chaque
+
+**Confluent:** oubo
+- Type: quantificateur
+- Note: Chaque, chacun (distributif)
+
+*Synonymes français:* chacun, chacune
+
+---
+
+### depuis
+
+**Confluent:** mle
+- Type: particule
+- Note: Depuis (origine temporelle) - utilise particule ve (origine)
+
+---
+
+### dessus
+
+**Confluent:** ze
+- Type: particule
+- Domaine: spatial
+- Note: Au-dessus, en haut
+
+*Synonymes français:* au-dessus, au dessus
+
+---
+
+### en
+
+**Confluent:** en
+- Type: marqueur_temps
+- Note: Ordre ou demande
+
+---
+
+### eol
+
+**Confluent:** eol
+- Type: marqueur_aspect
+- Note: Aspect habituel (fait régulièrement)
+
+---
+
+### ku
+
+**Confluent:** ku
+- Type: interrogation
+- Note: Marque l'interrogation
+
+---
+
+### leurs
+
+**Confluent:** nasu
+- Type: possessif
+- Note: Possessif 3ème personne pluriel
+
+*Synonymes français:* leur
+
+---
+
+### lo
+
+**Confluent:** lo
+- Type: particule
+- Note: Opposition ou coordination selon contexte
+
+*Synonymes français:* et, mais
+
+---
+
+### na
+
+**Confluent:** na
+- Type: particule
+- Note: Possession, origine, appartenance
+
+---
+
+### no
+
+**Confluent:** no
+- Type: particule
+- Note: Localisation spatiale
+
+*Synonymes français:* dans, sur, sous
+
+---
+
+### ok
+
+**Confluent:** ok
+- Type: marqueur_temps
+- Note: Futur ou intention volontaire
+
+---
+
+### ont
+
+**Confluent:** oolu
+- Type: auxiliaire
+- Note: Ils/elles ont - auxiliaire avoir 3ème personne pluriel
+
+*Synonymes français:* ils ont, elles ont
+
+---
+
+### qui
+
+**Confluent:** ki
+- Type: relatif
+- Note: Pronom relatif (qui, que)
+
+*Synonymes français:* que, dont
+
+---
+
+### riku
+
+**Confluent:** riku
+- Type: interrogation
+- Note: Question causale (pourquoi)
+
+---
+
+### sa
+
+**Confluent:** tla
+- Type: particule
+- Note: Possessif (réutilise particule génitif na)
+
+*Synonymes français:* son, ses, mon, ma, mes, ton, ta, tes, notre, nos, votre, vos, leur, leurs
+
+---
+
+### se
+
+**Confluent:** se
+- Type: particule
+- Note: But, bénéficiaire
+
+*Synonymes français:* pour, contre
+
+---
+
+### siku
+
+**Confluent:** siku
+- Type: interrogation
+- Note: Question de manière (comment)
+
+---
+
+### su
+
+**Confluent:** su
+- Type: marqueur_nombre
+- Note: Marque le pluriel
+
+---
+
+### taki
+
+**Confluent:** kanu
+- Type: demonstratif
+- Note: Démonstratif pour personnes
+
+---
+
+### tandis
+
+**Confluent:** ta
+- Type: particule
+- Note: Tandis que, pendant que - conjonction temporelle de simultanéité
+
+*Synonymes français:* tandis que, pendant, pendant que, alors que
+
+---
+
+### tiku
+
+**Confluent:** tiku
+- Type: interrogation
+- Note: Question temporelle (quand)
+
+---
+
+### tous
+
+**Confluent:** susu
+- Type: quantificateur
+- Domaine: quantite
+- Note: Tous, toutes, ensemble
+
+*Synonymes français:* toutes, tout, toute
+
+---
+
+### tova
+
+**Confluent:** tova
+- Type: demonstratif
+- Note: Démonstratif neutre
+
+*Synonymes français:* ceci, cela, ça, ce
+
+---
+
+### tovak
+
+**Confluent:** tovak
+- Type: verbe
+- Note: Faire cela, agir ainsi (tova + faire)
+
+*Synonymes français:* agir, faire, accomplir
+
+---
+
+### u
+
+**Confluent:** u
+- Type: marqueur_temps
+- Note: Présent ou vérité générale
+
+---
+
+### ui
+
+**Confluent:** ui
+- Type: marqueur_temps
+- Note: Forme infinitive du verbe
+
+---
+
+### ul
+
+**Confluent:** ul
+- Type: marqueur_temps
+- Note: Impossibilité, négation de capacité
+
+---
+
+### va
+
+**Confluent:** va
+- Type: particule
+- Note: Marque le sujet de la phrase
+
+---
+
+### ve
+
+**Confluent:** ve
+- Type: particule
+- Note: Origine, source (depuis)
+
+---
+
+### vi
+
+**Confluent:** vi
+- Type: particule
+- Note: Instrument, accompagnement
+
+*Synonymes français:* avec
+
+---
+
+### viku
+
+**Confluent:** psopo
+- Type: interrogation
+- Note: Question spatiale (où)
+
+---
+
+### vo
+
+**Confluent:** vo
+- Type: particule
+- Note: Marque l'objet direct
+
+---
+
+### zo
+
+**Confluent:** zo
+- Type: negation
+- Note: Négation générale
+
+*Synonymes français:* sans
+
+---
+
+### zom
+
+**Confluent:** zom
+- Type: negation
+- Note: Négation temporelle absolue (jamais)
+
+---
+
+## Racines Sacrées
+
+### aile
+
+**Confluent:** apa *(forme liée: ap)*
+- Type: racine_sacree
+- Domaine: nature_sacree
+- Note: Lié à oiseau/vol mais distinct
+
+---
+
+### ame
+
+**Confluent:** uuto *(forme liée: uut)*
+- Type: racine_sacree
+- Domaine: spirituel
+- Note: Même racine que 'esprit'
+
+*Synonymes français:* conscience
+
+---
+
+### ancetre
+
+**Confluent:** aita *(forme liée: ait)*
+- Type: racine_sacree
+- Domaine: lignee_sacree
+- Note: Ceux qui sont venus avant
+
+*Synonymes français:* ancien, aïeul, anciens, ancienne, anciennes, ancêtre, ancêtres
+
+---
+
+### aurore
+
+**Confluent:** ora *(forme liée: or)*
+- Type: racine_sacree
+- Domaine: moment_sacre
+- Note: Aube, moment de transition sacré
+
+*Synonymes français:* aube
+
+---
+
+### eau
+
+**Confluent:** ura *(forme liée: ur)*
+- Type: racine_sacree
+- Domaine: element_primordial
+- Note: Élément primordial, fluide
+
+*Synonymes français:* fluide
+
+---
+
+### epreuve
+
+**Confluent:** oki *(forme liée: ok)*
+- Type: racine_sacree
+- Domaine: conflit_sacre
+- Note: Défi, danger, test
+
+*Synonymes français:* défi, danger
+
+---
+
+### esprit
+
+**Confluent:** umi *(forme liée: um)*
+- Type: racine_sacree
+- Domaine: spirituel
+- Note: Souffle vital, essence
+
+*Synonymes français:* souffle, âme
+
+---
+
+### etoile
+
+**Confluent:** atu *(forme liée: at)*
+- Type: racine_sacree
+- Domaine: celeste
+- Note: Nouvelle racine sacrée - points lumineux du ciel nocturne
+
+---
+
+### etre
+
+**Confluent:** ita *(forme liée: it)*
+- Type: racine_sacree
+- Domaine: existence
+- Note: Exister, vivre
+
+*Synonymes français:* exister, vivre
+
+---
+
+### faucon
+
+**Confluent:** aki *(forme liée: ak)*
+- Type: racine_sacree
+- Domaine: animal_sacre
+- Note: Oiseau de proie sacré
+
+---
+
+### grue
+
+**Confluent:** alu *(forme liée: al)*
+- Type: racine_sacree
+- Domaine: animal_sacre
+- Note: Regard-Libre, animal sacré central
+
+*Synonymes français:* Regard-Libre
+
+---
+
+### libre
+
+**Confluent:** aska *(forme liée: ask)*
+- Type: racine_sacree
+- Domaine: concept_fondateur
+- Note: Concept central de la civilisation
+
+*Synonymes français:* liberté
+
+---
+
+### mort
+
+**Confluent:** osi *(forme liée: os)*
+- Type: racine_sacree
+- Domaine: existence
+- Note: Nouvelle racine sacrée - fin de l'existence
+
+*Synonymes français:* mourir, trépas
+
+---
+
+### oiseau
+
+**Confluent:** apo *(forme liée: ap)*
+- Type: racine_sacree
+- Domaine: nature_sacree
+- Note: Vol, créature ailée
+
+*Synonymes français:* vol
+
+---
+
+### origine
+
+**Confluent:** ena *(forme liée: en)*
+- Type: racine_sacree
+- Domaine: dimension
+- Note: Source, naissance, commencement
+
+*Synonymes français:* source, naissance
+
+---
+
+### sacre
+
+**Confluent:** asa *(forme liée: as)*
+- Type: racine_sacree
+- Domaine: spirituel
+- Note: Ce qui est intouchable, divin
+
+*Synonymes français:* divin, saint, sacrés, sacrée, sacrées, sacré
+
+---
+
+### son
+
+**Confluent:** onu *(forme liée: on)*
+- Type: racine_sacree
+- Domaine: rituel
+- Note: Vibration, lié aux rhombes sacrés
+
+*Synonymes français:* vibration
+
+---
+
+### tout
+
+**Confluent:** eka *(forme liée: ek)*
+- Type: racine_sacree
+- Domaine: dimension
+- Note: Totalité, entièreté
+
+*Synonymes français:* entier, totalité
+
+---
+
+### un
+
+**Confluent:** iko *(forme liée: ik)*
+- Type: racine_sacree
+- Domaine: concept_fondateur
+- Note: Unicité, premier nombre
+
+*Synonymes français:* unique, seul
+
+---
+
+## Racines Standards
+
+### assemblee
+
+**Confluent:** kotaitoli
+- Type: composition
+- Composition: `kot-a-toli`
+- Domaine: institution
+
+---
+
+### bas
+
+**Confluent:** baso *(forme liée: bas)*
+- Type: racine
+- Domaine: qualificatif
+- Note: Bas, inférieur (opposé de haut)
+
+*Synonymes français:* basse, basses
+
+---
+
+### bois
+
+**Confluent:** viku *(forme liée: vik)*
+- Type: racine
+- Domaine: materiau
+- Note: Même racine que forêt/arbre
+
+---
+
+### bois_materiau
+
+**Confluent:** vito *(forme liée: vit)*
+- Type: racine
+- Domaine: materiau
+- Note: Bois (matériau de construction) - distinct de viku (forêt)
+
+*Synonymes français:* bois de construction
+
+---
+
+### bon
+
+**Confluent:** tosa *(forme liée: tos)*
+- Type: racine
+- Domaine: concept_abstrait
+- Note: Bien, positif
+
+*Synonymes français:* bien
+
+---
+
+### cendre
+
+**Confluent:** senu *(forme liée: sen)*
+- Type: racine
+- Domaine: materiau
+- Note: Nouvelle racine - reste du feu
+
+---
+
+### charge
+
+**Confluent:** saki *(forme liée: sak)*
+- Type: racine
+- Domaine: action
+- Note: Charge, fardeau, ce qu'on porte
+
+*Synonymes français:* fardeau, cargaison
+
+---
+
+### chaud
+
+**Confluent:** suka *(forme liée: suk)*
+- Type: racine
+- Domaine: qualificatif
+- Note: Chaud, chaleureux (lié à feu)
+
+*Synonymes français:* chaude, chauds, chaudes, chaleur
+
+---
+
+### ciel
+
+**Confluent:** zeru *(forme liée: zer)*
+- Type: racine
+- Domaine: nature
+- Note: Ciel, voûte céleste - utilisé dans Ciels-clairs
+
+*Synonymes français:* voûte céleste, firmament
+
+---
+
+### clair
+
+**Confluent:** sora *(forme liée: sor)*
+- Type: racine
+- Domaine: qualificatif
+- Note: Clair, lumineux (lié à lumière)
+
+*Synonymes français:* claire, clairs, claires, lumineux, lumineuse
+
+---
+
+### corde
+
+**Confluent:** kopu *(forme liée: kop)*
+- Type: racine
+- Domaine: outil
+- Note: Nouvelle racine - lien tressé
+
+---
+
+### couleur
+
+**Confluent:** kolu *(forme liée: kol)*
+- Type: racine
+- Domaine: perception
+- Note: Nouvelle racine - teinte visible
+
+---
+
+### demeurer
+
+**Confluent:** tuli *(forme liée: tul)*
+- Type: racine
+- Domaine: etat
+- Note: Être, rester, demeurer - du finnois 'tulla'
+
+*Synonymes français:* rester, être, habiter
+
+---
+
+### duree
+
+**Confluent:** aika *(forme liée: aik)*
+- Type: racine_sacree
+- Domaine: temporel
+- Note: Temps, durée, époque - du finnois 'aika'
+
+*Synonymes français:* temps, époque, ère
+
+---
+
+### echanger
+
+**Confluent:** kilu *(forme liée: kil)*
+- Type: racine
+- Domaine: action
+- Note: Troquer, commercer
+
+*Synonymes français:* troquer
+
+---
+
+### faim
+
+**Confluent:** muta *(forme liée: mut)*
+- Type: racine
+- Domaine: besoin
+- Note: Faim, manque, besoin de nourriture
+
+*Synonymes français:* manque, privation
+
+---
+
+### frapper
+
+**Confluent:** bopak *(forme liée: bop)*
+- Type: verbe
+- Domaine: action
+
+---
+
+### froid
+
+**Confluent:** kiso *(forme liée: kis)*
+- Type: racine
+- Domaine: qualificatif
+- Note: Froid, frais, glacé
+
+*Synonymes français:* froide, froids, froides, frais, fraîche
+
+---
+
+### garder
+
+**Confluent:** konu *(forme liée: kon)*
+- Type: racine
+- Domaine: action
+- Note: Garder, protéger, maintenir - racine sécuritaire
+
+*Synonymes français:* protéger, maintenir, défendre
+
+---
+
+### grand
+
+**Confluent:** mako *(forme liée: mak)*
+- Type: racine
+- Domaine: qualificatif
+- Note: Vaste, important
+
+*Synonymes français:* vaste, grande, grands, grandes
+
+---
+
+### gris
+
+**Confluent:** bkula *(forme liée: bkul)*
+- Type: racine
+- Domaine: couleur
+- Note: Même racine que cendre
+
+---
+
+### guerre
+
+**Confluent:** uovi *(forme liée: uov)*
+- Type: racine_sacree
+- Domaine: conflit
+- Note: Même racine que épreuve/défi
+
+*Synonymes français:* combat
+
+---
+
+### honteux
+
+**Confluent:** paka *(forme liée: pak)*
+- Type: racine
+- Domaine: qualificatif
+- Note: Honteux, indigne, déshonorant - inspiration basque
+
+*Synonymes français:* indigne, déshonorant, infâme
+
+---
+
+### intimite
+
+**Confluent:** supu *(forme liée: sup)*
+- Type: racine
+- Domaine: espace
+- Note: Intérieur, intimité, espace privé
+
+*Synonymes français:* intérieur, privé
+
+---
+
+### lait
+
+**Confluent:** milu *(forme liée: mil)*
+- Type: racine
+- Domaine: materiau
+- Note: Nouvelle racine - fluide blanc nourricier
+
+---
+
+### lent
+
+**Confluent:** telu *(forme liée: tel)*
+- Type: racine
+- Domaine: qualificatif
+- Note: Lent, sans hâte
+
+*Synonymes français:* lente, lents, lentes, lentement
+
+---
+
+### lieu
+
+**Confluent:** plozi *(forme liée: ploz)*
+- Type: racine
+- Domaine: espace
+- Note: Endroit, place
+
+*Synonymes français:* endroit
+
+---
+
+### ligne
+
+**Confluent:** linu *(forme liée: lin)*
+- Type: racine
+- Domaine: forme
+- Note: Nouvelle racine - trait
+
+---
+
+### loi
+
+**Confluent:** loku *(forme liée: lok)*
+- Type: racine
+- Domaine: institution
+- Note: Nouvelle racine - règle fixée
+
+*Synonymes français:* règle
+
+---
+
+### long
+
+**Confluent:** lono *(forme liée: lon)*
+- Type: racine
+- Domaine: qualificatif
+- Note: Long, étendu (opposé de court)
+
+*Synonymes français:* longue, longs, longues
+
+---
+
+### mauvais
+
+**Confluent:** taku *(forme liée: tak)*
+- Type: racine
+- Domaine: qualificatif
+- Note: Mauvais, négatif (opposé de bon)
+
+*Synonymes français:* mauvaise, mauvaises, mal
+
+---
+
+### memoire
+
+**Confluent:** memu *(forme liée: mem)*
+- Type: racine
+- Domaine: concept_abstrait
+- Note: Nouvelle racine - ce qu'on retient
+
+*Synonymes français:* souvenir
+
+---
+
+### mer
+
+**Confluent:** melu *(forme liée: mel)*
+- Type: racine
+- Domaine: geographie
+- Note: Nouvelle racine - grande eau salée
+
+---
+
+### navire
+
+**Confluent:** vanu *(forme liée: nav)*
+- Type: racine
+- Domaine: objet
+- Note: Nouvelle racine - embarcation
+
+---
+
+### nourriture
+
+**Confluent:** nutu *(forme liée: nut)*
+- Type: racine
+- Domaine: alimentation
+- Note: Nourriture, aliment - racine fondamentale
+
+*Synonymes français:* aliment, manger
+
+---
+
+### nouveau
+
+**Confluent:** nuvi *(forme liée: nov)*
+- Type: racine
+- Domaine: qualificatif
+- Note: Jeune, récent
+
+*Synonymes français:* jeune, nouvelle, nouveaux, nouvelles
+
+---
+
+### paix
+
+**Confluent:** lsezi *(forme liée: lsez)*
+- Type: racine
+- Domaine: etat
+- Note: Même racine que 'bon' - état bon
+
+*Synonymes français:* calme
+
+---
+
+### personne
+
+**Confluent:** toli *(forme liée: tol)*
+- Type: racine
+- Domaine: social
+- Note: Personne, agent, individu - utilisé dans tous les rôles
+
+*Synonymes français:* agent, individu
+
+---
+
+### petit
+
+**Confluent:** pisu *(forme liée: pis)*
+- Type: racine
+- Domaine: qualificatif
+- Note: Fin, menu
+
+*Synonymes français:* fin, petite, petits, petites
+
+---
+
+### pointe
+
+**Confluent:** piki *(forme liée: pik)*
+- Type: racine
+- Domaine: forme
+- Note: Extrémité aiguë
+
+---
+
+### poison
+
+**Confluent:** toku *(forme liée: tok)*
+- Type: racine
+- Domaine: danger
+- Note: Nouvelle racine - substance mortelle
+
+---
+
+### poisson
+
+**Confluent:** ltiti *(forme liée: ltit)*
+- Type: racine
+- Domaine: animal
+- Note: Nouvelle racine - créature de l'eau
+
+---
+
+### pont
+
+**Confluent:** vasi *(forme liée: vas)*
+- Type: racine
+- Domaine: structure
+- Note: Lien, passage entre deux
+
+*Synonymes français:* lien, passage
+
+---
+
+### presage
+
+**Confluent:** novi *(forme liée: nov)*
+- Type: racine
+- Domaine: concept
+- Note: Présage, signe du futur
+
+*Synonymes français:* augure, signe
+
+---
+
+### rapide
+
+**Confluent:** kazo *(forme liée: kaz)*
+- Type: racine
+- Domaine: qualificatif
+- Note: Rapide, vif
+
+*Synonymes français:* rapides, rapidement, vif, vifs, vive, vives
+
+---
+
+### recit
+
+**Confluent:** vokiaita
+- Type: composition
+- Composition: `vok-i-aita`
+- Domaine: communication
+
+*Synonymes français:* histoire
+
+---
+
+### rouge
+
+**Confluent:** kzunu *(forme liée: kzun)*
+- Type: racine
+- Domaine: couleur
+- Note: Couleur du sang, yeux des Ciels-clairs
+
+---
+
+### route
+
+**Confluent:** teki *(forme liée: tek)*
+- Type: racine
+- Domaine: lieu
+- Note: Chemin, voie
+
+---
+
+### sac
+
+**Confluent:** saku *(forme liée: sak)*
+- Type: racine
+- Domaine: objet
+- Note: Nouvelle racine - contenant souple
+
+*Synonymes français:* contenant
+
+---
+
+### sale
+
+**Confluent:** selu *(forme liée: sel)*
+- Type: racine
+- Domaine: qualificatif
+- Note: Salé, eau salée - distinct de salu (sel cristal)
+
+*Synonymes français:* salé, saumâtre
+
+---
+
+### sang
+
+**Confluent:** pasu *(forme liée: ras)*
+- Type: racine
+- Domaine: corps
+- Note: Fluide vital rouge
+
+---
+
+### secret
+
+**Confluent:** zoku *(forme liée: zok)*
+- Type: racine
+- Domaine: communication
+- Note: Nouvelle racine - ce qui est caché
+
+---
+
+### sel
+
+**Confluent:** salu *(forme liée: sal)*
+- Type: racine
+- Domaine: materiau
+- Note: Nouvelle racine - cristal marin
+
+---
+
+### serpent
+
+**Confluent:** sepu *(forme liée: sep)*
+- Type: racine
+- Domaine: animal
+- Note: Nouvelle racine - créature rampante
+
+---
+
+### signe
+
+**Confluent:** sili *(forme liée: sil)*
+- Type: racine
+- Domaine: communication
+- Note: Lié à regard - ce qu'on montre
+
+*Synonymes français:* marque
+
+---
+
+### sombre
+
+**Confluent:** kumu *(forme liée: kum)*
+- Type: racine
+- Domaine: qualificatif
+- Note: Obscur, sans lumière
+
+*Synonymes français:* obscur, sombres
+
+---
+
+### sommet
+
+**Confluent:** tasa *(forme liée: tas)*
+- Type: racine
+- Domaine: geographie
+- Note: Même racine que montagne - point haut
+
+---
+
+### souvenir
+
+**Confluent:** nemu *(forme liée: nem)*
+- Type: racine
+- Domaine: mental
+- Note: Mémoire, souvenir - distinct de memu (mémoire collective)
+
+*Synonymes français:* mémoire, rappel
+
+---
+
+### tablette
+
+**Confluent:** tabu *(forme liée: tab)*
+- Type: racine
+- Domaine: objet
+- Note: Nouvelle racine - surface plate pour écrire
+
+---
+
+### temps
+
+**Confluent:** temi *(forme liée: tem)*
+- Type: racine
+- Domaine: temps
+- Note: Nouvelle racine - durée
+
+*Synonymes français:* durée
+
+---
+
+### tombe
+
+**Confluent:** osiiutoka
+- Type: composition
+- Composition: `os-i-toka`
+- Domaine: lieu
+
+---
+
+### travail
+
+**Confluent:** neka *(forme liée: nek)*
+- Type: racine
+- Domaine: action
+- Note: Même racine que faire/créer
+
+*Synonymes français:* œuvre
+
+---
+
+### tribu
+
+**Confluent:** kota *(forme liée: kot)*
+- Type: racine
+- Domaine: social
+- Note: Même racine que union/confluence
+
+---
+
+### valeur
+
+**Confluent:** vbite *(forme liée: vbit)*
+- Type: racine
+- Domaine: concept_abstrait
+- Note: Nouvelle racine - mérite
+
+*Synonymes français:* mérite
+
+---
+
+### vallee
+
+**Confluent:** valu *(forme liée: val)*
+- Type: racine
+- Domaine: geographie
+- Note: Nouvelle racine - creux entre montagnes
+
+---
+
+### vieux
+
+**Confluent:** eabme *(forme liée: eabm)*
+- Type: racine_sacree
+- Domaine: qualificatif
+- Note: Même racine que ancêtre
+
+*Synonymes français:* âgé, vieille, vieilles
+
+---
+
+### vrai
+
+**Confluent:** veli *(forme liée: vel)*
+- Type: racine
+- Domaine: concept_abstrait
+- Note: Racine fondamentale
+
+*Synonymes français:* vérité
+
+---
+
+## Castes
+
+### Ailes-Grises
+
+**Confluent:** aliaska
+- Type: nom_propre
+- Composition: `al-i-aska`
+- Note: Dresseurs de grues, chamans
+
+---
+
+### Akoazana
+
+**Confluent:** oekovabpo
+- Type: nom_propre
+- Composition: `ak-oa-zana`
+
+---
+
+### Aliaska
+
+**Confluent:** iatozupi
+- Type: nom_propre
+- Composition: `al-i-aska`
+
+---
+
+### Caste de l'Air
+
+**Confluent:** venaakota
+- Type: composition
+- Composition: `ven-aa-kota`
+
+---
+
+### Caste de l'Eau
+
+**Confluent:** uraakota
+- Type: composition
+- Composition: `ur-aa-kota`
+- Note: Même nom que La Confluence
+
+---
+
+### Caste de l'Ether
+
+**Confluent:** umiaakota
+- Type: composition
+- Composition: `um-aa-kota`
+
+---
+
+### Caste de la Terre
+
+**Confluent:** tokaakota
+- Type: composition
+- Composition: `tok-aa-kota`
+
+---
+
+### Caste du Feu
+
+**Confluent:** sukiaakota
+- Type: composition
+- Composition: `suk-aa-kota`
+
+---
+
+### Ciels-clairs
+
+**Confluent:** zerusora
+- Type: composition
+- Composition: `zer-u-sora`
+- Note: Nés sous ciel dégagé, yeux aux couleurs de l'aurore
+
+---
+
+### Enfants des Echos
+
+**Confluent:** nakukeko
+- Type: nom_propre
+- Composition: `nak-u-keko`
+- Note: Souterrains, mineurs, artisans
+
+---
+
+### Enfants du Courant
+
+**Confluent:** nakuura
+- Type: nom_propre
+- Composition: `nak-u-ura`
+- Note: Pêcheurs, villages sur pilotis
+
+---
+
+### Faucons Chasseurs
+
+**Confluent:** akoazana
+- Type: nom_propre
+- Composition: `ak-oa-zana`
+- Note: Élite militaire et judiciaire
+
+---
+
+### Gardiens de la Confluence
+
+**Confluent:** zakiulaakota
+- Type: composition
+- Composition: `zak-i-ulaakota`
+
+---
+
+### Nakukeko
+
+**Confluent:** nnukamuke
+- Type: nom_propre
+- Composition: `nak-u-keko`
+
+---
+
+### Nakuura
+
+**Confluent:** psununzo
+- Type: nom_propre
+- Composition: `nak-u-ura`
+
+---
+
+### Oraumi
+
+**Confluent:** oakegze
+- Type: nom_propre
+- Composition: `or-a-umi`
+
+---
+
+### Passes-bien
+
+**Confluent:** kanutosa
+- Type: nom_propre
+- Composition: `tak-i-tosa`
+- Note: Marchands, médiateurs
+
+---
+
+### Sans-ciels
+
+**Confluent:** zozelu
+- Type: composition
+- Composition: `zo-zelu`
+- Note: Nés sous ciel couvert
+
+---
+
+### Siliaska
+
+**Confluent:** siliaska
+- Type: nom_propre
+- Composition: `sil-i-aska`
+- Note: Nom du peuple de la Confluence
+
+*Synonymes français:* peuple, Les porteurs du regard libre
+
+---
+
+### Takitosa
+
+**Confluent:** lkosegusa
+- Type: nom_propre
+- Composition: `tak-i-tosa`
+
+---
+
+### Voix de l'Aurore
+
+**Confluent:** oraumi
+- Type: nom_propre
+- Composition: `or-a-umi`
+- Note: Chamans, gardiens des lois sacrées
+
+---
+
+### echos
+
+**Confluent:** keko
+- Type: racine
+- Note: Écho, résonance (racine extraite de Nakukeko)
+
+*Synonymes français:* echo
+
+---
+
+### peuple
+
+**Confluent:** mkisusonu
+- Type: nom_propre
+- Composition: `sil-i-aska`
+
+---
+
+## Lieux
+
+### Antres des Echos
+
+**Confluent:** kekutoka
+- Type: nom_propre
+- Composition: `kek-u-toka`
+- Note: Grottes souterraines
+
+---
+
+### Cercles de Vigile
+
+**Confluent:** sikuvela
+- Type: nom_propre
+- Composition: `sik-u-vela`
+- Note: Promontoires de guet
+
+---
+
+### Ekakova
+
+**Confluent:** aolulatu
+- Type: nom_propre
+- Composition: `ek-a-kova`
+
+---
+
+### Gorge Profonde
+
+**Confluent:** vukumako
+- Type: composition
+- Composition: `vuk-u-mako`
+
+---
+
+### Gouffre Humide
+
+**Confluent:** vukuura
+- Type: nom_propre
+- Composition: `vuk-u-ura`
+- Note: Lieu sacré souterrain
+
+---
+
+### Grande Fresque
+
+**Confluent:** ekakova
+- Type: nom_propre
+- Composition: `ek-a-kova`
+- Note: Artefact multi-générationnel
+
+---
+
+### Halls des Serments
+
+**Confluent:** talusavu
+- Type: nom_propre
+- Composition: `tal-u-savu`
+- Note: Structures gouvernementales
+
+---
+
+### Kekutoka
+
+**Confluent:** klikubozi
+- Type: nom_propre
+- Composition: `kek-u-toka`
+
+---
+
+### La Confluence
+
+**Confluent:** eamutusbo
+- Type: nom_propre
+- Composition: `ur-aa-kota`
+- Note: Lieu central où deux rivières se rejoignent
+
+---
+
+### Ruines des Premiers Ancetres
+
+**Confluent:** osiuaita
+- Type: composition
+- Composition: `os-i-aita`
+- Note: Vestiges de la civilisation disparue
+
+---
+
+### Sikuvela
+
+**Confluent:** nbabosove
+- Type: nom_propre
+- Composition: `sik-u-vela`
+
+---
+
+### Talusavu
+
+**Confluent:** bpotekike
+- Type: nom_propre
+- Composition: `tal-u-savu`
+
+---
+
+### Uraakota
+
+**Confluent:** ielalulte
+- Type: nom_propre
+- Composition: `ur-aa-kota`
+
+---
+
+### Vukuura
+
+**Confluent:** vmavekna
+- Type: nom_propre
+- Composition: `vuk-u-ura`
+
+---
+
+### antre
+
+**Confluent:** keku *(forme liée: kek)*
+- Type: racine
+- Domaine: lieu
+- Note: Caverne, grotte profonde
+
+*Synonymes français:* antres, caverne, cavernes, grotte, grottes
+
+---
+
+### avant-poste cotier
+
+**Confluent:** velaumelu
+- Type: composition
+- Composition: `vel-a-melu`
+
+---
+
+### basses-terres
+
+**Confluent:** tokuvuku
+- Type: composition
+- Composition: `tok-u-vuku`
+
+---
+
+### forteresse
+
+**Confluent:** zakiukali
+- Type: composition
+- Composition: `zak-i-kali`
+
+---
+
+### sanctuaire
+
+**Confluent:** asauloku
+- Type: composition
+- Composition: `as-a-loku`
+
+---
+
+### village fortifie
+
+**Confluent:** kotauzaki
+- Type: composition
+- Composition: `kot-a-zaki`
+
+---
+
+## Corps et Sens
+
+### bouche
+
+**Confluent:** vokumu
+- Type: composition
+- Composition: `vok-umu`
+- Domaine: corps_sens
+- Note: Organe de la parole et de l'alimentation
+
+---
+
+### bras
+
+**Confluent:** kanuvi
+- Type: composition
+- Composition: `kan-u-vi`
+- Domaine: corps
+- Note: Membre supérieur jusqu'à la main
+
+---
+
+### chair
+
+**Confluent:** bbuke *(forme liée: bbuk)*
+- Type: racine
+- Domaine: corps
+- Note: Même racine que corps
+
+*Synonymes français:* viande
+
+---
+
+### corps
+
+**Confluent:** sanu *(forme liée: san)*
+- Type: racine
+- Domaine: corps_sens
+- Note: Enveloppe physique
+
+---
+
+### cou
+
+**Confluent:** mutuvasi
+- Type: composition
+- Composition: `mutu-vasi`
+- Domaine: corps
+- Note: Lien entre tête et corps
+
+---
+
+### crâne
+
+**Confluent:** mututalu
+- Type: composition
+- Composition: `mutu-talu`
+- Domaine: corps
+- Note: Os de la tête
+
+---
+
+### côte
+
+**Confluent:** taluvi
+- Type: composition
+- Composition: `tal-u-vi`
+- Domaine: corps
+- Note: Os du thorax
+
+*Synonymes français:* côtes
+
+---
+
+### cœur
+
+**Confluent:** kori *(forme liée: kor)*
+- Type: racine
+- Domaine: corps_sens
+- Note: Centre vital et émotionnel
+
+---
+
+### dent
+
+**Confluent:** bitu *(forme liée: bit)*
+- Type: racine
+- Domaine: corps
+- Note: Organe pour mordre et mâcher
+
+*Synonymes français:* dents
+
+---
+
+### doigt
+
+**Confluent:** kanupisu
+- Type: composition
+- Composition: `kan-u-pisu`
+- Domaine: corps
+- Note: Extrémité de la main
+
+*Synonymes français:* doigts
+
+---
+
+### dos
+
+**Confluent:** sanuvoli
+- Type: composition
+- Composition: `san-u-voli`
+- Domaine: corps
+- Note: Face postérieure
+
+---
+
+### echo
+
+**Confluent:** bmipe *(forme liée: bmip)*
+- Type: racine
+- Domaine: corps_sens
+- Note: Son qui revient, résonance
+
+*Synonymes français:* résonance
+
+---
+
+### estomac
+
+**Confluent:** nutukovu
+- Type: composition
+- Composition: `nutu-kovu`
+- Domaine: corps
+- Note: Organe digestif
+
+---
+
+### foie
+
+**Confluent:** sanukoli
+- Type: composition
+- Composition: `san-u-koli`
+- Domaine: corps
+- Note: Organe vital interne
+
+---
+
+### front
+
+**Confluent:** mukamako
+- Type: composition
+- Composition: `muka-mako`
+- Domaine: corps
+- Note: Partie supérieure du visage
+
+---
+
+### jambe
+
+**Confluent:** pekuvi
+- Type: composition
+- Composition: `pek-u-vi`
+- Domaine: corps
+- Note: Membre inférieur jusqu'au pied
+
+*Synonymes français:* jambes
+
+---
+
+### joue
+
+**Confluent:** mukavi
+- Type: composition
+- Composition: `muka-vi`
+- Domaine: corps
+- Note: Côté du visage
+
+*Synonymes français:* joues
+
+---
+
+### langue
+
+**Confluent:** vokivi
+- Type: composition
+- Composition: `voki-vi`
+- Domaine: corps
+- Note: Organe dans la bouche (distinct de langue=langage)
+
+*Synonymes français:* langue organe
+
+---
+
+### main
+
+**Confluent:** sbove *(forme liée: sbov)*
+- Type: racine
+- Domaine: corps_sens
+- Note: Partie du corps pour saisir
+
+---
+
+### menton
+
+**Confluent:** mukavuku
+- Type: composition
+- Composition: `muka-vuku`
+- Domaine: corps
+- Note: Partie inférieure du visage
+
+---
+
+### nez
+
+**Confluent:** venu
+- Type: composition
+- Composition: `ven-u`
+- Domaine: corps_sens
+- Note: Organe de l'odorat et de la respiration
+
+---
+
+### oreille
+
+**Confluent:** bpivu *(forme liée: bpiv)*
+- Type: racine
+- Domaine: corps_sens
+- Note: Organe de l'écoute
+
+*Synonymes français:* écoute
+
+---
+
+### orteil
+
+**Confluent:** pekupisu
+- Type: composition
+- Composition: `pek-u-pisu`
+- Domaine: corps
+- Note: Extrémité du pied
+
+*Synonymes français:* orteils
+
+---
+
+### os
+
+**Confluent:** talu *(forme liée: tal)*
+- Type: racine
+- Domaine: corps
+- Note: Structure dure interne du corps
+
+---
+
+### peau
+
+**Confluent:** veku *(forme liée: vek)*
+- Type: racine
+- Domaine: corps
+- Note: Surface, enveloppe extérieure
+
+*Synonymes français:* surface
+
+---
+
+### pied
+
+**Confluent:** peki *(forme liée: pek)*
+- Type: racine
+- Domaine: corps_sens
+- Note: Base, appui
+
+*Synonymes français:* base
+
+---
+
+### poumon
+
+**Confluent:** venusanu
+- Type: composition
+- Composition: `ven-u-sanu`
+- Domaine: corps
+
+---
+
+### sang
+
+**Confluent:** mnake *(forme liée: mnak)*
+- Type: racine
+- Domaine: corps
+- Note: Fluide vital rouge
+
+---
+
+### souffle
+
+**Confluent:** eila *(forme liée: eil)*
+- Type: racine_sacree
+- Domaine: corps_esprit
+- Note: Même racine que esprit
+
+---
+
+### squelette
+
+**Confluent:** talusanu
+- Type: composition
+- Composition: `tal-u-sanu`
+- Domaine: corps
+- Note: Ensemble des os
+
+---
+
+### tête
+
+**Confluent:** muto *(forme liée: mut)*
+- Type: racine
+- Domaine: corps
+- Note: Sommet du corps, partie supérieure
+
+*Synonymes français:* crâne, chef
+
+---
+
+### ventre
+
+**Confluent:** nutusanu
+- Type: composition
+- Composition: `nutu-sanu`
+- Domaine: corps
+- Note: Abdomen, partie centrale
+
+*Synonymes français:* abdomen
+
+---
+
+### visage
+
+**Confluent:** muka *(forme liée: muk)*
+- Type: racine
+- Domaine: corps_sens
+- Note: Face, ce qu'on montre
+
+---
+
+### voix
+
+**Confluent:** voki *(forme liée: vok)*
+- Type: racine
+- Domaine: corps_sens
+- Note: Organe de la parole
+
+*Synonymes français:* parole
+
+---
+
+### yeux de l'aurore
+
+**Confluent:** siluola
+- Type: composition
+- Composition: `sil-u-ola`
+- Domaine: corps_sacre
+- Note: Yeux des Ciels-clairs aux couleurs de l'aurore
+
+---
+
+### épaule
+
+**Confluent:** kanuvasi
+- Type: composition
+- Composition: `kan-u-vasi`
+- Domaine: corps
+- Note: Jonction bras-corps
+
+*Synonymes français:* épaules
+
+---
+
+### œil
+
+**Confluent:** spima *(forme liée: spim)*
+- Type: racine
+- Domaine: corps_sens
+- Note: Concept central : l'observation
+
+*Synonymes français:* regard, vision, yeux
+
+---
+
+## Actions
+
+### aimer
+
+**Confluent:** kolis *(forme liée: kol)*
+- Type: verbe
+- Domaine: action_emotion
+- Note: Verbe d'amour (du cœur kori)
+
+*Synonymes français:* aime, aimes, aimons, aimez, aiment, aimais, aimait, aimions, aimiez, aimaient, aimant, aimé
+
+---
+
+### aller
+
+**Confluent:** tekis *(forme liée: tek)*
+- Type: verbe
+- Domaine: action
+- Note: Mouvement, chemin
+
+*Synonymes français:* va, vas, vais, vont, allons, allez, allais, allait, allions, alliez, allaient, allant, allé, irai, iras, ira, irons, irez, iront, aille, ailles, aillent, aillions, ailliez
+
+---
+
+### apprendre
+
+**Confluent:** mokis *(forme liée: mok)*
+- Type: verbe
+- Domaine: action
+- Note: Recevoir le savoir
+
+*Synonymes français:* apprennent, appris
+
+---
+
+### arbitrer
+
+**Confluent:** velim *(forme liée: vel)*
+- Type: verbe
+- Domaine: action_justice
+- Note: Juger selon la vérité
+
+---
+
+### assembler
+
+**Confluent:** kotak *(forme liée: kot)*
+- Type: verbe
+- Domaine: action_artisanale
+
+---
+
+### attaquer
+
+**Confluent:** okiak *(forme liée: ok)*
+- Type: verbe
+- Domaine: action_combat
+
+---
+
+### battre
+
+**Confluent:** pulum *(forme liée: pul)*
+- Type: verbe
+- Domaine: action
+- Note: Battre (cœur), pulser, rythme vital
+
+*Synonymes français:* bat, bats, battons, battez, battent, battais, battait, battions, battiez, battaient, battant, battu
+
+---
+
+### benir
+
+**Confluent:** asak *(forme liée: as)*
+- Type: verbe
+- Domaine: action_spirituelle
+
+*Synonymes français:* bénit
+
+---
+
+### capturer
+
+**Confluent:** pasik *(forme liée: pas)*
+- Type: verbe
+- Domaine: action_combat
+
+---
+
+### chasser
+
+**Confluent:** zanak *(forme liée: zan)*
+- Type: verbe
+- Domaine: action
+
+*Synonymes français:* traquer, chasse, chasses, chassons, chassez, chassent, chassais, chassait, chassions, chassiez, chassaient, chassant, chassé
+
+---
+
+### communier
+
+**Confluent:** kotam *(forme liée: kot)*
+- Type: verbe
+- Domaine: action_spirituelle
+- Note: S'unir spirituellement
+
+---
+
+### construire
+
+**Confluent:** nekis *(forme liée: nek)*
+- Type: verbe
+- Domaine: action_artisanale
+
+*Synonymes français:* construisent, construit
+
+---
+
+### couler
+
+**Confluent:** kulak *(forme liée: kul)*
+- Type: verbe
+- Domaine: action
+- Note: Couler, s'écouler - lié à l'eau
+
+*Synonymes français:* coule, coules, coulons, coulez, coulent, coulais, coulait, coulions, couliez, coulaient, coulant, coulé
+
+---
+
+### courir
+
+**Confluent:** kazok *(forme liée: kaz)*
+- Type: verbe
+- Domaine: action
+- Note: Courir, se déplacer rapidement
+
+*Synonymes français:* cours, court, courons, courez, courent, courais, courait, courions, couriez, couraient, courant, couru
+
+---
+
+### creuser
+
+**Confluent:** vukan *(forme liée: vuk)*
+- Type: verbe
+- Domaine: action_artisanale
+
+---
+
+### decouvrir
+
+**Confluent:** milis *(forme liée: mil)*
+- Type: verbe
+- Domaine: action
+- Note: Voir pour la première fois
+
+*Synonymes français:* explorer, découvert
+
+---
+
+### defendre
+
+**Confluent:** zakam *(forme liée: zak)*
+- Type: verbe
+- Domaine: action_combat
+
+*Synonymes français:* défendent, défendu
+
+---
+
+### devoir
+
+**Confluent:** nekas *(forme liée: nek)*
+- Type: verbe
+- Domaine: action_obligation
+- Note: Être obligé de, avoir l'obligation (lié à œuvre/tâche)
+
+*Synonymes français:* dois, doit, devons, devez, doivent, devais, devait, devions, deviez, devaient, devant, dû, due, dus, dues
+
+---
+
+### devorer
+
+**Confluent:** mukiuzana
+- Type: composition
+- Composition: `muk-i-zana`
+- Domaine: action
+- Note: Manger violemment, comme un prédateur
+
+---
+
+### dire
+
+**Confluent:** vosak *(forme liée: vos)*
+- Type: verbe
+- Domaine: action
+
+*Synonymes français:* parler, dites, dit, murmurer, murmure, murmures, murmurons, murmurez, murmurent, chuchoter
+
+---
+
+### donner
+
+**Confluent:** kitan *(forme liée: kit)*
+- Type: verbe
+- Domaine: action
+
+---
+
+### ecouter
+
+**Confluent:** tikam *(forme liée: tik)*
+- Type: verbe
+- Domaine: action
+
+---
+
+### entreposer
+
+**Confluent:** zakun *(forme liée: zak)*
+- Type: verbe
+- Domaine: action_commerce
+
+---
+
+### etudier
+
+**Confluent:** sekis *(forme liée: sek)*
+- Type: verbe
+- Domaine: action
+
+---
+
+### exister
+
+**Confluent:** zunop *(forme liée: zuno)*
+- Type: verbe_irregulier
+- Domaine: action_existentielle
+- Note: Verbe irrégulier existentiel - 'il y a', présence, existence. Dérivé de la racine sacrée 'ura' (eau/flux vital)
+
+*Synonymes français:* il y a, y a-t-il, existe, existent, existant
+
+---
+
+### faire
+
+**Confluent:** nekan *(forme liée: nek)*
+- Type: verbe
+- Domaine: action
+
+*Synonymes français:* créer, font, ferai, feras, fera, ferons, ferez, feront
+
+---
+
+### forger
+
+**Confluent:** sukam *(forme liée: suk)*
+- Type: verbe
+- Domaine: action_artisanale
+- Note: Travailler par le feu
+
+---
+
+### fuir
+
+**Confluent:** tekun *(forme liée: tek)*
+- Type: verbe
+- Domaine: action_combat
+
+*Synonymes français:* fuient, fuyent
+
+---
+
+### garder
+
+**Confluent:** zakis *(forme liée: zak)*
+- Type: verbe
+- Domaine: action
+
+*Synonymes français:* protéger
+
+---
+
+### graver
+
+**Confluent:** kovak *(forme liée: kov)*
+- Type: verbe
+- Domaine: action_artisanale
+
+*Synonymes français:* sculpter
+
+---
+
+### interpreter
+
+**Confluent:** sekun *(forme liée: sek)*
+- Type: verbe
+- Domaine: action
+
+---
+
+### invoquer
+
+**Confluent:** onak *(forme liée: on)*
+- Type: verbe
+- Domaine: action_spirituelle
+- Note: Utiliser le son sacré
+
+---
+
+### manger
+
+**Confluent:** mukis *(forme liée: muk)*
+- Type: verbe
+- Domaine: action
+- Note: Consommer de la nourriture
+
+*Synonymes français:* mange, manges, mangeons, mangez, mangent, mangeais, mangeait, mangions, mangiez, mangeaient, mangeant, mangé
+
+---
+
+### marcher
+
+**Confluent:** tekam *(forme liée: tek)*
+- Type: verbe
+- Domaine: action
+- Note: Marcher, se déplacer à pied
+
+*Synonymes français:* marche, marches, marchons, marchez, marchent, marchais, marchait, marchions, marchiez, marchaient, marchant, marché
+
+---
+
+### mediter
+
+**Confluent:** umiak *(forme liée: um)*
+- Type: verbe
+- Domaine: action_spirituelle
+- Note: Verbe sacré dérivé de 'esprit'
+
+*Synonymes français:* prier
+
+---
+
+### memoriser
+
+**Confluent:** memak *(forme liée: mem)*
+- Type: verbe
+- Domaine: action
+
+---
+
+### mourir
+
+**Confluent:** osiak *(forme liée: os)*
+- Type: verbe
+- Domaine: action_sacree
+
+*Synonymes français:* meurent, mort
+
+---
+
+### pecher
+
+**Confluent:** pisak *(forme liée: pis)*
+- Type: verbe
+- Domaine: action
+- Note: Chasser dans l'eau
+
+---
+
+### peindre
+
+**Confluent:** kovam *(forme liée: kov)*
+- Type: verbe
+- Domaine: action_artisanale
+- Note: Même racine que graver - art visuel
+
+*Synonymes français:* peignent, peint
+
+---
+
+### penser
+
+**Confluent:** umis *(forme liée: um)*
+- Type: verbe
+- Domaine: action_cognitive
+- Note: Penser, réfléchir - activité mentale (même racine que méditer)
+
+*Synonymes français:* réfléchir, pense, penses, pensons, pensez, pensent, pensais, pensait, pensions, pensiez, pensaient, pensant, pensé, réfléchis, réfléchit, réfléchissons, réfléchissez, réfléchissent, réfléchissais, réfléchissait, réfléchissions, réfléchissiez, réfléchissaient, réfléchissant, réfléchi
+
+---
+
+### planer
+
+**Confluent:** aliuk *(forme liée: ali)*
+- Type: verbe
+- Domaine: action
+- Note: Voler, planer dans les airs
+
+*Synonymes français:* planer, plane, planes, planons, planez, planent, planais, planait, planions, planiez, planaient, planant, plané
+
+---
+
+### porter
+
+**Confluent:** takan *(forme liée: tak)*
+- Type: verbe
+- Domaine: action
+
+*Synonymes français:* transporter
+
+---
+
+### pouvoir
+
+**Confluent:** polas *(forme liée: pol)*
+- Type: verbe
+- Domaine: action_capacite
+- Note: Avoir la capacité de
+
+*Synonymes français:* peux, peut, pouvons, pouvez, peuvent, pouvais, pouvait, pouvions, pouviez, pouvaient, pouvant, pu
+
+---
+
+### prendre
+
+**Confluent:** pasak *(forme liée: pas)*
+- Type: verbe
+- Domaine: action
+
+*Synonymes français:* prennent, pris, prisse
+
+---
+
+### rejoindre
+
+**Confluent:** kotan *(forme liée: kot)*
+- Type: verbe
+- Domaine: action
+- Note: Rejoindre, se réunir
+
+*Synonymes français:* rejoindre, rejoinds, rejoint, rejoignons, rejoignez, rejoignent, rejoignais, rejoignait, rejoignions, rejoigniez, rejoignaient, rejoignant, rejoint
+
+---
+
+### reposer
+
+**Confluent:** tokas *(forme liée: tok)*
+- Type: verbe
+- Domaine: action_fondement
+- Note: Reposer sur, être fondé sur (lié à toka=lieu/base)
+
+*Synonymes français:* repose, reposes, reposons, reposez, reposent, reposais, reposait, reposions, reposiez, reposaient, reposant, reposé, être fondé, se fonder
+
+---
+
+### resonner
+
+**Confluent:** kekak *(forme liée: kek)*
+- Type: verbe
+- Domaine: action
+- Note: Résonner, faire écho
+
+*Synonymes français:* résonner, résonne, résonnes, résonnons, résonnez, résonnent, résonnais, résonnait, résonnions, résonniez, résonnaient, résonnant, résonné
+
+---
+
+### savoir
+
+**Confluent:** sekam *(forme liée: sek)*
+- Type: verbe
+- Domaine: action
+
+*Synonymes français:* connaître, savent, su, sache, saches, sachent, sachions, sachiez, comprendre, comprends, comprenons, comprenez, comprennent
+
+---
+
+### surveiller
+
+**Confluent:** velak *(forme liée: vel)*
+- Type: verbe
+- Domaine: action_combat
+
+*Synonymes français:* veiller, veille, veilles, veillons, veillez, veillent, veillais, veillait, veillions, veilliez, veillaient, veillant, veillé, surveille, surveilles, surveillons, surveillez, surveillent, surveillais, surveillait, surveillions, surveilliez, surveillaient, surveillant, surveillé
+
+---
+
+### tisser
+
+**Confluent:** vasin *(forme liée: vas)*
+- Type: verbe
+- Domaine: action_artisanale
+- Note: Lier des fils ensemble
+
+---
+
+### transmettre
+
+**Confluent:** kisun *(forme liée: kis)*
+- Type: verbe
+- Domaine: action
+- Note: Enseigner, passer le savoir
+
+*Synonymes français:* enseigner, transmet, transmets, transmettons, transmettez, transmettent, transmettais, transmettait, transmettions, transmettez, transmettaient, transmettant, transmis
+
+---
+
+### troquer
+
+**Confluent:** kilak *(forme liée: kil)*
+- Type: verbe
+- Domaine: action_commerce
+
+---
+
+### vaincre
+
+**Confluent:** okian *(forme liée: ok)*
+- Type: verbe
+- Domaine: action_combat
+
+*Synonymes français:* vainquent, vaincu
+
+---
+
+### voir
+
+**Confluent:** milak *(forme liée: mil)*
+- Type: verbe
+- Domaine: action
+- Note: Verbe fondamental lié à l'observation
+
+*Synonymes français:* observer, regarder, regarde, regardes, regardons, regardez, regardent, regardais, regardait, regardions, regardiez, regardaient, regardant, regardé, vois, voit, voyons, voyez, voient, voyais, voyait, voyions, voyiez, voyaient, voyant, vu, vus, vue, vues
+
+---
+
+### voler
+
+**Confluent:** vemep *(forme liée: veme)*
+- Type: verbe
+- Domaine: action
+- Note: Voler, s'envoler, planer dans les airs
+
+*Synonymes français:* vole, voles, volons, volez, volent, volais, volait, volions, voliez, volaient, volant, volé, s'envoler, envole, envoles, envolons, envolez, envolent
+
+---
+
+## Émotions
+
+### amour
+
+**Confluent:** koliukota
+- Type: composition
+- Composition: `kol-i-kota`
+- Domaine: emotion_positive
+
+---
+
+### angoisse
+
+**Confluent:** kolioavuku
+- Type: composition
+- Composition: `kol-oa-vuku`
+- Domaine: emotion_negative
+
+*Synonymes français:* anxiété
+
+---
+
+### colere
+
+**Confluent:** koliusuki
+- Type: composition
+- Composition: `kol-i-suki`
+- Domaine: emotion_negative
+
+---
+
+### confiance
+
+**Confluent:** koliuveli
+- Type: composition
+- Composition: `kol-i-veli`
+- Domaine: emotion_positive
+
+---
+
+### curiosite
+
+**Confluent:** koliusili
+- Type: composition
+- Composition: `kol-i-sili`
+- Domaine: emotion_positive
+
+---
+
+### desespoir
+
+**Confluent:** kolizoola
+- Type: composition
+- Composition: `kol-i-zo-ola`
+- Domaine: emotion_negative
+
+---
+
+### espoir
+
+**Confluent:** koliuola
+- Type: composition
+- Composition: `kol-i-ola`
+- Domaine: emotion_positive
+
+---
+
+### fierte
+
+**Confluent:** koliumako
+- Type: composition
+- Composition: `kol-i-mako`
+- Domaine: emotion_positive
+
+---
+
+### gratitude
+
+**Confluent:** koliukita
+- Type: composition
+- Composition: `kol-i-kitan`
+- Domaine: emotion_positive
+
+---
+
+### haine
+
+**Confluent:** koliuzoka
+- Type: composition
+- Composition: `kol-i-zoka`
+- Domaine: emotion_negative
+
+---
+
+### honte
+
+**Confluent:** kolioakumu
+- Type: composition
+- Composition: `kol-oa-kumu`
+- Domaine: emotion_negative
+
+---
+
+### jalousie
+
+**Confluent:** kolioakilu
+- Type: composition
+- Composition: `kol-oa-kilu`
+- Domaine: emotion_negative
+
+---
+
+### joie
+
+**Confluent:** koliatosa
+- Type: composition
+- Composition: `kol-i-a-tosa`
+- Domaine: emotion_positive
+- Note: Composition standard pour exprimer les émotions
+
+*Synonymes français:* bonheur, allégresse
+
+---
+
+### mefiance
+
+**Confluent:** kolizoveli
+- Type: composition
+- Composition: `kol-i-zo-veli`
+- Domaine: emotion_negative
+
+---
+
+### peur
+
+**Confluent:** kolioaoki
+- Type: composition
+- Composition: `kol-oa-oki`
+- Domaine: emotion_negative
+
+---
+
+### regret
+
+**Confluent:** kolioaaita
+- Type: composition
+- Composition: `kol-oa-aita`
+- Domaine: emotion_negative
+
+---
+
+### serenite
+
+**Confluent:** koliuula
+- Type: composition
+- Composition: `kol-i-ula`
+- Domaine: emotion_positive
+- Note: Calme comme l'eau
+
+---
+
+### soulagement
+
+**Confluent:** nkupatapmu
+- Type: composition
+- Composition: `kol-i-tosa`
+- Domaine: emotion_positive
+- Note: Retour au bien après tension
+
+---
+
+### tristesse
+
+**Confluent:** kolioaosi
+- Type: composition
+- Composition: `kol-oa-osi`
+- Domaine: emotion_negative
+
+---
+
+## Nature et Éléments
+
+### air
+
+**Confluent:** vena *(forme liée: ven)*
+- Type: racine
+- Domaine: element_nature
+- Note: Élément primordial
+
+*Synonymes français:* vent
+
+---
+
+### arbre
+
+**Confluent:** vtese *(forme liée: vtes)*
+- Type: racine
+- Domaine: nature
+- Note: Plante haute
+
+---
+
+### cascade
+
+**Confluent:** ulaoavuku
+- Type: composition
+- Composition: `ul-oa-vuku`
+- Domaine: geographie
+
+---
+
+### cercle
+
+**Confluent:** mvitu *(forme liée: mvit)*
+- Type: racine
+- Domaine: forme
+- Note: Forme sacrée
+
+*Synonymes français:* anneau
+
+---
+
+### ciel
+
+**Confluent:** zelu *(forme liée: zel)*
+- Type: racine
+- Domaine: element_nature
+- Note: Élément primordial
+
+*Synonymes français:* cieux
+
+---
+
+### confluence de rivieres
+
+**Confluent:** nulaakota
+- Type: composition
+- Composition: `nul-aa-kota`
+- Domaine: geographie
+
+---
+
+### cote
+
+**Confluent:** tokumelu
+- Type: composition
+- Composition: `tok-u-melu`
+- Domaine: geographie
+
+---
+
+### crevasse
+
+**Confluent:** vukukali
+- Type: composition
+- Composition: `vuk-u-kali`
+- Domaine: geographie
+
+---
+
+### etoile
+
+**Confluent:** aoni *(forme liée: aon)*
+- Type: racine_sacree
+- Domaine: celeste
+- Note: Points lumineux du ciel nocturne
+
+---
+
+### feu
+
+**Confluent:** suki *(forme liée: suk)*
+- Type: racine
+- Domaine: element_nature
+- Note: Élément primordial
+
+*Synonymes français:* flamme
+
+---
+
+### foret
+
+**Confluent:** zbipo *(forme liée: zbip)*
+- Type: racine
+- Domaine: geographie
+- Note: Beaucoup d'arbres
+
+---
+
+### grotte
+
+**Confluent:** vukutoka
+- Type: composition
+- Composition: `vuk-u-toka`
+- Domaine: geographie
+
+---
+
+### horizon
+
+**Confluent:** zelutoka
+- Type: composition
+- Composition: `zel-u-toka`
+- Domaine: geographie
+
+---
+
+### humide
+
+**Confluent:** nisa *(forme liée: nis)*
+- Type: racine
+- Domaine: qualite
+- Note: Avec eau
+
+*Synonymes français:* mouillé
+
+---
+
+### lumiere
+
+**Confluent:** tbime *(forme liée: tbim)*
+- Type: racine
+- Domaine: perception
+- Note: Même racine que soleil
+
+---
+
+### lune
+
+**Confluent:** luna *(forme liée: lun)*
+- Type: racine
+- Domaine: celeste
+- Note: Astre nocturne
+
+---
+
+### mer
+
+**Confluent:** kzumi *(forme liée: kzum)*
+- Type: racine
+- Domaine: geographie
+- Note: Grande eau salée
+
+---
+
+### montagne
+
+**Confluent:** lnosu *(forme liée: lnos)*
+- Type: racine
+- Domaine: geographie
+- Note: Haute terre
+
+---
+
+### nuage
+
+**Confluent:** nubu *(forme liée: nub)*
+- Type: racine
+- Domaine: celeste
+- Note: Vapeur du ciel
+
+---
+
+### pic
+
+**Confluent:** tasupiki
+- Type: composition
+- Composition: `tas-u-piki`
+- Domaine: geographie
+
+*Synonymes français:* cime
+
+---
+
+### pierre
+
+**Confluent:** kali *(forme liée: kal)*
+- Type: racine
+- Domaine: element_nature
+- Note: Matière dure
+
+*Synonymes français:* roche
+
+---
+
+### profond
+
+**Confluent:** vuku *(forme liée: vuk)*
+- Type: racine
+- Domaine: qualite
+- Note: Gouffre, abîme
+
+*Synonymes français:* gouffre, abîme
+
+---
+
+### promontoire
+
+**Confluent:** tasumelu
+- Type: composition
+- Composition: `tas-u-melu`
+- Domaine: geographie
+
+---
+
+### riviere
+
+**Confluent:** nula *(forme liée: nul)*
+- Type: racine
+- Domaine: geographie
+- Note: Eau qui coule
+
+*Synonymes français:* courant
+
+---
+
+### riviere azur
+
+**Confluent:** nuluzelu
+- Type: composition
+- Composition: `nul-u-zelu`
+- Domaine: geographie
+
+---
+
+### riviere verte
+
+**Confluent:** nuluviku
+- Type: composition
+- Composition: `nul-u-viku`
+- Domaine: geographie
+
+---
+
+### sec
+
+**Confluent:** seku *(forme liée: sek)*
+- Type: racine
+- Domaine: qualite
+- Note: Sans eau
+
+*Synonymes français:* aride
+
+---
+
+### sel
+
+**Confluent:** ztozi *(forme liée: ztoz)*
+- Type: racine
+- Domaine: materiau
+- Note: Cristal marin
+
+---
+
+### soleil
+
+**Confluent:** mkaso *(forme liée: mkas)*
+- Type: racine
+- Domaine: celeste
+- Note: Astre du jour
+
+---
+
+### sombre
+
+**Confluent:** vtasi *(forme liée: vtas)*
+- Type: racine
+- Domaine: perception
+- Note: Sans lumière
+
+*Synonymes français:* obscur
+
+---
+
+### source
+
+**Confluent:** enuula
+- Type: composition
+- Composition: `en-u-ula`
+- Domaine: geographie
+
+---
+
+### tempete
+
+**Confluent:** venaoki
+- Type: composition
+- Composition: `ven-a-oki`
+- Domaine: meteo
+
+---
+
+### terre
+
+**Confluent:** toka *(forme liée: tok)*
+- Type: racine
+- Domaine: element_nature
+- Note: Sol, terre ferme
+
+*Synonymes français:* sol
+
+---
+
+### vallee
+
+**Confluent:** pbali *(forme liée: pbal)*
+- Type: racine
+- Domaine: geographie
+- Note: Creux entre montagnes
+
+---
+
+## Institutions
+
+### Arbitre des Esprits
+
+**Confluent:** zakiiumi
+- Type: nom_propre
+- Composition: `zak-ii-umi`
+- Note: Entité tutélaire du jeu, pouvoir de réserve
+
+---
+
+### Assemblee des Chefs
+
+**Confluent:** kotaukasi
+- Type: nom_propre
+- Composition: `kot-a-kasi`
+
+---
+
+### Autel ancestral
+
+**Confluent:** asauaita
+- Type: composition
+- Composition: `as-a-aita`
+
+---
+
+### Cercle des Sages
+
+**Confluent:** likuusekitoli
+- Type: nom_propre
+- Composition: `sik-u-sek-i-toli`
+- Note: Institution centrale
+
+---
+
+### Conseil du Village
+
+**Confluent:** kotaulikusi
+- Type: composition
+- Composition: `kot-a-sik-u-si`
+
+---
+
+### Directoire
+
+**Confluent:** kasiiukota
+- Type: nom_propre
+- Composition: `kas-ii-kota`
+
+---
+
+### Hall des Serments
+
+**Confluent:** szuvozeni
+- Type: nom_propre
+- Composition: `tal-u-savu`
+
+---
+
+### Jour des Ancetres
+
+**Confluent:** solauaita
+- Type: composition
+- Composition: `sol-a-aita`
+
+---
+
+### Jour du Faucon
+
+**Confluent:** solauaki
+- Type: composition
+- Composition: `sol-a-aki`
+
+---
+
+### Maison des Decouvertes
+
+**Confluent:** nutuumili
+- Type: nom_propre
+- Composition: `nut-u-milis`
+
+---
+
+### Proclamateur
+
+**Confluent:** zzulosika
+- Type: nom_propre
+- Composition: `vok-i-eka`
+
+---
+
+### Tribunal des Mœurs
+
+**Confluent:** velimuloku
+- Type: nom_propre
+- Composition: `vel-i-m-loku`
+
+---
+
+### Vigile Lunaire
+
+**Confluent:** velauluna
+- Type: composition
+- Composition: `vel-a-luna`
+
+---
+
+## Animaux
+
+### Regards-Libres
+
+**Confluent:** aluaska
+- Type: composition
+- Composition: `al-u-aska`
+- Note: Grues domestiquées, messagers sacrés
+
+---
+
+### bete
+
+**Confluent:** betu *(forme liée: bet)*
+- Type: racine
+- Domaine: animal
+- Note: Animal générique
+
+*Synonymes français:* animal
+
+---
+
+### bete sacree
+
+**Confluent:** asaubetu
+- Type: composition
+- Composition: `as-a-betu`
+
+---
+
+### creature inconnue
+
+**Confluent:** zomila
+- Type: composition
+- Composition: `zo-mila`
+- Domaine: animal
+- Note: Créature jamais observée
+
+---
+
+### faucon
+
+**Confluent:** euto *(forme liée: eut)*
+- Type: racine_sacree
+- Domaine: animal_sacre
+- Note: Oiseau de proie sacré
+
+---
+
+### gibier
+
+**Confluent:** zanubetu
+- Type: composition
+- Composition: `zan-u-betu`
+- Domaine: animal
+
+---
+
+### grue
+
+**Confluent:** iena *(forme liée: ien)*
+- Type: racine_sacree
+- Domaine: animal_sacre
+- Note: Animal sacré central dans la culture
+
+*Synonymes français:* grues
+
+---
+
+### grue cendree
+
+**Confluent:** alusenu
+- Type: composition
+- Composition: `al-u-senu`
+
+---
+
+### loup
+
+**Confluent:** ltute *(forme liée: ltut)*
+- Type: racine
+- Domaine: animal
+- Note: Prédateur sauvage
+
+---
+
+### meute
+
+**Confluent:** lokusu
+- Type: composition
+- Composition: `loku + su`
+- Domaine: animal
+
+---
+
+### oiseau
+
+**Confluent:** ioze *(forme liée: ioz)*
+- Type: racine_sacree
+- Domaine: animal
+- Note: Créature ailée
+
+---
+
+### oiseau de proie
+
+**Confluent:** aviuzana
+- Type: composition
+- Composition: `ap-i-zana`
+- Domaine: animal
+
+---
+
+### poisson
+
+**Confluent:** mzoti *(forme liée: mzot)*
+- Type: racine
+- Domaine: animal
+- Note: Créature de l'eau
+
+---
+
+### poisson de riviere
+
+**Confluent:** pisunula
+- Type: composition
+- Composition: `pis-u-nula`
+- Domaine: animal
+
+---
+
+### serpent
+
+**Confluent:** btite *(forme liée: btit)*
+- Type: racine
+- Domaine: animal
+- Note: Créature rampante
+
+---
+
+### serpent d'eau
+
+**Confluent:** sepuula
+- Type: composition
+- Composition: `sep-u-ula`
+- Domaine: animal
+
+---
+
+## Armes et Outils
+
+### arc
+
+**Confluent:** arku *(forme liée: ark)*
+- Type: racine
+- Domaine: arme
+- Note: Nouvelle racine - arme de jet
+
+---
+
+### armurerie
+
+**Confluent:** lokuupiki
+- Type: composition
+- Composition: `lok-u-piki`
+- Domaine: structure
+
+---
+
+### bouclier
+
+**Confluent:** zakikali
+- Type: composition
+- Composition: `zak-i-kali`
+- Domaine: arme
+
+---
+
+### burin
+
+**Confluent:** kovupiki
+- Type: composition
+- Composition: `kov-u-piki`
+- Domaine: outil
+
+---
+
+### ciseau a pierre
+
+**Confluent:** kovukali
+- Type: composition
+- Composition: `kov-u-kali`
+- Domaine: outil
+
+---
+
+### coffret
+
+**Confluent:** sakuzaki
+- Type: composition
+- Composition: `sak-u-zaki`
+- Domaine: objet
+
+---
+
+### collier
+
+**Confluent:** kopuuveki
+- Type: composition
+- Composition: `kop-u-vek-i`
+- Domaine: objet
+
+---
+
+### corde
+
+**Confluent:** vkiza *(forme liée: vkiz)*
+- Type: racine
+- Domaine: outil
+- Note: Lien tressé
+
+---
+
+### couteau
+
+**Confluent:** kutupisu
+- Type: composition
+- Composition: `kut-u-pisu`
+- Domaine: outil
+
+---
+
+### filet
+
+**Confluent:** kopuupisu
+- Type: composition
+- Composition: `kop-u-pisu`
+- Domaine: outil
+
+---
+
+### fleche
+
+**Confluent:** pikiuarku
+- Type: composition
+- Composition: `pik-i-alk`
+- Domaine: arme
+
+---
+
+### fleche empoisonnee
+
+**Confluent:** pikiutoku
+- Type: composition
+- Composition: `pik-i-toku`
+- Domaine: arme
+
+---
+
+### foyer
+
+**Confluent:** sukiuloku
+- Type: composition
+- Composition: `suk-i-loku`
+- Domaine: structure
+
+---
+
+### foyer eternel
+
+**Confluent:** sukiueka
+- Type: composition
+- Composition: `suk-i-eka`
+- Domaine: objet_sacre
+
+---
+
+### gourdin
+
+**Confluent:** bopuviku
+- Type: composition
+- Composition: `bop-u-viku`
+- Domaine: arme
+
+---
+
+### grenier
+
+**Confluent:** lokuzaki
+- Type: composition
+- Composition: `lok-u-zaki`
+- Domaine: structure
+
+---
+
+### hachette
+
+**Confluent:** kutu *(forme liée: kut)*
+- Type: racine
+- Domaine: outil
+- Note: Lame pour couper
+
+---
+
+### lance
+
+**Confluent:** skulo *(forme liée: skul)*
+- Type: racine
+- Domaine: arme
+- Note: Arme principale
+
+*Synonymes français:* pointe
+
+---
+
+### lance de guerre
+
+**Confluent:** pikiuoki
+- Type: composition
+- Composition: `pik-i-oki`
+- Domaine: arme
+
+---
+
+### maillet
+
+**Confluent:** bopukali
+- Type: composition
+- Composition: `bop-u-kali`
+- Domaine: outil
+
+---
+
+### panier
+
+**Confluent:** sakuvasi
+- Type: composition
+- Composition: `sak-u-vasi`
+- Domaine: outil
+
+---
+
+### piege
+
+**Confluent:** zokuuzana
+- Type: composition
+- Composition: `zok-u-zana`
+- Domaine: outil
+
+---
+
+### pioche
+
+**Confluent:** zkumopubo
+- Type: composition
+- Composition: `vuk-u-kali`
+- Domaine: outil
+
+---
+
+### tablette
+
+**Confluent:** pkesa *(forme liée: pkes)*
+- Type: racine
+- Domaine: objet
+- Note: Surface pour écrire
+
+---
+
+### tablette gravee
+
+**Confluent:** tabuukova
+- Type: composition
+- Composition: `tab-u-kova`
+- Domaine: objet
+
+---
+
+### vase rituel
+
+**Confluent:** sakuuasa
+- Type: composition
+- Composition: `sak-u-asa`
+- Domaine: objet_rituel
+
+---
+
+## Concepts Abstraits
+
+### L'Autre
+
+**Confluent:** vvobu
+- Type: nom_propre
+- Composition: `tova`
+- Domaine: social
+- Note: L'étranger, celui qui n'est pas du peuple
+
+*Synonymes français:* étranger
+
+---
+
+### Premiers Ancetres
+
+**Confluent:** iusoluke
+- Type: nom_propre
+- Composition: `en-u-aita`
+- Domaine: spirituel
+
+---
+
+### benediction
+
+**Confluent:** asautosa
+- Type: composition
+- Composition: `as-a-tosa`
+- Domaine: spirituel
+
+---
+
+### caste
+
+**Confluent:** kotauneki
+- Type: composition
+- Composition: `kot-a-neka`
+- Domaine: social
+
+---
+
+### civilisation
+
+**Confluent:** ulaikota
+- Type: composition
+- Composition: `ula-i-kota`
+- Domaine: concept_fondateur
+- Note: Civilisation - l'union des gens qui vivent ensemble (ura=eau/vie + i=agentivité + kota=confluence/union)
+
+*Synonymes français:* civilisations, société
+
+---
+
+### competence
+
+**Confluent:** sekautosa
+- Type: composition
+- Composition: `sek-a-tosa`
+- Domaine: concept_abstrait
+
+---
+
+### confluence
+
+**Confluent:** psate *(forme liée: psat)*
+- Type: racine
+- Domaine: concept_fondateur
+- Note: Union, rencontre
+
+*Synonymes français:* union
+
+---
+
+### connaissance
+
+**Confluent:** sekamemu
+- Type: composition
+- Composition: `seka-memu`
+- Domaine: concept_fondateur
+- Note: Connaissance - le savoir gardé en mémoire (seka=savoir + memu=mémoire)
+
+*Synonymes français:* connaissances, science, érudition
+
+---
+
+### culture
+
+**Confluent:** aitatoka
+- Type: composition
+- Composition: `aita-toka`
+- Domaine: concept_fondateur
+- Note: Culture - les lieux/traditions des ancêtres transmis (aita=ancêtres + toka=lieux)
+
+*Synonymes français:* cultures, patrimoine
+
+---
+
+### defaite
+
+**Confluent:** okiazoka
+- Type: composition
+- Composition: `ok-i-a-zoka`
+- Domaine: conflit
+
+---
+
+### destinee
+
+**Confluent:** tekiuumi
+- Type: composition
+- Composition: `tek-i-umi`
+- Domaine: concept_abstrait
+
+---
+
+### devoir sacre
+
+**Confluent:** asauneka
+- Type: composition
+- Composition: `as-a-neka`
+- Domaine: concept_abstrait
+
+---
+
+### embuscade
+
+**Confluent:** vsivapepke
+- Type: composition
+- Composition: `zok-u-zana`
+- Domaine: conflit
+
+---
+
+### ennemi
+
+**Confluent:** zoka *(forme liée: zok)*
+- Type: racine
+- Domaine: conflit
+- Note: Adversaire, hostile, mal
+
+*Synonymes français:* adversaire, hostile, malveillant
+
+---
+
+### epreuve
+
+**Confluent:** uuno *(forme liée: uun)*
+- Type: racine_sacree
+- Domaine: concept_fondateur
+
+---
+
+### epreuve de verite
+
+**Confluent:** okiuveli
+- Type: composition
+- Composition: `ok-i-veli`
+- Domaine: institution
+
+---
+
+### esprit
+
+**Confluent:** oelu *(forme liée: oel)*
+- Type: racine_sacree
+- Domaine: concept_fondateur
+
+*Synonymes français:* âme
+
+---
+
+### exil
+
+**Confluent:** zokota
+- Type: composition
+- Composition: `zo-kota`
+- Domaine: concept_negatif
+
+---
+
+### famille
+
+**Confluent:** mitu *(forme liée: mit)*
+- Type: racine
+- Domaine: social
+- Note: Groupe de sang
+
+*Synonymes français:* clan
+
+---
+
+### genealogie
+
+**Confluent:** mituuaita
+- Type: composition
+- Composition: `mit-u-aita`
+- Domaine: social
+
+---
+
+### guerre
+
+**Confluent:** ouso *(forme liée: ous)*
+- Type: racine_sacree
+- Domaine: conflit
+
+---
+
+### harmonie
+
+**Confluent:** kotautosa
+- Type: composition
+- Composition: `kot-a-tosa`
+- Domaine: concept_abstrait
+
+---
+
+### honneur
+
+**Confluent:** valuuveli
+- Type: composition
+- Composition: `val-u-veli`
+- Domaine: concept_abstrait
+
+---
+
+### justice
+
+**Confluent:** veliukota
+- Type: composition
+- Composition: `vel-i-kota`
+- Domaine: concept_abstrait
+
+---
+
+### liberte
+
+**Confluent:** oabsi *(forme liée: oabs)*
+- Type: racine_sacree
+- Domaine: concept_fondateur
+
+---
+
+### liberté
+
+**Confluent:** eilne *(forme liée: eiln)*
+- Type: racine_sacree
+- Domaine: concept_fondateur
+- Note: Liberté - racine sacrée centrale (synonyme normalisé de liberte)
+
+*Synonymes français:* liberte, libre, affranchissement
+
+---
+
+### loi
+
+**Confluent:** bmumu *(forme liée: bmum)*
+- Type: racine
+- Domaine: institution
+
+---
+
+### loi sacree
+
+**Confluent:** lokuuasa
+- Type: composition
+- Composition: `lok-u-asa`
+- Domaine: institution
+
+---
+
+### malediction
+
+**Confluent:** asauzoka
+- Type: composition
+- Composition: `as-a-zoka`
+- Domaine: spirituel
+
+---
+
+### meurtre
+
+**Confluent:** osiakuzoka
+- Type: composition
+- Composition: `os-i-a-zoka`
+- Domaine: concept_negatif
+
+---
+
+### miasmes
+
+**Confluent:** venuzoka
+- Type: composition
+- Composition: `ven-u-zoka`
+- Domaine: danger
+
+---
+
+### mémoire
+
+**Confluent:** ltuma *(forme liée: ltum)*
+- Type: racine
+- Domaine: concept_fondateur
+- Note: Mémoire - concept central de la civilisation (synonyme normalisé de memoire)
+
+*Synonymes français:* memoire, souvenir, souvenirs
+
+---
+
+### observation
+
+**Confluent:** silimila
+- Type: composition
+- Composition: `sili-mila`
+- Domaine: concept_fondateur
+- Note: Observation - acte de regarder avec attention (sili=regard + mirak=observer)
+
+*Synonymes français:* observations, contemplation
+
+---
+
+### paix
+
+**Confluent:** bbolu *(forme liée: bbol)*
+- Type: racine
+- Domaine: etat
+
+---
+
+### presage
+
+**Confluent:** siluunovi
+- Type: composition
+- Composition: `sil-u-novi`
+- Domaine: spirituel
+
+---
+
+### prisonnier
+
+**Confluent:** pasikitoli
+- Type: composition
+- Composition: `pas-ik-i-toli`
+- Domaine: conflit
+
+---
+
+### regard libre
+
+**Confluent:** zvekamema
+- Type: composition
+- Composition: `sil-i-aska`
+- Domaine: concept_fondateur
+- Note: État spirituel central
+
+---
+
+### sagesse
+
+**Confluent:** sekauaita
+- Type: composition
+- Composition: `sek-a-aita`
+- Domaine: concept_abstrait
+
+---
+
+### serment
+
+**Confluent:** savu *(forme liée: sav)*
+- Type: racine
+- Domaine: institution
+- Note: Promesse sacrée
+
+---
+
+### serment de sang
+
+**Confluent:** savuulasu
+- Type: composition
+- Composition: `sav-u-pasu`
+- Domaine: institution
+
+---
+
+### trahison
+
+**Confluent:** zoosavu
+- Type: composition
+- Composition: `zo-savu`
+- Domaine: concept_negatif
+
+---
+
+### transmission
+
+**Confluent:** kisunuaita
+- Type: composition
+- Composition: `kis-u-n-aita`
+- Domaine: concept_abstrait
+
+---
+
+### verite
+
+**Confluent:** vpuma *(forme liée: vpum)*
+- Type: racine
+- Domaine: concept_fondateur
+
+---
+
+### victoire
+
+**Confluent:** okiatosa
+- Type: composition
+- Composition: `ok-i-a-tosa`
+- Domaine: conflit
+
+---
+
+### village
+
+**Confluent:** vluto *(forme liée: vlut)*
+- Type: racine
+- Domaine: social
+- Note: Union de maisons
+
+---
+
+### violence bestiale
+
+**Confluent:** betuuzoka
+- Type: composition
+- Composition: `bet-u-zoka`
+- Domaine: concept_negatif
+
+---
+
+## Rituels
+
+### Autel des Pionniers
+
+**Confluent:** asauenuaita
+- Type: nom_propre
+- Composition: `as-a-en-u-aita`
+
+---
+
+### Cercles de Vigile
+
+**Confluent:** ntanazaza
+- Type: nom_propre
+- Composition: `sik-u-vela`
+
+---
+
+### Colliers de glyphes
+
+**Confluent:** kopuukova
+- Type: composition
+- Composition: `kop-u-kova`
+- Domaine: objet_rituel
+
+---
+
+### Communion des esprits
+
+**Confluent:** kotamuumi
+- Type: nom_propre
+- Composition: `kot-a-m-umi`
+
+---
+
+### Glyphes du Gouffre
+
+**Confluent:** kovuuvuku
+- Type: nom_propre
+- Composition: `kov-u-vuku`
+
+---
+
+### Grande Fresque
+
+**Confluent:** oemonona
+- Type: nom_propre
+- Composition: `ek-a-kova`
+
+---
+
+### Lois du Sang et de la Bete
+
+**Confluent:** lokuulasubetu
+- Type: nom_propre
+- Composition: `lok-u-pasu-betu`
+
+---
+
+### Memento
+
+**Confluent:** memuuaita
+- Type: nom_propre
+- Composition: `mem-u-aita`
+
+---
+
+### Porteur de Flamme
+
+**Confluent:** kanuusuki
+- Type: nom_propre
+- Composition: `tak-i-suki`
+
+---
+
+### Rhombe miniature
+
+**Confluent:** onuupisu
+- Type: composition
+- Composition: `on-u-pisu`
+- Domaine: objet_rituel
+
+---
+
+### Rhombes geants
+
+**Confluent:** onuumako
+- Type: nom_propre
+- Composition: `on-u-mako`
+
+---
+
+### Rhombes sacres
+
+**Confluent:** onuuasa
+- Type: nom_propre
+- Composition: `on-u-asa`
+- Note: Instruments produisant le son sacré
+
+---
+
+### Rituel du Regard Partage
+
+**Confluent:** asausiliaakota
+- Type: nom_propre
+- Composition: `as-a-sil-aa-kota`
+- Note: Rituel central de la civilisation
+
+---
+
+### Tablettes d'argile
+
+**Confluent:** tabuutoka
+- Type: composition
+- Composition: `tab-u-toka`
+- Domaine: objet_rituel
+
+---
+
+### argile vivante
+
+**Confluent:** tokauita
+- Type: composition
+- Composition: `tok-a-ita`
+- Domaine: materiau_rituel
+
+---
+
+### artefact multi-generationnel
+
+**Confluent:** nekauekaaita
+- Type: composition
+- Composition: `nek-a-eka-aita`
+- Domaine: objet_rituel
+
+---
+
+### fenetre temporelle
+
+**Confluent:** siluutemi
+- Type: composition
+- Composition: `sil-u-temi`
+- Domaine: concept_rituel
+
+---
+
+### ideoglyphes
+
+**Confluent:** kovausili
+- Type: composition
+- Composition: `kov-a-sili`
+- Domaine: communication
+
+*Synonymes français:* écriture
+
+---
+
+### lait de pierre
+
+**Confluent:** miluukali
+- Type: composition
+- Composition: `mil-u-kali`
+- Domaine: materiau_rituel
+
+---
+
+### pelerinage
+
+**Confluent:** tekiuasa
+- Type: composition
+- Composition: `tek-i-asa`
+- Domaine: rituel
+
+---
+
+### pigments anciens
+
+**Confluent:** koluuaita
+- Type: composition
+- Composition: `kol-u-aita`
+- Domaine: materiau_rituel
+
+---
+
+### rites funeraires
+
+**Confluent:** asauosi
+- Type: composition
+- Composition: `as-a-osi`
+- Domaine: rituel
+
+---
+
+### roche braise
+
+**Confluent:** kaliusuki
+- Type: composition
+- Composition: `kal-i-suki`
+- Domaine: materiau_rituel
+
+---
+
+### serment sacre
+
+**Confluent:** savuuasa
+- Type: composition
+- Composition: `sav-u-asa`
+- Domaine: rituel
+
+---
+
+### tradition
+
+**Confluent:** aitatoku
+- Type: composition
+- Composition: `ait-a-toku`
+- Domaine: rituel
+
+*Synonymes français:* traditions, coutume, coutumes
+
+---
+
+## Géographie
+
+### avalanche
+
+**Confluent:** nisaoavuku
+- Type: composition
+- Composition: `nis-oa-vuku`
+- Domaine: danger_naturel
+
+---
+
+### cascade
+
+**Confluent:** eotesehevi
+- Type: composition
+- Composition: `ul-oa-vuku`
+- Domaine: geographie
+
+---
+
+### confluence de rivieres
+
+**Confluent:** mnebinuppo
+- Type: composition
+- Composition: `nul-aa-kota`
+- Domaine: geographie
+
+---
+
+### cote
+
+**Confluent:** nbupukapu
+- Type: composition
+- Composition: `tok-u-melu`
+- Domaine: geographie
+
+---
+
+### crevasse
+
+**Confluent:** ktovoleno
+- Type: composition
+- Composition: `vuk-u-kali`
+- Domaine: geographie
+
+---
+
+### eboulement
+
+**Confluent:** kaliovuku
+- Type: composition
+- Composition: `kal-oa-vuku`
+- Domaine: danger_naturel
+
+---
+
+### est
+
+**Confluent:** solaola
+- Type: composition
+- Composition: `sol-a-ola`
+- Domaine: direction
+- Note: Est - direction du soleil levant/aurore
+
+*Synonymes français:* levant, orient
+
+---
+
+### feu sauvage
+
+**Confluent:** sukiuzoka
+- Type: composition
+- Composition: `suk-i-zoka`
+- Domaine: danger_naturel
+
+---
+
+### grotte
+
+**Confluent:** bsekusoto
+- Type: composition
+- Composition: `vuk-u-toka`
+- Domaine: geographie
+
+---
+
+### horizon
+
+**Confluent:** btalatuka
+- Type: composition
+- Composition: `zel-u-toka`
+- Domaine: geographie
+
+---
+
+### inondation
+
+**Confluent:** ulaueki
+- Type: composition
+- Composition: `ul-a-eki`
+- Domaine: danger_naturel
+
+---
+
+### mer
+
+**Confluent:** kzome *(forme liée: kzom)*
+- Type: racine
+- Domaine: geographie
+
+---
+
+### ouest
+
+**Confluent:** solaluna
+- Type: composition
+- Composition: `sol-a-luna`
+- Domaine: direction
+- Note: Ouest - direction où le soleil va vers la nuit
+
+*Synonymes français:* couchant, occident
+
+---
+
+### pic
+
+**Confluent:** pkuzezelo
+- Type: composition
+- Composition: `tas-u-piki`
+- Domaine: geographie
+
+*Synonymes français:* cime
+
+---
+
+### promontoire
+
+**Confluent:** tmunoboli
+- Type: composition
+- Composition: `tas-u-melu`
+- Domaine: geographie
+
+---
+
+### riviere azur
+
+**Confluent:** klisuzale
+- Type: composition
+- Composition: `nul-u-zelu`
+- Domaine: geographie
+
+---
+
+### riviere verte
+
+**Confluent:** lvekobeni
+- Type: composition
+- Composition: `nul-u-viku`
+- Domaine: geographie
+
+---
+
+### roche impenetrable
+
+**Confluent:** kaliuzoki
+- Type: composition
+- Composition: `kal-i-zoki`
+- Domaine: geographie
+
+---
+
+### source
+
+**Confluent:** euvikpi
+- Type: composition
+- Composition: `en-u-ula`
+- Domaine: geographie
+
+---
+
+### vallee
+
+**Confluent:** bpuse *(forme liée: bpus)*
+- Type: racine
+- Domaine: geographie
+
+---
+
+## Rôles et Titres
+
+### Aile-Grise
+
+**Confluent:** iezevipe
+- Type: nom_propre
+- Composition: `al-i-aska`
+
+*Synonymes français:* aile-grise, ailes-grises, aile grise, ailes grises, aile, ailes
+
+---
+
+### Arbitre des Esprits
+
+**Confluent:** kpihepalu
+- Type: nom_propre
+- Composition: `zak-ii-umi`
+- Note: Entité tutélaire du jeu, pouvoir de réserve
+
+---
+
+### Faucon Chasseur
+
+**Confluent:** uuzivenna
+- Type: nom_propre
+- Composition: `ak-oa-zana`
+
+*Synonymes français:* faucon chasseur, faucons chasseurs, faucon, faucons
+
+---
+
+### Faucon veteran
+
+**Confluent:** akiuaita
+- Type: composition
+- Composition: `ak-i-aita`
+- Domaine: titre
+
+---
+
+### Grand Chef
+
+**Confluent:** makokasi
+- Type: nom_propre
+- Composition: `mak-o-kasi`
+
+---
+
+### Passe-bien
+
+**Confluent:** vbuvaloli
+- Type: nom_propre
+- Composition: `tak-i-tosa`
+
+---
+
+### Porteur de Flamme
+
+**Confluent:** bzilikukva
+- Type: nom_propre
+- Composition: `tak-i-suki`
+
+---
+
+### Proclamateur
+
+**Confluent:** bpotomeli
+- Type: nom_propre
+- Composition: `vok-i-eka`
+
+---
+
+### aine
+
+**Confluent:** aitatoli
+- Type: composition
+- Composition: `ait-a-toli`
+- Domaine: titre
+
+---
+
+### ancetre
+
+**Confluent:** ietni *(forme liée: ietn)*
+- Type: racine_sacree
+- Domaine: famille
+
+---
+
+### archer
+
+**Confluent:** alkutoli
+- Type: composition
+- Composition: `alk-u-toli`
+- Domaine: titre
+
+---
+
+### artisan
+
+**Confluent:** nekatoku
+- Type: composition
+- Composition: `nek-a-toku`
+- Domaine: role
+
+*Synonymes français:* artisans, artisane, artisanes, crafteur
+
+---
+
+### capitaine
+
+**Confluent:** kasiuoki
+- Type: composition
+- Composition: `kas-i-oki`
+- Domaine: titre
+
+---
+
+### chaman
+
+**Confluent:** umitoli
+- Type: composition
+- Composition: `um-i-toli`
+- Domaine: titre_spirituel
+
+---
+
+### chef
+
+**Confluent:** kasi *(forme liée: kas)*
+- Type: racine
+- Domaine: titre
+
+---
+
+### descendant
+
+**Confluent:** naki *(forme liée: nak)*
+- Type: racine
+- Domaine: famille
+
+---
+
+### dresseur de grues
+
+**Confluent:** aluzakitoli
+- Type: composition
+- Composition: `al-u-zak-i-toli`
+- Domaine: titre
+
+---
+
+### epoux
+
+**Confluent:** kotautoli
+- Type: composition
+- Composition: `kot-a-toli`
+- Domaine: famille
+
+*Synonymes français:* épouse, épouses, mari, maris, conjoint, conjoints
+
+---
+
+### faconneur de pierre
+
+**Confluent:** nekaukali
+- Type: composition
+- Composition: `nek-a-kali`
+- Domaine: titre
+
+---
+
+### gardien des lois
+
+**Confluent:** zakiuloku
+- Type: composition
+- Composition: `zak-i-loku`
+- Domaine: titre
+
+---
+
+### guerrier
+
+**Confluent:** okitoli
+- Type: composition
+- Composition: `ok-i-toli`
+- Domaine: titre
+
+---
+
+### guide des ames
+
+**Confluent:** mtovemaba
+- Type: composition
+- Composition: `tek-i-umi`
+- Domaine: titre_spirituel
+
+---
+
+### maitre artisan
+
+**Confluent:** makouneka
+- Type: composition
+- Composition: `mak-o-neka`
+- Domaine: titre
+
+---
+
+### mere
+
+**Confluent:** mamu *(forme liée: mam)*
+- Type: racine
+- Domaine: famille
+
+---
+
+### mineur
+
+**Confluent:** vukutoli
+- Type: composition
+- Composition: `vuk-u-toli`
+- Domaine: titre
+
+---
+
+### oracle
+
+**Confluent:** siluuumi
+- Type: composition
+- Composition: `sil-u-umi`
+- Domaine: titre_spirituel
+
+---
+
+### pecheur
+
+**Confluent:** pisutoli
+- Type: composition
+- Composition: `pis-u-toli`
+- Domaine: titre
+
+---
+
+### peintre
+
+**Confluent:** koluutoli
+- Type: composition
+- Composition: `kol-u-toli`
+- Domaine: titre
+
+---
+
+### pere
+
+**Confluent:** papu *(forme liée: pap)*
+- Type: racine
+- Domaine: famille
+
+---
+
+### porteur de lance
+
+**Confluent:** kanuupiki
+- Type: composition
+- Composition: `tak-i-piki`
+- Domaine: titre
+
+---
+
+### sage
+
+**Confluent:** sekitoli
+- Type: composition
+- Composition: `sek-i-toli`
+- Domaine: titre
+
+---
+
+### sculpteur
+
+**Confluent:** kovatoli
+- Type: composition
+- Composition: `kov-a-toli`
+- Domaine: titre
+
+---
+
+### sentinelle
+
+**Confluent:** velatoli
+- Type: composition
+- Composition: `vel-a-toli`
+- Domaine: titre
+
+---
+
+### tisserand
+
+**Confluent:** vasitoli
+- Type: composition
+- Composition: `vas-i-toli`
+- Domaine: titre
+
+---
+
+### traqueur
+
+**Confluent:** zanatoli
+- Type: composition
+- Composition: `zan-a-toli`
+- Domaine: titre
+
+*Synonymes français:* chasseur, chasseurs, traqueurs
+
+---
+
+## Communication
+
+### chant
+
+**Confluent:** oukekaza
+- Type: composition
+- Composition: `on-u-voki`
+- Domaine: communication
+
+---
+
+### chant sacre
+
+**Confluent:** onuasa
+- Type: composition
+- Composition: `on-u-asa`
+- Domaine: communication
+
+---
+
+### chronique
+
+**Confluent:** vokiutemi
+- Type: composition
+- Composition: `vok-i-temi`
+- Domaine: communication
+
+---
+
+### conseil
+
+**Confluent:** sekavoki
+- Type: composition
+- Composition: `sek-a-voki`
+- Domaine: communication
+
+---
+
+### debat
+
+**Confluent:** vokioavoki
+- Type: composition
+- Composition: `vok-oa-voki`
+- Domaine: communication
+
+---
+
+### decret
+
+**Confluent:** lokukasi
+- Type: composition
+- Composition: `lok-u-kasi`
+- Domaine: communication
+
+---
+
+### ecriture
+
+**Confluent:** mkopisuzlu
+- Type: composition
+- Composition: `kov-a-sili`
+- Domaine: communication
+
+---
+
+### glyphe
+
+**Confluent:** kova *(forme liée: kov)*
+- Type: racine
+- Domaine: communication
+- Note: Gravure, signe écrit
+
+---
+
+### histoire vraie
+
+**Confluent:** vokiuveli
+- Type: composition
+- Composition: `vok-i-veli`
+- Domaine: communication
+
+---
+
+### langage
+
+**Confluent:** vokiukota
+- Type: composition
+- Composition: `vok-i-kota`
+- Domaine: communication
+- Note: Concept de langue comme union
+
+---
+
+### loi
+
+**Confluent:** vsone *(forme liée: vson)*
+- Type: racine
+- Domaine: communication
+
+---
+
+### mensonge
+
+**Confluent:** zoveli
+- Type: composition
+- Composition: `zo-veli`
+- Domaine: communication
+
+---
+
+### message
+
+**Confluent:** vokiuteki
+- Type: composition
+- Composition: `vok-i-teki`
+- Domaine: communication
+
+---
+
+### poeme
+
+**Confluent:** onuvoki
+- Type: composition
+- Composition: `on-u-voki`
+- Domaine: communication
+
+*Synonymes français:* vers
+
+---
+
+### proclamation
+
+**Confluent:** vokiueka
+- Type: composition
+- Composition: `vok-i-eka`
+- Domaine: communication
+
+---
+
+### promesse
+
+**Confluent:** kbevi *(forme liée: kbev)*
+- Type: racine
+- Domaine: communication
+
+---
+
+### rapport
+
+**Confluent:** vokiumila
+- Type: composition
+- Composition: `vok-i-mila`
+- Domaine: communication
+
+---
+
+### recit
+
+**Confluent:** llisisita
+- Type: composition
+- Composition: `vok-i-aita`
+- Domaine: communication
+
+*Synonymes français:* légende
+
+---
+
+### rhombe
+
+**Confluent:** ieto *(forme liée: iet)*
+- Type: racine_sacree
+- Domaine: objet_rituel
+- Note: Instrument produisant le son sacré
+
+---
+
+### secret
+
+**Confluent:** bnavi *(forme liée: bnav)*
+- Type: racine
+- Domaine: communication
+
+---
+
+### silence
+
+**Confluent:** zovoki
+- Type: composition
+- Composition: `zo-voki`
+- Domaine: communication
+
+---
+
+### symbole
+
+**Confluent:** silukova
+- Type: composition
+- Composition: `sil-u-kova`
+- Domaine: communication
+
+---
+
+### trace
+
+**Confluent:** tekikova
+- Type: composition
+- Composition: `tek-i-kova`
+- Domaine: communication
+
+---
+
+### traite
+
+**Confluent:** tabusavu
+- Type: composition
+- Composition: `tab-u-savu`
+- Domaine: communication
+
+---
+
+## Temps
+
+### au-dela
+
+**Confluent:** tovauosi
+- Type: composition
+- Composition: `tov-a-osi`
+- Domaine: spirituel
+
+---
+
+### aurore
+
+**Confluent:** uizi *(forme liée: uiz)*
+- Type: racine_sacree
+- Domaine: temps
+
+---
+
+### crepuscule
+
+**Confluent:** musu *(forme liée: mus)*
+- Type: racine
+- Domaine: temps
+
+---
+
+### cycle eternel
+
+**Confluent:** likuueka
+- Type: composition
+- Composition: `sik-u-eka`
+- Domaine: temps
+
+---
+
+### duree
+
+**Confluent:** pmubo *(forme liée: pmub)*
+- Type: racine
+- Domaine: temps
+
+---
+
+### eternite
+
+**Confluent:** ekautemi
+- Type: composition
+- Composition: `ek-a-temi`
+- Domaine: temps
+
+---
+
+### futur
+
+**Confluent:** lkopi *(forme liée: lkop)*
+- Type: racine
+- Domaine: temps
+- Note: Même racine que descendant
+
+---
+
+### generation
+
+**Confluent:** noviuaita
+- Type: composition
+- Composition: `nov-i-u-aita`
+- Domaine: temps
+- Note: Nouvelle génération - ceux qui porteront la mémoire (nov=nouveau + i=agentivité + u=appartenance + aita=ancêtres)
+
+*Synonymes français:* génération, generations, générations, nouvelle generation, nouvelle génération, nouvelles generations, nouvelles générations, descendants
+
+---
+
+### instant
+
+**Confluent:** snunolave
+- Type: composition
+- Composition: `pis-u-temi`
+- Domaine: temps
+
+---
+
+### lune
+
+**Confluent:** bhenu *(forme liée: bhen)*
+- Type: racine
+- Domaine: temps
+
+---
+
+### matin
+
+**Confluent:** olausola
+- Type: composition
+- Composition: `ol-a-sola`
+- Domaine: temps
+
+---
+
+### mois
+
+**Confluent:** lunaliku
+- Type: composition
+- Composition: `lun-a-siku`
+- Domaine: temps
+
+---
+
+### moment
+
+**Confluent:** pisutemi
+- Type: composition
+- Composition: `pis-u-temi`
+- Domaine: temps
+
+---
+
+### nuit
+
+**Confluent:** vzena *(forme liée: vzen)*
+- Type: racine
+- Domaine: temps
+- Note: Même racine que lune
+
+---
+
+### passe
+
+**Confluent:** ieso *(forme liée: ies)*
+- Type: racine_sacree
+- Domaine: temps
+- Note: Même racine que origine
+
+---
+
+### present
+
+**Confluent:** tisa *(forme liée: tis)*
+- Type: racine
+- Domaine: temps
+- Note: Même racine que ici, proche
+
+---
+
+### renaissance
+
+**Confluent:** novuuita
+- Type: composition
+- Composition: `nuv-u-ita`
+- Domaine: temps
+
+---
+
+### saison
+
+**Confluent:** temiuliku
+- Type: composition
+- Composition: `tem-i-siku`
+- Domaine: temps
+
+---
+
+### siecle
+
+**Confluent:** makoutemi
+- Type: composition
+- Composition: `mak-o-temi`
+- Domaine: temps
+
+---
+
+### temps
+
+**Confluent:** kpebo *(forme liée: kpeb)*
+- Type: racine
+- Domaine: temps
+- Note: Concept fondamental
+
+*Synonymes français:* durée
+
+---
+
+## Couleurs
+
+### azur
+
+**Confluent:** ssebi *(forme liée: sseb)*
+- Type: racine
+- Domaine: couleur
+
+---
+
+### bas-relief
+
+**Confluent:** kovaukali
+- Type: composition
+- Composition: `kov-a-kali`
+- Domaine: art
+
+---
+
+### blanc
+
+**Confluent:** tbibu *(forme liée: tbib)*
+- Type: racine
+- Domaine: couleur
+- Note: Couleur du lait
+
+---
+
+### bleu
+
+**Confluent:** spati *(forme liée: spat)*
+- Type: racine
+- Domaine: couleur
+- Note: Couleur du ciel
+
+---
+
+### bleu d'eau
+
+**Confluent:** zeluuula
+- Type: composition
+- Composition: `zel-u-ula`
+- Domaine: couleur
+
+---
+
+### eclat
+
+**Confluent:** solaumako
+- Type: composition
+- Composition: `sol-a-mako`
+- Domaine: qualificatif
+
+*Synonymes français:* eclate, eclats, eclates
+
+---
+
+### gravure
+
+**Confluent:** lmoso *(forme liée: lmos)*
+- Type: racine
+- Domaine: art
+
+---
+
+### gris
+
+**Confluent:** msobe *(forme liée: msob)*
+- Type: racine
+- Domaine: couleur
+- Note: Couleur de la cendre
+
+*Synonymes français:* gris, grise, grises
+
+---
+
+### lumineux
+
+**Confluent:** kvana *(forme liée: kvan)*
+- Type: racine
+- Domaine: qualificatif
+
+*Synonymes français:* lumineuse, lumineuses
+
+---
+
+### motif
+
+**Confluent:** kovauliku
+- Type: composition
+- Composition: `kov-a-siku`
+- Domaine: art
+
+---
+
+### noir
+
+**Confluent:** bkipe *(forme liée: bkip)*
+- Type: racine
+- Domaine: couleur
+- Note: Couleur de l'ombre
+
+---
+
+### ocre
+
+**Confluent:** tokausola
+- Type: composition
+- Composition: `tok-a-sola`
+- Domaine: couleur
+
+---
+
+### orange
+
+**Confluent:** sukiusola
+- Type: composition
+- Composition: `suk-i-sola`
+- Domaine: couleur
+
+---
+
+### pale
+
+**Confluent:** miluukolu
+- Type: composition
+- Composition: `mil-u-kolu`
+- Domaine: qualificatif
+
+*Synonymes français:* pales
+
+---
+
+### patine
+
+**Confluent:** kmanilimbi
+- Type: composition
+- Composition: `kol-u-aita`
+- Domaine: qualificatif
+
+*Synonymes français:* patines
+
+---
+
+### rose
+
+**Confluent:** lasuumilu
+- Type: composition
+- Composition: `pas-u-milu`
+- Domaine: couleur
+
+---
+
+### rouge
+
+**Confluent:** zkaba *(forme liée: zkab)*
+- Type: racine
+- Domaine: couleur
+- Note: Couleur importante (yeux des Ciels-clairs)
+
+---
+
+### sombre
+
+**Confluent:** zpasi *(forme liée: zpas)*
+- Type: racine
+- Domaine: qualificatif
+
+*Synonymes français:* sombres
+
+---
+
+### translucide
+
+**Confluent:** solauula
+- Type: composition
+- Composition: `sol-a-ula`
+- Domaine: qualificatif
+
+*Synonymes français:* translucides
+
+---
+
+### vert
+
+**Confluent:** nsime *(forme liée: nsim)*
+- Type: racine
+- Domaine: couleur
+- Note: Couleur de la forêt
+
+---
+
+### violet
+
+**Confluent:** zeluulasu
+- Type: composition
+- Composition: `zel-u-pasu`
+- Domaine: couleur
+
+*Synonymes français:* pourpre
+
+---
+
+### yeux de l'aurore
+
+**Confluent:** vlibupve
+- Type: composition
+- Composition: `sil-u-ola`
+- Domaine: corps_sacre
+- Note: Yeux des Ciels-clairs aux couleurs de l'aurore
+
+---
+
+## Santé et Dangers
+
+### Maladie des Antres
+
+**Confluent:** osiusanuuvuku
+- Type: nom_propre
+- Composition: `os-i-sanu-vuku`
+- Note: Maladie pulmonaire des mineurs
+
+---
+
+### avalanche
+
+**Confluent:** bvovasapisu
+- Type: composition
+- Composition: `nis-oa-vuku`
+- Domaine: danger
+
+---
+
+### blessure
+
+**Confluent:** sanuuzoka
+- Type: composition
+- Composition: `san-u-zoka`
+- Domaine: sante
+
+---
+
+### crevasse
+
+**Confluent:** nvipovito
+- Type: composition
+- Composition: `vuk-u-kali`
+- Domaine: danger
+
+---
+
+### eboulement
+
+**Confluent:** tverameppu
+- Type: composition
+- Composition: `kal-oa-vuku`
+- Domaine: danger
+
+---
+
+### feu sauvage
+
+**Confluent:** kpizotahvu
+- Type: composition
+- Composition: `suk-i-zoka`
+- Domaine: danger
+
+---
+
+### fievre
+
+**Confluent:** sanuusuki
+- Type: composition
+- Composition: `san-u-suki`
+- Domaine: maladie
+
+---
+
+### gouffre
+
+**Confluent:** zkito *(forme liée: zkit)*
+- Type: racine
+- Domaine: danger
+
+---
+
+### guerison
+
+**Confluent:** tosausanu
+- Type: composition
+- Composition: `tos-a-sanu`
+- Domaine: sante
+
+---
+
+### infection pulmonaire
+
+**Confluent:** venuzokausanu
+- Type: composition
+- Composition: `ven-u-zoka-sanu`
+- Domaine: maladie
+
+---
+
+### inondation
+
+**Confluent:** ulaueka
+- Type: composition
+- Composition: `ul-a-eka`
+- Domaine: danger
+
+---
+
+### maladie
+
+**Confluent:** osiusanu
+- Type: composition
+- Composition: `os-i-sanu`
+- Domaine: sante
+- Note: Concept de maladie comme mort partielle
+
+---
+
+### malnutrition
+
+**Confluent:** zomuta
+- Type: composition
+- Composition: `zo-muta`
+- Domaine: maladie
+
+---
+
+### miasmes
+
+**Confluent:** smiboseve
+- Type: composition
+- Composition: `ven-u-zoka`
+- Domaine: danger
+
+---
+
+### poison
+
+**Confluent:** vpesu *(forme liée: vpes)*
+- Type: racine
+- Domaine: danger
+
+---
+
+### roche impenetrable
+
+**Confluent:** kaliuoki
+- Type: composition
+- Composition: `kal-i-oki`
+- Domaine: danger
+
+---
+
+### suffocation
+
+**Confluent:** zovena
+- Type: composition
+- Composition: `zo-vena`
+- Domaine: danger
+
+---
+
+### toxine
+
+**Confluent:** shoto *(forme liée: shot)*
+- Type: racine
+- Domaine: danger
+
+---
+
+## Objets et Matériaux
+
+### argile
+
+**Confluent:** tokauula
+- Type: composition
+- Composition: `tok-a-ula`
+- Domaine: materiau
+
+---
+
+### barque
+
+**Confluent:** naviupisu
+- Type: composition
+- Composition: `van-i-pisu`
+- Domaine: objet
+
+---
+
+### bijou
+
+**Confluent:** kaliuola
+- Type: composition
+- Composition: `kal-i-ola`
+- Domaine: objet
+
+---
+
+### bois
+
+**Confluent:** nmeme *(forme liée: nmem)*
+- Type: racine
+- Domaine: materiau
+- Note: Matériau de l'arbre/forêt
+
+---
+
+### cape
+
+**Confluent:** vekuuzaki
+- Type: composition
+- Composition: `vek-u-zaki`
+- Domaine: objet
+
+---
+
+### cendre
+
+**Confluent:** kvile *(forme liée: kvil)*
+- Type: racine
+- Domaine: materiau
+
+---
+
+### chaine
+
+**Confluent:** kopuukali
+- Type: composition
+- Composition: `kop-u-kali`
+- Domaine: objet
+
+*Synonymes français:* lien
+
+---
+
+### chambre
+
+**Confluent:** lokuusupu
+- Type: composition
+- Composition: `lok-u-supu`
+- Domaine: structure
+
+*Synonymes français:* pièce
+
+---
+
+### coffret
+
+**Confluent:** svalezelu
+- Type: composition
+- Composition: `sak-u-zaki`
+- Domaine: objet
+
+---
+
+### corde
+
+**Confluent:** kkese *(forme liée: kkes)*
+- Type: racine
+- Domaine: outil
+
+---
+
+### document
+
+**Confluent:** tabukova
+- Type: composition
+- Composition: `tab-u-kova`
+- Domaine: objet
+
+*Synonymes français:* écrit
+
+---
+
+### foyer
+
+**Confluent:** bvuvibolvu
+- Type: composition
+- Composition: `suk-i-loku`
+- Domaine: structure
+
+---
+
+### grenier
+
+**Confluent:** bkisesiku
+- Type: composition
+- Composition: `lok-u-zaki`
+- Domaine: structure
+
+---
+
+### lait
+
+**Confluent:** stuki *(forme liée: stuk)*
+- Type: racine
+- Domaine: materiau
+
+---
+
+### lampe
+
+**Confluent:** solausaku
+- Type: composition
+- Composition: `sol-a-saku`
+- Domaine: objet
+
+---
+
+### ligne
+
+**Confluent:** speto *(forme liée: spet)*
+- Type: racine
+- Domaine: forme
+
+---
+
+### maison
+
+**Confluent:** buka *(forme liée: buk)*
+- Type: racine
+- Domaine: structure
+- Note: Habitation, foyer domestique
+
+*Synonymes français:* habitation, demeure, logis
+
+---
+
+### metal
+
+**Confluent:** vmevubakba
+- Type: composition
+- Composition: `kal-i-suki`
+- Domaine: materiau
+
+---
+
+### minerai
+
+**Confluent:** kaliuvuku
+- Type: composition
+- Composition: `kal-i-vuku`
+- Domaine: materiau
+
+---
+
+### navire
+
+**Confluent:** bnuve *(forme liée: bnuv)*
+- Type: racine
+- Domaine: objet
+
+*Synonymes français:* embarcation
+
+---
+
+### offrande
+
+**Confluent:** kitanuasa
+- Type: composition
+- Composition: `kit-a-n-asa`
+- Domaine: objet_rituel
+
+---
+
+### pierre
+
+**Confluent:** zmepa *(forme liée: zmep)*
+- Type: racine
+- Domaine: materiau
+- Note: Matériau fondamental
+
+*Synonymes français:* roche, pierres
+
+---
+
+### porte
+
+**Confluent:** tekiuloku
+- Type: composition
+- Composition: `tek-i-loku`
+- Domaine: structure
+
+*Synonymes français:* passage
+
+---
+
+### radeau
+
+**Confluent:** naviuviku
+- Type: composition
+- Composition: `van-i-viku`
+- Domaine: objet
+
+---
+
+### relique
+
+**Confluent:** iovenalsa
+- Type: composition
+- Composition: `as-a-aita`
+- Domaine: objet_rituel
+
+---
+
+### sac
+
+**Confluent:** pnomu *(forme liée: pnom)*
+- Type: racine
+- Domaine: objet
+
+*Synonymes français:* contenant
+
+---
+
+### sang
+
+**Confluent:** mzune *(forme liée: mzun)*
+- Type: racine
+- Domaine: materiau
+
+---
+
+### tablette
+
+**Confluent:** zkami *(forme liée: zkam)*
+- Type: racine
+- Domaine: objet
+
+*Synonymes français:* plaque
+
+---
+
+### torche
+
+**Confluent:** sukiuviku
+- Type: composition
+- Composition: `suk-i-viku`
+- Domaine: objet
+
+---
+
+### tresor
+
+**Confluent:** zakiumako
+- Type: composition
+- Composition: `zak-i-mako`
+- Domaine: objet
+
+---
+
+### vase rituel
+
+**Confluent:** sakuasa
+- Type: composition
+- Composition: `sak-u-asa`
+- Domaine: objet_rituel
+
+---
+
+### vetement
+
+**Confluent:** vekuuvasi
+- Type: composition
+- Composition: `vek-u-vasi`
+- Domaine: objet
+
+---
+
+### zone
+
+**Confluent:** pvevi *(forme liée: pvev)*
+- Type: racine
+- Domaine: espace
+
+*Synonymes français:* région
+
+---
+
+## Famille
+
+### famille
+
+**Confluent:** mzoba *(forme liée: mzob)*
+- Type: racine
+- Domaine: famille
+- Note: Unité familiale
+
+---
+
+### femme
+
+**Confluent:** nako *(forme liée: nak)*
+- Type: racine
+- Domaine: personne
+- Note: Femme adulte
+
+*Synonymes français:* femmes
+
+---
+
+### fille
+
+**Confluent:** naku *(forme liée: nak)*
+- Type: racine
+- Domaine: personne
+- Note: Fille, enfant féminin
+
+*Synonymes français:* filles
+
+---
+
+### frere
+
+**Confluent:** vaki *(forme liée: vak)*
+- Type: racine
+- Domaine: famille
+- Note: Frère de sang
+
+*Synonymes français:* frères
+
+---
+
+### freres et sœurs
+
+**Confluent:** vakisu
+- Type: composition
+- Composition: `vaki + su`
+- Domaine: famille
+
+*Synonymes français:* fratrie
+
+---
+
+### garcon
+
+**Confluent:** zliva *(forme liée: zliv)*
+- Type: racine
+- Domaine: personne
+- Note: Garçon, enfant masculin
+
+*Synonymes français:* garçon, garcons, garçons
+
+---
+
+### homme
+
+**Confluent:** toko *(forme liée: tok)*
+- Type: racine
+- Domaine: personne
+- Note: Homme adulte
+
+*Synonymes français:* hommes
+
+---
+
+### mere
+
+**Confluent:** matu *(forme liée: mat)*
+- Type: racine
+- Domaine: famille
+- Note: Mère biologique
+
+---
+
+### pere
+
+**Confluent:** patu *(forme liée: pat)*
+- Type: racine
+- Domaine: famille
+- Note: Père biologique
+
+---
+
+### sœur
+
+**Confluent:** seki *(forme liée: sek)*
+- Type: racine
+- Domaine: famille
+- Note: Sœur de sang
+
+*Synonymes français:* sœurs
+
+---
+
+## Nombres
+
+*Aucune entrée*
+
+## Nourriture
+
+### aromate
+
+**Confluent:** palusuki
+- Type: composition
+- Composition: `pal-u-suki`
+- Domaine: nourriture
+- Note: Aromate, épice - herbe qui réchauffe/brûle (piquant)
+
+*Synonymes français:* aromates, epice, epices, épice, épices
+
+---
+
+### baie
+
+**Confluent:** beka *(forme liée: bek)*
+- Type: racine
+- Domaine: nourriture
+- Note: Baies - fruits sauvages essentiels
+
+*Synonymes français:* baies, petits fruits
+
+---
+
+### boire
+
+**Confluent:** minet *(forme liée: mine)*
+- Type: verbe
+- Domaine: nourriture
+- Note: Boire - utilise racine sacrée ura (eau)
+
+*Synonymes français:* bois, boit, buvons, buvez, boivent, buvais, buvait, buvions, buviez, buvaient, buvant, bu
+
+---
+
+### cuisiner
+
+**Confluent:** mukuneka
+- Type: composition
+- Composition: `muk-u-nekas`
+- Domaine: technique_culinaire
+- Note: Cuisiner, préparer (faire de la nourriture) - muki + liaison u + nekas
+
+*Synonymes français:* cuisine, cuisines, cuisinons, cuisinez, cuisinent, cuisinais, cuisinait, cuisinions, cuisiniez, cuisinaient, cuisinant, cuisiné, preparer la nourriture, préparer la nourriture
+
+---
+
+### fruit
+
+**Confluent:** veka *(forme liée: vek)*
+- Type: racine
+- Domaine: nourriture
+- Note: Fruits génériques
+
+*Synonymes français:* fruits
+
+---
+
+### fumer
+
+**Confluent:** simus *(forme liée: sim)*
+- Type: verbe
+- Domaine: technique_culinaire
+- Note: Fumer (aliment), technique de conservation
+
+*Synonymes français:* fume, fumes, fumons, fumez, fument, fumais, fumait, fumions, fumiez, fumaient, fumant, fumé, fumée
+
+---
+
+### galette
+
+**Confluent:** panu *(forme liée: pan)*
+- Type: racine
+- Domaine: nourriture
+- Note: Galette, pain plat
+
+*Synonymes français:* pain, crêpe, galettes
+
+---
+
+### gibier
+
+**Confluent:** zana *(forme liée: zan)*
+- Type: racine
+- Domaine: nourriture
+- Note: Gibier chassé (lié à zanak-chasser)
+
+*Synonymes français:* proie
+
+---
+
+### graine
+
+**Confluent:** seka *(forme liée: sek)*
+- Type: racine
+- Domaine: nourriture
+- Note: Graines comestibles
+
+*Synonymes français:* graines, semence
+
+---
+
+### griller
+
+**Confluent:** palus *(forme liée: pal)*
+- Type: verbe
+- Domaine: technique_culinaire
+- Note: Griller, cuire sur feu
+
+*Synonymes français:* grille, grilles, grillons, grillez, grillent, grillais, grillait, grillions, grilliez, grillaient, grillant, grillé, cuire, rôtir
+
+---
+
+### herbe
+
+**Confluent:** pala *(forme liée: pal)*
+- Type: racine
+- Domaine: nourriture
+- Note: Herbes aromatiques
+
+*Synonymes français:* herbes
+
+---
+
+### infuser
+
+**Confluent:** lapis
+- Type: verbe
+- Domaine: technique_culinaire
+- Note: Infuser, faire tremper dans l'eau
+
+*Synonymes français:* infuse, infusion, tremper
+
+---
+
+### larmes-du-ciel
+
+**Confluent:** zeluosi
+- Type: composition
+- Composition: `zel-u-osi`
+- Domaine: nourriture_sacree
+- Note: Plat cérémoniel traditionnel - poisson fumé, gibier, Morsure-des-Ancêtres, herbes et baies. Utilise liaison u (appartenance)
+
+*Synonymes français:* plat ceremoniel, plat traditionnel
+
+---
+
+### legume
+
+**Confluent:** leva *(forme liée: lev)*
+- Type: racine
+- Domaine: nourriture
+- Note: Légume, plante comestible cultivée
+
+*Synonymes français:* légume, légumes, plante comestible
+
+---
+
+### manque
+
+**Confluent:** zomuki
+- Type: composition
+- Composition: `zo-muki`
+- Domaine: nourriture
+- Note: Manque (de nourriture) - zo (négation) + muki (nourriture)
+
+*Synonymes français:* manquer, absence, pénurie
+
+---
+
+### mollusque
+
+**Confluent:** molu *(forme liée: mol)*
+- Type: racine
+- Domaine: nourriture
+- Note: Mollusques, coquillages
+
+*Synonymes français:* coquillage, mollusques
+
+---
+
+### morsure-des-ancetres
+
+**Confluent:** aiteopalu
+- Type: composition
+- Composition: `ait-eo-palu`
+- Domaine: nourriture_sacree
+- Note: Gingembre sauvage très estimé, épice sacrée - utilise liaison sacrée eo (totalité/éternel)
+
+*Synonymes français:* gingembre sauvage, epice sacree
+
+---
+
+### nourriture
+
+**Confluent:** muki *(forme liée: muk)*
+- Type: racine
+- Domaine: nourriture
+- Note: Nourriture (racine de manger)
+
+*Synonymes français:* aliment, aliments, repas
+
+---
+
+### poisson
+
+**Confluent:** zsita *(forme liée: zsit)*
+- Type: racine
+- Domaine: nourriture
+- Note: Poisson - source vitale de protéines (même racine que pêcher)
+
+*Synonymes français:* poissons
+
+---
+
+### reserve
+
+**Confluent:** zaku *(forme liée: zak)*
+- Type: racine
+- Domaine: nourriture
+- Note: Réserves alimentaires (lié à garder/protéger)
+
+*Synonymes français:* réserves, provisions, stock
+
+---
+
+### secher
+
+**Confluent:** sekus *(forme liée: sek)*
+- Type: verbe
+- Domaine: technique_culinaire
+- Note: Sécher (aliment), conservation
+
+*Synonymes français:* sécher, sèche, sèches, séchons, séchez, sèchent, séchais, séchait, séchions, séchiez, séchaient, séchant, séché, sec, sèche
+
+---
+
+### tubercule
+
+**Confluent:** tuba *(forme liée: tub)*
+- Type: racine
+- Domaine: nourriture
+- Note: Tubercules, racines comestibles
+
+*Synonymes français:* racine, tubercules
+
+---
+
+## Habitat
+
+### escalier
+
+**Confluent:** kpopezosu
+- Type: composition
+- Composition: `vuku-kali`
+- Domaine: habitat
+- Note: Escalier - montée de pierre (référence au Gouffre Humide avec ses escaliers dans la roche, vuku=gouffre + kari=pierre)
+
+*Synonymes français:* escaliers, marches, montée
+
+---
+
+### fenetre
+
+**Confluent:** solatuva
+- Type: composition
+- Composition: `sola-tuva`
+- Domaine: habitat
+- Note: Fenêtre - ouverture qui laisse passer la lumière (sora=lumière + tuva=ouverture)
+
+*Synonymes français:* fenêtre, fenêtres, ouverture
+
+---
+
+### monter
+
+**Confluent:** sumus *(forme liée: sum)*
+- Type: verbe
+- Domaine: action
+- Note: Monter, s'élever (même racine que haut)
+
+*Synonymes français:* monte, montes, montons, montez, montent, montais, montait, montions, montiez, montaient, montant, monté, grimper, élever
+
+---
+
+### mur
+
+**Confluent:** kalisumu
+- Type: composition
+- Composition: `kali-sumu`
+- Domaine: habitat
+- Note: Mur - pierre élevée (kari=pierre + sumu=haut/élevé)
+
+*Synonymes français:* murs, paroi, cloison
+
+---
+
+### ouvrir
+
+**Confluent:** tuvas *(forme liée: tuv)*
+- Type: verbe
+- Domaine: action
+- Note: Ouvrir, créer une ouverture
+
+*Synonymes français:* ouvre, ouvres, ouvrons, ouvrez, ouvrent, ouvrais, ouvrait, ouvrions, ouvriez, ouvraient, ouvrant, ouvert, ouverture
+
+---
+
+### table
+
+**Confluent:** mukisloku
+- Type: composition
+- Composition: `mukis-loku`
+- Domaine: habitat
+- Note: Table - lieu où l'on mange (mukis=manger + loku=lieu)
+
+*Synonymes français:* tables, surface pour manger
+
+---
+
+### toit
+
+**Confluent:** zakusumu
+- Type: composition
+- Composition: `zaku-sumu`
+- Domaine: habitat
+- Note: Toit - protection en hauteur (zaku=protection/réserve + sumu=haut)
+
+*Synonymes français:* toits, toiture, abri
+
+---
+
+## Navigation
+
+### aborder
+
+**Confluent:** vanukoti
+- Type: composition
+- Composition: `vanu-koti`
+- Domaine: action_maritime
+- Note: Monter à bord (ou attaquer un navire)
+
+*Synonymes français:* monter à bord, embarquer
+
+---
+
+### ancre
+
+**Confluent:** vanupeku
+- Type: composition
+- Composition: `vanu-peku`
+- Domaine: equipement_maritime
+- Note: Objet lourd qui maintient le bateau
+
+*Synonymes français:* ancres
+
+---
+
+### berge
+
+**Confluent:** ulalinu
+- Type: composition
+- Composition: `ula-linu`
+- Domaine: geographie
+- Note: Bord de rivière ou fleuve
+
+*Synonymes français:* rive, bord
+
+---
+
+### cargaison
+
+**Confluent:** vanusaki
+- Type: composition
+- Composition: `vanu-saki`
+- Domaine: commerce_maritime
+- Note: Marchandises transportées
+
+*Synonymes français:* charge, marchandises
+
+---
+
+### chavirer
+
+**Confluent:** vanuloli
+- Type: composition
+- Composition: `vanu-loli`
+- Domaine: accident_maritime
+- Note: Le bateau bascule
+
+*Synonymes français:* se retourner, basculer
+
+---
+
+### construction en bois
+
+**Confluent:** vitokova
+- Type: composition
+- Composition: `vito-kova`
+- Domaine: construction
+- Note: Structure faite de planches
+
+*Synonymes français:* charpente
+
+---
+
+### couler
+
+**Confluent:** vanuvuku
+- Type: composition
+- Composition: `vanu-vuku`
+- Domaine: accident_maritime
+- Note: Sombrer, aller au fond
+
+*Synonymes français:* sombrer, s'enfoncer
+
+---
+
+### créature flottante
+
+**Confluent:** betulatuli
+- Type: composition
+- Composition: `betu-ula-tuli`
+- Domaine: perception
+- Note: Perception initiale des navires étrangers comme créatures vivantes
+
+---
+
+### débarquer
+
+**Confluent:** vanuvoli
+- Type: composition
+- Composition: `vanu-voli`
+- Domaine: action_maritime
+- Note: Descendre du bateau
+
+*Synonymes français:* descendre, sortir du bateau
+
+---
+
+### eau douce
+
+**Confluent:** ulapuli
+- Type: composition
+- Composition: `ula-puli`
+- Domaine: nature
+- Note: Eau potable de rivière ou source
+
+*Synonymes français:* eau potable, eau pure
+
+---
+
+### eau salée
+
+**Confluent:** ulaselu
+- Type: composition
+- Composition: `ula-selu`
+- Domaine: nature_maritime
+- Note: Eau de mer, impure pour boire
+
+*Synonymes français:* eau de mer, eau impure
+
+---
+
+### embarcation
+
+**Confluent:** ulavanu
+- Type: composition
+- Composition: `ula-vanu`
+- Domaine: objet_maritime
+- Note: Bateau, barque - terme générique
+
+*Synonymes français:* bateau, barque
+
+---
+
+### embouchure
+
+**Confluent:** ulakotamelu
+- Type: composition
+- Composition: `ula-kota-melu`
+- Domaine: geographie_maritime
+- Note: Où le fleuve rencontre la mer
+
+*Synonymes français:* delta
+
+---
+
+### flotter
+
+**Confluent:** ulatuli
+- Type: composition
+- Composition: `ula-tuli`
+- Domaine: action_maritime
+- Note: Rester à la surface de l'eau
+
+*Synonymes français:* flotté, flottera
+
+---
+
+### houle
+
+**Confluent:** vtukaviti
+- Type: composition
+- Composition: `melu-loli`
+- Domaine: phenomene_maritime
+- Note: Vagues longues et régulières
+
+---
+
+### manœuvrer
+
+**Confluent:** vanukanu
+- Type: composition
+- Composition: `vanu-kanu`
+- Domaine: action_maritime
+- Note: Piloter un bateau
+
+*Synonymes français:* piloter, diriger
+
+---
+
+### marin
+
+**Confluent:** ulakina
+- Type: composition
+- Composition: `ula-ki-na`
+- Domaine: role_maritime
+- Note: Personne qui navigue
+
+*Synonymes français:* navigateur, marins
+
+---
+
+### marée
+
+**Confluent:** meluuki
+- Type: composition
+- Composition: `melu-uki`
+- Domaine: phenomene_maritime
+- Note: Montée et descente de l'eau
+
+*Synonymes français:* flux, marées
+
+---
+
+### naviguer
+
+**Confluent:** ulaki
+- Type: composition
+- Composition: `ula-ki`
+- Domaine: action_maritime
+- Note: Voyager sur l'eau avec une embarcation
+
+*Synonymes français:* navigation, voguer
+
+---
+
+### noyade
+
+**Confluent:** ulaosi
+- Type: composition
+- Composition: `ula-osi`
+- Domaine: danger_maritime
+- Note: Mort par immersion
+
+*Synonymes français:* se noyer, noyé
+
+---
+
+### point d'eau
+
+**Confluent:** ulatoka
+- Type: composition
+- Composition: `ula-toka`
+- Domaine: geographie
+- Note: Endroit où trouver de l'eau (source, puits, rivière)
+
+*Synonymes français:* source d'eau
+
+---
+
+### port
+
+**Confluent:** vanukotoka
+- Type: composition
+- Composition: `vanu-kotoka`
+- Domaine: geographie_maritime
+- Note: Endroit où les bateaux s'arrêtent
+
+*Synonymes français:* havre, quai
+
+---
+
+### profondeur
+
+**Confluent:** nsalapinu
+- Type: composition
+- Composition: `vuku-mako`
+- Domaine: geographie_maritime
+- Note: Eau très profonde
+
+*Synonymes français:* abîme, fond
+
+---
+
+### pérégrination aquatique
+
+**Confluent:** ulakimako
+- Type: composition
+- Composition: `ula-ki-mako`
+- Domaine: voyage_maritime
+- Note: Voyage de longue durée sur l'eau
+
+*Synonymes français:* voyage maritime, traversée
+
+---
+
+### rame
+
+**Confluent:** pzekana
+- Type: composition
+- Composition: `kanu-vi`
+- Domaine: outil_maritime
+- Note: Longue pièce de bois pour propulser
+
+*Synonymes français:* aviron, pagaie
+
+---
+
+### ramer
+
+**Confluent:** kanulaki
+- Type: composition
+- Composition: `kanu-la-ki`
+- Domaine: action_maritime
+- Note: Faire avancer avec des rames
+
+*Synonymes français:* rame, pagayer
+
+---
+
+### ravitaillement
+
+**Confluent:** nutukovi
+- Type: composition
+- Composition: `nutu-kovi`
+- Domaine: logistique
+- Note: Reconstituer les provisions
+
+*Synonymes français:* ravitailler, approvisionner
+
+---
+
+### rivage
+
+**Confluent:** kosti *(forme liée: kost)*
+- Type: racine
+- Domaine: geographie_maritime
+- Note: Bord de la mer, côte
+
+*Synonymes français:* côte, littoral, bord de mer
+
+---
+
+### se ravitailler
+
+**Confluent:** nutukili
+- Type: composition
+- Composition: `nutu-kili`
+- Domaine: logistique
+- Note: Obtenir de la nourriture et de l'eau
+
+*Synonymes français:* s'approvisionner
+
+---
+
+### tempête marine
+
+**Confluent:** meluzelu
+- Type: composition
+- Composition: `melu-zelu`
+- Domaine: danger_maritime
+- Note: Tempête en mer
+
+*Synonymes français:* ouragan marin
+
+---
+
+### vague
+
+**Confluent:** meluloli
+- Type: composition
+- Composition: `melu-loli`
+- Domaine: phenomene_maritime
+- Note: Ondulation de l'eau
+
+*Synonymes français:* vagues, flot
+
+---
+
+### voile
+
+**Confluent:** venuvanu
+- Type: composition
+- Composition: `ven-u-vanu`
+- Domaine: equipement_maritime
+- Note: Tissu qui capte le vent
+
+*Synonymes français:* voiles
+
+---
+
+### échouer
+
+**Confluent:** vanukosti
+- Type: composition
+- Composition: `vanu-kosti`
+- Domaine: navigation
+- Note: Bateau qui s'arrête sur le rivage involontairement
+
+*Synonymes français:* échouée, échoué
+
+---
+
+### écume
+
+**Confluent:** ulamiluvi
+- Type: composition
+- Composition: `ula-milu-vi`
+- Domaine: phenomene_maritime
+- Note: Mousse blanche des vagues
+
+*Synonymes français:* mousse
+
+---
+
+## Architecture
+
+### atelier
+
+**Confluent:** kovatoka
+- Type: composition
+- Composition: `kova-toka`
+- Domaine: architecture
+- Note: Lieu de production artisanale
+
+*Synonymes français:* ateliers
+
+---
+
+### chambre
+
+**Confluent:** tokapisu
+- Type: composition
+- Composition: `toka-pisu`
+- Domaine: architecture
+- Note: Pièce fermée
+
+*Synonymes français:* pièce, salle
+
+---
+
+### charpente
+
+**Confluent:** vitosanu
+- Type: composition
+- Composition: `vito-sanu`
+- Domaine: architecture
+- Note: Structure en bois
+
+---
+
+### colonne
+
+**Confluent:** tokupeki
+- Type: composition
+- Composition: `toka-peki`
+- Domaine: architecture
+- Note: Support vertical
+
+*Synonymes français:* pilier, colonnes
+
+---
+
+### enceinte
+
+**Confluent:** kotakonu
+- Type: composition
+- Composition: `kota-konu`
+- Domaine: architecture_militaire
+- Note: Murs qui entourent un lieu
+
+*Synonymes français:* fortification
+
+---
+
+### entrepôt
+
+**Confluent:** nutukotoka
+- Type: composition
+- Composition: `nutu-koto-ka`
+- Domaine: architecture
+- Note: Stockage de provisions
+
+*Synonymes français:* stockage, réserve
+
+---
+
+### escalier
+
+**Confluent:** pekivasi
+- Type: composition
+- Composition: `peki-vasi`
+- Domaine: architecture
+- Note: Passage pour monter/descendre
+
+*Synonymes français:* escaliers, marches
+
+---
+
+### fenêtre
+
+**Confluent:** siliveku
+- Type: composition
+- Composition: `sili-veku`
+- Domaine: architecture
+- Note: Ouverture pour la lumière et l'air
+
+*Synonymes français:* fenêtres
+
+---
+
+### fondation
+
+**Confluent:** tokapeku
+- Type: composition
+- Composition: `toka-peku`
+- Domaine: architecture
+- Note: Base d'un bâtiment
+
+*Synonymes français:* fondations, base
+
+---
+
+### fosse
+
+**Confluent:** vukupisu
+- Type: composition
+- Composition: `vuku-pisu`
+- Domaine: architecture
+- Note: Trou creusé
+
+*Synonymes français:* fossé, trou
+
+---
+
+### galerie
+
+**Confluent:** vukuvasi
+- Type: composition
+- Composition: `vuku-vasi`
+- Domaine: architecture_souterraine
+- Note: Passage souterrain (crucial pour Antres)
+
+*Synonymes français:* tunnel, corridor
+
+---
+
+### linteau
+
+**Confluent:** vasilinu
+- Type: composition
+- Composition: `vasi-linu`
+- Domaine: architecture
+- Note: Élément au-dessus d'une ouverture
+
+---
+
+### marche
+
+**Confluent:** pekivi
+- Type: composition
+- Composition: `peki-vi`
+- Domaine: architecture
+- Note: Élément d'escalier
+
+*Synonymes français:* marches, degré
+
+---
+
+### mur
+
+**Confluent:** linukonu
+- Type: composition
+- Composition: `lin-u-konu`
+- Domaine: architecture
+- Note: Paroi de protection
+
+*Synonymes français:* muraille, paroi
+
+---
+
+### muraille
+
+**Confluent:** makolinukonu
+- Type: composition
+- Composition: `mako-linu-konu`
+- Domaine: architecture_militaire
+- Note: Fortification
+
+*Synonymes français:* fortification, enceinte
+
+---
+
+### pilotis
+
+**Confluent:** ulapeki
+- Type: composition
+- Composition: `ula-peki`
+- Domaine: architecture
+- Note: CRITIQUE - architecture majeure des Enfants du Courant
+
+*Synonymes français:* pieux, piliers d'eau
+
+---
+
+### planche
+
+**Confluent:** vitoveku
+- Type: composition
+- Composition: `vito-veku`
+- Domaine: architecture
+- Note: Morceau de bois plat
+
+*Synonymes français:* planches, madrier
+
+---
+
+### plate-forme
+
+**Confluent:** pekutoka
+- Type: composition
+- Composition: `pek-u-toka`
+- Domaine: architecture
+- Note: Structure élevée sur pilotis
+
+*Synonymes français:* plateforme, terrasse
+
+---
+
+### pont
+
+**Confluent:** tvoli *(forme liée: tvol)*
+- Type: racine
+- Domaine: architecture
+- Note: Déjà existant - lien, passage entre deux
+
+---
+
+### porte
+
+**Confluent:** vasiumu
+- Type: composition
+- Composition: `vasi-umu`
+- Domaine: architecture
+- Note: Ouverture pour entrer/sortir
+
+*Synonymes français:* portes, entrée
+
+---
+
+### poutre
+
+**Confluent:** vitolinumako
+- Type: composition
+- Composition: `vito-linu-mako`
+- Domaine: architecture
+- Note: Élément structurel horizontal
+
+*Synonymes français:* poutres
+
+---
+
+### seuil
+
+**Confluent:** vasitoka
+- Type: composition
+- Composition: `vasi-toka`
+- Domaine: architecture
+- Note: Entrée, limite
+
+---
+
+### sol
+
+**Confluent:** zzekonabo
+- Type: composition
+- Composition: `toka-vuku`
+- Domaine: architecture
+- Note: Surface au niveau du sol
+
+*Synonymes français:* plancher, terre
+
+---
+
+### toit
+
+**Confluent:** tokuveku
+- Type: composition
+- Composition: `toka-veku`
+- Domaine: architecture
+- Note: Couverture supérieure
+
+*Synonymes français:* toiture, couverture
+
+---
+
+### tour
+
+**Confluent:** tokamakouti
+- Type: composition
+- Composition: `toka-mako-uti`
+- Domaine: architecture
+- Note: Structure haute
+
+*Synonymes français:* tours
+
+---
+
+### tour de guet
+
+**Confluent:** silimakotoka
+- Type: composition
+- Composition: `sili-mako-toka`
+- Domaine: architecture_militaire
+- Note: Tour pour surveiller
+
+---
+
+### voûte
+
+**Confluent:** mbalateki
+- Type: composition
+- Composition: `vuku-toka`
+- Domaine: architecture_souterraine
+- Note: Construction arquée souterraine
+
+---
+
+## Concepts Philosophiques
+
+### charge
+
+**Confluent:** kanukota
+- Type: composition
+- Composition: `kanu-kota`
+- Domaine: politique
+- Note: Fonction politique ou responsabilité
+
+*Synonymes français:* charges, fonction, responsabilité
+
+---
+
+### compensation
+
+**Confluent:** kilutosa
+- Type: composition
+- Composition: `kil-u-tosa`
+- Domaine: economie
+- Note: Rémunération équitable
+
+*Synonymes français:* rémunération, rétribution
+
+---
+
+### devenir partie de l'Antre
+
+**Confluent:** tulikeko
+- Type: composition
+- Composition: `tuli-keko`
+- Domaine: tradition
+- Note: Tradition des artisans âgés (refus d'enlever le corps, fierté)
+
+---
+
+### débat à travers le temps
+
+**Confluent:** vokaitaaika
+- Type: composition
+- Composition: `voki-aita-aika`
+- Domaine: philosophie
+- Note: Concept de l'interprétation multi-générationnelle
+
+---
+
+### exigence
+
+**Confluent:** vokimako
+- Type: composition
+- Composition: `voki-mako`
+- Domaine: action_sociale
+- Note: Demande forte
+
+*Synonymes français:* exiger, demande
+
+---
+
+### fief
+
+**Confluent:** tokaitavi
+- Type: composition
+- Composition: `toka-aita-vi`
+- Domaine: politique
+- Note: Concept à rejeter - territoire accordé par hérédité
+
+---
+
+### fierté
+
+**Confluent:** kolimako
+- Type: composition
+- Composition: `koli-mako`
+- Domaine: emotion
+- Note: Sentiment de dignité
+
+---
+
+### gardiens des passages
+
+**Confluent:** konuvasiaita
+- Type: composition
+- Composition: `kon-u-vasi-aita`
+- Domaine: spiritualite
+- Note: Âmes des pionniers morts qui ne peuvent atteindre le ciel
+
+---
+
+### gloire
+
+**Confluent:** nemumako
+- Type: composition
+- Composition: `nemu-mako`
+- Domaine: valeur_sociale
+- Note: Honneur et renommée
+
+*Synonymes français:* glorieux, renommée
+
+---
+
+### génération
+
+**Confluent:** aitakolu
+- Type: composition
+- Composition: `aita-kolu`
+- Domaine: temps
+- Note: Unité de temps civilisationnelle
+
+*Synonymes français:* générations
+
+---
+
+### honneur
+
+**Confluent:** tosanemu
+- Type: composition
+- Composition: `tosa-nemu`
+- Domaine: valeur_sociale
+- Note: Valeur morale
+
+*Synonymes français:* honorable
+
+---
+
+### héréditaire
+
+**Confluent:** aitakovi
+- Type: composition
+- Composition: `aita-kovi`
+- Domaine: politique
+- Note: Concept à rejeter - transmission familiale du pouvoir
+
+---
+
+### indigne
+
+**Confluent:** pakaveli
+- Type: composition
+- Composition: `paka-veli`
+- Domaine: valeur_sociale
+- Note: Déshonorant
+
+---
+
+### louer
+
+**Confluent:** vokitosa
+- Type: composition
+- Composition: `voki-tosa`
+- Domaine: action_sociale
+- Note: Complimenter, faire l'éloge
+
+*Synonymes français:* louange, éloge, complimenter
+
+---
+
+### monopole
+
+**Confluent:** ikokonu
+- Type: composition
+- Composition: `iko-konu`
+- Domaine: economie_politique
+- Note: Contrôle exclusif (crucial pour économie)
+
+---
+
+### multi-générationnel
+
+**Confluent:** ekaitavi
+- Type: composition
+- Composition: `eka-aita-vi`
+- Domaine: temps_philosophie
+- Note: Qui traverse plusieurs générations (crucial pour artefacts)
+
+*Synonymes français:* transgénérationnel
+
+---
+
+### multicouche
+
+**Confluent:** kovasu
+- Type: composition
+- Composition: `kova-su`
+- Domaine: art_philosophie
+- Note: Concept des fresques à plusieurs strates temporelles
+
+*Synonymes français:* multi-couche, stratifié
+
+---
+
+### mériter
+
+**Confluent:** tosaki
+- Type: composition
+- Composition: `tosa-ki`
+- Domaine: valeur_sociale
+- Note: Gagner par le mérite
+
+*Synonymes français:* mérite, gagner
+
+---
+
+### permanent
+
+**Confluent:** aikaveli
+- Type: composition
+- Composition: `aika-veli`
+- Domaine: temps
+- Note: Non temporaire
+
+*Synonymes français:* permanente, durable
+
+---
+
+### porter un regard libre
+
+**Confluent:** kanusiliaska
+- Type: composition
+- Composition: `kanu-sili-aska`
+- Domaine: philosophie_centrale
+- Note: Concept central de la civilisation - pèlerinage obligatoire, identité culturelle
+
+---
+
+### promis à pareil destin
+
+**Confluent:** savuosikota
+- Type: composition
+- Composition: `sav-u-osi-kota`
+- Domaine: philosophie_centrale
+- Note: Phrase existentielle clé : peur de disparaître comme les Premiers Ancêtres
+
+---
+
+### relais
+
+**Confluent:** vasiaita
+- Type: composition
+- Composition: `vasi-aita`
+- Domaine: temps_philosophie
+- Note: Transmission à travers le temps
+
+*Synonymes français:* transmission, passage témoin
+
+---
+
+### relais de mémorisation
+
+**Confluent:** vasinemu
+- Type: composition
+- Composition: `vasi-nemu`
+- Domaine: techniques_culturelles
+- Note: Technique des Ailes-Grises pour interpréter la fresque
+
+---
+
+### reproche
+
+**Confluent:** vokipaka
+- Type: composition
+- Composition: `voki-paka`
+- Domaine: action_sociale
+- Note: Critique
+
+*Synonymes français:* reprocher, blâme
+
+---
+
+### satisfaire
+
+**Confluent:** tosavi
+- Type: composition
+- Composition: `tosa-vi`
+- Domaine: action_sociale
+- Note: Répondre aux attentes
+
+*Synonymes français:* satisfaction, contenter
+
+---
+
+### stratification temporelle
+
+**Confluent:** aikakovasu
+- Type: composition
+- Composition: `aika-kova-su`
+- Domaine: philosophie
+- Note: Couches de temps superposées
+
+---
+
+### suffocation
+
+**Confluent:** venuosi
+- Type: composition
+- Composition: `ven-u-osi`
+- Domaine: danger_spirituel
+- Note: Effet de rester trop longtemps dans les Antres (spirituel)
+
+*Synonymes français:* suffoquer, étouffement
+
+---
+
+### temporaire
+
+**Confluent:** aikapisu
+- Type: composition
+- Composition: `aika-pisu`
+- Domaine: temps
+- Note: Opposé de permanent
+
+*Synonymes français:* transitoire, éphémère
+
+---
+
+### temporalité
+
+**Confluent:** aikakota
+- Type: composition
+- Composition: `aika-kota`
+- Domaine: philosophie
+- Note: Concept du temps
+
+---
+
+### éternel
+
+**Confluent:** ekaaikavi
+- Type: composition
+- Composition: `eka-aika-vi`
+- Domaine: temps_philosophie
+- Note: Sans fin
+
+*Synonymes français:* éternité, perpétuel
+
+---
+
+## Étrangers
+
+### accueillir
+
+**Confluent:** takavi *(forme liée: takav)*
+- Type: racine
+- Domaine: action_sociale
+- Note: Recevoir, accepter l'arrivée de
+
+*Synonymes français:* accueil, recevoir
+
+---
+
+### alliance
+
+**Confluent:** savukota
+- Type: composition
+- Composition: `sav-u-kota`
+- Domaine: politique
+- Note: Accord entre peuples
+
+*Synonymes français:* pacte, accord
+
+---
+
+### ambassadeur
+
+**Confluent:** vokiotana
+- Type: composition
+- Composition: `voki-ota-na`
+- Domaine: role_politique
+- Note: Celui qui parle au nom de son peuple auprès des étrangers
+
+*Synonymes français:* émissaire, envoyé
+
+---
+
+### cheveux
+
+**Confluent:** pupu *(forme liée: pup)*
+- Type: racine
+- Domaine: corps
+- Note: Partie du corps qui pousse sur la tête
+
+*Synonymes français:* chevelure, poils
+
+---
+
+### cheveux de sang
+
+**Confluent:** mkatuvizi
+- Type: composition
+- Composition: `pupu-a-pasu-la`
+- Domaine: description_physique
+- Note: Descriptif initial des étrangers aux cheveux roux
+
+---
+
+### commerce
+
+**Confluent:** kilukota
+- Type: composition
+- Composition: `kil-u-kota`
+- Domaine: economie
+- Note: Échanges réguliers entre groupes
+
+*Synonymes français:* échange commercial, négoce
+
+---
+
+### commun
+
+**Confluent:** bzekazu
+- Type: composition
+- Composition: `kota-vi`
+- Domaine: social
+- Note: Ce qui appartient à tous
+
+*Synonymes français:* partagé, collectif, commune
+
+---
+
+### comprendre
+
+**Confluent:** silumi
+- Type: composition
+- Composition: `sil-umi`
+- Domaine: cognition
+- Note: Saisir le sens
+
+*Synonymes français:* compréhension, saisir
+
+---
+
+### confiance
+
+**Confluent:** kolaska
+- Type: composition
+- Composition: `kol-aska`
+- Domaine: emotion
+- Note: Ouvrir son cœur sans crainte
+
+*Synonymes français:* confiant, foi
+
+---
+
+### contact
+
+**Confluent:** kotavuki
+- Type: composition
+- Composition: `kotav-uki`
+- Domaine: action_sociale
+- Note: Premier contact, toucher
+
+*Synonymes français:* toucher, rencontre initiale
+
+---
+
+### curiosité
+
+**Confluent:** siliota
+- Type: composition
+- Composition: `sili-ota`
+- Domaine: emotion
+- Note: Désir de découvrir l'inconnu
+
+*Synonymes français:* curieux, intérêt
+
+---
+
+### différent
+
+**Confluent:** otavi
+- Type: composition
+- Composition: `ota-vi`
+- Domaine: alterite
+- Note: Suffixe adjectival -vi
+
+*Synonymes français:* différente, différents, différentes
+
+---
+
+### découverte
+
+**Confluent:** nuvisili
+- Type: composition
+- Composition: `nuvi-sili`
+- Domaine: cognition
+- Note: Voir pour la première fois
+
+*Synonymes français:* découvrir, trouver
+
+---
+
+### frontière
+
+**Confluent:** linuota
+- Type: composition
+- Composition: `lin-u-ota`
+- Domaine: geographie
+- Note: Limite entre nous et les autres
+
+*Synonymes français:* limite, frontières, bord
+
+---
+
+### geste
+
+**Confluent:** kanuki
+- Type: composition
+- Composition: `kan-uki`
+- Domaine: communication
+- Note: Communication non-verbale
+
+*Synonymes français:* gestes, signe
+
+---
+
+### hostile
+
+**Confluent:** zanaoti
+- Type: composition
+- Composition: `zana-ot-i`
+- Domaine: attitude
+- Note: Agressif envers l'étranger
+
+*Synonymes français:* agressif, ennemi, hostile
+
+---
+
+### inconnu
+
+**Confluent:** otasili
+- Type: composition
+- Composition: `ota-sili`
+- Domaine: alterite
+- Note: Ce qui n'a jamais été observé
+
+*Synonymes français:* inconnus, inconnue, inconnues
+
+---
+
+### intention
+
+**Confluent:** umikoli
+- Type: composition
+- Composition: `umi-koli`
+- Domaine: cognition
+- Note: Ce qu'on veut faire, la volonté
+
+*Synonymes français:* volonté, but, dessein
+
+---
+
+### interprète
+
+**Confluent:** vokikota
+- Type: composition
+- Composition: `voki-kota`
+- Domaine: role_communication
+- Note: Celui qui traduit entre langues
+
+*Synonymes français:* traducteur
+
+---
+
+### l'autre
+
+**Confluent:** ota *(forme liée: ot)*
+- Type: racine_sacree
+- Domaine: alterite
+- Note: Concept philosophique : celui qui ne partage ni ancêtres, ni langue, ni intentions
+
+*Synonymes français:* autre, l'Autre
+
+---
+
+### langue
+
+**Confluent:** vokina
+- Type: composition
+- Composition: `voki-na`
+- Domaine: communication
+- Note: Système linguistique (distinct de langue organe)
+
+*Synonymes français:* langage, idiome
+
+---
+
+### méfiance
+
+**Confluent:** silikonu
+- Type: composition
+- Composition: `sili-ko-nu`
+- Domaine: emotion
+- Note: Ne pas faire confiance, observer avec prudence
+
+*Synonymes français:* méfiant, suspicion
+
+---
+
+### nanzagouet
+
+**Confluent:** pupasula
+- Type: composition
+- Composition: `pupu-a-pasu-la`
+- Domaine: peuple_etranger
+- Note: Nom donné aux étrangers aux cheveux roux - 'Cheveux de Sang'
+
+*Synonymes français:* Nanzagouet, peuple aux cheveux roux
+
+---
+
+### pacifique
+
+**Confluent:** tlosovi
+- Type: composition
+- Composition: `tosa-vi`
+- Domaine: attitude
+- Note: Sans agressivité
+
+*Synonymes français:* paisible, pacifiques, bienveillant
+
+---
+
+### partager
+
+**Confluent:** kiluvi
+- Type: composition
+- Composition: `kil-u-vi`
+- Domaine: action_sociale
+- Note: Donner une partie à l'autre
+
+*Synonymes français:* partage, distribuer
+
+---
+
+### premiers ancêtres
+
+**Confluent:** enuaita
+- Type: composition
+- Composition: `en-u-aita`
+- Domaine: histoire
+- Note: Peuple disparu distinct des ancêtres directs (aita)
+
+*Synonymes français:* Premiers Ancêtres
+
+---
+
+### rejeter
+
+**Confluent:** volaki *(forme liée: volak)*
+- Type: racine
+- Domaine: action_sociale
+- Note: Repousser, refuser
+
+*Synonymes français:* rejet, repousser, refuser
+
+---
+
+### rencontrer
+
+**Confluent:** kotavi *(forme liée: kotav)*
+- Type: racine
+- Domaine: action_sociale
+- Note: Croiser le chemin de, se rencontrer
+
+*Synonymes français:* rencontre, croiser
+
+---
+
+### roux
+
+**Confluent:** pasovi
+- Type: composition
+- Composition: `paso-vi`
+- Domaine: couleur
+- Note: Utilise la racine pasu (sang) pour rouge
+
+*Synonymes français:* rousse, rouge, rouges
+
+---
+
+### similitude
+
+**Confluent:** silikinu
+- Type: composition
+- Composition: `sili-ki-nu`
+- Domaine: concept
+- Note: Ressemblance, points communs
+
+*Synonymes français:* ressemblance, semblable, similaire
+
+---
+
+### territoire
+
+**Confluent:** tokukota
+- Type: composition
+- Composition: `tok-u-kota`
+- Domaine: geographie
+- Note: Terre qui appartient au peuple
+
+*Synonymes français:* terre, domaine
+
+---
+
+### traité
+
+**Confluent:** savukova
+- Type: composition
+- Composition: `sav-u-kova`
+- Domaine: politique
+- Note: Accord formel écrit
+
+*Synonymes français:* accord écrit, traités
+
+---
+
+### étranger
+
+**Confluent:** otana
+- Type: racine_sacree_composee
+- Composition: `ota-na`
+- Domaine: alterite
+- Note: Racine sacrée ota (autre, extérieur) + suffixe agent -na
+
+*Synonymes français:* inconnu, étranger, étrangère, étrangers
+
+---
+
+## Actions Militaires
+
+### abordage
+
+**Confluent:** vanuzanaki
+- Type: composition
+- Composition: `vanu-zana-ki`
+- Domaine: combat_maritime
+- Note: Attaque d'un navire
+
+*Synonymes français:* aborder (attaque)
+
+---
+
+### arracher
+
+**Confluent:** kanuvoli
+- Type: composition
+- Composition: `kanu-voli`
+- Domaine: action_violente
+- Note: Enlever de force
+
+*Synonymes français:* enlever de force, déchirer
+
+---
+
+### audace
+
+**Confluent:** bzapagvo
+- Type: composition
+- Composition: `kol-aska`
+- Domaine: qualite_guerriere
+- Note: Qualité de courage
+
+*Synonymes français:* audacieux, courage, brave
+
+---
+
+### capturer
+
+**Confluent:** konuki
+- Type: composition
+- Composition: `kon-uki`
+- Domaine: action_militaire
+- Note: Prendre prisonnier
+
+*Synonymes français:* capture, captif, prisonnier
+
+---
+
+### choc
+
+**Confluent:** kolikopuvi
+- Type: composition
+- Composition: `koli-kopu-vi`
+- Domaine: emotion
+- Note: Traumatisme émotionnel violent
+
+*Synonymes français:* traumatisme, stupeur
+
+---
+
+### courir après
+
+**Confluent:** pekikazo
+- Type: composition
+- Composition: `peki-kazo`
+- Domaine: action_militaire
+- Note: Poursuite
+
+*Synonymes français:* poursuivre, poursuite, chasser
+
+---
+
+### désordre
+
+**Confluent:** kotavoli
+- Type: composition
+- Composition: `kota-voli`
+- Domaine: etat
+- Note: Chaos, absence d'organisation
+
+*Synonymes français:* chaos, confusion
+
+---
+
+### embuscade
+
+**Confluent:** konusili
+- Type: composition
+- Composition: `konu-sili`
+- Domaine: tactique_militaire
+- Note: Tactique de surprise
+
+*Synonymes français:* guet-apens, piège
+
+---
+
+### forcer à rester
+
+**Confluent:** tulimaki
+- Type: composition
+- Composition: `tuli-maki`
+- Domaine: action_militaire
+- Note: Contrainte physique
+
+*Synonymes français:* contraindre, retenir
+
+---
+
+### garrison
+
+**Confluent:** konutulitoka
+- Type: composition
+- Composition: `kon-u-tuli-toka`
+- Domaine: structure_militaire
+- Note: Groupe de défense permanent
+
+*Synonymes français:* garnison
+
+---
+
+### imprévu
+
+**Confluent:** silinovi
+- Type: composition
+- Composition: `sili-no-vi`
+- Domaine: evenement
+- Note: Événement inattendu
+
+*Synonymes français:* inattendu, surprise
+
+---
+
+### initiative
+
+**Confluent:** ikikoli
+- Type: composition
+- Composition: `iki-koli`
+- Domaine: qualite_tactique
+- Note: Prise de décision autonome
+
+*Synonymes français:* prendre l'initiative
+
+---
+
+### interrogation
+
+**Confluent:** vokikonuki
+- Type: composition
+- Composition: `voki-kon-uki`
+- Domaine: action_militaire
+- Note: Questionnement de captifs
+
+*Synonymes français:* interroger, questionner
+
+---
+
+### menacer
+
+**Confluent:** zanasili
+- Type: composition
+- Composition: `zana-sili`
+- Domaine: action_militaire
+- Note: Action d'intimidation
+
+*Synonymes français:* menace, intimidation, intimider
+
+---
+
+### mâter
+
+**Confluent:** konupaka
+- Type: composition
+- Composition: `kon-u-paka`
+- Domaine: action_militaire
+- Note: Soumettre par la force brutale
+
+*Synonymes français:* réprimer, briser
+
+---
+
+### observation
+
+**Confluent:** zvabavoze
+- Type: composition
+- Composition: `sili-konu`
+- Domaine: tactique_militaire
+- Note: Surveillance des ennemis
+
+*Synonymes français:* observer, surveiller, surveillance
+
+---
+
+### orgueilleux
+
+**Confluent:** kolimakovi
+- Type: composition
+- Composition: `koli-mako-vi`
+- Domaine: defaut_caractere
+- Note: Défaut caractériel - arrogance
+
+*Synonymes français:* arrogant, orgueil, fier
+
+---
+
+### paniquer
+
+**Confluent:** kolivolu
+- Type: composition
+- Composition: `koli-volu`
+- Domaine: emotion_combat
+- Note: Peur panique
+
+*Synonymes français:* panique, affolement, s'affoler
+
+---
+
+### patient
+
+**Confluent:** teluveli
+- Type: composition
+- Composition: `telu-veli`
+- Domaine: qualite
+- Note: Vertu - capacité d'attendre
+
+*Synonymes français:* patience, calme
+
+---
+
+### rouer de coups
+
+**Confluent:** kopusuvi
+- Type: composition
+- Composition: `kopu-su-vi`
+- Domaine: violence
+- Note: Violence physique répétée
+
+*Synonymes français:* battre, frapper violemment
+
+---
+
+### réserves
+
+**Confluent:** zanakovu
+- Type: composition
+- Composition: `zana-kovu`
+- Domaine: logistique_militaire
+- Note: Stocks d'urgence (armes, nourriture)
+
+*Synonymes français:* stocks militaires
+
+---
+
+### résister
+
+**Confluent:** konuveli
+- Type: composition
+- Composition: `kon-u-veli`
+- Domaine: action_militaire
+- Note: Opposition, défense
+
+*Synonymes français:* résistance, tenir bon, s'opposer
+
+---
+
+### se faire passer pour
+
+**Confluent:** ksusetu
+- Type: composition
+- Composition: `muka-vi`
+- Domaine: action_militaire
+- Note: Déguisement/subterfuge
+
+*Synonymes français:* imiter, se déguiser, feindre
+
+---
+
+### soumettre
+
+**Confluent:** konumaki
+- Type: composition
+- Composition: `kon-u-maki`
+- Domaine: action_militaire
+- Note: Forcer la reddition
+
+*Synonymes français:* soumission, dominer
+
+---
+
+### surnombre
+
+**Confluent:** ikomako
+- Type: composition
+- Composition: `iko-mako`
+- Domaine: tactique_militaire
+- Note: Supériorité numérique
+
+*Synonymes français:* supériorité numérique
+
+---
+
+### vulnérable
+
+**Confluent:** konupisu
+- Type: composition
+- Composition: `kon-u-pisu`
+- Domaine: etat_militaire
+- Note: État de faiblesse, non protégé
+
+*Synonymes français:* faible, exposé
+
+---
+
+### émeute
+
+**Confluent:** kotavolisu
+- Type: composition
+- Composition: `kota-voli-su`
+- Domaine: social_violent
+- Note: Rébellion collective
+
+*Synonymes français:* révolte, insurrection
+
+---
+
+## Vêtements et Apparence
+
+### adaptation
+
+**Confluent:** sanukotavi
+- Type: composition
+- Composition: `san-u-kota-vi`
+- Domaine: evolution
+- Note: Changements corporels pour s'adapter à l'environnement
+
+*Synonymes français:* adapté, s'adapter
+
+---
+
+### allongé
+
+**Confluent:** linumako
+- Type: composition
+- Composition: `lin-u-mako`
+- Domaine: forme
+- Note: Forme corporelle étirée (membres allongés)
+
+*Synonymes français:* allongée, étiré, long
+
+---
+
+### aveugle
+
+**Confluent:** silivoli
+- Type: composition
+- Composition: `sili-voli`
+- Domaine: handicap
+- Note: Perte de vision
+
+*Synonymes français:* cécité, non-voyant
+
+---
+
+### barbe
+
+**Confluent:** mukupupu
+- Type: composition
+- Composition: `muka-pupu`
+- Domaine: corps
+- Note: Pilosité faciale
+
+---
+
+### bracelet
+
+**Confluent:** kanulinu
+- Type: composition
+- Composition: `kan-u-linu`
+- Domaine: parure
+- Note: Objet porté au bras
+
+*Synonymes français:* bracelets
+
+---
+
+### cape
+
+**Confluent:** vekumako
+- Type: composition
+- Composition: `vek-u-mako`
+- Domaine: vetement
+- Note: Vêtement ample qui couvre
+
+*Synonymes français:* manteau, capes
+
+---
+
+### ceinture
+
+**Confluent:** nutulinu
+- Type: composition
+- Composition: `nutu-linu`
+- Domaine: vetement
+- Note: Lien autour de la taille
+
+*Synonymes français:* ceintures
+
+---
+
+### cicatrice
+
+**Confluent:** vekukova
+- Type: composition
+- Composition: `vek-u-kova`
+- Domaine: corps
+- Note: Marque permanente sur la peau
+
+*Synonymes français:* cicatrices, balafre
+
+---
+
+### coiffure
+
+**Confluent:** pupukova
+- Type: composition
+- Composition: `pupu-kova`
+- Domaine: apparence
+- Note: Style de cheveux
+
+*Synonymes français:* coiffures
+
+---
+
+### collier
+
+**Confluent:** mutulinu
+- Type: composition
+- Composition: `mutu-linu`
+- Domaine: parure
+- Note: Objet porté autour du cou
+
+*Synonymes français:* colliers
+
+---
+
+### correspondre
+
+**Confluent:** snulibe
+- Type: composition
+- Composition: `kota-vi`
+- Domaine: relation
+- Note: Adéquation de taille, compatibilité
+
+*Synonymes français:* correspondance, être adapté, convenir
+
+---
+
+### couper
+
+**Confluent:** voliuki
+- Type: composition
+- Composition: `voli-uki`
+- Domaine: action
+- Note: Séparer en deux
+
+*Synonymes français:* découper, séparer
+
+---
+
+### exhiber nu
+
+**Confluent:** silivekuvoli
+- Type: composition
+- Composition: `sili-vek-u-voli`
+- Domaine: action
+- Note: Montrer la nudité
+
+---
+
+### morphologie
+
+**Confluent:** sanukova
+- Type: composition
+- Composition: `san-u-kova`
+- Domaine: apparence
+- Note: Structure physique
+
+*Synonymes français:* forme corporelle
+
+---
+
+### nu
+
+**Confluent:** vekuvoli
+- Type: composition
+- Composition: `vek-u-voli`
+- Domaine: apparence
+- Note: Sans vêtement
+
+*Synonymes français:* nudité, dénudé
+
+---
+
+### oripeaux
+
+**Confluent:** vekupaka
+- Type: composition
+- Composition: `vek-u-paka`
+- Domaine: vetement
+- Note: Vêtements en mauvais état
+
+*Synonymes français:* haillons, guenilles
+
+---
+
+### peinture corporelle
+
+**Confluent:** btabimepa
+- Type: composition
+- Composition: `sanu-kova`
+- Domaine: parure
+- Note: Décorations peintes sur la peau
+
+*Synonymes français:* tatouage, motifs corporels
+
+---
+
+### propre
+
+**Confluent:** vekupuli
+- Type: composition
+- Composition: `vek-u-puli`
+- Domaine: etat
+- Note: Nettoyé, sans saleté
+
+*Synonymes français:* propreté, pur, net
+
+---
+
+### pâle
+
+**Confluent:** miluveku
+- Type: composition
+- Composition: `milu-veku`
+- Domaine: couleur_peau
+- Note: Couleur de peau claire (Enfants des Échos)
+
+*Synonymes français:* pâleur, blancheur
+
+---
+
+### sale
+
+**Confluent:** nvukosisa
+- Type: composition
+- Composition: `vek-u-paka`
+- Domaine: etat
+- Note: Non propre, souillé
+
+*Synonymes français:* souillé, crasseux
+
+---
+
+### taille
+
+**Confluent:** sanumako
+- Type: composition
+- Composition: `san-u-mako`
+- Domaine: apparence
+- Note: Dimensions corporelles
+
+*Synonymes français:* grandeur, stature
+
+---
+
+### tenue
+
+**Confluent:** sanuveku
+- Type: composition
+- Composition: `san-u-veku`
+- Domaine: vetement
+- Note: Ensemble de vêtements
+
+*Synonymes français:* tenues, costume
+
+---
+
+### trancher
+
+**Confluent:** bituki
+- Type: composition
+- Composition: `bit-uki`
+- Domaine: action
+- Note: Couper net (cheveux, corde, etc.)
+
+*Synonymes français:* couper, sectionner
+
+---
+
+### tresser
+
+**Confluent:** linukotavi
+- Type: composition
+- Composition: `linu-kota-vi`
+- Domaine: action_artisanale
+- Note: Entrelacer (cheveux, fibres, cordes)
+
+*Synonymes français:* tressage, entrelacer, natter
+
+---
+
+### vêtement
+
+**Confluent:** vekuvi
+- Type: composition
+- Composition: `vek-u-vi`
+- Domaine: vetement
+- Note: Ce qu'on porte sur le corps
+
+*Synonymes français:* vêtements, habit, habits
+
+---
+
diff --git a/ancien-confluent/generer-lexique-complet.bat b/ancien-confluent/generer-lexique-complet.bat
new file mode 100644
index 0000000..c304e85
--- /dev/null
+++ b/ancien-confluent/generer-lexique-complet.bat
@@ -0,0 +1,25 @@
+@echo off
+REM Script batch pour générer le lexique complet sous Windows
+REM Appelle simplement le script Node.js
+
+echo.
+echo ========================================
+echo Generation du lexique complet
+echo ========================================
+echo.
+
+node "%~dp0generer-lexique-complet.js"
+
+if %ERRORLEVEL% EQU 0 (
+ echo.
+ echo ========================================
+ echo Terminé avec succès !
+ echo ========================================
+) else (
+ echo.
+ echo ========================================
+ echo Erreur lors de la génération
+ echo ========================================
+)
+
+pause
diff --git a/ancien-confluent/generer-lexique-complet.js b/ancien-confluent/generer-lexique-complet.js
new file mode 100644
index 0000000..62d00cd
--- /dev/null
+++ b/ancien-confluent/generer-lexique-complet.js
@@ -0,0 +1,191 @@
+#!/usr/bin/env node
+
+/**
+ * Script de génération du lexique complet en Markdown
+ * Lit tous les fichiers JSON du dossier ./lexique/ et génère ./docs/LEXIQUE-COMPLET.md
+ */
+
+const fs = require('fs');
+const path = require('path');
+
+// Chemins relatifs (pas de hard path)
+const LEXIQUE_DIR = path.join(__dirname, 'lexique');
+const OUTPUT_FILE = path.join(__dirname, 'docs', 'LEXIQUE-COMPLET.md');
+
+// Mapping des noms de fichiers vers des titres lisibles
+const CATEGORIES = {
+ '00-grammaire': 'Grammaire et Règles',
+ '01-racines-sacrees': 'Racines Sacrées',
+ '02-racines-standards': 'Racines Standards',
+ '03-castes': 'Castes',
+ '04-lieux': 'Lieux',
+ '05-corps-sens': 'Corps et Sens',
+ '06-actions': 'Actions',
+ '07-emotions': 'Émotions',
+ '08-nature-elements': 'Nature et Éléments',
+ '09-institutions': 'Institutions',
+ '10-animaux': 'Animaux',
+ '11-armes-outils': 'Armes et Outils',
+ '12-abstraits': 'Concepts Abstraits',
+ '13-rituels': 'Rituels',
+ '14-geographie': 'Géographie',
+ '15-roles-titres': 'Rôles et Titres',
+ '16-communication': 'Communication',
+ '17-temps': 'Temps',
+ '18-couleurs': 'Couleurs',
+ '19-sante-dangers': 'Santé et Dangers',
+ '20-objets-materiaux': 'Objets et Matériaux',
+ '21-famille': 'Famille',
+ '22-nombres': 'Nombres',
+ '23-nourriture': 'Nourriture',
+ '24-habitat': 'Habitat',
+ '25-navigation': 'Navigation',
+ '26-architecture': 'Architecture',
+ '27-concepts-philosophiques': 'Concepts Philosophiques',
+ '28-etrangers': 'Étrangers',
+ '29-actions-militaires': 'Actions Militaires',
+ '30-vetements-apparence': 'Vêtements et Apparence'
+};
+
+/**
+ * Génère une section Markdown pour une catégorie
+ */
+function generateCategorySection(categoryName, data) {
+ let markdown = `## ${categoryName}\n\n`;
+
+ if (!data.dictionnaire) {
+ return markdown + '*Aucune entrée*\n\n';
+ }
+
+ // Trier les mots français par ordre alphabétique
+ const sortedWords = Object.keys(data.dictionnaire).sort();
+
+ for (const motFr of sortedWords) {
+ const entry = data.dictionnaire[motFr];
+
+ markdown += `### ${motFr}\n\n`;
+
+ // Traductions en Confluent
+ if (entry.traductions && entry.traductions.length > 0) {
+ for (const trad of entry.traductions) {
+ markdown += `**Confluent:** ${trad.confluent}`;
+
+ if (trad.forme_liee) {
+ markdown += ` *(forme liée: ${trad.forme_liee})*`;
+ }
+
+ markdown += `\n`;
+
+ if (trad.type) {
+ markdown += `- Type: ${trad.type}\n`;
+ }
+
+ if (trad.composition) {
+ markdown += `- Composition: \`${trad.composition}\`\n`;
+ }
+
+ if (trad.domaine) {
+ markdown += `- Domaine: ${trad.domaine}\n`;
+ }
+
+ if (trad.note) {
+ markdown += `- Note: ${trad.note}\n`;
+ }
+
+ markdown += '\n';
+ }
+ }
+
+ // Synonymes français
+ if (entry.synonymes_fr && entry.synonymes_fr.length > 0) {
+ markdown += `*Synonymes français:* ${entry.synonymes_fr.join(', ')}\n\n`;
+ }
+
+ markdown += '---\n\n';
+ }
+
+ return markdown;
+}
+
+/**
+ * Fonction principale
+ */
+function main() {
+ console.log('🔨 Génération du lexique complet...\n');
+
+ // Vérifier que le dossier lexique existe
+ if (!fs.existsSync(LEXIQUE_DIR)) {
+ console.error(`❌ Erreur: Le dossier ${LEXIQUE_DIR} n'existe pas`);
+ process.exit(1);
+ }
+
+ // Créer le dossier docs s'il n'existe pas
+ const docsDir = path.dirname(OUTPUT_FILE);
+ if (!fs.existsSync(docsDir)) {
+ fs.mkdirSync(docsDir, { recursive: true });
+ console.log(`📁 Dossier créé: ${docsDir}`);
+ }
+
+ // Lire tous les fichiers JSON du lexique
+ const files = fs.readdirSync(LEXIQUE_DIR)
+ .filter(f => f.endsWith('.json') && !f.startsWith('_') && !f.endsWith('.backup'))
+ .sort();
+
+ console.log(`📚 ${files.length} fichiers de lexique trouvés\n`);
+
+ // Générer le header Markdown
+ let markdown = `# Lexique Complet du Confluent\n\n`;
+ markdown += `*Généré automatiquement le ${new Date().toLocaleDateString('fr-FR')} à ${new Date().toLocaleTimeString('fr-FR')}*\n\n`;
+ markdown += `---\n\n`;
+ markdown += `## Table des matières\n\n`;
+
+ // Générer la table des matières
+ for (const file of files) {
+ const baseName = path.basename(file, '.json');
+ const categoryName = CATEGORIES[baseName] || baseName;
+ markdown += `- [${categoryName}](#${categoryName.toLowerCase().replace(/\s+/g, '-').replace(/[éè]/g, 'e').replace(/[àâ]/g, 'a')})\n`;
+ }
+
+ markdown += `\n---\n\n`;
+
+ // Générer les sections pour chaque catégorie
+ let totalEntries = 0;
+
+ for (const file of files) {
+ const baseName = path.basename(file, '.json');
+ const categoryName = CATEGORIES[baseName] || baseName;
+ const filePath = path.join(LEXIQUE_DIR, file);
+
+ console.log(`📖 Traitement de: ${categoryName}`);
+
+ try {
+ const data = JSON.parse(fs.readFileSync(filePath, 'utf-8'));
+
+ if (data.dictionnaire) {
+ const entryCount = Object.keys(data.dictionnaire).length;
+ totalEntries += entryCount;
+ console.log(` → ${entryCount} entrées`);
+ }
+
+ markdown += generateCategorySection(categoryName, data);
+
+ } catch (err) {
+ console.error(`❌ Erreur lors de la lecture de ${file}:`, err.message);
+ markdown += `## ${categoryName}\n\n*Erreur lors du chargement de cette catégorie*\n\n`;
+ }
+ }
+
+ // Écrire le fichier de sortie
+ fs.writeFileSync(OUTPUT_FILE, markdown, 'utf-8');
+
+ console.log(`\n✅ Lexique généré avec succès!`);
+ console.log(`📊 Total: ${totalEntries} entrées`);
+ console.log(`📝 Fichier créé: ${OUTPUT_FILE}\n`);
+}
+
+// Exécuter le script
+if (require.main === module) {
+ main();
+}
+
+module.exports = { generateCategorySection };