docs(evolution): réorganisation docs/FabNum v2/ + points 13-14 + vues progressives

- Déplacement de toute la documentation v2 dans docs/FabNum v2/
- Ajout points 13 (bus d'impact, mémoire situationnelle, IA) et 14 (combinatoire)
- Architecture structurel/situationnel, IVC dynamique inter-sectoriel
- 4 vues architecturales progressives (vue1→vue4) pour présentation
- Génération PNG de tous les diagrammes
- .gitignore : docs/**/*.dot au lieu de docs/*.dot

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
Stéphan Peccini 2026-04-08 11:54:52 +02:00
parent 9970608238
commit e6ff714fca
No known key found for this signature in database
25 changed files with 667 additions and 139 deletions

2
.gitignore vendored
View File

@ -7,7 +7,7 @@ __pycache__/
*.pyo
*.pyd
*.dot
!docs/*.dot
!docs/**/*.dot
prompt.md
.gitignore

View File

@ -5,6 +5,10 @@ Document de brainstorming — capture les réflexions et décisions prises lors
**Date** : 2026-04-02
**Statut** : En cours de réflexion (quoi/pourquoi, pas encore le comment)
## Architecture globale
![Architecture globale FabNum](architecture-globale.png){ width=100% }
## Contraintes transversales
- **Budget : zéro en phase de démarrage** — tout est auto-hébergé et auto-financé. Briques technologiques open source et gratuites. Si le projet trouve son marché, cette contrainte sera réévaluée (ex : Neo4j Enterprise si justifié).
@ -254,6 +258,10 @@ La validation doit être **argumentée**, par au moins une des approches suivant
- Quels intitulés génériques pour les niveaux ? (à définir après revue de littérature)
- Le nombre de niveaux doit-il être fixe ou configurable par chaîne ?
### Modèle de niveaux — Cas possibles
![Modèle de niveaux — Cas possibles](modele-niveaux-cas-possibles.png){ width=100% }
---
## Point 8 — Services, sécurisation et profils de visibilité
@ -441,6 +449,114 @@ Intégrer les **niveaux de stock** comme donnée du graphe pour permettre des **
---
## Point 13 — Bus d'impact (traducteur d'événements externes)
### Quoi
Un **bus d'impact** qui maintient en continu un état situationnel du graphe en traduisant les événements du monde extérieur en impacts chiffrés. Par analogie avec un bus applicatif, il possède une double connaissance :
- **Monde extérieur** — événements géopolitiques, climatiques, économiques, sanitaires, signaux faibles. Sources : veille 360°, actualités, données climatiques, alertes.
- **Monde intérieur** — le graphe FabNum, ses nœuds, ses attributs, ses limites (granularité géographique, disponibilité des données).
Le bus traduit un événement qualitatif ("inondation dans le Yunnan") en impacts quantitatifs sur des nœuds du graphe ("extraction de germanium dans le Yunnan : capacité réduite de 80%").
**Architecture structurel / situationnel :**
Le graphe FabNum a deux couches :
- **Graphe structurel** — la chaîne de valeur telle qu'elle existe : acteurs, pays, capacités nominales, parts de marché, indices. Mis à jour trimestriellement (cycle structurel).
- **Graphe situationnel** — le graphe structurel + les impacts en cours. Reflète la **réalité du terrain** à un instant T. Mis à jour en continu au rythme des événements (cycle situationnel).
Les deux cycles sont **indépendants** :
- Le cycle structurel (trimestriel) met à jour les données de base : qui opère quoi, où, avec quelle capacité nominale.
- Le cycle situationnel (continu, au **rythme décisionnel** — dans l'heure pour un événement majeur si un COMEX doit se réunir) met à jour la réalité : cette mine est inondée, Ormuz est bloqué, les quotas sont en vigueur.
**Le bus maintient une mémoire situationnelle** — il ne fait pas de traduction en one-shot. Les impacts s'accumulent, évoluent et se résolvent au fil du temps :
- Un événement arrive → impact ajouté
- La situation évolue ("l'inondation se résorbe") → impact mis à jour
- L'événement est résolu → impact supprimé ou archivé
Le graphe situationnel reflète ainsi en permanence la **situation mondiale réelle** et non un scénario ponctuel.
**Fonctionnement :**
- La **veille 360°** se connecte au bus et lui injecte des événements.
- L'**IA** analyse l'événement, identifie les nœuds concernés et propose des impacts chiffrés (nœud impacté, type d'impact, pourcentage de réduction, durée estimée).
- Un **expert** valide ou corrige avant injection. Pas d'injection automatique non contrôlée.
- Le **moteur** se connecte au bus et consomme le graphe situationnel. Il n'a pas besoin de comprendre les événements — il travaille sur un graphe avec des capacités réelles.
**Rôle de l'IA :**
La traduction événement → impact est un problème de **raisonnement** (comprendre l'événement, identifier les nœuds concernés, estimer la sévérité), pas d'algorithme. Un LLM avec accès au graphe et aux données contextuelles est le bon outil. Le code seul ne peut pas gérer l'infinie variété des événements possibles.
L'IA supervise aussi l'**évolution** de la situation : elle propose des mises à jour ("l'inondation au Yunnan est terminée, les mines reprennent à 60%"), l'expert valide.
**Signaux faibles :**
Le bus peut aussi traiter des signaux faibles (tensions diplomatiques, sécheresse naissante, changement de politique commerciale) avec une probabilité et une sévérité potentielle, permettant de construire des scénarios prospectifs.
**Indices structurels vs situationnels :**
Les indices se calculent sur les deux couches :
- **IHH structurel** (capacité nominale) vs **IHH situationnel** (capacité réelle avec impacts) — permet de mesurer la dégradation en cours.
- **IVC situationnel** — la pression concurrentielle des autres secteurs dépend de la situation mondiale. Si une crise ralentit l'automobile, sa consommation de cobalt chute et l'IVC effectif pour le numérique diminue. Au démarrage, calcul proportionnel ; à terme, ajustement dynamique basé sur les données de demande sectorielle. Ce point renforce le lien avec le multi-sectoriel (point 9) : l'IVC est le lien entre les secteurs sur les ressources partagées.
### Pourquoi
- Aujourd'hui, tester un scénario dans FabNum oblige à pointer manuellement un minerai et en déduire les impacts. Pas de lien avec le monde réel.
- Les crises sont rarement mono-causales — elles combinent plusieurs événements simultanés (Ormuz + sécheresse + quotas).
- La veille 360° a besoin d'un point d'entrée structuré pour alimenter le moteur.
- Sans ce bus, le moteur est aveugle aux événements extérieurs.
- Un graphe situationnel maintenu en continu donne aux clients une raison de rester connectés plutôt que de faire des analyses ponctuelles.
### Décisions prises
- Le bus d'impact est le **seul point de contact** entre le monde extérieur et le moteur — séparation des responsabilités.
- Le bus maintient une **mémoire situationnelle** — les impacts s'accumulent et évoluent, pas de one-shot.
- Deux couches de graphe : **structurel** (trimestriel) et **situationnel** (continu, rythme décisionnel).
- Les indices se calculent sur les deux couches (structurel vs situationnel).
- L'IA est un composant clé du bus (traduction et suivi), avec validation humaine obligatoire.
- L'IVC situationnel dépend de la demande inter-sectorielle — proportionnel au démarrage, dynamique à terme.
- Point identifié comme horizon — dépend de la granularité géographique (point 11) et des stocks (point 12).
---
## Point 14 — Combinatoire multi-impacts et scénarios
### Quoi
Le moteur reçoit N impacts simultanés du bus (point 13), les applique sur le graphe et en déduit les conséquences cumulées via la projection temporelle (point 12).
Ce n'est **pas un composant actif** mais une **propriété du moteur** : s'il est conçu dès le départ pour recevoir des impacts multiples du bus, la combinatoire est native. C'est une contrainte de conception, pas un développement séparé.
**Concrètement :**
- Chaque impact du bus coupe ou réduit une ou plusieurs branches du graphe.
- Le moteur fait tourner la projection temporelle (point 12) sur le graphe dégradé.
- Le résultat montre quels produits finaux sont impactés, dans quel délai, avec quelle sévérité.
- Si deux événements coupent deux sources différentes d'un même minerai, l'impact combiné est pire que chaque événement seul — le moteur le calcule naturellement.
**Scénarios :**
- Plusieurs scénarios (combinaisons d'événements) peuvent coexister et être comparés.
- Les scénarios peuvent être contextualisés au client : "votre SI dépend de ces chaînes, voici votre exposition face à ce scénario".
### Pourquoi
- Les crises sont multi-causales — un seul événement isolé ne reflète pas la réalité.
- La valeur du moteur est dans la combinaison : montrer que tel produit final résiste à un événement isolé mais pas à la combinaison de deux.
- C'est un service à très forte valeur pour les clients (COMEX, DSI).
### Décisions prises
- Le point 14 est une **contrainte de conception du moteur**, pas un développement séparé. L'asservissement au bus d'impact doit être prévu dès la conception.
- Dépend du point 12 (stocks/projection temporelle) et du point 13 (bus d'impact).
---
## Ordre de réalisation logique
L'ordre des points dans ce document reflète l'ordre de la discussion, pas l'ordre de réalisation. L'analyse des dépendances donne :
@ -470,6 +586,9 @@ L'ordre des points dans ce document reflète l'ordre de la discussion, pas l'ord
- **Point 10** — Ressources transversales (énergie, eau)
- **Point 11** — Granularité géographique fine
- **Point 12** — Stocks et projection temporelle
- **Point 13** — Bus d'impact (traducteur d'événements → impacts chiffrés, IA assistée)
- **Point 14** — Combinatoire multi-impacts (contrainte de conception du moteur, pas un développement séparé)
- **Point 9** — Multi-sectoriel
## MVP (jalon interne)
@ -483,3 +602,21 @@ L'ordre des points dans ce document reflète l'ordre de la discussion, pas l'ord
**Rétro-analyse** : valider les indices sur des crises passées (Spruce Pine, quotas chinois) comme preuve de concept.
**Tests** : toute logique métier est testée (calculs d'indices, requêtage, arbitrage des sources, import/export). Pas de seuil de couverture arbitraire — on teste ce qui compte.
\newpage
## Planification temporelle
![Planification temporelle](planification-temporelle.png){ width=100% }
\newpage
## Diagramme d'Architecture Fonctionnelle (DAF)
![Macro-DAF](macro-daf.png){ height=75% }
\newpage
## Diagramme d'Architecture Technique (DAT)
![Macro-DAT](macro-dat.png){ width=100% }

Binary file not shown.

View File

@ -0,0 +1,166 @@
digraph architecture_fabnum {
// Configuration générale
rankdir=TB;
fontname="Arial";
fontsize=18;
label="FabNum — Architecture globale\n\n";
labelloc=t;
splines=true;
nodesep=0.7;
ranksep=0.9;
node [fontname="Arial", fontsize=11, style="filled,rounded", shape=box, penwidth=1.5];
edge [fontname="Arial", fontsize=9, penwidth=1.2];
// ==================== UTILISATEURS ====================
admin [
label="Administrateur\n\nGère le graphe structurel,\nles sources, les tiers\nde confiance, les arbitrages"
fillcolor="#FFE082"
shape=house
fontsize=10
];
expert [
label="Expert\n\nAnalyse les risques,\nqualifie les données,\nvalide les impacts"
fillcolor="#A5D6A7"
shape=house
fontsize=10
];
client [
label="Client\n(COMEX, Métiers, DSI)\n\nConsulte les analyses,\nles fiches, les alertes.\nPeut contextualiser\nses requêtes."
fillcolor="#EF9A9A"
shape=house
fontsize=10
];
// ==================== ÉCOSYSTÈME / VEILLE 360° ====================
ecosysteme [
label="Écosystème\nveille 360°\n\nDétecte les événements,\nalimente les sources\net le bus d'impact"
fillcolor="#CE93D8"
shape=house
fontsize=10
];
// ==================== API ====================
api [
label="API\n\nPoint d'accès unique\nAuthentification, rôles,\nprofils de visibilité\n\nSert le graphe situationnel\n(structurel accessible aussi)"
fillcolor="#B39DDB"
fontsize=11
penwidth=2
];
// ==================== BUS D'IMPACT ====================
bus [
label="Bus d'impact\n\nMémoire situationnelle\nTraduction événements → impacts\nAccumule, met à jour, archive\nMise à jour en continu\n(rythme décisionnel)"
fillcolor="#FF8A65"
fontsize=11
penwidth=2.5
style="filled,rounded,bold"
];
ia_bus [
label="IA\n\nAnalyse les événements,\npropose les impacts\nchiffrés"
fillcolor="#FFCC80"
fontsize=10
];
// ==================== MOTEUR ====================
moteur [
label="Moteur FabNum\n\nCalcul des indices\n(structurels et situationnels)\nRequêtage, chemins critiques\nGénération fiches (templates)\nArbitrage sources\nProjection temporelle"
fillcolor="#90CAF9"
fontsize=11
penwidth=2
];
// ==================== BASE DE DONNÉES ====================
subgraph cluster_bdd {
label="Base de données (graphe)";
style=filled;
color="#E0F2F1";
fontsize=11;
fontcolor="#00695C";
bdd_struct [
label="Graphe structurel\n\nCapacités nominales\nActeurs, pays, parts de marché\nIndices structurels\nMise à jour trimestrielle"
fillcolor="#80CBC4"
fontsize=10
];
bdd_situa [
label="Graphe situationnel\n\nImpacts actifs\nCapacités réelles\nIndices situationnels\nHistorique des situations"
fillcolor="#4DB6AC"
fontsize=10
];
}
// ==================== VEILLE SUR LES SOURCES ====================
veille [
label="Veille sources\n\nSurveillance des sources (huginn)\nVérification des citations\nAlertes (variations)"
fillcolor="#FFAB91"
fontsize=10
penwidth=1.5
];
// ==================== SOURCES ====================
sources [
label="Sources externes\n\nUSGS, Statista, BRGM,\nScholar Gateway, Consensus,\nWRI Aqueduct, ND-GAIN..."
fillcolor="#E0E0E0"
shape=cylinder
fontsize=10
];
// ==================== DISPOSITION ====================
{ rank=same; admin; expert; client; ecosysteme; }
{ rank=same; bus; api; }
{ rank=same; ia_bus; moteur; }
// ==================== RELATIONS ====================
// Expert → API + validation impacts
expert -> api [label="consulte\nanalyse", color="#2E7D32"];
expert -> bus [label="valide\nles impacts", color="#E65100", style=bold];
// Client → API
client -> api [label="consulte\nles résultats", color="#C62828"];
// Écosystème → Bus d'impact + Sources
ecosysteme -> bus [label="injecte\ndes événements", color="#6A1B9A", penwidth=2];
ecosysteme -> sources [label="alimente\nles sources", color="#6A1B9A", style=dashed];
// Admin → Moteur (accès direct par scripts)
admin -> moteur [label="administre\n(scripts)", color="#E65100", style=bold, penwidth=2];
// IA ↔ Bus
bus -> ia_bus [label="événement\nà analyser", color="#E65100", dir=both];
// Bus → Moteur (impacts chiffrés)
bus -> moteur [label="impacts\nchiffrés", color="#BF360C", penwidth=2];
// API ↔ Moteur
api -> moteur [label="transmet\nles requêtes", color="#4527A0", dir=both];
// Moteur ↔ Base de données
moteur -> bdd_struct [label="lit/écrit\nstructurel", color="#00695C", dir=both];
moteur -> bdd_situa [label="lit/écrit\nsituationnel", color="#00695C", dir=both];
// Bus → BDD situationnel
bus -> bdd_situa [label="met à jour\nles impacts", color="#BF360C", style=dashed];
// Veille → Sources
sources -> veille [label="surveille\nles MAJ", color="#BF360C"];
// Veille → BDD structurel
veille -> bdd_struct [label="met à jour\nles sources", color="#E65100", style=dashed];
// Sources → BDD structurel
sources -> bdd_struct [label="alimente\nles données", color="#546E7A", style=dashed];
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 465 KiB

View File

@ -0,0 +1,73 @@
digraph architecture_vue1 {
rankdir=TB;
fontname="Arial";
fontsize=18;
label="FabNum — Vue 1 : Le moteur\nRequêtage, indices, fiches via API\n";
labelloc=t;
splines=true;
nodesep=0.7;
ranksep=0.9;
node [fontname="Arial", fontsize=10, style="filled,rounded", shape=box, penwidth=1.5];
edge [fontname="Arial", fontsize=9, penwidth=1.2];
// Ligne 1 : utilisateurs (4 colonnes fixes)
admin [
label="Administrateur\n\nGère le graphe,\nles sources, les tiers\nde confiance"
fillcolor="#FFE082" shape=house
];
expert [
label="Expert\n\nAnalyse les risques,\nqualifie les données"
fillcolor="#A5D6A7" shape=house
];
client [
label="Client\n(COMEX, Métiers, DSI)\n\nConsulte les analyses,\nles fiches, les alertes."
fillcolor="#EF9A9A" shape=house
];
// Placeholder veille 360° (invisible)
ph_eco [label="" shape=point width=0.01 style=invis];
{ rank=same; admin; expert; client; ph_eco; }
// Ligne 2 : API + placeholder bus
api [
label="API\n\nPoint d'accès unique\nAuthentification, rôles,\nprofils de visibilité"
fillcolor="#B39DDB" penwidth=2
];
// Placeholder bus (invisible)
ph_bus [label="" shape=point width=0.01 style=invis];
{ rank=same; api; ph_bus; }
// Ligne 3 : Moteur + placeholders
moteur [
label="Moteur FabNum\n\nCalcul des indices\n(IHH, ICS, IVC, ISG)\nRequêtage du graphe\nChemins critiques\nGénération fiches (templates)\nArbitrage des sources"
fillcolor="#90CAF9" penwidth=2
];
// Placeholder IA (invisible)
ph_ia [label="" shape=point width=0.01 style=invis];
// Placeholder veille (invisible)
ph_veille [label="" shape=point width=0.01 style=invis];
{ rank=same; ph_veille; moteur; ph_ia; }
// Ligne 4 : BDD + sources
bdd [
label="Base de données\n(graphe)\n\nNœuds, relations, indices\nSources rattachées\nHistorique des données"
fillcolor="#80CBC4" penwidth=2
];
sources [
label="Sources externes\n\nUSGS, Statista, BRGM,\nScholar Gateway, Consensus,\nWRI Aqueduct, ND-GAIN..."
fillcolor="#E0E0E0" shape=cylinder
];
{ rank=same; bdd; sources; }
// Relations
expert -> api [label="consulte\nanalyse", color="#2E7D32"];
client -> api [label="consulte\nles résultats", color="#C62828"];
admin -> moteur [label="administre\n(scripts)", color="#E65100", style=bold, penwidth=2];
api -> moteur [label="transmet\nles requêtes", color="#4527A0", dir=both];
moteur -> bdd [label="lit et écrit\nles données", color="#00695C", dir=both];
sources -> bdd [label="alimente\nles données", color="#546E7A", style=dashed];
// Liens invisibles pour stabiliser la disposition
ph_eco -> ph_bus [style=invis];
ph_bus -> ph_ia [style=invis];
ph_veille -> bdd [style=invis];
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 232 KiB

View File

@ -0,0 +1,77 @@
digraph architecture_vue2 {
rankdir=TB;
fontname="Arial";
fontsize=18;
label="FabNum — Vue 2 : Veille sur les sources et propagation\nSources surveillées, simulation d'impact manuelle\n";
labelloc=t;
splines=true;
nodesep=0.7;
ranksep=0.9;
node [fontname="Arial", fontsize=10, style="filled,rounded", shape=box, penwidth=1.5];
edge [fontname="Arial", fontsize=9, penwidth=1.2];
// Ligne 1 : utilisateurs (4 colonnes fixes)
admin [
label="Administrateur\n\nGère le graphe,\nles sources, les tiers\nde confiance"
fillcolor="#FFE082" shape=house
];
expert [
label="Expert\n\nAnalyse les risques,\nqualifie les données,\nsimule des scénarios\nd'impact (propagation),\ncontextualise"
fillcolor="#A5D6A7" shape=house
];
client [
label="Client\n(COMEX, Métiers, DSI)\n\nConsulte les analyses,\nles fiches, les alertes.\nPeut contextualiser\nses requêtes."
fillcolor="#EF9A9A" shape=house
];
// Placeholder veille 360° (invisible)
ph_eco [label="" shape=point width=0.01 style=invis];
{ rank=same; admin; expert; client; ph_eco; }
// Ligne 2 : API + placeholder bus
api [
label="API\n\nPoint d'accès unique\nAuthentification, rôles,\nprofils de visibilité"
fillcolor="#B39DDB" penwidth=2
];
// Placeholder bus (invisible)
ph_bus [label="" shape=point width=0.01 style=invis];
{ rank=same; api; ph_bus; }
// Ligne 3 : Moteur + placeholder IA + veille
moteur [
label="Moteur FabNum\n\nCalcul des indices\n(IHH, ICS, IVC, ISG)\nRequêtage du graphe\nChemins critiques\nGénération fiches (templates)\nArbitrage des sources\nPropagation d'impact\n(simulation manuelle)"
fillcolor="#90CAF9" penwidth=2
];
// Placeholder IA (invisible)
ph_ia [label="" shape=point width=0.01 style=invis];
veille [
label="Veille sources\n\nSurveillance des sources\n(huginn)\nVérification des citations\nAlertes (variations)"
fillcolor="#FFAB91" penwidth=1.5
];
{ rank=same; veille; moteur; ph_ia; }
// Ligne 4 : BDD + sources
bdd [
label="Base de données\n(graphe)\n\nNœuds, relations, indices\nSources rattachées\nHistorique des données"
fillcolor="#80CBC4" penwidth=2
];
sources [
label="Sources externes\n\nUSGS, Statista, BRGM,\nScholar Gateway, Consensus,\nWRI Aqueduct, ND-GAIN..."
fillcolor="#E0E0E0" shape=cylinder
];
{ rank=same; bdd; sources; }
// Relations
expert -> api [label="consulte, analyse\net simule", color="#2E7D32"];
client -> api [label="consulte\nles résultats", color="#C62828"];
admin -> moteur [label="administre\n(scripts)", color="#E65100", style=bold, penwidth=2];
api -> moteur [label="transmet\nles requêtes", color="#4527A0", dir=both];
moteur -> bdd [label="lit et écrit\nles données", color="#00695C", dir=both];
sources -> veille [label="surveille\nles MAJ", color="#BF360C"];
veille -> bdd [label="met à jour\nles sources", color="#E65100", style=dashed];
veille -> moteur [label="signale les\nchangements\net vérifie\nles citations", color="#E65100"];
sources -> bdd [label="alimente\nles données", color="#546E7A", style=dashed];
// Liens invisibles pour stabiliser
ph_eco -> ph_bus [style=invis];
ph_bus -> ph_ia [style=invis];
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 314 KiB

View File

@ -0,0 +1,89 @@
digraph architecture_vue3 {
rankdir=TB;
fontname="Arial";
fontsize=18;
label="FabNum — Vue 3 : Veille stratégique 360°\nLe monde extérieur interagit avec FabNum\n";
labelloc=t;
splines=true;
nodesep=0.7;
ranksep=0.9;
node [fontname="Arial", fontsize=10, style="filled,rounded", shape=box, penwidth=1.5];
edge [fontname="Arial", fontsize=9, penwidth=1.2];
// Ligne 1 : utilisateurs (4 colonnes fixes)
admin [
label="Administrateur\n\nGère le graphe,\nles sources, les tiers\nde confiance"
fillcolor="#FFE082" shape=house
];
expert [
label="Expert\n\nAnalyse les risques,\nqualifie les données,\nsimule des scénarios\nd'impact,\nvalide les sources"
fillcolor="#A5D6A7" shape=house
];
client [
label="Client\n(COMEX, Métiers, DSI)\n\nConsulte les analyses,\nles fiches, les alertes.\nPeut contextualiser\nses requêtes."
fillcolor="#EF9A9A" shape=house
];
ecosysteme [
label="Écosystème\nveille 360°\n\nDétecte les événements,\npropose des sources,\nrequête FabNum"
fillcolor="#CE93D8" shape=house
];
{ rank=same; admin; expert; client; ecosysteme; }
// Ligne 2 : API + placeholder bus
api [
label="API\n\nPoint d'accès unique\nAuthentification, rôles,\nprofils de visibilité"
fillcolor="#B39DDB" penwidth=2
];
// Placeholder bus (invisible)
ph_bus [label="" shape=point width=0.01 style=invis];
{ rank=same; api; ph_bus; }
// Ligne 3 : Moteur + placeholder IA + veille
moteur [
label="Moteur FabNum\n\nCalcul des indices\n(IHH, ICS, IVC, ISG)\nRequêtage du graphe\nChemins critiques\nGénération fiches (templates)\nArbitrage des sources\nPropagation d'impact"
fillcolor="#90CAF9" penwidth=2
];
// Placeholder IA (invisible)
ph_ia [label="" shape=point width=0.01 style=invis];
veille [
label="Veille sources\n\nSurveillance des sources\n(huginn)\nVérification des citations\nAlertes (variations)"
fillcolor="#FFAB91" penwidth=1.5
];
{ rank=same; veille; moteur; ph_ia; }
// Ligne 4 : BDD + sources
bdd [
label="Base de données\n(graphe)\n\nNœuds, relations, indices\nSources rattachées\nHistorique des données"
fillcolor="#80CBC4" penwidth=2
];
sources [
label="Sources externes\n\nUSGS, Statista, BRGM,\nScholar Gateway, Consensus,\nWRI Aqueduct, ND-GAIN..."
fillcolor="#E0E0E0" shape=cylinder
];
{ rank=same; bdd; sources; }
// Relations utilisateurs
expert -> api [label="consulte, analyse\net simule", color="#2E7D32"];
client -> api [label="consulte\nles résultats", color="#C62828"];
admin -> moteur [label="administre\n(scripts)", color="#E65100", style=bold, penwidth=2];
// Écosystème 360° — deux points d'interaction
ecosysteme -> api [label="requête\nanalyses", color="#6A1B9A", penwidth=2];
ecosysteme -> expert [label="propose\ndes sources", color="#6A1B9A", style=dashed, penwidth=2];
expert -> sources [label="valide et\nalimente", color="#2E7D32", style=bold];
// API ↔ Moteur
api -> moteur [label="transmet\nles requêtes", color="#4527A0", dir=both];
// Moteur ↔ BDD
moteur -> bdd [label="lit et écrit\nles données", color="#00695C", dir=both];
// Veille
sources -> veille [label="surveille\nles MAJ", color="#BF360C"];
veille -> bdd [label="met à jour\nles sources", color="#E65100", style=dashed];
veille -> moteur [label="signale les\nchangements\net vérifie\nles citations", color="#E65100"];
sources -> bdd [label="alimente\nles données", color="#546E7A", style=dashed];
// Liens invisibles pour stabiliser
ph_bus -> ph_ia [style=invis];
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 374 KiB

View File

@ -0,0 +1,110 @@
digraph architecture_vue4 {
rankdir=TB;
fontname="Arial";
fontsize=18;
label="FabNum — Vue 4 : Architecture complète\nBus d'impact, mémoire situationnelle, IA\n";
labelloc=t;
splines=true;
nodesep=0.7;
ranksep=0.9;
node [fontname="Arial", fontsize=10, style="filled,rounded", shape=box, penwidth=1.5];
edge [fontname="Arial", fontsize=9, penwidth=1.2];
// Ligne 1 : utilisateurs (4 colonnes fixes)
admin [
label="Administrateur\n\nGère le graphe structurel,\nles sources, les tiers\nde confiance"
fillcolor="#FFE082" shape=house
];
expert [
label="Expert\n\nAnalyse les risques,\nqualifie les données,\nvalide les impacts,\nvalide les sources"
fillcolor="#A5D6A7" shape=house
];
client [
label="Client\n(COMEX, Métiers, DSI)\n\nConsulte les analyses,\nles fiches, les alertes.\nPeut contextualiser\nses requêtes."
fillcolor="#EF9A9A" shape=house
];
ecosysteme [
label="Écosystème\nveille 360°\n\nDétecte les événements,\npropose des sources,\nalimente le bus d'impact"
fillcolor="#CE93D8" shape=house
];
{ rank=same; admin; expert; client; ecosysteme; }
// Ligne 2 : API + Bus d'impact
api [
label="API\n\nPoint d'accès unique\nAuthentification, rôles,\nprofils de visibilité\n\nSert le graphe situationnel\n(structurel accessible aussi)"
fillcolor="#B39DDB" penwidth=2
];
bus [
label="Bus d'impact\n\nMémoire situationnelle\nTraduction événements → impacts\nAccumule, met à jour, archive\nMise à jour en continu\n(rythme décisionnel)"
fillcolor="#FF8A65" penwidth=2.5
style="filled,rounded,bold"
];
{ rank=same; api; bus; }
// Ligne 3 : Moteur + IA + veille
moteur [
label="Moteur FabNum\n\nCalcul des indices\n(structurels et situationnels)\nRequêtage, chemins critiques\nGénération fiches (templates)\nArbitrage des sources\nProjection temporelle"
fillcolor="#90CAF9" penwidth=2
];
ia_bus [
label="IA\n\nAnalyse les événements,\npropose les impacts\nchiffrés"
fillcolor="#FFCC80"
];
veille [
label="Veille sources\n\nSurveillance des sources\n(huginn)\nVérification des citations\nAlertes (variations)"
fillcolor="#FFAB91" penwidth=1.5
];
{ rank=same; veille; moteur; ia_bus; }
// Ligne 4 : BDD scindée + sources
subgraph cluster_bdd {
label="Base de données (graphe)";
style=filled;
color="#E0F2F1";
fontsize=10;
fontcolor="#00695C";
bdd_situa [
label="Graphe situationnel\n\nImpacts actifs\nCapacités réelles\nIndices situationnels\nHistorique des situations"
fillcolor="#4DB6AC"
];
bdd_struct [
label="Graphe structurel\n\nCapacités nominales\nActeurs, pays, parts de marché\nIndices structurels\nMise à jour trimestrielle"
fillcolor="#80CBC4"
];
}
sources [
label="Sources externes\n\nUSGS, Statista, BRGM,\nScholar Gateway, Consensus,\nWRI Aqueduct, ND-GAIN..."
fillcolor="#E0E0E0" shape=cylinder
];
// Relations utilisateurs
expert -> api [label="consulte\nanalyse", color="#2E7D32"];
expert -> bus [label="valide\nles impacts", color="#E65100", style=bold];
expert -> sources [label="valide et\nalimente", color="#2E7D32", style=bold];
client -> api [label="consulte\nles résultats", color="#C62828"];
admin -> moteur [label="administre\n(scripts)", color="#E65100", style=bold, penwidth=2];
// Écosystème 360°
ecosysteme -> bus [label="injecte\ndes événements", color="#6A1B9A", penwidth=2];
ecosysteme -> expert [label="propose\ndes sources", color="#6A1B9A", style=dashed, penwidth=2];
// Bus ↔ IA
bus -> ia_bus [label="événement\nà analyser", color="#E65100", dir=both];
// Bus → Moteur + BDD situationnel
bus -> moteur [label="impacts\nchiffrés", color="#BF360C", penwidth=2];
bus -> bdd_situa [label="met à jour\nles impacts", color="#BF360C", style=dashed];
// API ↔ Moteur
api -> moteur [label="transmet\nles requêtes", color="#4527A0", dir=both];
// Moteur ↔ BDD
moteur -> bdd_struct [label="lit/écrit\nstructurel", color="#00695C", dir=both];
moteur -> bdd_situa [label="lit/écrit\nsituationnel", color="#00695C", dir=both];
// Veille
sources -> veille [label="surveille\nles MAJ", color="#BF360C"];
veille -> bdd_struct [label="met à jour\nles sources", color="#E65100", style=dashed];
sources -> bdd_struct [label="alimente\nles données", color="#546E7A", style=dashed];
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 474 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 437 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 672 KiB

View File

Before

Width:  |  Height:  |  Size: 356 KiB

After

Width:  |  Height:  |  Size: 356 KiB

View File

@ -1,7 +1,7 @@
digraph planification_temporelle {
rankdir=LR;
fontname="Arial";
node [fontname="Arial", fontsize=11, style=filled, shape=record];
node [fontname="Arial", fontsize=11, style=filled, shape=box];
edge [fontname="Arial", fontsize=9];
label="FabNum — Planification temporelle\n\n";
labelloc=t;
@ -15,8 +15,8 @@ digraph planification_temporelle {
fontsize=13;
fontcolor="#1565C0";
P7 [label="P7\nValidation\nniveaux|Revue littérature\nSCOR, ISO 28000\nOpen Supply Hub", fillcolor="#BBDEFB"];
P6spike [label="P6 spike\nTest bases\ndonnées|Neo4j Community\nPostgreSQL+AGE\nArangoDB\n(Docker/serveur)", fillcolor="#BBDEFB"];
P7 [label="P7\nValidation\nniveaux\nRevue littérature\nSCOR, ISO 28000\nOpen Supply Hub", fillcolor="#BBDEFB"];
P6spike [label="P6 spike\nTest bases\ndonnées\nNeo4j Community\nPostgreSQL+AGE\nArangoDB\n(Docker/serveur)", fillcolor="#BBDEFB"];
}
subgraph cluster_phase2 {
@ -26,8 +26,8 @@ digraph planification_temporelle {
fontsize=13;
fontcolor="#2E7D32";
P3 [label="P3\nModèle de\ndonnées|Essentielles / Info\nTiers confiance\nArbitrage\nHistorisation\nIndice fiabilité", fillcolor="#C8E6C9"];
P6impl [label="P6 impl\nStockage|Base retenue\nInstallation native\nBackup", fillcolor="#C8E6C9"];
P3 [label="P3\nModèle de\ndonnées\nEssentielles / Info\nTiers confiance\nArbitrage\nHistorisation\nIndice fiabilité", fillcolor="#C8E6C9"];
P6impl [label="P6 impl\nStockage\nBase retenue\nInstallation native\nBackup", fillcolor="#C8E6C9"];
}
subgraph cluster_phase3 {
@ -37,8 +37,8 @@ digraph planification_temporelle {
fontsize=13;
fontcolor="#E65100";
P2 [label="P2\nGestion\nsources|Identification\nCatégorisation\nVeille (huginn)\nVérification citations", fillcolor="#FFE0B2"];
P4 [label="P4\nAmorçage|3 minerais\n1 composant\n1 produit final\nQualification\n+ audit exhaustivité", fillcolor="#FFE0B2"];
P2 [label="P2\nGestion\nsources\nIdentification\nCatégorisation\nVeille (huginn)\nVérification citations", fillcolor="#FFE0B2"];
P4 [label="P4\nAmorçage\n3 minerais\n1 composant\n1 produit final\nQualification\n+ audit exhaustivité", fillcolor="#FFE0B2"];
}
subgraph cluster_phase4 {
@ -48,9 +48,9 @@ digraph planification_temporelle {
fontsize=13;
fontcolor="#6A1B9A";
P5 [label="P5\nTemplates\nfiches|Niveau × usage\nExpertise\nSynthèse\nAPI/JSON", fillcolor="#E1BEE7"];
P1 [label="P1\nAPI REST\n+ rôles|Admin / Expert / Service\nAuth + tokens\nAPI-first", fillcolor="#E1BEE7"];
P8 [label="P8\nServices\nsécu profils|Personnalisation client\nProfils visibilité\nRate limiting\nRGPD / stateless", fillcolor="#E1BEE7"];
P5 [label="P5\nTemplates\nfiches\nNiveau × usage\nExpertise\nSynthèse\nAPI/JSON", fillcolor="#E1BEE7"];
P1 [label="P1\nAPI REST\n+ rôles\nAdmin / Expert / Service\nAuth + tokens\nAPI-first", fillcolor="#E1BEE7"];
P8 [label="P8\nServices\nsécu profils\nPersonnalisation client\nProfils visibilité\nRate limiting\nRGPD / stateless", fillcolor="#E1BEE7"];
}
subgraph cluster_horizon {
@ -60,13 +60,13 @@ digraph planification_temporelle {
fontsize=13;
fontcolor="#4E342E";
P10 [label="P10\nÉnergie / Eau|Attributs opération\nSourçage parcellaire\nCroisements risques", fillcolor="#D7CCC8"];
P11 [label="P11\nGéo fine|Région / site\nWRI Aqueduct\nAlertes climatiques", fillcolor="#D7CCC8"];
P9 [label="P9\nMulti-\nsectoriel|Graphes par secteur\nConnexes inter-secteurs\nMinerais partagés", fillcolor="#D7CCC8"];
P10 [label="P10\nÉnergie / Eau\nAttributs opération\nSourçage parcellaire\nCroisements risques", fillcolor="#D7CCC8"];
P11 [label="P11\nGéo fine\nRégion / site\nWRI Aqueduct\nAlertes climatiques", fillcolor="#D7CCC8"];
P9 [label="P9\nMulti-\nsectoriel\nGraphes par secteur\nConnexes inter-secteurs\nMinerais partagés", fillcolor="#D7CCC8"];
}
// MVP
MVP [label="MVP\nJalon interne|Moteur requêtable\nDonnées sourcées\nIndice fiabilité\nRétro-analyse", shape=doubleoctagon, fillcolor="#FFF9C4", style="filled,bold"];
MVP [label="MVP\nJalon interne\nMoteur requêtable\nDonnées sourcées\nIndice fiabilité\nRétro-analyse", shape=doubleoctagon, fillcolor="#FFF9C4", style="filled,bold"];
// Dépendances principales
P7 -> P3 [label="niveaux\nvalidés", color="#2E7D32", penwidth=2];

Binary file not shown.

After

Width:  |  Height:  |  Size: 348 KiB

View File

@ -1,124 +0,0 @@
digraph architecture_fabnum {
// Configuration générale
rankdir=TB;
fontname="Arial";
fontsize=18;
label="FabNum — Architecture globale\n\n";
labelloc=t;
splines=true;
nodesep=0.8;
ranksep=1.0;
node [fontname="Arial", fontsize=12, style="filled,rounded", shape=box, penwidth=1.5];
edge [fontname="Arial", fontsize=10, penwidth=1.5];
// ==================== UTILISATEURS ====================
admin [
label="Administrateur\n\nGère le graphe, les sources,\nles tiers de confiance\net les arbitrages"
fillcolor="#FFE082"
shape=house
fontsize=11
];
expert [
label="Expert\n\nAnalyse les risques,\nqualifie les données,\nalimente la connaissance"
fillcolor="#A5D6A7"
shape=house
fontsize=11
];
client [
label="Client\n(COMEX, Métiers, DSI)\n\nConsulte les analyses,\nles fiches, les alertes.\nPeut contextualiser\nses requêtes."
fillcolor="#EF9A9A"
shape=house
fontsize=11
];
ecosysteme [
label="Écosystème\nveille 360°\n\nInterroge FabNum\net alimente\nles sources"
fillcolor="#CE93D8"
shape=house
fontsize=11
];
// ==================== API ====================
api [
label="API\n\nPoint d'accès unique\nAuthentification, rôles,\nprofils de visibilité"
fillcolor="#B39DDB"
fontsize=12
penwidth=2
];
// ==================== MOTEUR ====================
moteur [
label="Moteur FabNum\n\nCalcul des indices (IHH, ICS, IVC, ISG...)\nRequêtage du graphe, chemins critiques\nGénération des fiches (templates)\nArbitrage des sources"
fillcolor="#90CAF9"
fontsize=12
penwidth=2
];
// ==================== BASE DE DONNÉES ====================
bdd [
label="Base de données\n(graphe)\n\nNœuds, relations, indices\nSources rattachées\nHistorique des données"
fillcolor="#80CBC4"
fontsize=12
penwidth=2
];
// ==================== VEILLE ====================
veille [
label="Veille\n\nSurveillance des sources (huginn)\nVérification des citations\nAlertes (variations, événements)"
fillcolor="#FFAB91"
fontsize=12
penwidth=2
];
// ==================== SOURCES ====================
sources [
label="Sources externes\n\nUSGS, Statista, BRGM,\nScholar Gateway, Consensus,\nWRI Aqueduct, ND-GAIN..."
fillcolor="#E0E0E0"
shape=cylinder
fontsize=11
];
// ==================== DISPOSITION ====================
{ rank=same; admin; expert; client; ecosysteme; }
{ rank=same; veille; moteur; }
// ==================== RELATIONS ====================
// Expert → API
expert -> api [label="consulte\nanalyse", color="#2E7D32"];
// Client → API
client -> api [label="consulte\nles résultats", color="#C62828"];
// Écosystème ↔ API + Sources (bidirectionnel)
ecosysteme -> api [label="requête\nanalyses", color="#6A1B9A"];
ecosysteme -> sources [label="alimente\nles sources", color="#6A1B9A", style=dashed];
// Admin → Moteur (accès direct par scripts, pas via API)
admin -> moteur [label="administre\n(scripts)", color="#E65100", style=bold, penwidth=2];
// API ↔ Moteur
api -> moteur [label="transmet\nles requêtes", color="#4527A0", dir=both];
// Moteur ↔ Base de données
moteur -> bdd [label="lit et écrit\nles données", color="#00695C", dir=both];
// Veille → Sources
sources -> veille [label="surveille\nles mises à jour", color="#BF360C"];
// Veille → Moteur / BDD
veille -> moteur [label="signale les\nchangements\net vérifie\nles citations", color="#E65100"];
veille -> bdd [label="met à jour\nles sources", color="#E65100", style=dashed];
// Sources → BDD (alimentation)
sources -> bdd [label="alimente\nles données", color="#546E7A", style=dashed];
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 392 KiB