irpf/workflows/build-theme.js
Marc Reverdin 60a1523fe0 docs: workflows multiagents + cartographie sources institutionnelles
- workflows/build-theme.js : production complète d'une fiche thème
  (collecte intl + FR + deep research + synthèse Opus + propositions + politique + MDX)
- workflows/build-all-themes.js : orchestration 14 thèmes en parallèle
- docs/institutions-sources.md : cartographie exhaustive des sources mondiales pour la France
  (ONU, FMI, BM, OCDE, UE, Conseil Europe, G7/G20, think tanks, APIs)
- docs/workflow-guide.md : guide d'utilisation et coûts estimés

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-05 19:52:45 +02:00

559 lines
27 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/**
* IRPF — Workflow de production d'une fiche thème complète
*
* Usage : lancer via le Workflow tool avec args = { slug, label }
* Exemple : args = { slug: "sante", label: "Santé & Système de soins" }
*
* Ce workflow produit pour UN thème :
* 1. Collecte internationale (sources mondiales sur la France)
* 2. Collecte nationale (sources françaises)
* 3. Deep research sur les angles manquants
* 4. Synthèse Opus (diagnostic + indicateurs + enjeux)
* 5. Propositions ultra-détaillées (Opus)
* 6. Lecture politique dynamique
* 7. Fichier MDX prêt à déployer dans src/content/themes/
*/
export const meta = {
name: 'irpf-build-theme',
description: 'Produit une fiche thème IRPF complète : collecte internationale + nationale + synthèse + propositions + MDX',
phases: [
{ title: 'Collecte internationale', detail: 'Sources ONU, OCDE, UE, FMI, BM, Conseil de l\'Europe + think tanks' },
{ title: 'Collecte nationale', detail: 'Sources françaises : INSEE, Cour des comptes, HCFP, think tanks FR' },
{ title: 'Deep research ciblé', detail: 'Angles manquants, benchmarks pays, données statistiques spécifiques' },
{ title: 'Synthèse Opus', detail: 'Diagnostic sourcé + indicateurs clés + enjeux structurels' },
{ title: 'Propositions', detail: 'Recommandations détaillées fondées sur l\'international' },
{ title: 'Lecture politique', detail: 'Dynamiques politiques françaises 2025-2027' },
{ title: 'Production MDX', detail: 'Fichier prêt pour src/content/themes/' },
],
};
// ─── CONFIGURATION PAR THÈME ─────────────────────────────────────────────────
const THEME_CONFIG = {
'economie-finances': {
ordre: 1, priorite: 'critique', budget_milliards: 492,
sources_intl: ['FMI Article IV France', 'OCDE Études économiques France', 'Commission européenne Country Report France', 'Eurostat finances publiques', 'BRI statistiques bancaires France', 'GAFI évaluation France', 'HCFP'],
sources_fr: ['INSEE comptes nationaux', 'Banque de France', 'Cour des comptes', 'CAE', 'iFRAP', 'Institut Montaigne', 'France Stratégie'],
indicateurs_cibles: ['déficit public %PIB', 'dette publique %PIB', 'dépenses publiques %PIB', 'prélèvements obligatoires %PIB', 'croissance PIB', 'charge de la dette', 'rang compétitivité'],
angles_specifiques: ['trajectoire dette 2030', 'espace budgétaire réel', 'comparaison Zone Euro', 'réforme fiscale OCDE Pilier 2'],
},
'sante': {
ordre: 2, priorite: 'critique', budget_milliards: 260,
sources_intl: ['OCDE Health at a Glance', 'OMS Global Health Observatory France', 'Commission UE state of health', 'Eurostat santé'],
sources_fr: ['DREES', 'Haut Conseil de la Santé Publique', 'Cour des comptes', 'Institut Montaigne santé', 'Terra Nova santé'],
indicateurs_cibles: ['espérance de vie', 'dépenses santé %PIB', 'médecins pour 1000 hab', 'lits hôpital pour 1000', 'délais attente', 'satisfaction système', 'déserts médicaux'],
angles_specifiques: ['démographie médicale 2030', 'comparaison systèmes UE', 'performance hospitalière', 'prévention vs curatif'],
},
'education': {
ordre: 3, priorite: 'haute', budget_milliards: 168,
sources_intl: ['OCDE PISA 2022 France', 'OCDE TALIS France', 'OCDE Education at a Glance France', 'UNESCO UIS France', 'Commission UE Education Monitor'],
sources_fr: ['DEPP', 'Cour des comptes', 'Conseil d\'évaluation de l\'école', 'Institut Montaigne éducation', 'Terra Nova éducation'],
indicateurs_cibles: ['score PISA mathématiques', 'score PISA lecture', 'rang PISA sciences', 'décrochage scolaire', 'inégalités scolaires', 'dépenses par élève', 'formation enseignants'],
angles_specifiques: ['reproduction sociale', 'comparaison Finlande/Estonie/Canada', 'réforme du lycée', 'numérique éducatif'],
},
'environnement': {
ordre: 4, priorite: 'critique', budget_milliards: 40,
sources_intl: ['GIEC AR6 impacts France', 'CCNUCC NDC France', 'AIE France Energy Policy', 'IRENA France', 'Eurostat environnement', 'Commission UE Fit for 55 France'],
sources_fr: ['ADEME', 'SDES', 'Haut Conseil pour le Climat', 'Cour des comptes', 'I4CE', 'Institut Rousseau'],
indicateurs_cibles: ['émissions CO2 France', 'part renouvelables', 'objectif 2030 vs trajectoire', 'écart financement vert', 'biodiversité', 'artificialisation sols'],
angles_specifiques: ['coût inaction climatique', 'financement transition 2030', 'justice climatique', 'comparaison Allemagne/Suède'],
},
'defense': {
ordre: 5, priorite: 'haute', budget_milliards: 47,
sources_intl: ['OTAN dépenses France', 'SIPRI Military Expenditure France', 'IISS Military Balance France', 'ECFR France défense', 'Chatham House France'],
sources_fr: ['FRS', 'IRIS', 'IFRI', 'LPM 2024-2030', 'Cour des comptes défense'],
indicateurs_cibles: ['% PIB défense', 'effectifs armées', 'budget R&D défense', 'opérations extérieures', 'dissuasion nucléaire budget', 'industrie défense exports'],
angles_specifiques: ['2% PIB OTAN trajectoire', 'autonomie stratégique européenne', 'compétition technologique', 'base industrielle défense'],
},
'justice': {
ordre: 6, priorite: 'haute', budget_milliards: 11,
sources_intl: ['CEDH arrêts France', 'GRECO rapport France', 'CEPEJ évaluation justice européenne France', 'Commission UE État de droit France'],
sources_fr: ['Ministère Justice statistiques', 'Cour des comptes', 'Syndicats magistrats', 'Institut Montaigne justice'],
indicateurs_cibles: ['condamnations CEDH', 'durée procédures', 'budget justice %PIB', 'taux population carcérale', 'délais instruction', 'accès aide juridictionnelle'],
angles_specifiques: ['indépendance judiciaire', 'numérique judiciaire', 'réforme pénitentiaire', 'comparaison UE'],
},
'affaires-etrangeres': {
ordre: 7, priorite: 'normale', budget_milliards: 3.2,
sources_intl: ['OCDE DAC aide France', 'ECFR France foreign policy scorecard', 'IFRI', 'Chatham House', 'Brookings France'],
sources_fr: ['MAE rapports', 'France Stratégie international', 'IRIS', 'Sénat Commission AE'],
indicateurs_cibles: ['APD %RNB', 'rang soft power', 'réseau diplomatique taille', 'contribution ONU', 'exports défense', 'influence culturelle'],
angles_specifiques: ['APD 0,7% RNB écart', 'influence France Afrique', 'diplomatie climatique', 'francophonie'],
},
'travail-emploi': {
ordre: 8, priorite: 'critique', budget_milliards: 0,
sources_intl: ['OCDE Employment Outlook France', 'OIT France conventions', 'Commission UE Semestre emploi France', 'COR retraites'],
sources_fr: ['DARES', 'INSEE emploi', 'Cour des comptes', 'CAE travail', 'France Stratégie emploi'],
indicateurs_cibles: ['taux chômage', 'taux emploi 15-64', 'taux emploi seniors', 'coût travail comparatif', 'taux syndicalisation', 'accidents travail', 'âge départ retraite effectif'],
angles_specifiques: ['plein emploi scenario', 'retraites soutenabilité', 'flexisécurité danoise', 'emploi seniors'],
},
'logement': {
ordre: 9, priorite: 'critique', budget_milliards: 38,
sources_intl: ['OCDE Affordable Housing France', 'Commission UE logement abordable France', 'UN-Habitat France', 'Eurostat logement'],
sources_fr: ['SDES', 'Banque des Territoires', 'ANCOLS', 'Fondation Abbé Pierre', 'Institut Montaigne logement'],
indicateurs_cibles: ['prix immobilier/revenus', 'taux propriétaires', 'stock HLM', 'mal logement France', 'sans-abri', 'construction neuve', 'coût logement %revenu'],
angles_specifiques: ['choc offre vs demande', 'comparaison Allemagne/Pays-Bas', 'ZAN artificialisation', 'rénovation thermique'],
},
'agriculture': {
ordre: 10, priorite: 'haute', budget_milliards: 22,
sources_intl: ['FAO France', 'OCDE Agricultural Outlook France', 'Commission UE PAC France', 'Eurostat agri'],
sources_fr: ['Agreste', 'INRAE', 'Chambres agriculture', 'Cour des comptes PAC'],
indicateurs_cibles: ['surface agricole utile', 'exploitations viables', 'revenus agricoles', 'part bio', 'pesticides usage', 'souveraineté alimentaire', 'exportations agroalimentaires'],
angles_specifiques: ['renouvellement générations', 'souveraineté alimentaire', 'PAC réforme', 'agri-écologie'],
},
'numerique': {
ordre: 11, priorite: 'haute', budget_milliards: 9,
sources_intl: ['OCDE Digital Economy Outlook France', 'Eurostat DESI France', 'Commission UE Digital Decade France', 'ITU France'],
sources_fr: ['ARCEP', 'DGE', 'ANSSi', 'France Stratégie numérique', 'Institut Montaigne IA'],
indicateurs_cibles: ['score DESI', 'couverture fibre/5G', 'compétences numériques', 'startups licornes', 'R&D IA', 'administration numérique', 'cybersécurité'],
angles_specifiques: ['souveraineté numérique', 'IA France vs US/Chine', 'régulation vs innovation', 'fracture numérique'],
},
'cohesion-sociale': {
ordre: 12, priorite: 'haute', budget_milliards: 0,
sources_intl: ['PNUD IDH France', 'OCDE Society at a Glance France', 'Commission UE Social Scoreboard France', 'Eurostat inégalités'],
sources_fr: ['INSEE pauvreté', 'ONPES', 'Observatoire inégalités', 'Fondation Jean Jaurès', 'Terra Nova social'],
indicateurs_cibles: ['coefficient Gini', 'taux pauvreté', 'mobilité sociale', 'inégalités territoriales', 'discriminations emploi', 'mixité scolaire', 'ascenseur social'],
angles_specifiques: ['immobilité sociale France', 'quartiers prioritaires', 'comparaison nordique', 'discriminations systémiques'],
},
'democratie': {
ordre: 13, priorite: 'haute', budget_milliards: 0,
sources_intl: ['V-Dem France', 'Freedom House France', 'GRECO France', 'OCDE gouvernance France', 'Commission UE État de droit'],
sources_fr: ['CEVIPOF', 'Baromètre confiance Sciences Po', 'Transparency International France', 'Fondapol démocratie'],
indicateurs_cibles: ['score V-Dem', 'confiance institutions', 'taux abstention', 'score liberté presse', 'corruption perçue', 'participation politique', 'représentation femmes'],
angles_specifiques: ['crise représentative', 'proportionnelle vs majoritaire', 'démocratie participative', 'financement partis'],
},
'europe': {
ordre: 14, priorite: 'haute', budget_milliards: 0,
sources_intl: ['Commission UE France', 'Eurobaromètre France', 'Bruegel France Europe', 'ECFR France Europe', 'Jacques Delors Institut'],
sources_fr: ['Institut Montaigne Europe', 'Notre Europe', 'IFRI Europe', 'Terra Nova Europe', 'France Stratégie UE'],
indicateurs_cibles: ['solde France UE contribution', 'soutien UE opinion publique', 'transposition directives', 'poids France BCE/Commission', 'coopération défense UE'],
angles_specifiques: ['influence France UE post-Brexit', 'axe Paris-Berlin', 'élargissement', 'autonomie stratégique'],
},
};
// ─── SCHÉMAS ─────────────────────────────────────────────────────────────────
const COLLECT_SCHEMA = {
type: 'object',
properties: {
source: { type: 'string' },
type: { type: 'string', enum: ['statistiques', 'rapport', 'recommandation', 'benchmark', 'etude'] },
donnees: {
type: 'array',
items: {
type: 'object',
properties: {
indicateur: { type: 'string' },
valeur: { type: 'string' },
annee: { type: 'string' },
tendance: { type: 'string', enum: ['hausse', 'baisse', 'stable', 'nd'] },
rang_comparatif: { type: 'string' },
url_source: { type: 'string' },
},
required: ['indicateur', 'valeur', 'annee'],
},
},
recommandations_france: { type: 'array', items: { type: 'string' } },
benchmarks: {
type: 'array',
items: {
type: 'object',
properties: {
pays: { type: 'string' },
mesure: { type: 'string' },
resultat_mesure: { type: 'string' },
},
required: ['pays', 'mesure'],
},
},
url_principale: { type: 'string' },
date_publication: { type: 'string' },
},
required: ['source', 'type', 'donnees'],
};
// ─── WORKFLOW ─────────────────────────────────────────────────────────────────
const themeSlug = args?.slug || 'economie-finances';
const themeLabel = args?.label || 'Économie & Finances publiques';
const config = THEME_CONFIG[themeSlug] || THEME_CONFIG['economie-finances'];
log(`Démarrage production fiche : ${themeLabel}`);
// PHASE 1 : Collecte internationale
phase('Collecte internationale');
log(`${config.sources_intl.length} sources internationales à interroger...`);
const intlData = await parallel(
config.sources_intl.map(source => () =>
agent(
`Tu es un analyste expert des institutions internationales et de la France.
SOURCE : ${source}
THÈME : ${themeLabel}
INDICATEURS RECHERCHÉS : ${config.indicateurs_cibles.join(', ')}
ANGLES SPÉCIFIQUES : ${config.angles_specifiques.join(', ')}
Collecte pour cette source :
1. Les données statistiques les plus récentes sur la France pour ce thème
(valeur exacte, année, tendance, rang parmi pays OCDE/UE)
2. Les recommandations explicites faites à la France dans les 24 derniers mois
3. Les benchmarks : quels pays font mieux que la France et pourquoi ?
4. L'URL du document source principal
Sois précis et sourcé. Uniquement des faits vérifiables.`,
{
label: `intl:${source.substring(0, 30)}`,
phase: 'Collecte internationale',
schema: { ...COLLECT_SCHEMA, properties: { ...COLLECT_SCHEMA.properties, source: { type: 'string', default: source } } },
model: 'sonnet',
}
).then(r => r ? { ...r, source } : null)
)
);
// PHASE 2 : Collecte nationale
phase('Collecte nationale');
log(`${config.sources_fr.length} sources françaises à interroger...`);
const frData = await parallel(
config.sources_fr.map(source => () =>
agent(
`Tu es un expert des politiques publiques françaises.
SOURCE FRANÇAISE : ${source}
THÈME : ${themeLabel}
INDICATEURS : ${config.indicateurs_cibles.join(', ')}
Pour cette source institutionnelle française :
1. Les chiffres-clés les plus récents sur ce thème
2. Les principales conclusions/diagnostics du dernier rapport
3. Les recommandations formulées
4. Les évolutions récentes (12 derniers mois)
5. Les données disponibles en open data (URL API si possible)`,
{
label: `fr:${source.substring(0, 30)}`,
phase: 'Collecte nationale',
schema: { ...COLLECT_SCHEMA, properties: { ...COLLECT_SCHEMA.properties, source: { type: 'string', default: source } } },
model: 'sonnet',
}
).then(r => r ? { ...r, source } : null)
)
);
const allData = [...intlData, ...frData].filter(Boolean);
log(`${allData.length} sources collectées`);
// PHASE 3 : Deep research sur les angles spécifiques manquants
phase('Deep research ciblé');
const deepResearch = await parallel(
config.angles_specifiques.map(angle => () =>
agent(
`Deep research expert sur les politiques publiques françaises.
ANGLE SPÉCIFIQUE À CREUSER : ${angle}
THÈME GÉNÉRAL : ${themeLabel}
Recherche approfondie sur cet angle précis :
- Données quantitatives récentes (sourcer avec précision)
- Études académiques ou institutionnelles de référence
- Positions des principales institutions (OCDE, UE, think tanks)
- Expériences comparatives internationales réussies
- État du débat politique français sur ce point
- Propositions concrètes qui existent déjà dans la littérature
Sois exhaustif sur cet angle précis. Cite tes sources.`,
{
label: `deep:${angle.substring(0, 40)}`,
phase: 'Deep research ciblé',
model: 'sonnet',
}
)
)
);
// PHASE 4 : Synthèse Opus
phase('Synthèse Opus');
log('Synthèse de niveau Cour des comptes × OCDE...');
const allStats = allData.flatMap(d => d.donnees || []);
const allReco = allData.flatMap(d => d.recommandations_france || []);
const allBenchmarks = allData.flatMap(d => d.benchmarks || []);
const synthesis = await agent(
`Tu es un expert de haut niveau des politiques publiques françaises, équivalent à un rapporteur de la Cour des comptes ou un économiste senior de l'OCDE.
THÈME : ${themeLabel}
Tu disposes de :
- ${allStats.length} indicateurs statistiques collectés auprès de ${allData.length} sources
- ${allReco.length} recommandations institutionnelles explicites pour la France
- ${allBenchmarks.length} benchmarks de pays comparables
- ${deepResearch.filter(Boolean).length} deep research sur des angles spécifiques
STATISTIQUES DISPONIBLES :
${JSON.stringify(allStats.slice(0, 60), null, 2)}
RECOMMANDATIONS INSTITUTIONNELLES :
${allReco.slice(0, 40).join('\n')}
BENCHMARKS INTERNATIONAUX :
${JSON.stringify(allBenchmarks.slice(0, 25), null, 2)}
DEEP RESEARCH SPÉCIFIQUES :
${deepResearch.filter(Boolean).slice(0, 4).join('\n\n---\n\n')}
PRODUCTION ATTENDUE :
1. DIAGNOSTIC (900-1200 mots)
Rédige un diagnostic complet, rigoureux, comparatif de la situation française.
Structure : état des lieux chiffré → position internationale → tendances → facteurs explicatifs → défis structurels.
Chaque affirmation doit être sourcée. Comparer systématiquement à l'Allemagne, le Royaume-Uni, les pays nordiques, la moyenne OCDE.
2. INDICATEURS CLÉS (8-12 indicateurs)
Sélectionne les plus significatifs : valeur France, source, année, tendance, comparaison OCDE.
3. ENJEUX STRUCTURELS (5-7 enjeux)
Hiérarchisés par urgence, avec les sources internationales qui les documentent.
4. CONSENSUS INTERNATIONAL
Ce sur quoi TOUTES les institutions convergent concernant la France.
5. DIVERGENCES
Points de désaccord entre institutions ou approches contradictoires.`,
{
label: `synth:${themeSlug}`,
phase: 'Synthèse Opus',
schema: {
type: 'object',
properties: {
diagnostic: { type: 'string' },
indicateurs_cles: {
type: 'array',
items: {
type: 'object',
properties: {
label: { type: 'string' },
valeur: { type: 'string' },
source: { type: 'string' },
annee: { type: 'string' },
tendance: { type: 'string', enum: ['hausse', 'baisse', 'stable', 'nd'] },
comparaison_ocde: { type: 'string' },
},
required: ['label', 'valeur', 'source', 'tendance'],
},
},
enjeux_structures: {
type: 'array',
items: {
type: 'object',
properties: {
titre: { type: 'string' },
description: { type: 'string' },
urgence: { type: 'string', enum: ['immediate', 'court-terme', 'moyen-terme', 'long-terme'] },
sources: { type: 'array', items: { type: 'string' } },
},
required: ['titre', 'description', 'urgence'],
},
},
consensus_international: { type: 'string' },
divergences: { type: 'string' },
sources_citees: { type: 'array', items: { type: 'string' } },
},
required: ['diagnostic', 'indicateurs_cles', 'enjeux_structures', 'consensus_international'],
},
model: 'opus',
}
);
// PHASE 5 : Propositions
phase('Propositions');
const propositions = await agent(
`Tu es un conseiller politique senior, expert des politiques publiques françaises et du droit comparé international.
THÈME : ${themeLabel}
DIAGNOSTIC ÉTABLI :
${synthesis?.diagnostic || ''}
ENJEUX IDENTIFIÉS :
${JSON.stringify(synthesis?.enjeux_structures || [])}
RECOMMANDATIONS DES INSTITUTIONS INTERNATIONALES :
${allReco.slice(0, 30).join('\n')}
BENCHMARKS PAYS :
${JSON.stringify(allBenchmarks.slice(0, 20), null, 2)}
GÉNÈRE un programme d'action pour la France 2027-2032 :
6-8 propositions réparties en :
- 1-2 RUPTURE : réforme structurelle majeure, fort impact, irréversible
- 2-3 RÉFORMISTE : ajustements significatifs du modèle existant
- 1-2 CONSOLIDATION : amplifier ce qui fonctionne déjà
- 1 EXPÉRIMENTATION : pilote innovant inspiré d'un pays-modèle
Pour chaque proposition :
• Titre clair et mécanisme précis (qui, quoi, comment, calendrier)
• Fondement dans les recommandations institutionnelles internationales (citer la source)
• Pays ayant mis en oeuvre + résultats mesurés
• Impact budgétaire : coût net, horizon, gains attendus
• Obstacles identifiés et comment les contourner
• Quick win possible sans texte législatif ? (oui/non)
• Niveau de preuve : fort / modéré / émergent / expérimental
Sois concret, chiffré, actionnable. Pas de vague "il faudrait".`,
{
label: `prop:${themeSlug}`,
phase: 'Propositions',
schema: {
type: 'object',
properties: {
propositions: {
type: 'array',
items: {
type: 'object',
properties: {
titre: { type: 'string' },
categorie: { type: 'string', enum: ['rupture', 'reformiste', 'consolidation', 'experimentation'] },
description: { type: 'string' },
mecanisme: { type: 'string' },
fondement_international: { type: 'string' },
pays_reference: { type: 'array', items: { type: 'string' } },
impact_budgetaire: { type: 'string' },
obstacles: { type: 'array', items: { type: 'string' } },
quick_win: { type: 'boolean' },
niveau_preuve: { type: 'string', enum: ['fort', 'modere', 'emergent', 'experimental'] },
},
required: ['titre', 'categorie', 'description', 'fondement_international', 'niveau_preuve'],
},
},
},
required: ['propositions'],
},
model: 'opus',
}
);
// PHASE 6 : Lecture politique
phase('Lecture politique');
const politique = await agent(
`Tu es un politologue spécialisé dans la vie politique française et les dynamiques de réforme.
THÈME : ${themeLabel}
PROPOSITIONS IRPF : ${JSON.stringify(propositions?.propositions?.slice(0, 3) || [])}
Analyse politique 2025-2027 :
1. Position actuelle du gouvernement Bayrou sur ce thème
2. Positions des partis majeurs (RN, LFI, PS, EELV, Renaissance/Horizons, LR)
3. Fenêtres politiques dans les 18 mois (élections, présidences, crises, momentum)
4. Acteurs clés (ministres, hauts fonctionnaires, syndicats, lobbys) — qui accélère, qui bloque
5. Blocages structurels : corporatismes, contraintes constitutionnelles, résistances
6. Coalitions possibles pour faire avancer des réformes sur ce thème
7. Séquence optimale de mise en oeuvre`,
{
label: `pol:${themeSlug}`,
phase: 'Lecture politique',
schema: {
type: 'object',
properties: {
position_gouvernement: { type: 'string' },
positions_partis: { type: 'array', items: { type: 'object', properties: { parti: { type: 'string' }, position: { type: 'string' } }, required: ['parti', 'position'] } },
fenetres_politiques: { type: 'array', items: { type: 'string' } },
acteurs_cles: { type: 'array', items: { type: 'object', properties: { nom: { type: 'string' }, role: { type: 'string' }, influence: { type: 'string' } }, required: ['nom', 'role'] } },
blocages: { type: 'array', items: { type: 'string' } },
coalitions: { type: 'array', items: { type: 'string' } },
sequence_optimale: { type: 'string' },
},
required: ['position_gouvernement', 'positions_partis', 'fenetres_politiques', 'blocages'],
},
model: 'sonnet',
}
);
// PHASE 7 : Production MDX
phase('Production MDX');
const frontmatter = `---
title: "${themeLabel}"
slug: "${themeSlug}"
description: "Diagnostic complet, données internationales et propositions IRPF sur le thème ${themeLabel}."
ordre: ${config.ordre}
priorite: "${config.priorite}"
${config.budget_milliards ? `budget_etat_milliards: ${config.budget_milliards}` : ''}
tags: [${config.indicateurs_cibles.slice(0, 5).map(i => `"${i.replace(/[^a-zA-ZÀ-ÿ0-9 ]/g, '').trim().toLowerCase().replace(/ /g, '-')}"`).join(', ')}]
sources_data: [${config.sources_intl.slice(0, 5).map(s => `"${s.split(' ')[0]}"`).join(', ')}]
derniere_maj: "2026-06"
nb_propositions: ${propositions?.propositions?.length || 0}
score_sources: ${allData.length}
---`;
const mdxContent = await agent(
`Tu es un rédacteur web expert. Génère le contenu MDX complet pour la fiche thème IRPF.
FRONTMATTER (déjà prêt, ne pas modifier) :
${frontmatter}
MATÉRIAU :
Diagnostic : ${synthesis?.diagnostic || ''}
Indicateurs : ${JSON.stringify(synthesis?.indicateurs_cles || [])}
Enjeux : ${JSON.stringify(synthesis?.enjeux_structures || [])}
Consensus international : ${synthesis?.consensus_international || ''}
Propositions : ${JSON.stringify(propositions?.propositions || [])}
Lecture politique : ${JSON.stringify(politique || {})}
Sources : ${(synthesis?.sources_citees || []).join(', ')}
STRUCTURE DU FICHIER MDX :
## Diagnostic
[Le diagnostic complet sourcé — reprendre texte intégral du diagnostic]
## Indicateurs clés
[Tableau markdown des 8-12 indicateurs avec source et tendance]
## Ce que disent les institutions internationales
[Pour chaque institution clé : recommandation principale + statut de mise en oeuvre]
## Enjeux structurels
[Les 5-7 enjeux avec leur niveau d'urgence, description et sources]
## Comparaisons internationales
[Tableau pays-mesure-résultat + analyse]
## Propositions IRPF 2027-2032
[Les propositions complètes : titre, catégorie, description, mécanisme, pays référence, impact budgétaire]
## Lecture politique
[Dynamiques françaises : gouvernement, partis, blocages, fenêtres d'opportunité]
## Sources & références
[Bibliographie complète avec URLs]
Retourne le fichier MDX COMPLET, prêt à sauvegarder.`,
{
label: `mdx:${themeSlug}`,
phase: 'Production MDX',
model: 'sonnet',
}
);
log(`Fiche ${themeLabel} complète — ${allData.length} sources, ${propositions?.propositions?.length || 0} propositions`);
return {
slug: themeSlug,
label: themeLabel,
stats: {
sources_collectees: allData.length,
indicateurs: synthesis?.indicateurs_cles?.length || 0,
enjeux: synthesis?.enjeux_structures?.length || 0,
propositions: propositions?.propositions?.length || 0,
},
synthesis,
propositions,
politique,
mdx: `${frontmatter}\n\n${mdxContent}`,
};