Compare commits

...

10 Commits

Author SHA1 Message Date
37cb836246 chore(astro): upgrade to Astro 6 and fix dynamic collection routes
All checks were successful
SMOKE / smoke (push) Successful in 3s
CI / build-and-anchors (push) Successful in 42s
CI / build-and-anchors (pull_request) Successful in 44s
2026-03-11 17:56:53 +01:00
683b02f4a0 chore(astro): upgrade to astro 6 with legacy content compatibility
All checks were successful
SMOKE / smoke (push) Successful in 11s
CI / build-and-anchors (push) Successful in 40s
CI / build-and-anchors (pull_request) Successful in 38s
2026-03-11 17:17:02 +01:00
20aecc30b1 Merge pull request 'feat(glossary): add core glossarial taxonomy and foundational entries' (#213) from feat/glossaire-core2 into main
All checks were successful
SMOKE / smoke (push) Successful in 18s
CI / build-and-anchors (push) Successful in 45s
Deploy staging+live (annotations) / deploy (push) Successful in 8m42s
Reviewed-on: #213
2026-03-11 13:04:24 +01:00
bfd693de92 Merge pull request 'refactor(import): unify core editorial manifest' (#212) from refactor/unify-manifest-core into main
All checks were successful
SMOKE / smoke (push) Successful in 10s
CI / build-and-anchors (push) Successful in 40s
Deploy staging+live (annotations) / deploy (push) Successful in 8m0s
Reviewed-on: #212
2026-03-11 11:36:47 +01:00
82e7473cac Merge pull request 'fix(content): declare commencer collection and remove implicit ia collection' (#211) from fix/content-collections-stability into main
All checks were successful
SMOKE / smoke (push) Successful in 17s
CI / build-and-anchors (push) Successful in 39s
Deploy staging+live (annotations) / deploy (push) Successful in 8m57s
Reviewed-on: #211
2026-03-11 11:09:39 +01:00
95f8159554 Merge pull request 'proposer: apply ticket #209' (#210) from bot/proposer-209-20260311-090431 into main
All checks were successful
SMOKE / smoke (push) Successful in 12s
CI / build-and-anchors (push) Successful in 37s
Deploy staging+live (annotations) / deploy (push) Successful in 8m16s
Reviewed-on: #210
2026-03-11 10:06:49 +01:00
archicratie-bot
5698c494f1 edit: apply ticket #209 (/cas-ia/introduction/#p-16-615e3d61)
All checks were successful
CI / build-and-anchors (pull_request) Successful in 43s
SMOKE / smoke (push) Successful in 3s
CI / build-and-anchors (push) Successful in 37s
2026-03-11 09:04:53 +00:00
e640e66b8d Merge pull request 'proposer: apply ticket #207' (#208) from bot/proposer-207-20260311-082736 into main
All checks were successful
SMOKE / smoke (push) Successful in 6s
CI / build-and-anchors (push) Successful in 37s
Deploy staging+live (annotations) / deploy (push) Successful in 7m40s
Reviewed-on: #208
2026-03-11 09:29:21 +01:00
archicratie-bot
9be7d170c6 edit: apply ticket #207 (/cas-ia/introduction/#p-10-ceba29a2)
All checks were successful
CI / build-and-anchors (pull_request) Successful in 40s
SMOKE / smoke (push) Successful in 2s
CI / build-and-anchors (push) Successful in 41s
2026-03-11 08:27:58 +00:00
c2c98c516b Merge pull request 'refactor(editorial): recentrer le site sur le noyau archicratique' (#206) from refactor/recentrage-noyau-archicratique into main
All checks were successful
SMOKE / smoke (push) Successful in 9s
CI / build-and-anchors (push) Successful in 37s
Deploy staging+live (annotations) / deploy (push) Successful in 8m54s
Reviewed-on: #206
2026-03-10 20:43:16 +01:00
12 changed files with 470 additions and 1188 deletions

View File

@@ -86,6 +86,10 @@ function rehypeDedupeIds() {
}
export default defineConfig({
legacy: {
collectionsBackwardsCompat: true,
},
output: "static",
trailingSlash: "always",
site: process.env.PUBLIC_SITE ?? "http://localhost:4321",

1565
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@@ -25,11 +25,11 @@
"ci": "CI=1 npm test"
},
"dependencies": {
"@astrojs/mdx": "^4.3.13",
"astro": "^5.18.0"
"@astrojs/mdx": "^5.0.0",
"astro": "^6.0.2"
},
"devDependencies": {
"@astrojs/sitemap": "^3.7.0",
"@astrojs/sitemap": "^3.7.1",
"mammoth": "^1.11.0",
"pagefind": "^1.4.0",
"rehype-autolink-headings": "^7.1.0",

View File

@@ -1,5 +1,9 @@
{
"/archicrat-ia/chapitre-3/": {
"p-1-60c7ea48": "p-1-a21087b0"
},
"/cas-ia/introduction/": {
"p-10-ceba29a2": "p-10-93d1eda0",
"p-16-615e3d61": "p-16-5b453a81"
}
}

View File

@@ -11,7 +11,8 @@ const {
const entries = (await getCollection(collection))
.sort((a, b) => (a.data.order ?? 0) - (b.data.order ?? 0));
const href = (slug) => `${basePath}/${slug}/`;
const routeSlug = (entry) => String(entry.id || "").replace(/\.(md|mdx)$/i, "");
const href = (entry) => `${basePath}/${routeSlug(entry)}/`;
---
<nav class="toc-global" aria-label={label}>
@@ -21,10 +22,12 @@ const href = (slug) => `${basePath}/${slug}/`;
<ol class="toc-global__list">
{entries.map((e) => {
const active = e.slug === currentSlug;
const entrySlug = routeSlug(e);
const active = entrySlug === currentSlug;
return (
<li class={`toc-item ${active ? "is-active" : ""}`}>
<a class="toc-link" href={href(e.slug)} aria-current={active ? "page" : undefined}>
<a class="toc-link" href={href(e)} aria-current={active ? "page" : undefined}>
<span class="toc-link__row">
{active ? (
<span class="toc-active-indicator" aria-hidden="true">👉</span>

View File

@@ -34,7 +34,7 @@ Cest cette incrustation que nous allons prendre pour terrain. Pour rendre l
- dans la modération et la curation de contenus, pour filtrer des messages “toxiques”, recommander des publications, ajuster la visibilité de certains profils.
Système F nest pas un fantasme technologique éloigné : il agrège des fonctions déjà présentes, sous dautres noms, dans de nombreux pays et secteurs. Des algorithmes de *scoring* de fraude sociale ont été utilisés dans des administrations de sécurité sociale, provoquant scandales et contentieux lorsquils ciblaient de façon disproportionnée certains quartiers, certaines familles, certains types de parcours\* ; des systèmes dévaluation de risque ont été intégrés à des décisions de justice pour proposer des peines ou des libérations conditionnelles ; des plateformes de recrutement recourent à des modèles dIA pour pré-filtrer des milliers de candidatures en quelques minutes ; les systèmes de modération emploient depuis longtemps des modèles dapprentissage pour détecter les propos violents, haineux, pornographiques. Système F est donc moins une fiction quun nom commun donné à un ensemble de tendances déjà engagées.
Système F nest pas un fantasme technologique éloigné : il agrège des fonctions déjà présentes, sous dautres noms, dans de nombreux pays et secteurs. Des algorithmes de scoring de fraude sociale ont été utilisés dans des administrations de sécurité sociale, provoquant scandales et contentieux lorsquils ciblaient de façon disproportionnée certains quartiers, certaines familles, certains types de parcours ; des systèmes dévaluation de risque ont été intégrés à des décisions de justice pour proposer des peines ou des libérations conditionnelles ; des plateformes de recrutement recourent à des modèles dIA pour pré-filtrer des milliers de candidatures en quelques minutes ; les systèmes de modération emploient depuis longtemps des modèles dapprentissage pour détecter les propos violents, haineux, pornographiques. Système F est donc moins une fiction quun nom commun donné à un ensemble de tendances déjà engagées.
Ce qui nous intéresse nest pas lIA “en général”, ni lintelligence artificielle comme problème métaphysique. Ce qui nous intéresse, dans notre manière de voir les choses, cest lécosystème socio-technique dans lequel Système F est inséré : les chaînes cratiales quil tisse ou renforce, les formes darcalité explicite ou implicite quil véhicule, les archicrations quil rencontre, détourne ou évite. Un modèle appelé par API dans un formulaire de demande de logement nest pas un objet neutre : il devient un segment de chaîne régulatrice qui affecte des droits à lhébergement ; il participe à la décision de traiter un dossier en priorité, de le mettre en attente, de le faire basculer dans la catégorie “suspect”. De même, un modèle intégré au tri des CV dans une grande entreprise nest pas un simple gain de temps : il devient un opérateur qui donne la forme concrète de laccès à lemploi.
@@ -46,7 +46,7 @@ La première est lépreuve de *détectabilité*. Elle consiste à savoir si,
La deuxième est lépreuve archéogénétique. Il sagit de replacer Système F dans la série des méta-régimes régulateurs décrits par la thèse : techno-logistique, scripturo-bureaucratique, marchand, guerrier, etc. Nous demanderons : de quelle histoire Système F est-il le prolongement ? Relève-t-il dune nouvelle étape radicalement inédite, ou vient-il composer plusieurs régimes existants — par exemple la mégamachine techno-logistique, la rationalité scripturo-bureaucratique et le régime marchand ? Quels “styles de régulation” anciens réactive-t-il sous une forme technique nouvelle ?
La troisième est lépreuve morphologique. Elle consiste à confronter Système F aux grandes philosophies du pouvoir auxquelles la thèse sest mesurée : gouvernementalité foucaldienne, espace public habermassien, dissensus rancière, économies de la grandeur de Boltanski et Thévenot, etc. Que devient la gouvernementalité quand elle se dote dun Système F ? Que devient lespace public quand les contributions circulent à travers des filtres IA ? Comment les épreuves de justification se transforment-elles lorsque des modèles statistiques produisent des classements et des diagnostics à grande échelle ? Cette épreuve permettra de montrer ce que le paradigme archicratique voit que ces philosophies laissent en retrait : la question de la scène concrète où le pouvoir se justifie (ou ne se justifie pas).
La troisième est lépreuve morphologique. Elle consiste à confronter Système F aux grandes philosophies du pouvoir auxquelles la thèse sest mesurée : gouvernementalité foucaldienne, espace public habermassien, économies de la grandeur de Boltanski et Thévenot, etc. Que devient la gouvernementalité quand elle se dote dun Système F ? Que devient lespace public quand les contributions circulent à travers des filtres IA ? Comment les épreuves de justification se transforment-elles lorsque des modèles statistiques produisent des classements et des diagnostics à grande échelle ? Cette épreuve permettra de montrer ce que le paradigme archicratique voit que ces philosophies laissent en retrait : la question de la scène concrète où le pouvoir se justifie (ou ne se justifie pas).
La quatrième est lépreuve historique. Les révolutions industrielles ont été relues par la thèse comme des révolutions régulatrices : chaque vague technologique reconfigurant les agencements entre *arcalité, cratialité, archicration*. Nous montrerons en quoi Système F est un produit avancé de la quatrième révolution régulatrice (numérisation intégrale, pilotage par indicateurs) et en quoi il force à prendre au sérieux lhypothèse dune cinquième révolution scénique : non plus centrée sur lextension de la puissance calculatoire, mais sur la réinstitution de la scène comme opérateur central du pouvoir.

View File

@@ -1,34 +1,38 @@
---
import EditionLayout from "../../layouts/EditionLayout.astro";
import { getCollection } from "astro:content";
import EditionToc from "../../components/EditionToc.astro";
import LocalToc from "../../components/LocalToc.astro";
import { getCollection, render } from "astro:content";
export async function getStaticPaths() {
// ✅ Après migration : plus de filtre par prefix, on prend toute la collection
const entries = await getCollection("archicrat-ia");
return entries.map((entry) => ({
params: { slug: entry.slug },
props: { entry },
params: { slug: String(entry.id).replace(/\.(md|mdx)$/i, "") },
props: { entry }
}));
}
const { entry } = Astro.props;
const { Content, headings } = await entry.render();
const { Content, headings } = await render(entry);
---
<EditionLayout
title={entry.data.title}
editionLabel="Essai-thèse"
editionKey="archicrat-ia"
statusLabel="essai-thèse"
statusLabel="Essai-thèse"
statusKey="essai_these"
level={entry.data.level}
level={entry.data.level ?? 1}
version={entry.data.version}
>
<Fragment slot="aside">
<EditionToc currentSlug={entry.slug} />
<EditionToc
currentSlug={String(entry.id).replace(/\.(md|mdx)$/i, "")}
collection="archicrat-ia"
basePath="/archicrat-ia"
label="Table des matières — ArchiCraT-IA"
/>
<LocalToc headings={headings} />
</Fragment>

View File

@@ -2,12 +2,8 @@
import SiteLayout from "../../layouts/SiteLayout.astro";
import { getCollection } from "astro:content";
// ✅ Après migration physique : collection = "archicrat-ia", slug = "chapitre-3" (sans prefix)
const entries = await getCollection("archicrat-ia");
entries.sort((a, b) => (a.data.order ?? 9999) - (b.data.order ?? 9999));
const href = (slug) => `/archicrat-ia/${slug}/`;
---
<SiteLayout title="Essai-thèse — ArchiCraT-IA">
@@ -15,7 +11,11 @@ const href = (slug) => `/archicrat-ia/${slug}/`;
<ul>
{entries.map((e) => (
<li><a href={href(e.slug)}>{e.data.title}</a></li>
<li>
<a href={`/archicrat-ia/${String(e.id).replace(/\.(md|mdx)$/i, "")}/`}>
{e.data.title}
</a>
</li>
))}
</ul>
</SiteLayout>

View File

@@ -2,19 +2,19 @@
import EditionLayout from "../../layouts/EditionLayout.astro";
import EditionToc from "../../components/EditionToc.astro";
import LocalToc from "../../components/LocalToc.astro";
import { getCollection } from "astro:content";
import { getCollection, render } from "astro:content";
export async function getStaticPaths() {
const entries = await getCollection("cas-ia");
return entries.map((entry) => ({
params: { slug: entry.slug },
params: { slug: String(entry.id).replace(/\.(md|mdx)$/i, "") },
props: { entry }
}));
}
const { entry } = Astro.props;
const { Content, headings } = await entry.render();
const { Content, headings } = await render(entry);
---
<EditionLayout
@@ -28,7 +28,7 @@ const { Content, headings } = await entry.render();
>
<Fragment slot="aside">
<EditionToc
currentSlug={entry.slug}
currentSlug={String(entry.id).replace(/\.(md|mdx)$/i, "")}
collection="cas-ia"
basePath="/cas-ia"
label="Table des matières — Cas pratique IA"
@@ -37,6 +37,5 @@ const { Content, headings } = await entry.render();
</Fragment>
<h1>{entry.data.title}</h1>
<Content />
</EditionLayout>

View File

@@ -3,10 +3,7 @@ import SiteLayout from "../../layouts/SiteLayout.astro";
import { getCollection } from "astro:content";
const entries = await getCollection("cas-ia");
entries.sort((a, b) => (a.data.order ?? 9999) - (b.data.order ?? 9999));
const href = (slug: string) => `/cas-ia/${slug}/`;
---
<SiteLayout title="Cas pratique — Gouvernance des systèmes IA">
@@ -14,7 +11,11 @@ const href = (slug: string) => `/cas-ia/${slug}/`;
<ul>
{entries.map((e) => (
<li><a href={href(e.slug)}>{e.data.title}</a></li>
<li>
<a href={`/cas-ia/${String(e.id).replace(/\.(md|mdx)$/i, "")}/`}>
{e.data.title}
</a>
</li>
))}
</ul>
</SiteLayout>

View File

@@ -1,17 +1,17 @@
---
import EditionLayout from "../../layouts/EditionLayout.astro";
import { getCollection } from "astro:content";
import { getCollection, render } from "astro:content";
export async function getStaticPaths() {
const entries = await getCollection("glossaire");
return entries.map((entry) => ({
params: { slug: entry.slug },
params: { slug: String(entry.id).replace(/\.(md|mdx)$/i, "") },
props: { entry },
}));
}
const { entry } = Astro.props;
const { Content } = await entry.render();
const { Content } = await render(entry);
---
<EditionLayout
@@ -26,4 +26,4 @@ const { Content } = await entry.render();
<h1>{entry.data.term}</h1>
<p><em>{entry.data.definitionShort}</em></p>
<Content />
</EditionLayout>
</EditionLayout>

View File

@@ -5,11 +5,17 @@ import { getCollection } from "astro:content";
const entries = await getCollection("glossaire");
entries.sort((a, b) => a.data.term.localeCompare(b.data.term, "fr"));
---
<SiteLayout title="Glossaire archicratique">
<h1>Glossaire archicratique</h1>
<ul>
{entries.map((e) => (
<li><a href={`/glossaire/${e.slug}/`}>{e.data.term}</a> — <em>{e.data.definitionShort}</em></li>
<li>
<a href={`/glossaire/${String(e.id).replace(/\.(md|mdx)$/i, "")}/`}>
{e.data.term}
</a>{" "}
— <em>{e.data.definitionShort}</em>
</li>
))}
</ul>
</SiteLayout>
</SiteLayout>