feat(media): JSON v3.0 avec 171 auteurs Bonpote + flag ingere (Phase 8.A)

Sync corpus auteurs-pensees pour transposition 1:1 carte Bonpote V2.
171 auteurs (vs 28 v2.1), 32 ingeres + 139 non-ingeres avec bio provisoire.
Flag ingere:true/false sur chaque auteur pour grisage Phase 8.D.
Preservation 100% des entrees enrichies v2.1 (theses_cles, bio_courte,
slugs compat D3 Phase 7).

scripts/build_authors_v3.mjs : helper Node.js reproductible pour re-runs
apres nouvelles ingestions LightRAG.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
Jules Neny
2026-05-12 17:50:47 +02:00
parent a1c47002d5
commit fdd9d02859
2 changed files with 3217 additions and 252 deletions

View File

@@ -0,0 +1,376 @@
// Build auteurs-pensees.json v3.0 — Phase 8.A
// Sync corpus JSON unifié : Bonpote authors + LightRAG ingestion flags
import fs from 'node:fs';
import path from 'node:path';
const JSON_PATH = 'C:\\Users\\jules\\Dropbox\\ATIS - IPCJRA\\1 PROJETS\\TECH - infra VPS, website pro, RAG\\nav-carte\\public\\data\\auteurs-pensees.json';
// === LightRAG slug prefixes (from /documents endpoint 2026-05-12) ===
const LIGHTRAG_PREFIX_TO_AUTHOR_SLUG = {
bookchin: 'murray-bookchin',
brand: 'steward-brand',
carson: 'rachel-carson',
charbonneau: 'bernard-charbonneau',
descola: 'philippe-descola',
despret: 'vinciane-despret',
eaubonne: 'francoise-deaubonne',
ellul: 'jacques-ellul',
federici: 'silvia-federici',
ferdinand: 'malcolm-ferdinand',
figueres: 'christiana-figueres',
georgescu: 'nicholas-georgescu-roegen',
gorz: 'andre-gorz',
graeber: 'david-graeber',
keith: 'david-keith',
klein: 'naomi-klein',
kropotkine: 'pierre-kropotkine',
latouche: 'serge-latouche',
latour: 'bruno-latour',
lowy: 'michael-lowy',
malm: 'andreas-malm',
marx: 'karl-marx',
meadows: 'donella-meadows',
morizot: 'baptiste-morizot',
naess: 'arne-naess',
ouassak: 'fatima-ouassak',
reclus: 'elisee-reclus',
saito: 'kohei-saito',
servigne: 'pablo-servigne',
shiva: 'vandana-shiva',
stengers: 'isabelle-stengers',
vettese: 'troy-vettese',
};
const INGESTED_AUTHOR_SLUGS = new Set(Object.values(LIGHTRAG_PREFIX_TO_AUTHOR_SLUG));
// === Bonpote authors (nom, dates, ecole_principale, ecoles_secondaires[]) ===
const BONPOTE_AUTHORS = [
// Éco-anarchisme
['Pierre Kropotkine', '1842-1921', 'eco-anarchisme', []],
['Élisée Reclus', '1830-1905', 'eco-anarchisme', []],
['Murray Bookchin', '1921-2006', 'eco-anarchisme', []],
['David Graeber', '1961-2020', 'eco-anarchisme', []],
['James C. Scott', '1936-2024', 'eco-anarchisme', []],
['Marshall Sahlins', '1930-2021', 'eco-anarchisme', []],
['Pierre Clastres', '1934-1977', 'eco-anarchisme', []],
['Cornélius Castoriadis', '1922-1997', 'eco-anarchisme', []],
['David Harvey', '1935-', 'eco-anarchisme', ['ecosocialisme']],
['Henri Lefebvre', '1901-1991', 'eco-anarchisme', ['ecosocialisme']],
['Émile Gravelle', '1855-1920', 'eco-anarchisme', []],
['Henri Zisly', '1872-1945', 'eco-anarchisme', []],
['Edward Carpenter', '1844-1929', 'eco-anarchisme', []],
['William Morris', '1834-1896', 'eco-anarchisme', []],
['John Ruskin', '1819-1900', 'eco-anarchisme', []],
['Kirkpatrick Sale', '1937-', 'eco-anarchisme', []],
['Wendell Berry', '1934-', 'eco-anarchisme', []],
['Kristin Ross', '1953-', 'eco-anarchisme', []],
['Theodore Kaczynski', '1942-2023', 'eco-anarchisme', ['technocritique']],
['Saint-Simon', '1760-1825', 'eco-anarchisme', []],
['Auguste Comte', '1798-1857', 'eco-anarchisme', []],
['Alberto Magnaghi', '1941-2023', 'eco-anarchisme', []],
['Peter Berg', '1937-2011', 'eco-anarchisme', []],
['Andreas Malm', '1977-', 'ecosocialisme', ['eco-anarchisme']],
// Écosocialisme
['Karl Marx', '1818-1883', 'ecosocialisme', []],
['Friedrich Engels', '1820-1895', 'ecosocialisme', []],
['Rosa Luxemburg', '1871-1919', 'ecosocialisme', []],
['Walter Benjamin', '1892-1940', 'ecosocialisme', []],
['John Maynard Keynes', '1883-1946', 'ecosocialisme', []],
['Pascal Lamy', '1947-', 'ecosocialisme', []],
['Ann Pettifor', '1947-', 'ecosocialisme', []],
['Holly Jean Buck', '', 'ecosocialisme', []],
['Cédric Durand', '1975-', 'ecosocialisme', []],
['Kim Stanley Robinson', '1952-', 'ecosocialisme', []],
['André Gorz', '1923-2007', 'ecosocialisme', ['decroissance', 'technocritique']],
['Kohei Saito', '1987-', 'ecosocialisme', ['decroissance']],
['Razmig Keucheyan', '1975-', 'ecosocialisme', []],
['Dominique Méda', '1962-', 'ecosocialisme', []],
['Dominique Bourg', '1953-', 'ecosocialisme', []],
['Troy Vettese', '', 'ecosocialisme', []],
['Loïc Blondiaux', '1962-', 'ecosocialisme', []],
['Drew Pendergrass', '', 'ecosocialisme', []],
['Jason W. Moore', '', 'ecosocialisme', []],
["James O'Connor", '1930-2017', 'ecosocialisme', []],
['Herman Daly', '1938-2022', 'ecosocialisme', ['capitalisme-vert']],
['John Bellamy Foster', '1953-', 'ecosocialisme', []],
['Michael Löwy', '1938-', 'ecosocialisme', []],
['Joel Kovel', '1936-2018', 'ecosocialisme', []],
['Naomi Klein', '1970-', 'ecosocialisme', []],
// Technocritique
['Jacques Ellul', '1912-1994', 'technocritique', []],
['Bernard Charbonneau', '1910-1996', 'technocritique', []],
['Lewis Mumford', '1895-1990', 'technocritique', []],
['Alain Caillé', '1944-', 'technocritique', []],
['Hans Jonas', '1903-1993', 'technocritique', ['ethiques-environnementales']],
['Herbert Marcuse', '1898-1979', 'technocritique', []],
['Günther Anders', '1902-1992', 'technocritique', []],
['Pierre Fournier', '1937-1973', 'technocritique', []],
['Alexandre Grothendieck', '1928-2014', 'technocritique', []],
['Patrick Viveret', '1948-', 'technocritique', []],
['Philippe Bihouix', '1971-', 'technocritique', []],
['Jean Baudrillard', '1929-2007', 'technocritique', []],
['Serge Latouche', '1940-', 'decroissance', ['technocritique']],
['Ivan Illich', '1926-2002', 'technocritique', ['decroissance']],
['Leopold Kohr', '1909-1994', 'technocritique', ['decroissance']],
['Ernst Schumacher', '1911-1977', 'technocritique', ['decroissance']],
['Nicholas Georgescu-Roegen', '1906-1994', 'decroissance', ['technocritique']],
// Écoféminismes
["Françoise d'Eaubonne", '1920-2005', 'ecofeminismes', []],
['Vandana Shiva', '1952-', 'ecofeminismes', ['ecologies-decoloniales']],
['Starhawk', '1951-', 'ecofeminismes', []],
['Ariel Salleh', '1944-', 'ecofeminismes', []],
['Maria Mies', '1931-2023', 'ecofeminismes', []],
['Carolyn Merchant', '1936-', 'ecofeminismes', []],
['Silvia Federici', '1942-', 'ecofeminismes', []],
['Val Plumwood', '1939-2008', 'ecofeminismes', []],
['Susan Griffin', '1943-', 'ecofeminismes', []],
['Veronika Bennholdt-Thomsen', '1944-', 'ecofeminismes', []],
['Geneviève Pruvost', '1973-', 'ecofeminismes', []],
['Donna Haraway', '1944-', 'ecofeminismes', ['pensees-vivant']],
['Émilie Hache', '', 'ecofeminismes', []],
['Joanna Macy', '1929-', 'ecofeminismes', ['ethiques-environnementales']],
// Capitalisme vert
['Bill Gates', '1955-', 'capitalisme-vert', []],
['Christiana Figueres', '1956-', 'capitalisme-vert', []],
['Nicholas Stern', '1946-', 'capitalisme-vert', []],
['Jeffrey Sachs', '1954-', 'capitalisme-vert', []],
['Jared Diamond', '1937-', 'capitalisme-vert', ['decroissance']],
['Jørgen Randers', '1945-', 'capitalisme-vert', ['decroissance']],
['Donella Meadows', '1941-2001', 'decroissance', ['capitalisme-vert']],
['Dennis Meadows', '1942-', 'decroissance', ['capitalisme-vert']],
['Kate Raworth', '1970-', 'capitalisme-vert', []],
['Al Gore', '1948-', 'capitalisme-vert', []],
['Hal Harvey', '1960-', 'capitalisme-vert', []],
['Laurence Tubiana', '1951-', 'capitalisme-vert', []],
['Amory Lovins', '1947-', 'capitalisme-vert', []],
['David Pearce', '1959-', 'capitalisme-vert', []],
['Kerry Turner', '1948-', 'capitalisme-vert', []],
['David Keith', '1963-', 'capitalisme-vert', []],
['Ted Nordhaus', '1965-', 'capitalisme-vert', []],
['Michael Shellenberger', '1971-', 'capitalisme-vert', []],
['Pavan Sukhdev', '1960-', 'capitalisme-vert', []],
['Janine Benyus', '1958-', 'capitalisme-vert', []],
['Robert Costanza', '1950-', 'capitalisme-vert', []],
['Peter Kareiva', '1951-', 'capitalisme-vert', []],
['Michelle Marvier', '', 'capitalisme-vert', []],
['Robert Lalasz', '1915-2003', 'capitalisme-vert', []],
['Steward Brand', '1938-', 'capitalisme-vert', []],
['Paul Crutzen', '1933-2021', 'capitalisme-vert', []],
['Kenneth Boulding', '1910-1993', 'capitalisme-vert', []],
['Eugene Odum', '1913-2002', 'capitalisme-vert', []],
['Howard Odum', '1924-2002', 'capitalisme-vert', []],
['Jean-Marc Jancovici', '1962-', 'capitalisme-vert', []],
['Yves Cochet', '1946-', 'capitalisme-vert', ['decroissance']],
['Pablo Servigne', '1978-', 'decroissance', ['capitalisme-vert']],
['Gauthier Chapelle', '1968-', 'decroissance', ['capitalisme-vert']],
// Écologies décoloniales
['Malcom Ferdinand', '1985-', 'ecologies-decoloniales', []],
['Frantz Fanon', '1925-1961', 'ecologies-decoloniales', []],
['Édouard Glissant', '1928-2011', 'ecologies-decoloniales', []],
['Aimé Césaire', '1913-2008', 'ecologies-decoloniales', []],
['Mohamad Amer Meziane', '', 'ecologies-decoloniales', []],
['Chico Mendes', '1944-1988', 'ecologies-decoloniales', []],
['Joan Martínez Alier', '1939-', 'ecologies-decoloniales', []],
['Arturo Escobar', '1951-', 'ecologies-decoloniales', []],
['Sous-commandant Marcos', '1957-', 'ecologies-decoloniales', []],
['Alberto Acosta', '1948-', 'ecologies-decoloniales', []],
['Jérôme Baschet', '1960-', 'ecologies-decoloniales', []],
['Fatima Ouassak', '1976-', 'ecofeminismes', ['ecologies-decoloniales']],
['William Acker', '1991-', 'ecologies-decoloniales', []],
['Giorgos Kallis', '1972-', 'ecologies-decoloniales', ['decroissance']],
['Bernard Lambert', '1931-1984', 'ecologies-decoloniales', []],
// Écofascismes
['Alain de Benoist', '1943-', 'ecofascismes', []],
['Paul Ralph Ehrlich', '1932-', 'ecofascismes', []],
['Garrett Hardin', '1915-2003', 'ecofascismes', []],
['Edward Osborne Wilson', '1929-2021', 'ecofascismes', []],
['Thomas Malthus', '1803-1882', 'ecofascismes', []],
['David Foreman', '1946-2022', 'ecofascismes', []],
['Piero San Giorgio', '1971-', 'ecofascismes', []],
// Éthique environnementale
['Arne Næss', '1912-2009', 'ethiques-environnementales', []],
['Rachel Carson', '1907-1964', 'ethiques-environnementales', []],
['Aldo Leopold', '1887-1948', 'ethiques-environnementales', []],
['Imanishi Kinji', '1902-1992', 'ethiques-environnementales', []],
['Paul Watson', '1950-', 'ethiques-environnementales', []],
['John Muir', '1838-1914', 'ethiques-environnementales', []],
['Edward Abbey', '1927-1989', 'ethiques-environnementales', []],
['John Baird Callicott', '1941-', 'ethiques-environnementales', []],
['Bill Mollison', '1928-2016', 'ethiques-environnementales', []],
['David Holmgren', '1955-', 'ethiques-environnementales', []],
['Peter Singer', '1946-', 'ethiques-environnementales', []],
['Pierre Rabhi', '1938-2021', 'ethiques-environnementales', []],
['Rob Hopkins', '1968-', 'ethiques-environnementales', []],
['Cyril Dion', '1978-', 'ethiques-environnementales', []],
['Gandhi', '1869-1948', 'ethiques-environnementales', []],
['Gifford Pinchot', '1865-1946', 'ethiques-environnementales', []],
['Lanza del Vasto', '1901-1981', 'ethiques-environnementales', []],
['Jorge Mario Bergoglio', '1936-', 'ethiques-environnementales', []],
['Gary Snyder', '1930-', 'ethiques-environnementales', []],
['Henry David Thoreau', '1817-1862', 'ethiques-environnementales', []],
['Ralph Waldo Emerson', '1803-1882', 'ethiques-environnementales', []],
['José Bové', '1953-', 'ethiques-environnementales', []],
['Glenn Albrecht', '1953-', 'ethiques-environnementales', []],
// Pensées du vivant
['Bruno Latour', '1947-2022', 'pensees-vivant', []],
['Isabelle Stengers', '1949-', 'pensees-vivant', []],
['Vinciane Despret', '1959-', 'pensees-vivant', []],
['Baptiste Morizot', '1983-', 'pensees-vivant', []],
['Philippe Descola', '1949-', 'pensees-vivant', []],
['Eduardo Viveiros de Castro', '1951-', 'pensees-vivant', []],
['Anna Tsing', '1952-', 'pensees-vivant', []],
['Deborah Bird Rose', '1946-2018', 'pensees-vivant', []],
['Lynn Margulis', '1938-2011', 'pensees-vivant', []],
['James Lovelock', '1919-2022', 'pensees-vivant', []],
['Serge Moscovici', '1925-2014', 'pensees-vivant', []],
['Theodore Roszak', '1933-2011', 'pensees-vivant', []],
['Baruch Spinoza', '1632-1677', 'pensees-vivant', []],
];
// Special slug overrides (match v2.1 IDs + ligatures)
const NAME_TO_SLUG_OVERRIDES = {
'Malcom Ferdinand': 'malcolm-ferdinand',
"Françoise d'Eaubonne": 'francoise-deaubonne',
'Donella Meadows': 'donella-meadows',
'Dennis Meadows': 'dennis-meadows',
'Arne Næss': 'arne-naess',
'Jørgen Randers': 'jorgen-randers',
};
function slugify(name) {
// Pre-process special ligatures and chars not handled by NFKD
let pre = name
.replace(/[æÆ]/g, 'ae')
.replace(/[øØ]/g, 'o')
.replace(/[œŒ]/g, 'oe')
.replace(/ß/g, 'ss');
// Remove diacritical marks
const noAccent = pre.normalize('NFKD').replace(/[̀-ͯ]/g, '');
return noAccent
.toLowerCase()
.replace(/[^a-z0-9]+/g, '-')
.replace(/^-+|-+$/g, '');
}
function getAuthorSlug(name) {
if (NAME_TO_SLUG_OVERRIDES[name]) return NAME_TO_SLUG_OVERRIDES[name];
return slugify(name);
}
function main() {
const raw = fs.readFileSync(JSON_PATH, 'utf-8');
const data = JSON.parse(raw);
const existingBySlug = {};
for (const a of data.auteurs) existingBySlug[a.id] = a;
const newAuthors = [];
const seenSlugs = new Set();
for (const [nom, dates, ecolePrincipale, ecolesSecondaires] of BONPOTE_AUTHORS) {
const slug = getAuthorSlug(nom);
if (seenSlugs.has(slug)) {
console.error(`DUPLICATE SKIP: ${nom} -> ${slug}`);
continue;
}
seenSlugs.add(slug);
const ingere = INGESTED_AUTHOR_SLUGS.has(slug);
const ecoles = [ecolePrincipale, ...ecolesSecondaires];
if (existingBySlug[slug]) {
// Preserve enriched entry
const entry = { ...existingBySlug[slug], ingere };
newAuthors.push(entry);
} else {
// New minimal entry
const bioProvisoire = ingere
? `Auteur·ice ingéré·e dans le RAG ATIS, bio à enrichir lors de PRG-5.`
: `Théoricien·ne présent·e sur le poster Bonpote (${ecolePrincipale}), non ingéré·e dans le RAG ATIS.`;
newAuthors.push({
id: slug,
nom,
dates,
ecoles,
ecole_principale: ecolePrincipale,
livres_rag: [],
theses_cles_attendues: [],
bio_courte_provisoire: bioProvisoire,
ingere,
});
}
}
// Preserve any v2.1 author not in Bonpote list
for (const [slug, entry] of Object.entries(existingBySlug)) {
if (!seenSlugs.has(slug)) {
const copy = { ...entry };
if (!('ingere' in copy)) copy.ingere = INGESTED_AUTHOR_SLUGS.has(slug);
newAuthors.push(copy);
seenSlugs.add(slug);
console.error(`NOTE: preserved v2.1 author not in Bonpote canonical: ${slug}`);
}
}
const auteursCount = newAuthors.length;
const auteursIngeresCount = newAuthors.filter(a => a.ingere).length;
data.meta.version = '3.0';
data.meta.updated = '2026-05-12';
data.meta.auteurs_count = auteursCount;
data.meta.auteurs_ingeres_count = auteursIngeresCount;
data.meta.source = 'FRACAS Bonpote V2 oct 2024 + LightRAG corpus 12/05/2026 (v3.0 sync)';
data.meta.note_v3_0 = 'Phase 8.A sync corpus unifie : ~140 auteurs Bonpote integres, flag ingere:true/false selon LightRAG VPS. Auteurs non-ingeres = entrees minimales (bio provisoire, livres_rag vide), a enrichir lors de PRG-4/PRG-5.';
data.auteurs = newAuthors;
fs.writeFileSync(JSON_PATH, JSON.stringify(data, null, 2), 'utf-8');
// Validate parse-back
const parsedBack = JSON.parse(fs.readFileSync(JSON_PATH, 'utf-8'));
if (parsedBack.auteurs.length !== auteursCount) {
console.error('PARSE-BACK MISMATCH');
process.exit(1);
}
// Stats
const schoolsStats = {};
for (const a of newAuthors) {
const ep = a.ecole_principale || '?';
if (!schoolsStats[ep]) schoolsStats[ep] = { total: 0, ingere: 0 };
schoolsStats[ep].total++;
if (a.ingere) schoolsStats[ep].ingere++;
}
console.log('\n=== JSON v3.0 written ===');
console.log(`Total auteurs : ${auteursCount}`);
console.log(`Ingeres : ${auteursIngeresCount}`);
console.log(`Non-ingeres : ${auteursCount - auteursIngeresCount}`);
console.log(`Parse-back : OK (${parsedBack.auteurs.length} auteurs)`);
console.log('\nPer school (ecole_principale):');
const sortedSchools = Object.entries(schoolsStats).sort((a, b) => b[1].total - a[1].total);
for (const [school, st] of sortedSchools) {
console.log(` ${school.padEnd(30)} total=${String(st.total).padStart(3)} ingere=${String(st.ingere).padStart(3)} non-ing=${String(st.total - st.ingere).padStart(3)}`);
}
// Top 5 schools with most non-ingested
const nonIngStats = sortedSchools
.map(([k, v]) => [k, v.total - v.ingere])
.sort((a, b) => b[1] - a[1])
.slice(0, 5);
console.log('\nTop 5 ecoles avec le plus de non-ingeres (PRG-4 priorities):');
for (const [school, count] of nonIngStats) {
console.log(` ${school.padEnd(30)} non-ing=${count}`);
}
}
main();