# Contrôler IKG sans lancer les services
> **En bref :**
> Ce contrôle lit la configuration d'IKG et ses valeurs par défaut, sans démarrer l'application. Statut : **Confirmé** pour la lecture ; l'installation reste **Non exécutée**.

**Résultat :** code `0`, cinq fichiers lus, le 22 octobre 2026, relancé le 30 octobre 2026 avec le même résultat. Par défaut, le bus de messages et le moteur de recherche (Elasticsearch) sont activés ; le calcul d'embeddings et la classification thématique (Taxi) sont désactivés. Ce ne sont pas les valeurs effectives d'une instance.

## Pourquoi ce contrôle

IKG est le cœur de CRISalid : c'est lui qui écrit le graphe. Le démarrer n'est pas anodin : il écrit dans Neo4j, importe une taxonomie et se connecte au bus. Ce contrôle répond à **« comment IKG est-il configuré par défaut ? »** sans rien déclencher.

## Avant de commencer

- Python 3.11 ou plus récent (pour `tomllib`) et la copie `crisalid-ikg` dans `official-crisalid`.
- **À ne pas faire :** importer `app.main`, charger un `.env` ou lancer la suite de tests amont, qui vide le graphe.

## Étapes

### Étape 1 — Lire la configuration sans importer l'application

**Pourquoi :** connaître les valeurs par défaut sans déclencher les écritures d'un démarrage.

```bash
cd official-crisalid/crisalid-ikg
python3 - <<'PY'
import ast, json, tomllib
from pathlib import Path
files = ['app/main.py', 'app/crisalid_ikg.py', 'app/config.py',
         'app/settings/app_settings.py', 'tests/conftest.py']
trees = {f: ast.parse(Path(f).read_text(encoding='utf-8')) for f in files}
cls = next(n for n in trees['app/settings/app_settings.py'].body
           if isinstance(n, ast.ClassDef) and n.name == 'AppSettings')
wanted = {'amqp_enabled', 'es_enabled', 'embedding_enabled', 'taxi_enabled'}
defaults = {n.target.id: ast.literal_eval(n.value) for n in cls.body
            if isinstance(n, ast.AnnAssign) and getattr(n.target, 'id', None) in wanted}
python = tomllib.loads(Path('pyproject.toml').read_text())['tool']['poetry']['dependencies']['python']
print(json.dumps({'fichiers': len(trees), 'python': python, 'defauts': defaults}))
PY
```

### Étape 2 — Lire le résultat

**Pourquoi :** une valeur par défaut n'est pas une valeur déployée.

Résultat obtenu : Python déclaré `^3.10` ; `amqp_enabled` et `es_enabled` à `true` ; `embedding_enabled` et `taxi_enabled` à `false`. La configuration d'une instance réelle passe par ses variables d'environnement ; ce qu'on observe sur l'instance de la DiBISO est décrit dans [ce que montre l'instance](/03-crisalid/06-instance-saclay/00-ce-que-linstance-demontre).

## Ce que le contrôle établit

Les valeurs par défaut du code, et le fait qu'elles se lisent sans démarrer l'application. Il ne dit rien de l'ingestion, ni des écritures au démarrage.

## Limites

- Ni FastAPI ni la suite de tests amont ne sont lancés.
- Le démarrage d'IKG écrit des contraintes et index dans Neo4j et **supprime le dossier de taxonomie importé** : n'y pointer aucun original.
- La suite de tests amont vide le graphe avant et après chaque test : uniquement sur un graphe jetable.
- Pour démarrer IKG dans une pile isolée : [préparer les données et la pile](/03-crisalid/04-tutoriels/01-parcours/preparer-donnees-et-pile).

## Et ensuite

Contrôle suivant : [Moissonneur et adaptateurs](./preparer-harvester).

Révision lue : `crisalid-ikg` `ebdaae75`.
