Compare commits

..

307 Commits

Author SHA1 Message Date
17e11f0322 fix(archicrat-ia): remove duplicated chapitre 4 heading
All checks were successful
SMOKE / smoke (push) Successful in 5s
CI / build-and-anchors (push) Successful in 47s
CI / build-and-anchors (pull_request) Successful in 48s
2026-03-30 16:06:22 +02:00
7df18adfa8 fix(archicrat-ia): sync chapitre 4 from official docx and accept anchor reset
All checks were successful
SMOKE / smoke (push) Successful in 9s
CI / build-and-anchors (push) Successful in 58s
2026-03-30 15:57:43 +02:00
535c5108e2 Merge pull request 'fix(archicrat-ia): drop duplicate chapter 3 heading' (#318) from fix/ch3-docx-sync-20260329 into main
All checks were successful
Proposer Apply (Queue) / apply-proposer (push) Successful in 28s
CI / build-and-anchors (push) Successful in 47s
SMOKE / smoke (push) Successful in 12s
Deploy staging+live (annotations) / deploy (push) Successful in 11m38s
Reviewed-on: #318
2026-03-30 10:30:19 +02:00
20705f6c90 fix(archicrat-ia): drop duplicate chapter 3 heading
All checks were successful
SMOKE / smoke (push) Successful in 2s
CI / build-and-anchors (push) Successful in 47s
CI / build-and-anchors (pull_request) Successful in 43s
2026-03-30 10:26:22 +02:00
eabd2f5f29 Merge pull request 'fix(archicrat-ia): sync chapitre 3 from official docx and accept anchor reset' (#317) from fix/ch3-docx-sync-20260329 into main
All checks were successful
Proposer Apply (Queue) / apply-proposer (push) Successful in 23s
CI / build-and-anchors (push) Successful in 47s
SMOKE / smoke (push) Successful in 9s
Deploy staging+live (annotations) / deploy (push) Successful in 9m38s
Reviewed-on: #317
2026-03-29 21:57:44 +02:00
482151c31c fix(archicrat-ia): sync chapitre 3 from official docx and accept anchor reset
All checks were successful
SMOKE / smoke (push) Successful in 4s
CI / build-and-anchors (push) Successful in 46s
CI / build-and-anchors (pull_request) Successful in 43s
2026-03-29 21:51:25 +02:00
6d9d5a460e Merge pull request 'fix(archicrat-ia): restore chapitre 1 doctrinal opening' (#315) from fix/ch1-restore-opening-20260329-144234 into main
All checks were successful
CI / build-and-anchors (push) Successful in 46s
Proposer Apply (Queue) / apply-proposer (push) Successful in 27s
SMOKE / smoke (push) Successful in 12s
Deploy staging+live (annotations) / deploy (push) Successful in 10m31s
Reviewed-on: #315
2026-03-29 14:53:31 +02:00
89d06ade16 fix(archicrat-ia): restore chapitre 1 doctrinal opening
All checks were successful
SMOKE / smoke (push) Successful in 7s
CI / build-and-anchors (push) Successful in 1m25s
CI / build-and-anchors (pull_request) Successful in 43s
2026-03-29 14:46:51 +02:00
69b35df10c Merge pull request 'fix(archicrat-ia): restore advanced chapitre 1/2 sources and accept chapter 2 anchor reset' (#314) from fix/restore-ch1-ch2-sources-and-churn-20260329 into main
All checks were successful
Proposer Apply (Queue) / apply-proposer (push) Successful in 43s
Deploy staging+live (annotations) / deploy (push) Successful in 12m16s
SMOKE / smoke (push) Successful in 10s
CI / build-and-anchors (push) Successful in 58s
Reviewed-on: #314
2026-03-29 11:31:33 +02:00
b5475e9be1 fix(archicrat-ia): restore advanced chapitre 1/2 sources and accept chapter 2 anchor reset
All checks were successful
SMOKE / smoke (push) Successful in 15s
CI / build-and-anchors (push) Successful in 49s
CI / build-and-anchors (pull_request) Successful in 1m4s
2026-03-29 11:28:19 +02:00
fdd3aace5a Merge pull request 'chore(tooling): add docx source audit and repair helpers' (#313) from chore/docx-tooling-source-audit-and-fix-v3-20260328 into main
All checks were successful
CI / build-and-anchors (push) Successful in 47s
Proposer Apply (Queue) / apply-proposer (push) Successful in 28s
SMOKE / smoke (push) Successful in 6s
Deploy staging+live (annotations) / deploy (push) Successful in 16m22s
Reviewed-on: #313
2026-03-28 23:55:55 +01:00
f86704d67e chore(tooling): add docx source audit and repair helpers
All checks were successful
SMOKE / smoke (push) Successful in 7s
CI / build-and-anchors (push) Successful in 48s
CI / build-and-anchors (pull_request) Successful in 47s
2026-03-28 23:34:42 +01:00
ec8e29a313 Merge pull request 'content(archicrat-ia): drop duplicate chapter H1 in chapitres 1 and 2' (#311) from fix/archicrat-ia-drop-duplicate-h1-ch1-ch2-20260328 into main
All checks were successful
Proposer Apply (Queue) / apply-proposer (push) Successful in 25s
Deploy staging+live (annotations) / deploy (push) Successful in 8m10s
SMOKE / smoke (push) Successful in 6s
CI / build-and-anchors (push) Successful in 45s
CI / build-and-anchors (pull_request) Successful in 51s
Reviewed-on: #311
2026-03-28 23:21:55 +01:00
1dc9a60580 content(archicrat-ia): drop duplicate chapter H1 in chapitres 1 and 2
All checks were successful
SMOKE / smoke (push) Successful in 5s
CI / build-and-anchors (push) Successful in 48s
CI / build-and-anchors (pull_request) Successful in 48s
2026-03-28 23:20:01 +01:00
ee18b26d03 Merge pull request 'content(archicrat-ia): refresh official chapitre 2 docx' (#309) from chore/chapitre-2-docx-refresh-20260328 into main
All checks were successful
Proposer Apply (Queue) / apply-proposer (push) Successful in 22s
Deploy staging+live (annotations) / deploy (push) Successful in 9m29s
SMOKE / smoke (push) Successful in 6s
CI / build-and-anchors (push) Successful in 46s
CI / build-and-anchors (pull_request) Successful in 43s
Reviewed-on: #309
2026-03-28 22:46:24 +01:00
5f4a0f74db content(archicrat-ia): refresh official chapitre 2 docx
All checks were successful
SMOKE / smoke (push) Successful in 5s
CI / build-and-anchors (push) Successful in 46s
CI / build-and-anchors (pull_request) Successful in 49s
2026-03-28 22:42:26 +01:00
6b17df7320 Merge pull request 'content(archicrat-ia): refresh official chapitre 1 docx and anchors baseline' (#308) from chore/chapitre-1-docx-refresh-20260328 into main
All checks were successful
Proposer Apply (Queue) / apply-proposer (push) Successful in 18s
CI / build-and-anchors (push) Successful in 44s
SMOKE / smoke (push) Successful in 7s
Deploy staging+live (annotations) / deploy (push) Successful in 9m26s
Reviewed-on: #308
2026-03-28 19:14:50 +01:00
0c33495342 content(archicrat-ia): refresh official chapitre 1 docx and anchors baseline
All checks were successful
SMOKE / smoke (push) Successful in 6s
CI / build-and-anchors (push) Successful in 46s
CI / build-and-anchors (pull_request) Successful in 44s
2026-03-28 19:12:21 +01:00
d8a09b1def Merge pull request 'chore/prologue-docx-corrections-20260328' (#307) from chore/prologue-docx-corrections-20260328 into main
All checks were successful
Proposer Apply (Queue) / apply-proposer (push) Successful in 27s
CI / build-and-anchors (push) Successful in 49s
SMOKE / smoke (push) Successful in 7s
Deploy staging+live (annotations) / deploy (push) Successful in 9m15s
Reviewed-on: #307
2026-03-28 14:49:48 +01:00
39af501ea0 test(anchors): refresh prologue baseline after intentional text cleanup
All checks were successful
SMOKE / smoke (push) Successful in 5s
CI / build-and-anchors (push) Successful in 51s
CI / build-and-anchors (pull_request) Successful in 47s
2026-03-28 14:44:16 +01:00
4c821d9e83 content(archicrat-ia): refresh official prologue docx corrections 2026-03-28 14:44:16 +01:00
deb4a91348 Merge pull request 'chore/prologue-reimport-final-20260327' (#306) from chore/prologue-reimport-final-20260327 into main
All checks were successful
CI / build-and-anchors (push) Successful in 46s
Proposer Apply (Queue) / apply-proposer (push) Successful in 31s
SMOKE / smoke (push) Successful in 12s
Deploy staging+live (annotations) / deploy (push) Successful in 9m18s
Reviewed-on: #306
2026-03-27 23:20:58 +01:00
5b36b8e54e test(anchors): refresh baseline after prologue reimport
All checks were successful
SMOKE / smoke (push) Successful in 14s
CI / build-and-anchors (push) Successful in 50s
CI / build-and-anchors (pull_request) Successful in 54s
2026-03-27 23:11:01 +01:00
eda5a877ef content(archicrat-ia): reimport official prologue and align importer defaults 2026-03-27 23:11:01 +01:00
5b615a6999 Merge pull request 'fix(glossaire): align reading follow top actions with glossary navigation' (#305) from fix/glossaire-reading-follow-relations-h2 into main
All checks were successful
Proposer Apply (Queue) / apply-proposer (push) Successful in 20s
CI / build-and-anchors (push) Successful in 42s
SMOKE / smoke (push) Successful in 9s
Deploy staging+live (annotations) / deploy (push) Successful in 8m16s
Reviewed-on: #305
2026-03-26 22:33:10 +01:00
99cf0947da fix(glossaire): align reading follow top actions with glossary navigation
All checks were successful
SMOKE / smoke (push) Successful in 5s
CI / build-and-anchors (push) Successful in 47s
CI / build-and-anchors (pull_request) Successful in 43s
2026-03-26 22:30:05 +01:00
dbd1e14e4e Merge pull request 'fix(glossaire): include standalone relation headings in reading follow' (#304) from fix/glossaire-reading-follow-relations-h2 into main
All checks were successful
Proposer Apply (Queue) / apply-proposer (push) Successful in 21s
CI / build-and-anchors (push) Successful in 42s
SMOKE / smoke (push) Successful in 9s
Deploy staging+live (annotations) / deploy (push) Successful in 7m55s
Reviewed-on: #304
2026-03-26 21:35:00 +01:00
7033354011 fix(glossaire): include standalone relation headings in reading follow
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-26 21:29:26 +01:00
7345730e3c Merge pull request 'fix(glossaire): expose relations heading to reading follow' (#303) from fix/glossaire-relations-follow-heading into main
All checks were successful
Proposer Apply (Queue) / apply-proposer (push) Successful in 24s
CI / build-and-anchors (push) Successful in 50s
SMOKE / smoke (push) Successful in 8s
Deploy staging+live (annotations) / deploy (push) Successful in 9m19s
Reviewed-on: #303
2026-03-26 20:47:02 +01:00
cea94c56db fix(glossaire): expose relations heading to reading follow
All checks were successful
SMOKE / smoke (push) Successful in 4s
CI / build-and-anchors (push) Successful in 41s
CI / build-and-anchors (pull_request) Successful in 43s
2026-03-26 20:42:01 +01:00
c1e24736e3 Merge pull request 'feat(glossaire): deduplicate entry aside relation groups' (#302) from feat/glossaire-entry-aside-dedup into main
All checks were successful
Proposer Apply (Queue) / apply-proposer (push) Successful in 21s
CI / build-and-anchors (push) Successful in 49s
SMOKE / smoke (push) Successful in 4s
Deploy staging+live (annotations) / deploy (push) Successful in 9m41s
Reviewed-on: #302
2026-03-26 20:27:31 +01:00
24bbfbc17f feat(glossaire): deduplicate entry aside relation groups
All checks were successful
SMOKE / smoke (push) Successful in 6s
CI / build-and-anchors (push) Successful in 47s
CI / build-and-anchors (pull_request) Successful in 46s
2026-03-26 20:24:49 +01:00
a11e2f1d18 Merge pull request 'fix(glossaire): compact sticky entry hero on glossary pages' (#301) from fix/glossaire-entry-sticky-hero-collapse into main
All checks were successful
Proposer Apply (Queue) / apply-proposer (push) Successful in 32s
CI / build-and-anchors (push) Successful in 45s
SMOKE / smoke (push) Successful in 8s
Deploy staging+live (annotations) / deploy (push) Successful in 9m18s
Reviewed-on: #301
2026-03-26 18:32:19 +01:00
630b146d02 fix(glossaire): compact sticky entry hero on glossary pages
All checks were successful
SMOKE / smoke (push) Successful in 5s
CI / build-and-anchors (push) Successful in 50s
CI / build-and-anchors (pull_request) Successful in 46s
2026-03-26 18:30:34 +01:00
551360db83 Merge pull request 'fix(ci): use local pagefind binary instead of npx wrapper' (#300) from fix/ci-pagefind-local-bin into main
All checks were successful
Proposer Apply (Queue) / apply-proposer (push) Successful in 26s
CI / build-and-anchors (push) Successful in 44s
SMOKE / smoke (push) Successful in 8s
Deploy staging+live (annotations) / deploy (push) Successful in 9m45s
Reviewed-on: #300
2026-03-26 14:45:29 +01:00
a96c282780 fix(ci): use local pagefind binary instead of npx wrapper
All checks were successful
SMOKE / smoke (push) Successful in 5s
CI / build-and-anchors (push) Successful in 45s
CI / build-and-anchors (pull_request) Successful in 46s
2026-03-26 14:41:02 +01:00
d2e0f147c2 Merge pull request 'audit(glossaire): tighten portal exposure and cross-page coherence' (#299) from audit/glossaire-transverse-coherence-fix into main
All checks were successful
Proposer Apply (Queue) / apply-proposer (push) Successful in 33s
SMOKE / smoke (push) Successful in 10s
Deploy staging+live (annotations) / deploy (push) Successful in 10m22s
CI / build-and-anchors (push) Successful in 45s
Reviewed-on: #299
2026-03-26 14:20:37 +01:00
ad95364021 audit(glossaire): tighten portal exposure and cross-page coherence
All checks were successful
SMOKE / smoke (push) Successful in 5s
CI / build-and-anchors (push) Successful in 1m11s
CI / build-and-anchors (pull_request) Successful in 1m17s
2026-03-26 14:16:05 +01:00
e48e322363 Merge pull request 'feat(glossaire): harmonize portal pages and sticky reading ux' (#298) from feat/glossaire-portal-polish-final into main
All checks were successful
Proposer Apply (Queue) / apply-proposer (push) Successful in 27s
Deploy staging+live (annotations) / deploy (push) Successful in 10m51s
SMOKE / smoke (push) Successful in 7s
CI / build-and-anchors (push) Successful in 43s
Reviewed-on: #298
2026-03-26 13:01:46 +01:00
a9f2a5bbd4 feat(glossaire): harmonize portal pages and sticky reading ux
All checks were successful
SMOKE / smoke (push) Successful in 5s
CI / build-and-anchors (push) Successful in 54s
CI / build-and-anchors (pull_request) Successful in 43s
2026-03-26 12:58:17 +01:00
0cba8f868e Merge pull request 'feat(glossaire): harmonize portal pages with shared components' (#297) from feat/glossaire-portals-harmonization into main
All checks were successful
Proposer Apply (Queue) / apply-proposer (push) Successful in 28s
CI / build-and-anchors (push) Successful in 43s
SMOKE / smoke (push) Successful in 7s
Deploy staging+live (annotations) / deploy (push) Successful in 10m36s
Reviewed-on: #297
2026-03-25 23:52:36 +01:00
f8e3ee4cca feat(glossaire): harmonize portal pages with shared components
All checks were successful
SMOKE / smoke (push) Successful in 5s
CI / build-and-anchors (push) Successful in 47s
CI / build-and-anchors (pull_request) Successful in 46s
2026-03-25 23:49:00 +01:00
92e0ad01c6 Merge pull request 'refactor(glossaire): componentize glossary entry page' (#296) from refactor/glossaire-entry-componentization into main
All checks were successful
Proposer Apply (Queue) / apply-proposer (push) Successful in 22s
CI / build-and-anchors (push) Successful in 48s
SMOKE / smoke (push) Successful in 6s
Deploy staging+live (annotations) / deploy (push) Successful in 9m57s
Reviewed-on: #296
2026-03-25 19:28:10 +01:00
e6c18d6b16 refactor(glossaire): componentize glossary entry page
All checks were successful
SMOKE / smoke (push) Successful in 5s
CI / build-and-anchors (push) Successful in 45s
CI / build-and-anchors (pull_request) Successful in 44s
2026-03-25 19:18:58 +01:00
a3092f5d5b Merge pull request 'refactor(glossaire): componentize glossary home sections' (#295) from refactor/glossaire-home-componentization into main
All checks were successful
Proposer Apply (Queue) / apply-proposer (push) Successful in 32s
Deploy staging+live (annotations) / deploy (push) Successful in 11m41s
SMOKE / smoke (push) Successful in 5s
CI / build-and-anchors (push) Successful in 46s
Reviewed-on: #295
2026-03-25 18:30:14 +01:00
7187b69935 refactor(glossaire): componentize glossary home sections
All checks were successful
SMOKE / smoke (push) Successful in 4s
CI / build-and-anchors (push) Successful in 45s
CI / build-and-anchors (pull_request) Successful in 48s
2026-03-25 18:26:43 +01:00
4ba4453661 Merge pull request 'refactor(glossaire): centralize aside and home data' (#294) from feat/glossaire-relational-asides-and-home into main
All checks were successful
Proposer Apply (Queue) / apply-proposer (push) Successful in 21s
CI / build-and-anchors (push) Successful in 42s
SMOKE / smoke (push) Successful in 7s
Deploy staging+live (annotations) / deploy (push) Successful in 9m5s
Reviewed-on: #294
2026-03-25 16:50:31 +01:00
ee42e391e3 refactor(glossaire): centralize aside and home data
All checks were successful
SMOKE / smoke (push) Successful in 5s
CI / build-and-anchors (push) Successful in 48s
CI / build-and-anchors (pull_request) Successful in 43s
2026-03-25 16:48:43 +01:00
f7756be59e Merge pull request 'feat/glossaire-entry-relations-rendering' (#293) from feat/glossaire-entry-relations-rendering into main
All checks were successful
Proposer Apply (Queue) / apply-proposer (push) Successful in 27s
CI / build-and-anchors (push) Successful in 42s
SMOKE / smoke (push) Successful in 6s
Deploy staging+live (annotations) / deploy (push) Successful in 9m40s
Reviewed-on: #293
2026-03-25 15:39:41 +01:00
4abe70e10e refactor(glossaire): extract entry relations rendering
All checks were successful
SMOKE / smoke (push) Successful in 4s
CI / build-and-anchors (push) Successful in 42s
CI / build-and-anchors (pull_request) Successful in 41s
2026-03-25 15:30:51 +01:00
b2b4ec35c0 refactor(glossaire): preserve editorial order for entry relations 2026-03-25 15:20:39 +01:00
b255436958 Merge pull request 'refactor(glossaire): centralize glossary relation helpers' (#292) from feat/glossaire-ui-relations-foundation into main
All checks were successful
Proposer Apply (Queue) / apply-proposer (push) Successful in 24s
Deploy staging+live (annotations) / deploy (push) Successful in 9m2s
SMOKE / smoke (push) Successful in 5s
CI / build-and-anchors (push) Successful in 43s
Reviewed-on: #292
2026-03-25 14:17:11 +01:00
ad06b34a85 refactor(glossaire): centralize glossary relation helpers
All checks were successful
CI / build-and-anchors (pull_request) Successful in 42s
SMOKE / smoke (push) Successful in 3s
CI / build-and-anchors (push) Successful in 41s
2026-03-25 14:15:39 +01:00
a38f585f3d Merge pull request 'feat(glossaire): strengthen paradigms and support theories cross-links' (#291) from chore/glossaire-paradigmes-and-support-theories-mesh into main
All checks were successful
Proposer Apply (Queue) / apply-proposer (push) Successful in 14s
Deploy staging+live (annotations) / deploy (push) Successful in 9m54s
SMOKE / smoke (push) Successful in 6s
CI / build-and-anchors (push) Successful in 47s
CI / build-and-anchors (pull_request) Successful in 48s
Reviewed-on: #291
2026-03-25 10:30:37 +01:00
bf0dc125d1 feat(glossaire): strengthen paradigms and support theories cross-links
All checks were successful
SMOKE / smoke (push) Successful in 3s
CI / build-and-anchors (push) Successful in 44s
CI / build-and-anchors (pull_request) Successful in 1m19s
2026-03-25 10:28:42 +01:00
f61dc15b47 Merge pull request 'feat(glossaire): strengthen meta-regimes and archicrations cross-links' (#290) from chore/glossaire-meta-regimes-and-archicrations-mesh into main
All checks were successful
Proposer Apply (Queue) / apply-proposer (push) Successful in 16s
Deploy staging+live (annotations) / deploy (push) Successful in 8m31s
SMOKE / smoke (push) Successful in 5s
CI / build-and-anchors (push) Successful in 42s
CI / build-and-anchors (pull_request) Successful in 45s
Reviewed-on: #290
2026-03-24 20:41:52 +01:00
1ac3d91a19 fix(glossaire): repair malformed normativo-politiques frontmatter
All checks were successful
SMOKE / smoke (push) Successful in 6s
CI / build-and-anchors (push) Successful in 44s
CI / build-and-anchors (pull_request) Successful in 43s
2026-03-24 20:40:10 +01:00
100ba10409 feat(glossaire): strengthen meta-regimes and archicrations cross-links
Some checks failed
SMOKE / smoke (push) Successful in 4s
CI / build-and-anchors (push) Failing after 27s
2026-03-24 20:33:39 +01:00
5f14785abb Merge pull request 'chore/glossaire-pathologies-figures-and-reinstitution-mesh' (#289) from chore/glossaire-pathologies-figures-and-reinstitution-mesh into main
All checks were successful
CI / build-and-anchors (push) Successful in 47s
Proposer Apply (Queue) / apply-proposer (push) Successful in 32s
SMOKE / smoke (push) Successful in 8s
Deploy staging+live (annotations) / deploy (push) Successful in 11m12s
Reviewed-on: #289
2026-03-24 18:35:06 +01:00
c7043ae9d5 fix(glossaire): repair malformed seeAlso frontmatter
All checks were successful
SMOKE / smoke (push) Successful in 7s
CI / build-and-anchors (push) Successful in 48s
CI / build-and-anchors (pull_request) Successful in 51s
2026-03-24 18:32:55 +01:00
bd1235f8c3 feat(glossaire): strengthen pathologies, figures, and reinstitution cross-links 2026-03-24 18:32:12 +01:00
7ae7b4dca3 Merge pull request 'chore/glossaire-scenes-topologies-audit-and-mesh2' (#288) from chore/glossaire-scenes-topologies-audit-and-mesh into main
All checks were successful
Proposer Apply (Queue) / apply-proposer (push) Successful in 18s
Deploy staging+live (annotations) / deploy (push) Successful in 8m20s
SMOKE / smoke (push) Successful in 7s
CI / build-and-anchors (push) Successful in 43s
Reviewed-on: #288
2026-03-24 17:57:50 +01:00
f088db57d4 feat(glossaire): strengthen scenes, topologies, and IA audit cross-links
All checks were successful
SMOKE / smoke (push) Successful in 3s
CI / build-and-anchors (push) Successful in 43s
CI / build-and-anchors (pull_request) Successful in 42s
2026-03-24 17:56:13 +01:00
311e94ed91 Merge pull request 'feat(glossaire): strengthen tensions cross-links' (#287) from chore/glossaire-tensions-audit-and-mesh into main
All checks were successful
Proposer Apply (Queue) / apply-proposer (push) Successful in 18s
Deploy staging+live (annotations) / deploy (push) Successful in 9m53s
SMOKE / smoke (push) Successful in 3s
CI / build-and-anchors (push) Successful in 42s
CI / build-and-anchors (pull_request) Successful in 41s
Reviewed-on: #287
2026-03-24 14:37:57 +01:00
e078f3f9ab feat(glossaire): strengthen tensions cross-links
All checks were successful
CI / build-and-anchors (push) Successful in 45s
CI / build-and-anchors (pull_request) Successful in 45s
SMOKE / smoke (push) Successful in 5s
2026-03-24 14:32:44 +01:00
7c4bb5a2cf Merge pull request 'fix(glossaire): sanitize imported artefacts and relation metadata' (#286) from chore/glossaire-sanitize-corpus into main
All checks were successful
Proposer Apply (Queue) / apply-proposer (push) Successful in 30s
Deploy staging+live (annotations) / deploy (push) Successful in 11m10s
SMOKE / smoke (push) Successful in 3s
CI / build-and-anchors (push) Successful in 41s
CI / build-and-anchors (pull_request) Successful in 41s
Reviewed-on: #286
2026-03-24 13:37:47 +01:00
214e174635 fix(glossaire): sanitize imported artefacts and relation metadata
All checks were successful
SMOKE / smoke (push) Successful in 6s
CI / build-and-anchors (push) Successful in 45s
CI / build-and-anchors (pull_request) Successful in 47s
2026-03-24 13:34:03 +01:00
f1b2f4605f Merge pull request 'feat/glossaire-sticky-entry-and-aside-polish-20260324' (#285) from feat/glossaire-sticky-entry-and-aside-polish-20260324 into main
All checks were successful
CI / build-and-anchors (push) Successful in 48s
Proposer Apply (Queue) / apply-proposer (push) Successful in 34s
SMOKE / smoke (push) Successful in 16s
Deploy staging+live (annotations) / deploy (push) Successful in 10m2s
Reviewed-on: #285
2026-03-24 00:32:36 +01:00
87955adf5d feat(glossaire): polish sticky entry flow and aside navigation
All checks were successful
SMOKE / smoke (push) Successful in 18s
CI / build-and-anchors (push) Successful in 48s
CI / build-and-anchors (pull_request) Successful in 48s
2026-03-24 00:29:39 +01:00
e39a0c547d feat(glossaire): compress paradigme hero when reading follow is active 2026-03-23 10:27:28 +01:00
c89ddf7237 chore(glossaire): checkpoint before portal hero compression 2026-03-23 00:33:19 +01:00
615effe8bf Merge pull request 'fix(glossaire): description précise du correctif' (#284) from fix/nom-court-et-clair into main
All checks were successful
Proposer Apply (Queue) / apply-proposer (push) Successful in 15s
SMOKE / smoke (push) Successful in 7s
CI / build-and-anchors (push) Successful in 44s
Deploy staging+live (annotations) / deploy (push) Successful in 8m29s
Reviewed-on: #284
2026-03-21 21:41:19 +01:00
e952b344a0 fix(glossaire): description précise du correctif
All checks were successful
SMOKE / smoke (push) Successful in 2s
CI / build-and-anchors (push) Successful in 44s
CI / build-and-anchors (pull_request) Successful in 39s
2026-03-21 21:39:02 +01:00
bb0572cc1a Merge pull request 'fix(glossaire): harmonize portal sticky hero and follow behavior' (#283) from fix/glossaire-portails-sticky-follow-20260321 into main
All checks were successful
Proposer Apply (Queue) / apply-proposer (push) Successful in 20s
CI / build-and-anchors (push) Successful in 44s
SMOKE / smoke (push) Successful in 9s
Deploy staging+live (annotations) / deploy (push) Successful in 9m19s
Reviewed-on: #283
2026-03-21 20:22:43 +01:00
f6a2347278 fix(glossaire): harmonize portal sticky hero and follow behavior
All checks were successful
SMOKE / smoke (push) Successful in 3s
CI / build-and-anchors (push) Successful in 45s
CI / build-and-anchors (pull_request) Successful in 39s
2026-03-21 20:15:13 +01:00
d902c2bf98 Merge pull request 'feat(glossaire): refine portal pages and contextual asides' (#282) from feat/glossaire-portails-asides-polish into main
All checks were successful
Proposer Apply (Queue) / apply-proposer (push) Successful in 17s
CI / build-and-anchors (push) Successful in 48s
SMOKE / smoke (push) Successful in 7s
Deploy staging+live (annotations) / deploy (push) Successful in 8m30s
Reviewed-on: #282
2026-03-20 17:46:21 +01:00
baa2082f51 feat(glossaire): refine portal pages and contextual asides
All checks were successful
SMOKE / smoke (push) Successful in 9s
CI / build-and-anchors (push) Successful in 49s
CI / build-and-anchors (pull_request) Successful in 45s
2026-03-20 17:42:09 +01:00
2f249b420f Merge pull request 'feat(glossaire): enrich entries and refine glossary navigation' (#281) from feat/glossaire-enrich-navigation into main
All checks were successful
CI / build-and-anchors (push) Successful in 48s
Proposer Apply (Queue) / apply-proposer (push) Successful in 29s
SMOKE / smoke (push) Successful in 7s
Deploy staging+live (annotations) / deploy (push) Successful in 10m44s
Reviewed-on: #281
2026-03-19 22:18:49 +01:00
d6b4eb82f4 feat(glossaire): enrich entries and refine glossary navigation
All checks were successful
SMOKE / smoke (push) Successful in 9s
CI / build-and-anchors (push) Successful in 55s
CI / build-and-anchors (pull_request) Successful in 45s
2026-03-19 21:53:33 +01:00
bfa44fecda Merge pull request 'Add archicrations-esthetico-symboliques.md' (#280) from chore/add-archicrations-esthetico-symboliques into main
All checks were successful
Proposer Apply (Queue) / apply-proposer (push) Successful in 23s
CI / build-and-anchors (push) Successful in 47s
SMOKE / smoke (push) Successful in 8s
Deploy staging+live (annotations) / deploy (push) Successful in 10m53s
Reviewed-on: #280
2026-03-18 23:53:32 +01:00
e329235aa9 Add archicrations-esthetico-symboliques.md
All checks were successful
SMOKE / smoke (push) Successful in 7s
CI / build-and-anchors (push) Successful in 51s
CI / build-and-anchors (pull_request) Successful in 45s
2026-03-18 23:51:48 +01:00
8cbaa5117c Merge pull request 'Document cockpit local, NAS supervision, and ops workflow' (#279) from docs-and-ops/cockpit-finalization into main
All checks were successful
Proposer Apply (Queue) / apply-proposer (push) Successful in 28s
Deploy staging+live (annotations) / deploy (push) Successful in 49s
CI / build-and-anchors (push) Successful in 44s
SMOKE / smoke (push) Successful in 4s
Reviewed-on: #279
2026-03-18 18:24:44 +01:00
3086f333ed Document cockpit local, NAS supervision, and ops workflow
All checks were successful
SMOKE / smoke (push) Successful in 6s
CI / build-and-anchors (push) Successful in 49s
CI / build-and-anchors (pull_request) Successful in 42s
2026-03-18 18:21:52 +01:00
c1c3c19d13 Merge pull request 'Use Europe/Paris build time for ops health manifest' (#278) from ops/builtat-paris-time into main
All checks were successful
Proposer Apply (Queue) / apply-proposer (push) Successful in 30s
Deploy staging+live (annotations) / deploy (push) Successful in 46s
CI / build-and-anchors (push) Successful in 44s
SMOKE / smoke (push) Successful in 2s
Reviewed-on: #278
2026-03-18 11:14:11 +01:00
ddcd0acd4d Use Europe/Paris build time for ops health manifest
All checks were successful
SMOKE / smoke (push) Successful in 9s
CI / build-and-anchors (push) Successful in 48s
CI / build-and-anchors (pull_request) Successful in 49s
2026-03-18 11:11:54 +01:00
9bc4eeb3e7 Merge pull request 'Add ops health manifest to deploy pipeline' (#277) from ops/ops-health-deploy into main
All checks were successful
CI / build-and-anchors (push) Successful in 44s
Proposer Apply (Queue) / apply-proposer (push) Successful in 19s
SMOKE / smoke (push) Successful in 7s
Deploy staging+live (annotations) / deploy (push) Successful in 11m8s
Reviewed-on: #277
2026-03-18 10:31:32 +01:00
7a9a5319ac Add ops health manifest to deploy pipeline
All checks were successful
SMOKE / smoke (push) Successful in 11s
CI / build-and-anchors (push) Successful in 58s
CI / build-and-anchors (pull_request) Successful in 1m3s
2026-03-18 10:28:13 +01:00
7d75de5c9f Merge pull request 'docs: formalize localhost auto-sync architecture' (#276) from docs/localhost-auto-sync into main
All checks were successful
CI / build-and-anchors (push) Successful in 51s
Proposer Apply (Queue) / apply-proposer (push) Successful in 19s
SMOKE / smoke (push) Successful in 6s
Deploy staging+live (annotations) / deploy (push) Successful in 46s
Reviewed-on: #276
2026-03-16 21:19:51 +01:00
69c91cb661 docs: formalize localhost auto-sync architecture
All checks were successful
SMOKE / smoke (push) Successful in 9s
CI / build-and-anchors (push) Successful in 47s
CI / build-and-anchors (pull_request) Successful in 45s
2026-03-16 21:14:41 +01:00
a1bfbf4405 Merge pull request 'proposer: apply 2 tickets on /archicrat-ia/prologue/' (#275) from bot/proposer-273-ce91b3d8cf02 into main
All checks were successful
CI / build-and-anchors (push) Successful in 44s
Proposer Apply (Queue) / apply-proposer (push) Successful in 33s
SMOKE / smoke (push) Successful in 12s
Deploy staging+live (annotations) / deploy (push) Successful in 9m57s
Reviewed-on: #275
2026-03-16 16:46:20 +01:00
archicratie-bot
be26b425d8 edit: apply ticket #274 (/archicrat-ia/prologue/#p-23-d91a7b78)
All checks were successful
CI / build-and-anchors (push) Successful in 51s
SMOKE / smoke (push) Successful in 9s
CI / build-and-anchors (pull_request) Successful in 42s
2026-03-16 15:43:09 +00:00
archicratie-bot
abf88e7037 edit: apply ticket #273 (/archicrat-ia/prologue/#p-22-a416d473) 2026-03-16 15:42:47 +00:00
04fee32fdb Merge pull request 'proposer: apply 2 tickets on /archicrat-ia/prologue/' (#272) from bot/proposer-270-39655773c199 into main
All checks were successful
Proposer Apply (Queue) / apply-proposer (push) Successful in 26s
CI / build-and-anchors (push) Successful in 43s
SMOKE / smoke (push) Successful in 8s
Deploy staging+live (annotations) / deploy (push) Successful in 9m20s
Reviewed-on: #272
2026-03-16 13:57:16 +01:00
archicratie-bot
fbddf5c3fc edit: apply ticket #271 (/archicrat-ia/prologue/#p-17-b8c5bf21)
All checks were successful
CI / build-and-anchors (push) Successful in 50s
SMOKE / smoke (push) Successful in 6s
CI / build-and-anchors (pull_request) Successful in 46s
2026-03-16 12:54:46 +00:00
archicratie-bot
bad748df3a edit: apply ticket #270 (/archicrat-ia/prologue/#p-7-64a0ca9c) 2026-03-16 12:54:21 +00:00
0066cf8601 Merge pull request 'fix(actions): harden proposer queue against duplicate batch PRs' (#269) from hotfix/proposer-close-verify into main
All checks were successful
Proposer Apply (Queue) / apply-proposer (push) Successful in 21s
Deploy staging+live (annotations) / deploy (push) Successful in 33s
CI / build-and-anchors (push) Successful in 44s
SMOKE / smoke (push) Successful in 4s
Reviewed-on: #269
2026-03-16 13:42:52 +01:00
5d3473d66c fix(actions): harden proposer queue against duplicate batch PRs
All checks were successful
SMOKE / smoke (push) Successful in 2s
CI / build-and-anchors (push) Successful in 40s
CI / build-and-anchors (pull_request) Successful in 39s
2026-03-16 13:39:09 +01:00
f9d34110e4 Merge pull request 'proposer: apply 2 tickets on /archicrat-ia/prologue/' (#266) from bot/proposer-264-20260316-120249 into main
All checks were successful
Proposer Apply (Queue) / apply-proposer (push) Successful in 20s
CI / build-and-anchors (push) Successful in 41s
SMOKE / smoke (push) Successful in 7s
Deploy staging+live (annotations) / deploy (push) Successful in 7m47s
Reviewed-on: #266
2026-03-16 13:18:27 +01:00
archicratie-bot
84e9c3ead4 edit: apply ticket #265 (/archicrat-ia/prologue/#p-5-85126fa5)
All checks were successful
CI / build-and-anchors (pull_request) Successful in 43s
SMOKE / smoke (push) Successful in 4s
CI / build-and-anchors (push) Successful in 39s
2026-03-16 12:03:37 +00:00
archicratie-bot
72e59175fc edit: apply ticket #264 (/archicrat-ia/prologue/#p-4-8ed4f807) 2026-03-16 12:03:13 +00:00
81b69ac6d5 Merge pull request 'fix(actions): verify proposer issue closure after PR creation' (#263) from hotfix/proposer-close-verify into main
All checks were successful
CI / build-and-anchors (push) Successful in 43s
Deploy staging+live (annotations) / deploy (push) Successful in 47s
Proposer Apply (Queue) / apply-proposer (push) Successful in 33s
SMOKE / smoke (push) Successful in 2s
Reviewed-on: #263
2026-03-16 12:54:26 +01:00
513ae72e85 fix(actions): verify proposer issue closure after PR creation
All checks were successful
SMOKE / smoke (push) Successful in 5s
CI / build-and-anchors (push) Successful in 43s
CI / build-and-anchors (pull_request) Successful in 47s
2026-03-16 12:52:47 +01:00
4c4dd1c515 Merge pull request 'fix(actions): remove fragile heredocs from proposer PR step' (#262) from hotfix/proposer-no-heredoc-pr-step into main
All checks were successful
Deploy staging+live (annotations) / deploy (push) Successful in 39s
CI / build-and-anchors (push) Successful in 46s
SMOKE / smoke (push) Successful in 7s
Proposer Apply (Queue) / apply-proposer (push) Successful in 1m30s
Reviewed-on: #262
2026-03-16 12:34:12 +01:00
46b15ed6ab fix(actions): remove fragile heredocs from proposer PR step
All checks were successful
SMOKE / smoke (push) Successful in 5s
CI / build-and-anchors (push) Successful in 44s
CI / build-and-anchors (pull_request) Successful in 40s
2026-03-16 12:30:43 +01:00
a015e72f7c Merge pull request 'proposer: apply ticket #257' (#261) from bot/proposer-257-20260316-111742 into main
All checks were successful
CI / build-and-anchors (push) Successful in 42s
SMOKE / smoke (push) Successful in 8s
Proposer Apply (Queue) / apply-proposer (push) Successful in 1m26s
Deploy staging+live (annotations) / deploy (push) Successful in 7m52s
Reviewed-on: #261
2026-03-16 12:21:55 +01:00
archicratie-bot
d5df7d77a0 edit: apply ticket #257 (/archicrat-ia/prologue/#p-0-d7974f88)
All checks were successful
CI / build-and-anchors (push) Successful in 42s
CI / build-and-anchors (pull_request) Successful in 40s
SMOKE / smoke (push) Successful in 4s
2026-03-16 11:18:06 +00:00
ec3ceee862 Merge pull request 'fix(actions): tolerate empty label payload in proposer gate' (#260) from debug/proposer-257 into main
Some checks failed
CI / build-and-anchors (push) Successful in 46s
Deploy staging+live (annotations) / deploy (push) Successful in 48s
SMOKE / smoke (push) Successful in 2s
Proposer Apply (Queue) / apply-proposer (push) Failing after 1m39s
Reviewed-on: #260
2026-03-16 12:16:12 +01:00
867475c3ff fix(actions): tolerate empty label payload in proposer gate
All checks were successful
SMOKE / smoke (push) Successful in 8s
CI / build-and-anchors (push) Successful in 45s
CI / build-and-anchors (pull_request) Successful in 39s
2026-03-16 12:14:01 +01:00
b024c5557c Merge pull request 'fix(editorial): preserve frontmatter in apply-ticket' (#259) from hotfix/preserve-frontmatter-apply-ticket into main
All checks were successful
CI / build-and-anchors (push) Successful in 47s
Proposer Apply (Queue) / apply-proposer (push) Successful in 38s
SMOKE / smoke (push) Successful in 11s
Deploy staging+live (annotations) / deploy (push) Successful in 9m38s
Reviewed-on: #259
2026-03-16 11:52:07 +01:00
93306f360d fix(editorial): preserve frontmatter in apply-ticket
All checks were successful
SMOKE / smoke (push) Successful in 9s
CI / build-and-anchors (push) Successful in 51s
CI / build-and-anchors (pull_request) Successful in 44s
2026-03-16 11:48:08 +01:00
52847d999d Merge pull request 'fix(actions): silence anno workflow on proposer tickets' (#258) from hotfix/fix-proposer-runtime-v2 into main
Some checks failed
Deploy staging+live (annotations) / deploy (push) Successful in 51s
CI / build-and-anchors (push) Successful in 49s
SMOKE / smoke (push) Successful in 5s
Proposer Apply (Queue) / apply-proposer (push) Failing after 48s
Reviewed-on: #258
2026-03-16 11:11:28 +01:00
b9629b43ff fix(actions): silence anno workflow on proposer tickets
All checks were successful
SMOKE / smoke (push) Successful in 9s
CI / build-and-anchors (push) Successful in 49s
CI / build-and-anchors (pull_request) Successful in 44s
2026-03-16 11:06:11 +01:00
06482a9f8d Merge pull request 'fix(actions): make proposer queue runtime-safe' (#254) from hotfix/fix-proposer-runtime-v2 into main
All checks were successful
Proposer Apply (Queue) / apply-proposer (push) Successful in 21s
CI / build-and-anchors (push) Successful in 46s
SMOKE / smoke (push) Successful in 6s
Deploy staging+live (annotations) / deploy (push) Successful in 42s
Reviewed-on: #254
2026-03-16 00:59:50 +01:00
f2e4ae5ac2 fix(actions): make proposer queue runtime-safe
All checks were successful
SMOKE / smoke (push) Successful in 7s
CI / build-and-anchors (push) Successful in 44s
CI / build-and-anchors (pull_request) Successful in 42s
2026-03-16 00:58:10 +01:00
71baf0f6da Merge pull request 'fix(actions): repair proposer workflow yaml' (#253) from hotfix/fix-proposer-workflow into main
Some checks failed
CI / build-and-anchors (push) Successful in 48s
Deploy staging+live (annotations) / deploy (push) Successful in 1m0s
SMOKE / smoke (push) Successful in 4s
Proposer Apply (Queue) / apply-proposer (push) Failing after 4s
Reviewed-on: #253
2026-03-16 00:42:17 +01:00
d02b6fc347 fix(actions): repair proposer workflow yaml
All checks were successful
SMOKE / smoke (push) Successful in 9s
CI / build-and-anchors (push) Successful in 43s
CI / build-and-anchors (pull_request) Successful in 45s
2026-03-16 00:38:46 +01:00
431f1e347b Merge pull request 'chore(editorial): harden proposer queue and apply-ticket' (#252) from chore/editorial-hardening-v1-clean into main
Some checks are pending
Deploy staging+live (annotations) / deploy (push) Waiting to run
CI / build-and-anchors (push) Successful in 1m6s
SMOKE / smoke (push) Successful in 39s
Reviewed-on: #252
2026-03-16 00:02:31 +01:00
ab6f45ed5c chore(editorial): harden proposer queue and apply-ticket
All checks were successful
SMOKE / smoke (push) Successful in 6s
CI / build-and-anchors (push) Successful in 43s
CI / build-and-anchors (pull_request) Successful in 46s
2026-03-15 23:58:11 +01:00
02c060d239 Merge pull request 'chore/reset-from-docx-clean-base' (#251) from chore/reset-from-docx-clean-base into main
All checks were successful
SMOKE / smoke (push) Successful in 8s
CI / build-and-anchors (push) Successful in 45s
Deploy staging+live (annotations) / deploy (push) Successful in 9m50s
Reviewed-on: #251
2026-03-15 21:19:24 +01:00
be2029de82 ci(anchors): accept intentional chapitre 1 anchor reset
All checks were successful
SMOKE / smoke (push) Successful in 4s
CI / build-and-anchors (push) Successful in 42s
CI / build-and-anchors (pull_request) Successful in 44s
2026-03-15 21:11:20 +01:00
e148eaeaf3 content(archicrat-ia): refresh chapitre 1 from official docx
Some checks failed
SMOKE / smoke (push) Successful in 7s
CI / build-and-anchors (push) Failing after 42s
2026-03-15 20:50:35 +01:00
c63a1e6ce4 chore(reset): reimport chapitre 1 from docx clean base
All checks were successful
SMOKE / smoke (push) Successful in 7s
CI / build-and-anchors (push) Successful in 44s
2026-03-15 20:33:49 +01:00
b3a73a7781 Merge pull request 'chore(reset): reimport chapitre 1 from docx clean base' (#250) from chore/reset-from-docx-clean-base into main
All checks were successful
SMOKE / smoke (push) Successful in 8s
CI / build-and-anchors (push) Successful in 37s
Deploy staging+live (annotations) / deploy (push) Successful in 9m32s
Reviewed-on: #250
2026-03-15 15:31:37 +01:00
1968585d0f chore(reset): reimport chapitre 1 from docx clean base
All checks were successful
CI / build-and-anchors (push) Successful in 57s
CI / build-and-anchors (pull_request) Successful in 50s
SMOKE / smoke (push) Successful in 5s
2026-03-15 15:29:09 +01:00
b33c758411 Merge pull request 'proposer: apply ticket #236' (#243) from bot/proposer-236-20260315-112808 into main
All checks were successful
Deploy staging+live (annotations) / deploy (push) Successful in 12m1s
SMOKE / smoke (push) Successful in 4s
CI / build-and-anchors (push) Successful in 44s
CI / build-and-anchors (pull_request) Successful in 43s
Reviewed-on: #243
2026-03-15 12:55:33 +01:00
afa543125c Merge pull request 'proposer: apply ticket #235' (#242) from bot/proposer-235-20260315-112515 into main
Some checks are pending
Deploy staging+live (annotations) / deploy (push) Has started running
SMOKE / smoke (push) Successful in 7s
CI / build-and-anchors (push) Successful in 51s
Reviewed-on: #242
2026-03-15 12:47:26 +01:00
archicratie-bot
0d0252cac0 edit: apply ticket #236 (/archicrat-ia/chapitre-1/#p-400-8959d62e)
All checks were successful
CI / build-and-anchors (push) Successful in 45s
SMOKE / smoke (push) Successful in 3s
CI / build-and-anchors (pull_request) Successful in 39s
2026-03-15 11:28:36 +00:00
archicratie-bot
a8bd9aeed5 edit: apply ticket #235 (/archicrat-ia/chapitre-1/#p-139-caa4e99d)
All checks were successful
CI / build-and-anchors (pull_request) Successful in 47s
CI / build-and-anchors (push) Successful in 41s
SMOKE / smoke (push) Successful in 3s
2026-03-15 11:25:43 +00:00
d277c61afd Merge pull request 'proposer: apply ticket #229' (#232) from bot/proposer-229-20260315-105537 into main
Some checks failed
CI / build-and-anchors (push) Successful in 51s
SMOKE / smoke (push) Successful in 10s
Deploy staging+live (annotations) / deploy (push) Has been cancelled
Reviewed-on: #232
2026-03-15 12:24:34 +01:00
archicratie-bot
86479952d1 edit: apply ticket #229 (/archicrat-ia/chapitre-1/#p-10-1a706744)
All checks were successful
CI / build-and-anchors (pull_request) Successful in 42s
CI / build-and-anchors (push) Successful in 42s
SMOKE / smoke (push) Successful in 5s
2026-03-15 10:56:03 +00:00
c94024a8ae Merge pull request 'feat(glossaire): add advanced external paradigms from chapter 3' (#228) from feat/glossaire-archicrations-cartographie into main
All checks were successful
SMOKE / smoke (push) Successful in 7s
CI / build-and-anchors (push) Successful in 45s
Deploy staging+live (annotations) / deploy (push) Successful in 9m53s
Reviewed-on: #228
2026-03-15 10:08:48 +01:00
70611d16f8 feat(glossaire): add advanced external paradigms from chapter 3
All checks were successful
SMOKE / smoke (push) Successful in 11s
CI / build-and-anchors (push) Successful in 44s
CI / build-and-anchors (pull_request) Successful in 44s
2026-03-15 10:05:32 +01:00
354db231b8 Merge pull request 'feat(glossaire): enrichit la cartographie archicratique et les archicrations' (#227) from feat/glossaire-archicrations-cartographie into main
All checks were successful
SMOKE / smoke (push) Successful in 14s
CI / build-and-anchors (push) Successful in 45s
Deploy staging+live (annotations) / deploy (push) Successful in 9m37s
Reviewed-on: #227
2026-03-14 19:57:38 +01:00
9d8d60d00f feat(glossaire): enrichit la cartographie archicratique et les archicrations
All checks were successful
SMOKE / smoke (push) Successful in 4s
CI / build-and-anchors (push) Successful in 42s
CI / build-and-anchors (pull_request) Successful in 38s
2026-03-14 19:55:16 +01:00
f5d25abbec Merge pull request 'feat(glossaire): add advanced external paradigms from chapter 3' (#226) from feat/glossaire-paradigmes-externes into main
All checks were successful
SMOKE / smoke (push) Successful in 10s
CI / build-and-anchors (push) Successful in 44s
Deploy staging+live (annotations) / deploy (push) Successful in 7m13s
Reviewed-on: #226
2026-03-13 18:55:10 +01:00
8e9f7314f5 feat(glossaire): add advanced external paradigms from chapter 3
All checks were successful
SMOKE / smoke (push) Successful in 3s
CI / build-and-anchors (push) Successful in 41s
CI / build-and-anchors (pull_request) Successful in 40s
2026-03-13 18:48:33 +01:00
03b88b944d Merge pull request 'feat(glossaire): integrate paradigms portal into glossary navigation' (#225) from feat/glossaire-paradigmes-externes into main
All checks were successful
SMOKE / smoke (push) Successful in 21s
CI / build-and-anchors (push) Successful in 43s
Deploy staging+live (annotations) / deploy (push) Successful in 7m38s
Reviewed-on: #225
2026-03-13 18:06:43 +01:00
385c36f660 feat(glossaire): integrate paradigms portal into glossary navigation
All checks were successful
SMOKE / smoke (push) Successful in 7s
CI / build-and-anchors (push) Successful in 40s
CI / build-and-anchors (pull_request) Successful in 41s
2026-03-13 18:04:13 +01:00
cfa092cd38 Merge pull request 'feat(glossaire): introduce doctrine as ontology type' (#224) from feat/glossaire-paradigmes-externes into main
All checks were successful
SMOKE / smoke (push) Successful in 11s
CI / build-and-anchors (push) Successful in 43s
Deploy staging+live (annotations) / deploy (push) Successful in 8m36s
Reviewed-on: #224
2026-03-13 16:47:52 +01:00
1a762f8f54 feat(glossaire): introduce doctrine as ontology type
All checks were successful
SMOKE / smoke (push) Successful in 5s
CI / build-and-anchors (push) Successful in 41s
CI / build-and-anchors (pull_request) Successful in 38s
2026-03-13 16:45:29 +01:00
fbdaf72775 Merge pull request 'refactor(glossaire): introduce dedicated GlossaryLayout wrapper' (#223) from feat/glossaire-paradigmes-externes into main
All checks were successful
SMOKE / smoke (push) Successful in 10s
CI / build-and-anchors (push) Successful in 41s
Deploy staging+live (annotations) / deploy (push) Successful in 8m12s
Reviewed-on: #223
2026-03-13 15:15:32 +01:00
67128a9ca1 refactor(glossaire): introduce dedicated GlossaryLayout wrapper
All checks were successful
SMOKE / smoke (push) Successful in 4s
CI / build-and-anchors (push) Successful in 41s
CI / build-and-anchors (pull_request) Successful in 39s
2026-03-13 15:11:39 +01:00
898759db3d Merge pull request 'feat(glossaire): refactor core archicratic concepts' (#222) from feat/glossaire-paradigmes-externes into main
All checks were successful
SMOKE / smoke (push) Successful in 9s
CI / build-and-anchors (push) Successful in 39s
Deploy staging+live (annotations) / deploy (push) Successful in 8m6s
Reviewed-on: #222
2026-03-13 14:36:40 +01:00
4f009a9557 feat(glossaire): refactor core archicratic concepts
All checks were successful
SMOKE / smoke (push) Successful in 4s
CI / build-and-anchors (push) Successful in 40s
CI / build-and-anchors (pull_request) Successful in 37s
2026-03-13 14:32:41 +01:00
378d0981f0 Merge pull request 'refactor(glossaire): disable reading-only controls in glossary' (#221) from feat/glossaire-paradigmes-externes into main
All checks were successful
SMOKE / smoke (push) Successful in 20s
CI / build-and-anchors (push) Successful in 41s
Deploy staging+live (annotations) / deploy (push) Successful in 9m36s
Reviewed-on: #221
2026-03-12 19:27:16 +01:00
8f3702f803 refactor(glossaire): disable reading-only controls in glossary
All checks were successful
SMOKE / smoke (push) Successful in 5s
CI / build-and-anchors (push) Successful in 40s
CI / build-and-anchors (pull_request) Successful in 41s
2026-03-12 19:23:50 +01:00
cfd303fc85 Merge pull request 'Nouveaux Ajouts - Glossaire' (#220) from feat/glossaire-paradigmes-externes into main
All checks were successful
SMOKE / smoke (push) Successful in 8s
CI / build-and-anchors (push) Successful in 39s
Deploy staging+live (annotations) / deploy (push) Successful in 8m26s
Reviewed-on: #220
2026-03-12 17:45:03 +01:00
0fc0976f8a refactor(glossaire): polish contextual aside navigation
All checks were successful
SMOKE / smoke (push) Successful in 7s
CI / build-and-anchors (push) Successful in 41s
CI / build-and-anchors (pull_request) Successful in 42s
2026-03-12 17:42:16 +01:00
e247ea8ead Merge pull request 'feat(glossaire): strengthen conceptual and paradigmatic cross-links' (#219) from feat/glossaire-paradigmes-externes into main
All checks were successful
SMOKE / smoke (push) Successful in 12s
CI / build-and-anchors (push) Successful in 43s
Deploy staging+live (annotations) / deploy (push) Successful in 7m49s
Reviewed-on: #219
2026-03-12 14:44:17 +01:00
0c57c4bc6d feat(glossaire): strengthen conceptual and paradigmatic cross-links
All checks were successful
SMOKE / smoke (push) Successful in 5s
CI / build-and-anchors (push) Successful in 37s
CI / build-and-anchors (pull_request) Successful in 41s
2026-03-12 14:39:46 +01:00
9b7998e1c3 Merge pull request 'feat(glossaire): add external paradigms and theoretical landscape' (#218) from feat/glossaire-paradigmes-externes into main
All checks were successful
SMOKE / smoke (push) Successful in 6s
CI / build-and-anchors (push) Successful in 42s
Deploy staging+live (annotations) / deploy (push) Successful in 7m44s
Reviewed-on: #218
2026-03-12 13:57:00 +01:00
8997a00413 feat(glossaire): add external paradigms and theoretical landscape
All checks were successful
SMOKE / smoke (push) Successful in 10s
CI / build-and-anchors (push) Successful in 42s
CI / build-and-anchors (pull_request) Successful in 39s
2026-03-12 13:53:11 +01:00
a2e6f6185f Merge pull request 'fix(glossaire): adjust section anchor offset for sticky header' (#217) from feat/glossaire-paradigmes-externes into main
All checks were successful
SMOKE / smoke (push) Successful in 13s
CI / build-and-anchors (push) Successful in 37s
Deploy staging+live (annotations) / deploy (push) Successful in 9m8s
Reviewed-on: #217
2026-03-12 13:35:39 +01:00
c2715b01d7 fix(glossaire): adjust section anchor offset for sticky header
All checks were successful
SMOKE / smoke (push) Successful in 5s
CI / build-and-anchors (push) Successful in 39s
CI / build-and-anchors (pull_request) Successful in 43s
2026-03-12 13:31:07 +01:00
6f09dfcd12 Merge pull request 'feat(glossaire): extend taxonomy and align Astro 6 content config' (#216) from feat/glossaire-paradigmes into main
All checks were successful
SMOKE / smoke (push) Successful in 12s
CI / build-and-anchors (push) Successful in 42s
Deploy staging+live (annotations) / deploy (push) Successful in 8m58s
Reviewed-on: #216
2026-03-12 12:08:15 +01:00
bb9f55a3b5 feat(glossaire): extend taxonomy and align Astro 6 content config
All checks were successful
SMOKE / smoke (push) Successful in 6s
CI / build-and-anchors (push) Successful in 44s
CI / build-and-anchors (pull_request) Successful in 41s
2026-03-12 12:04:46 +01:00
298ee7492c Merge pull request 'EditionToc Modif' (#215) from chore/astro6-upgrade into main
All checks were successful
SMOKE / smoke (push) Successful in 9s
CI / build-and-anchors (push) Successful in 42s
Deploy staging+live (annotations) / deploy (push) Successful in 7m16s
Reviewed-on: #215
2026-03-11 17:58:17 +01:00
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
19e3318125 Merge pull request 'chore(astro): upgrade to astro 6 with legacy content compatibility' (#214) from chore/astro6-upgrade into main
All checks were successful
SMOKE / smoke (push) Successful in 9s
CI / build-and-anchors (push) Successful in 47s
Deploy staging+live (annotations) / deploy (push) Successful in 9m33s
Reviewed-on: #214
2026-03-11 17:19:04 +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
daf57aa152 feat(glossary): add core glossarial taxonomy and foundational entries
All checks were successful
SMOKE / smoke (push) Successful in 5s
CI / build-and-anchors (push) Successful in 42s
CI / build-and-anchors (pull_request) Successful in 45s
2026-03-11 12:50:17 +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
ea2ad0017b refactor(import): unify core editorial manifest
All checks were successful
SMOKE / smoke (push) Successful in 3s
CI / build-and-anchors (push) Successful in 35s
CI / build-and-anchors (pull_request) Successful in 39s
2026-03-11 11:33:37 +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
315523e80f refactor(site): depublish non-core sections and refresh anchors baseline
All checks were successful
SMOKE / smoke (push) Successful in 6s
CI / build-and-anchors (push) Successful in 41s
CI / build-and-anchors (pull_request) Successful in 40s
2026-03-11 11:07:21 +01:00
569b6de154 fix(content): declare commencer collection and remove implicit ia collection
Some checks failed
SMOKE / smoke (push) Successful in 5s
CI / build-and-anchors (push) Failing after 41s
CI / build-and-anchors (pull_request) Failing after 46s
2026-03-11 10:54:27 +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
32554f5998 refactor(editorial): recentrer le site sur le noyau archicratique
All checks were successful
CI / build-and-anchors (pull_request) Successful in 39s
SMOKE / smoke (push) Successful in 6s
CI / build-and-anchors (push) Successful in 41s
2026-03-10 20:36:33 +01:00
308f4f92bc Merge pull request 'chore: merge main into fix branch' (#205) from fix/annotations-index-fail-open-20260304-223909 into main
All checks were successful
Deploy staging+live (annotations) / deploy (push) Successful in 53s
SMOKE / smoke (push) Successful in 4s
CI / build-and-anchors (push) Successful in 35s
Reviewed-on: #205
2026-03-06 11:18:04 +01:00
4dfd3b026b chore: merge main into fix branch
All checks were successful
SMOKE / smoke (push) Successful in 5s
CI / build-and-anchors (push) Successful in 41s
CI / build-and-anchors (pull_request) Successful in 38s
2026-03-06 11:14:48 +01:00
c93f274f41 Merge pull request 'fix(annotations): fail-open when src/annotations is missing' (#204) from fix/annotations-index-fail-open-20260304-223909 into main
All checks were successful
SMOKE / smoke (push) Successful in 14s
CI / build-and-anchors (push) Successful in 46s
Deploy staging+live (annotations) / deploy (push) Successful in 8m58s
Reviewed-on: #204
2026-03-04 22:42:13 +01:00
dfa311fb5b fix(annotations): fail-open when src/annotations is missing
All checks were successful
SMOKE / smoke (push) Successful in 18s
CI / build-and-anchors (push) Successful in 40s
CI / build-and-anchors (pull_request) Successful in 41s
2026-03-04 22:39:09 +01:00
3ef1dc2801 Merge pull request 'fix(annotations): fail-open when src/annotations missing + keep dir tracked' (#203) from chore/remove-test-anno-media-20260304-204810 into main
All checks were successful
SMOKE / smoke (push) Successful in 13s
CI / build-and-anchors (push) Successful in 44s
Deploy staging+live (annotations) / deploy (push) Successful in 8m47s
Reviewed-on: #203
2026-03-04 21:39:04 +01:00
435e41ed4d fix(annotations): fail-open when src/annotations missing + keep dir tracked
All checks were successful
SMOKE / smoke (push) Successful in 7s
CI / build-and-anchors (push) Successful in 43s
CI / build-and-anchors (pull_request) Successful in 41s
2026-03-04 21:31:53 +01:00
8825932159 Merge pull request 'chore: keep public/media directory (gitkeep)' (#202) from chore/remove-test-anno-media-20260304-204810 into main
All checks were successful
SMOKE / smoke (push) Successful in 10s
Deploy staging+live (annotations) / deploy (push) Successful in 34s
CI / build-and-anchors (push) Successful in 45s
Reviewed-on: #202
2026-03-04 21:06:45 +01:00
b55decbea4 chore: keep public/media directory (gitkeep)
All checks were successful
SMOKE / smoke (push) Successful in 4s
CI / build-and-anchors (push) Successful in 46s
CI / build-and-anchors (pull_request) Successful in 38s
2026-03-04 21:03:55 +01:00
414a848db3 Merge pull request 'chore: keep src/annotations directory (gitkeep)' (#201) from chore/remove-test-anno-media-20260304-204810 into main
All checks were successful
SMOKE / smoke (push) Successful in 5s
Deploy staging+live (annotations) / deploy (push) Successful in 39s
CI / build-and-anchors (push) Successful in 44s
Reviewed-on: #201
2026-03-04 21:03:39 +01:00
cbd4f3a57f chore: keep src/annotations directory (gitkeep)
All checks were successful
SMOKE / smoke (push) Successful in 5s
CI / build-and-anchors (push) Successful in 36s
CI / build-and-anchors (pull_request) Successful in 36s
2026-03-04 21:02:19 +01:00
49f8d6a95e Merge pull request 'chore: remove test annotations and media' (#200) from chore/remove-test-anno-media-20260304-204810 into main
Some checks failed
CI / build-and-anchors (push) Failing after 34s
Deploy staging+live (annotations) / deploy (push) Successful in 47s
SMOKE / smoke (push) Successful in 20s
Reviewed-on: #200
2026-03-04 20:59:21 +01:00
5afa5cbfda chore: remove test annotations and media
Some checks failed
SMOKE / smoke (push) Successful in 3s
CI / build-and-anchors (push) Failing after 32s
CI / build-and-anchors (pull_request) Failing after 34s
2026-03-04 20:48:26 +01:00
a1b1df38ba Merge pull request 'chore: remove test annotations and media' (#196) from chore/remove-test-anno-media-20260304-202811 into main
Some checks failed
Deploy staging+live (annotations) / deploy (push) Failing after 54s
SMOKE / smoke (push) Successful in 4s
CI / build-and-anchors (push) Failing after 33s
CI / build-and-anchors (pull_request) Failing after 30s
Reviewed-on: #196
2026-03-04 20:35:47 +01:00
d3f7d74da7 Merge pull request 'chore: remove test annotations and media' (#197) from chore/remove-test-anno-media-20260304-202451 into main
Some checks are pending
Deploy staging+live (annotations) / deploy (push) Has started running
CI / build-and-anchors (push) Has started running
SMOKE / smoke (push) Successful in 8s
Reviewed-on: #197
2026-03-04 20:35:40 +01:00
6919190107 chore: remove test annotations and media
Some checks failed
SMOKE / smoke (push) Successful in 6s
CI / build-and-anchors (push) Failing after 36s
CI / build-and-anchors (pull_request) Failing after 36s
2026-03-04 20:28:29 +01:00
021ef5abd7 chore: remove test annotations and media
Some checks failed
SMOKE / smoke (push) Successful in 6s
CI / build-and-anchors (push) Failing after 31s
CI / build-and-anchors (pull_request) Failing after 38s
2026-03-04 20:25:03 +01:00
76cdc85f9c Merge pull request 'ci(deploy): treat src/public/package changes as FULL rebuild' (#193) from chore/supprimer-annotations-20260304-191252 into main
Some checks failed
SMOKE / smoke (push) Successful in 16s
CI / build-and-anchors (push) Failing after 35s
Deploy staging+live (annotations) / deploy (push) Successful in 48s
Reviewed-on: #193
2026-03-04 19:22:36 +01:00
f2f6df2127 ci(deploy): treat src/public/package changes as FULL rebuild
Some checks failed
SMOKE / smoke (push) Successful in 4s
CI / build-and-anchors (push) Failing after 36s
CI / build-and-anchors (pull_request) Failing after 37s
2026-03-04 19:13:25 +01:00
dfe13757f7 Merge pull request 'ci(deploy): treat src/public/package changes as FULL rebuild' (#191) from chore/fix-deploy-gate-full-src-public-20260304-181357 into main
All checks were successful
SMOKE / smoke (push) Successful in 8s
CI / build-and-anchors (push) Successful in 37s
Deploy staging+live (annotations) / deploy (push) Successful in 34s
Reviewed-on: #191
2026-03-04 18:16:30 +01:00
148ac997df ci(deploy): treat src/public/package changes as FULL rebuild
All checks were successful
SMOKE / smoke (push) Successful in 2s
CI / build-and-anchors (push) Successful in 40s
CI / build-and-anchors (pull_request) Successful in 32s
2026-03-04 18:14:48 +01:00
84492d2741 Merge pull request 'style(mobile): widen reading in landscape on small screens (css-only)' (#190) from feat/mobile-landscape-reading-YYYYMMDD into main
All checks were successful
SMOKE / smoke (push) Successful in 16s
CI / build-and-anchors (push) Successful in 43s
Deploy staging+live (annotations) / deploy (push) Successful in 34s
Reviewed-on: #190
2026-03-04 17:39:11 +01:00
81baadd57f style(mobile): widen reading in landscape on small screens (css-only)
All checks were successful
SMOKE / smoke (push) Successful in 9s
CI / build-and-anchors (push) Successful in 45s
CI / build-and-anchors (pull_request) Successful in 36s
2026-03-04 17:36:56 +01:00
63d0ffc5fc Merge pull request 'chore: <résumé clair de la modif>' (#189) from chore/xxx-20260303-221031 into main
All checks were successful
SMOKE / smoke (push) Successful in 7s
Deploy staging+live (annotations) / deploy (push) Successful in 29s
CI / build-and-anchors (push) Successful in 39s
Reviewed-on: #189
2026-03-03 22:15:31 +01:00
24143fc2c4 chore: <résumé clair de la modif>
All checks were successful
SMOKE / smoke (push) Successful in 3s
CI / build-and-anchors (push) Successful in 36s
CI / build-and-anchors (pull_request) Successful in 37s
2026-03-03 22:12:01 +01:00
55370b704f Merge pull request 'chore: cleanup testA/testB markers' (#188) from chore/cleanup-testA-testB-20260303-213115 into main
All checks were successful
SMOKE / smoke (push) Successful in 13s
CI / build-and-anchors (push) Successful in 37s
Deploy staging+live (annotations) / deploy (push) Successful in 8m35s
Reviewed-on: #188
2026-03-03 21:38:00 +01:00
b8a3ce1337 chore: cleanup testA/testB markers
All checks were successful
SMOKE / smoke (push) Successful in 5s
CI / build-and-anchors (push) Successful in 43s
CI / build-and-anchors (pull_request) Successful in 40s
2026-03-03 21:36:26 +01:00
7f9baedf41 Merge pull request 'test: B hotpatch-auto gate (touch src/annotations)' (#187) from testB-hotpatch-auto-20260303-211919 into main
All checks were successful
SMOKE / smoke (push) Successful in 10s
Deploy staging+live (annotations) / deploy (push) Successful in 38s
CI / build-and-anchors (push) Successful in 37s
Reviewed-on: #187
2026-03-03 21:22:04 +01:00
1adbe1c7a3 test: B hotpatch-auto gate (touch src/annotations)
All checks were successful
SMOKE / smoke (push) Successful in 3s
CI / build-and-anchors (push) Successful in 37s
CI / build-and-anchors (pull_request) Successful in 37s
2026-03-03 21:20:07 +01:00
107a26352f Merge pull request 'test: A full-auto gate (touch src/content)' (#186) from testA-full-auto-20260303-205324 into main
All checks were successful
SMOKE / smoke (push) Successful in 16s
CI / build-and-anchors (push) Successful in 46s
Deploy staging+live (annotations) / deploy (push) Successful in 7m5s
Reviewed-on: #186
2026-03-03 20:57:09 +01:00
1c2b9ddbb6 test: A full-auto gate (touch src/content)
All checks were successful
SMOKE / smoke (push) Successful in 10s
CI / build-and-anchors (push) Successful in 47s
CI / build-and-anchors (pull_request) Successful in 44s
2026-03-03 20:54:46 +01:00
be99460d4d Merge pull request 'ci(deploy): fix gate bash + robust merge-proof diff + full/hotpatch auto' (#185) from chore/fix-deploy-gate-bash-20260303-204603 into main
All checks were successful
SMOKE / smoke (push) Successful in 13s
CI / build-and-anchors (push) Successful in 40s
Deploy staging+live (annotations) / deploy (push) Successful in 44s
Reviewed-on: #185
2026-03-03 20:48:02 +01:00
9e1b704aa6 ci(deploy): fix gate bash + robust merge-proof diff + full/hotpatch auto
All checks were successful
SMOKE / smoke (push) Successful in 4s
CI / build-and-anchors (push) Successful in 35s
CI / build-and-anchors (pull_request) Successful in 44s
2026-03-03 20:46:03 +01:00
941fbf5845 Merge pull request 'ci(deploy): make gate merge-proof (diff before..after)' (#184) from chore/deploy-gate-mergeproof-20260303-195827 into main
Some checks failed
SMOKE / smoke (push) Successful in 6s
CI / build-and-anchors (push) Successful in 40s
Deploy staging+live (annotations) / deploy (push) Failing after 35s
Reviewed-on: #184
2026-03-03 20:00:37 +01:00
0b4a31a432 ci(deploy): make gate merge-proof (diff before..after)
All checks were successful
SMOKE / smoke (push) Successful in 7s
CI / build-and-anchors (push) Successful in 43s
CI / build-and-anchors (pull_request) Successful in 37s
2026-03-03 19:58:27 +01:00
c617dc3979 Merge pull request 'test: B hotpatch-auto gate (touch src/annotations)' (#183) from testB-hotpatch-auto-20260303-183745 into main
All checks were successful
SMOKE / smoke (push) Successful in 7s
CI / build-and-anchors (push) Successful in 38s
Deploy staging+live (annotations) / deploy (push) Successful in 7m50s
Reviewed-on: #183
2026-03-03 18:40:39 +01:00
1b95161de0 test: B hotpatch-auto gate (touch src/annotations)
All checks were successful
SMOKE / smoke (push) Successful in 7s
CI / build-and-anchors (push) Successful in 42s
CI / build-and-anchors (pull_request) Successful in 41s
2026-03-03 18:38:52 +01:00
ebd976bd46 Merge pull request 'chore: cleanup testA/testB markers' (#182) from chore/cleanup-testA-testB-20260303-175846 into main
All checks were successful
SMOKE / smoke (push) Successful in 11s
CI / build-and-anchors (push) Successful in 42s
Deploy staging+live (annotations) / deploy (push) Successful in 8m55s
Reviewed-on: #182
2026-03-03 18:01:40 +01:00
f8d57d8fe0 chore: cleanup testA/testB markers
All checks were successful
SMOKE / smoke (push) Successful in 6s
CI / build-and-anchors (push) Successful in 41s
CI / build-and-anchors (pull_request) Successful in 38s
2026-03-03 18:00:01 +01:00
09a4d2c472 Merge pull request 'test: B hotpatch-auto gate (touch src/annotations)' (#181) from testB-hotpatch-auto-20260303-174037 into main
All checks were successful
SMOKE / smoke (push) Successful in 9s
CI / build-and-anchors (push) Successful in 41s
Deploy staging+live (annotations) / deploy (push) Successful in 8m0s
Reviewed-on: #181
2026-03-03 17:43:31 +01:00
1f6dc874d0 test: B hotpatch-auto gate (touch src/annotations)
All checks were successful
SMOKE / smoke (push) Successful in 2s
CI / build-and-anchors (push) Successful in 36s
CI / build-and-anchors (pull_request) Successful in 36s
2026-03-03 17:42:04 +01:00
4dd63945ee Merge pull request 'test: A full-auto gate (touch src/content)' (#180) from testA-full-auto-20260303-173032 into main
Some checks failed
SMOKE / smoke (push) Successful in 15s
CI / build-and-anchors (push) Successful in 37s
Deploy staging+live (annotations) / deploy (push) Has been cancelled
Reviewed-on: #180
2026-03-03 17:36:14 +01:00
ba64b0694b test: A full-auto gate (touch src/content)
All checks were successful
SMOKE / smoke (push) Successful in 4s
CI / build-and-anchors (push) Successful in 40s
CI / build-and-anchors (pull_request) Successful in 41s
2026-03-03 17:34:32 +01:00
58e5ceda59 Merge pull request 'ci(deploy): auto FULL when content/anchors/pages/scripts change' (#179) from chore/deploy-gate-full-on-content-anchors-pages-scripts-20260303-171645 into main
All checks were successful
SMOKE / smoke (push) Successful in 15s
CI / build-and-anchors (push) Successful in 40s
Deploy staging+live (annotations) / deploy (push) Successful in 7m35s
Reviewed-on: #179
2026-03-03 17:20:36 +01:00
08f826ee01 ci(deploy): auto FULL when content/anchors/pages/scripts change
All checks were successful
SMOKE / smoke (push) Successful in 6s
CI / build-and-anchors (push) Successful in 46s
CI / build-and-anchors (pull_request) Successful in 42s
2026-03-03 17:16:45 +01:00
3358d280ec Merge pull request 'edit: apply ticket #174 (/archicrat-ia/chapitre-3/#p-1-60c7ea48)' (#178) from chore/migrate-content-archicrat-ia-root-20260303-132407 into main
All checks were successful
SMOKE / smoke (push) Successful in 9s
CI / build-and-anchors (push) Successful in 38s
Deploy staging+live (annotations) / deploy (push) Successful in 48s
Reviewed-on: #178
2026-03-03 15:04:07 +01:00
9cb0d5e416 content: wire archicrat-ia as first-class collection (routes + toc + schema)
All checks were successful
CI / build-and-anchors (push) Successful in 38s
CI / build-and-anchors (pull_request) Successful in 37s
SMOKE / smoke (push) Successful in 5s
2026-03-03 15:02:50 +01:00
a46f058917 edit: apply ticket #174 (/archicrat-ia/chapitre-3/#p-1-60c7ea48)
Some checks failed
SMOKE / smoke (push) Successful in 6s
CI / build-and-anchors (push) Failing after 39s
CI / build-and-anchors (pull_request) Failing after 36s
2026-03-03 14:27:35 +01:00
604b2199da Merge pull request 'ci: fix proposer apply workflow (checkout before APP_DIR detect)' (#177) from chore/fix-proposer-apply-checkout-order-20260303-122611 into main
All checks were successful
SMOKE / smoke (push) Successful in 14s
CI / build-and-anchors (push) Successful in 39s
Deploy staging+live (annotations) / deploy (push) Successful in 1m6s
Reviewed-on: #177
2026-03-03 12:32:34 +01:00
d153f71be6 ci: fix proposer apply workflow (checkout before APP_DIR detect)
All checks were successful
SMOKE / smoke (push) Successful in 5s
CI / build-and-anchors (push) Successful in 41s
CI / build-and-anchors (pull_request) Successful in 39s
2026-03-03 12:26:11 +01:00
8f64e4b098 Merge pull request 'ci: fix proposer workflow (auto APP_DIR + guards)' (#176) from chore/fix-proposer-workflow-appdir-20260303-115843 into main
All checks were successful
SMOKE / smoke (push) Successful in 12s
CI / build-and-anchors (push) Successful in 38s
Deploy staging+live (annotations) / deploy (push) Successful in 1m10s
Reviewed-on: #176
2026-03-03 12:01:18 +01:00
459bf195d8 ci: fix proposer workflow (auto APP_DIR + guards)
All checks were successful
SMOKE / smoke (push) Successful in 7s
CI / build-and-anchors (push) Successful in 40s
CI / build-and-anchors (pull_request) Successful in 42s
2026-03-03 11:58:43 +01:00
0c46b0d19b Merge pull request 'ci: add Proposer Apply workflow (apply-ticket -> PR bot)' (#175) from chore/proposer-apply-workflow-20260302-234255 into main
All checks were successful
SMOKE / smoke (push) Successful in 11s
CI / build-and-anchors (push) Successful in 41s
Deploy staging+live (annotations) / deploy (push) Successful in 48s
Reviewed-on: #175
2026-03-02 23:49:57 +01:00
bfbdc7b688 ci: add Proposer Apply workflow (apply-ticket -> PR bot)
All checks were successful
SMOKE / smoke (push) Successful in 6s
CI / build-and-anchors (push) Successful in 42s
CI / build-and-anchors (pull_request) Successful in 43s
2026-03-02 23:42:55 +01:00
8fd53dd4d2 Merge pull request 'anno: apply ticket #172' (#173) from bot/anno-172-20260302-200155 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 48s
Reviewed-on: #173
2026-03-02 21:03:36 +01:00
archicratie-bot
c8bbee4f74 anno: apply ticket #172 (archicrat-ia/chapitre-3#p-1-60c7ea48 type/reference)
All checks were successful
CI / build-and-anchors (push) Successful in 45s
CI / build-and-anchors (pull_request) Successful in 39s
SMOKE / smoke (push) Successful in 5s
2026-03-02 20:01:55 +00:00
04cdf54eb7 Merge pull request 'anno: apply ticket #169' (#171) from bot/anno-169-20260302-195320 into main
All checks were successful
SMOKE / smoke (push) Successful in 11s
CI / build-and-anchors (push) Successful in 43s
Deploy staging+live (annotations) / deploy (push) Successful in 56s
Reviewed-on: #171
2026-03-02 20:59:08 +01:00
archicratie-bot
d6bf645ae9 anno: apply ticket #169 (archicrat-ia/chapitre-3#p-0-ace27175 type/reference)
All checks were successful
CI / build-and-anchors (push) Successful in 47s
SMOKE / smoke (push) Successful in 4s
CI / build-and-anchors (pull_request) Successful in 42s
2026-03-02 19:53:21 +00:00
1ca6bcbd81 Merge pull request 'ci: make anno apply/reject gates API-hard (approved/rejected label present)' (#170) from chore/fix-anno-apply-approved-gate-v1 into main
All checks were successful
SMOKE / smoke (push) Successful in 13s
Deploy staging+live (annotations) / deploy (push) Successful in 46s
CI / build-and-anchors (push) Successful in 42s
Reviewed-on: #170
2026-03-02 20:17:58 +01:00
dec5f8eba7 ci: make anno apply/reject gates API-hard (approved/rejected label present)
All checks were successful
SMOKE / smoke (push) Successful in 7s
CI / build-and-anchors (push) Successful in 40s
CI / build-and-anchors (pull_request) Successful in 39s
2026-03-02 20:12:29 +01:00
716c887045 Merge pull request 'ci: fix auto-label (no array fallback, retries, post-verify)' (#167) from chore/fix-auto-label-422-v1 into main
All checks were successful
SMOKE / smoke (push) Successful in 9s
CI / build-and-anchors (push) Successful in 39s
Deploy staging+live (annotations) / deploy (push) Successful in 45s
Reviewed-on: #167
2026-03-02 19:37:43 +01:00
9b1789a164 ci: fix auto-label (no array fallback, retries, post-verify)
All checks were successful
SMOKE / smoke (push) Successful in 7s
CI / build-and-anchors (push) Successful in 50s
CI / build-and-anchors (pull_request) Successful in 43s
2026-03-02 19:36:09 +01:00
17fa39c7ff Merge pull request 'ci: hard-gate anno apply/reject + fix JSON parsing' (#164) from chore/fix-anno-workflows-jsonparse-v3 into main
All checks were successful
SMOKE / smoke (push) Successful in 15s
CI / build-and-anchors (push) Successful in 45s
Deploy staging+live (annotations) / deploy (push) Successful in 55s
Reviewed-on: #164
2026-03-02 18:53:19 +01:00
8132e315f4 ci: hard-gate anno apply/reject + fix JSON parsing
All checks were successful
SMOKE / smoke (push) Successful in 10s
CI / build-and-anchors (push) Successful in 49s
CI / build-and-anchors (pull_request) Successful in 43s
2026-03-02 18:48:39 +01:00
8d993915d7 Merge pull request 'ci: stabilize anno apply/reject (event parsing + strict gating)' (#161) from chore/fix-anno-workflows-jsonparse-v2 into main
All checks were successful
SMOKE / smoke (push) Successful in 8s
CI / build-and-anchors (push) Successful in 44s
Deploy staging+live (annotations) / deploy (push) Successful in 1m10s
Reviewed-on: #161
2026-03-02 12:49:18 +01:00
497bddd05d ci: fix anno apply/reject JSON parsing + hard gates
All checks were successful
SMOKE / smoke (push) Successful in 8s
CI / build-and-anchors (push) Successful in 48s
CI / build-and-anchors (pull_request) Successful in 40s
2026-03-02 12:47:37 +01:00
7c8e49c1a9 ci: stabilize anno apply/reject (event parsing + strict gating)
Some checks failed
CI / build-and-anchors (push) Successful in 52s
CI / build-and-anchors (pull_request) Successful in 41s
SMOKE / smoke (push) Failing after 12m55s
2026-03-02 11:10:53 +01:00
901d28b89b Merge pull request 'deploy: pin nas-deploy image by digest' (#159) from chore/pin-nas-deploy-image-digest into main
All checks were successful
SMOKE / smoke (push) Successful in 12s
CI / build-and-anchors (push) Successful in 36s
Deploy staging+live (annotations) / deploy (push) Successful in 45s
Reviewed-on: #159
2026-02-28 20:24:46 +01:00
43e2862c89 deploy: pin nas-deploy image by digest
All checks were successful
SMOKE / smoke (push) Successful in 6s
CI / build-and-anchors (push) Successful in 39s
CI / build-and-anchors (pull_request) Successful in 37s
2026-02-28 20:22:17 +01:00
73fb38c4d1 Merge pull request 'deploy: use prebaked nas-deploy image; remove apt-get step' (#158) from chore/deploy-use-prebaked-image into main
All checks were successful
SMOKE / smoke (push) Successful in 9s
CI / build-and-anchors (push) Successful in 36s
Deploy staging+live (annotations) / deploy (push) Successful in 39s
Reviewed-on: #158
2026-02-28 19:51:27 +01:00
a81d206aba deploy: use prebaked nas-deploy image; remove apt-get step
All checks were successful
SMOKE / smoke (push) Successful in 3s
CI / build-and-anchors (push) Successful in 39s
CI / build-and-anchors (pull_request) Successful in 36s
2026-02-28 19:49:25 +01:00
9801ea3cea Merge pull request 'ci: lock deploy workflow to nas-deploy runner' (#157) from chore/lock-nas-deploy into main
All checks were successful
SMOKE / smoke (push) Successful in 16s
CI / build-and-anchors (push) Successful in 44s
Deploy staging+live (annotations) / deploy (push) Successful in 3m40s
Reviewed-on: #157
2026-02-28 17:45:35 +01:00
c11189fe11 ci: lock deploy workflow to nas-deploy runner
All checks were successful
SMOKE / smoke (push) Successful in 7s
CI / build-and-anchors (push) Successful in 44s
CI / build-and-anchors (pull_request) Successful in 40s
2026-02-28 17:43:19 +01:00
b47edb24cf Merge pull request 'ci: fix YAML newlines after runs-on (mac-ci)' (#156) from chore/fix-yaml-runs-on-newlines into main
Some checks failed
CI / build-and-anchors (push) Successful in 41s
SMOKE / smoke (push) Successful in 3s
Deploy staging+live (annotations) / deploy (push) Has been cancelled
Reviewed-on: #156
2026-02-28 15:54:48 +01:00
be191b09a0 ci: fix YAML newlines after runs-on (mac-ci)
All checks were successful
SMOKE / smoke (push) Successful in 25s
CI / build-and-anchors (push) Successful in 1m6s
CI / build-and-anchors (pull_request) Successful in 37s
2026-02-28 15:50:48 +01:00
e06587478d Merge pull request 'ci: route CI/bots to mac runner; keep deploy on NAS' (#155) from chore/route-ci-to-mac-runner into main
All checks were successful
Deploy staging+live (annotations) / deploy (push) Successful in 1m58s
Reviewed-on: #155
2026-02-28 15:29:35 +01:00
402ffb04cd ci: route CI/bots to mac runner; keep deploy on NAS 2026-02-28 15:28:49 +01:00
1cbfc02670 Merge pull request 'ci: harden anno-reject (dispatch + conflict guard) and keep deploy concurrency safe' (#153) from chore/fix-anno-reject-close-guard into main
All checks were successful
CI / build-and-anchors (push) Successful in 2m49s
Deploy staging+live (annotations) / deploy (push) Successful in 3m7s
SMOKE / smoke (push) Successful in 19s
Reviewed-on: #153
2026-02-28 10:05:26 +01:00
28d2fbbd2f ci: harden anno-reject (dispatch + conflict guard) and keep deploy concurrency safe
All checks were successful
CI / build-and-anchors (push) Successful in 2m21s
SMOKE / smoke (push) Successful in 19s
2026-02-28 09:55:37 +01:00
225368a952 Merge pull request 'ci: anno-apply gate on supported types (skip proposer)' (#149) from chore/fix-anno-apply-gate-types into main
All checks were successful
Deploy staging+live (annotations) / deploy (push) Successful in 2m12s
CI / build-and-anchors (push) Successful in 1m45s
SMOKE / smoke (push) Successful in 17s
Reviewed-on: #149
2026-02-27 20:06:57 +01:00
3574695041 ci: anno-apply gate on supported types (skip proposer)
All checks were successful
CI / build-and-anchors (push) Successful in 1m52s
SMOKE / smoke (push) Successful in 15s
2026-02-27 20:03:16 +01:00
ea68025a1d Merge pull request 'anno: apply ticket #144' (#148) from bot/anno-144-20260227-124313 into main
All checks were successful
CI / build-and-anchors (push) Successful in 2m5s
Deploy staging+live (annotations) / deploy (push) Successful in 2m8s
SMOKE / smoke (push) Successful in 13s
Reviewed-on: #148
2026-02-27 15:49:11 +01:00
3a08698003 Merge pull request 'anno: apply ticket #143' (#147) from bot/anno-143-20260227-124037 into main
Some checks failed
CI / build-and-anchors (push) Has been cancelled
Deploy staging+live (annotations) / deploy (push) Has been cancelled
SMOKE / smoke (push) Has been cancelled
Reviewed-on: #147
2026-02-27 15:48:28 +01:00
3d583608c2 Merge pull request 'anno: apply ticket #142' (#146) from bot/anno-142-20260227-123430 into main
Some checks failed
CI / build-and-anchors (push) Has been cancelled
Deploy staging+live (annotations) / deploy (push) Has been cancelled
SMOKE / smoke (push) Successful in 21s
Reviewed-on: #146
2026-02-27 15:47:44 +01:00
archicratie-bot
01ae95ab43 anno: apply ticket #144 (archicrat-ia/chapitre-3#p-0-ace27175 type/media)
All checks were successful
CI / build-and-anchors (push) Successful in 2m0s
SMOKE / smoke (push) Successful in 18s
2026-02-27 12:43:16 +00:00
archicratie-bot
0d5821c640 anno: apply ticket #143 (archicrat-ia/chapitre-1#p-1-8a6c18bf type/comment)
All checks were successful
CI / build-and-anchors (push) Successful in 1m54s
SMOKE / smoke (push) Successful in 16s
2026-02-27 12:40:39 +00:00
archicratie-bot
2bcea39558 anno: apply ticket #142 (archicrat-ia/chapitre-1#p-0-8d27a7f5 type/reference)
All checks were successful
CI / build-and-anchors (push) Successful in 1m53s
SMOKE / smoke (push) Successful in 14s
2026-02-27 12:34:32 +00:00
af85970d4a Merge pull request 'chore/fix-build-annotations-index-shards' (#141) from chore/fix-build-annotations-index-shards into main
All checks were successful
CI / build-and-anchors (push) Successful in 1m45s
Deploy staging+live (annotations) / deploy (push) Successful in 1m53s
SMOKE / smoke (push) Successful in 13s
Reviewed-on: #141
2026-02-27 13:21:43 +01:00
210f621487 ci: support shard annotations in checks + endpoint (pageKey inference)
All checks were successful
CI / build-and-anchors (push) Successful in 1m58s
SMOKE / smoke (push) Successful in 13s
2026-02-27 13:13:31 +01:00
8ad960dc69 anno: build-annotations-index supports shard annotations
Some checks failed
SMOKE / smoke (push) Successful in 16s
CI / build-and-anchors (push) Failing after 1m48s
2026-02-27 12:27:35 +01:00
d45a8b285f anno: support shard annotations in annotations-index endpoint
Some checks failed
CI / build-and-anchors (push) Failing after 1m45s
SMOKE / smoke (push) Successful in 15s
2026-02-27 12:09:40 +01:00
b6e04a9138 anno: robust verify for para-index (normalize page keys)
Some checks failed
SMOKE / smoke (push) Successful in 33s
CI / build-and-anchors (push) Failing after 1m53s
2026-02-27 10:20:49 +01:00
dcf1fc2d0b anno: apply ticket #127 (archicrat-ia/chapitre-4#p-11-67c14c09 type/media) 2026-02-27 10:17:06 +01:00
41b0517c6c Merge pull request 'ci: deploy hotpatch-only + full rebuild warmup' (#139) from chore/fix-deploy-hotpatch-stable into main
All checks were successful
CI / build-and-anchors (push) Successful in 1m50s
Deploy staging+live (annotations) / deploy (push) Successful in 2m12s
SMOKE / smoke (push) Successful in 19s
Reviewed-on: #139
2026-02-26 22:00:20 +01:00
6b43eb199d ci: deploy hotpatch-only + full rebuild warmup
All checks were successful
CI / build-and-anchors (push) Successful in 1m46s
SMOKE / smoke (push) Successful in 20s
2026-02-26 21:56:42 +01:00
d40f24e92d Merge pull request 'ci: fix hotpatch (yaml datetime -> json safe)' (#138) from chore/fix-hotpatch-json into main
Some checks failed
CI / build-and-anchors (push) Successful in 1m54s
Deploy staging+live (annotations) / deploy (push) Failing after 5m35s
SMOKE / smoke (push) Successful in 16s
Reviewed-on: #138
2026-02-26 21:32:56 +01:00
480a61b071 ci: fix hotpatch (yaml datetime -> json safe)
All checks were successful
CI / build-and-anchors (push) Successful in 1m45s
SMOKE / smoke (push) Successful in 22s
2026-02-26 21:29:52 +01:00
a5d68d6a7e Merge pull request 'ci: fix deploy workflow (warmup + hotpatch)' (#137) from chore/fix-deploy-warmup into main
Some checks failed
CI / build-and-anchors (push) Successful in 1m38s
Deploy staging+live (annotations) / deploy (push) Failing after 8m16s
SMOKE / smoke (push) Successful in 15s
Reviewed-on: #137
2026-02-26 21:09:21 +01:00
390f2c33e5 ci: fix deploy workflow (warmup + hotpatch)
All checks were successful
CI / build-and-anchors (push) Successful in 2m2s
SMOKE / smoke (push) Successful in 17s
2026-02-26 21:06:01 +01:00
16485dc4a9 Merge pull request 'ci: shard annotations by para + deploy deep-merge hotpatch' (#135) from chore/anno-shard-deepmerge into main
Some checks failed
CI / build-and-anchors (push) Successful in 1m54s
Deploy staging+live (annotations) / deploy (push) Failing after 7m20s
SMOKE / smoke (push) Successful in 13s
Reviewed-on: #135
2026-02-26 19:58:22 +01:00
a43ce5f188 ci: shard annotations by para + deploy deep-merge hotpatch
All checks were successful
CI / build-and-anchors (push) Successful in 1m51s
SMOKE / smoke (push) Successful in 29s
2026-02-26 19:54:46 +01:00
0519ae2dd0 Merge pull request 'ci: fix deploy checkout (no eval) + workflow_dispatch fallback' (#134) from chore/fix-deploy-container-conflict into main
All checks were successful
CI / build-and-anchors (push) Successful in 1m52s
Deploy staging+live (annotations) / deploy (push) Successful in 8m48s
SMOKE / smoke (push) Successful in 19s
Reviewed-on: #134
2026-02-26 18:51:53 +01:00
0d5b790e52 ci: fix deploy checkout (no eval) + workflow_dispatch fallback
All checks were successful
CI / build-and-anchors (push) Successful in 1m50s
SMOKE / smoke (push) Successful in 17s
2026-02-26 18:48:12 +01:00
342e21b9ea Merge pull request 'ci: fix deploy checkout (no eval) + workflow_dispatch fallback' (#133) from chore/fix-deploy-checkout-quote into main
Some checks failed
CI / build-and-anchors (push) Successful in 1m40s
Deploy staging+live (annotations) / deploy (push) Failing after 10m11s
SMOKE / smoke (push) Successful in 16s
Reviewed-on: #133
2026-02-26 18:01:24 +01:00
4dec9e182b ci: fix deploy checkout (no eval) + workflow_dispatch fallback
All checks were successful
CI / build-and-anchors (push) Successful in 1m38s
SMOKE / smoke (push) Successful in 18s
2026-02-26 17:58:58 +01:00
c7ae883c6a Merge pull request 'ci: fix deploy workflow (workflow_dispatch checkout + gate)' (#132) from chore/fix-deploy-workflow into main
Some checks failed
CI / build-and-anchors (push) Successful in 1m37s
Deploy staging+live (annotations) / deploy (push) Failing after 19s
SMOKE / smoke (push) Successful in 17s
Reviewed-on: #132
2026-02-26 17:44:28 +01:00
9b4584f70a ci: fix deploy workflow (workflow_dispatch checkout + gate)
All checks were successful
CI / build-and-anchors (push) Successful in 1m53s
SMOKE / smoke (push) Successful in 19s
2026-02-26 17:39:51 +01:00
7b64fb7401 Merge pull request 'anno: apply ticket #129' (#131) from bot/anno-129-20260226-131740 into main
All checks were successful
CI / build-and-anchors (push) Successful in 1m46s
Deploy staging+live (annotations) / deploy (push) Successful in 22s
SMOKE / smoke (push) Successful in 18s
Reviewed-on: #131
2026-02-26 14:23:46 +01:00
archicratie-bot
57cb23ce8b anno: apply ticket #129 (archicrat-ia/chapitre-4#p-11-67c14c09 type/media)
All checks were successful
CI / build-and-anchors (push) Successful in 1m39s
SMOKE / smoke (push) Successful in 18s
2026-02-26 13:17:43 +00:00
708b87ff35 Merge pull request 'ci: deploy staging+live (annotations) with manual force' (#126) from chore/deploy-staging-live into main
All checks were successful
CI / build-and-anchors (push) Successful in 1m47s
Deploy staging+live (annotations) / deploy (push) Successful in 20s
SMOKE / smoke (push) Successful in 19s
Reviewed-on: #126
2026-02-26 12:41:21 +01:00
577cfd08e8 ci: deploy staging+live (annotations) with manual force
All checks were successful
CI / build-and-anchors (push) Successful in 1m51s
SMOKE / smoke (push) Successful in 15s
2026-02-26 12:40:47 +01:00
de9edbe532 Merge pull request 'ci: fix deploy (install docker compose plugin)' (#125) from chore/fix-deploy-compose into main
All checks were successful
CI / build-and-anchors (push) Successful in 1m39s
Deploy staging+live (annotations) / deploy (push) Successful in 31s
SMOKE / smoke (push) Successful in 17s
Reviewed-on: #125
2026-02-26 11:16:19 +01:00
5e95dc9898 ci: fix deploy (install docker compose plugin)
All checks were successful
CI / build-and-anchors (push) Successful in 1m42s
SMOKE / smoke (push) Successful in 23s
2026-02-26 11:15:53 +01:00
006fec7efd Merge pull request 'ci: auto deploy staging+live (annotations-only)' (#124) from chore/deploy-auto into main
Some checks failed
CI / build-and-anchors (push) Successful in 1m48s
Deploy (staging + live) — annotations / deploy (push) Failing after 20s
SMOKE / smoke (push) Successful in 24s
Reviewed-on: #124
2026-02-26 10:29:50 +01:00
2b612214bb ci: auto deploy staging+live (annotations-only)
All checks were successful
CI / build-and-anchors (push) Successful in 1m55s
SMOKE / smoke (push) Successful in 18s
2026-02-26 10:29:17 +01:00
29a6c349aa Merge pull request 'anno: apply ticket #121' (#122) from bot/anno-121-20260225-191130 into main
All checks were successful
CI / build-and-anchors (push) Successful in 2m18s
SMOKE / smoke (push) Successful in 19s
Reviewed-on: #122
2026-02-26 09:01:52 +01:00
archicratie-bot
33a227c401 anno: apply ticket #121 (archicrat-ia/chapitre-4#p-7-1da4a458 type/media)
All checks were successful
CI / build-and-anchors (push) Successful in 1m46s
SMOKE / smoke (push) Successful in 21s
2026-02-25 19:11:36 +00:00
396ad4df7c Merge pull request 'anno: apply ticket #115' (#120) from bot/anno-115-20260225-185830 into main
All checks were successful
CI / build-and-anchors (push) Successful in 1m45s
SMOKE / smoke (push) Successful in 15s
Reviewed-on: #120
2026-02-25 20:00:04 +01:00
archicratie-bot
0b39427090 anno: apply ticket #115 (archicrat-ia/chapitre-4#p-2-31b12529 type/media)
All checks were successful
CI / build-and-anchors (push) Successful in 1m42s
SMOKE / smoke (push) Successful in 15s
2026-02-25 18:58:34 +00:00
8fcb18cb46 Merge pull request 'ci: anno apply workflow builds dist for strict verify' (#119) from chore/fix-anno-verify-build2 into main
All checks were successful
CI / build-and-anchors (push) Successful in 1m49s
SMOKE / smoke (push) Successful in 20s
Reviewed-on: #119
2026-02-25 19:51:24 +01:00
d03fc519de ci: anno apply workflow builds dist for strict verify
All checks were successful
CI / build-and-anchors (push) Successful in 1m50s
SMOKE / smoke (push) Successful in 19s
2026-02-25 19:50:47 +01:00
97dd3797d6 Merge pull request 'ci: anno apply workflow builds dist for strict verify' (#118) from chore/fix-anno-verify-build into main
All checks were successful
CI / build-and-anchors (push) Successful in 1m35s
SMOKE / smoke (push) Successful in 20s
Reviewed-on: #118
2026-02-25 19:31:45 +01:00
6c7b7ab6a0 ci: anno apply workflow builds dist for strict verify
All checks were successful
CI / build-and-anchors (push) Successful in 1m59s
SMOKE / smoke (push) Successful in 23s
2026-02-25 19:29:36 +01:00
105dfe1b5b Merge pull request 'ci: add apply-annotation-ticket script for anno bot' (#117) from chore/add-apply-annotation-ticket into main
All checks were successful
CI / build-and-anchors (push) Successful in 1m47s
SMOKE / smoke (push) Successful in 20s
Reviewed-on: #117
2026-02-25 19:02:33 +01:00
82f6453538 ci: add apply-annotation-ticket script for anno bot
All checks were successful
CI / build-and-anchors (push) Successful in 1m43s
SMOKE / smoke (push) Successful in 17s
2026-02-25 19:02:03 +01:00
fe862102d3 Merge pull request 'ci: fix anno apply/reject workflows (yaml valid)' (#116) from chore/fix-anno-workflows into main
All checks were successful
CI / build-and-anchors (push) Successful in 1m49s
SMOKE / smoke (push) Successful in 17s
Reviewed-on: #116
2026-02-25 18:28:36 +01:00
6ef538a0c4 ci: fix anno apply/reject workflows (yaml valid)
All checks were successful
CI / build-and-anchors (push) Successful in 1m36s
SMOKE / smoke (push) Successful in 20s
2026-02-25 18:26:03 +01:00
689612ff7f Merge pull request 'anno-workflows' (#114) from chore/anno-workflows into main
All checks were successful
CI / build-and-anchors (push) Successful in 1m52s
SMOKE / smoke (push) Successful in 18s
Reviewed-on: #114
2026-02-25 17:51:16 +01:00
7b135a4707 ci: add anno apply bot workflow
All checks were successful
CI / build-and-anchors (push) Successful in 2m0s
SMOKE / smoke (push) Successful in 16s
2026-02-25 17:50:45 +01:00
0cb8a54195 Merge pull request 'fix: remove specimen media from prologue annotations' (#108) from chore/Fix_whoami into main
Some checks failed
CI / build-and-anchors (push) Has started running
SMOKE / smoke (push) Has been cancelled
Reviewed-on: #108
2026-02-23 12:37:39 +01:00
a7a333397d fix: remove specimen media from prologue annotations
All checks were successful
CI / build-and-anchors (push) Successful in 1m36s
SMOKE / smoke (push) Successful in 15s
2026-02-23 12:33:55 +01:00
eb1d444776 Merge pull request 'fix: …' (#107) from chore/Fix_whoami into main
Some checks failed
CI / build-and-anchors (push) Failing after 1m45s
SMOKE / smoke (push) Successful in 15s
Reviewed-on: #107
2026-02-23 12:17:21 +01:00
68c3416594 fix: …
Some checks failed
CI / build-and-anchors (push) Failing after 2m6s
SMOKE / smoke (push) Successful in 13s
2026-02-23 12:07:01 +01:00
ae809e0152 Merge pull request 'docs: add pro runbooks (deploy/edge/public_site) + annotations spec + start-here v2' (#106) from fix/canonical-public-site into main
All checks were successful
CI / build-and-anchors (push) Successful in 1m25s
SMOKE / smoke (push) Successful in 13s
Reviewed-on: #106
2026-02-21 15:36:07 +01:00
9bbebf5886 Merge pull request 'fix(seo): enforce PUBLIC_SITE at docker build (canonical/sitemap) + set per blue/green' (#105) from fix/canonical-public-site into main
All checks were successful
CI / build-and-anchors (push) Successful in 1m55s
SMOKE / smoke (push) Successful in 23s
Reviewed-on: #105
2026-02-21 12:32:08 +01:00
249 changed files with 32616 additions and 3587 deletions

View File

@@ -3,7 +3,7 @@ name: "Correction paragraphe"
about: "Proposer une correction ciblée (un paragraphe) avec justification."
---
## Chemin (ex: /archicratie/prologue/)
## Chemin (ex: /archicrat-ia/prologue/)
<!-- obligatoire -->
/...

View File

@@ -3,7 +3,7 @@ name: "Vérification factuelle / sources"
about: "Signaler une assertion à sourcer ou à corriger (preuves, références)."
---
## Chemin (ex: /archicratie/prologue/)
## Chemin (ex: /archicrat-ia/prologue/)
<!-- obligatoire -->
/...

View File

@@ -0,0 +1,450 @@
name: Anno Apply (PR)
on:
issues:
types: [labeled]
workflow_dispatch:
inputs:
issue:
description: "Issue number to apply"
required: true
env:
NODE_OPTIONS: --dns-result-order=ipv4first
defaults:
run:
shell: bash
concurrency:
group: anno-apply-${{ github.event.issue.number || github.event.issue.index || inputs.issue || 'manual' }}
cancel-in-progress: true
jobs:
apply-approved:
runs-on: mac-ci
container:
image: mcr.microsoft.com/devcontainers/javascript-node:22-bookworm
steps:
- name: Tools sanity
run: |
set -euo pipefail
git --version
node --version
npm --version
- name: Derive context (event.json / workflow_dispatch)
env:
INPUT_ISSUE: ${{ inputs.issue }}
FORGE_API: ${{ vars.FORGE_API || vars.FORGE_BASE || vars.FORGE_BASE_URL }}
run: |
set -euo pipefail
export EVENT_JSON="/var/run/act/workflow/event.json"
test -f "$EVENT_JSON" || { echo "Missing $EVENT_JSON"; exit 1; }
node --input-type=module - <<'NODE' > /tmp/anno.env
import fs from "node:fs";
const ev = JSON.parse(fs.readFileSync(process.env.EVENT_JSON, "utf8"));
const repoObj = ev?.repository || {};
const cloneUrl =
repoObj?.clone_url ||
(repoObj?.html_url ? (repoObj.html_url.replace(/\/$/,"") + ".git") : "");
if (!cloneUrl) throw new Error("No repository clone_url/html_url in event.json");
let owner =
repoObj?.owner?.login ||
repoObj?.owner?.username ||
(repoObj?.full_name ? repoObj.full_name.split("/")[0] : "");
let repo =
repoObj?.name ||
(repoObj?.full_name ? repoObj.full_name.split("/")[1] : "");
if (!owner || !repo) {
const m = cloneUrl.match(/[:/](?<o>[^/]+)\/(?<r>[^/]+?)(?:\.git)?$/);
if (m?.groups) {
owner = owner || m.groups.o;
repo = repo || m.groups.r;
}
}
if (!owner || !repo) throw new Error("Cannot infer owner/repo");
const defaultBranch = repoObj?.default_branch || "main";
const issueNumber =
ev?.issue?.number ||
ev?.issue?.index ||
(process.env.INPUT_ISSUE ? Number(process.env.INPUT_ISSUE) : 0);
if (!issueNumber || !Number.isFinite(Number(issueNumber))) {
throw new Error("No issue number in event.json or workflow_dispatch input");
}
let labelName = "workflow_dispatch";
const lab = ev?.label;
if (typeof lab === "string") labelName = lab;
else if (lab && typeof lab === "object" && typeof lab.name === "string") labelName = lab.name;
else if (ev?.label?.name) labelName = ev.label.name;
const u = new URL(cloneUrl);
const origin = u.origin;
const apiBase = (process.env.FORGE_API && String(process.env.FORGE_API).trim())
? String(process.env.FORGE_API).trim().replace(/\/+$/,"")
: origin;
function sh(s) { return JSON.stringify(String(s)); }
process.stdout.write([
`CLONE_URL=${sh(cloneUrl)}`,
`OWNER=${sh(owner)}`,
`REPO=${sh(repo)}`,
`DEFAULT_BRANCH=${sh(defaultBranch)}`,
`ISSUE_NUMBER=${sh(issueNumber)}`,
`LABEL_NAME=${sh(labelName)}`,
`API_BASE=${sh(apiBase)}`
].join("\n") + "\n");
NODE
echo "context:"
sed -n '1,120p' /tmp/anno.env
- name: Early gate (label event fast-skip, but tolerant)
run: |
set -euo pipefail
source /tmp/anno.env
echo "event label = $LABEL_NAME"
if [[ "$LABEL_NAME" != "state/approved" && "$LABEL_NAME" != "workflow_dispatch" && "$LABEL_NAME" != "" && "$LABEL_NAME" != "[object Object]" ]]; then
echo "label=$LABEL_NAME => skip early"
echo "SKIP=1" >> /tmp/anno.env
echo "SKIP_REASON=\"label_not_approved_event\"" >> /tmp/anno.env
exit 0
fi
echo "continue to API gating (issue=$ISSUE_NUMBER)"
- name: Fetch issue + hard gate on labels + Type
env:
FORGE_TOKEN: ${{ secrets.FORGE_TOKEN }}
run: |
set -euo pipefail
source /tmp/anno.env
[[ "${SKIP:-0}" != "1" ]] || { echo "skipped"; exit 0; }
test -n "${FORGE_TOKEN:-}" || { echo "Missing secret FORGE_TOKEN"; exit 1; }
curl -fsS \
-H "Authorization: token $FORGE_TOKEN" \
-H "Accept: application/json" \
"$API_BASE/api/v1/repos/$OWNER/$REPO/issues/$ISSUE_NUMBER" \
-o /tmp/issue.json
node --input-type=module - <<'NODE' >> /tmp/anno.env
import fs from "node:fs";
const issue = JSON.parse(fs.readFileSync("/tmp/issue.json", "utf8"));
const body = String(issue.body || "").replace(/\r\n/g, "\n");
const labels = Array.isArray(issue.labels)
? issue.labels.map(l => String(l.name || "")).filter(Boolean)
: [];
const hasApproved = labels.includes("state/approved");
function pickLine(key) {
const re = new RegExp(`^\\s*${key}\\s*:\\s*([^\\n\\r]+)`, "mi");
const m = body.match(re);
return m ? m[1].trim() : "";
}
const typeRaw = pickLine("Type");
const type = String(typeRaw || "").trim().toLowerCase();
const allowedAnno = new Set(["type/media", "type/reference", "type/comment"]);
const proposerTypes = new Set(["type/correction", "type/fact-check"]);
const out = [];
out.push(`ISSUE_TYPE=${JSON.stringify(type)}`);
if (!hasApproved) {
out.push(`SKIP=1`);
out.push(`SKIP_REASON=${JSON.stringify("not_approved_label_present")}`);
process.stdout.write(out.join("\n") + "\n");
process.exit(0);
}
if (!type) {
out.push(`SKIP=1`);
out.push(`SKIP_REASON=${JSON.stringify("missing_type")}`);
} else if (allowedAnno.has(type)) {
// proceed
} else if (proposerTypes.has(type)) {
out.push(`SKIP=1`);
out.push(`SKIP_REASON=${JSON.stringify("proposer_type:" + type)}`);
} else {
out.push(`SKIP=1`);
out.push(`SKIP_REASON=${JSON.stringify("unsupported_type:" + type)}`);
}
process.stdout.write(out.join("\n") + "\n");
NODE
echo "gating result:"
grep -E '^(ISSUE_TYPE|SKIP|SKIP_REASON)=' /tmp/anno.env || true
- name: Comment issue if skipped (unsupported / missing Type only)
if: ${{ always() }}
env:
FORGE_TOKEN: ${{ secrets.FORGE_TOKEN }}
run: |
set -euo pipefail
source /tmp/anno.env || true
[[ "${SKIP:-0}" == "1" ]] || exit 0
if [[ "${SKIP_REASON:-}" == "not_approved_label_present" || "${SKIP_REASON:-}" == "label_not_approved_event" ]]; then
echo "skip reason=${SKIP_REASON} -> no comment"
exit 0
fi
if [[ "${SKIP_REASON:-}" == proposer_type:* ]]; then
echo "proposer ticket detected -> anno stays silent"
exit 0
fi
test -n "${FORGE_TOKEN:-}" || exit 0
REASON="${SKIP_REASON:-}"
TYPE="${ISSUE_TYPE:-}"
if [[ "$REASON" == unsupported_type:* ]]; then
MSG="Ticket #${ISSUE_NUMBER} ignored: unsupported Type (${TYPE}). Supported types: type/media, type/reference, type/comment."
else
MSG="Ticket #${ISSUE_NUMBER} ignored: missing or unreadable 'Type:'. Expected: type/media|type/reference|type/comment"
fi
PAYLOAD="$(node --input-type=module -e 'console.log(JSON.stringify({body: process.argv[1] || ""}))' "$MSG")"
curl -fsS -X POST \
-H "Authorization: token $FORGE_TOKEN" \
-H "Content-Type: application/json" \
"$API_BASE/api/v1/repos/$OWNER/$REPO/issues/$ISSUE_NUMBER/comments" \
--data-binary "$PAYLOAD"
- name: Checkout default branch
run: |
set -euo pipefail
source /tmp/anno.env
[[ "${SKIP:-0}" != "1" ]] || { echo "skipped"; exit 0; }
rm -rf .git
git init -q
git remote add origin "$CLONE_URL"
git fetch --depth 1 origin "$DEFAULT_BRANCH"
git -c advice.detachedHead=false checkout -q FETCH_HEAD
git log -1 --oneline
- name: Install deps
run: |
set -euo pipefail
source /tmp/anno.env
[[ "${SKIP:-0}" != "1" ]] || { echo "skipped"; exit 0; }
npm ci --no-audit --no-fund
- name: Check apply script exists
run: |
set -euo pipefail
source /tmp/anno.env
[[ "${SKIP:-0}" != "1" ]] || { echo "skipped"; exit 0; }
test -f scripts/apply-annotation-ticket.mjs || {
echo "missing scripts/apply-annotation-ticket.mjs on $DEFAULT_BRANCH"
ls -la scripts | sed -n '1,200p' || true
exit 1
}
- name: Build dist (needed for --verify)
run: |
set -euo pipefail
source /tmp/anno.env
[[ "${SKIP:-0}" != "1" ]] || { echo "skipped"; exit 0; }
npm run build
test -f dist/para-index.json || {
echo "missing dist/para-index.json after build"
ls -la dist | sed -n '1,200p' || true
exit 1
}
echo "dist/para-index.json present"
- name: Apply ticket on bot branch (strict+verify, commit)
continue-on-error: true
env:
FORGE_TOKEN: ${{ secrets.FORGE_TOKEN }}
BOT_GIT_NAME: ${{ secrets.BOT_GIT_NAME }}
BOT_GIT_EMAIL: ${{ secrets.BOT_GIT_EMAIL }}
run: |
set -euo pipefail
source /tmp/anno.env
[[ "${SKIP:-0}" != "1" ]] || { echo "skipped"; exit 0; }
test -d .git || { echo "not a git repo (checkout failed)"; echo "APPLY_RC=90" >> /tmp/anno.env; exit 0; }
test -n "${FORGE_TOKEN:-}" || { echo "Missing secret FORGE_TOKEN"; exit 1; }
git config user.name "${BOT_GIT_NAME:-archicratie-bot}"
git config user.email "${BOT_GIT_EMAIL:-bot@archicratie.local}"
START_SHA="$(git rev-parse HEAD)"
TS="$(date -u +%Y%m%d-%H%M%S)"
BR="bot/anno-${ISSUE_NUMBER}-${TS}"
echo "BRANCH=$BR" >> /tmp/anno.env
git checkout -b "$BR"
export FORGE_API="$API_BASE"
export GITEA_OWNER="$OWNER"
export GITEA_REPO="$REPO"
LOG="/tmp/apply.log"
set +e
node scripts/apply-annotation-ticket.mjs "$ISSUE_NUMBER" --strict --verify --commit >"$LOG" 2>&1
RC=$?
set -e
echo "APPLY_RC=$RC" >> /tmp/anno.env
echo "== apply log (tail) =="
tail -n 180 "$LOG" || true
END_SHA="$(git rev-parse HEAD)"
if [[ "$RC" -ne 0 ]]; then
echo "NOOP=0" >> /tmp/anno.env
exit 0
fi
if [[ "$START_SHA" == "$END_SHA" ]]; then
echo "NOOP=1" >> /tmp/anno.env
else
echo "NOOP=0" >> /tmp/anno.env
echo "END_SHA=$END_SHA" >> /tmp/anno.env
fi
- name: Comment issue on failure (strict/verify/etc)
if: ${{ always() }}
env:
FORGE_TOKEN: ${{ secrets.FORGE_TOKEN }}
run: |
set -euo pipefail
source /tmp/anno.env || true
[[ "${SKIP:-0}" != "1" ]] || { echo "skipped"; exit 0; }
RC="${APPLY_RC:-0}"
if [[ "$RC" == "0" ]]; then
echo "no failure detected"
exit 0
fi
test -n "${FORGE_TOKEN:-}" || exit 0
if [[ -f /tmp/apply.log ]]; then
BODY="$(tail -n 160 /tmp/apply.log | sed 's/\r$//')"
else
BODY="(no apply log found)"
fi
MSG="apply-annotation-ticket failed (rc=${RC}).\n\n\`\`\`\n${BODY}\n\`\`\`\n"
PAYLOAD="$(node --input-type=module -e 'console.log(JSON.stringify({body: process.argv[1] || ""}))' "$MSG")"
curl -fsS -X POST \
-H "Authorization: token $FORGE_TOKEN" \
-H "Content-Type: application/json" \
"$API_BASE/api/v1/repos/$OWNER/$REPO/issues/$ISSUE_NUMBER/comments" \
--data-binary "$PAYLOAD"
- name: Push bot branch
if: ${{ always() }}
env:
FORGE_TOKEN: ${{ secrets.FORGE_TOKEN }}
run: |
set -euo pipefail
source /tmp/anno.env || true
[[ "${SKIP:-0}" != "1" ]] || exit 0
[[ "${APPLY_RC:-0}" == "0" ]] || { echo "apply failed -> skip push"; exit 0; }
[[ "${NOOP:-0}" == "0" ]] || { echo "no-op -> skip push"; exit 0; }
test -d .git || { echo "no git repo -> skip push"; exit 0; }
AUTH_URL="$(node --input-type=module -e '
const [clone, tok] = process.argv.slice(1);
const u = new URL(clone);
u.username = "oauth2";
u.password = tok;
console.log(u.toString());
' "$CLONE_URL" "$FORGE_TOKEN")"
git remote set-url origin "$AUTH_URL"
git push -u origin "$BRANCH"
- name: Create PR + comment issue
if: ${{ always() }}
env:
FORGE_TOKEN: ${{ secrets.FORGE_TOKEN }}
run: |
set -euo pipefail
source /tmp/anno.env || true
[[ "${SKIP:-0}" != "1" ]] || exit 0
[[ "${APPLY_RC:-0}" == "0" ]] || { echo "apply failed -> skip PR"; exit 0; }
[[ "${NOOP:-0}" == "0" ]] || { echo "no-op -> skip PR"; exit 0; }
PR_TITLE="anno: apply ticket #${ISSUE_NUMBER}"
PR_BODY="PR auto depuis ticket #${ISSUE_NUMBER} (state/approved).\n\n- Branche: ${BRANCH}\n- Commit: ${END_SHA}\n\nMerge si CI OK."
PR_PAYLOAD="$(node --input-type=module -e '
const [title, body, base, head] = process.argv.slice(1);
console.log(JSON.stringify({ title, body, base, head, allow_maintainer_edit: true }));
' "$PR_TITLE" "$PR_BODY" "$DEFAULT_BRANCH" "${OWNER}:${BRANCH}")"
PR_JSON="$(curl -fsS -X POST \
-H "Authorization: token $FORGE_TOKEN" \
-H "Content-Type: application/json" \
"$API_BASE/api/v1/repos/$OWNER/$REPO/pulls" \
--data-binary "$PR_PAYLOAD")"
PR_URL="$(node --input-type=module -e '
const pr = JSON.parse(process.argv[1] || "{}");
console.log(pr.html_url || pr.url || "");
' "$PR_JSON")"
test -n "$PR_URL" || { echo "PR URL missing. Raw: $PR_JSON"; exit 1; }
MSG="PR created for ticket #${ISSUE_NUMBER}: ${PR_URL}"
C_PAYLOAD="$(node --input-type=module -e 'console.log(JSON.stringify({body: process.argv[1] || ""}))' "$MSG")"
curl -fsS -X POST \
-H "Authorization: token $FORGE_TOKEN" \
-H "Content-Type: application/json" \
"$API_BASE/api/v1/repos/$OWNER/$REPO/issues/$ISSUE_NUMBER/comments" \
--data-binary "$C_PAYLOAD"
echo "PR: $PR_URL"
- name: Finalize (fail job if apply failed)
if: ${{ always() }}
run: |
set -euo pipefail
source /tmp/anno.env || true
[[ "${SKIP:-0}" != "1" ]] || { echo "skipped"; exit 0; }
RC="${APPLY_RC:-0}"
if [[ "$RC" != "0" ]]; then
echo "apply failed (rc=$RC)"
exit "$RC"
fi
echo "apply ok"

View File

@@ -0,0 +1,181 @@
name: Anno Reject (close issue)
on:
issues:
types: [labeled]
workflow_dispatch:
inputs:
issue:
description: "Issue number to reject/close"
required: true
env:
NODE_OPTIONS: --dns-result-order=ipv4first
defaults:
run:
shell: bash
concurrency:
group: anno-reject-${{ github.event.issue.number || github.event.issue.index || inputs.issue || 'manual' }}
cancel-in-progress: true
jobs:
reject:
runs-on: mac-ci
container:
image: mcr.microsoft.com/devcontainers/javascript-node:22-bookworm
steps:
- name: Tools sanity
run: |
set -euo pipefail
node --version
- name: Derive context (event.json / workflow_dispatch)
env:
INPUT_ISSUE: ${{ inputs.issue }}
FORGE_API: ${{ vars.FORGE_API || vars.FORGE_BASE || vars.FORGE_BASE_URL }}
run: |
set -euo pipefail
export EVENT_JSON="/var/run/act/workflow/event.json"
test -f "$EVENT_JSON" || { echo "❌ Missing $EVENT_JSON"; exit 1; }
node --input-type=module - <<'NODE' > /tmp/reject.env
import fs from "node:fs";
const ev = JSON.parse(fs.readFileSync(process.env.EVENT_JSON, "utf8"));
const repoObj = ev?.repository || {};
const cloneUrl =
repoObj?.clone_url ||
(repoObj?.html_url ? (repoObj.html_url.replace(/\/$/,"") + ".git") : "");
let owner =
repoObj?.owner?.login ||
repoObj?.owner?.username ||
(repoObj?.full_name ? repoObj.full_name.split("/")[0] : "");
let repo =
repoObj?.name ||
(repoObj?.full_name ? repoObj.full_name.split("/")[1] : "");
if ((!owner || !repo) && cloneUrl) {
const m = cloneUrl.match(/[:/](?<o>[^/]+)\/(?<r>[^/]+?)(?:\.git)?$/);
if (m?.groups) { owner = owner || m.groups.o; repo = repo || m.groups.r; }
}
if (!owner || !repo) throw new Error("Cannot infer owner/repo");
const issueNumber =
ev?.issue?.number ||
ev?.issue?.index ||
(process.env.INPUT_ISSUE ? Number(process.env.INPUT_ISSUE) : 0);
if (!issueNumber || !Number.isFinite(Number(issueNumber))) {
throw new Error("No issue number in event.json or workflow_dispatch input");
}
// label name: best-effort (non-bloquant)
let labelName = "workflow_dispatch";
const lab = ev?.label;
if (typeof lab === "string") labelName = lab;
else if (lab && typeof lab === "object" && typeof lab.name === "string") labelName = lab.name;
let apiBase = "";
if (process.env.FORGE_API && String(process.env.FORGE_API).trim()) {
apiBase = String(process.env.FORGE_API).trim().replace(/\/+$/,"");
} else if (cloneUrl) {
apiBase = new URL(cloneUrl).origin;
} else {
apiBase = "";
}
function sh(s){ return JSON.stringify(String(s)); }
process.stdout.write([
`OWNER=${sh(owner)}`,
`REPO=${sh(repo)}`,
`ISSUE_NUMBER=${sh(issueNumber)}`,
`LABEL_NAME=${sh(labelName)}`,
`API_BASE=${sh(apiBase)}`
].join("\n") + "\n");
NODE
echo "✅ context:"
sed -n '1,120p' /tmp/reject.env
- name: Early gate (fast-skip, tolerant)
run: |
set -euo pipefail
source /tmp/reject.env
echo " event label = $LABEL_NAME"
if [[ "$LABEL_NAME" != "state/rejected" && "$LABEL_NAME" != "workflow_dispatch" && "$LABEL_NAME" != "" && "$LABEL_NAME" != "[object Object]" ]]; then
echo " label=$LABEL_NAME => skip early"
echo "SKIP=1" >> /tmp/reject.env
echo "SKIP_REASON=\"label_not_rejected_event\"" >> /tmp/reject.env
exit 0
fi
- name: Comment + close (only if label state/rejected is PRESENT now, and no conflict)
env:
FORGE_TOKEN: ${{ secrets.FORGE_TOKEN }}
run: |
set -euo pipefail
source /tmp/reject.env
[[ "${SKIP:-0}" != "1" ]] || { echo " skipped"; exit 0; }
test -n "${FORGE_TOKEN:-}" || { echo "❌ Missing secret FORGE_TOKEN"; exit 1; }
test -n "${API_BASE:-}" || { echo "❌ Missing API_BASE"; exit 1; }
curl -fsS \
-H "Authorization: token $FORGE_TOKEN" \
-H "Accept: application/json" \
"$API_BASE/api/v1/repos/$OWNER/$REPO/issues/$ISSUE_NUMBER" \
-o /tmp/reject.issue.json
node --input-type=module - <<'NODE' > /tmp/reject.flags
import fs from "node:fs";
const issue = JSON.parse(fs.readFileSync("/tmp/reject.issue.json","utf8"));
const labels = Array.isArray(issue.labels) ? issue.labels.map(l => String(l.name || "")).filter(Boolean) : [];
const hasApproved = labels.includes("state/approved");
const hasRejected = labels.includes("state/rejected");
process.stdout.write(`HAS_APPROVED=${hasApproved ? "1":"0"}\nHAS_REJECTED=${hasRejected ? "1":"0"}\n`);
NODE
source /tmp/reject.flags
# Do nothing unless state/rejected is truly present now (anti payload weird)
if [[ "${HAS_REJECTED:-0}" != "1" ]]; then
echo " state/rejected not present -> skip"
exit 0
fi
if [[ "${HAS_APPROVED:-0}" == "1" && "${HAS_REJECTED:-0}" == "1" ]]; then
MSG="⚠️ Conflit d'état sur le ticket #${ISSUE_NUMBER} : labels **state/approved** et **state/rejected** présents.\n\n➡ Action manuelle requise : retirer l'un des deux labels avant relance."
PAYLOAD="$(node --input-type=module -e 'console.log(JSON.stringify({body: process.argv[1]||""}))' "$MSG")"
curl -fsS -X POST \
-H "Authorization: token $FORGE_TOKEN" \
-H "Content-Type: application/json" \
"$API_BASE/api/v1/repos/$OWNER/$REPO/issues/$ISSUE_NUMBER/comments" \
--data-binary "$PAYLOAD"
echo " conflict => stop"
exit 0
fi
MSG="❌ Ticket #${ISSUE_NUMBER} refusé (label state/rejected)."
PAYLOAD="$(node --input-type=module -e 'console.log(JSON.stringify({body: process.argv[1]||""}))' "$MSG")"
curl -fsS -X POST \
-H "Authorization: token $FORGE_TOKEN" \
-H "Content-Type: application/json" \
"$API_BASE/api/v1/repos/$OWNER/$REPO/issues/$ISSUE_NUMBER/comments" \
--data-binary "$PAYLOAD"
curl -fsS -X PATCH \
-H "Authorization: token $FORGE_TOKEN" \
-H "Content-Type: application/json" \
"$API_BASE/api/v1/repos/$OWNER/$REPO/issues/$ISSUE_NUMBER" \
--data-binary '{"state":"closed"}'
echo "✅ rejected+closed"

View File

@@ -4,22 +4,37 @@ on:
issues:
types: [opened, edited]
concurrency:
group: auto-label-${{ github.event.issue.number || github.event.issue.index || 'manual' }}
cancel-in-progress: true
jobs:
label:
runs-on: ubuntu-latest
runs-on: mac-ci
container:
image: mcr.microsoft.com/devcontainers/javascript-node:22-bookworm
steps:
- name: Apply labels from Type/State/Category
env:
FORGE_BASE: ${{ vars.FORGE_API || vars.FORGE_BASE }}
# IMPORTANT: préfère FORGE_BASE (LAN) si défini, sinon FORGE_API
FORGE_BASE: ${{ vars.FORGE_BASE || vars.FORGE_API || vars.FORGE_API_BASE }}
FORGE_TOKEN: ${{ secrets.FORGE_TOKEN }}
REPO_FULL: ${{ gitea.repository }}
EVENT_PATH: ${{ github.event_path }}
NODE_OPTIONS: --dns-result-order=ipv4first
run: |
python3 - <<'PY'
import json, os, re, urllib.request, urllib.error
import json, os, re, time, urllib.request, urllib.error, socket
forge = (os.environ.get("FORGE_BASE") or "").rstrip("/")
if not forge:
raise SystemExit("Missing FORGE_BASE/FORGE_API repo variable (e.g. http://192.168.1.20:3000)")
token = os.environ.get("FORGE_TOKEN") or ""
if not token:
raise SystemExit("Missing secret FORGE_TOKEN")
forge = os.environ["FORGE_BASE"].rstrip("/")
token = os.environ["FORGE_TOKEN"]
owner, repo = os.environ["REPO_FULL"].split("/", 1)
event_path = os.environ["EVENT_PATH"]
@@ -46,12 +61,9 @@ jobs:
print("PARSED:", {"Type": t, "State": s, "Category": c})
# 1) explicite depuis le body
if t:
desired.add(t)
if s:
desired.add(s)
if c:
desired.add(c)
if t: desired.add(t)
if s: desired.add(s)
if c: desired.add(c)
# 2) fallback depuis le titre si Type absent
if not t:
@@ -76,42 +88,56 @@ jobs:
"Authorization": f"token {token}",
"Accept": "application/json",
"Content-Type": "application/json",
"User-Agent": "archicratie-auto-label/1.0",
"User-Agent": "archicratie-auto-label/1.1",
}
def jreq(method, url, payload=None):
def jreq(method, url, payload=None, timeout=60, retries=4, backoff=2.0):
data = None if payload is None else json.dumps(payload).encode("utf-8")
req = urllib.request.Request(url, data=data, headers=headers, method=method)
try:
with urllib.request.urlopen(req, timeout=20) as r:
b = r.read()
return json.loads(b.decode("utf-8")) if b else None
except urllib.error.HTTPError as e:
b = e.read().decode("utf-8", errors="replace")
raise RuntimeError(f"HTTP {e.code} {method} {url}\n{b}") from e
last_err = None
for i in range(retries):
req = urllib.request.Request(url, data=data, headers=headers, method=method)
try:
with urllib.request.urlopen(req, timeout=timeout) as r:
b = r.read()
return json.loads(b.decode("utf-8")) if b else None
except urllib.error.HTTPError as e:
b = e.read().decode("utf-8", errors="replace")
raise RuntimeError(f"HTTP {e.code} {method} {url}\n{b}") from e
except (TimeoutError, socket.timeout, urllib.error.URLError) as e:
last_err = e
# retry only on network/timeout
time.sleep(backoff * (i + 1))
raise RuntimeError(f"Network/timeout after retries: {method} {url}\n{last_err}")
# labels repo
labels = jreq("GET", f"{api}/repos/{owner}/{repo}/labels?limit=1000") or []
labels = jreq("GET", f"{api}/repos/{owner}/{repo}/labels?limit=1000", timeout=60) or []
name_to_id = {x.get("name"): x.get("id") for x in labels}
missing = [x for x in desired if x not in name_to_id]
if missing:
raise SystemExit("Missing labels in repo: " + ", ".join(sorted(missing)))
wanted_ids = [name_to_id[x] for x in desired]
wanted_ids = sorted({int(name_to_id[x]) for x in desired})
# labels actuels de l'issue
current = jreq("GET", f"{api}/repos/{owner}/{repo}/issues/{number}/labels") or []
current_ids = {x.get("id") for x in current if x.get("id") is not None}
current = jreq("GET", f"{api}/repos/{owner}/{repo}/issues/{number}/labels", timeout=60) or []
current_ids = {int(x.get("id")) for x in current if x.get("id") is not None}
final_ids = sorted(current_ids.union(wanted_ids))
# set labels = union (n'enlève rien)
# Replace labels = union (n'enlève rien)
url = f"{api}/repos/{owner}/{repo}/issues/{number}/labels"
try:
jreq("PUT", url, {"labels": final_ids})
except Exception:
jreq("PUT", url, final_ids)
# IMPORTANT: on n'envoie JAMAIS une liste brute ici (ça a causé le 422)
jreq("PUT", url, {"labels": final_ids}, timeout=90, retries=4)
# vérif post-apply (anti "timeout mais appliqué")
post = jreq("GET", f"{api}/repos/{owner}/{repo}/issues/{number}/labels", timeout=60) or []
post_ids = {int(x.get("id")) for x in post if x.get("id") is not None}
missing_ids = [i for i in wanted_ids if i not in post_ids]
if missing_ids:
raise RuntimeError(f"Labels not applied after PUT (missing ids): {missing_ids}")
print(f"OK labels #{number}: {sorted(desired)}")
PY

View File

@@ -3,7 +3,7 @@ name: CI
on:
push:
pull_request:
branches: [master]
branches: [main]
workflow_dispatch:
env:
@@ -15,7 +15,7 @@ defaults:
jobs:
build-and-anchors:
runs-on: ubuntu-latest
runs-on: mac-ci
container:
image: mcr.microsoft.com/devcontainers/javascript-node:22-bookworm
@@ -79,22 +79,7 @@ jobs:
set -euo pipefail
npm ci
- name: Inline scripts syntax check
- name: Full test suite (CI=1)
run: |
set -euo pipefail
node scripts/check-inline-js.mjs
- name: Build (includes postbuild injection + pagefind)
run: |
set -euo pipefail
npm run build
- name: Anchors contract
run: |
set -euo pipefail
npm run test:anchors
- name: Verify anchor aliases injected in dist
run: |
set -euo pipefail
node scripts/verify-anchor-aliases-in-dist.mjs
npm run ci

View File

@@ -1,103 +0,0 @@
name: CI
on:
push: {}
pull_request:
branches: ["master"]
workflow_dispatch: {}
env:
NODE_OPTIONS: --dns-result-order=ipv4first
defaults:
run:
shell: bash
jobs:
build-and-anchors:
runs-on: ubuntu-latest
container:
image: mcr.microsoft.com/devcontainers/javascript-node:22-bookworm
steps:
- name: Tools sanity
run: |
set -euo pipefail
git --version
node --version
npm --version
npm ping --registry=https://registry.npmjs.org
- name: Checkout (from event.json, no external actions)
run: |
set -euo pipefail
EVENT_JSON="/var/run/act/workflow/event.json"
test -f "$EVENT_JSON" || (echo "❌ Missing $EVENT_JSON" && exit 1)
eval "$(node - <<'NODE'
import fs from "node:fs";
const ev = JSON.parse(fs.readFileSync("/var/run/act/workflow/event.json","utf8"));
const repo =
ev?.repository?.clone_url ||
(ev?.repository?.html_url ? (ev.repository.html_url.replace(/\/$/,'') + ".git") : "");
const sha =
ev?.after ||
ev?.pull_request?.head?.sha ||
ev?.head_commit?.id ||
ev?.sha ||
"";
if (!repo) { console.error("No repository.clone_url/html_url in event.json"); process.exit(1); }
if (!sha) { console.error("No sha/after/pull_request.head.sha in event.json"); process.exit(1); }
console.log(`REPO_URL=${JSON.stringify(repo)}`);
console.log(`SHA=${JSON.stringify(sha)}`);
NODE
)"
echo "Repo URL: $REPO_URL"
echo "SHA: $SHA"
rm -rf .git
git init
git remote add origin "$REPO_URL"
git fetch --depth 1 origin "$SHA"
git checkout -q FETCH_HEAD
git log -1 --oneline
- name: Anchor aliases schema
run: |
set -euo pipefail
node scripts/check-anchor-aliases.mjs
- name: NPM harden
run: |
set -euo pipefail
npm config set fetch-retries 5
npm config set fetch-retry-mintimeout 20000
npm config set fetch-retry-maxtimeout 120000
npm config set registry https://registry.npmjs.org
npm config get registry
- name: Install deps
run: |
set -euo pipefail
npm ci
- name: Inline scripts syntax check
run: |
set -euo pipefail
node scripts/check-inline-js.mjs
- name: Build (includes postbuild injection + pagefind)
run: |
set -euo pipefail
npm run build
- name: Anchors contract
run: |
set -euo pipefail
npm run test:anchors
- name: Verify anchor aliases injected in dist
run: |
set -euo pipefail
node scripts/verify-anchor-aliases-in-dist.mjs

View File

@@ -0,0 +1,613 @@
name: Deploy staging+live (annotations)
on:
push:
branches: [main]
workflow_dispatch:
inputs:
force:
description: "Force FULL deploy (rebuild+restart) even if gate would hotpatch-only (1=yes, 0=no)"
required: false
default: "0"
env:
NODE_OPTIONS: --dns-result-order=ipv4first
DOCKER_API_VERSION: "1.43"
COMPOSE_VERSION: "2.29.7"
ASTRO_TELEMETRY_DISABLED: "1"
defaults:
run:
shell: bash
concurrency:
group: deploy-staging-live-main
cancel-in-progress: false
jobs:
deploy:
runs-on: nas-deploy
container:
image: localhost:5000/archicratie/nas-deploy-node22@sha256:fefa8bb307005cebec07796661ab25528dc319c33a8f1e480e1d66f90cd5cff6
steps:
- name: Tools sanity
run: |
set -euo pipefail
git --version
node --version
npm --version
- name: Checkout (push or workflow_dispatch, no external actions)
env:
EVENT_JSON: /var/run/act/workflow/event.json
run: |
set -euo pipefail
test -f "$EVENT_JSON" || { echo "❌ Missing $EVENT_JSON"; exit 1; }
node --input-type=module <<'NODE'
import fs from "node:fs";
const ev = JSON.parse(fs.readFileSync(process.env.EVENT_JSON, "utf8"));
const repoObj = ev?.repository || {};
const cloneUrl =
repoObj?.clone_url ||
(repoObj?.html_url ? (repoObj.html_url.replace(/\/$/,"") + ".git") : "");
if (!cloneUrl) throw new Error("No repository clone_url/html_url in event.json");
const defaultBranch = repoObj?.default_branch || "main";
// Push-range (most reliable for change detection)
const before = String(ev?.before || "").trim();
const after =
(process.env.GITHUB_SHA && String(process.env.GITHUB_SHA).trim()) ||
String(ev?.after || ev?.sha || ev?.head_commit?.id || ev?.pull_request?.head?.sha || "").trim();
const shq = (s) => "'" + String(s).replace(/'/g, "'\\''") + "'";
fs.writeFileSync("/tmp/deploy.env", [
`REPO_URL=${shq(cloneUrl)}`,
`DEFAULT_BRANCH=${shq(defaultBranch)}`,
`BEFORE=${shq(before)}`,
`AFTER=${shq(after)}`
].join("\n") + "\n");
NODE
source /tmp/deploy.env
echo "Repo URL: $REPO_URL"
echo "Default branch: $DEFAULT_BRANCH"
echo "BEFORE: ${BEFORE:-<empty>}"
echo "AFTER: ${AFTER:-<empty>}"
rm -rf .git
git init -q
git remote add origin "$REPO_URL"
# Checkout AFTER (or default branch if missing)
if [[ -n "${AFTER:-}" ]]; then
git fetch --depth 50 origin "$AFTER"
git -c advice.detachedHead=false checkout -q FETCH_HEAD
else
git fetch --depth 50 origin "$DEFAULT_BRANCH"
git -c advice.detachedHead=false checkout -q "origin/$DEFAULT_BRANCH"
AFTER="$(git rev-parse HEAD)"
echo "AFTER='$AFTER'" >> /tmp/deploy.env
echo "Resolved AFTER: $AFTER"
fi
git log -1 --oneline
- name: Gate — decide SKIP vs HOTPATCH vs FULL rebuild
env:
INPUT_FORCE: ${{ inputs.force }}
EVENT_JSON: /var/run/act/workflow/event.json
run: |
set -euo pipefail
source /tmp/deploy.env
FORCE="${INPUT_FORCE:-0}"
# Lire before/after du push depuis event.json (merge-proof)
node --input-type=module <<'NODE'
import fs from "node:fs";
const ev = JSON.parse(fs.readFileSync(process.env.EVENT_JSON, "utf8"));
const before = ev?.before || "";
const after = ev?.after || ev?.sha || "";
const shq = (s) => "'" + String(s).replace(/'/g, "'\\''") + "'";
fs.writeFileSync("/tmp/gate.env", [
`EV_BEFORE=${shq(before)}`,
`EV_AFTER=${shq(after)}`
].join("\n") + "\n");
NODE
source /tmp/gate.env
BEFORE="${EV_BEFORE:-}"
AFTER="${EV_AFTER:-}"
if [[ -z "${AFTER:-}" ]]; then
AFTER="${SHA:-}"
fi
echo "Gate ctx: BEFORE=${BEFORE:-<empty>} AFTER=${AFTER:-<empty>} FORCE=${FORCE}"
# Produire une liste CHANGED fiable :
# - si BEFORE/AFTER valides -> git diff before..after
# - sinon fallback -> diff parent1..after ou show after
CHANGED=""
Z40="0000000000000000000000000000000000000000"
if [[ -n "${BEFORE:-}" && "${BEFORE}" != "${Z40}" ]] \
&& git cat-file -e "${BEFORE}^{commit}" 2>/dev/null \
&& git cat-file -e "${AFTER}^{commit}" 2>/dev/null; then
CHANGED="$(git diff --name-only "${BEFORE}" "${AFTER}" || true)"
else
P1="$(git rev-parse "${AFTER}^" 2>/dev/null || true)"
if [[ -n "${P1:-}" ]] && git cat-file -e "${P1}^{commit}" 2>/dev/null; then
CHANGED="$(git diff --name-only "${P1}" "${AFTER}" || true)"
else
CHANGED="$(git show --name-only --pretty="" "${AFTER}" | sed '/^$/d' || true)"
fi
fi
printf "%s\n" "${CHANGED}" > /tmp/changed.txt
echo "== changed files (first 200) =="
sed -n '1,200p' /tmp/changed.txt || true
# Flags
HAS_FULL=0
HAS_HOTPATCH=0
# HOTPATCH si annotations/media touchés
if grep -qE '^(src/annotations/|public/media/)' /tmp/changed.txt; then
HAS_HOTPATCH=1
fi
# FULL si build-impacting (robuste)
# 1) Tout src/ SAUF src/annotations/
if grep -qE '^src/' /tmp/changed.txt && grep -qEv '^src/annotations/' /tmp/changed.txt; then
HAS_FULL=1
fi
# 2) scripts/
if grep -qE '^scripts/' /tmp/changed.txt; then
HAS_FULL=1
fi
# 3) Tout public/ SAUF public/media/
if grep -qE '^public/' /tmp/changed.txt && grep -qEv '^public/media/' /tmp/changed.txt; then
HAS_FULL=1
fi
# 4) fichiers racine qui changent le build / limage
if grep -qE '^(package\.json|package-lock\.json|astro\.config\.mjs|tsconfig\.json|\.npmrc|\.nvmrc|Dockerfile|docker-compose\.yml|nginx\.conf)$' /tmp/changed.txt; then
HAS_FULL=1
fi
echo "Gate flags: HAS_FULL=${HAS_FULL} HAS_HOTPATCH=${HAS_HOTPATCH}"
# Décision
if [[ "${FORCE}" == "1" ]]; then
GO=1
MODE="full"
echo "✅ force=1 -> MODE=full (rebuild+restart)"
elif [[ "${HAS_FULL}" == "1" ]]; then
GO=1
MODE="full"
echo "✅ build-impacting change -> MODE=full (rebuild+restart)"
elif [[ "${HAS_HOTPATCH}" == "1" ]]; then
GO=1
MODE="hotpatch"
echo "✅ annotations/media change -> MODE=hotpatch"
else
GO=0
MODE="skip"
echo " no relevant change -> skip deploy"
fi
echo "GO=${GO}" >> /tmp/deploy.env
echo "MODE='${MODE}'" >> /tmp/deploy.env
- name: Toolchain sanity + resolve COMPOSE_PROJECT_NAME
run: |
set -euo pipefail
source /tmp/deploy.env
[[ "${GO:-0}" == "1" ]] || { echo " skipped"; exit 0; }
# tools are prebaked in the image
git --version
docker version
docker compose version
python3 -c 'import yaml; print("PyYAML OK")'
# Reuse existing compose project name if containers already exist
PROJ="$(docker inspect archicratie-web-blue --format '{{ index .Config.Labels "com.docker.compose.project" }}' 2>/dev/null || true)"
if [[ -z "${PROJ:-}" ]]; then
PROJ="$(docker inspect archicratie-web-green --format '{{ index .Config.Labels "com.docker.compose.project" }}' 2>/dev/null || true)"
fi
if [[ -z "${PROJ:-}" ]]; then PROJ="archicratie-web"; fi
echo "COMPOSE_PROJECT_NAME='$PROJ'" >> /tmp/deploy.env
echo "✅ Using COMPOSE_PROJECT_NAME=$PROJ"
# Assert target containers exist (hotpatch needs them)
for c in archicratie-web-blue archicratie-web-green; do
docker inspect "$c" >/dev/null 2>&1 || { echo "❌ missing container $c"; exit 5; }
done
- name: Assert required vars (PUBLIC_GITEA_*) — only needed for MODE=full
env:
PUBLIC_GITEA_BASE: ${{ vars.PUBLIC_GITEA_BASE }}
PUBLIC_GITEA_OWNER: ${{ vars.PUBLIC_GITEA_OWNER }}
PUBLIC_GITEA_REPO: ${{ vars.PUBLIC_GITEA_REPO }}
run: |
set -euo pipefail
source /tmp/deploy.env
[[ "${GO:-0}" == "1" ]] || { echo " skipped"; exit 0; }
[[ "${MODE:-hotpatch}" == "full" ]] || { echo " hotpatch mode -> vars not required"; exit 0; }
test -n "${PUBLIC_GITEA_BASE:-}" || { echo "❌ missing repo var PUBLIC_GITEA_BASE"; exit 2; }
test -n "${PUBLIC_GITEA_OWNER:-}" || { echo "❌ missing repo var PUBLIC_GITEA_OWNER"; exit 2; }
test -n "${PUBLIC_GITEA_REPO:-}" || { echo "❌ missing repo var PUBLIC_GITEA_REPO"; exit 2; }
echo "✅ vars OK"
- name: Assert deploy files exist — only needed for MODE=full
run: |
set -euo pipefail
source /tmp/deploy.env
[[ "${GO:-0}" == "1" ]] || { echo " skipped"; exit 0; }
[[ "${MODE:-hotpatch}" == "full" ]] || { echo " hotpatch mode -> files not required"; exit 0; }
test -f docker-compose.yml
test -f Dockerfile
test -f nginx.conf
echo "✅ deploy files OK"
- name: FULL — Build + deploy staging (blue) then warmup+smoke
env:
PUBLIC_GITEA_BASE: ${{ vars.PUBLIC_GITEA_BASE }}
PUBLIC_GITEA_OWNER: ${{ vars.PUBLIC_GITEA_OWNER }}
PUBLIC_GITEA_REPO: ${{ vars.PUBLIC_GITEA_REPO }}
run: |
set -euo pipefail
source /tmp/deploy.env
[[ "${GO:-0}" == "1" ]] || { echo " skipped"; exit 0; }
[[ "${MODE:-hotpatch}" == "full" ]] || { echo " MODE=$MODE -> skip full rebuild"; exit 0; }
PROJ="${COMPOSE_PROJECT_NAME:-archicratie-web}"
wait_url() {
local url="$1"
local label="$2"
local tries="${3:-60}"
for i in $(seq 1 "$tries"); do
if curl -fsS --max-time 4 "$url" >/dev/null; then
echo "✅ $label OK ($url)"
return 0
fi
echo "… warmup $label ($i/$tries)"
sleep 1
done
echo "❌ timeout $label ($url)"
return 1
}
TS="$(date -u +%Y%m%d-%H%M%S)"
echo "TS='$TS'" >> /tmp/deploy.env
docker image tag archicratie-web:blue "archicratie-web:blue.BAK.${TS}" || true
docker image tag archicratie-web:green "archicratie-web:green.BAK.${TS}" || true
BUILD_TIME_RAW="$(TZ=Europe/Paris date '+%Y-%m-%dT%H:%M:%S%z')"
BUILD_TIME="${BUILD_TIME_RAW:0:${#BUILD_TIME_RAW}-2}:${BUILD_TIME_RAW:${#BUILD_TIME_RAW}-2}"
PUBLIC_OPS_ENV=staging \
PUBLIC_OPS_UPSTREAM=web_blue \
PUBLIC_BUILD_SHA="${AFTER}" \
PUBLIC_BUILD_TIME="${BUILD_TIME}" \
node scripts/write-ops-health.mjs
test -f public/__ops/health.json
echo "=== public/__ops/health.json (blue/staging) ==="
cat public/__ops/health.json
docker compose -p "$PROJ" -f docker-compose.yml build web_blue
docker rm -f archicratie-web-blue || true
docker compose -p "$PROJ" -f docker-compose.yml up -d --force-recreate --remove-orphans web_blue
# warmup endpoints
wait_url "http://127.0.0.1:8081/para-index.json" "blue para-index"
wait_url "http://127.0.0.1:8081/annotations-index.json" "blue annotations-index"
wait_url "http://127.0.0.1:8081/pagefind/pagefind.js" "blue pagefind.js"
wait_url "http://127.0.0.1:8081/__ops/health.json" "blue ops health"
curl -fsS --max-time 6 "http://127.0.0.1:8081/__ops/health.json" \
| python3 -c 'import sys, json; j=json.load(sys.stdin); print("env=", j.get("env")); print("upstream=", j.get("upstream")); print("buildSha=", j.get("buildSha")); print("builtAt=", j.get("builtAt"))'
CANON="$(curl -fsS --max-time 6 "http://127.0.0.1:8081/archicrat-ia/chapitre-1/" | grep -oE 'rel="canonical" href="[^"]+"' | head -n1 || true)"
echo "canonical(blue)=$CANON"
echo "$CANON" | grep -q 'https://staging\.archicratie\.trans-hands\.synology\.me/' || {
echo "❌ staging canonical mismatch"
docker logs --tail 120 archicratie-web-blue || true
exit 3
}
echo "✅ staging OK"
- name: FULL — Build + deploy live (green) then warmup+smoke + rollback if needed
env:
PUBLIC_GITEA_BASE: ${{ vars.PUBLIC_GITEA_BASE }}
PUBLIC_GITEA_OWNER: ${{ vars.PUBLIC_GITEA_OWNER }}
PUBLIC_GITEA_REPO: ${{ vars.PUBLIC_GITEA_REPO }}
run: |
set -euo pipefail
source /tmp/deploy.env
[[ "${GO:-0}" == "1" ]] || { echo " skipped"; exit 0; }
[[ "${MODE:-hotpatch}" == "full" ]] || { echo " MODE=$MODE -> skip full rebuild"; exit 0; }
PROJ="${COMPOSE_PROJECT_NAME:-archicratie-web}"
TS="${TS:-$(date -u +%Y%m%d-%H%M%S)}"
wait_url() {
local url="$1"
local label="$2"
local tries="${3:-60}"
for i in $(seq 1 "$tries"); do
if curl -fsS --max-time 4 "$url" >/dev/null; then
echo "✅ $label OK ($url)"
return 0
fi
echo "… warmup $label ($i/$tries)"
sleep 1
done
echo "❌ timeout $label ($url)"
return 1
}
rollback() {
echo "⚠️ rollback green -> previous image tag (best effort)"
docker image tag "archicratie-web:green.BAK.${TS}" archicratie-web:green || true
docker rm -f archicratie-web-green || true
docker compose -p "$PROJ" -f docker-compose.yml up -d --force-recreate --remove-orphans web_green || true
}
BUILD_TIME_RAW="$(TZ=Europe/Paris date '+%Y-%m-%dT%H:%M:%S%z')"
BUILD_TIME="${BUILD_TIME_RAW:0:${#BUILD_TIME_RAW}-2}:${BUILD_TIME_RAW:${#BUILD_TIME_RAW}-2}"
PUBLIC_OPS_ENV=prod \
PUBLIC_OPS_UPSTREAM=web_green \
PUBLIC_BUILD_SHA="${AFTER}" \
PUBLIC_BUILD_TIME="${BUILD_TIME}" \
node scripts/write-ops-health.mjs
test -f public/__ops/health.json
echo "=== public/__ops/health.json (green/prod) ==="
cat public/__ops/health.json
# build/restart green
if ! docker compose -p "$PROJ" -f docker-compose.yml build web_green; then
echo "❌ build green failed"; rollback; exit 4
fi
docker rm -f archicratie-web-green || true
docker compose -p "$PROJ" -f docker-compose.yml up -d --force-recreate --remove-orphans web_green
# warmup endpoints
if ! wait_url "http://127.0.0.1:8082/para-index.json" "green para-index"; then rollback; exit 4; fi
if ! wait_url "http://127.0.0.1:8082/annotations-index.json" "green annotations-index"; then rollback; exit 4; fi
if ! wait_url "http://127.0.0.1:8082/pagefind/pagefind.js" "green pagefind.js"; then rollback; exit 4; fi
if ! wait_url "http://127.0.0.1:8082/__ops/health.json" "green ops health"; then rollback; exit 4; fi
curl -fsS --max-time 6 "http://127.0.0.1:8082/__ops/health.json" \
| python3 -c 'import sys, json; j=json.load(sys.stdin); print("env=", j.get("env")); print("upstream=", j.get("upstream")); print("buildSha=", j.get("buildSha")); print("builtAt=", j.get("builtAt"))'
CANON="$(curl -fsS --max-time 6 "http://127.0.0.1:8082/archicrat-ia/chapitre-1/" | grep -oE 'rel="canonical" href="[^"]+"' | head -n1 || true)"
echo "canonical(green)=$CANON"
echo "$CANON" | grep -q 'https://archicratie\.trans-hands\.synology\.me/' || {
echo "❌ live canonical mismatch"
docker logs --tail 120 archicratie-web-green || true
rollback
exit 4
}
echo "✅ live OK"
- name: HOTPATCH — deep merge shards -> annotations-index + copy changed media into blue+green
run: |
set -euo pipefail
source /tmp/deploy.env
[[ "${GO:-0}" == "1" ]] || { echo " skipped"; exit 0; }
python3 - <<'PY'
import os, re, json, glob
import yaml
import datetime as dt
ROOT = os.getcwd()
ANNO_ROOT = os.path.join(ROOT, "src", "annotations")
def is_obj(x): return isinstance(x, dict)
def is_arr(x): return isinstance(x, list)
def iso_dt(x):
if isinstance(x, dt.datetime):
if x.tzinfo is None:
return x.isoformat()
return x.astimezone(dt.timezone.utc).isoformat().replace("+00:00","Z")
if isinstance(x, dt.date):
return x.isoformat()
return None
def normalize(x):
s = iso_dt(x)
if s is not None: return s
if isinstance(x, dict):
return {str(k): normalize(v) for k, v in x.items()}
if isinstance(x, list):
return [normalize(v) for v in x]
return x
def key_media(it): return str((it or {}).get("src",""))
def key_ref(it):
it = it or {}
return "||".join([str(it.get("url","")), str(it.get("label","")), str(it.get("kind","")), str(it.get("citation",""))])
def key_comment(it): return str((it or {}).get("text","")).strip()
def dedup_extend(dst_list, src_list, key_fn):
seen = set(); out = []
for x in (dst_list or []):
x = normalize(x); k = key_fn(x)
if k and k not in seen: seen.add(k); out.append(x)
for x in (src_list or []):
x = normalize(x); k = key_fn(x)
if k and k not in seen: seen.add(k); out.append(x)
return out
def deep_merge(dst, src):
src = normalize(src)
for k, v in (src or {}).items():
if k in ("media","refs","comments_editorial") and is_arr(v):
if k == "media": dst[k] = dedup_extend(dst.get(k, []), v, key_media)
elif k == "refs": dst[k] = dedup_extend(dst.get(k, []), v, key_ref)
else: dst[k] = dedup_extend(dst.get(k, []), v, key_comment)
continue
if is_obj(v):
if not is_obj(dst.get(k)): dst[k] = {}
deep_merge(dst[k], v)
continue
if is_arr(v):
cur = dst.get(k, [])
if not is_arr(cur): cur = []
seen = set(); out = []
for x in cur:
x = normalize(x)
s = json.dumps(x, sort_keys=True, ensure_ascii=False)
if s not in seen: seen.add(s); out.append(x)
for x in v:
x = normalize(x)
s = json.dumps(x, sort_keys=True, ensure_ascii=False)
if s not in seen: seen.add(s); out.append(x)
dst[k] = out
continue
v = normalize(v)
if k not in dst or dst.get(k) in (None, ""):
dst[k] = v
def para_num(pid):
m = re.match(r"^p-(\d+)-", str(pid))
return int(m.group(1)) if m else 10**9
def sort_lists(entry):
for k in ("media","refs","comments_editorial"):
arr = entry.get(k)
if not is_arr(arr): continue
def ts(x):
x = normalize(x)
try:
s = str((x or {}).get("ts",""))
return dt.datetime.fromisoformat(s.replace("Z","+00:00")).timestamp() if s else 0
except Exception:
return 0
arr = [normalize(x) for x in arr]
arr.sort(key=lambda x: (ts(x), json.dumps(x, sort_keys=True, ensure_ascii=False)))
entry[k] = arr
if not os.path.isdir(ANNO_ROOT):
raise SystemExit(f"Missing annotations root: {ANNO_ROOT}")
pages = {}
errors = []
files = sorted(glob.glob(os.path.join(ANNO_ROOT, "**", "*.yml"), recursive=True))
for fp in files:
try:
with open(fp, "r", encoding="utf-8") as f:
doc = yaml.safe_load(f) or {}
doc = normalize(doc)
if not isinstance(doc, dict) or doc.get("schema") != 1:
continue
page = str(doc.get("page","")).strip().strip("/")
paras = doc.get("paras") or {}
if not page or not isinstance(paras, dict):
continue
pg = pages.setdefault(page, {"paras": {}})
for pid, entry in paras.items():
pid = str(pid)
if pid not in pg["paras"] or not isinstance(pg["paras"].get(pid), dict):
pg["paras"][pid] = {}
if isinstance(entry, dict):
deep_merge(pg["paras"][pid], entry)
sort_lists(pg["paras"][pid])
except Exception as e:
errors.append({"file": os.path.relpath(fp, ROOT), "error": str(e)})
for page, obj in pages.items():
keys = list((obj.get("paras") or {}).keys())
keys.sort(key=lambda k: (para_num(k), k))
obj["paras"] = {k: obj["paras"][k] for k in keys}
out = {
"schema": 1,
"generatedAt": dt.datetime.utcnow().replace(tzinfo=dt.timezone.utc).isoformat().replace("+00:00","Z"),
"pages": pages,
"stats": {
"pages": len(pages),
"paras": sum(len(v.get("paras") or {}) for v in pages.values()),
"errors": len(errors),
},
"errors": errors,
}
with open("/tmp/annotations-index.json", "w", encoding="utf-8") as f:
json.dump(out, f, ensure_ascii=False)
print("OK: wrote /tmp/annotations-index.json pages=", out["stats"]["pages"], "paras=", out["stats"]["paras"], "errors=", out["stats"]["errors"])
PY
# patch JSON into running containers
for c in archicratie-web-blue archicratie-web-green; do
echo "== patch annotations-index.json into $c =="
docker cp /tmp/annotations-index.json "${c}:/usr/share/nginx/html/annotations-index.json"
done
# copy changed media files into containers (so new media appears without rebuild)
if [[ -s /tmp/changed.txt ]]; then
while IFS= read -r f; do
[[ -n "$f" ]] || continue
if [[ "$f" == public/media/* ]]; then
dest="/usr/share/nginx/html/${f#public/}" # => /usr/share/nginx/html/media/...
for c in archicratie-web-blue archicratie-web-green; do
echo "== copy media into $c: $f -> $dest =="
docker exec "$c" sh -lc "mkdir -p \"$(dirname "$dest")\""
docker cp "$f" "$c:$dest"
done
fi
done < /tmp/changed.txt
fi
# smoke after patch
for p in 8081 8082; do
echo "== smoke annotations-index on $p =="
curl -fsS --max-time 6 "http://127.0.0.1:${p}/annotations-index.json" \
| python3 -c 'import sys,json; j=json.load(sys.stdin); print("generatedAt:", j.get("generatedAt")); print("pages:", len(j.get("pages") or {})); print("paras:", j.get("stats",{}).get("paras"))'
done
echo "✅ hotpatch done"
- name: Debug on failure (containers status/logs)
if: ${{ failure() }}
run: |
set -euo pipefail
echo "== docker ps =="
docker ps --format 'table {{.Names}}\t{{.Status}}\t{{.Image}}' | sed -n '1,80p' || true
for c in archicratie-web-blue archicratie-web-green; do
echo "== logs $c (tail 200) =="
docker logs --tail 200 "$c" || true
done

View File

@@ -0,0 +1,788 @@
name: Proposer Apply (Queue)
on:
issues:
types: [labeled]
push:
branches: [main]
workflow_dispatch:
inputs:
issue:
description: "Issue number to prioritize (optional)"
required: false
default: ""
env:
NODE_OPTIONS: --dns-result-order=ipv4first
defaults:
run:
shell: bash
concurrency:
group: proposer-queue-main
cancel-in-progress: false
jobs:
apply-proposer:
runs-on: mac-ci
container:
image: mcr.microsoft.com/devcontainers/javascript-node:22-bookworm
steps:
- name: Tools sanity
run: |
set -euo pipefail
git --version
node --version
npm --version
- name: Derive context (event.json / workflow_dispatch / push)
env:
INPUT_ISSUE: ${{ inputs.issue }}
EVENT_NAME_IN: ${{ github.event_name }}
FORGE_API: ${{ vars.FORGE_API || vars.FORGE_BASE }}
run: |
set -euo pipefail
export EVENT_JSON="/var/run/act/workflow/event.json"
test -f "$EVENT_JSON" || { echo "Missing $EVENT_JSON"; exit 1; }
node --input-type=module - <<'NODE' > /tmp/proposer.env
import fs from "node:fs";
const ev = JSON.parse(fs.readFileSync(process.env.EVENT_JSON, "utf8"));
const repoObj = ev?.repository || {};
const cloneUrl =
repoObj?.clone_url ||
(repoObj?.html_url ? (repoObj.html_url.replace(/\/$/, "") + ".git") : "");
if (!cloneUrl) throw new Error("No repository clone_url/html_url in event.json");
let owner =
repoObj?.owner?.login ||
repoObj?.owner?.username ||
(repoObj?.full_name ? repoObj.full_name.split("/")[0] : "");
let repo =
repoObj?.name ||
(repoObj?.full_name ? repoObj.full_name.split("/")[1] : "");
if (!owner || !repo) {
const m = cloneUrl.match(/[:/](?<o>[^/]+)\/(?<r>[^/]+?)(?:\.git)?$/);
if (m?.groups) {
owner = owner || m.groups.o;
repo = repo || m.groups.r;
}
}
if (!owner || !repo) throw new Error("Cannot infer owner/repo");
const defaultBranch = repoObj?.default_branch || "main";
const issueNumber =
ev?.issue?.number ||
ev?.issue?.index ||
(process.env.INPUT_ISSUE ? Number(process.env.INPUT_ISSUE) : 0) ||
0;
const labelName =
ev?.label?.name ||
(typeof ev?.label === "string" ? ev.label : "") ||
"";
const eventName =
String(process.env.EVENT_NAME_IN || "").trim() ||
(ev?.issue ? "issues" : (ev?.before || ev?.after ? "push" : "workflow_dispatch"));
const u = new URL(cloneUrl);
const origin = u.origin;
const apiBase =
(process.env.FORGE_API && String(process.env.FORGE_API).trim())
? String(process.env.FORGE_API).trim().replace(/\/+$/, "")
: origin;
function sh(s) {
return JSON.stringify(String(s));
}
process.stdout.write([
`CLONE_URL=${sh(cloneUrl)}`,
`OWNER=${sh(owner)}`,
`REPO=${sh(repo)}`,
`DEFAULT_BRANCH=${sh(defaultBranch)}`,
`ISSUE_NUMBER=${sh(issueNumber)}`,
`LABEL_NAME=${sh(labelName)}`,
`EVENT_NAME=${sh(eventName)}`,
`API_BASE=${sh(apiBase)}`
].join("\n") + "\n");
NODE
echo "Context:"
sed -n '1,200p' /tmp/proposer.env
- name: Early gate (tolerant on empty issue label payload)
run: |
set -euo pipefail
source /tmp/proposer.env
echo "event=$EVENT_NAME label=${LABEL_NAME:-<empty>}"
if [[ "$EVENT_NAME" == "issues" ]]; then
if [[ -n "${LABEL_NAME:-}" && "$LABEL_NAME" != "state/approved" ]]; then
echo "issues/labeled with explicit non-approved label=$LABEL_NAME -> skip"
echo 'SKIP=1' >> /tmp/proposer.env
echo 'SKIP_REASON="label_not_state_approved_event"' >> /tmp/proposer.env
exit 0
fi
fi
echo "Proceed to API-based selection/gating"
- name: Checkout default branch
run: |
set -euo pipefail
source /tmp/proposer.env
[[ "${SKIP:-0}" != "1" ]] || { echo "Skipped"; exit 0; }
rm -rf .git
git init -q
git remote add origin "$CLONE_URL"
git fetch --depth 1 origin "$DEFAULT_BRANCH"
git -c advice.detachedHead=false checkout -q FETCH_HEAD
git log -1 --oneline
- name: Detect app dir (repo-root vs ./site)
run: |
set -euo pipefail
source /tmp/proposer.env
[[ "${SKIP:-0}" != "1" ]] || { echo "Skipped"; exit 0; }
APP_DIR="."
if [[ -d "site" && -f "site/package.json" ]]; then
APP_DIR="site"
fi
echo "APP_DIR=$APP_DIR" >> /tmp/proposer.env
echo "APP_DIR=$APP_DIR"
test -f "$APP_DIR/package.json" || {
echo "package.json missing in APP_DIR=$APP_DIR"
exit 1
}
test -d "$APP_DIR/scripts" || {
echo "scripts/ missing in APP_DIR=$APP_DIR"
exit 1
}
- name: Select next proposer batch (by path)
env:
FORGE_TOKEN: ${{ secrets.FORGE_TOKEN }}
run: |
set -euo pipefail
source /tmp/proposer.env
[[ "${SKIP:-0}" != "1" ]] || { echo "Skipped"; exit 0; }
test -n "${FORGE_TOKEN:-}" || {
echo "Missing secret FORGE_TOKEN"
exit 1
}
export GITEA_OWNER="$OWNER"
export GITEA_REPO="$REPO"
export FORGE_API="$API_BASE"
cd "$APP_DIR"
test -f scripts/pick-proposer-issue.mjs || {
echo "missing scripts/pick-proposer-issue.mjs in APP_DIR=$APP_DIR"
ls -la scripts | sed -n '1,200p' || true
exit 1
}
node scripts/pick-proposer-issue.mjs "${ISSUE_NUMBER:-0}" > /tmp/proposer.pick.env
cat /tmp/proposer.pick.env >> /tmp/proposer.env
source /tmp/proposer.pick.env
if [[ "${TARGET_FOUND:-0}" != "1" ]]; then
echo 'SKIP=1' >> /tmp/proposer.env
echo "SKIP_REASON=${TARGET_REASON:-no_target}" >> /tmp/proposer.env
echo "No target batch"
exit 0
fi
echo "Target batch:"
grep -E '^(TARGET_PRIMARY_ISSUE|TARGET_ISSUES|TARGET_COUNT|TARGET_CHEMIN)=' /tmp/proposer.env
- name: Derive deterministic batch identity
run: |
set -euo pipefail
source /tmp/proposer.env
[[ "${SKIP:-0}" != "1" ]] || { echo "Skipped"; exit 0; }
export TARGET_ISSUES TARGET_CHEMIN
node --input-type=module - <<'NODE'
import fs from "node:fs";
import crypto from "node:crypto";
const issues = String(process.env.TARGET_ISSUES || "")
.trim()
.split(/\s+/)
.filter(Boolean)
.sort((a, b) => Number(a) - Number(b));
const chemin = String(process.env.TARGET_CHEMIN || "").trim();
const keySource = `${chemin}::${issues.join(",")}`;
const hash = crypto.createHash("sha1").update(keySource).digest("hex").slice(0, 12);
const primary = issues[0] || "0";
const batchBranch = `bot/proposer-${primary}-${hash}`;
fs.appendFileSync(
"/tmp/proposer.env",
[
`BATCH_KEY=${JSON.stringify(keySource)}`,
`BATCH_HASH=${JSON.stringify(hash)}`,
`BATCH_BRANCH=${JSON.stringify(batchBranch)}`
].join("\n") + "\n"
);
NODE
echo "Batch identity:"
grep -E '^(BATCH_KEY|BATCH_HASH|BATCH_BRANCH)=' /tmp/proposer.env
- name: Inspect open proposer PRs
env:
FORGE_TOKEN: ${{ secrets.FORGE_TOKEN }}
run: |
set -euo pipefail
source /tmp/proposer.env
[[ "${SKIP:-0}" != "1" ]] || { echo "Skipped"; exit 0; }
curl -fsS \
-H "Authorization: token $FORGE_TOKEN" \
-H "Accept: application/json" \
"$API_BASE/api/v1/repos/$OWNER/$REPO/pulls?state=open&limit=100" \
-o /tmp/open_pulls.json
export TARGET_ISSUES="${TARGET_ISSUES:-}"
export BATCH_BRANCH="${BATCH_BRANCH:-}"
export BATCH_KEY="${BATCH_KEY:-}"
node --input-type=module - <<'NODE' >> /tmp/proposer.env
import fs from "node:fs";
const pulls = JSON.parse(fs.readFileSync("/tmp/open_pulls.json", "utf8"));
const issues = String(process.env.TARGET_ISSUES || "")
.trim()
.split(/\s+/)
.filter(Boolean);
const batchBranch = String(process.env.BATCH_BRANCH || "");
const batchKey = String(process.env.BATCH_KEY || "");
const proposerOpen = Array.isArray(pulls)
? pulls.filter((pr) => String(pr?.head?.ref || "").startsWith("bot/proposer-"))
: [];
const sameBatch = proposerOpen.find((pr) => {
const ref = String(pr?.head?.ref || "");
const title = String(pr?.title || "");
const body = String(pr?.body || "");
if (batchBranch && ref === batchBranch) return true;
if (batchKey && body.includes(`Batch-Key: ${batchKey}`)) return true;
return issues.some((n) =>
ref.startsWith(`bot/proposer-${n}-`) ||
title.includes(`#${n}`) ||
body.includes(`#${n}`) ||
body.includes(`ticket #${n}`)
);
});
const out = [];
if (sameBatch) {
out.push("SKIP=1");
out.push(`SKIP_REASON=${JSON.stringify("issue_already_has_open_pr")}`);
out.push(`OPEN_PR_URL=${JSON.stringify(String(sameBatch.html_url || sameBatch.url || ""))}`);
out.push(`OPEN_PR_BRANCH=${JSON.stringify(String(sameBatch?.head?.ref || ""))}`);
} else if (proposerOpen.length > 0) {
const first = proposerOpen[0];
out.push("SKIP=1");
out.push(`SKIP_REASON=${JSON.stringify("queue_busy_open_proposer_pr")}`);
out.push(`OPEN_PR_URL=${JSON.stringify(String(first.html_url || first.url || ""))}`);
out.push(`OPEN_PR_BRANCH=${JSON.stringify(String(first?.head?.ref || ""))}`);
}
process.stdout.write(out.join("\n") + (out.length ? "\n" : ""));
NODE
- name: Guard on remote batch branch before heavy work
run: |
set -euo pipefail
source /tmp/proposer.env
[[ "${SKIP:-0}" != "1" ]] || { echo "Skipped"; exit 0; }
if git ls-remote --exit-code --heads origin "$BATCH_BRANCH" >/dev/null 2>&1; then
echo 'SKIP=1' >> /tmp/proposer.env
echo 'SKIP_REASON="batch_branch_exists_without_pr"' >> /tmp/proposer.env
echo "OPEN_PR_BRANCH=${BATCH_BRANCH}" >> /tmp/proposer.env
echo "Remote batch branch already exists -> skip duplicate materialization"
exit 0
fi
echo "Remote batch branch is free"
- name: Comment issue if queued / skipped
if: ${{ always() }}
env:
FORGE_TOKEN: ${{ secrets.FORGE_TOKEN }}
run: |
set -euo pipefail
source /tmp/proposer.env || true
[[ "${SKIP:-0}" == "1" ]] || exit 0
[[ "${EVENT_NAME:-}" != "push" ]] || exit 0
if [[ "${SKIP_REASON:-}" == "label_not_state_approved_event" || "${SKIP_REASON:-}" == "label_not_state_approved" ]]; then
echo "Skip reason=${SKIP_REASON} -> no comment"
exit 0
fi
test -n "${FORGE_TOKEN:-}" || exit 0
ISSUE_TO_COMMENT="${ISSUE_NUMBER:-0}"
if [[ "$ISSUE_TO_COMMENT" == "0" || -z "$ISSUE_TO_COMMENT" ]]; then
ISSUE_TO_COMMENT="${TARGET_PRIMARY_ISSUE:-0}"
fi
[[ "$ISSUE_TO_COMMENT" != "0" ]] || exit 0
case "${SKIP_REASON:-}" in
queue_busy_open_proposer_pr)
MSG="Ticket queued in proposer queue. An open proposer PR already exists: ${OPEN_PR_URL:-"(URL unavailable)"}. The workflow will resume after merge on main."
;;
issue_already_has_open_pr)
MSG="This batch already has an open proposer PR: ${OPEN_PR_URL:-"(URL unavailable)"}"
;;
batch_branch_exists_without_pr)
MSG="This batch already has a remote batch branch (${OPEN_PR_BRANCH:-"(unknown branch)"}). Manual inspection is required before any new proposer PR is created."
;;
batch_branch_already_materialized)
MSG="This batch was already materialized by another run on branch ${OPEN_PR_BRANCH:-"(unknown branch)"}. No duplicate PR was created."
;;
explicit_issue_missing_chemin)
MSG="Proposer Apply: cannot process this ticket automatically because field Chemin is missing or unreadable."
;;
explicit_issue_missing_type)
MSG="Proposer Apply: cannot process this ticket automatically because field Type is missing or unreadable."
;;
explicit_issue_not_approved)
MSG="Proposer Apply: this ticket is not currently labeled state/approved."
;;
explicit_issue_rejected)
MSG="Proposer Apply: this ticket has state/rejected and is not eligible for the proposer queue."
;;
no_open_approved_proposer_issue)
MSG="No approved proposer ticket is currently waiting."
;;
*)
MSG="Proposer Apply: skip - ${SKIP_REASON:-unspecified reason}."
;;
esac
export MSG
node --input-type=module - <<'NODE' > /tmp/proposer.skip.comment.json
const msg = process.env.MSG || "";
process.stdout.write(JSON.stringify({ body: msg }));
NODE
curl -fsS -X POST \
-H "Authorization: token $FORGE_TOKEN" \
-H "Content-Type: application/json" \
"$API_BASE/api/v1/repos/$OWNER/$REPO/issues/$ISSUE_TO_COMMENT/comments" \
--data-binary @/tmp/proposer.skip.comment.json || true
- name: NPM harden
run: |
set -euo pipefail
source /tmp/proposer.env
[[ "${SKIP:-0}" != "1" ]] || exit 0
cd "$APP_DIR"
npm config set fetch-retries 5
npm config set fetch-retry-mintimeout 20000
npm config set fetch-retry-maxtimeout 120000
npm config set registry https://registry.npmjs.org
- name: Install deps
run: |
set -euo pipefail
source /tmp/proposer.env
[[ "${SKIP:-0}" != "1" ]] || exit 0
cd "$APP_DIR"
npm ci --no-audit --no-fund
- name: Build dist baseline
run: |
set -euo pipefail
source /tmp/proposer.env
[[ "${SKIP:-0}" != "1" ]] || exit 0
cd "$APP_DIR"
npm run build
- name: Apply proposer batch on bot branch
continue-on-error: true
env:
FORGE_TOKEN: ${{ secrets.FORGE_TOKEN }}
BOT_GIT_NAME: ${{ secrets.BOT_GIT_NAME }}
BOT_GIT_EMAIL: ${{ secrets.BOT_GIT_EMAIL }}
run: |
set -euo pipefail
source /tmp/proposer.env
[[ "${SKIP:-0}" != "1" ]] || { echo "Skipped"; exit 0; }
git config user.name "${BOT_GIT_NAME:-archicratie-bot}"
git config user.email "${BOT_GIT_EMAIL:-bot@archicratie.local}"
START_SHA="$(git rev-parse HEAD)"
BR="$BATCH_BRANCH"
echo "BRANCH=$BR" >> /tmp/proposer.env
git checkout -b "$BR"
export GITEA_OWNER="$OWNER"
export GITEA_REPO="$REPO"
export FORGE_API="$API_BASE"
LOG="/tmp/proposer-apply.log"
: > "$LOG"
RC=0
FAILED_ISSUE=""
for ISSUE in $TARGET_ISSUES; do
echo "" >> "$LOG"
echo "== ticket #$ISSUE ==" >> "$LOG"
set +e
(cd "$APP_DIR" && node scripts/apply-ticket.mjs "$ISSUE" --alias --commit) >> "$LOG" 2>&1
STEP_RC=$?
set -e
if [[ "$STEP_RC" -ne 0 ]]; then
RC="$STEP_RC"
FAILED_ISSUE="$ISSUE"
break
fi
done
echo "APPLY_RC=$RC" >> /tmp/proposer.env
echo "FAILED_ISSUE=${FAILED_ISSUE}" >> /tmp/proposer.env
echo "Apply log (tail):"
tail -n 220 "$LOG" || true
END_SHA="$(git rev-parse HEAD)"
if [[ "$RC" -ne 0 ]]; then
echo "NOOP=0" >> /tmp/proposer.env
exit 0
fi
if [[ "$START_SHA" == "$END_SHA" ]]; then
echo "NOOP=1" >> /tmp/proposer.env
else
echo "NOOP=0" >> /tmp/proposer.env
echo "END_SHA=$END_SHA" >> /tmp/proposer.env
fi
- name: Rebase bot branch on latest main
continue-on-error: true
run: |
set -euo pipefail
source /tmp/proposer.env || true
[[ "${SKIP:-0}" != "1" ]] || exit 0
[[ "${APPLY_RC:-0}" == "0" ]] || exit 0
[[ "${NOOP:-0}" == "0" ]] || exit 0
LOG="/tmp/proposer-apply.log"
git fetch origin "$DEFAULT_BRANCH"
set +e
git rebase "origin/$DEFAULT_BRANCH" >> "$LOG" 2>&1
RC=$?
set -e
if [[ "$RC" -ne 0 ]]; then
git rebase --abort || true
fi
echo "REBASE_RC=$RC" >> /tmp/proposer.env
echo "Rebase log (tail):"
tail -n 220 "$LOG" || true
- name: Comment issues on failure
if: ${{ always() }}
env:
FORGE_TOKEN: ${{ secrets.FORGE_TOKEN }}
run: |
set -euo pipefail
source /tmp/proposer.env || true
[[ "${SKIP:-0}" != "1" ]] || exit 0
APPLY_RC="${APPLY_RC:-0}"
REBASE_RC="${REBASE_RC:-0}"
if [[ "$APPLY_RC" == "0" && "$REBASE_RC" == "0" ]]; then
echo "No failure detected"
exit 0
fi
test -n "${FORGE_TOKEN:-}" || exit 0
if [[ -f /tmp/proposer-apply.log ]]; then
BODY="$(tail -n 160 /tmp/proposer-apply.log | sed 's/\r$//')"
else
BODY="(no proposer log found)"
fi
export BODY APPLY_RC REBASE_RC FAILED_ISSUE
if [[ "$APPLY_RC" != "0" ]]; then
export FAILURE_KIND="apply"
else
export FAILURE_KIND="rebase"
fi
node --input-type=module - <<'NODE' > /tmp/proposer.failure.comment.json
const body = process.env.BODY || "";
const applyRc = process.env.APPLY_RC || "0";
const rebaseRc = process.env.REBASE_RC || "0";
const failedIssue = process.env.FAILED_ISSUE || "unknown";
const kind = process.env.FAILURE_KIND || "apply";
const msg =
kind === "apply"
? `Batch proposer failed on ticket #${failedIssue} (rc=${applyRc}).\n\n\`\`\`\n${body}\n\`\`\`\n`
: `Rebase proposer failed on main (rc=${rebaseRc}).\n\n\`\`\`\n${body}\n\`\`\`\n`;
process.stdout.write(JSON.stringify({ body: msg }));
NODE
for ISSUE in ${TARGET_ISSUES:-}; do
curl -fsS -X POST \
-H "Authorization: token $FORGE_TOKEN" \
-H "Content-Type: application/json" \
"$API_BASE/api/v1/repos/$OWNER/$REPO/issues/$ISSUE/comments" \
--data-binary @/tmp/proposer.failure.comment.json || true
done
- name: Late guard against duplicate batch materialization
run: |
set -euo pipefail
source /tmp/proposer.env || true
[[ "${SKIP:-0}" != "1" ]] || exit 0
[[ "${APPLY_RC:-0}" == "0" ]] || exit 0
[[ "${REBASE_RC:-0}" == "0" ]] || exit 0
[[ "${NOOP:-0}" == "0" ]] || exit 0
REMOTE_SHA="$(git ls-remote --heads origin "$BATCH_BRANCH" | awk 'NR==1 {print $1}')"
if [[ -n "${REMOTE_SHA:-}" && "${REMOTE_SHA}" != "${END_SHA:-}" ]]; then
echo 'SKIP=1' >> /tmp/proposer.env
echo 'SKIP_REASON="batch_branch_already_materialized"' >> /tmp/proposer.env
echo "OPEN_PR_BRANCH=${BATCH_BRANCH}" >> /tmp/proposer.env
echo "Remote batch branch already exists at $REMOTE_SHA -> skip duplicate push/PR"
exit 0
fi
echo "Late guard OK"
- name: Push bot branch
if: ${{ always() }}
env:
FORGE_TOKEN: ${{ secrets.FORGE_TOKEN }}
run: |
set -euo pipefail
source /tmp/proposer.env || true
[[ "${SKIP:-0}" != "1" ]] || exit 0
[[ "${APPLY_RC:-0}" == "0" ]] || { echo "Apply failed -> skip push"; exit 0; }
[[ "${REBASE_RC:-0}" == "0" ]] || { echo "Rebase failed -> skip push"; exit 0; }
[[ "${NOOP:-0}" == "0" ]] || { echo "No-op -> skip push"; exit 0; }
[[ -n "${BRANCH:-}" ]] || { echo "BRANCH unset -> skip push"; exit 0; }
AUTH_URL="$(node --input-type=module -e '
const [clone, tok] = process.argv.slice(1);
const u = new URL(clone);
u.username = "oauth2";
u.password = tok;
console.log(u.toString());
' "$CLONE_URL" "$FORGE_TOKEN")"
git remote set-url origin "$AUTH_URL"
git push -u origin "$BRANCH"
- name: Create PR + comment issues + close issues
if: ${{ always() }}
env:
FORGE_TOKEN: ${{ secrets.FORGE_TOKEN }}
run: |
set -euo pipefail
source /tmp/proposer.env || true
[[ "${SKIP:-0}" != "1" ]] || exit 0
[[ "${APPLY_RC:-0}" == "0" ]] || exit 0
[[ "${REBASE_RC:-0}" == "0" ]] || exit 0
[[ "${NOOP:-0}" == "0" ]] || exit 0
[[ -n "${BRANCH:-}" ]] || { echo "BRANCH unset -> skip PR"; exit 0; }
test -n "${FORGE_TOKEN:-}" || { echo "Missing FORGE_TOKEN"; exit 1; }
OPEN_PRS_JSON="$(curl -fsS \
-H "Authorization: token $FORGE_TOKEN" \
-H "Accept: application/json" \
"$API_BASE/api/v1/repos/$OWNER/$REPO/pulls?state=open&limit=100")"
export OPEN_PRS_JSON BATCH_BRANCH BATCH_KEY
EXISTING_PR_URL="$(node --input-type=module -e '
const pulls = JSON.parse(process.env.OPEN_PRS_JSON || "[]");
const branch = String(process.env.BATCH_BRANCH || "");
const key = String(process.env.BATCH_KEY || "");
const current = Array.isArray(pulls)
? pulls.find((pr) => {
const ref = String(pr?.head?.ref || "");
const body = String(pr?.body || "");
return (branch && ref === branch) || (key && body.includes(`Batch-Key: ${key}`));
})
: null;
process.stdout.write(current ? String(current.html_url || current.url || "") : "");
')"
if [[ -n "${EXISTING_PR_URL:-}" ]]; then
echo "PR already exists for this batch: $EXISTING_PR_URL"
exit 0
fi
if [[ "${TARGET_COUNT:-0}" == "1" ]]; then
PR_TITLE="proposer: apply ticket #${TARGET_PRIMARY_ISSUE}"
else
PR_TITLE="proposer: apply ${TARGET_COUNT} tickets on ${TARGET_CHEMIN}"
fi
export PR_TITLE TARGET_CHEMIN TARGET_ISSUES BRANCH END_SHA DEFAULT_BRANCH OWNER BATCH_KEY
node --input-type=module -e '
import fs from "node:fs";
const issues = String(process.env.TARGET_ISSUES || "")
.trim()
.split(/\s+/)
.filter(Boolean);
const body = [
`PR auto depuis ticket${issues.length > 1 ? "s" : ""} ${issues.map((n) => `#${n}`).join(", ")} (state/approved).`,
"",
`- Chemin: ${process.env.TARGET_CHEMIN || "(inconnu)"}`,
"- Tickets:",
...issues.map((n) => ` - #${n}`),
`- Branche: ${process.env.BRANCH || ""}`,
`- Commit: ${process.env.END_SHA || "unknown"}`,
`- Batch-Key: ${process.env.BATCH_KEY || ""}`,
"",
"Merge si CI OK."
].join("\n");
fs.writeFileSync(
"/tmp/proposer.pr.json",
JSON.stringify({
title: process.env.PR_TITLE || "proposer: apply tickets",
body,
base: process.env.DEFAULT_BRANCH || "main",
head: `${process.env.OWNER}:${process.env.BRANCH}`,
allow_maintainer_edit: true
})
);
'
PR_JSON="$(curl -fsS -X POST \
-H "Authorization: token $FORGE_TOKEN" \
-H "Content-Type: application/json" \
"$API_BASE/api/v1/repos/$OWNER/$REPO/pulls" \
--data-binary @/tmp/proposer.pr.json)"
PR_URL="$(node --input-type=module -e 'const pr = JSON.parse(process.argv[1] || "{}"); console.log(pr.html_url || pr.url || "");' "$PR_JSON")"
test -n "$PR_URL" || {
echo "PR URL missing. Raw: $PR_JSON"
exit 1
}
for ISSUE in $TARGET_ISSUES; do
export ISSUE PR_URL
node --input-type=module -e '
import fs from "node:fs";
const issue = process.env.ISSUE || "";
const url = process.env.PR_URL || "";
const msg =
`PR proposer creee pour le ticket #${issue} : ${url}\n\n` +
`Le ticket est cloture automatiquement ; la discussion peut se poursuivre dans la PR.`;
fs.writeFileSync(
"/tmp/proposer.issue.close.comment.json",
JSON.stringify({ body: msg })
);
'
curl -fsS -X POST \
-H "Authorization: token $FORGE_TOKEN" \
-H "Content-Type: application/json" \
"$API_BASE/api/v1/repos/$OWNER/$REPO/issues/$ISSUE/comments" \
--data-binary @/tmp/proposer.issue.close.comment.json
curl -fsS -X PATCH \
-H "Authorization: token $FORGE_TOKEN" \
-H "Content-Type: application/json" \
"$API_BASE/api/v1/repos/$OWNER/$REPO/issues/$ISSUE" \
--data-binary '{"state":"closed"}'
ISSUE_STATE="$(curl -fsS \
-H "Authorization: token $FORGE_TOKEN" \
-H "Accept: application/json" \
"$API_BASE/api/v1/repos/$OWNER/$REPO/issues/$ISSUE" | \
node --input-type=module -e 'let s=""; process.stdin.on("data", d => s += d); process.stdin.on("end", () => { const j = JSON.parse(s || "{}"); process.stdout.write(String(j.state || "")); });')"
[[ "$ISSUE_STATE" == "closed" ]] || {
echo "Issue #$ISSUE is still not closed after PATCH"
exit 1
}
done
echo "PR: $PR_URL"
- name: Finalize
if: ${{ always() }}
run: |
set -euo pipefail
source /tmp/proposer.env || true
[[ "${SKIP:-0}" != "1" ]] || exit 0
if [[ "${APPLY_RC:-0}" != "0" ]]; then
echo "Apply failed (rc=${APPLY_RC})"
exit "${APPLY_RC}"
fi
if [[ "${REBASE_RC:-0}" != "0" ]]; then
echo "Rebase failed (rc=${REBASE_RC})"
exit "${REBASE_RC}"
fi
echo "Proposer queue OK"

View File

@@ -3,7 +3,7 @@ on: [push, workflow_dispatch]
jobs:
smoke:
runs-on: ubuntu-latest
runs-on: mac-ci
steps:
- run: node -v && npm -v
- run: echo "runner OK"

8
.gitignore vendored
View File

@@ -3,6 +3,10 @@
.env.*
!.env.example
# dev-only
public/_auth/whoami
public/_auth/whoami/*
# --- local backups ---
*.bak
*.bak.*
@@ -24,3 +28,7 @@ public/favicon_io.zip
# macOS
.DS_Store
# local temp workspace
.tmp/
public/__ops/health.json

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",

View File

@@ -0,0 +1,8 @@
{
"accepted_resets": {
"archicrat-ia/chapitre-1/index.html": "Reset intentionnel des ancres après révision doctrinale substantielle du chapitre 1. Site neuf, sans annotations ni compatibilité descendante à préserver.",
"archicrat-ia/chapitre-2/index.html": "Reset intentionnel des ancres après restauration doctrinale substantielle du chapitre 2 depuis la bonne source officielle. Site neuf, sans annotations ni compatibilité descendante à préserver.",
"archicrat-ia/chapitre-3/index.html": "Reset intentionnel des ancres après réimport DOCX et perfectionnement doctrinal substantiel du chapitre 3 depuis la source officielle. Site neuf, sans annotations ni compatibilité descendante à préserver.",
"archicrat-ia/chapitre-4/index.html": "Reset intentionnel des ancres après réimport DOCX et stabilisation doctrinale substantielle du chapitre 4 depuis la source officielle. Site neuf, sans annotations ni compatibilité descendante à préserver."
}
}

View File

@@ -25,6 +25,19 @@ Objectif : déployer une nouvelle version du site sur le NAS (DS220+) sans jamai
➡️ Déploiement = `docs/DEPLOY_PROD_SYNOLOGY_DS220.md` (procédure détaillée, à jour).
## Mise à jour (2026-03-03) — Gate CI de déploiement (SKIP / HOTPATCH / FULL) + preuves A/B
La procédure de déploiement “vivante” est désormais pilotée par **Gitea Actions** via le workflow :
- `.gitea/workflows/deploy-staging-live.yml`
Ce workflow décide automatiquement :
- **FULL** (rebuild + restart blue + green) dès quun changement impacte le build (ex: `src/content/`, `src/pages/`, `scripts/`, `src/anchors/`, etc.)
- **HOTPATCH** (patch JSON + copie media) quand le changement ne concerne que `src/annotations/` et/ou `public/media/`
- **SKIP** sinon
Les preuves et la procédure de test reproductible A/B sont documentées dans :
➡️ `docs/runbooks/DEPLOY-BLUE-GREEN.md` → section “CI Deploy gate (merge-proof) + Tests A/B + preuve alias injection”.
## Schéma (résumé, sans commandes)
- Ne jamais toucher au slot live.

File diff suppressed because it is too large Load Diff

View File

@@ -202,4 +202,33 @@ docker compose logs --tail=200 web_blue
docker compose logs --tail=200 web_green
# Si tu veux suivre en live :
docker compose logs -f web_green
docker compose logs -f web_green
## Historique synthétique (2026-03-03) — Stabilisation CI/CD “zéro surprise”
### Problème initial observé
- Déploiement parfois lancé en “hotpatch” alors quun rebuild était nécessaire.
- Sur merge commits, la détection de fichiers modifiés pouvait être ambiguë.
- Résultat : besoin de `force=1` manuel pour éviter des incohérences.
### Correctif appliqué
- Gate CI rendu **merge-proof** :
- lecture de `BEFORE` et `AFTER` depuis `event.json`
- calcul des fichiers modifiés via `git diff --name-only BEFORE AFTER`
- Politique de décision stabilisée :
- FULL auto dès quun changement impacte build/runtime (content/pages/scripts/anchors/etc.)
- HOTPATCH auto uniquement pour annotations/media
### Preuves
- Test A (touch src/content) :
- Gate flags: HAS_FULL=1 HAS_HOTPATCH=0 → MODE=full
- Test B (touch src/annotations) :
- Gate flags: HAS_FULL=0 HAS_HOTPATCH=1 → MODE=hotpatch
### Audit post-déploiement (preuves côté NAS)
- 8081 + 8082 répondent HTTP 200
- `/para-index.json` + `/annotations-index.json` OK
- Aliases injectés visibles dans HTML via `.para-alias` quand alias présent

View File

@@ -1,51 +1,147 @@
# START-HERE — Archicratie / Édition Web (v2)
> Onboarding + exploitation “nickel chrome” (DEV → Gitea → CI → Release → Blue/Green → Edge/SSO)
# START-HERE — Archicratie / Édition Web (v3)
> Onboarding + exploitation “nickel chrome” (DEV → Gitea → CI → Release → Blue/Green → Edge/SSO → localhost auto-sync)
## 0) TL;DR (la règle dor)
- **Gitea = source canonique**.
- **main est protégé** : toute modification passe par **branche → PR → CI → merge**.
- **Le NAS nest pas la source** : si un hotfix est fait sur NAS, on **backporte** via PR immédiatement.
- **Le site est statique Astro** : la prod sert du HTML (nginx), laccès est contrôlé au niveau reverse-proxy (Traefik + Authelia).
- **Gitea = source canonique**.
- **`main` est protégée** : toute modification passe par **branche → PR → CI → merge**.
- **Le NAS nest pas la source** : si un hotfix est fait sur NAS, il doit être **backporté immédiatement** via PR.
- **Le site est statique Astro** : la prod sert du HTML via nginx ; laccès est contrôlé au niveau reverse-proxy (Traefik + Authelia).
- **Le localhost automatique nest pas le repo de dev** : il tourne depuis un **worktree dédié**, synchronisé sur `origin/main`.
---
## 1) Architecture mentale (ultra simple)
- **DEV (Mac Studio)** : édition + tests + commit + push
- **Gitea** : dépôt canon + PR + CI (CI.yaml)
- **NAS (DS220+)** : déploiement “blue/green”
- `web_blue` (staging upstream) → `127.0.0.1:8081`
- `web_green` (live upstream)`127.0.0.1:8082`
- **Edge (Traefik)** : route les hosts
- **DEV canonique (Mac Studio)** : édition, dev, tests, commits, pushes
- **Gitea** : dépôt canonique, PR, CI, workflows éditoriaux
- **NAS (DS220+)** : déploiement blue/green
- `web_blue` → staging upstream → `127.0.0.1:8081`
- `web_green` → live upstream → `127.0.0.1:8082`
- **Edge (Traefik)** : routage des hosts
- `staging.archicratie...` → 8081
- `archicratie...` → 8082
- **Authelia** devant, via middleware `chain-auth@file`
- **Localhost auto-sync**
- un **repo canonique de développement**
- un **worktree localhost miroir de `origin/main`**
- un **agent de sync**
- un **agent Astro**
---
## 2) Répertoires & conventions (repo)
### 2.1 Contenu canon (édition)
- `src/content/**` : contenu MD / MDX canon (Astro content collections)
- `src/pages/**` : routes Astro (index, [...slug], etc.)
- `src/components/**` : composants UI (SiteNav, TOC, SidePanel, etc.)
- `src/layouts/**` : layouts (EditionLayout, SiteLayout)
- `src/content/**` : contenu MD / MDX canon
- `src/pages/**` : routes Astro
- `src/components/**` : composants UI
- `src/layouts/**` : layouts
- `src/styles/**` : CSS global
### 2.2 Annotations (pré-Édition “tickets”)
- `src/annotations/<workKey>/<slug>.yml`
- Exemple : `src/annotations/archicrat-ia/prologue.yml`
- Objectif : stocker “Références / Médias / Commentaires” par page et par paragraphe (`p-...`).
- Exemple :
`src/annotations/archicrat-ia/prologue.yml`
Objectif :
stocker “Références / Médias / Commentaires” par page et par paragraphe (`p-...`).
### 2.3 Scripts (tooling / build)
- `scripts/inject-anchor-aliases.mjs` : injection aliases dans dist
- `scripts/dedupe-ids-dist.mjs` : retire IDs dupliqués dans dist
- `scripts/build-para-index.mjs` : index paragraphes (postbuild / predev)
- `scripts/build-annotations-index.mjs` : index annotations (postbuild / predev)
- `scripts/check-anchors.mjs` : contrat stabilité dancres (CI)
- `scripts/inject-anchor-aliases.mjs` : injection aliases dans `dist`
- `scripts/dedupe-ids-dist.mjs` : retrait IDs dupliqués
- `scripts/build-para-index.mjs` : index paragraphes
- `scripts/build-annotations-index.mjs` : index annotations
- `scripts/check-anchors.mjs` : contrat stabilité dancres
- `scripts/check-annotations*.mjs` : sanity YAML + médias
> Important : les scripts sont **partie intégrante** de la stabilité (IDs/ancres/indexation).
> On évite “la magie” : tout est scripté + vérifié.
> Important : ces scripts ne sont pas accessoires.
> Ils font partie du contrat de stabilité éditoriale.
## 3) Workflow Git “pro” (main protégé)
### 3.1 Cycle standard (toute modif)
en bash :
---
## 3) Les trois espaces à ne jamais confondre
### 3.1 Repo canonique de développement
```text
/Volumes/FunIA/dev/archicratie-edition/site
```
Usage :
- développement normal
- branches de travail
- nouvelles fonctionnalités
- corrections manuelles
- commits
- pushes
- PR
### 3.2 Worktree localhost miroir de `main`
```text
/Users/s-funia/ops-local/archicratie/localhost-worktree
```
Branche attendue :
```text
localhost-sync
```
Usage :
- exécuter le localhost automatique
- refléter `origin/main`
- ne jamais servir despace de développement
### 3.3 Ops local hors repo
```text
/Users/s-funia/ops-local/archicratie
```
Usage :
- scripts dexploitation
- état
- logs
- automatisation `launchd`
---
## 4) Pourquoi cette séparation existe
Il ne faut pas utiliser le repo canonique de développement comme serveur localhost permanent.
Sinon on mélange :
- travail en cours
- commits non poussés
- essais temporaires
- état réellement publié sur `main`
Le résultat devient ambigu.
La séparation retenue est donc :
- **repo canonique** = espace de développement
- **worktree localhost** = miroir exécutable de `origin/main`
- **ops local** = scripts et automatisation
Cest cette séparation qui rend le système lisible, robuste et opérable.
---
## 5) Workflow Git “pro” (main protégée)
### 5.1 Cycle standard (toute modif)
```bash
git checkout main
git pull --ff-only
@@ -60,37 +156,48 @@ npm run test:anchors
git add -A
git commit -m "xxx: description claire"
git push -u origin "$BR"
```
### 3.2 PR vers main
### 5.2 PR vers `main`
Ouvrir PR dans Gitea
- ouvrir une PR dans Gitea
- attendre une CI verte
- merger
- laisser les workflows faire le reste
CI doit être verte
### 5.3 Cas spécial : hotfix prod (NAS)
Merge PR → main
On peut faire un hotfix durgence côté NAS si nécessaire.
### 3.3 Cas spécial : hotfix prod (NAS)
Mais létat final doit toujours revenir dans Gitea :
On peut faire un hotfix “urgence” en prod/staging si nécessaire…
- branche
- PR
- CI
- merge
MAIS : létat final doit revenir dans Gitea : branche → PR → CI → merge.
---
## 4) Déploiement (NAS) — principe
### 4.1 Release pack
## 6) Déploiement (NAS) — principe
On génère un pack “reproductible” (source + config + scripts) puis on déploie.
### 6.1 Release pack
### 4.2 Blue/Green
On génère un pack reproductible, puis on déploie.
web_blue = staging upstream (8081)
### 6.2 Blue/Green
web_green = live upstream (8082)
- `web_blue` = staging (`8081`)
- `web_green` = live (`8082`)
Edge Traefik sélectionne quel host pointe vers quel upstream.
Le reverse-proxy choisit lupstream selon le host demandé.
## 5) Check-list “≤ 10 commandes” (happy path complet)
### 5.1 DEV (Mac)
---
## 7) Happy path complet
### 7.1 DEV (Mac)
```bash
git checkout main && git pull --ff-only
git checkout -b chore/my-change-$(date +%Y%m%d)
@@ -99,55 +206,258 @@ rm -rf .astro node_modules/.vite dist
npm run build
npm run test:anchors
npm run dev
```
### 5.2 Push + PR
### 7.2 Push + PR
```bash
git add -A
git commit -m "chore: my change"
git push -u origin chore/my-change-YYYYMMDD
# ouvrir PR dans Gitea
```
### 5.3 Déploiement NAS (résumé)
Puis ouvrir la PR dans Gitea.
Voir docs/runbooks/DEPLOY-BLUE-GREEN.md.
### 7.3 Déploiement NAS
## 6) Problèmes “classiques” + diagnostic rapide
### 6.1 “Le staging ne ressemble pas au local”
Voir :
# Comparer upstream direct 8081 vs 8082 :
```text
docs/runbooks/DEPLOY-BLUE-GREEN.md
```
---
## 8) Localhost auto-sync — ce quil faut retenir
Le localhost automatique sert à voir **la vérité de `main`**, pas à développer du neuf.
### 8.1 Scripts principaux
#### Script de sync
```text
~/ops-local/archicratie/auto-sync-localhost.sh
```
Rôle :
- fetch `origin/main`
- réaligner le worktree localhost
- lancer `npm ci` si besoin
- redéclencher lagent Astro si nécessaire
#### Script Astro
```text
~/ops-local/archicratie/run-astro-localhost.sh
```
Rôle :
- lancer `astro dev`
- depuis le bon worktree
- avec le bon runtime Node
- sur `127.0.0.1:4321`
> Oui : ce script est nécessaire.
> Il isole proprement le lancement du serveur Astro dans un contexte `launchd` stable.
### 8.2 LaunchAgents
#### Agent sync
```text
~/Library/LaunchAgents/me.archicratie.localhost-sync.plist
```
#### Agent Astro
```text
~/Library/LaunchAgents/me.archicratie.localhost-astro.plist
```
### 8.3 Document de référence
Pour tout le détail dexploitation du localhost automatique, lire :
```text
docs/OPS-LOCALHOST-AUTO-SYNC.md
```
---
## 9) Règle dor : il y a deux usages locaux distincts
### 9.1 Voir ce qui est réellement sur `main`
Utiliser :
```text
http://127.0.0.1:4321
```
Ce localhost doit être considéré comme :
**un miroir local exécutable de `origin/main`**
### 9.2 Développer / tester une nouvelle fonctionnalité
Utiliser le repo canonique :
```bash
cd /Volumes/FunIA/dev/archicratie-edition/site
npm run dev
```
Donc :
- **localhost auto-sync** = vérité de `main`
- **localhost de dev manuel** = expérimentation en cours
Il ne faut pas les confondre.
---
## 10) Ce quil ne faut pas faire
### 10.1 Ne pas développer dans le worktree localhost
Le worktree localhost est piloté automatiquement.
Il peut être :
- réaligné
- nettoyé
- redémarré
Donc :
- pas de commits dedans
- pas de dev feature dedans
- pas dexpérimentation de fond dedans
### 10.2 Ne pas utiliser le repo canonique comme miroir auto-sync
Sinon on mélange :
- espace de dev
- état publié
- serveur local permanent
### 10.3 Ne pas remettre les scripts ops sur un volume externe
Les scripts dops doivent rester sous `HOME`.
Le fait de les mettre sous `/Volumes/...` a déjà provoqué des erreurs du type :
```text
Operation not permitted
```
### 10.4 Ne pas supprimer `run-astro-localhost.sh`
Ce script fait partie de larchitecture actuelle.
Le supprimer reviendrait à réintroduire le flou entre sync Git et exécution dAstro.
---
## 11) Commandes de contrôle essentielles
### 11.1 État global
```bash
~/ops-local/archicratie/doctor-localhost.sh
```
### 11.2 État Git
```bash
git -C ~/ops-local/archicratie/localhost-worktree rev-parse HEAD
git -C /Volumes/FunIA/dev/archicratie-edition/site ls-remote origin refs/heads/main
git -C ~/ops-local/archicratie/localhost-worktree branch --show-current
```
### 11.3 État LaunchAgents
```bash
launchctl print "gui/$(id -u)/me.archicratie.localhost-sync" | sed -n '1,160p'
launchctl print "gui/$(id -u)/me.archicratie.localhost-astro" | sed -n '1,160p'
```
### 11.4 État logs
```bash
tail -n 120 ~/ops-local/archicratie/logs/auto-sync-localhost.log
tail -n 120 ~/ops-local/archicratie/logs/astro-localhost.log
tail -n 80 ~/Library/Logs/archicratie-localhost-sync.err.log
tail -n 80 ~/Library/Logs/archicratie-localhost-astro.err.log
```
### 11.5 État serveur
```bash
lsof -nP -iTCP:4321 -sTCP:LISTEN
PID="$(lsof -tiTCP:4321 -sTCP:LISTEN | head -n 1)"
ps -p "$PID" -o pid=,command=
lsof -a -p "$PID" -d cwd
```
### 11.6 Vérification contenu
```bash
curl -s http://127.0.0.1:4321/archicrat-ia/prologue/ | grep -n "taxe Zucman"
```
---
## 12) Problèmes classiques + diagnostic
### 12.1 “Le staging ne ressemble pas au local”
Comparer les upstream directs :
```bash
curl -sS http://127.0.0.1:8081/ | head -n 2
curl -sS http://127.0.0.1:8082/ | head -n 2
```
# Vérifier quel routeur edge répond (header diag) :
Vérifier le routeur edge :
```bash
curl -sSI -H 'Host: staging.archicratie.trans-hands.synology.me' http://127.0.0.1:18080/ \
| grep -iE 'HTTP/|location:|x-archi-router'
```
# Lire docs/runbooks/EDGE-TRAEFIK.md.
Voir :
### 6.2 Canonical incorrect (localhost en prod)
```text
docs/runbooks/EDGE-TRAEFIK.md
```
Cause racine : site dans Astro = PUBLIC_SITE non injecté au build.
### 12.2 Canonical incorrect
Fix canonique : voir docs/runbooks/ENV-PUBLIC_SITE.md.
Cause probable : `PUBLIC_SITE` mal injecté au build.
Test :
```bash
curl -sS http://127.0.0.1:8082/ | grep -oE 'rel="canonical" href="[^"]+"' | head -1
```
### 6.3 Contrat “anchors” en échec après migration dURL
Voir :
Quand on déplace des routes (ex: /archicratie/archicrat-ia/* → /archicrat-ia/*), le test dancres peut échouer même si les IDs nont pas changé, car les pages ont changé de chemin.
```text
docs/runbooks/ENV-PUBLIC_SITE.md
```
# Procédure safe :
### 12.3 Contrat anchors en échec après migration dURL
Backup baseline :
Procédure safe :
```bash
cp -a tests/anchors-baseline.json /tmp/anchors-baseline.json.bak.$(date +%F-%H%M%S)
Mettre à jour les clés (chemins) sans toucher aux IDs :
node - <<'NODE'
import fs from 'fs';
const p='tests/anchors-baseline.json';
@@ -161,16 +471,213 @@ fs.writeFileSync(p, JSON.stringify(out,null,2)+'\n');
console.log('updated keys:', Object.keys(j).length, '->', Object.keys(out).length);
NODE
Re-run :
npm run test:anchors
```
## 7) Ce que létape 9 doit faire (orientation)
### 12.4 “Le localhost auto-sync ne montre pas les dernières modifs”
Stabiliser le pipeline “tickets → YAML annotations”
Commande réflexe :
Formaliser la spec YAML + merge + anti-doublon (voir docs/EDITORIAL-ANNOTATIONS-SPEC.md)
```bash
~/ops-local/archicratie/doctor-localhost.sh
```
Durcir lonboarding (ce START-HERE + runbooks)
Puis :
Éviter les régressions par tests (anchors / annotations / smoke)
```bash
git -C ~/ops-local/archicratie/localhost-worktree rev-parse HEAD
git -C /Volumes/FunIA/dev/archicratie-edition/site ls-remote origin refs/heads/main
```
Si les SHA diffèrent :
- le sync na pas tourné
- ou lagent sync a un problème
### 12.5 “Le SHA est bon mais le contenu web est faux”
Vérifier quel Astro écoute réellement :
```bash
lsof -nP -iTCP:4321 -sTCP:LISTEN
PID="$(lsof -tiTCP:4321 -sTCP:LISTEN | head -n 1)"
ps -p "$PID" -o pid=,command=
lsof -a -p "$PID" -d cwd
```
Attendu :
- commande contenant `astro dev`
- cwd = `~/ops-local/archicratie/localhost-worktree`
### 12.6 Erreur `EBADENGINE`
Cause probable :
- Node 23 utilisé au lieu de Node 22
Résolution :
- forcer `node@22` dans les scripts et les LaunchAgents
### 12.7 Erreur `Operation not permitted`
Cause probable :
- scripts dops placés sous `/Volumes/...`
Résolution :
- garder les scripts sous :
```text
~/ops-local/archicratie
```
### 12.8 Erreur `EPERM` sur `astro.mjs`
Cause probable :
- ancien worktree sur volume externe
- ancien chemin résiduel
- Astro lancé depuis un mauvais emplacement
Résolution :
- worktree localhost sous :
```text
~/ops-local/archicratie/localhost-worktree
```
- scripts cohérents avec ce chemin
- réinstallation propre via :
```bash
~/ops-local/archicratie/install-localhost-sync.sh
```
---
## 13) Redémarrage machine
Après reboot, le comportement attendu est :
1. le LaunchAgent sync se recharge
2. le LaunchAgent Astro se recharge
3. le worktree localhost est réaligné
4. Astro redémarre sur `127.0.0.1:4321`
### Vérification rapide après reboot
```bash
~/ops-local/archicratie/doctor-localhost.sh
```
Si nécessaire :
```bash
~/ops-local/archicratie/install-localhost-sync.sh
```
---
## 14) Procédure de secours manuelle
### Forcer un sync
```bash
~/ops-local/archicratie/auto-sync-localhost.sh
```
### Réinstaller proprement le dispositif local
```bash
~/ops-local/archicratie/install-localhost-sync.sh
```
### Diagnostic complet
```bash
~/ops-local/archicratie/doctor-localhost.sh
```
---
## 15) Décision dexploitation finale
La politique retenue est la suivante :
- **repo canonique** = espace de développement
- **worktree localhost** = miroir automatique de `main`
- **ops sous HOME** = scripts, logs, automation
- **LaunchAgent sync** = réalignement Git
- **LaunchAgent Astro** = exécution stable du serveur local
- **Astro local** = lancé uniquement depuis le worktree localhost
Cette séparation rend le dispositif plus :
- lisible
- robuste
- opérable
- antifragile
---
## 16) Résumé opératoire
### Pour voir la vérité de `main`
Ouvrir :
```text
http://127.0.0.1:4321
```
Le serveur doit provenir de :
```text
/Users/s-funia/ops-local/archicratie/localhost-worktree
```
### Pour développer
Travailler dans :
```text
/Volumes/FunIA/dev/archicratie-edition/site
```
avec les commandes habituelles.
### Pour réparer vite
```bash
~/ops-local/archicratie/doctor-localhost.sh
~/ops-local/archicratie/auto-sync-localhost.sh
```
---
## 17) Mémoire courte
Si un jour plus rien nest clair, repartir de ces commandes :
```bash
~/ops-local/archicratie/doctor-localhost.sh
git -C ~/ops-local/archicratie/localhost-worktree rev-parse HEAD
git -C /Volumes/FunIA/dev/archicratie-edition/site ls-remote origin refs/heads/main
lsof -nP -iTCP:4321 -sTCP:LISTEN
```
Puis lire :
```bash
tail -n 120 ~/ops-local/archicratie/logs/auto-sync-localhost.log
tail -n 120 ~/ops-local/archicratie/logs/astro-localhost.log
```
---
## 18) Statut actuel visé
Quand tout fonctionne correctement :
- le worktree localhost pointe sur le même SHA que `origin/main`
- `astro dev` écoute sur `127.0.0.1:4321`
- son cwd est `~/ops-local/archicratie/localhost-worktree`
- le contenu servi correspond au contenu mergé sur `main`
Cest létat de référence à préserver.

View File

@@ -199,4 +199,348 @@ Ne jamais modifier dist/ “à la main” sur NAS.
Si un hotfix prod est indispensable : documenter et backporter via PR Gitea.
Le canonical dépend du build : PUBLIC_SITE doit être injecté (voir runbook ENV-PUBLIC_SITE).
Le canonical dépend du build : PUBLIC_SITE doit être injecté (voir runbook ENV-PUBLIC_SITE).
## 10) CI Deploy (Gitea Actions) — Gate SKIP / HOTPATCH / FULL (merge-proof) + preuves
Cette section documente le comportement **canonique** du workflow :
- `.gitea/workflows/deploy-staging-live.yml`
Objectif : **zéro surprise**.
On ne veut plus “penser à force=1”.
Le gate doit décider automatiquement, y compris sur des **merge commits**.
### 10.1 — Principe (ce que fait réellement le gate)
Le job `deploy` calcule les fichiers modifiés entre :
- `BEFORE` = commit précédent (avant le push sur main)
- `AFTER` = commit actuel (après le push / merge sur main)
Puis il classe le déploiement dans un mode :
- **MODE=full**
- rebuild image + restart `archicratie-web-blue` (8081) + `archicratie-web-green` (8082)
- warmup endpoints (para-index, annotations-index, pagefind.js)
- vérification canonical staging + live
- **MODE=hotpatch**
- rebuild dun `annotations-index.json` consolidé depuis `src/annotations/**`
- patch direct dans les conteneurs en cours dexécution (blue+green)
- copie des médias modifiés `public/media/**` vers `/usr/share/nginx/html/media/**`
- smoke sur `/annotations-index.json` des deux ports
- **MODE=skip**
- pas de déploiement (on évite le bruit)
⚠️ Important : le mode “hotpatch” **ne rebuild pas** Astro.
Donc toute modification de contenu, routes, scripts, anchors, etc. doit déclencher **full**.
### 10.2 — Matrice de décision (règles officielles)
Le gate définit deux flags :
- `HAS_FULL=1` si changement “build-impacting”
- `HAS_HOTPATCH=1` si changement “annotations/media only”
Règle de priorité :
1) Si `HAS_FULL=1`**MODE=full**
2) Sinon si `HAS_HOTPATCH=1`**MODE=hotpatch**
3) Sinon → **MODE=skip**
#### 10.2.1 — Changements qui déclenchent FULL (build-impacting)
Exemples typiques (non exhaustif, mais on couvre le cœur) :
- `src/content/**` (contenu MD/MDX)
- `src/pages/**` (routes Astro)
- `src/anchors/**` (aliases dancres)
- `scripts/**` (tooling postbuild : injection, index, tests)
- `src/layouts/**`, `src/components/**`, `src/styles/**` (rendu et scripts inline)
- `astro.config.mjs`, `package.json`, `package-lock.json`
- `Dockerfile`, `docker-compose.yml`, `nginx.conf`
- `.gitea/workflows/**` (changement infra CI/CD)
=> On veut **full** pour garantir cohérence et éviter “site partiellement mis à jour”.
#### 10.2.2 — Changements qui déclenchent HOTPATCH (sans rebuild)
Uniquement :
- `src/annotations/**` (shards YAML)
- `public/media/**` (assets média)
=> On veut hotpatch pour vitesse et éviter rebuild NAS.
### 10.3 — “Merge-proof” : pourquoi on ne lit PAS seulement `git show $SHA`
Sur un merge commit, `git show --name-only $SHA` peut être trompeur selon le contexte.
La méthode robuste est :
- utiliser `event.json` (Gitea Actions) pour récupérer `before` et `after`
- calculer `git diff --name-only BEFORE AFTER`
Cest ce qui rend le gate **merge-proof**.
### 10.4 — Tests de preuve A/B (reproductibles)
Ces tests valident le gate sans ambiguïté.
But : vérifier que le mode choisi est EXACTEMENT celui attendu.
#### Test A — toucher `src/content/...` (FULL auto)
1) Créer une branche test
2) Modifier 1 fichier dans `src/content/` (ex : ajouter une ligne de commentaire non destructive)
3) PR → merge dans `main`
4) Vérifier dans `deploy-staging-live.yml` :
Attendus :
- `Gate flags: HAS_FULL=1 HAS_HOTPATCH=0`
- `✅ build-impacting change -> MODE=full (rebuild+restart)`
- Les étapes FULL (blue puis green) sexécutent réellement
#### Test B — toucher `src/annotations/...` uniquement (HOTPATCH auto)
1) Créer une branche test
2) Modifier 1 fichier sous `src/annotations/**` (ex: un champ comment, ts, etc.)
3) PR → merge dans `main`
4) Vérifier dans `deploy-staging-live.yml` :
Attendus :
- `Gate flags: HAS_FULL=0 HAS_HOTPATCH=1`
- `✅ annotations/media change -> MODE=hotpatch`
- Les étapes FULL sont “skip” (durée 0s)
- Létape HOTPATCH sexécute réellement
### 10.5 — Preuve opérationnelle côté NAS (2 URLs + 2 commandes)
But : prouver que staging+live servent bien les endpoints essentiels (et que le déploiement na pas “fait semblant”).
#### 10.5.1 — Deux URLs à vérifier (staging et live)
- Staging (blue) : `http://127.0.0.1:8081/`
- Live (green) : `http://127.0.0.1:8082/`
#### 10.5.2 — Deux commandes minimales (zéro débat)
```bash
curl -fsSI http://127.0.0.1:8081/ | head -n 1
curl -fsSI http://127.0.0.1:8082/ | head -n 1
---
## 10) CI Deploy (Gitea Actions) — Gate SKIP / HOTPATCH / FULL (merge-proof) + preuves
Cette section documente le comportement **canonique** du workflow :
- `.gitea/workflows/deploy-staging-live.yml`
Objectif : **zéro surprise**.
On ne veut plus “penser à force=1”.
Le gate doit décider automatiquement, y compris sur des **merge commits**.
### 10.1 — Principe (ce que fait réellement le gate)
Le job `deploy` calcule les fichiers modifiés entre :
- `BEFORE` = commit précédent (avant le push sur main)
- `AFTER` = commit actuel (après le push / merge sur main)
Puis il classe le déploiement dans un mode :
- **MODE=full**
- rebuild image + restart `archicratie-web-blue` (8081) + `archicratie-web-green` (8082)
- warmup endpoints (para-index, annotations-index, pagefind.js)
- vérification canonical staging + live
- **MODE=hotpatch**
- rebuild dun `annotations-index.json` consolidé depuis `src/annotations/**`
- patch direct dans les conteneurs en cours dexécution (blue+green)
- copie des médias modifiés `public/media/**` vers `/usr/share/nginx/html/media/**`
- smoke sur `/annotations-index.json` des deux ports
- **MODE=skip**
- pas de déploiement (on évite le bruit)
⚠️ Important : le mode “hotpatch” **ne rebuild pas** Astro.
Donc toute modification de contenu, routes, scripts, anchors, etc. doit déclencher **full**.
### 10.2 — Matrice de décision (règles officielles)
Le gate définit deux flags :
- `HAS_FULL=1` si changement “build-impacting”
- `HAS_HOTPATCH=1` si changement “annotations/media only”
Règle de priorité :
1) Si `HAS_FULL=1` → **MODE=full**
2) Sinon si `HAS_HOTPATCH=1` → **MODE=hotpatch**
3) Sinon → **MODE=skip**
#### 10.2.1 — Changements qui déclenchent FULL (build-impacting)
Exemples typiques (non exhaustif, mais on couvre le cœur) :
- `src/content/**` (contenu MD/MDX)
- `src/pages/**` (routes Astro)
- `src/anchors/**` (aliases dancres)
- `scripts/**` (tooling postbuild : injection, index, tests)
- `src/layouts/**`, `src/components/**`, `src/styles/**` (rendu et scripts inline)
- `astro.config.mjs`, `package.json`, `package-lock.json`
- `Dockerfile`, `docker-compose.yml`, `nginx.conf`
- `.gitea/workflows/**` (changement infra CI/CD)
=> On veut **full** pour garantir cohérence et éviter “site partiellement mis à jour”.
#### 10.2.2 — Changements qui déclenchent HOTPATCH (sans rebuild)
Uniquement :
- `src/annotations/**` (shards YAML)
- `public/media/**` (assets média)
=> On veut hotpatch pour vitesse et éviter rebuild NAS.
### 10.3 — “Merge-proof” : pourquoi on ne lit PAS seulement `git show $SHA`
Sur un merge commit, `git show --name-only $SHA` peut être trompeur selon le contexte.
La méthode robuste est :
- utiliser `event.json` (Gitea Actions) pour récupérer `before` et `after`
- calculer `git diff --name-only BEFORE AFTER`
Cest ce qui rend le gate **merge-proof**.
### 10.4 — Tests de preuve A/B (reproductibles)
Ces tests valident le gate sans ambiguïté.
But : vérifier que le mode choisi est EXACTEMENT celui attendu.
#### Test A — toucher `src/content/...` (FULL auto)
1) Créer une branche test
2) Modifier 1 fichier dans `src/content/` (ex : ajouter une ligne de commentaire non destructive)
3) PR → merge dans `main`
4) Vérifier dans `deploy-staging-live.yml` :
Attendus :
- `Gate flags: HAS_FULL=1 HAS_HOTPATCH=0`
- `✅ build-impacting change -> MODE=full (rebuild+restart)`
- Les étapes FULL (blue puis green) sexécutent réellement
#### Test B — toucher `src/annotations/...` uniquement (HOTPATCH auto)
1) Créer une branche test
2) Modifier 1 fichier sous `src/annotations/**` (ex: un champ comment, ts, etc.)
3) PR → merge dans `main`
4) Vérifier dans `deploy-staging-live.yml` :
Attendus :
- `Gate flags: HAS_FULL=0 HAS_HOTPATCH=1`
- `✅ annotations/media change -> MODE=hotpatch`
- Les étapes FULL sont “skip” (durée 0s)
- Létape HOTPATCH sexécute réellement
### 10.5 — Preuve opérationnelle côté NAS (2 URLs + 2 commandes)
But : prouver que staging+live servent bien les endpoints essentiels (et que le déploiement na pas “fait semblant”).
#### 10.5.1 — Deux URLs à vérifier (staging et live)
- Staging (blue) : `http://127.0.0.1:8081/`
- Live (green) : `http://127.0.0.1:8082/`
#### 10.5.2 — Deux commandes minimales (zéro débat)
en bash :
curl -fsSI http://127.0.0.1:8081/ | head -n 1
curl -fsSI http://127.0.0.1:8082/ | head -n 1
Attendu : HTTP/1.1 200 OK des deux côtés.
10.6 — Preuve “alias injection” (ancre ancienne → nouvelle) sur une page
Contexte : lorsquun paragraphe change (ex: ticket “Proposer” appliqué),
lID de paragraphe peut changer, mais on doit préserver les liens anciens via :
src/anchors/anchor-aliases.json
injection build-time dans dist (span .para-alias)
10.6.1 — Check rapide (staging + live)
Remplacer OLD/NEW par tes ids réels :
Attendu : HTTP/1.1 200 OK des deux côtés.
10.6 — Preuve “alias injection” (ancre ancienne → nouvelle) sur une page
Contexte : lorsquun paragraphe change (ex: ticket “Proposer” appliqué),
lID de paragraphe peut changer, mais on doit préserver les liens anciens via :
src/anchors/anchor-aliases.json
injection build-time dans dist (span .para-alias)
10.6.1 — Check rapide (staging + live)
Remplacer OLD/NEW par tes ids réels :
OLD="p-1-60c7ea48"
NEW="p-1-a21087b0"
for P in 8081 8082; do
echo "=== $P ==="
HTML="$(curl -fsS "http://127.0.0.1:${P}/archicrat-ia/chapitre-3/" | tr -d '\r')"
echo "OLD count: $(printf '%s' "$HTML" | grep -o "$OLD" | wc -l | tr -d ' ')"
echo "NEW count: $(printf '%s' "$HTML" | grep -o "$NEW" | wc -l | tr -d ' ')"
printf '%s\n' "$HTML" | grep -nE "$OLD|$NEW|class=\"para-alias\"" | head -n 40 || true
done
Attendu :
présence dun alias : <span id="$OLD" class="para-alias"...>
présence du nouveau paragraphe : <p id="$NEW">...
10.6.2 — Check “lien ancien ne casse pas” (HTTP 200)
for P in 8081 8082; do
curl -fsSI "http://127.0.0.1:${P}/archicrat-ia/chapitre-3/#${OLD}" | head -n 1
done
Attendu : HTTP/1.1 200 OK et navigation fonctionnelle côté navigateur.
10.7 — Troubleshooting gate (symptômes typiques)
Symptom 1 : job bloqué “Set up job” très longtemps
Causes fréquentes :
runner indisponible / capacity saturée
runner ne récupère pas les tâches (fetch_timeout trop court + réseau instable)
erreur dans “Gate — decide …” qui casse bash (et donne limpression dun hang)
Commandes NAS (diagnostic rapide) :
docker ps --format 'table {{.Names}}\t{{.Status}}\t{{.Image}}' | grep -E 'gitea-act-runner|registry|archicratie-web'
docker logs --since 30m --tail 400 gitea-act-runner | tail -n 200
Symptom 2 : conditional binary operator expected
Cause :
test bash du type [[ "$X" == "1" && "$Y" == "2" ]] mal formé
variable vide non quotée
usage dun opérateur non supporté dans la shell effective
Fix :
set -euo pipefail
toujours quoter : [[ "${VAR:-}" == "..." ]]
logguer BEFORE/AFTER/FORCE et sassurer quils ne sont pas vides
Symptom 3 : le gate liste “trop de fichiers” alors quon a changé 1 seul fichier
Cause :
comparaison faite sur le mauvais range (ex: git show sur merge, ou mauvais parent)
Fix :
toujours utiliser git diff --name-only "$BEFORE" "$AFTER" (merge-proof)
confirmer dans le log : Gate ctx: BEFORE=... AFTER=...

View File

@@ -1,84 +0,0 @@
#!/usr/bin/env bash
set -euo pipefail
CTX="${1:-/volume2/docker/archicratie-web/current}"
EDGE_PORT="${EDGE_PORT:-18080}"
STAGING_HOST="${STAGING_HOST:-staging.archicratie.trans-hands.synology.me}"
LIVE_HOST="${LIVE_HOST:-archicratie.trans-hands.synology.me}"
BLUE_CNAME="${BLUE_CNAME:-archicratie-web-blue}"
GREEN_CNAME="${GREEN_CNAME:-archicratie-web-green}"
BLUE_UPSTREAM="${BLUE_UPSTREAM:-8081}"
GREEN_UPSTREAM="${GREEN_UPSTREAM:-8082}"
echo "== Archicratie diagnostic =="
echo "CTX=$CTX"
echo "EDGE_PORT=$EDGE_PORT"
echo "STAGING_HOST=$STAGING_HOST"
echo "LIVE_HOST=$LIVE_HOST"
echo "BLUE_CNAME=$BLUE_CNAME BLUE_UPSTREAM=$BLUE_UPSTREAM"
echo "GREEN_CNAME=$GREEN_CNAME GREEN_UPSTREAM=$GREEN_UPSTREAM"
echo
echo "== 1) Containers status (docker ps) =="
sudo docker ps --filter name=archicratie-web --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}"
echo
echo "== 2) Port bindings (source de vérité: docker port) =="
echo "-- $BLUE_CNAME --"
sudo docker port "$BLUE_CNAME" 80 || true
echo "-- $GREEN_CNAME --"
sudo docker port "$GREEN_CNAME" 80 || true
echo
echo "== 3) Canonical upstream direct (8081/8082) =="
for p in "$BLUE_UPSTREAM" "$GREEN_UPSTREAM"; do
echo "-- 127.0.0.1:$p --"
curl -fsS "http://127.0.0.1:$p/" \
| grep -oE 'rel="canonical" href="[^"]+"' \
| head -n 1 || echo "WARN: canonical not found"
done
echo
echo "== 4) Edge routing proof (HEAD via Host header) =="
echo "-- staging via edge --"
curl -sSI -H "Host: $STAGING_HOST" "http://127.0.0.1:$EDGE_PORT/" \
| grep -iE 'HTTP/|location:|x-archi-router|x-archi-route' \
| head -n 30 || true
echo
echo "-- live via edge --"
curl -sSI -H "Host: $LIVE_HOST" "http://127.0.0.1:$EDGE_PORT/" \
| grep -iE 'HTTP/|location:|x-archi-router|x-archi-route' \
| head -n 30 || true
echo
echo "== 5) Traefik errors last 5m (hard fail only) =="
if sudo docker logs edge-traefik --since 5m | grep -Ei 'level=error|middleware .* does not exist|yaml' >/dev/null; then
echo "❌ FOUND traefik errors:"
sudo docker logs edge-traefik --since 5m | grep -Ei 'level=error|middleware .* does not exist|yaml' | tail -n 200
exit 2
else
echo "✅ OK: pas d'erreur critique traefik (5m)"
fi
echo
echo "== 6) Quick expectations (soft checks) =="
BLUE_BIND="$(sudo docker port "$BLUE_CNAME" 80 2>/dev/null || true)"
GREEN_BIND="$(sudo docker port "$GREEN_CNAME" 80 2>/dev/null || true)"
if echo "$BLUE_BIND" | grep -q "127.0.0.1:$BLUE_UPSTREAM"; then
echo "✅ BLUE binding OK: $BLUE_BIND"
else
echo "⚠️ BLUE binding unexpected: $BLUE_BIND"
fi
if echo "$GREEN_BIND" | grep -q "127.0.0.1:$GREEN_UPSTREAM"; then
echo "✅ GREEN binding OK: $GREEN_BIND"
else
echo "⚠️ GREEN binding unexpected: $GREEN_BIND"
fi
echo
echo "✅ Diagnostic complete."

1330
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@@ -4,35 +4,33 @@
"version": "0.0.1",
"private": true,
"scripts": {
"dev": "astro dev",
"dev": "node scripts/write-dev-whoami.mjs && astro dev",
"preview": "astro preview",
"astro": "astro",
"clean": "rm -rf dist",
"build": "astro build",
"build:clean": "npm run clean && npm run build",
"postbuild": "node scripts/inject-anchor-aliases.mjs && node scripts/dedupe-ids-dist.mjs && npx pagefind --site dist",
"build:search": "pagefind --site dist",
"postbuild": "node scripts/inject-anchor-aliases.mjs && node scripts/dedupe-ids-dist.mjs && node scripts/build-para-index.mjs && node scripts/build-annotations-index.mjs && node scripts/purge-dist-dev-whoami.mjs && npm run build:search",
"import": "node scripts/import-docx.mjs",
"apply:ticket": "node scripts/apply-ticket.mjs",
"audit:dist": "node scripts/audit-dist.mjs",
"build:para-index": "node scripts/build-para-index.mjs",
"build:annotations-index": "node scripts/build-annotations-index.mjs",
"test:aliases": "node scripts/check-anchor-aliases.mjs",
"test:anchors": "node scripts/check-anchors.mjs",
"test:anchors:update": "node scripts/check-anchors.mjs --update",
"test": "npm run test:aliases && npm run build:clean && npm run audit:dist && node scripts/verify-anchor-aliases-in-dist.mjs && npm run test:anchors && node scripts/check-inline-js.mjs",
"test:annotations": "node scripts/check-annotations.mjs",
"test:annotations:media": "node scripts/check-annotations-media.mjs",
"test": "npm run test:aliases && npm run build:clean && npm run audit:dist && node scripts/verify-anchor-aliases-in-dist.mjs && npm run test:anchors && npm run test:annotations && npm run test:annotations:media && node scripts/check-inline-js.mjs",
"ci": "CI=1 npm test"
},
"dependencies": {
"@astrojs/mdx": "^4.3.13",
"astro": "^5.16.11"
"@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 +1 @@
{"name":"","short_name":"","icons":[{"src":"/android-chrome-192x192.png","sizes":"192x192","type":"image/png"},{"src":"/android-chrome-512x512.png","sizes":"512x512","type":"image/png"}],"theme_color":"#ffffff","background_color":"#ffffff","display":"standalone"}
{"name":"","short_name":"","icons":[{"src":"/android-chrome-192x192.png","sizes":"192x192","type":"image/png"},{"src":"/android-chrome-512x512.png","sizes":"512x512","type":"image/png"}],"theme_color":"#ffffff","background_color":"#ffffff","display":"standalone","orientation":"any"}

View File

@@ -0,0 +1,899 @@
#!/usr/bin/env node
// scripts/apply-annotation-ticket.mjs
//
// Applique un ticket Gitea "type/media | type/reference | type/comment" vers:
//
// ✅ src/annotations/<oeuvre>/<chapitre>/<paraId>.yml (sharding par paragraphe)
// ✅ public/media/<oeuvre>/<chapitre>/<paraId>/<file>
//
// Compat rétro : lit (si présent) l'ancien monolithe:
// src/annotations/<oeuvre>/<chapitre>.yml
// et deep-merge NON destructif dans le shard lors d'une nouvelle application,
// pour permettre une migration progressive sans perte.
//
// Robuste, idempotent, non destructif.
// DRY RUN si --dry-run
// Options: --dry-run --no-download --verify --strict --commit --close
//
// Env requis:
// FORGE_API = base API Gitea (LAN) ex: http://192.168.1.20:3000
// FORGE_TOKEN = PAT Gitea (repo + issues)
//
// Env optionnel:
// GITEA_OWNER / GITEA_REPO (sinon auto-détecté via git remote)
// ANNO_DIR (défaut: src/annotations)
// PUBLIC_DIR (défaut: public)
// MEDIA_ROOT (défaut URL: /media)
//
// Ticket attendu (body):
// Chemin: /archicrat-ia/chapitre-4/
// Ancre: #p-0-xxxxxxxx
// Type: type/media | type/reference | type/comment
//
// Exit codes:
// 0 ok
// 1 erreur fatale
// 2 refus (strict/verify/usage)
import fs from "node:fs/promises";
import path from "node:path";
import process from "node:process";
import { spawnSync } from "node:child_process";
import YAML from "yaml";
/* ---------------------------------- usage --------------------------------- */
function usage(exitCode = 0) {
console.log(`
apply-annotation-ticket — applique un ticket SidePanel (media/ref/comment) vers src/annotations/ (shard par paragraphe)
Usage:
node scripts/apply-annotation-ticket.mjs <issue_number> [--dry-run] [--no-download] [--verify] [--strict] [--commit] [--close]
Flags:
--dry-run : n'écrit rien (affiche un aperçu)
--no-download : n'essaie pas de télécharger les pièces jointes (media)
--verify : vérifie que (page, ancre) existent (dist/para-index.json si dispo, sinon baseline)
--strict : refuse si URL ref invalide (http/https) OU caption media vide OU verify impossible
--commit : git add + git commit (commit dans la branche courante)
--close : ferme le ticket (nécessite --commit)
Env requis:
FORGE_API = base API Gitea (LAN) ex: http://192.168.1.20:3000
FORGE_TOKEN = PAT Gitea (repo + issues)
Env optionnel:
GITEA_OWNER / GITEA_REPO (sinon auto-détecté via git remote)
ANNO_DIR (défaut: src/annotations)
PUBLIC_DIR (défaut: public)
MEDIA_ROOT (défaut URL: /media)
Exit codes:
0 ok
1 erreur fatale
2 refus (strict/verify/close sans commit / incohérence)
`);
process.exit(exitCode);
}
/* ---------------------------------- args ---------------------------------- */
const argv = process.argv.slice(2);
if (argv.length === 0 || argv.includes("--help") || argv.includes("-h")) usage(0);
const issueNum = Number(argv[0]);
if (!Number.isFinite(issueNum) || issueNum <= 0) {
console.error("❌ Numéro de ticket invalide.");
usage(2);
}
const DRY_RUN = argv.includes("--dry-run");
const NO_DOWNLOAD = argv.includes("--no-download");
const DO_VERIFY = argv.includes("--verify");
const STRICT = argv.includes("--strict");
const DO_COMMIT = argv.includes("--commit");
const DO_CLOSE = argv.includes("--close");
if (DO_CLOSE && !DO_COMMIT) {
console.error("❌ --close nécessite --commit.");
process.exit(2);
}
if (typeof fetch !== "function") {
console.error("❌ fetch() indisponible. Utilise Node 18+.");
process.exit(1);
}
/* --------------------------------- config --------------------------------- */
const CWD = process.cwd();
const ANNO_DIR = path.join(CWD, process.env.ANNO_DIR || "src", "annotations");
const PUBLIC_DIR = path.join(CWD, process.env.PUBLIC_DIR || "public");
const MEDIA_URL_ROOT = String(process.env.MEDIA_ROOT || "/media").replace(/\/+$/, "");
/* --------------------------------- helpers -------------------------------- */
function getEnv(name, fallback = "") {
return (process.env[name] ?? fallback).trim();
}
function run(cmd, args, opts = {}) {
const r = spawnSync(cmd, args, { stdio: "inherit", ...opts });
if (r.error) throw r.error;
if (r.status !== 0) throw new Error(`Command failed: ${cmd} ${args.join(" ")}`);
}
function runQuiet(cmd, args, opts = {}) {
const r = spawnSync(cmd, args, { encoding: "utf8", stdio: "pipe", ...opts });
if (r.error) throw r.error;
if (r.status !== 0) {
const out = (r.stdout || "") + (r.stderr || "");
throw new Error(`Command failed: ${cmd} ${args.join(" ")}\n${out}`);
}
return r.stdout || "";
}
async function exists(p) {
try {
await fs.access(p);
return true;
} catch {
return false;
}
}
function inferOwnerRepoFromGit() {
const r = spawnSync("git", ["remote", "get-url", "origin"], { encoding: "utf-8" });
if (r.status !== 0) return null;
const u = (r.stdout || "").trim();
const m = u.match(/[:/](?<owner>[^/]+)\/(?<repo>[^/]+?)(?:\.git)?$/);
if (!m?.groups) return null;
return { owner: m.groups.owner, repo: m.groups.repo };
}
function gitHasStagedChanges() {
const r = spawnSync("git", ["diff", "--cached", "--quiet"]);
return r.status === 1;
}
function escapeRegExp(s) {
return String(s).replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
}
function pickLine(body, key) {
const re = new RegExp(`^\\s*${escapeRegExp(key)}\\s*:\\s*([^\\n\\r]+)`, "mi");
const m = String(body || "").match(re);
return m ? m[1].trim() : "";
}
function pickSection(body, markers) {
const text = String(body || "").replace(/\r\n/g, "\n");
const idx = markers
.map((m) => ({ m, i: text.toLowerCase().indexOf(m.toLowerCase()) }))
.filter((x) => x.i >= 0)
.sort((a, b) => a.i - b.i)[0];
if (!idx) return "";
const start = idx.i + idx.m.length;
const tail = text.slice(start);
const stops = ["\n## ", "\n---", "\nJustification", "\nProposition", "\nSources"];
let end = tail.length;
for (const s of stops) {
const j = tail.toLowerCase().indexOf(s.toLowerCase());
if (j >= 0 && j < end) end = j;
}
return tail.slice(0, end).trim();
}
function normalizeChemin(chemin) {
let c = String(chemin || "").trim();
if (!c) return "";
if (!c.startsWith("/")) c = "/" + c;
if (!c.endsWith("/")) c = c + "/";
c = c.replace(/\/{2,}/g, "/");
return c;
}
function normalizePageKeyFromChemin(chemin) {
// ex: /archicrat-ia/chapitre-4/ => archicrat-ia/chapitre-4
return normalizeChemin(chemin).replace(/^\/+|\/+$/g, "");
}
function normalizeAnchorId(s) {
let a = String(s || "").trim();
if (a.startsWith("#")) a = a.slice(1);
return a;
}
function assert(cond, msg, code = 1) {
if (!cond) {
const e = new Error(msg);
e.__exitCode = code;
throw e;
}
}
function isPlainObject(x) {
return !!x && typeof x === "object" && !Array.isArray(x);
}
function paraIndexFromId(id) {
const m = String(id).match(/^p-(\d+)-/i);
return m ? Number(m[1]) : Number.NaN;
}
function isHttpUrl(u) {
try {
const x = new URL(String(u));
return x.protocol === "http:" || x.protocol === "https:";
} catch {
return false;
}
}
function stableSortByTs(arr) {
if (!Array.isArray(arr)) return;
arr.sort((a, b) => {
const ta = Date.parse(a?.ts || "") || 0;
const tb = Date.parse(b?.ts || "") || 0;
if (ta !== tb) return ta - tb;
return JSON.stringify(a).localeCompare(JSON.stringify(b));
});
}
function normPage(s) {
let x = String(s || "").trim();
if (!x) return "";
// retire origin si on a une URL complète
x = x.replace(/^https?:\/\/[^/]+/i, "");
// enlève query/hash
x = x.split("#")[0].split("?")[0];
// enlève index.html
x = x.replace(/index\.html$/i, "");
// enlève slashs de bord
x = x.replace(/^\/+/, "").replace(/\/+$/, "");
return x;
}
/* ------------------------------ para-index (verify + order) ------------------------------ */
async function loadParaOrderFromDist(pageKey) {
const distIdx = path.join(CWD, "dist", "para-index.json");
if (!(await exists(distIdx))) return null;
let j;
try {
j = JSON.parse(await fs.readFile(distIdx, "utf8"));
} catch {
return null;
}
const want = normPage(pageKey);
// Support A) { items:[{id,page,...}, ...] } (ou variantes)
const items = Array.isArray(j?.items)
? j.items
: Array.isArray(j?.index?.items)
? j.index.items
: null;
if (items) {
const ids = [];
for (const it of items) {
// page peut être dans plein de clés différentes
const pageCand = normPage(
it?.page ??
it?.pageKey ??
it?.path ??
it?.route ??
it?.href ??
it?.url ??
""
);
// id peut être dans plein de clés différentes
let id = String(it?.id ?? it?.paraId ?? it?.anchorId ?? it?.anchor ?? "");
if (id.startsWith("#")) id = id.slice(1);
if (pageCand === want && id) ids.push(id);
}
if (ids.length) return ids;
}
// Support B) { byId: { "p-...": { page:"...", ... }, ... } }
if (j?.byId && typeof j.byId === "object") {
const ids = Object.keys(j.byId)
.filter((id) => {
const meta = j.byId[id] || {};
const pageCand = normPage(meta.page ?? meta.pageKey ?? meta.path ?? meta.route ?? meta.url ?? "");
return pageCand === want;
});
if (ids.length) {
ids.sort((a, b) => {
const ia = paraIndexFromId(a);
const ib = paraIndexFromId(b);
if (Number.isFinite(ia) && Number.isFinite(ib) && ia !== ib) return ia - ib;
return String(a).localeCompare(String(b));
});
return ids;
}
}
// Support C) { pages: { "archicrat-ia/chapitre-4": { ids:[...] } } } (ou variantes)
if (j?.pages && typeof j.pages === "object") {
// essaie de trouver la bonne clé même si elle est /.../ ou .../index.html
const keys = Object.keys(j.pages);
const hit = keys.find((k) => normPage(k) === want);
if (hit) {
const pg = j.pages[hit];
if (Array.isArray(pg?.ids)) return pg.ids.map(String);
if (Array.isArray(pg?.paras)) return pg.paras.map(String);
}
}
return null;
}
async function tryVerifyAnchor(pageKey, anchorId) {
// 1) dist/para-index.json : order complet si possible
const order = await loadParaOrderFromDist(pageKey);
if (order) return order.includes(anchorId);
// 1bis) dist/para-index.json : fallback “best effort” => recherche brute (IDs quasi uniques)
const distIdx = path.join(CWD, "dist", "para-index.json");
if (await exists(distIdx)) {
try {
const raw = await fs.readFile(distIdx, "utf8");
if (raw.includes(`"${anchorId}"`) || raw.includes(`"#${anchorId}"`)) {
return true;
}
} catch {
// ignore
}
}
// 2) tests/anchors-baseline.json (fallback)
const base = path.join(CWD, "tests", "anchors-baseline.json");
if (await exists(base)) {
try {
const j = JSON.parse(await fs.readFile(base, "utf8"));
const candidates = [];
if (j?.pages && typeof j.pages === "object") {
for (const [k, v] of Object.entries(j.pages)) {
if (!Array.isArray(v)) continue;
if (normPage(k).includes(normPage(pageKey))) candidates.push(...v);
}
}
if (Array.isArray(j?.entries)) {
for (const it of j.entries) {
const p = String(it?.page || "");
const ids = it?.ids;
if (Array.isArray(ids) && normPage(p).includes(normPage(pageKey))) candidates.push(...ids);
}
}
if (candidates.length) return candidates.some((x) => String(x) === anchorId);
} catch {
// ignore
}
}
return null; // cannot verify
}
/* ----------------------------- deep merge helpers (non destructive) ----------------------------- */
function keyMedia(x) {
return String(x?.src || "");
}
function keyRef(x) {
return `${x?.url || ""}||${x?.label || ""}||${x?.kind || ""}||${x?.citation || ""}`;
}
function keyComment(x) {
return String(x?.text || "").trim();
}
function uniqUnion(dstArr, srcArr, keyFn) {
const out = Array.isArray(dstArr) ? [...dstArr] : [];
const seen = new Set(out.map((x) => keyFn(x)));
for (const it of (Array.isArray(srcArr) ? srcArr : [])) {
const k = keyFn(it);
if (!k) continue;
if (!seen.has(k)) {
seen.add(k);
out.push(it);
}
}
return out;
}
function deepMergeEntry(dst, src) {
if (!isPlainObject(dst) || !isPlainObject(src)) return;
for (const [k, v] of Object.entries(src)) {
if (k === "media" && Array.isArray(v)) {
dst.media = uniqUnion(dst.media, v, keyMedia);
continue;
}
if (k === "refs" && Array.isArray(v)) {
dst.refs = uniqUnion(dst.refs, v, keyRef);
continue;
}
if (k === "comments_editorial" && Array.isArray(v)) {
dst.comments_editorial = uniqUnion(dst.comments_editorial, v, keyComment);
continue;
}
if (isPlainObject(v)) {
if (!isPlainObject(dst[k])) dst[k] = {};
deepMergeEntry(dst[k], v);
continue;
}
if (Array.isArray(v)) {
const cur = Array.isArray(dst[k]) ? dst[k] : [];
const seen = new Set(cur.map((x) => JSON.stringify(x)));
const out = [...cur];
for (const it of v) {
const s = JSON.stringify(it);
if (!seen.has(s)) {
seen.add(s);
out.push(it);
}
}
dst[k] = out;
continue;
}
// scalar: set only if missing/empty
if (!(k in dst) || dst[k] == null || dst[k] === "") {
dst[k] = v;
}
}
}
/* ----------------------------- annotations I/O ----------------------------- */
async function loadAnnoDocYaml(fileAbs, pageKey) {
if (!(await exists(fileAbs))) {
return { schema: 1, page: pageKey, paras: {} };
}
const raw = await fs.readFile(fileAbs, "utf8");
let doc;
try {
doc = YAML.parse(raw);
} catch (e) {
throw new Error(`${path.relative(CWD, fileAbs)}: parse failed: ${String(e?.message ?? e)}`);
}
assert(isPlainObject(doc), `${path.relative(CWD, fileAbs)}: doc must be an object`, 2);
assert(doc.schema === 1, `${path.relative(CWD, fileAbs)}: schema must be 1`, 2);
assert(isPlainObject(doc.paras), `${path.relative(CWD, fileAbs)}: missing object key "paras"`, 2);
if (doc.page != null) {
const got = String(doc.page).replace(/^\/+/, "").replace(/\/+$/, "");
assert(got === pageKey, `${path.relative(CWD, fileAbs)}: page mismatch (page="${doc.page}" vs path="${pageKey}")`, 2);
} else {
doc.page = pageKey;
}
return doc;
}
function sortParasObject(paras, order) {
const keys = Object.keys(paras || {});
const idx = new Map();
if (Array.isArray(order)) order.forEach((id, i) => idx.set(String(id), i));
keys.sort((a, b) => {
const ha = idx.has(a);
const hb = idx.has(b);
if (ha && hb) return idx.get(a) - idx.get(b);
if (ha && !hb) return -1;
if (!ha && hb) return 1;
const ia = paraIndexFromId(a);
const ib = paraIndexFromId(b);
if (Number.isFinite(ia) && Number.isFinite(ib) && ia !== ib) return ia - ib;
return String(a).localeCompare(String(b));
});
const out = {};
for (const k of keys) out[k] = paras[k];
return out;
}
async function saveAnnoDocYaml(fileAbs, doc, order = null) {
await fs.mkdir(path.dirname(fileAbs), { recursive: true });
doc.paras = sortParasObject(doc.paras, order);
for (const e of Object.values(doc.paras || {})) {
if (!isPlainObject(e)) continue;
stableSortByTs(e.media);
stableSortByTs(e.refs);
stableSortByTs(e.comments_editorial);
}
const out = YAML.stringify(doc);
await fs.writeFile(fileAbs, out, "utf8");
}
/* ------------------------------ gitea helpers ------------------------------ */
function apiBaseNorm(forgeApiBase) {
return forgeApiBase.replace(/\/+$/, "");
}
async function giteaGET(url, token) {
const res = await fetch(url, {
headers: {
Authorization: `token ${token}`,
Accept: "application/json",
"User-Agent": "archicratie-apply-annotation/1.0",
},
});
if (!res.ok) {
const t = await res.text().catch(() => "");
throw new Error(`HTTP ${res.status} GET ${url}\n${t}`);
}
return await res.json();
}
async function fetchIssue({ forgeApiBase, owner, repo, token, issueNum }) {
const url = `${apiBaseNorm(forgeApiBase)}/api/v1/repos/${owner}/${repo}/issues/${issueNum}`;
return await giteaGET(url, token);
}
async function fetchIssueAssets({ forgeApiBase, owner, repo, token, issueNum }) {
// Gitea: /issues/{index}/assets
const url = `${apiBaseNorm(forgeApiBase)}/api/v1/repos/${owner}/${repo}/issues/${issueNum}/assets`;
try {
const json = await giteaGET(url, token);
return Array.isArray(json) ? json : [];
} catch {
return [];
}
}
async function postIssueComment({ forgeApiBase, owner, repo, token, issueNum, comment }) {
const url = `${apiBaseNorm(forgeApiBase)}/api/v1/repos/${owner}/${repo}/issues/${issueNum}/comments`;
const res = await fetch(url, {
method: "POST",
headers: {
Authorization: `token ${token}`,
Accept: "application/json",
"Content-Type": "application/json",
"User-Agent": "archicratie-apply-annotation/1.0",
},
body: JSON.stringify({ body: comment }),
});
if (!res.ok) {
const t = await res.text().catch(() => "");
throw new Error(`HTTP ${res.status} POST comment ${url}\n${t}`);
}
}
async function closeIssue({ forgeApiBase, owner, repo, token, issueNum, comment }) {
if (comment) await postIssueComment({ forgeApiBase, owner, repo, token, issueNum, comment });
const url = `${apiBaseNorm(forgeApiBase)}/api/v1/repos/${owner}/${repo}/issues/${issueNum}`;
const res = await fetch(url, {
method: "PATCH",
headers: {
Authorization: `token ${token}`,
Accept: "application/json",
"Content-Type": "application/json",
"User-Agent": "archicratie-apply-annotation/1.0",
},
body: JSON.stringify({ state: "closed" }),
});
if (!res.ok) {
const t = await res.text().catch(() => "");
throw new Error(`HTTP ${res.status} closing issue: ${url}\n${t}`);
}
}
/* ------------------------------ media helpers ------------------------------ */
function inferMediaTypeFromFilename(name) {
const n = String(name || "").toLowerCase();
if (/\.(png|jpe?g|webp|gif|svg)$/.test(n)) return "image";
if (/\.(mp4|webm|mov|m4v)$/.test(n)) return "video";
if (/\.(mp3|wav|ogg|m4a)$/.test(n)) return "audio";
return "link";
}
function sanitizeFilename(name) {
return String(name || "file")
.replace(/[\/\\]/g, "_")
.replace(/[^\w.\-]+/g, "_")
.replace(/_+/g, "_")
.slice(0, 180);
}
async function downloadToFile(url, token, destAbs) {
const res = await fetch(url, {
headers: {
Authorization: `token ${token}`,
"User-Agent": "archicratie-apply-annotation/1.0",
},
redirect: "follow",
});
if (!res.ok) {
const t = await res.text().catch(() => "");
throw new Error(`download failed HTTP ${res.status}: ${url}\n${t}`);
}
const buf = Buffer.from(await res.arrayBuffer());
await fs.mkdir(path.dirname(destAbs), { recursive: true });
await fs.writeFile(destAbs, buf);
return buf.length;
}
/* ------------------------------ type parsers ------------------------------ */
function parseReferenceBlock(body) {
const block =
pickSection(body, ["Référence (à compléter):", "Reference (à compléter):"]) ||
pickSection(body, ["Référence:", "Reference:"]);
const lines = String(block || "").split(/\r?\n/).map((l) => l.trim());
const get = (k) => {
const re = new RegExp(`^[-*]\\s*${escapeRegExp(k)}\\s*:\\s*(.*)$`, "i");
const m = lines.map((l) => l.match(re)).find(Boolean);
return (m?.[1] ?? "").trim();
};
return {
url: get("URL") || "",
label: get("Label") || "",
kind: get("Kind") || "",
citation: get("Citation") || get("Passage") || get("Extrait") || "",
rawBlock: block || "",
};
}
/* ----------------------------------- main ---------------------------------- */
async function main() {
const token = getEnv("FORGE_TOKEN");
assert(token, "❌ FORGE_TOKEN manquant.", 2);
const forgeApiBase = getEnv("FORGE_API") || getEnv("FORGE_BASE");
assert(forgeApiBase, "❌ FORGE_API (ou FORGE_BASE) manquant.", 2);
const inferred = inferOwnerRepoFromGit() || {};
const owner = getEnv("GITEA_OWNER", inferred.owner || "");
const repo = getEnv("GITEA_REPO", inferred.repo || "");
assert(owner && repo, "❌ Impossible de déterminer owner/repo. Fix: export GITEA_OWNER=... GITEA_REPO=...", 2);
console.log(`🔎 Fetch ticket #${issueNum} from ${owner}/${repo}`);
const issue = await fetchIssue({ forgeApiBase, owner, repo, token, issueNum });
if (issue?.pull_request) {
console.error(`❌ #${issueNum} est une Pull Request, pas un ticket annotations.`);
process.exit(2);
}
const body = String(issue.body || "").replace(/\r\n/g, "\n");
const title = String(issue.title || "");
const type = pickLine(body, "Type").toLowerCase();
const chemin = normalizeChemin(pickLine(body, "Chemin"));
const ancre = normalizeAnchorId(pickLine(body, "Ancre"));
assert(chemin, "Ticket: Chemin manquant.", 2);
assert(ancre && /^p-\d+-/i.test(ancre), `Ticket: Ancre invalide ("${ancre}")`, 2);
assert(type, "Ticket: Type manquant.", 2);
const pageKey = normalizePageKeyFromChemin(chemin);
assert(pageKey, "Ticket: impossible de dériver pageKey.", 2);
const paraOrder = DO_VERIFY ? await loadParaOrderFromDist(pageKey) : null;
if (DO_VERIFY) {
const ok = await tryVerifyAnchor(pageKey, ancre);
if (ok === false) {
throw Object.assign(new Error(`Ticket verify: ancre introuvable pour page "${pageKey}" => ${ancre}`), { __exitCode: 2 });
}
if (ok === null) {
if (STRICT) {
throw Object.assign(
new Error(`Ticket verify (strict): impossible de vérifier (pas de dist/para-index.json ou baseline)`),
{ __exitCode: 2 }
);
}
console.warn("⚠️ verify: impossible de vérifier (pas de dist/para-index.json ou baseline) — on continue.");
}
}
// ✅ shard path: src/annotations/<pageKey>/<paraId>.yml
const shardAbs = path.join(ANNO_DIR, ...pageKey.split("/"), `${ancre}.yml`);
const shardRel = path.relative(CWD, shardAbs).replace(/\\/g, "/");
// legacy monolith: src/annotations/<pageKey>.yml (read-only, for migration)
const legacyAbs = path.join(ANNO_DIR, `${pageKey}.yml`);
console.log("✅ Parsed:", { type, chemin, ancre: `#${ancre}`, pageKey, annoFile: shardRel });
// load shard doc
const doc = await loadAnnoDocYaml(shardAbs, pageKey);
if (!isPlainObject(doc.paras[ancre])) doc.paras[ancre] = {};
const entry = doc.paras[ancre];
// merge legacy entry into shard in-memory (non destructive) to keep compat + enable progressive migration
if (await exists(legacyAbs)) {
try {
const legacy = await loadAnnoDocYaml(legacyAbs, pageKey);
const legacyEntry = legacy?.paras?.[ancre];
if (isPlainObject(legacyEntry)) {
deepMergeEntry(entry, legacyEntry);
}
} catch {
// ignore legacy parse issues; shard still applies new data
}
}
const touchedFiles = [];
const notes = [];
let changed = false;
const nowIso = new Date().toISOString();
if (type === "type/comment") {
const comment = pickSection(body, ["Commentaire:", "Comment:", "Commentaires:"]) || "";
const text = comment.trim();
assert(text.length >= 3, "Ticket comment: bloc 'Commentaire:' introuvable ou trop court.", 2);
if (!Array.isArray(entry.comments_editorial)) entry.comments_editorial = [];
const item = { text, status: "new", ts: nowIso, fromIssue: issueNum };
const before = entry.comments_editorial.length;
entry.comments_editorial = uniqUnion(entry.comments_editorial, [item], keyComment);
if (entry.comments_editorial.length !== before) {
changed = true;
notes.push(`+ comment added (len=${text.length})`);
} else {
notes.push(`~ comment already present (dedup)`);
}
stableSortByTs(entry.comments_editorial);
}
else if (type === "type/reference") {
const ref = parseReferenceBlock(body);
assert(ref.url || ref.label, "Ticket reference: renseigne au moins - URL: ou - Label: dans le ticket.", 2);
if (STRICT && ref.url && !isHttpUrl(ref.url)) {
throw Object.assign(new Error(`Ticket reference (strict): URL invalide (http/https requis): "${ref.url}"`), { __exitCode: 2 });
}
if (!Array.isArray(entry.refs)) entry.refs = [];
const item = {
url: ref.url || "",
label: ref.label || (ref.url ? ref.url : "Référence"),
kind: ref.kind || "",
ts: nowIso,
fromIssue: issueNum,
};
if (ref.citation) item.citation = ref.citation;
const before = entry.refs.length;
entry.refs = uniqUnion(entry.refs, [item], keyRef);
if (entry.refs.length !== before) {
changed = true;
notes.push(`+ reference added (${item.url ? "url" : "label"})`);
} else {
notes.push(`~ reference already present (dedup)`);
}
stableSortByTs(entry.refs);
}
else if (type === "type/media") {
if (!Array.isArray(entry.media)) entry.media = [];
const caption = (title || "").trim();
if (STRICT && !caption) {
throw Object.assign(new Error("Ticket media (strict): caption vide (titre de ticket requis)."), { __exitCode: 2 });
}
const captionFinal = caption || ".";
const atts = NO_DOWNLOAD ? [] : await fetchIssueAssets({ forgeApiBase, owner, repo, token, issueNum });
if (!atts.length) notes.push("! no assets found (nothing to download).");
for (const a of atts) {
const name = sanitizeFilename(a?.name || `asset-${a?.id || "x"}`);
const dl = a?.browser_download_url || a?.download_url || "";
if (!dl) { notes.push(`! asset missing download url: ${name}`); continue; }
const mediaDirAbs = path.join(PUBLIC_DIR, "media", ...pageKey.split("/"), ancre);
const destAbs = path.join(mediaDirAbs, name);
const urlPath = `${MEDIA_URL_ROOT}/${pageKey}/${ancre}/${name}`.replace(/\/{2,}/g, "/");
if (await exists(destAbs)) {
notes.push(`~ media already exists: ${urlPath}`);
} else if (!DRY_RUN) {
const bytes = await downloadToFile(dl, token, destAbs);
notes.push(`+ downloaded ${name} (${bytes} bytes) -> ${urlPath}`);
touchedFiles.push(path.relative(CWD, destAbs).replace(/\\/g, "/"));
changed = true;
} else {
notes.push(`(dry) would download ${name} -> ${urlPath}`);
changed = true;
}
const item = {
type: inferMediaTypeFromFilename(name),
src: urlPath,
caption: captionFinal,
credit: "",
ts: nowIso,
fromIssue: issueNum,
};
const before = entry.media.length;
entry.media = uniqUnion(entry.media, [item], keyMedia);
if (entry.media.length !== before) changed = true;
}
stableSortByTs(entry.media);
}
else {
throw Object.assign(new Error(`Type non supporté: "${type}"`), { __exitCode: 2 });
}
if (!changed) {
console.log(" No changes to apply.");
for (const n of notes) console.log(" ", n);
return;
}
if (DRY_RUN) {
console.log("\n--- DRY RUN (no write) ---");
console.log(`Would update: ${shardRel}`);
for (const n of notes) console.log(" ", n);
console.log("\nExcerpt (resulting entry):");
console.log(YAML.stringify({ [ancre]: doc.paras[ancre] }).trimEnd());
console.log("\n✅ Dry-run terminé.");
return;
}
await saveAnnoDocYaml(shardAbs, doc, paraOrder);
touchedFiles.unshift(shardRel);
console.log(`✅ Updated: ${shardRel}`);
for (const n of notes) console.log(" ", n);
if (DO_COMMIT) {
run("git", ["add", ...touchedFiles], { cwd: CWD });
if (!gitHasStagedChanges()) {
console.log(" Nothing to commit (aucun changement staged).");
return;
}
const msg = `anno: apply ticket #${issueNum} (${pageKey}#${ancre} ${type})`;
run("git", ["commit", "-m", msg], { cwd: CWD });
const sha = runQuiet("git", ["rev-parse", "--short", "HEAD"], { cwd: CWD }).trim();
console.log(`✅ Committed: ${msg} (${sha})`);
if (DO_CLOSE) {
const comment = `✅ Appliqué par apply-annotation-ticket.\nCommit: ${sha}`;
await closeIssue({ forgeApiBase, owner, repo, token, issueNum, comment });
console.log(`✅ Ticket #${issueNum} fermé.`);
}
} else {
console.log("\nNext (manuel) :");
console.log(` git diff -- ${touchedFiles[0]}`);
console.log(` git add ${touchedFiles.join(" ")}`);
console.log(` git commit -m "anno: apply ticket #${issueNum} (${pageKey}#${ancre} ${type})"`);
}
}
main().catch((e) => {
const code = e?.__exitCode || 1;
console.error("💥", e?.message || e);
process.exit(code);
});

View File

@@ -9,8 +9,9 @@ import { spawnSync } from "node:child_process";
*
* Conçu pour:
* - prendre un ticket [Correction]/[Fact-check] (issue) avec Chemin + Ancre + Proposition
* - retrouver le bon paragraphe dans le .mdx
* - retrouver le bon paragraphe dans le .mdx/.md
* - remplacer proprement
* - ne JAMAIS toucher au frontmatter
* - optionnel: écrire un alias dancre old->new (build-time) dans src/anchors/anchor-aliases.json
* - optionnel: committer automatiquement
* - optionnel: fermer le ticket (après commit)
@@ -39,7 +40,7 @@ Env (recommandé):
Notes:
- Si dist/<chemin>/index.html est absent, le script lance "npm run build" sauf si --no-build.
- Sauvegarde automatique: <fichier>.bak.issue-<N> (uniquement si on écrit)
- Sauvegarde automatique: .tmp/apply-ticket/<fichier>.bak.issue-<N> (uniquement si on écrit)
- Avec --alias : le script rebuild pour identifier le NOUVEL id, puis écrit l'alias old->new.
- Refuse automatiquement les Pull Requests (PR) : ce ne sont pas des tickets éditoriaux.
`);
@@ -89,6 +90,7 @@ const CWD = process.cwd();
const CONTENT_ROOT = path.join(CWD, "src", "content");
const DIST_ROOT = path.join(CWD, "dist");
const ALIASES_FILE = path.join(CWD, "src", "anchors", "anchor-aliases.json");
const BACKUP_ROOT = path.join(CWD, ".tmp", "apply-ticket");
/* -------------------------- utils texte / matching -------------------------- */
@@ -136,31 +138,26 @@ function scoreText(candidate, targetText) {
let hit = 0;
for (const w of tgtSet) if (blkSet.has(w)) hit++;
// Bonus si un long préfixe ressemble
const tgtNorm = normalizeText(stripMd(targetText));
const blkNorm = normalizeText(stripMd(candidate));
const prefix = tgtNorm.slice(0, Math.min(180, tgtNorm.length));
const prefixBonus = prefix && blkNorm.includes(prefix) ? 1000 : 0;
// Ratio bonus (0..100)
const ratio = hit / Math.max(1, tgtSet.size);
const ratioBonus = Math.round(ratio * 100);
return prefixBonus + hit + ratioBonus;
}
function bestBlockMatchIndex(blocks, targetText) {
let best = { i: -1, score: -1 };
for (let i = 0; i < blocks.length; i++) {
const sc = scoreText(blocks[i], targetText);
if (sc > best.score) best = { i, score: sc };
}
return best;
}
function splitParagraphBlocks(mdxText) {
const raw = String(mdxText ?? "").replace(/\r\n/g, "\n");
return raw.split(/\n{2,}/);
function rankedBlockMatches(blocks, targetText, limit = 5) {
return blocks
.map((b, i) => ({
i,
score: scoreText(b, targetText),
excerpt: stripMd(b).slice(0, 140),
}))
.sort((a, b) => b.score - a.score)
.slice(0, limit);
}
function isLikelyExcerpt(s) {
@@ -172,6 +169,89 @@ function isLikelyExcerpt(s) {
return false;
}
/* --------------------------- frontmatter / structure ------------------------ */
function normalizeNewlines(s) {
return String(s ?? "").replace(/^\uFEFF/, "").replace(/\r\n/g, "\n");
}
function splitMdxFrontmatter(src) {
const text = normalizeNewlines(src);
const m = text.match(/^---\n[\s\S]*?\n---\n?/);
if (!m) {
return {
hasFrontmatter: false,
frontmatter: "",
body: text,
};
}
const frontmatter = m[0];
const body = text.slice(frontmatter.length);
return {
hasFrontmatter: true,
frontmatter,
body,
};
}
function joinMdxFrontmatter(frontmatter, body) {
if (!frontmatter) return String(body ?? "");
return String(frontmatter) + String(body ?? "");
}
function assertFrontmatterIntegrity({ hadFrontmatter, originalFrontmatter, finalText, filePath }) {
if (!hadFrontmatter) return;
const text = normalizeNewlines(finalText);
if (!text.startsWith("---\n")) {
throw new Error(`Frontmatter perdu pendant la mise à jour de ${filePath}`);
}
if (!text.startsWith(originalFrontmatter)) {
throw new Error(`Frontmatter altéré pendant la mise à jour de ${filePath}`);
}
}
function splitParagraphBlocksPreserve(bodyText) {
const text = normalizeNewlines(bodyText);
if (!text) {
return { blocks: [], separators: [] };
}
const blocks = [];
const separators = [];
const re = /(\n{2,})/g;
let last = 0;
let m;
while ((m = re.exec(text))) {
blocks.push(text.slice(last, m.index));
separators.push(m[1]);
last = m.index + m[1].length;
}
blocks.push(text.slice(last));
return { blocks, separators };
}
function joinParagraphBlocksPreserve(blocks, separators) {
if (!Array.isArray(blocks) || blocks.length === 0) return "";
let out = "";
for (let i = 0; i < blocks.length; i++) {
out += blocks[i];
if (i < separators.length) out += separators[i];
}
return out;
}
/* ------------------------------ utils système ------------------------------ */
function run(cmd, args, opts = {}) {
@@ -251,7 +331,9 @@ function pickSection(body, markers) {
.map((m) => ({ m, i: text.toLowerCase().indexOf(m.toLowerCase()) }))
.filter((x) => x.i >= 0)
.sort((a, b) => a.i - b.i)[0];
if (!idx) return "";
const start = idx.i + idx.m.length;
const tail = text.slice(start);
@@ -266,11 +348,13 @@ function pickSection(body, markers) {
"\n## Proposition",
"\n## Problème",
];
let end = tail.length;
for (const s of stops) {
const j = tail.toLowerCase().indexOf(s.toLowerCase());
if (j >= 0 && j < end) end = j;
}
return tail.slice(0, end).trim();
}
@@ -298,8 +382,6 @@ function extractAnchorIdAnywhere(text) {
function extractCheminFromAnyUrl(text) {
const s = String(text || "");
// Exemple: http://localhost:4321/archicratie/prologue/#p-3-xxxx
// ou: /archicratie/prologue/#p-3-xxxx
const m = s.match(/(\/[a-z0-9\-]+\/[a-z0-9\-\/]+\/)#p-\d+-[0-9a-f]{8}/i);
return m ? m[1] : "";
}
@@ -400,7 +482,7 @@ async function fetchIssue({ forgeApiBase, owner, repo, token, issueNum }) {
headers: {
Authorization: `token ${token}`,
Accept: "application/json",
"User-Agent": "archicratie-apply-ticket/2.0",
"User-Agent": "archicratie-apply-ticket/2.1",
},
});
if (!res.ok) {
@@ -416,7 +498,7 @@ async function closeIssue({ forgeApiBase, owner, repo, token, issueNum, comment
Authorization: `token ${token}`,
Accept: "application/json",
"Content-Type": "application/json",
"User-Agent": "archicratie-apply-ticket/2.0",
"User-Agent": "archicratie-apply-ticket/2.1",
};
if (comment) {
@@ -425,7 +507,11 @@ async function closeIssue({ forgeApiBase, owner, repo, token, issueNum, comment
}
const url = `${base}/api/v1/repos/${owner}/${repo}/issues/${issueNum}`;
const res = await fetch(url, { method: "PATCH", headers, body: JSON.stringify({ state: "closed" }) });
const res = await fetch(url, {
method: "PATCH",
headers,
body: JSON.stringify({ state: "closed" }),
});
if (!res.ok) {
const t = await res.text().catch(() => "");
@@ -529,10 +615,9 @@ async function main() {
console.log(`🔎 Fetch ticket #${issueNum} from ${owner}/${repo}`);
const issue = await fetchIssue({ forgeApiBase, owner, repo, token, issueNum });
// Guard PR (Pull Request = "Demande d'ajout" = pas un ticket éditorial)
if (issue?.pull_request) {
console.error(`❌ #${issueNum} est une Pull Request (demande dajout), pas un ticket éditorial.`);
console.error(`➡️ Ouvre un ticket [Correction]/[Fact-check] depuis le site (Proposer), puis relance apply-ticket sur ce numéro.`);
console.error("➡️ Ouvre un ticket [Correction]/[Fact-check] depuis le site (Proposer), puis relance apply-ticket sur ce numéro.");
process.exit(2);
}
@@ -553,7 +638,6 @@ async function main() {
ancre = (ancre || "").trim();
if (ancre.startsWith("#")) ancre = ancre.slice(1);
// fallback si ticket mal formé
if (!ancre) ancre = extractAnchorIdAnywhere(title) || extractAnchorIdAnywhere(body);
chemin = normalizeChemin(chemin);
@@ -592,7 +676,6 @@ async function main() {
const distHtmlPath = path.join(DIST_ROOT, chemin.replace(/^\/+|\/+$/g, ""), "index.html");
await ensureBuildIfNeeded(distHtmlPath);
// Texte cible: préférence au texte complet (ticket), sinon dist si extrait probable
let targetText = texteActuel;
let distText = "";
@@ -609,21 +692,24 @@ async function main() {
throw new Error("Impossible de reconstruire le texte du paragraphe (ni texte actuel, ni dist html).");
}
const original = await fs.readFile(contentFile, "utf-8");
const blocks = splitParagraphBlocks(original);
const originalRaw = await fs.readFile(contentFile, "utf-8");
const { hasFrontmatter, frontmatter, body: originalBody } = splitMdxFrontmatter(originalRaw);
const best = bestBlockMatchIndex(blocks, targetText);
const split = splitParagraphBlocksPreserve(originalBody);
const blocks = split.blocks;
const separators = split.separators;
if (!blocks.length) {
throw new Error(`Aucun bloc éditorial exploitable dans ${path.relative(CWD, contentFile)}`);
}
const ranked = rankedBlockMatches(blocks, targetText, 5);
const best = ranked[0] || { i: -1, score: -1, excerpt: "" };
const runnerUp = ranked[1] || null;
// seuil de sécurité
if (best.i < 0 || best.score < 40) {
console.error("❌ Match trop faible: je refuse de remplacer automatiquement.");
console.error(`➡️ Score=${best.score}. Recommandation: ticket avec 'Texte actuel (copie exacte du paragraphe)'.`);
const ranked = blocks
.map((b, i) => ({ i, score: scoreText(b, targetText), excerpt: stripMd(b).slice(0, 140) }))
.sort((a, b) => b.score - a.score)
.slice(0, 5);
console.error("Top candidates:");
for (const r of ranked) {
console.error(` #${r.i + 1} score=${r.score} ${r.excerpt}${r.excerpt.length >= 140 ? "…" : ""}`);
@@ -631,12 +717,34 @@ async function main() {
process.exit(2);
}
if (runnerUp) {
const ambiguityGap = best.score - runnerUp.score;
if (ambiguityGap < 15) {
console.error("❌ Match ambigu: le meilleur candidat est trop proche du second.");
console.error(`➡️ best=${best.score} / second=${runnerUp.score} / gap=${ambiguityGap}`);
console.error("Top candidates:");
for (const r of ranked) {
console.error(` #${r.i + 1} score=${r.score} ${r.excerpt}${r.excerpt.length >= 140 ? "…" : ""}`);
}
process.exit(2);
}
}
const beforeBlock = blocks[best.i];
const afterBlock = proposition.trim();
const nextBlocks = blocks.slice();
nextBlocks[best.i] = afterBlock;
const updated = nextBlocks.join("\n\n");
const updatedBody = joinParagraphBlocksPreserve(nextBlocks, separators);
const updatedRaw = joinMdxFrontmatter(frontmatter, updatedBody);
assertFrontmatterIntegrity({
hadFrontmatter: hasFrontmatter,
originalFrontmatter: frontmatter,
finalText: updatedRaw,
filePath: path.relative(CWD, contentFile),
});
console.log(`🧩 Matched block #${best.i + 1}/${blocks.length} score=${best.score}`);
@@ -650,13 +758,15 @@ async function main() {
return;
}
// backup uniquement si on écrit
const bakPath = `${contentFile}.bak.issue-${issueNum}`;
const relContentFile = path.relative(CWD, contentFile);
const bakPath = path.join(BACKUP_ROOT, `${relContentFile}.bak.issue-${issueNum}`);
await fs.mkdir(path.dirname(bakPath), { recursive: true });
if (!(await fileExists(bakPath))) {
await fs.writeFile(bakPath, original, "utf-8");
await fs.writeFile(bakPath, originalRaw, "utf-8");
}
await fs.writeFile(contentFile, updated, "utf-8");
await fs.writeFile(contentFile, updatedRaw, "utf-8");
console.log("✅ Applied.");
let aliasChanged = false;
@@ -677,13 +787,13 @@ async function main() {
if (aliasChanged) {
console.log(`✅ Alias ajouté: ${chemin} ${ancre} -> ${newId}`);
// MàJ dist sans rebuild complet (inject seulement)
run("node", ["scripts/inject-anchor-aliases.mjs"], { cwd: CWD });
} else {
console.log(` Alias déjà présent ou inutile (${ancre} -> ${newId}).`);
}
// garde-fous rapides
run("node", ["scripts/check-anchor-aliases.mjs"], { cwd: CWD });
run("node", ["scripts/verify-anchor-aliases-in-dist.mjs"], { cwd: CWD });
run("npm", ["run", "test:anchors"], { cwd: CWD });
run("node", ["scripts/check-inline-js.mjs"], { cwd: CWD });
}
@@ -713,7 +823,6 @@ async function main() {
return;
}
// mode manuel
console.log("Next (manuel) :");
console.log(` git diff -- ${path.relative(CWD, contentFile)}`);
console.log(
@@ -730,4 +839,4 @@ async function main() {
main().catch((e) => {
console.error("💥", e?.message || e);
process.exit(1);
});
});

72
scripts/audit-docx-source.py Executable file
View File

@@ -0,0 +1,72 @@
#!/usr/bin/env python3
from __future__ import annotations
import argparse
import sys
import unicodedata
import xml.etree.ElementTree as ET
from zipfile import ZipFile
NS = {"w": "http://schemas.openxmlformats.org/wordprocessingml/2006/main"}
FORBIDDEN = [
"coviabilité",
"sacroinstitutionnelle",
"technologistique",
"scripturonormative",
"textesrepères",
"ellemême",
"opérateur de darchicration",
"systèmes plusieurs statuts",
"celle-ci se donne à voir",
"Pour autant il serait",
"Telles peuvent être le cas de",
"la co-viabilité devient ,",
]
def norm(s: str) -> str:
return unicodedata.normalize("NFC", s or "")
def main() -> int:
parser = argparse.ArgumentParser(description="Audit simple dun DOCX source officiel.")
parser.add_argument("docx", help="Chemin du fichier .docx")
args = parser.parse_args()
try:
with ZipFile(args.docx) as zf:
data = zf.read("word/document.xml")
except FileNotFoundError:
print(f"ECHEC: fichier introuvable: {args.docx}", file=sys.stderr)
return 2
except KeyError:
print("ECHEC: word/document.xml introuvable dans le DOCX.", file=sys.stderr)
return 2
except Exception as e:
print(f"ECHEC: impossible douvrir le DOCX: {e}", file=sys.stderr)
return 2
root = ET.fromstring(data)
found = False
for i, p in enumerate(root.findall(".//w:p", NS), start=1):
txt = "".join(t.text or "" for t in p.findall(".//w:t", NS))
txt_n = norm(txt)
hits = [needle for needle in FORBIDDEN if needle in txt_n]
if hits:
found = True
print(f"\n[paragraphe {i}]")
print("Hits :", ", ".join(hits))
print(txt_n)
if found:
print("\nECHEC: formes interdites encore présentes dans le DOCX.")
return 1
print("OK: aucune forme interdite trouvée dans le DOCX.")
return 0
if __name__ == "__main__":
raise SystemExit(main())

View File

@@ -1,28 +1,106 @@
#!/usr/bin/env node
// scripts/build-annotations-index.mjs
// Construit dist/annotations-index.json à partir de src/annotations/**/*.yml
// Supporte:
// - monolith : src/annotations/<pageKey>.yml
// - shard : src/annotations/<pageKey>/<paraId>.yml (paraId = p-<n>-...)
// Invariants:
// - doc.schema === 1
// - doc.page (si présent) == pageKey déduit du chemin
// - shard: doc.paras doit contenir EXACTEMENT la clé paraId (sinon fail)
//
// Deep-merge non destructif (media/refs/comments dédupliqués), tri stable.
import fs from "node:fs/promises";
import path from "node:path";
import YAML from "yaml";
function parseArgs(argv) {
const out = {
inDir: "src/annotations",
outFile: "dist/annotations-index.json",
};
const ROOT = process.cwd();
const ANNO_ROOT = path.join(ROOT, "src", "annotations");
const DIST_DIR = path.join(ROOT, "dist");
const OUT = path.join(DIST_DIR, "annotations-index.json");
for (let i = 0; i < argv.length; i++) {
const a = argv[i];
function assert(cond, msg) {
if (!cond) throw new Error(msg);
}
if (a === "--in" && argv[i + 1]) out.inDir = argv[++i];
else if (a.startsWith("--in=")) out.inDir = a.slice("--in=".length);
function isObj(x) {
return !!x && typeof x === "object" && !Array.isArray(x);
}
function isArr(x) {
return Array.isArray(x);
}
if (a === "--out" && argv[i + 1]) out.outFile = argv[++i];
else if (a.startsWith("--out=")) out.outFile = a.slice("--out=".length);
function normPath(s) {
return String(s || "")
.replace(/\\/g, "/")
.replace(/^\/+|\/+$/g, "");
}
function paraNum(pid) {
const m = String(pid).match(/^p-(\d+)-/i);
return m ? Number(m[1]) : Number.POSITIVE_INFINITY;
}
function stableSortByTs(arr) {
if (!Array.isArray(arr)) return;
arr.sort((a, b) => {
const ta = Date.parse(a?.ts || "") || 0;
const tb = Date.parse(b?.ts || "") || 0;
if (ta !== tb) return ta - tb;
return JSON.stringify(a).localeCompare(JSON.stringify(b));
});
}
function keyMedia(x) { return String(x?.src || ""); }
function keyRef(x) {
return `${x?.url || ""}||${x?.label || ""}||${x?.kind || ""}||${x?.citation || ""}`;
}
function keyComment(x) { return String(x?.text || "").trim(); }
function uniqUnion(dst, src, keyFn) {
const out = isArr(dst) ? [...dst] : [];
const seen = new Set(out.map((x) => keyFn(x)));
for (const it of (isArr(src) ? src : [])) {
const k = keyFn(it);
if (!k) continue;
if (!seen.has(k)) {
seen.add(k);
out.push(it);
}
}
return out;
}
async function exists(p) {
try { await fs.access(p); return true; } catch { return false; }
function deepMergeEntry(dst, src) {
if (!isObj(dst) || !isObj(src)) return;
for (const [k, v] of Object.entries(src)) {
if (k === "media" && isArr(v)) { dst.media = uniqUnion(dst.media, v, keyMedia); continue; }
if (k === "refs" && isArr(v)) { dst.refs = uniqUnion(dst.refs, v, keyRef); continue; }
if (k === "comments_editorial" && isArr(v)) { dst.comments_editorial = uniqUnion(dst.comments_editorial, v, keyComment); continue; }
if (isObj(v)) {
if (!isObj(dst[k])) dst[k] = {};
deepMergeEntry(dst[k], v);
continue;
}
if (isArr(v)) {
const cur = isArr(dst[k]) ? dst[k] : [];
const seen = new Set(cur.map((x) => JSON.stringify(x)));
const out = [...cur];
for (const it of v) {
const s = JSON.stringify(it);
if (!seen.has(s)) { seen.add(s); out.push(it); }
}
dst[k] = out;
continue;
}
// scalar: set only if missing/empty
if (!(k in dst) || dst[k] == null || dst[k] === "") dst[k] = v;
}
}
async function walk(dir) {
@@ -30,111 +108,116 @@ async function walk(dir) {
const ents = await fs.readdir(dir, { withFileTypes: true });
for (const e of ents) {
const p = path.join(dir, e.name);
if (e.isDirectory()) out.push(...(await walk(p)));
else out.push(p);
if (e.isDirectory()) out.push(...await walk(p));
else if (e.isFile() && /\.ya?ml$/i.test(e.name)) out.push(p);
}
return out;
}
function inferPageKeyFromFile(inDirAbs, fileAbs) {
// src/annotations/<page>.yml -> "<page>"
const rel = path.relative(inDirAbs, fileAbs).replace(/\\/g, "/");
return rel.replace(/\.(ya?ml|json)$/i, "");
function inferExpectedFromRel(relNoExt) {
const parts = relNoExt.split("/").filter(Boolean);
const last = parts.at(-1) || "";
const isShard = parts.length > 1 && /^p-\d+-/i.test(last); // ✅ durcissement
const pageKey = isShard ? parts.slice(0, -1).join("/") : relNoExt;
const paraId = isShard ? last : null;
return { isShard, pageKey, paraId };
}
function assert(cond, msg) {
if (!cond) throw new Error(msg);
}
function validateAndNormalizeDoc(doc, relFile, expectedPageKey, expectedParaId) {
assert(isObj(doc), `${relFile}: doc must be an object`);
assert(doc.schema === 1, `${relFile}: schema must be 1`);
assert(isObj(doc.paras), `${relFile}: missing object key "paras"`);
function isPlainObject(x) {
return !!x && typeof x === "object" && !Array.isArray(x);
}
const gotPage = doc.page != null ? normPath(doc.page) : "";
const expPage = normPath(expectedPageKey);
function normalizePageKey(s) {
// pas de / en tête/fin
return String(s || "").replace(/^\/+/, "").replace(/\/+$/, "");
}
function validateAndNormalizeDoc(doc, pageKey, fileRel) {
assert(isPlainObject(doc), `${fileRel}: document must be an object`);
assert(doc.schema === 1, `${fileRel}: schema must be 1`);
if (doc.page != null) {
if (gotPage) {
assert(
normalizePageKey(doc.page) === pageKey,
`${fileRel}: page mismatch (page="${doc.page}" vs path="${pageKey}")`
gotPage === expPage,
`${relFile}: page mismatch (page="${doc.page}" vs path="${expectedPageKey}")`
);
} else {
doc.page = expPage;
}
if (expectedParaId) {
const keys = Object.keys(doc.paras || {}).map(String);
assert(
keys.includes(expectedParaId),
`${relFile}: shard mismatch: must contain paras["${expectedParaId}"]`
);
assert(
keys.length === 1 && keys[0] === expectedParaId,
`${relFile}: shard invariant violated: shard file must contain ONLY paras["${expectedParaId}"] (got: ${keys.join(", ")})`
);
}
assert(isPlainObject(doc.paras), `${fileRel}: missing object key "paras"`);
const parasOut = Object.create(null);
for (const [paraId, entry] of Object.entries(doc.paras)) {
assert(/^p-\d+-/i.test(paraId), `${fileRel}: invalid para id "${paraId}"`);
// entry peut être vide, mais doit être un objet si présent
assert(entry == null || isPlainObject(entry), `${fileRel}: paras.${paraId} must be an object`);
const e = entry ? { ...entry } : {};
// Sanity checks (non destructifs : on nécrase pas, on vérifie juste les types)
if (e.refs != null) assert(Array.isArray(e.refs), `${fileRel}: paras.${paraId}.refs must be an array`);
if (e.authors != null) assert(Array.isArray(e.authors), `${fileRel}: paras.${paraId}.authors must be an array`);
if (e.quotes != null) assert(Array.isArray(e.quotes), `${fileRel}: paras.${paraId}.quotes must be an array`);
if (e.media != null) assert(Array.isArray(e.media), `${fileRel}: paras.${paraId}.media must be an array`);
if (e.comments_editorial != null) assert(Array.isArray(e.comments_editorial), `${fileRel}: paras.${paraId}.comments_editorial must be an array`);
parasOut[paraId] = e;
}
return parasOut;
}
async function readDoc(fileAbs) {
const raw = await fs.readFile(fileAbs, "utf8");
if (/\.json$/i.test(fileAbs)) return JSON.parse(raw);
return YAML.parse(raw);
return doc;
}
async function main() {
const { inDir, outFile } = parseArgs(process.argv.slice(2));
const CWD = process.cwd();
const pages = {};
const errors = [];
const inDirAbs = path.isAbsolute(inDir) ? inDir : path.join(CWD, inDir);
const outAbs = path.isAbsolute(outFile) ? outFile : path.join(CWD, outFile);
await fs.mkdir(DIST_DIR, { recursive: true });
// antifragile
if (!(await exists(inDirAbs))) {
console.log(` annotations-index: skip (input missing): ${inDir}`);
process.exit(0);
}
const files = await walk(ANNO_ROOT);
const files = (await walk(inDirAbs)).filter((p) => /\.(ya?ml|json)$/i.test(p));
if (!files.length) {
console.log(` annotations-index: skip (no .yml/.yaml/.json found in): ${inDir}`);
process.exit(0);
}
for (const fp of files) {
const rel = normPath(path.relative(ANNO_ROOT, fp));
const relNoExt = rel.replace(/\.ya?ml$/i, "");
const { isShard, pageKey, paraId } = inferExpectedFromRel(relNoExt);
const pages = Object.create(null);
let paraCount = 0;
for (const f of files) {
const fileRel = path.relative(CWD, f).replace(/\\/g, "/");
const pageKey = normalizePageKey(inferPageKeyFromFile(inDirAbs, f));
assert(pageKey, `${fileRel}: cannot infer page key`);
let doc;
try {
doc = await readDoc(f);
const raw = await fs.readFile(fp, "utf8");
const doc = YAML.parse(raw) || {};
if (!isObj(doc) || doc.schema !== 1) continue;
validateAndNormalizeDoc(
doc,
`src/annotations/${rel}`,
pageKey,
isShard ? paraId : null
);
const pg = (pages[pageKey] ??= { paras: {} });
if (isShard) {
const entry = doc.paras[paraId];
if (!isObj(pg.paras[paraId])) pg.paras[paraId] = {};
if (isObj(entry)) deepMergeEntry(pg.paras[paraId], entry);
stableSortByTs(pg.paras[paraId].media);
stableSortByTs(pg.paras[paraId].refs);
stableSortByTs(pg.paras[paraId].comments_editorial);
} else {
for (const [pid, entry] of Object.entries(doc.paras || {})) {
const p = String(pid);
if (!isObj(pg.paras[p])) pg.paras[p] = {};
if (isObj(entry)) deepMergeEntry(pg.paras[p], entry);
stableSortByTs(pg.paras[p].media);
stableSortByTs(pg.paras[p].refs);
stableSortByTs(pg.paras[p].comments_editorial);
}
}
} catch (e) {
throw new Error(`${fileRel}: parse failed: ${String(e?.message ?? e)}`);
errors.push({ file: `src/annotations/${rel}`, error: String(e?.message || e) });
}
}
const paras = validateAndNormalizeDoc(doc, pageKey, fileRel);
// 1 fichier = 1 page (canon)
assert(!pages[pageKey], `${fileRel}: duplicate page "${pageKey}" (only one file per page)`);
pages[pageKey] = { paras };
paraCount += Object.keys(paras).length;
for (const [pageKey, pg] of Object.entries(pages)) {
const keys = Object.keys(pg.paras || {});
keys.sort((a, b) => {
const ia = paraNum(a);
const ib = paraNum(b);
if (Number.isFinite(ia) && Number.isFinite(ib) && ia !== ib) return ia - ib;
return String(a).localeCompare(String(b));
});
const next = {};
for (const k of keys) next[k] = pg.paras[k];
pg.paras = next;
}
const out = {
@@ -143,17 +226,21 @@ async function main() {
pages,
stats: {
pages: Object.keys(pages).length,
paras: paraCount,
paras: Object.values(pages).reduce((n, p) => n + Object.keys(p.paras || {}).length, 0),
errors: errors.length,
},
errors,
};
await fs.mkdir(path.dirname(outAbs), { recursive: true });
await fs.writeFile(outAbs, JSON.stringify(out), "utf8");
if (errors.length) {
throw new Error(`${errors[0].file}: ${errors[0].error}`);
}
console.log(`✅ annotations-index: pages=${out.stats.pages} paras=${out.stats.paras} -> ${path.relative(CWD, outAbs)}`);
await fs.writeFile(OUT, JSON.stringify(out), "utf8");
console.log(`✅ annotations-index: pages=${out.stats.pages} paras=${out.stats.paras} -> dist/annotations-index.json`);
}
main().catch((e) => {
console.error("FAIL: build-annotations-index crashed:", e);
console.error(`FAIL: build-annotations-index crashed: ${e?.stack || e?.message || e}`);
process.exit(1);
});
});

View File

@@ -74,7 +74,24 @@ function loadAllowMissing() {
return new Set(arr.map(String));
}
function loadAcceptedResets() {
const p = path.resolve("config/anchor-churn-allowlist.json");
if (!fssync.existsSync(p)) return {};
const raw = fssync.readFileSync(p, "utf8").trim();
if (!raw) return {};
const data = JSON.parse(raw);
if (!data || typeof data !== "object" || Array.isArray(data)) {
throw new Error("anchor-churn-allowlist.json must be an object");
}
const accepted = data.accepted_resets || {};
if (!accepted || typeof accepted !== "object" || Array.isArray(accepted)) {
throw new Error("anchor-churn-allowlist.json: accepted_resets must be an object");
}
return accepted;
}
const ALLOW_MISSING = loadAllowMissing();
const ACCEPTED_RESETS = loadAcceptedResets();
async function buildSnapshot() {
const absDist = path.resolve(DIST_DIR);
@@ -139,6 +156,7 @@ function diffPage(prevIds, curIds) {
let failed = false;
let changedPages = 0;
let acceptedPages = 0;
for (const p of pages) {
const prevIds = base[p] || null;
@@ -172,6 +190,7 @@ function diffPage(prevIds, curIds) {
const prevN = prevIds.length || 1;
const churn = (added.length + removed.length) / prevN;
const removedRatio = removed.length / prevN;
const acceptedReason = ACCEPTED_RESETS[p] || null;
console.log(
`~ ${p} prev=${prevIds.length} now=${curIds.length}` +
@@ -182,11 +201,23 @@ function diffPage(prevIds, curIds) {
console.log(` removed: ${removed.slice(0, 20).join(", ")}${removed.length > 20 ? " …" : ""}`);
}
if (prevIds.length >= MIN_PREV && churn > THRESHOLD) failed = true;
if (prevIds.length >= MIN_PREV && removedRatio > THRESHOLD) failed = true;
const exceeds =
(prevIds.length >= MIN_PREV && churn > THRESHOLD) ||
(prevIds.length >= MIN_PREV && removedRatio > THRESHOLD);
if (exceeds && acceptedReason) {
acceptedPages += 1;
console.log(` ✅ accepted reset: ${acceptedReason}`);
continue;
}
if (exceeds) failed = true;
}
console.log(`\nSummary: pages compared=${pages.length}, pages changed=${changedPages}`);
console.log(
`\nSummary: pages compared=${pages.length}, pages changed=${changedPages}, accepted resets=${acceptedPages}`
);
if (failed) {
console.error(`FAIL: anchor churn above threshold (threshold=${pct(THRESHOLD)} minPrev=${MIN_PREV})`);
process.exit(1);

View File

@@ -48,6 +48,9 @@ async function main() {
let missing = 0;
const notes = [];
// Optim: éviter de vérifier 100 fois le même fichier media
const seenMedia = new Set(); // src string
for (const f of files) {
const rel = path.relative(CWD, f).replace(/\\/g, "/");
const raw = await fs.readFile(f, "utf8");
@@ -70,6 +73,10 @@ async function main() {
const src = String(m?.src || "");
if (!src.startsWith("/media/")) continue; // externes ok, ou autres conventions futures
// dédupe
if (seenMedia.has(src)) continue;
seenMedia.add(src);
checked++;
const p = toPublicPathFromUrl(src);
if (!p) continue;
@@ -94,4 +101,4 @@ async function main() {
main().catch((e) => {
console.error("FAIL: check-annotations-media crashed:", e);
process.exit(1);
});
});

View File

@@ -27,11 +27,6 @@ function escRe(s) {
return String(s).replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
}
function inferPageKeyFromFile(fileAbs) {
const rel = path.relative(ANNO_DIR, fileAbs).replace(/\\/g, "/");
return rel.replace(/\.(ya?ml|json)$/i, "");
}
function normalizePageKey(s) {
return String(s || "").replace(/^\/+/, "").replace(/\/+$/, "");
}
@@ -40,6 +35,31 @@ function isPlainObject(x) {
return !!x && typeof x === "object" && !Array.isArray(x);
}
function isParaId(s) {
return /^p-\d+-/i.test(String(s || ""));
}
/**
* Supporte:
* - monolith: src/annotations/<pageKey>.yml -> pageKey = rel sans ext
* - shard : src/annotations/<pageKey>/<paraId>.yml -> pageKey = dirname(rel), paraId = basename
*
* shard seulement si le fichier est dans un sous-dossier (anti cas pathologique).
*/
function inferFromFile(fileAbs) {
const rel = path.relative(ANNO_DIR, fileAbs).replace(/\\/g, "/");
const relNoExt = rel.replace(/\.(ya?ml|json)$/i, "");
const parts = relNoExt.split("/").filter(Boolean);
const base = parts[parts.length - 1] || "";
const dirParts = parts.slice(0, -1);
const isShard = dirParts.length > 0 && isParaId(base);
const pageKey = isShard ? dirParts.join("/") : relNoExt;
const paraId = isShard ? base : "";
return { pageKey: normalizePageKey(pageKey), paraId };
}
async function loadAliases() {
if (!(await exists(ALIASES_PATH))) return {};
try {
@@ -60,10 +80,12 @@ function getAlias(aliases, pageKey, oldId) {
// supporte:
// 1) { "<pageKey>": { "<old>": "<new>" } }
// 2) { "<old>": "<new>" }
const a1 = aliases?.[pageKey]?.[oldId];
if (a1) return a1;
const k1 = String(pageKey || "");
const k2 = k1 ? ("/" + k1.replace(/^\/+|\/+$/g, "") + "/") : "";
const a1 = (aliases?.[k1]?.[oldId]) || (k2 ? aliases?.[k2]?.[oldId] : "");
if (a1) return String(a1);
const a2 = aliases?.[oldId];
if (a2) return a2;
if (a2) return String(a2);
return "";
}
@@ -81,7 +103,11 @@ async function main() {
const aliases = await loadAliases();
const files = (await walk(ANNO_DIR)).filter((p) => /\.(ya?ml|json)$/i.test(p));
let pages = 0;
// perf: cache HTML par page (shards = beaucoup de fichiers pour 1 page)
const htmlCache = new Map(); // pageKey -> html
const missingDistPage = new Set(); // pageKey
let pagesSeen = new Set();
let checked = 0;
let failures = 0;
const notes = [];
@@ -105,7 +131,7 @@ async function main() {
continue;
}
const pageKey = normalizePageKey(inferPageKeyFromFile(f));
const { pageKey, paraId: shardParaId } = inferFromFile(f);
if (doc.page != null && normalizePageKey(doc.page) !== pageKey) {
failures++;
@@ -119,20 +145,44 @@ async function main() {
continue;
}
// shard invariant (fort) : doit contenir paras[paraId]
if (shardParaId) {
if (!Object.prototype.hasOwnProperty.call(doc.paras, shardParaId)) {
failures++;
notes.push(`- SHARD MISMATCH: ${rel} (expected paras["${shardParaId}"] present)`);
continue;
}
// si extras -> warning (non destructif)
const keys = Object.keys(doc.paras);
if (!(keys.length === 1 && keys[0] === shardParaId)) {
notes.push(`- WARN shard has extra paras: ${rel} (expected only "${shardParaId}", got ${keys.join(", ")})`);
}
}
pagesSeen.add(pageKey);
const distFile = path.join(DIST_DIR, pageKey, "index.html");
if (!(await exists(distFile))) {
failures++;
notes.push(`- MISSING PAGE: dist/${pageKey}/index.html (from ${rel})`);
if (!missingDistPage.has(pageKey)) {
missingDistPage.add(pageKey);
failures++;
notes.push(`- MISSING PAGE: dist/${pageKey}/index.html (from ${rel})`);
} else {
notes.push(`- WARN missing page already reported: dist/${pageKey}/index.html (from ${rel})`);
}
continue;
}
pages++;
const html = await fs.readFile(distFile, "utf8");
let html = htmlCache.get(pageKey);
if (!html) {
html = await fs.readFile(distFile, "utf8");
htmlCache.set(pageKey, html);
}
for (const paraId of Object.keys(doc.paras)) {
checked++;
if (!/^p-\d+-/i.test(paraId)) {
if (!isParaId(paraId)) {
failures++;
notes.push(`- INVALID ID: ${rel} (${paraId})`);
continue;
@@ -156,6 +206,7 @@ async function main() {
}
const warns = notes.filter((x) => x.startsWith("- WARN"));
const pages = pagesSeen.size;
if (failures > 0) {
console.error(`FAIL: annotations invalid (pages=${pages} checked=${checked} failures=${failures})`);
@@ -170,4 +221,4 @@ async function main() {
main().catch((e) => {
console.error("FAIL: annotations check crashed:", e);
process.exit(1);
});
});

132
scripts/fix-docx-source.py Executable file
View File

@@ -0,0 +1,132 @@
#!/usr/bin/env python3
from __future__ import annotations
import argparse
import shutil
import tempfile
import unicodedata
import xml.etree.ElementTree as ET
from pathlib import Path
from zipfile import ZIP_DEFLATED, ZipFile
W_NS = "http://schemas.openxmlformats.org/wordprocessingml/2006/main"
XML_NS = "http://www.w3.org/XML/1998/namespace"
NS = {"w": W_NS}
ET.register_namespace("w", W_NS)
REPLACEMENTS = {
"coviabilité": "co-viabilité",
"sacroinstitutionnelle": "sacro-institutionnelle",
"technologistique": "techno-logistique",
"scripturonormative": "scripturo-normative",
"textesrepères": "textes-repères",
"ellemême": "elle-même",
"opérateur de darchicration": "opérateur darchicration",
"systèmes plusieurs statuts": "systèmes à plusieurs statuts",
"celle-ci se donne à voir": "Celle-ci se donne à voir",
"Pour autant il serait": "Pour autant, il serait",
"Telles peuvent être le cas de": "Tels peuvent être les cas de",
}
# volontairement NON auto-corrigé : "la co-viabilité devient ,"
# ce cas demande une décision éditoriale humaine.
def qn(tag: str) -> str:
prefix, local = tag.split(":")
if prefix != "w":
raise ValueError(tag)
return f"{{{W_NS}}}{local}"
def norm(s: str) -> str:
return unicodedata.normalize("NFC", s or "")
def paragraph_text(p: ET.Element) -> str:
return "".join(t.text or "" for t in p.findall(".//w:t", NS))
def replaced_text(s: str) -> str:
out = norm(s)
for bad, good in REPLACEMENTS.items():
out = out.replace(bad, good)
return out
def rewrite_paragraph_text(p: ET.Element, new_text: str) -> None:
ppr = p.find("w:pPr", NS)
for child in list(p):
if ppr is not None and child is ppr:
continue
p.remove(child)
r = ET.Element(qn("w:r"))
t = ET.SubElement(r, qn("w:t"))
t.set(f"{{{XML_NS}}}space", "preserve")
t.text = new_text
p.append(r)
def process_document_xml(xml_path: Path) -> int:
tree = ET.parse(xml_path)
root = tree.getroot()
changed = 0
for p in root.findall(".//w:p", NS):
old = paragraph_text(p)
new = replaced_text(old)
if new != old:
rewrite_paragraph_text(p, new)
changed += 1
tree.write(xml_path, encoding="utf-8", xml_declaration=True)
return changed
def repack_docx(tmpdir: Path, out_docx: Path) -> None:
tmp_out = out_docx.with_suffix(out_docx.suffix + ".tmp")
with ZipFile(tmp_out, "w", ZIP_DEFLATED) as zf:
for p in sorted(tmpdir.rglob("*")):
if p.is_file():
zf.write(p, p.relative_to(tmpdir))
shutil.move(tmp_out, out_docx)
def main() -> int:
parser = argparse.ArgumentParser(description="Répare mécaniquement certaines scories DOCX.")
parser.add_argument("docx", help="Chemin du DOCX")
parser.add_argument("--in-place", action="store_true", help="Réécrit le DOCX en place")
args = parser.parse_args()
src = Path(args.docx)
if not src.exists():
print(f"ECHEC: fichier introuvable: {src}", file=sys.stderr)
return 2
out = src if args.in_place else src.with_name(src.stem + ".fixed.docx")
with tempfile.TemporaryDirectory(prefix="docx-fix-") as td:
td_path = Path(td)
with ZipFile(src) as zf:
zf.extractall(td_path)
document_xml = td_path / "word" / "document.xml"
if not document_xml.exists():
print("ECHEC: word/document.xml absent.", file=sys.stderr)
return 2
changed = process_document_xml(document_xml)
repack_docx(td_path, out)
print(f"OK: DOCX réparé par réécriture paragraphe/XML. Paragraphes modifiés: {changed}")
return 0
if __name__ == "__main__":
import sys
raise SystemExit(main())

View File

@@ -114,7 +114,6 @@ async function runMammoth(docxPath, assetsOutDirWebRoot) {
);
let html = result.value || "";
// Mammoth gives relative src="image-xx.png" ; we will prefix later
return html;
}
@@ -182,6 +181,25 @@ async function exists(p) {
try { await fs.access(p); return true; } catch { return false; }
}
/**
* ✅ compat:
* - ancien : collection="archicratie" + slug="archicrat-ia/chapitre-3"
* - nouveau : collection="archicrat-ia" + slug="chapitre-3"
*
* But : toujours écrire dans src/content/archicrat-ia/<slugSansPrefix>.mdx
*/
function normalizeDest(collection, slug) {
let outCollection = String(collection || "").trim();
let outSlug = String(slug || "").trim().replace(/^\/+|\/+$/g, "");
if (outCollection === "archicratie" && outSlug.startsWith("archicrat-ia/")) {
outCollection = "archicrat-ia";
outSlug = outSlug.replace(/^archicrat-ia\//, "");
}
return { outCollection, outSlug };
}
async function main() {
const args = parseArgs(process.argv);
const manifestPath = path.resolve(args.manifest);
@@ -203,11 +221,14 @@ async function main() {
for (const it of selected) {
const docxPath = path.resolve(it.source);
const outFile = path.resolve("src/content", it.collection, `${it.slug}.mdx`);
const { outCollection, outSlug } = normalizeDest(it.collection, it.slug);
const outFile = path.resolve("src/content", outCollection, `${outSlug}.mdx`);
const outDir = path.dirname(outFile);
const assetsPublicDir = path.posix.join("/imported", it.collection, it.slug);
const assetsDiskDir = path.resolve("public", "imported", it.collection, it.slug);
const assetsPublicDir = path.posix.join("/imported", outCollection, outSlug);
const assetsDiskDir = path.resolve("public", "imported", outCollection, outSlug);
if (!(await exists(docxPath))) {
throw new Error(`Missing source docx: ${docxPath}`);
@@ -241,18 +262,35 @@ async function main() {
html = rewriteLocalImageLinks(html, assetsPublicDir);
body = html.trim() ? html : "<p>(Import vide)</p>";
}
const defaultVersion = process.env.PUBLIC_RELEASE || "0.1.0";
// ✅ IMPORTANT: archicrat-ia partage edition/status avec archicratie (pas de migration frontmatter)
const schemaDefaultsByCollection = {
archicratie: { edition: "archicratie", status: "modele_sociopolitique", level: 1 },
ia: { edition: "ia", status: "cas_pratique", level: 1 },
traite: { edition: "traite", status: "ontodynamique", level: 1 },
glossaire: { edition: "glossaire", status: "lexique", level: 1 },
atlas: { edition: "atlas", status: "atlas", level: 1 },
archicratie: { edition: "archicratie", status: "modele_sociopolitique", level: 1 },
"archicrat-ia": { edition: "archicrat-ia", status: "essai_these", level: 1 },
"cas-ia": { edition: "cas-ia", status: "application", level: 1 },
traite: { edition: "traite", status: "ontodynamique", level: 1 },
glossaire: { edition: "glossaire", status: "lexique", level: 1 },
atlas: { edition: "atlas", status: "atlas", level: 1 },
};
const defaults = schemaDefaultsByCollection[it.collection] || { edition: it.collection, status: "draft", level: 1 };
// Compat legacy :
// manifest collection="archicratie" + slug="archicrat-ia/..."
// => on écrit bien dans src/content/archicrat-ia/...
// => mais on conserve edition/status historiques de type archicratie/modele_sociopolitique
const defaultsKey =
String(it.collection || "").trim() === "archicratie" &&
String(it.slug || "").trim().startsWith("archicrat-ia/")
? "archicratie"
: outCollection;
const defaults =
schemaDefaultsByCollection[defaultsKey] || {
edition: defaultsKey,
status: "draft",
level: 1,
};
const fm = [
"---",
@@ -282,4 +320,4 @@ async function main() {
main().catch((e) => {
console.error("\nERROR:", e?.message || e);
process.exit(1);
});
});

View File

@@ -14,6 +14,24 @@ const STRICT = argv.includes("--strict") || process.env.CI === "1" || process.en
function escRe(s) {
return String(s).replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
}
async function exists(p) {
try {
await fs.access(p);
return true;
} catch {
return false;
}
}
function normalizeRoute(route) {
let r = String(route || "").trim();
if (!r.startsWith("/")) r = "/" + r;
if (!r.endsWith("/")) r = r + "/";
r = r.replace(/\/{2,}/g, "/");
return r;
}
function countIdAttr(html, id) {
const re = new RegExp(`\\bid=(["'])${escRe(id)}\\1`, "gi");
let c = 0;
@@ -22,7 +40,6 @@ function countIdAttr(html, id) {
}
function findStartTagWithId(html, id) {
// 1er élément qui porte id="..."
const re = new RegExp(
`<([a-zA-Z0-9:-]+)\\b[^>]*\\bid=(["'])${escRe(id)}\\2[^>]*>`,
"i"
@@ -36,34 +53,10 @@ function isInjectedAliasSpan(html, id) {
const found = findStartTagWithId(html, id);
if (!found) return false;
if (found.tagName !== "span") return false;
// class="... para-alias ..."
return /\bclass=(["'])(?:(?!\1).)*\bpara-alias\b(?:(?!\1).)*\1/i.test(found.tag);
}
function normalizeRoute(route) {
let r = String(route || "").trim();
if (!r.startsWith("/")) r = "/" + r;
if (!r.endsWith("/")) r = r + "/";
r = r.replace(/\/{2,}/g, "/");
return r;
}
async function exists(p) {
try {
await fs.access(p);
return true;
} catch {
return false;
}
}
function hasId(html, id) {
const re = new RegExp(`\\bid=(["'])${escRe(id)}\\1`, "i");
return re.test(html);
}
function injectBeforeId(html, newId, injectHtml) {
// insère juste avant la balise qui porte id="newId"
const re = new RegExp(
`(<[^>]+\\bid=(["'])${escRe(newId)}\\2[^>]*>)`,
"i"
@@ -82,6 +75,7 @@ async function main() {
}
const raw = await fs.readFile(ALIASES_PATH, "utf-8");
/** @type {Record<string, Record<string,string>>} */
let aliases;
try {
@@ -89,6 +83,7 @@ async function main() {
} catch (e) {
throw new Error(`JSON invalide: ${ALIASES_PATH} (${e?.message || e})`);
}
if (!aliases || typeof aliases !== "object" || Array.isArray(aliases)) {
throw new Error(`Format invalide: attendu { route: { oldId: newId } } dans ${ALIASES_PATH}`);
}
@@ -114,10 +109,10 @@ async function main() {
console.log(msg);
warnCount++;
}
if (entries.length === 0) continue;
const rel = route.replace(/^\/+|\/+$/g, ""); // sans slash
const rel = route.replace(/^\/+|\/+$/g, "");
const htmlPath = path.join(DIST_ROOT, rel, "index.html");
if (!(await exists(htmlPath))) {
@@ -135,24 +130,8 @@ async function main() {
if (!oldId || !newId) continue;
const oldCount = countIdAttr(html, oldId);
if (oldCount > 0) {
// ✅ déjà injecté (idempotent)
if (isInjectedAliasSpan(html, oldId)) continue;
// ⛔️ oldId existe déjà "en vrai" (ex: <p id="oldId">)
// => alias inutile / inversé / obsolète
const found = findStartTagWithId(html, oldId);
const where = found ? `<${found.tagName} … id="${oldId}" …>` : `id="${oldId}"`;
const msg =
`⚠️ alias inutile/inversé: oldId déjà présent dans la page (${where}). ` +
`Supprime l'alias ${oldId} -> ${newId} (ou corrige le sens) pour route=${route}`;
if (STRICT) throw new Error(msg);
console.log(msg);
warnCount++;
continue;
}
// juste après avoir calculé oldCount
// ✅ déjà injecté => idempotent
if (oldCount > 0 && isInjectedAliasSpan(html, oldId)) {
if (STRICT && oldCount !== 1) {
throw new Error(`oldId dupliqué (${oldCount}) alors qu'il est censé être unique: ${route} id=${oldId}`);
@@ -160,18 +139,23 @@ async function main() {
continue;
}
// avant l'injection, après hasId(newId)
const newCount = countIdAttr(html, newId);
if (newCount !== 1) {
const msg = `⚠️ newId non-unique (${newCount}) : ${route} new=${newId} (injection ambiguë)`;
// ⛔️ oldId existe déjà "en vrai" => alias inutile/inversé
if (oldCount > 0) {
const found = findStartTagWithId(html, oldId);
const where = found ? `<${found.tagName} … id="${oldId}" …>` : `id="${oldId}"`;
const msg =
`⚠️ alias inutile/inversé: oldId déjà présent (${where}). ` +
`Supprime ${oldId} -> ${newId} (ou corrige le sens) pour route=${route}`;
if (STRICT) throw new Error(msg);
console.log(msg);
warnCount++;
continue;
}
if (!hasId(html, newId)) {
const msg = `⚠️ newId introuvable: ${route} old=${oldId} -> new=${newId}`;
// newId doit exister UNE fois (sinon injection ambiguë)
const newCount = countIdAttr(html, newId);
if (newCount !== 1) {
const msg = `⚠️ newId non-unique (${newCount}) : ${route} new=${newId} (injection ambiguë)`;
if (STRICT) throw new Error(msg);
console.log(msg);
warnCount++;

View File

@@ -0,0 +1,241 @@
#!/usr/bin/env node
import process from "node:process";
function getEnv(name, fallback = "") {
return String(process.env[name] ?? fallback).trim();
}
function sh(value) {
return JSON.stringify(String(value ?? ""));
}
function escapeRegExp(s) {
return String(s).replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
}
function pickLine(body, key) {
const re = new RegExp(`^\\s*${escapeRegExp(key)}\\s*:\\s*([^\\n\\r]+)`, "mi");
const m = String(body || "").match(re);
return m ? m[1].trim() : "";
}
function pickHeadingValue(body, headingKey) {
const re = new RegExp(
`^##\\s*${escapeRegExp(headingKey)}[^\\n]*\\n([\\s\\S]*?)(?=\\n##\\s|\\n\\s*$)`,
"mi"
);
const m = String(body || "").match(re);
if (!m) return "";
const lines = m[1].split(/\r?\n/).map((l) => l.trim());
for (const l of lines) {
if (!l) continue;
if (l.startsWith("<!--")) continue;
return l.replace(/^\/?/, "/").trim();
}
return "";
}
function normalizeChemin(chemin) {
let c = String(chemin || "").trim();
if (!c) return "";
if (!c.startsWith("/")) c = "/" + c;
if (!c.endsWith("/")) c += "/";
return c;
}
function extractCheminFromAnyUrl(text) {
const s = String(text || "");
const m = s.match(/(\/[a-z0-9\-]+\/[a-z0-9\-\/]+\/)#p-\d+-[0-9a-f]{8}/i);
return m ? m[1] : "";
}
function inferType(issue) {
const title = String(issue?.title || "");
const body = String(issue?.body || "").replace(/\r\n/g, "\n");
const fromBody = String(pickLine(body, "Type") || "").trim().toLowerCase();
if (fromBody) return fromBody;
if (title.startsWith("[Correction]")) return "type/correction";
if (title.startsWith("[Fact-check]") || title.startsWith("[Vérification]")) return "type/fact-check";
return "";
}
function inferChemin(issue) {
const title = String(issue?.title || "");
const body = String(issue?.body || "").replace(/\r\n/g, "\n");
return normalizeChemin(
pickLine(body, "Chemin") ||
pickHeadingValue(body, "Chemin") ||
extractCheminFromAnyUrl(body) ||
extractCheminFromAnyUrl(title)
);
}
function labelsOf(issue) {
return Array.isArray(issue?.labels)
? issue.labels.map((l) => String(l?.name || "")).filter(Boolean)
: [];
}
function issueNumber(issue) {
return Number(issue?.number || issue?.index || 0);
}
function parseMeta(issue) {
const labels = labelsOf(issue);
const type = inferType(issue);
const chemin = inferChemin(issue);
const number = issueNumber(issue);
const hasApproved = labels.includes("state/approved");
const hasRejected = labels.includes("state/rejected");
const isProposer = type === "type/correction" || type === "type/fact-check";
const isOpen = String(issue?.state || "open") === "open";
const isPR = Boolean(issue?.pull_request);
const eligible =
number > 0 &&
isOpen &&
!isPR &&
hasApproved &&
!hasRejected &&
isProposer &&
Boolean(chemin);
return {
issue,
number,
type,
chemin,
labels,
hasApproved,
hasRejected,
eligible,
};
}
async function fetchJson(url, token) {
const res = await fetch(url, {
headers: {
Authorization: `token ${token}`,
Accept: "application/json",
"User-Agent": "archicratie-pick-proposer-issue/1.0",
},
});
if (!res.ok) {
const t = await res.text().catch(() => "");
throw new Error(`HTTP ${res.status} ${url}\n${t}`);
}
return await res.json();
}
async function fetchIssue(apiBase, owner, repo, token, n) {
const url = `${apiBase}/api/v1/repos/${owner}/${repo}/issues/${n}`;
return await fetchJson(url, token);
}
async function listOpenIssues(apiBase, owner, repo, token) {
const out = [];
let page = 1;
const limit = 100;
while (true) {
const url = `${apiBase}/api/v1/repos/${owner}/${repo}/issues?state=open&page=${page}&limit=${limit}`;
const batch = await fetchJson(url, token);
if (!Array.isArray(batch) || batch.length === 0) break;
out.push(...batch);
if (batch.length < limit) break;
page += 1;
}
return out;
}
function emitNone(reason) {
process.stdout.write(
[
`TARGET_FOUND="0"`,
`TARGET_REASON=${sh(reason)}`,
`TARGET_PRIMARY_ISSUE=""`,
`TARGET_ISSUES=""`,
`TARGET_COUNT="0"`,
`TARGET_CHEMIN=""`,
].join("\n") + "\n"
);
}
async function main() {
const token = getEnv("FORGE_TOKEN");
const owner = getEnv("GITEA_OWNER");
const repo = getEnv("GITEA_REPO");
const apiBase = (getEnv("FORGE_API") || getEnv("FORGE_BASE")).replace(/\/+$/, "");
const explicit = Number(process.argv[2] || 0);
if (!token) throw new Error("Missing FORGE_TOKEN");
if (!owner || !repo) throw new Error("Missing GITEA_OWNER / GITEA_REPO");
if (!apiBase) throw new Error("Missing FORGE_API / FORGE_BASE");
let metas = [];
if (explicit > 0) {
const issue = await fetchIssue(apiBase, owner, repo, token, explicit);
const meta = parseMeta(issue);
if (!meta.eligible) {
emitNone(
!meta.hasApproved
? "explicit_issue_not_approved"
: meta.hasRejected
? "explicit_issue_rejected"
: !meta.type
? "explicit_issue_missing_type"
: !meta.chemin
? "explicit_issue_missing_chemin"
: "explicit_issue_not_eligible"
);
return;
}
const openIssues = await listOpenIssues(apiBase, owner, repo, token);
metas = openIssues.map(parseMeta).filter((m) => m.eligible && m.chemin === meta.chemin);
} else {
const openIssues = await listOpenIssues(apiBase, owner, repo, token);
metas = openIssues.map(parseMeta).filter((m) => m.eligible);
if (metas.length === 0) {
emitNone("no_open_approved_proposer_issue");
return;
}
metas.sort((a, b) => a.number - b.number);
const first = metas[0];
metas = metas.filter((m) => m.chemin === first.chemin);
}
metas.sort((a, b) => a.number - b.number);
if (metas.length === 0) {
emitNone("no_batch_for_path");
return;
}
const primary = metas[0];
const issues = metas.map((m) => String(m.number));
process.stdout.write(
[
`TARGET_FOUND="1"`,
`TARGET_REASON="ok"`,
`TARGET_PRIMARY_ISSUE=${sh(primary.number)}`,
`TARGET_ISSUES=${sh(issues.join(" "))}`,
`TARGET_COUNT=${sh(issues.length)}`,
`TARGET_CHEMIN=${sh(primary.chemin)}`,
].join("\n") + "\n"
);
}
main().catch((e) => {
console.error("💥 pick-proposer-issue:", e?.message || e);
process.exit(1);
});

View File

@@ -0,0 +1,31 @@
// scripts/purge-dist-dev-whoami.mjs
import fs from "node:fs/promises";
import path from "node:path";
const CWD = process.cwd();
const targetDir = path.join(CWD, "dist", "_auth", "whoami");
const targetIndex = path.join(CWD, "dist", "_auth", "whoami", "index.html");
// Purge idempotente (force=true => pas d'erreur si absent)
async function rmSafe(p) {
try {
await fs.rm(p, { recursive: true, force: true });
return true;
} catch {
return false;
}
}
async function main() {
const removedIndex = await rmSafe(targetIndex);
const removedDir = await rmSafe(targetDir);
// Optionnel: si dist/_auth devient vide, on laisse tel quel (pas besoin de toucher)
const any = removedIndex || removedDir;
console.log(`✅ purge-dist-dev-whoami: ${any ? "purged" : "nothing to purge"}`);
}
main().catch((e) => {
console.error("❌ purge-dist-dev-whoami failed:", e);
process.exit(1);
});

29
scripts/refresh-chapter2.sh Executable file
View File

@@ -0,0 +1,29 @@
#!/usr/bin/env bash
set -euo pipefail
DOCX="sources/docx/archicrat-ia/Chapitre_2Archeogenese_des_regimes_de_co-viabilite-version_officielle.docx"
MANIFEST="sources/manifest.yml"
ONLY="archicrat-ia/chapitre-2"
echo "== Audit source avant fix =="
if ! python3 scripts/audit-docx-source.py "$DOCX"; then
echo
echo "== Fix source =="
python3 scripts/fix-docx-source.py --in-place "$DOCX"
echo
echo "== Audit source après fix =="
python3 scripts/audit-docx-source.py "$DOCX"
fi
echo
echo "== Réimport =="
node scripts/import-docx.mjs --manifest "$MANIFEST" --only "$ONLY" --force
echo
echo "== Build =="
npm run build
echo
echo "== Tests =="
npm test

View File

@@ -205,7 +205,7 @@ for (const [route, mapping] of Object.entries(data)) {
newId,
htmlPath,
msg:
`oldId present but is NOT an injected alias span (<span class="para-alias">).</n` +
`oldId present but is NOT an injected alias span (<span class="para-alias">).\n` +
`Saw: ${seen}`,
});
continue;

View File

@@ -0,0 +1,26 @@
import fs from "node:fs/promises";
import path from "node:path";
const OUT = path.join(process.cwd(), "public", "_auth", "whoami");
const groupsRaw = process.env.PUBLIC_WHOAMI_GROUPS ?? "editors";
const user = process.env.PUBLIC_WHOAMI_USER ?? "dev";
const name = process.env.PUBLIC_WHOAMI_NAME ?? "Dev Local";
const email = process.env.PUBLIC_WHOAMI_EMAIL ?? "area.technik@proton.me";
const groups = groupsRaw
.split(/[;,]/)
.map((s) => s.trim())
.filter(Boolean)
.join(",");
const body =
`Remote-User: ${user}\n` +
`Remote-Name: ${name}\n` +
`Remote-Email: ${email}\n` +
`Remote-Groups: ${groups}\n`;
await fs.mkdir(path.dirname(OUT), { recursive: true });
await fs.writeFile(OUT, body, "utf8");
console.log(`✅ dev whoami written: ${path.relative(process.cwd(), OUT)} (${groups})`);

View File

@@ -0,0 +1,20 @@
import fs from "node:fs";
import path from "node:path";
const root = process.cwd();
const outDir = path.join(root, "public", "__ops");
const outFile = path.join(outDir, "health.json");
const payload = {
service: "archicratie-site",
env: process.env.PUBLIC_OPS_ENV || "unknown",
upstream: process.env.PUBLIC_OPS_UPSTREAM || "unknown",
buildSha: process.env.PUBLIC_BUILD_SHA || "unknown",
builtAt: process.env.PUBLIC_BUILD_TIME || new Date().toISOString(),
};
fs.mkdirSync(outDir, { recursive: true });
fs.writeFileSync(outFile, `${JSON.stringify(payload, null, 2)}\n`, "utf8");
console.log(`✅ ops health written: ${outFile}`);
console.log(payload);

Binary file not shown.

View File

@@ -1,13 +1,22 @@
version: 1
docs:
# =========================
# Document dentrée
# =========================
- source: sources/docx/commencer/document-de-presentation.docx
collection: commencer
slug: document-de-presentation
title: "Document de présentation"
order: 0
# =========================
# Archicratie — Essai-thèse "ArchiCraT-IA"
# =========================
- source: sources/docx/archicrat-ia/Prologue—Archicratie-fondation_et_finalite_sociopolitique_et_historique-version_officielle.docx
collection: archicratie
slug: archicrat-ia/prologue
title: "Prologue — Fondation et finalité sociopolitique et historique"
title: "Prologue — Fondation, finalité sociopolitique et historique"
order: 10
- source: sources/docx/archicrat-ia/Chapitre_1—Fondements_epistemologiques_et_modelisation_Archicratie-version_officielle.docx
@@ -47,115 +56,68 @@ docs:
order: 70
# =========================
# IA — Cas pratique (1 page = 1 chapitre)
# NOTE: on n'inclut PAS le monolithe "Cas_IA-... .docx" dans le manifeste.
# Cas pratique — Gouvernance des systèmes IA
# =========================
- source: sources/docx/cas-ia/Cas_IA-Archicratie_et_gouvernance_des_systemes_IA-Introduction_generale—Mettre_en_scene_un_systeme_IA.docx
collection: ia
slug: cas-pratique/introduction
title: "Cas pratique — Introduction générale : Mettre en scène un système IA"
- source: sources/docx/cas-ia/Cas_Pratique-Archicratie_et_gouvernance_des_systemes_IA-Introduction.docx
collection: cas-ia
slug: introduction
title: "Introduction générale Mettre un système dIA en scène"
order: 110
- source: sources/docx/cas-ia/Cas_IA-Archicratie_et_gouvernance_des_systemes_IA-Chapitre_I—Epreuve_de_detectabilite.docx
collection: ia
slug: cas-pratique/chapitre-1
title: "Cas pratique — Chapitre I : Épreuve de détectabilité"
- source: sources/docx/cas-ia/Cas_Pratique-Archicratie_et_gouvernance_des_systemes_IA-Chapitre_1_Epreuve_de_detectabilite.docx
collection: cas-ia
slug: chapitre-1
title: "Chapitre I Épreuve de détectabilité"
order: 120
- source: sources/docx/cas-ia/Cas_IA-Archicratie_et_gouvernance_des_systemes_IA-Chapitre_II—Epreuve_topologique.docx
collection: ia
slug: cas-pratique/chapitre-2
title: "Cas pratique — Chapitre II : Épreuve topologique"
- source: sources/docx/cas-ia/Cas_Pratique-Archicratie_et_gouvernance_des_systemes_IA-Chapitre_2_Epreuve_Topologique.docx
collection: cas-ia
slug: chapitre-2
title: "Chapitre II Épreuve topologique"
order: 130
- source: sources/docx/cas-ia/Cas_IA-Archicratie_et_gouvernance_des_systemes_IA-Chapitre_III—Epreuve_archeogenetique.docx
collection: ia
slug: cas-pratique/chapitre-3
title: "Cas pratique — Chapitre III : Épreuve archéogénétique"
- source: sources/docx/cas-ia/Cas_Pratique-Archicratie_et_gouvernance_des_systemes_IA-Chapitre_3_Epreuve_archeogenetique.docx
collection: cas-ia
slug: chapitre-3
title: "Chapitre III Épreuve archéogénétique"
order: 140
- source: sources/docx/cas-ia/Cas_IA-Archicratie_et_gouvernance_des_systemes_IA-Chapitre_IV—Epreuve_morphologique.docx
collection: ia
slug: cas-pratique/chapitre-4
title: "Cas pratique — Chapitre IV : Épreuve morphologique"
- source: sources/docx/cas-ia/Cas_Pratique-Archicratie_et_gouvernance_des_systemes_IA-Chapitre_4_Epreuve_Morphologique.docx
collection: cas-ia
slug: chapitre-4
title: "Chapitre IV Épreuve morphologique"
order: 150
- source: sources/docx/cas-ia/Cas_IA-Archicratie_et_gouvernance_des_systemes_IA-Chapitre_V—Epreuve_historique.docx
collection: ia
slug: cas-pratique/chapitre-5
title: "Cas pratique — Chapitre V : Épreuve historique"
- source: sources/docx/cas-ia/Cas_Pratique-Archicratie_et_gouvernance_des_systemes_IA-Chapitre_5_Epreuve_Historique.docx
collection: cas-ia
slug: chapitre-5
title: "Chapitre V Épreuve historique"
order: 160
- source: sources/docx/cas-ia/Cas_IA-Archicratie_et_gouvernance_des_systemes_IA-Chapitre_VI—Epreuve_de_co-viabilite.docx
collection: ia
slug: cas-pratique/chapitre-6
title: "Cas pratique — Chapitre VI : Épreuve de co-viabilité"
- source: sources/docx/cas-ia/Cas_Pratique-Archicratie_et_gouvernance_des_systemes_IA-Chapitre_6_Epreuve_de_Co-viabilite.docx
collection: cas-ia
slug: chapitre-6
title: "Chapitre VI Épreuve de co-viabilité"
order: 170
- source: sources/docx/cas-ia/Cas_IA-Archicratie_et_gouvernance_des_systemes_IA-Chapitre_VII—Gestes_archicratiques_concrets_pour_un_systeme_IA.docx
collection: ia
slug: cas-pratique/chapitre-7
title: "Cas pratique — Chapitre VII : Gestes archicratiques concrets"
- source: sources/docx/cas-ia/Cas_Pratique-Archicratie_et_gouvernance_des_systemes_IA-Chapitre_7_Gestes_archicratiques_concrets_pour_un_systeme_IA.docx
collection: cas-ia
slug: chapitre-7
title: "Chapitre VII Gestes archicratiques concrets pour un système dIA"
order: 180
- source: sources/docx/cas-ia/Cas_IA-Archicratie_et_gouvernance_des_systemes_IA-Conclusion.docx
collection: ia
slug: cas-pratique/conclusion
title: "Cas pratique — Conclusion"
- source: sources/docx/cas-ia/Cas_Pratique-Archicratie_et_gouvernance_des_systemes_IA-Conclusion.docx
collection: cas-ia
slug: conclusion
title: "Conclusion"
order: 190
- source: sources/docx/cas-ia/Cas_IA-Archicratie_et_gouvernance_des_systemes_IA-AnnexeGlossaire_archicratique_pour_audit_des_systemes_IA.docx
collection: ia
slug: cas-pratique/annexe-glossaire-audit
title: "Cas pratique — Annexe : Glossaire archicratique pour audit des systèmes IA"
- source: sources/docx/cas-ia/Cas_Pratique-Archicratie_et_gouvernance_des_systemes_IA-Annexe_Glossaire_Archicratique_Cas_IA.docx
collection: cas-ia
slug: annexe-glossaire-audit
title: "Annexe Glossaire archicratique pour laudit des systèmes dIA"
order: 195
# =========================
# Traité — Ontodynamique générative (1 page = 1 chapitre)
# NOTE: on n'inclut PAS le monolithe "Traite-...-version_officielle.docx" dans le manifeste.
# =========================
- source: sources/docx/traite/Traite-Ontodynamique_Generative-Fondements_Archicratie-Introduction-version_officielle.docx
collection: traite
slug: ontodynamique/introduction
title: "Traité — Introduction"
order: 210
- source: sources/docx/traite/Traite-Ontodynamique_Generative-Fondements_Archicratie-Chapitre_1—Le_flux_ontogenetique-version_officielle.docx
collection: traite
slug: ontodynamique/chapitre-1
title: "Traité — Chapitre 1 : Le flux ontogénétique"
order: 220
- source: sources/docx/traite/Traite-Ontodynamique_Generative-Fondements_Archicratie-Chapitre_2—economie_du_reel-version_officielle.docx
collection: traite
slug: ontodynamique/chapitre-2
title: "Traité — Chapitre 2 : Économie du réel"
order: 230
- source: sources/docx/traite/Traite-Ontodynamique_Generative-Fondements_Archicratie-Chapitre_3—Le_reel_comme_systeme_regulateur-version_officielle.docx
collection: traite
slug: ontodynamique/chapitre-3
title: "Traité — Chapitre 3 : Le réel comme système régulateur"
order: 240
- source: sources/docx/traite/Traite-Ontodynamique_Generative-Fondements_Archicratie-Chapitre_4—Arcalite-structures_formes_invariants-version_officielle.docx
collection: traite
slug: ontodynamique/chapitre-4
title: "Traité — Chapitre 4 : Arcalité — structures, formes, invariants"
order: 250
- source: sources/docx/traite/Traite-Ontodynamique_Generative-Fondements_Archicratie-Chapitre_5-Cratialite-forces_flux_gradients-version_officielle.docx
collection: traite
slug: ontodynamique/chapitre-5
title: "Traité — Chapitre 5 : Cratialité — forces, flux, gradients"
order: 260
- source: sources/docx/traite/Traite-Ontodynamique_Generative-Fondements_Archicratie-Chapitre_6—Archicration-version_officielle.docx
collection: traite
slug: ontodynamique/chapitre-6
title: "Traité — Chapitre 6 : Archicration"
order: 270
# =========================
# Glossaire / Lexique
# =========================
@@ -169,4 +131,4 @@ docs:
collection: glossaire
slug: mini-glossaire-verbes
title: "Mini-glossaire des verbes de la scène archicratique"
order: 910
order: 910

View File

@@ -1,2 +1 @@
{}

0
src/annotations/.gitkeep Normal file
View File

View File

@@ -1,59 +0,0 @@
schema: 1
# optionnel (si présent, doit matcher le chemin du fichier)
page: archicratie/archicrat-ia/prologue
paras:
p-0-d7974f88:
refs:
- label: "Happycratie — (Cabanas & Illouz) via Cairn"
url: "https://shs.cairn.info/revue-ethnologie-francaise-2019-4-page-813?lang=fr"
kind: "article"
- label: "Techno-féodalisme — Variations (OpenEdition)"
url: "https://journals.openedition.org/variations/2290"
kind: "article"
authors:
- "Eva Illouz"
- "Yanis Varoufakis"
quotes:
- text: "Dans Happycratie, Edgar Cabanas et Eva Illouz..."
source: "Happycratie, p.1"
- text: "En eux-mêmes, les actifs ne sont ni féodaux ni capitalistes..."
source: "Entretien Morozov/Varoufakis — techno-féodalisme"
media:
- type: "image"
src: "/public/media/archicratie/archicrat-ia/prologue/p-0-d7974f88/schema-1.svg"
caption: "Tableau explicatif"
credit: "ChatGPT"
- type: "image"
src: "/public/media/archicratie/archicrat-ia/prologue/p-0-d7974f88/schema-2.svg"
caption: "Diagramme dévolution"
credit: "Yanis Varoufakis"
comments_editorial:
- text: "TODO: nuancer / préciser — commentaire éditorial versionné (pas public)."
status: "draft"
p-1-2ef25f29:
refs:
- label: "Kafka et le pouvoir — Bernard Lahire (Cairn)"
url: "https://shs.cairn.info/franz-kafka--9782707159410-page-475?lang=fr"
kind: "book"
authors:
- "Bernard Lahire"
quotes:
- text: "Si lon voulait chercher quelque chose comme une vision du monde chez Kafka..."
source: "Bernard Lahire, Franz Kafka, p.475+"
media:
- type: "video"
src: "/media/prologue/p-1-2ef25f29/bien_commun.mp4"
caption: "Entretien avec Bernard Lahire"
credit: "Cairn.info"
comments_editorial: []

View File

@@ -1,29 +1,42 @@
---
import { getCollection } from "astro:content";
const { currentSlug } = Astro.props;
const {
currentSlug,
collection = "archicrat-ia",
basePath = "/archicrat-ia",
label = "Table des matières"
} = Astro.props;
const entries = (await getCollection("archicratie"))
.filter((e) => e.slug.startsWith("archicrat-ia/"))
.sort((a, b) => (a.data.order ?? 0) - (b.data.order ?? 0));
const slugOf = (entry) => String(entry.id).replace(/\.(md|mdx)$/i, "");
const hrefOf = (entry) => `${basePath}/${slugOf(entry)}/`;
// ✅ On route lEssai-thèse sur /archicrat-ia/<slug-sans-prefix>/
// (Astro trailingSlash = always → on garde le "/" final)
const strip = (s) => String(s || "").replace(/^archicrat-ia\//, "");
const href = (slug) => `/archicrat-ia/${strip(slug)}/`;
const collator = new Intl.Collator("fr", { sensitivity: "base", numeric: true });
const entries = [...await getCollection(collection)].sort((a, b) => {
const ao = Number(a.data.order ?? 9999);
const bo = Number(b.data.order ?? 9999);
if (ao !== bo) return ao - bo;
const at = String(a.data.title ?? a.data.term ?? slugOf(a));
const bt = String(b.data.title ?? b.data.term ?? slugOf(b));
return collator.compare(at, bt);
});
---
<nav class="toc-global" aria-label="Table des matières — ArchiCraT-IA">
<nav class="toc-global" aria-label={label}>
<div class="toc-global__head">
<div class="toc-global__title">Table des matières</div>
<div class="toc-global__title">{label}</div>
</div>
<ol class="toc-global__list">
{entries.map((e) => {
const active = e.slug === currentSlug;
const slug = slugOf(e);
const active = slug === 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={hrefOf(e)} aria-current={active ? "page" : undefined}>
<span class="toc-link__row">
{active ? (
<span class="toc-active-indicator" aria-hidden="true">👉</span>
@@ -163,4 +176,4 @@ const href = (slug) => `/archicrat-ia/${strip(slug)}/`;
const active = document.querySelector(".toc-global .toc-item.is-active");
if (active) active.scrollIntoView({ block: "nearest" });
})();
</script>
</script>

View File

@@ -0,0 +1,237 @@
---
import {
getGlossaryEntryAsideData,
getGlossaryPortalLinks,
hrefOfGlossaryEntry,
slugOfGlossaryEntry,
} from "../lib/glossary";
const {
currentEntry,
allEntries = [],
} = Astro.props;
const currentSlug = slugOfGlossaryEntry(currentEntry);
const {
displayFamily,
displayDomain,
displayLevel,
showNoyau,
showSameFamily,
fondamentaux,
sameFamilyTitle,
sameFamilyEntries,
relationSections,
contextualTheory,
} = getGlossaryEntryAsideData(currentEntry, allEntries);
const portalLinks = getGlossaryPortalLinks();
---
<nav class="glossary-aside" aria-label="Navigation du glossaire">
<div class="glossary-aside__block glossary-aside__block--intro">
<a class="glossary-aside__back" href="/glossaire/">← Retour au glossaire</a>
<div class="glossary-aside__title">Glossaire archicratique</div>
<div class="glossary-aside__pills" aria-label="Repères de lecture">
<span class="glossary-aside__pill glossary-aside__pill--family">
{displayFamily}
</span>
{displayDomain && (
<span class="glossary-aside__pill">{displayDomain}</span>
)}
{displayLevel && (
<span class="glossary-aside__pill">{displayLevel}</span>
)}
</div>
</div>
<section class="glossary-aside__block">
<h2 class="glossary-aside__heading">Portails</h2>
<ul class="glossary-aside__list">
{portalLinks.map((item) => (
<li><a href={item.href}>{item.label}</a></li>
))}
</ul>
</section>
{showNoyau && (
<section class="glossary-aside__block">
<h2 class="glossary-aside__heading">Noyau archicratique</h2>
<ul class="glossary-aside__list">
{fondamentaux.map((entry) => {
const active = slugOfGlossaryEntry(entry) === currentSlug;
return (
<li>
<a
href={hrefOfGlossaryEntry(entry)}
aria-current={active ? "page" : undefined}
class={active ? "is-active" : undefined}
>
{entry.data.term}
</a>
</li>
);
})}
</ul>
</section>
)}
{showSameFamily && (
<section class="glossary-aside__block">
<h2 class="glossary-aside__heading">{sameFamilyTitle}</h2>
<ul class="glossary-aside__list">
{sameFamilyEntries.map((entry) => {
const active = slugOfGlossaryEntry(entry) === currentSlug;
return (
<li>
<a
href={hrefOfGlossaryEntry(entry)}
aria-current={active ? "page" : undefined}
class={active ? "is-active" : undefined}
>
{entry.data.term}
</a>
</li>
);
})}
</ul>
</section>
)}
{relationSections.length > 0 && (
<section class="glossary-aside__block">
<h2 class="glossary-aside__heading">Autour de cette fiche</h2>
{relationSections.map((section) => (
<>
<h3 class="glossary-aside__subheading">{section.title}</h3>
<ul class="glossary-aside__list">
{section.items.map((entry) => (
<li><a href={hrefOfGlossaryEntry(entry)}>{entry.data.term}</a></li>
))}
</ul>
</>
))}
</section>
)}
{contextualTheory.length > 0 && (
<section class="glossary-aside__block">
<h2 class="glossary-aside__heading">Paysage théorique</h2>
<ul class="glossary-aside__list">
{contextualTheory.map((entry) => (
<li><a href={hrefOfGlossaryEntry(entry)}>{entry.data.term}</a></li>
))}
</ul>
</section>
)}
</nav>
<style>
.glossary-aside{
display: flex;
flex-direction: column;
gap: 14px;
}
.glossary-aside__block{
border: 1px solid rgba(127,127,127,0.22);
border-radius: 16px;
padding: 14px;
background: rgba(127,127,127,0.05);
}
.glossary-aside__block--intro{
padding-top: 13px;
padding-bottom: 13px;
}
.glossary-aside__back{
display: inline-block;
margin-bottom: 10px;
font-size: 14px;
font-weight: 700;
line-height: 1.35;
text-decoration: none;
}
.glossary-aside__title{
font-size: 16px;
font-weight: 800;
letter-spacing: .2px;
line-height: 1.3;
}
.glossary-aside__pills{
display: flex;
flex-wrap: wrap;
gap: 7px;
margin-top: 10px;
}
.glossary-aside__pill{
display: inline-flex;
align-items: center;
padding: 5px 10px;
border: 1px solid rgba(127,127,127,0.24);
border-radius: 999px;
background: rgba(127,127,127,0.04);
font-size: 13px;
line-height: 1.35;
opacity: .92;
}
.glossary-aside__pill--family{
border-color: rgba(127,127,127,0.38);
font-weight: 800;
}
.glossary-aside__heading{
margin: 0 0 11px;
font-size: 14px;
font-weight: 800;
line-height: 1.35;
opacity: .94;
}
.glossary-aside__subheading{
margin: 13px 0 8px;
font-size: 12.5px;
font-weight: 800;
line-height: 1.35;
opacity: .82;
text-transform: uppercase;
letter-spacing: .04em;
}
.glossary-aside__list{
list-style: none;
margin: 0;
padding: 0;
}
.glossary-aside__list li{
margin: 7px 0;
}
.glossary-aside__list a{
text-decoration: none;
font-size: 14px;
line-height: 1.4;
}
.glossary-aside__list a.is-active{
font-weight: 800;
}
@media (prefers-color-scheme: dark){
.glossary-aside__block,
.glossary-aside__pill{
background: rgba(255,255,255,0.04);
}
}
</style>

View File

@@ -0,0 +1,83 @@
---
import { hrefOfGlossaryEntry, type GlossaryEntry } from "../lib/glossary";
export interface Props {
entries?: GlossaryEntry[];
wide?: boolean;
}
const {
entries = [],
wide = false,
} = Astro.props;
---
<div class="glossary-cards">
{entries.map((entry) => (
<a
class:list={[
"glossary-card",
wide && "glossary-card--wide",
]}
href={hrefOfGlossaryEntry(entry)}
>
<strong>{entry.data.term}</strong>
<span>{entry.data.definitionShort}</span>
</a>
))}
</div>
<style>
.glossary-cards{
display: grid;
grid-template-columns: repeat(auto-fit, minmax(220px, 1fr));
gap: 12px;
margin-top: 14px;
}
.glossary-card{
display: flex;
flex-direction: column;
gap: 8px;
padding: 14px 16px;
border: 1px solid var(--glossary-border);
border-radius: 18px;
background: var(--glossary-bg-soft);
text-decoration: none;
transition: transform 120ms ease, background 120ms ease, border-color 120ms ease;
}
.glossary-card:hover{
transform: translateY(-1px);
background: var(--glossary-bg-soft-strong);
border-color: rgba(0,217,255,0.16);
text-decoration: none;
}
.glossary-card--wide{
grid-column: 1 / -1;
}
.glossary-card strong{
color: var(--glossary-accent);
font-size: 1.04rem;
line-height: 1.28;
}
.glossary-card span{
color: inherit;
font-size: 1rem;
line-height: 1.5;
opacity: .94;
}
@media (prefers-color-scheme: dark){
.glossary-card{
background: rgba(255,255,255,0.04);
}
.glossary-card:hover{
background: rgba(255,255,255,0.07);
}
}
</style>

View File

@@ -0,0 +1,16 @@
<div class="glossary-entry-body">
<slot />
</div>
<style>
.glossary-entry-body{
margin-bottom: 28px;
}
:global(.glossary-entry-body h2),
:global(.glossary-entry-body h3),
:global(.glossary-relations h2),
:global(.glossary-relations h3){
scroll-margin-top: calc(var(--sticky-offset-px, 96px) + 18px);
}
</style>

View File

@@ -0,0 +1,230 @@
---
interface Props {
term: string;
definitionShort: string;
displayFamily: string;
displayDomain?: string;
displayLevel?: string;
mobilizedAuthors?: string[];
comparisonTraditions?: string[];
}
const {
term,
definitionShort,
displayFamily,
displayDomain = "",
displayLevel = "",
mobilizedAuthors = [],
comparisonTraditions = [],
} = Astro.props;
const hasScholarlyMeta =
mobilizedAuthors.length > 0 ||
comparisonTraditions.length > 0;
---
<header class="glossary-entry-head" data-ge-hero>
<div class="glossary-entry-head__title">
<h1>{term}</h1>
</div>
<div class="glossary-entry-summary">
<p class="glossary-entry-dek">
<em>{definitionShort}</em>
</p>
<div class="glossary-entry-signals" aria-label="Repères de lecture">
<span class="glossary-pill glossary-pill--family">
<strong>Famille :</strong> {displayFamily}
</span>
{displayDomain && (
<span class="glossary-pill">
<strong>Domaine :</strong> {displayDomain}
</span>
)}
{displayLevel && (
<span class="glossary-pill">
<strong>Niveau :</strong> {displayLevel}
</span>
)}
</div>
{hasScholarlyMeta && (
<div class="glossary-entry-meta">
{mobilizedAuthors.length > 0 && (
<p>
<strong>Auteurs mobilisés :</strong> {mobilizedAuthors.join(" / ")}
</p>
)}
{comparisonTraditions.length > 0 && (
<p>
<strong>Traditions de comparaison :</strong> {comparisonTraditions.join(" / ")}
</p>
)}
</div>
)}
</div>
</header>
<style>
.glossary-entry-head{
position: sticky;
top: calc(var(--sticky-header-h, 0px) + var(--page-gap, 12px));
z-index: 11;
margin: 0 0 24px;
border: 1px solid rgba(127,127,127,0.18);
border-radius: 28px;
background:
linear-gradient(180deg, rgba(0,0,0,0.60), rgba(0,0,0,0.92)),
radial-gradient(900px 240px at 20% 0%, rgba(0,217,255,0.08), transparent 60%);
backdrop-filter: blur(10px);
-webkit-backdrop-filter: blur(10px);
overflow: hidden;
transition:
border-radius 180ms ease,
box-shadow 180ms ease,
border-color 180ms ease;
}
.glossary-entry-head__title{
padding:
var(--entry-hero-pad-top, 18px)
var(--entry-hero-pad-x, 18px)
calc(var(--entry-hero-pad-top, 18px) - 2px);
transition: padding 180ms ease;
}
.glossary-entry-head h1{
margin: 0;
font-size: var(--entry-hero-h1-size, clamp(2.2rem, 4vw, 3.15rem));
line-height: 1.02;
letter-spacing: -.04em;
font-weight: 850;
transition: font-size 180ms ease;
}
.glossary-entry-summary{
display: grid;
gap: var(--entry-hero-gap, 14px);
padding:
calc(var(--entry-hero-pad-bottom, 18px) - 2px)
var(--entry-hero-pad-x, 18px)
var(--entry-hero-pad-bottom, 18px);
border-top: 1px solid rgba(127,127,127,0.14);
background: rgba(255,255,255,0.02);
transition: gap 180ms ease, padding 180ms ease;
}
.glossary-entry-dek{
margin: 0;
max-width: var(--entry-hero-dek-maxw, 76ch);
font-size: var(--entry-hero-dek-size, 1.04rem);
line-height: var(--entry-hero-dek-lh, 1.55);
opacity: .94;
transition:
max-width 180ms ease,
font-size 180ms ease,
line-height 180ms ease;
}
.glossary-entry-signals{
display: flex;
flex-wrap: wrap;
gap: 8px;
margin: 0;
transition: gap 180ms ease;
}
.glossary-pill{
display: inline-flex;
align-items: center;
gap: 6px;
padding: 5px 10px;
border: 1px solid rgba(127,127,127,0.24);
border-radius: 999px;
background: rgba(127,127,127,0.05);
font-size: 13px;
line-height: 1.35;
transition:
padding 180ms ease,
font-size 180ms ease,
background 120ms ease,
border-color 120ms ease;
}
.glossary-pill--family{
border-color: rgba(127,127,127,0.36);
font-weight: 700;
}
.glossary-entry-meta{
margin: 0;
padding: 10px 12px;
border: 1px solid rgba(127,127,127,0.18);
border-radius: 12px;
background: rgba(127,127,127,0.04);
max-height: var(--entry-hero-meta-max-h, 12rem);
opacity: var(--entry-hero-meta-opacity, 1);
overflow: hidden;
transition:
max-height 180ms ease,
opacity 140ms ease,
padding 180ms ease,
border-color 180ms ease;
}
.glossary-entry-meta p{
margin: 0;
font-size: 14px;
line-height: 1.5;
}
.glossary-entry-meta p + p{
margin-top: 6px;
}
@media (max-width: 720px){
.glossary-entry-signals{
gap: 6px;
}
.glossary-pill{
font-size: 12px;
}
}
@media (max-width: 860px){
.glossary-entry-head{
position: static;
border-radius: 22px;
margin-bottom: 20px;
}
.glossary-entry-head__title{
padding: 14px 14px 12px;
}
.glossary-entry-summary{
gap: 12px;
padding: 14px;
}
.glossary-entry-dek{
max-width: none;
}
}
@media (prefers-color-scheme: dark){
.glossary-entry-meta{
background: rgba(255,255,255,0.03);
}
.glossary-pill{
background: rgba(255,255,255,0.04);
}
}
</style>

View File

@@ -0,0 +1,31 @@
---
interface Props {
canonicalHref: string;
term: string;
}
const { canonicalHref, term } = Astro.props;
---
<p class="glossary-legacy-note">
Cette entrée a été renommée. Lintitulé canonique est :
<a href={canonicalHref}>{term}</a>.
</p>
<style>
.glossary-legacy-note{
padding: 10px 12px;
border: 1px solid rgba(127,127,127,0.22);
border-radius: 12px;
background: rgba(127,127,127,0.05);
font-size: 14px;
line-height: 1.45;
margin-bottom: 18px;
}
@media (prefers-color-scheme: dark){
.glossary-legacy-note{
background: rgba(255,255,255,0.04);
}
}
</style>

View File

@@ -0,0 +1,185 @@
<script is:inline>
(() => {
const boot = () => {
const body = document.body;
const root = document.documentElement;
const hero = document.querySelector("[data-ge-hero]");
const follow = document.getElementById("reading-follow");
const mqMobile = window.matchMedia("(max-width: 860px)");
if (!body || !root || !hero || !follow) return;
const BODY_CLASS = "is-glossary-entry-page";
const FOLLOW_ON_CLASS = "glossary-entry-follow-on";
let lastHeight = -1;
let lastFollowOn = null;
let raf = 0;
body.classList.add(BODY_CLASS);
const heroHeight = () =>
Math.max(0, Math.round(hero.getBoundingClientRect().height || 0));
const computeFollowOn = () =>
!mqMobile.matches &&
follow.classList.contains("is-on") &&
follow.style.display !== "none" &&
follow.getAttribute("aria-hidden") !== "true";
const stripLocalSticky = () => {
document
.querySelectorAll(
".glossary-entry-body h2, .glossary-entry-body h3, .glossary-relations h2, .glossary-relations h3"
)
.forEach((el) => {
el.classList.remove("is-sticky");
el.removeAttribute("data-sticky-active");
});
};
const applyLocalStickyHeight = () => {
const h = mqMobile.matches ? 0 : heroHeight();
if (h === lastHeight) return;
lastHeight = h;
if (typeof window.__archiSetLocalStickyHeight === "function") {
window.__archiSetLocalStickyHeight(h);
} else {
root.style.setProperty("--glossary-local-sticky-h", `${h}px`);
}
};
const syncFollowState = () => {
const on = computeFollowOn();
if (on === lastFollowOn) return;
lastFollowOn = on;
body.classList.toggle(FOLLOW_ON_CLASS, on);
};
const syncAll = () => {
stripLocalSticky();
syncFollowState();
applyLocalStickyHeight();
};
const schedule = () => {
if (raf) return;
raf = requestAnimationFrame(() => {
raf = 0;
syncAll();
});
};
const followObserver = new MutationObserver(schedule);
followObserver.observe(follow, {
attributes: true,
attributeFilter: ["class", "style", "aria-hidden"],
subtree: false,
});
const heroResizeObserver =
typeof ResizeObserver !== "undefined"
? new ResizeObserver(schedule)
: null;
heroResizeObserver?.observe(hero);
window.addEventListener("resize", schedule);
window.addEventListener("pageshow", schedule);
if (document.fonts?.ready) {
document.fonts.ready.then(schedule).catch(() => {});
}
if (mqMobile.addEventListener) {
mqMobile.addEventListener("change", schedule);
} else if (mqMobile.addListener) {
mqMobile.addListener(schedule);
}
schedule();
};
if (document.readyState === "loading") {
document.addEventListener("DOMContentLoaded", boot, { once: true });
} else {
boot();
}
})();
</script>
<style>
:global(body.is-glossary-entry-page #reading-follow){
z-index: 10;
}
:global(body.is-glossary-entry-page.glossary-entry-follow-on .glossary-entry-signals){
gap: 6px;
}
:global(body.is-glossary-entry-page.glossary-entry-follow-on .glossary-entry-head){
margin-bottom: 0;
border-bottom-left-radius: 0;
border-bottom-right-radius: 0;
}
:global(body.is-glossary-entry-page.glossary-entry-follow-on .glossary-entry-summary){
gap: 10px;
padding-top: 12px;
padding-bottom: 10px;
}
:global(body.is-glossary-entry-page.glossary-entry-follow-on .glossary-entry-dek){
display: -webkit-box;
-webkit-box-orient: vertical;
-webkit-line-clamp: 2;
overflow: hidden;
}
:global(body.is-glossary-entry-page.glossary-entry-follow-on .glossary-pill){
padding: 4px 8px;
font-size: 12px;
}
:global(body.is-glossary-entry-page.glossary-entry-follow-on .glossary-entry-meta){
padding: 0;
border-color: transparent;
}
:global(body.is-glossary-entry-page.glossary-entry-follow-on #reading-follow){
transform: translateY(-1px);
}
:global(body.is-glossary-entry-page.glossary-entry-follow-on #reading-follow .reading-follow__inner){
margin-top: -1px;
border-top-left-radius: 0;
border-top-right-radius: 0;
}
:global(body.is-glossary-entry-page .glossary-entry-body h2.is-sticky),
:global(body.is-glossary-entry-page .glossary-entry-body h2[data-sticky-active="true"]),
:global(body.is-glossary-entry-page .glossary-entry-body h3.is-sticky),
:global(body.is-glossary-entry-page .glossary-entry-body h3[data-sticky-active="true"]),
:global(body.is-glossary-entry-page .glossary-relations h2.is-sticky),
:global(body.is-glossary-entry-page .glossary-relations h2[data-sticky-active="true"]),
:global(body.is-glossary-entry-page .glossary-relations h3.is-sticky),
:global(body.is-glossary-entry-page .glossary-relations h3[data-sticky-active="true"]){
position: static !important;
top: auto !important;
z-index: auto !important;
padding: 0 !important;
border: 0 !important;
background: transparent !important;
box-shadow: none !important;
backdrop-filter: none !important;
-webkit-backdrop-filter: none !important;
}
@media (max-width: 860px){
:global(body.is-glossary-entry-page.glossary-entry-follow-on .glossary-entry-head){
margin-bottom: 20px;
border-radius: 22px;
}
}
</style>

View File

@@ -0,0 +1,143 @@
---
import {
getFondamentaux,
getGlossaryHomeStats,
getGlossaryPortalLinks,
hrefOfGlossaryEntry,
} from "../lib/glossary";
const {
allEntries = [],
} = Astro.props;
const fondamentaux = getFondamentaux(allEntries);
const portalLinks = getGlossaryPortalLinks();
const {
totalEntries,
paradigmesCount,
doctrinesCount,
metaRegimesCount,
} = getGlossaryHomeStats(allEntries);
---
<nav class="glossary-home-aside" aria-label="Navigation du portail du glossaire">
<div class="glossary-home-aside__block glossary-home-aside__block--intro">
<div class="glossary-home-aside__title">Glossaire archicratique</div>
<div class="glossary-home-aside__meta">
portail de lecture · cartographie conceptuelle
</div>
<div class="glossary-home-aside__pills" aria-label="Repères de navigation">
<span class="glossary-home-aside__pill">{totalEntries} entrées</span>
<span class="glossary-home-aside__pill">{metaRegimesCount} méta-régimes</span>
<span class="glossary-home-aside__pill">
{doctrinesCount} doctrine{doctrinesCount > 1 ? "s" : ""} · {paradigmesCount} paradigme{paradigmesCount > 1 ? "s" : ""}
</span>
</div>
</div>
<section class="glossary-home-aside__block">
<h2 class="glossary-home-aside__heading">Parcours du glossaire</h2>
<ul class="glossary-home-aside__list">
{portalLinks.map((item) => (
<li><a href={item.href}>{item.label}</a></li>
))}
</ul>
</section>
{fondamentaux.length > 0 && (
<section class="glossary-home-aside__block">
<h2 class="glossary-home-aside__heading">Noyau archicratique</h2>
<ul class="glossary-home-aside__list">
{fondamentaux.map((entry) => (
<li><a href={hrefOfGlossaryEntry(entry)}>{entry.data.term}</a></li>
))}
</ul>
</section>
)}
</nav>
<style>
.glossary-home-aside{
display: flex;
flex-direction: column;
gap: 14px;
}
.glossary-home-aside__block{
border: 1px solid rgba(127,127,127,0.22);
border-radius: 16px;
padding: 14px;
background: rgba(127,127,127,0.05);
}
.glossary-home-aside__block--intro{
padding-top: 13px;
padding-bottom: 13px;
}
.glossary-home-aside__title{
font-size: 16px;
font-weight: 800;
letter-spacing: .2px;
line-height: 1.3;
}
.glossary-home-aside__meta{
margin-top: 8px;
font-size: 13px;
line-height: 1.4;
opacity: .8;
}
.glossary-home-aside__pills{
display: flex;
flex-wrap: wrap;
gap: 7px;
margin-top: 11px;
}
.glossary-home-aside__pill{
display: inline-flex;
align-items: center;
padding: 5px 10px;
border: 1px solid rgba(127,127,127,0.24);
border-radius: 999px;
background: rgba(127,127,127,0.04);
font-size: 13px;
line-height: 1.35;
opacity: .92;
}
.glossary-home-aside__heading{
margin: 0 0 11px;
font-size: 14px;
font-weight: 800;
line-height: 1.35;
opacity: .94;
}
.glossary-home-aside__list{
list-style: none;
margin: 0;
padding: 0;
}
.glossary-home-aside__list li{
margin: 7px 0;
}
.glossary-home-aside__list a{
text-decoration: none;
font-size: 14px;
line-height: 1.4;
}
@media (prefers-color-scheme: dark){
.glossary-home-aside__block,
.glossary-home-aside__pill{
background: rgba(255,255,255,0.04);
}
}
</style>

View File

@@ -0,0 +1,103 @@
---
export interface Props {
kicker?: string;
title?: string;
intro?: string;
}
const {
kicker = "Référentiel terminologique",
title = "Glossaire archicratique",
intro = "Ce glossaire nest pas seulement un index de définitions. Il constitue une porte dentrée dans la pensée archicratique : une cartographie raisonnée des concepts fondamentaux, des scènes, des dynamiques et des méta-régimes à partir desquels une société peut être décrite comme organisation de tensions et recherche de co-viabilité.",
} = Astro.props;
---
<header class="glossary-hero" id="glossary-hero">
<p class="glossary-kicker">{kicker}</p>
<h1>{title}</h1>
<p class="glossary-intro">{intro}</p>
<h2
class="glossary-hero-follow"
id="glossary-hero-follow"
aria-hidden="true"
></h2>
</header>
<style>
.glossary-hero{
position: sticky;
top: var(--glossary-sticky-top);
z-index: 12;
margin-bottom: 28px;
padding: 14px 16px 18px;
border: 1px solid rgba(127,127,127,0.18);
border-radius: 28px;
background:
linear-gradient(180deg, rgba(0,0,0,0.60), rgba(0,0,0,0.90)),
radial-gradient(900px 240px at 20% 0%, rgba(0,217,255,0.08), transparent 60%);
transition:
background 300ms cubic-bezier(.22,.8,.22,1),
border-color 300ms cubic-bezier(.22,.8,.22,1),
box-shadow 300ms cubic-bezier(.22,.8,.22,1);
backdrop-filter: blur(10px);
-webkit-backdrop-filter: blur(10px);
display: grid;
row-gap: 12px;
}
.glossary-kicker{
margin: 0;
font-size: 12px;
letter-spacing: .12em;
text-transform: uppercase;
opacity: .72;
}
.glossary-hero h1{
margin: 0;
font-size: clamp(2.2rem, 4vw, 3.15rem);
line-height: 1.02;
letter-spacing: -.04em;
font-weight: 850;
}
.glossary-intro{
margin: 0;
max-width: 72ch;
font-size: 1.05rem;
line-height: 1.55;
opacity: .94;
}
.glossary-hero-follow{
margin: 2px 0 0;
min-height: var(--glossary-follow-height);
display: flex;
align-items: flex-end;
opacity: 0;
transform: translateY(10px) scale(.985);
filter: blur(6px);
transition:
opacity 220ms cubic-bezier(.22,1,.36,1),
transform 320ms cubic-bezier(.22,1,.36,1),
filter 320ms cubic-bezier(.22,1,.36,1);
pointer-events: none;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
will-change: opacity, transform, filter;
}
.glossary-hero-follow.is-visible{
opacity: 1;
transform: translateY(0) scale(1);
filter: blur(0);
}
@media (max-width: 760px){
.glossary-hero{
top: calc(var(--glossary-sticky-top) - 2px);
padding: 12px 14px 16px;
}
}
</style>

View File

@@ -0,0 +1,109 @@
---
export interface Props {
id?: string;
title: string;
intro?: string;
followSection?: string;
ctaHref?: string;
ctaLabel?: string;
}
const {
id,
title,
intro,
followSection,
ctaHref,
ctaLabel,
} = Astro.props;
const resolvedFollowSection = (followSection || title || "").trim();
const showCta = Boolean(ctaHref && ctaLabel);
---
<section id={id} class="glossary-section">
<div class="glossary-section__head">
<div>
<h2 data-follow-section={resolvedFollowSection}>{title}</h2>
{intro && (
<p class="glossary-intro">{intro}</p>
)}
</div>
{showCta && (
<a class="glossary-cta" href={ctaHref}>
{ctaLabel}
</a>
)}
</div>
<slot />
</section>
<style>
.glossary-section{
margin-top: 42px;
scroll-margin-top: calc(var(--glossary-sticky-top) + 190px);
}
.glossary-section__head{
display: flex;
justify-content: space-between;
align-items: start;
gap: 16px;
flex-wrap: wrap;
margin-bottom: 14px;
}
.glossary-section h2{
margin: 0;
font-size: clamp(2rem, 3vw, 2.55rem);
line-height: 1.06;
letter-spacing: -.03em;
font-weight: 800;
}
.glossary-intro{
margin: 0;
max-width: 72ch;
font-size: 1.05rem;
line-height: 1.55;
opacity: .94;
}
.glossary-section__head .glossary-intro{
margin-top: 10px;
}
.glossary-cta{
display: inline-flex;
align-items: center;
justify-content: center;
min-height: 40px;
border: 1px solid var(--glossary-border-strong);
border-radius: 999px;
padding: 7px 14px;
color: var(--glossary-accent);
text-decoration: none;
white-space: nowrap;
transition: transform 120ms ease, background 120ms ease;
}
.glossary-cta:hover{
background: var(--glossary-bg-soft-strong);
text-decoration: none;
transform: translateY(-1px);
}
@media (max-width: 760px){
.glossary-section__head{
flex-direction: column;
align-items: stretch;
}
.glossary-cta{
width: fit-content;
}
}
</style>

View File

@@ -0,0 +1,122 @@
---
interface LinkItem {
href: string;
label: string;
}
interface Props {
ariaLabel: string;
title: string;
meta?: string;
backHref?: string;
backLabel?: string;
pageItems?: LinkItem[];
usefulLinks?: LinkItem[];
}
const {
ariaLabel,
title,
meta,
backHref = "/glossaire/",
backLabel = "← Retour au glossaire",
pageItems = [],
usefulLinks = [],
} = Astro.props;
---
<nav class="glossary-portal-aside" aria-label={ariaLabel}>
<div class="glossary-portal-aside__block">
<a class="glossary-portal-aside__back" href={backHref}>{backLabel}</a>
<div class="glossary-portal-aside__title">{title}</div>
{meta && <div class="glossary-portal-aside__meta">{meta}</div>}
</div>
{pageItems.length > 0 && (
<div class="glossary-portal-aside__block">
<h2 class="glossary-portal-aside__heading">Dans cette page</h2>
<ul class="glossary-portal-aside__list">
{pageItems.map((item) => (
<li><a href={item.href}>{item.label}</a></li>
))}
</ul>
</div>
)}
{usefulLinks.length > 0 && (
<div class="glossary-portal-aside__block">
<h2 class="glossary-portal-aside__heading">Renvois utiles</h2>
<ul class="glossary-portal-aside__list">
{usefulLinks.map((item) => (
<li><a href={item.href}>{item.label}</a></li>
))}
</ul>
</div>
)}
</nav>
<style>
.glossary-portal-aside{
display: flex;
flex-direction: column;
gap: 14px;
}
.glossary-portal-aside__block{
border: 1px solid rgba(127,127,127,0.22);
border-radius: 16px;
padding: 12px;
background: rgba(127,127,127,0.05);
}
.glossary-portal-aside__back{
display: inline-block;
margin-bottom: 8px;
font-size: 13px;
font-weight: 700;
text-decoration: none;
}
.glossary-portal-aside__title{
font-size: 14px;
font-weight: 800;
letter-spacing: .2px;
line-height: 1.25;
}
.glossary-portal-aside__meta{
margin-top: 8px;
font-size: 12px;
line-height: 1.35;
opacity: .78;
}
.glossary-portal-aside__heading{
margin: 0 0 10px;
font-size: 13px;
font-weight: 800;
opacity: .9;
}
.glossary-portal-aside__list{
list-style: none;
margin: 0;
padding: 0;
}
.glossary-portal-aside__list li{
margin: 6px 0;
}
.glossary-portal-aside__list a{
text-decoration: none;
font-size: 13px;
line-height: 1.3;
}
@media (prefers-color-scheme: dark){
.glossary-portal-aside__block{
background: rgba(255,255,255,0.04);
}
}
</style>

View File

@@ -0,0 +1,87 @@
---
export interface Props {
href: string;
label: string;
icon?: string;
className?: string;
}
const {
href,
label,
icon = "↗",
className,
} = Astro.props;
---
<a class:list={["glossary-portal-cta", className]} href={href}>
<span>{label}</span>
<span aria-hidden="true">{icon}</span>
</a>
<style>
.glossary-portal-cta{
display: inline-flex;
align-items: center;
justify-content: center;
gap: 8px;
min-height: 40px;
padding: 0 14px;
border: 1px solid rgba(0,217,255,0.24);
border-radius: 999px;
background:
linear-gradient(180deg, rgba(0,217,255,0.10), rgba(0,217,255,0.04)),
rgba(127,127,127,0.06);
box-shadow:
inset 0 1px 0 rgba(255,255,255,0.05),
0 0 0 1px rgba(0,217,255,0.04);
text-decoration: none;
font-size: 12px;
font-weight: 800;
letter-spacing: .01em;
white-space: nowrap;
transition:
transform 120ms ease,
background 120ms ease,
border-color 120ms ease,
box-shadow 120ms ease;
}
.glossary-portal-cta:hover{
transform: translateY(-1px);
border-color: rgba(0,217,255,0.34);
background:
linear-gradient(180deg, rgba(0,217,255,0.14), rgba(0,217,255,0.06)),
rgba(127,127,127,0.08);
box-shadow:
inset 0 1px 0 rgba(255,255,255,0.06),
0 0 0 1px rgba(0,217,255,0.08),
0 10px 28px rgba(0,0,0,0.18);
text-decoration: none;
}
.glossary-portal-cta:focus-visible{
outline: 2px solid rgba(0,217,255,0.28);
outline-offset: 4px;
}
@media (max-width: 720px){
.glossary-portal-cta{
width: 100%;
}
}
@media (prefers-color-scheme: dark){
.glossary-portal-cta{
background:
linear-gradient(180deg, rgba(0,217,255,0.12), rgba(0,217,255,0.05)),
rgba(255,255,255,0.04);
}
.glossary-portal-cta:hover{
background:
linear-gradient(180deg, rgba(0,217,255,0.16), rgba(0,217,255,0.07)),
rgba(255,255,255,0.06);
}
}
</style>

View File

@@ -0,0 +1,91 @@
---
export type GlossaryPortalGridItem = {
href: string;
title: string;
description: string;
meta: string;
};
export interface Props {
items?: GlossaryPortalGridItem[];
secondary?: boolean;
}
const {
items = [],
secondary = false,
} = Astro.props;
---
<div
class:list={[
"glossary-portals",
secondary && "glossary-portals--secondary",
]}
>
{items.map((item) => (
<a class="glossary-portal-card" href={item.href}>
<strong>{item.title}</strong>
<span>{item.description}</span>
<small>{item.meta}</small>
</a>
))}
</div>
<style>
.glossary-portals{
display: grid;
grid-template-columns: repeat(auto-fit, minmax(240px, 1fr));
gap: 14px;
margin-top: 14px;
}
.glossary-portal-card{
display: flex;
flex-direction: column;
gap: 8px;
padding: 16px 18px;
border: 1px solid var(--glossary-border);
border-radius: 18px;
background: var(--glossary-bg-soft);
text-decoration: none;
transition: transform 120ms ease, background 120ms ease, border-color 120ms ease;
}
.glossary-portal-card:hover{
transform: translateY(-1px);
background: var(--glossary-bg-soft-strong);
border-color: rgba(0,217,255,0.16);
text-decoration: none;
}
.glossary-portal-card strong{
color: var(--glossary-accent);
font-size: 1.08rem;
line-height: 1.28;
}
.glossary-portal-card span{
color: inherit;
font-size: 1rem;
line-height: 1.5;
opacity: .94;
}
.glossary-portal-card small{
color: var(--glossary-accent);
font-size: .94rem;
line-height: 1.35;
opacity: .9;
}
@media (prefers-color-scheme: dark){
.glossary-portal-card{
background: rgba(255,255,255,0.04);
}
.glossary-portal-card:hover{
background: rgba(255,255,255,0.07);
}
}
</style>

View File

@@ -0,0 +1,190 @@
---
interface Props {
prefix: string;
kicker: string;
title: string;
intro: string;
moreParagraphs?: string[];
introMaxWidth?: string;
followIntroMaxWidth?: string;
moreMaxHeight?: string;
}
const {
prefix,
kicker,
title,
intro,
moreParagraphs = [],
introMaxWidth = "72ch",
followIntroMaxWidth = "68ch",
moreMaxHeight = "18rem",
} = Astro.props;
---
<div
class="glossary-portal-hero glossary-page-hero"
data-glossary-portal-hero
style={`--portal-hero-intro-max-w:${introMaxWidth}; --portal-hero-follow-intro-max-w:${followIntroMaxWidth}; --portal-hero-more-max-h:${moreMaxHeight};`}
>
<p class="glossary-portal-hero__kicker">{kicker}</p>
<h1>{title}</h1>
<p class="glossary-portal-hero__intro">
{intro}
</p>
{moreParagraphs.length > 0 && (
<div class="glossary-portal-hero__collapsible">
<div
class="glossary-portal-hero__more"
id={`${prefix}-hero-more`}
data-glossary-portal-more
aria-hidden="false"
>
{moreParagraphs.map((paragraph) => (
<p class="glossary-portal-hero__intro">{paragraph}</p>
))}
</div>
<button
class="glossary-portal-hero__toggle"
id={`${prefix}-hero-toggle`}
data-glossary-portal-toggle
type="button"
aria-controls={`${prefix}-hero-more`}
aria-expanded="false"
hidden
>
lire la suite
</button>
</div>
)}
</div>
<style>
.glossary-portal-hero{
position: sticky;
top: calc(var(--sticky-header-h, 0px) + var(--page-gap, 12px));
z-index: 11;
margin: 0 0 24px;
padding: 18px 18px 20px;
border: 1px solid rgba(127,127,127,0.18);
border-radius: 28px;
background:
linear-gradient(180deg, rgba(0,0,0,0.60), rgba(0,0,0,0.92)),
radial-gradient(900px 240px at 20% 0%, rgba(0,217,255,0.08), transparent 60%);
backdrop-filter: blur(10px);
-webkit-backdrop-filter: blur(10px);
display: grid;
row-gap: 14px;
transition:
margin-bottom 180ms ease,
border-radius 180ms ease,
padding 180ms ease,
row-gap 180ms ease;
}
.glossary-portal-hero__kicker{
margin: 0;
font-size: 12px;
letter-spacing: .08em;
text-transform: uppercase;
opacity: .72;
}
.glossary-portal-hero h1{
margin: 0;
font-size: clamp(2.2rem, 4vw, 3.15rem);
line-height: 1.02;
letter-spacing: -.04em;
font-weight: 850;
transition: font-size 180ms ease;
}
.glossary-portal-hero__intro{
margin: 0;
max-width: var(--portal-hero-intro-max-w);
font-size: 1.04rem;
line-height: 1.55;
opacity: .94;
transition:
font-size 180ms ease,
line-height 180ms ease,
max-width 180ms ease;
}
.glossary-portal-hero__collapsible{
display: grid;
row-gap: 6px;
}
.glossary-portal-hero__more{
display: grid;
row-gap: 14px;
max-height: var(--portal-hero-more-max-h);
overflow: hidden;
opacity: 1;
transition:
max-height 220ms ease,
opacity 180ms ease;
}
.glossary-portal-hero__toggle{
display: none;
align-self: flex-start;
width: fit-content;
margin: 0;
padding: 0;
border: 0;
background: transparent;
color: inherit;
font: inherit;
font-size: 11px;
line-height: 1.2;
letter-spacing: .01em;
opacity: .56;
cursor: pointer;
text-decoration: underline;
text-underline-offset: .12em;
text-decoration-thickness: 1px;
}
.glossary-portal-hero__toggle:hover{
opacity: .84;
}
.glossary-portal-hero__toggle:focus-visible{
outline: 2px solid rgba(0,217,255,0.24);
outline-offset: 4px;
border-radius: 4px;
}
.glossary-portal-hero__toggle[hidden]{
display: none !important;
}
@media (max-width: 860px){
.glossary-portal-hero{
position: static;
border-radius: 22px;
margin-bottom: 20px;
padding: 14px 14px 16px;
row-gap: 12px;
}
.glossary-portal-hero__intro{
max-width: none;
}
.glossary-portal-hero__more{
max-height: none;
opacity: 1;
overflow: visible;
}
.glossary-portal-hero__toggle{
display: none !important;
}
}
</style>

View File

@@ -0,0 +1,96 @@
---
export interface Props {
id?: string;
title: string;
count?: string;
intro?: string;
surface?: boolean;
className?: string;
}
const {
id,
title,
count,
intro,
surface = false,
className,
} = Astro.props;
---
<div
class:list={[
"glossary-portal-panel",
surface && "glossary-portal-panel--surface",
className,
]}
>
<div class="glossary-portal-panel__head">
<h3 id={id}>{title}</h3>
{count && <span class="glossary-portal-panel__count">{count}</span>}
</div>
{intro && <p class="glossary-portal-panel__intro">{intro}</p>}
<slot />
</div>
<style>
.glossary-portal-panel{
display: grid;
gap: 12px;
}
.glossary-portal-panel--surface{
padding: 18px 18px 16px;
border: 1px solid var(--glossary-border, rgba(127,127,127,0.18));
border-radius: 18px;
background:
linear-gradient(180deg, rgba(255,255,255,0.02), rgba(255,255,255,0.01)),
var(--glossary-bg-soft, rgba(127,127,127,0.035));
}
.glossary-portal-panel__head{
display: flex;
align-items: baseline;
justify-content: space-between;
gap: 12px;
flex-wrap: wrap;
}
.glossary-portal-panel__head h3{
margin: 0;
font-size: 15px;
line-height: 1.3;
scroll-margin-top: calc(var(--sticky-offset-px, 96px) + 36px);
}
.glossary-portal-panel__count{
display: inline-flex;
align-items: center;
min-height: 24px;
padding: 0 10px;
border: 1px solid rgba(127,127,127,0.22);
border-radius: 999px;
font-size: 12px;
line-height: 1.2;
opacity: .78;
white-space: nowrap;
}
.glossary-portal-panel__intro{
max-width: 78ch;
margin: 0;
font-size: 14px;
line-height: 1.5;
opacity: .9;
}
@media (prefers-color-scheme: dark){
.glossary-portal-panel--surface{
background:
linear-gradient(180deg, rgba(255,255,255,0.02), rgba(255,255,255,0.01)),
rgba(255,255,255,0.04);
}
}
</style>

View File

@@ -0,0 +1,67 @@
---
interface Props {
id: string;
title: string;
count?: string;
intro?: string;
final?: boolean;
className?: string;
}
const {
id,
title,
count,
intro,
final = false,
className,
} = Astro.props;
---
<section class:list={["glossary-portal-section", final && "glossary-portal-section--final", className]}>
<div class="glossary-portal-section__head">
<h2 id={id}>{title}</h2>
{count && <span class="glossary-portal-section__count">{count}</span>}
</div>
{intro && <p class="glossary-portal-section__intro">{intro}</p>}
<slot />
</section>
<style>
.glossary-portal-section{
margin-top: 34px;
scroll-margin-top: calc(var(--sticky-offset-px, 96px) + 28px);
}
.glossary-portal-section h2{
scroll-margin-top: calc(var(--sticky-offset-px, 96px) + 28px);
}
.glossary-portal-section__head{
display: flex;
align-items: baseline;
justify-content: space-between;
gap: 12px;
flex-wrap: wrap;
margin-bottom: 10px;
position: static;
}
.glossary-portal-section__count{
font-size: 13px;
opacity: .72;
white-space: nowrap;
}
.glossary-portal-section__intro{
max-width: 78ch;
margin: 0;
opacity: .92;
}
.glossary-portal-section--final{
margin-top: 42px;
}
</style>

View File

@@ -0,0 +1,294 @@
---
interface Props {
heroMoreId: string;
heroToggleId: string;
sectionHeadSelector?: string;
mobileBreakpoint?: number;
autoCollapseDelta?: number;
}
const {
heroMoreId,
heroToggleId,
sectionHeadSelector = ".glossary-portal-section__head",
mobileBreakpoint = 860,
autoCollapseDelta = 160,
} = Astro.props;
---
<script
is:inline
define:vars={{ heroMoreId, heroToggleId, sectionHeadSelector, mobileBreakpoint, autoCollapseDelta }}
>
(() => {
const boot = () => {
const body = document.body;
const root = document.documentElement;
const hero = document.querySelector("[data-glossary-portal-hero]");
const follow = document.getElementById("reading-follow");
const heroMore = document.getElementById(heroMoreId);
const heroToggle = document.getElementById(heroToggleId);
if (!body || !root || !hero || !follow) return;
const BODY_CLASS = "is-glossary-portal-page";
const FOLLOW_ON_CLASS = "glossary-portal-follow-on";
const EXPANDED_CLASS = "glossary-portal-hero-expanded";
const mqMobile = window.matchMedia(`(max-width: ${mobileBreakpoint}px)`);
let expandedAtY = null;
let lastScrollY = window.scrollY || 0;
let raf = 0;
body.classList.add(BODY_CLASS);
const heroHeight = () =>
Math.max(0, Math.round(hero.getBoundingClientRect().height || 0));
const stripLocalSticky = () => {
document.querySelectorAll(sectionHeadSelector).forEach((el) => {
el.classList.remove("is-sticky");
el.removeAttribute("data-sticky-active");
});
};
const computeFollowOn = () =>
!mqMobile.matches &&
follow.classList.contains("is-on") &&
follow.style.display !== "none" &&
follow.getAttribute("aria-hidden") !== "true";
const applyLocalStickyHeight = () => {
const h = mqMobile.matches ? 0 : heroHeight();
if (typeof window.__archiSetLocalStickyHeight === "function") {
window.__archiSetLocalStickyHeight(h);
} else {
root.style.setProperty("--glossary-local-sticky-h", `${h}px`);
}
};
const syncFollowState = () => {
const on = computeFollowOn();
body.classList.toggle(FOLLOW_ON_CLASS, on);
return on;
};
const collapseHero = () => {
if (!body.classList.contains(EXPANDED_CLASS)) return;
body.classList.remove(EXPANDED_CLASS);
expandedAtY = null;
if (heroMore) {
heroMore.setAttribute("aria-hidden", "true");
}
if (heroToggle) {
heroToggle.hidden = false;
heroToggle.setAttribute("aria-expanded", "false");
}
try {
window.__archiUpdateFollow?.();
} catch {}
schedule();
};
const expandHero = () => {
body.classList.add(EXPANDED_CLASS);
expandedAtY = window.scrollY || 0;
if (heroMore) {
heroMore.setAttribute("aria-hidden", "false");
}
if (heroToggle) {
heroToggle.hidden = true;
heroToggle.setAttribute("aria-expanded", "true");
}
try {
window.__archiUpdateFollow?.();
} catch {}
schedule();
};
const syncHeroState = () => {
const followOn = computeFollowOn();
const expanded = body.classList.contains(EXPANDED_CLASS);
const collapsed = followOn && !expanded;
if (!followOn || mqMobile.matches) {
body.classList.remove(EXPANDED_CLASS);
expandedAtY = null;
if (heroMore) {
heroMore.setAttribute("aria-hidden", "false");
}
if (heroToggle) {
heroToggle.hidden = true;
heroToggle.setAttribute("aria-expanded", "false");
}
return;
}
if (heroMore) {
heroMore.setAttribute("aria-hidden", collapsed ? "true" : "false");
}
if (heroToggle) {
heroToggle.hidden = !collapsed;
heroToggle.setAttribute("aria-expanded", expanded ? "true" : "false");
}
};
const maybeAutoCollapseOnScroll = () => {
if (mqMobile.matches) {
lastScrollY = window.scrollY || 0;
return;
}
if (!computeFollowOn()) {
lastScrollY = window.scrollY || 0;
return;
}
if (!body.classList.contains(EXPANDED_CLASS)) {
lastScrollY = window.scrollY || 0;
return;
}
if (expandedAtY == null) {
lastScrollY = window.scrollY || 0;
return;
}
const currentY = window.scrollY || 0;
const scrollingDown = currentY > lastScrollY;
const delta = currentY - expandedAtY;
if (scrollingDown && delta >= autoCollapseDelta) {
collapseHero();
}
lastScrollY = currentY;
};
const syncAll = () => {
stripLocalSticky();
syncFollowState();
syncHeroState();
applyLocalStickyHeight();
};
const schedule = () => {
if (raf) return;
raf = requestAnimationFrame(() => {
raf = 0;
requestAnimationFrame(syncAll);
});
};
heroToggle?.addEventListener("click", expandHero);
const onScroll = () => {
maybeAutoCollapseOnScroll();
schedule();
};
const followObserver = new MutationObserver(schedule);
followObserver.observe(follow, {
attributes: true,
attributeFilter: ["class", "style", "aria-hidden"],
subtree: false,
});
const heroResizeObserver =
typeof ResizeObserver !== "undefined"
? new ResizeObserver(schedule)
: null;
heroResizeObserver?.observe(hero);
window.addEventListener("scroll", onScroll, { passive: true });
window.addEventListener("resize", schedule);
window.addEventListener("pageshow", schedule);
if (document.fonts?.ready) {
document.fonts.ready.then(schedule).catch(() => {});
}
if (mqMobile.addEventListener) {
mqMobile.addEventListener("change", schedule);
} else if (mqMobile.addListener) {
mqMobile.addListener(schedule);
}
schedule();
};
if (document.readyState === "loading") {
document.addEventListener("DOMContentLoaded", boot, { once: true });
} else {
boot();
}
})();
</script>
<style>
:global(body.is-glossary-portal-page #reading-follow){
z-index: 10;
}
:global(body.is-glossary-portal-page.glossary-portal-follow-on .glossary-portal-hero){
margin-bottom: 0;
padding: 12px 16px 14px;
row-gap: 10px;
border-bottom-left-radius: 0;
border-bottom-right-radius: 0;
}
:global(body.is-glossary-portal-page.glossary-portal-follow-on .glossary-portal-hero h1){
font-size: clamp(1.9rem, 3.2vw, 2.55rem);
}
:global(body.is-glossary-portal-page.glossary-portal-follow-on .glossary-portal-hero__intro){
max-width: var(--portal-hero-follow-intro-max-w, 68ch);
font-size: .98rem;
line-height: 1.48;
}
:global(body.is-glossary-portal-page.glossary-portal-follow-on:not(.glossary-portal-hero-expanded) .glossary-portal-hero__more){
max-height: 0;
opacity: 0;
overflow: hidden;
pointer-events: none;
}
:global(body.is-glossary-portal-page.glossary-portal-follow-on:not(.glossary-portal-hero-expanded) .glossary-portal-hero__toggle){
display: inline-flex;
}
:global(body.is-glossary-portal-page.glossary-portal-follow-on #reading-follow .reading-follow__inner){
border-top-left-radius: 0;
border-top-right-radius: 0;
}
:global(body.is-glossary-portal-page .glossary-portal-section__head.is-sticky),
:global(body.is-glossary-portal-page .glossary-portal-section__head[data-sticky-active="true"]){
position: static !important;
top: auto !important;
z-index: auto !important;
padding: 0 !important;
border: 0 !important;
background: transparent !important;
box-shadow: none !important;
backdrop-filter: none !important;
-webkit-backdrop-filter: none !important;
}
</style>

View File

@@ -0,0 +1,92 @@
---
import type { GlossaryRelationBlock } from "../lib/glossary";
import { hrefOfGlossaryEntry } from "../lib/glossary";
interface Props {
relationBlocks: GlossaryRelationBlock[];
}
const { relationBlocks = [] } = Astro.props;
const relationsHeadingId = "relations-conceptuelles";
---
{relationBlocks.length > 0 && (
<section
class="glossary-relations"
aria-labelledby={relationsHeadingId}
>
<h2 id={relationsHeadingId}>Relations conceptuelles</h2>
<div class="glossary-relations-grid">
{relationBlocks.map((block) => (
<section class={`glossary-relations-card ${block.className}`}>
<h3>{block.title}</h3>
<ul>
{block.items.map((item) => (
<li>
<a href={hrefOfGlossaryEntry(item)}>{item.data.term}</a>
<span> — {item.data.definitionShort}</span>
</li>
))}
</ul>
</section>
))}
</div>
</section>
)}
<style>
.glossary-relations{
margin-top: 26px;
padding-top: 18px;
border-top: 1px solid rgba(127,127,127,0.18);
}
.glossary-relations h2{
margin-bottom: 14px;
}
.glossary-relations-grid{
display: grid;
grid-template-columns: repeat(auto-fit, minmax(240px, 1fr));
gap: 12px;
}
.glossary-relations-card{
border: 1px solid rgba(127,127,127,0.22);
border-radius: 16px;
padding: 14px 16px;
background: rgba(127,127,127,0.05);
}
.glossary-relations-card h3{
margin-top: 0;
margin-bottom: 10px;
font-size: 15px;
line-height: 1.35;
}
.glossary-relations-card ul{
margin: 0;
padding-left: 18px;
}
.glossary-relations-card li{
margin-bottom: 8px;
font-size: 14px;
line-height: 1.45;
}
.glossary-relations-card li:last-child{
margin-bottom: 0;
}
.glossary-relations-card span{
opacity: .9;
}
@media (prefers-color-scheme: dark){
.glossary-relations-card{
background: rgba(255,255,255,0.04);
}
}
</style>

View File

@@ -25,12 +25,12 @@
{/* ✅ actions références en haut (niveau 2 uniquement) */}
<div class="panel-top-actions level-2" aria-label="Actions références">
<div class="panel-actions">
<div class="panel-actions">
<button class="panel-btn panel-btn--primary" id="panel-ref-submit" type="button">
Soumettre une référence (Gitea)
Soumettre une référence (Gitea)
</button>
</div>
<div class="panel-msg" id="panel-ref-msg" hidden></div>
</div>
<div class="panel-msg" id="panel-ref-msg" hidden></div>
</div>
<section class="panel-block level-2" aria-label="Références et auteurs">
@@ -60,7 +60,7 @@
</section>
</div>
{/* ✅ Lightbox media (pop-up au-dessus du panel) */}
{/* ✅ Lightbox media (plein écran) */}
<div class="panel-lightbox" id="panel-lightbox" hidden aria-hidden="true">
<div class="panel-lightbox__overlay" data-close="1"></div>
<div class="panel-lightbox__dialog" role="dialog" aria-modal="true" aria-label="Aperçu du média">
@@ -93,6 +93,9 @@
const btnMediaSubmit = root.querySelector("#panel-media-submit");
const msgMedia = root.querySelector("#panel-media-msg");
const btnRefSubmit = root.querySelector("#panel-ref-submit");
const msgRef = root.querySelector("#panel-ref-msg");
const taComment = root.querySelector("#panel-comment-text");
const btnSend = root.querySelector("#panel-comment-send");
const msgComment = root.querySelector("#panel-comment-msg");
@@ -101,9 +104,6 @@
const lbContent = root.querySelector("#panel-lightbox-content");
const lbCaption = root.querySelector("#panel-lightbox-caption");
const btnRefSubmit = root.querySelector("#panel-ref-submit");
const msgRef = root.querySelector("#panel-ref-msg");
const docTitle = document.body?.dataset?.docTitle || document.title || "Archicratie";
const docVersion = document.body?.dataset?.docVersion || "";
@@ -114,6 +114,16 @@
let currentParaId = "";
let mediaShowAll = (localStorage.getItem("archicratie:panel:mediaAll") === "1");
// ===== cosmetics: micro flash “update” =====
let _flashT = 0;
function flashUpdate(){
try {
root.classList.add("is-updating");
if (_flashT) clearTimeout(_flashT);
_flashT = setTimeout(() => root.classList.remove("is-updating"), 180);
} catch {}
}
// ===== globals =====
function getG() {
return window.__archiGitea || { ready: false, base: "", owner: "", repo: "" };
@@ -121,9 +131,6 @@
function getAuthInfoP() {
return window.__archiAuthInfoP || Promise.resolve({ ok: false, groups: [] });
}
function isDev() {
return Boolean((window.__archiFlags && window.__archiFlags.dev) || /^(localhost|127\.0\.0\.1|\[::1\])$/i.test(location.hostname));
}
const access = { ready: false, canUsers: false };
@@ -137,23 +144,20 @@
return Array.isArray(groups) && groups.some((x) => String(x).toLowerCase() === gg);
}
// ✅ règle mission : readers + editors peuvent soumettre médias + commentaires
// ✅ dev fallback : si /_auth/whoami nexiste pas, on autorise pour tester
// ✅ readers + editors peuvent soumettre médias + commentaires + refs
getAuthInfoP().then((info) => {
const groups = Array.isArray(info?.groups) ? info.groups : [];
const canReaders = inGroup(groups, "readers");
const canEditors = inGroup(groups, "editors");
access.canUsers = Boolean((info?.ok && (canReaders || canEditors)) || (isDev() && !info?.ok));
const whoamiSkipped = Boolean(window.__archiFlags && window.__archiFlags.whoamiSkipped);
access.canUsers = Boolean((info?.ok && (canReaders || canEditors)) || whoamiSkipped);
access.ready = true;
if (btnMediaSubmit) btnMediaSubmit.disabled = !access.canUsers;
if (btnSend) btnSend.disabled = !access.canUsers;
if (btnRefSubmit) btnRefSubmit.disabled = !access.canUsers;
// si pas d'accès, on informe (soft)
if (!access.canUsers) {
if (msgHead) {
msgHead.hidden = false;
@@ -162,12 +166,12 @@
}
}
}).catch(() => {
// fallback dev
access.ready = true;
if (isDev()) {
if (Boolean(window.__archiFlags && window.__archiFlags.whoamiSkipped)) {
access.canUsers = true;
if (btnMediaSubmit) btnMediaSubmit.disabled = false;
if (btnSend) btnSend.disabled = false;
if (btnRefSubmit) btnRefSubmit.disabled = false;
}
});
@@ -209,8 +213,11 @@
async function loadIndex() {
if (_idxP) return _idxP;
_idxP = (async () => {
const res = await fetch("/annotations-index.json?_=" + Date.now(), { cache: "no-store" }).catch(() => null);
if (res && res.ok) return await res.json();
try {
const res = await fetch("/annotations-index.json?_=" + Date.now(), { cache: "no-store" });
if (res && res.ok) return await res.json();
} catch {}
_idxP = null;
return null;
})();
return _idxP;
@@ -251,24 +258,22 @@
return issue.toString();
}
// Ouvre un nouvel onglet UNE SEULE FOIS (évite le double-open Safari/Firefox + noopener).
function openNewTab(url) {
try {
const a = document.createElement("a");
a.href = url;
a.target = "_blank";
a.rel = "noopener noreferrer";
a.style.display = "none";
document.body.appendChild(a);
a.click();
a.remove();
return true; // on ne peut pas détecter proprement un blocage sans retomber dans le double-open
} catch {
return false;
}
function openNewTab(url) {
try {
const a = document.createElement("a");
a.href = url;
a.target = "_blank";
a.rel = "noopener noreferrer";
a.style.display = "none";
document.body.appendChild(a);
a.click();
a.remove();
return true;
} catch {
return false;
}
}
// ====== GARDES ANTI-DOUBLONS ======
const _openStamp = new Map();
function openOnce(key, fn) {
const now = Date.now();
@@ -297,13 +302,21 @@
}
// ===== Lightbox =====
function lockScroll(on) {
try {
document.documentElement.classList.toggle("archi-lb-open", !!on);
} catch {}
}
function closeLightbox() {
if (!lb) return;
lb.hidden = true;
lb.setAttribute("aria-hidden", "true");
if (lbContent) clear(lbContent);
if (lbCaption) { lbCaption.hidden = true; lbCaption.textContent = ""; }
lockScroll(false);
}
function openLightbox({ type, src, caption }) {
if (!lb || !lbContent) return;
clear(lbContent);
@@ -342,6 +355,7 @@
else { lbCaption.hidden = true; lbCaption.textContent = ""; }
}
lockScroll(true);
lb.hidden = false;
lb.setAttribute("aria-hidden", "false");
}
@@ -359,7 +373,6 @@
});
}
// ===== Renders =====
function renderLevel2(data) {
clear(elL2);
if (!elL2) return;
@@ -369,7 +382,7 @@
return;
}
if (Array.isArray(data.authors) && data.authors.length) {
if (Array.isArray(data.mobilizedAuthors) && data.mobilizedAuthors.length) {
const h = document.createElement("h3");
h.className = "panel-subtitle";
h.textContent = "Auteurs";
@@ -377,7 +390,7 @@
const ul = document.createElement("ul");
ul.className = "panel-list";
for (const a of data.authors) {
for (const a of data.mobilizedAuthors) {
const li = document.createElement("li");
li.textContent = esc(a);
ul.appendChild(li);
@@ -559,11 +572,22 @@
async function updatePanel(paraId) {
currentParaId = paraId || currentParaId || "";
if (elId) elId.textContent = currentParaId || "—";
flashUpdate();
hideMsg(msgHead);
hideMsg(msgMedia);
hideMsg(msgComment);
hideMsg(msgRef);
const idx = await loadIndex();
if (!idx && msgHead && msgHead.hidden) {
msgHead.hidden = false;
msgHead.textContent = "Index annotations indisponible (annotations-index.json).";
msgHead.dataset.kind = "info";
}
const data = idx?.pages?.[pageKey]?.paras?.[currentParaId] || null;
renderLevel2(data);
@@ -571,7 +595,6 @@
renderLevel4(data);
}
// ===== media "voir tous" =====
if (btnMediaAll) {
bindClickOnce(btnMediaAll, (ev) => {
ev.preventDefault();
@@ -583,7 +606,6 @@
btnMediaAll.textContent = mediaShowAll ? "Réduire la liste" : "Voir tous les éléments";
}
// ===== media submit (readers + editors) =====
if (btnMediaSubmit) {
bindClickOnce(btnMediaSubmit, (ev) => {
ev.preventDefault();
@@ -626,27 +648,26 @@
});
}
// ===== référence submit (readers + editors) =====
if (btnRefSubmit) {
if (btnRefSubmit) {
bindClickOnce(btnRefSubmit, (ev) => {
ev.preventDefault();
hideMsg(msgRef);
ev.preventDefault();
hideMsg(msgRef);
if (guardEventOnce(ev, "gitea_open_ref")) return;
if (guardEventOnce(ev, "gitea_open_ref")) return;
if (!currentParaId) return showMsg(msgRef, "Choisis dabord un paragraphe (scroll / survol).", "warn");
if (!getG().ready) return showMsg(msgRef, "Gitea non configuré (PUBLIC_GITEA_*).", "error");
if (btnRefSubmit.disabled) return showMsg(msgRef, "Connexion requise (readers/editors).", "error");
if (!currentParaId) return showMsg(msgRef, "Choisis dabord un paragraphe (scroll / survol).", "warn");
if (!getG().ready) return showMsg(msgRef, "Gitea non configuré (PUBLIC_GITEA_*).", "error");
if (btnRefSubmit.disabled) return showMsg(msgRef, "Connexion requise (readers/editors).", "error");
const pageUrl = new URL(location.href);
pageUrl.search = "";
pageUrl.hash = currentParaId;
const pageUrl = new URL(location.href);
pageUrl.search = "";
pageUrl.hash = currentParaId;
const paraTxt = getParaText(currentParaId);
const excerpt = paraTxt.length > FULL_TEXT_SOFT_LIMIT ? (paraTxt.slice(0, FULL_TEXT_SOFT_LIMIT) + "…") : paraTxt;
const paraTxt = getParaText(currentParaId);
const excerpt = paraTxt.length > FULL_TEXT_SOFT_LIMIT ? (paraTxt.slice(0, FULL_TEXT_SOFT_LIMIT) + "…") : paraTxt;
const title = `[Reference] ${currentParaId} — ${docTitle}`;
const body = [
const title = `[Reference] ${currentParaId} — ${docTitle}`;
const body = [
`Chemin: ${location.pathname}`,
`URL: ${pageUrl.toString()}`,
`Ancre: #${currentParaId}`,
@@ -664,18 +685,16 @@
``,
`---`,
`Note: issue générée depuis le site (pré-remplissage).`,
].join("\n");
].join("\n");
const url = buildIssueURL({ title, body });
if (!url) return showMsg(msgRef, "Impossible de générer lissue.", "error");
const url = buildIssueURL({ title, body });
if (!url) return showMsg(msgRef, "Impossible de générer lissue.", "error");
const ok = openOnce(`ref:${currentParaId}`, () => openNewTab(url));
if (!ok) showMsg(msgRef, "Si rien ne souvre : autorise les popups pour ce site.", "error");
const ok = openOnce(`ref:${currentParaId}`, () => openNewTab(url));
if (!ok) showMsg(msgRef, "Si rien ne souvre : autorise les popups pour ce site.", "error");
});
}
}
// ===== commentaire (readers + editors) =====
if (btnSend) {
bindClickOnce(btnSend, (ev) => {
ev.preventDefault();
@@ -727,60 +746,31 @@
});
}
// ===== wiring: para courant (aligné sur le paragraphe sous le reading-follow) =====
function isPara(el) {
return Boolean(el && el.nodeType === 1 && el.matches && el.matches('.reading p[id^="p-"]'));
// ===== wiring: para courant (SOURCE OF TRUTH = EditionLayout) =====
function onCurrentPara(ev) {
try {
const id = ev?.detail?.id ? String(ev.detail.id) : "";
if (!id || !/^p-\d+-/i.test(id)) return;
if (id === currentParaId) return;
updatePanel(id);
} catch {}
}
window.addEventListener("archicratie:currentPara", onCurrentPara);
function pickParaAtY(y) {
const x = Math.max(0, Math.round(window.innerWidth * 0.5));
const candidates = [
document.elementFromPoint(x, y),
document.elementFromPoint(Math.min(window.innerWidth - 1, x + 60), y),
document.elementFromPoint(Math.max(0, x - 60), y),
].filter(Boolean);
const initial = String(location.hash || "").replace(/^#/, "").trim();
for (const c of candidates) {
if (isPara(c)) return c;
const p = c.closest ? c.closest('.reading p[id^="p-"]') : null;
if (isPara(p)) return p;
}
return null;
if (/^p-\d+-/i.test(initial)) {
updatePanel(initial);
} else if (window.__archiCurrentParaId && /^p-\d+-/i.test(String(window.__archiCurrentParaId))) {
updatePanel(String(window.__archiCurrentParaId));
} else {
setTimeout(() => {
try {
const id = String(window.__archiCurrentParaId || "").trim();
if (/^p-\d+-/i.test(id)) updatePanel(id);
} catch {}
}, 0);
}
let _lastPicked = "";
function syncFromFollowLine() {
const off = Number(document.documentElement.style.getPropertyValue("--sticky-offset-px")) || 0;
const y = Math.round(off + 8);
const p = pickParaAtY(y);
if (!p || !p.id) return;
if (p.id === _lastPicked) return;
_lastPicked = p.id;
// met à jour l'app global (EditionLayout écoute déjà currentPara)
try { window.dispatchEvent(new CustomEvent("archicratie:currentPara", { detail: { id: p.id } })); } catch {}
// et met à jour le panel immédiatement (sans attendre)
updatePanel(p.id);
}
let ticking = false;
function onScroll() {
if (ticking) return;
ticking = true;
requestAnimationFrame(() => {
ticking = false;
syncFromFollowLine();
});
}
window.addEventListener("scroll", onScroll, { passive: true });
window.addEventListener("resize", onScroll);
// Initial: hash > sinon calc
const initial = String(location.hash || "").replace(/^#/, "");
if (/^p-\d+-/i.test(initial)) updatePanel(initial);
else setTimeout(() => { try { syncFromFollowLine(); } catch {} }, 0);
})();
</script>
@@ -793,6 +783,8 @@
position: sticky;
top: calc(var(--sticky-header-h) + var(--page-gap));
align-self: start;
--thumb: 92px; /* ✅ taille des vignettes (80110 selon goût) */
}
:global(body[data-reading-level="3"]) .page-panel{
@@ -910,28 +902,33 @@
/* actions médias en haut */
.panel-top-actions{ margin-top: 8px; }
/* ===== media thumbnails (150x150) ===== */
/* ===== media thumbnails (plus petits + plus denses) ===== */
.panel-media-grid{
display: grid;
grid-template-columns: repeat(auto-fill, minmax(150px, 1fr));
grid-template-columns: repeat(auto-fill, minmax(var(--thumb), 1fr));
gap: 10px;
}
.panel-media-tile{
width: 150px;
max-width: 100%;
width: 100%;
border: 1px solid rgba(127,127,127,.20);
border-radius: 14px;
padding: 8px;
background: rgba(127,127,127,0.04);
cursor: pointer;
text-align: left;
transition: transform 120ms ease, background 120ms ease, border-color 120ms ease;
}
.panel-media-tile:hover{
transform: translateY(-1px);
background: rgba(127,127,127,0.07);
border-color: rgba(127,127,127,.32);
}
.panel-media-tile img{
width: 150px;
height: 150px;
max-width: 100%;
width: 100%;
height: var(--thumb);
object-fit: cover;
display: block;
border-radius: 10px;
@@ -939,8 +936,8 @@
}
.panel-media-ph{
width: 150px;
height: 150px;
width: 100%;
height: var(--thumb);
border-radius: 10px;
display: grid;
place-items: center;
@@ -983,7 +980,11 @@
resize: vertical;
}
/* ===== Lightbox ===== */
/* ===== Lightbox (plein écran “cinéma”) ===== */
:global(html.archi-lb-open){
overflow: hidden; /* ✅ empêche le scroll derrière */
}
.panel-lightbox{
position: fixed;
inset: 0;
@@ -993,58 +994,66 @@
.panel-lightbox__overlay{
position: absolute;
inset: 0;
background: rgba(0,0,0,0.80);
backdrop-filter: blur(6px);
-webkit-backdrop-filter: blur(6px);
background: rgba(0,0,0,0.84);
backdrop-filter: blur(10px);
-webkit-backdrop-filter: blur(10px);
}
.panel-lightbox__dialog{
position: absolute;
right: 24px;
top: calc(var(--sticky-header-h) + 16px);
width: min(520px, calc(100vw - 48px));
max-height: calc(100vh - (var(--sticky-header-h) + 32px));
left: 50%;
top: 50%;
transform: translate(-50%, -50%);
width: min(1100px, 92vw);
max-height: 92vh;
overflow: auto;
border: 1px solid rgba(127,127,127,0.22);
border-radius: 16px;
background: rgba(255,255,255,0.10);
backdrop-filter: blur(10px);
-webkit-backdrop-filter: blur(10px);
padding: 12px;
}
border: 1px solid rgba(255,255,255,0.14);
border-radius: 18px;
@media (prefers-color-scheme: dark){
.panel-lightbox__dialog{
background: rgba(0,0,0,0.28);
}
background: rgba(20,20,20,0.55);
backdrop-filter: blur(14px);
-webkit-backdrop-filter: blur(14px);
padding: 16px;
box-shadow: 0 24px 70px rgba(0,0,0,0.55);
}
.panel-lightbox__close{
position: sticky;
top: 0;
margin-left: auto;
position: absolute;
top: 12px;
right: 12px;
display: inline-flex;
align-items: center;
justify-content: center;
width: 34px;
height: 30px;
border-radius: 10px;
border: 1px solid rgba(127,127,127,0.35);
background: rgba(127,127,127,0.10);
width: 44px;
height: 40px;
border-radius: 14px;
border: 1px solid rgba(255,255,255,0.22);
background: rgba(255,255,255,0.10);
cursor: pointer;
font-size: 18px;
font-size: 22px;
font-weight: 900;
}
.panel-lightbox__content{
margin-top: 36px;
}
.panel-lightbox__content img,
.panel-lightbox__content video{
display: block;
width: 100%;
height: auto;
max-width: 1400px;
margin: 0 auto;
border-radius: 12px;
max-height: calc(92vh - 160px);
object-fit: contain;
background: rgba(0,0,0,0.22);
border-radius: 14px;
}
.panel-lightbox__content audio{
@@ -1052,13 +1061,14 @@
}
.panel-lightbox__caption{
margin-top: 10px;
margin-top: 12px;
font-size: 12px;
font-weight: 800;
opacity: .92;
color: rgba(255,255,255,0.92);
}
@media (max-width: 1100px){
.page-panel{ display: none; }
}
</style>
</style>

View File

@@ -1,11 +1,17 @@
<nav class="site-nav" aria-label="Navigation principale">
<a href="/">Accueil</a><span aria-hidden="true"> · </span>
<a href="/editions/">Carte des œuvres</a><span aria-hidden="true"> · </span>
<a href="/methode/">Méthode</a><span aria-hidden="true"> · </span>
<a href="/recherche/">Recherche</a><span aria-hidden="true"> · </span>
<a href="/archicrat-ia/">Essai-thèse</a><span aria-hidden="true"> · </span>
<a href="/traite/">Traité</a><span aria-hidden="true"> · </span>
<a href="/ia/">Cas IA</a><span aria-hidden="true"> · </span>
<a href="/glossaire/">Glossaire</a><span aria-hidden="true"> · </span>
<a href="/atlas/">Atlas</a>
</nav>
<a href="/">Accueil</a>
<span aria-hidden="true"> · </span>
<a href="/archicrat-ia/">Essai-thèse</a>
<span aria-hidden="true"> · </span>
<a href="/cas-ia/">Cas IA</a>
<span aria-hidden="true"> · </span>
<a href="/glossaire/">Glossaire</a>
<span aria-hidden="true"> · </span>
<a href="/recherche/">Recherche</a>
</nav>

112
src/content.config.ts Normal file
View File

@@ -0,0 +1,112 @@
import { defineCollection, z } from "astro:content";
const linkSchema = z.object({
type: z.enum(["definition", "appui", "transposition"]),
target: z.string().min(1),
note: z.string().optional()
});
const baseTextSchema = z.object({
title: z.string().min(1),
level: z.union([z.literal(1), z.literal(2), z.literal(3)]).default(1),
version: z.string().min(1),
concepts: z.array(z.string().min(1)).default([]),
links: z.array(linkSchema).default([]),
order: z.number().int().nonnegative().optional(),
summary: z.string().optional()
});
// Éditions (séparation stricte : edition + status verrouillés par collection)
const casIa = defineCollection({
type: "content",
schema: baseTextSchema.extend({
edition: z.literal("cas-ia"),
status: z.literal("application")
})
});
const commencer = defineCollection({
type: "content",
schema: baseTextSchema.extend({
edition: z.literal("commencer"),
status: z.union([z.literal("presentation"), z.literal("draft")])
})
});
// ✅ NOUVELLE collection : archicrat-ia (Essai-thèse)
// NOTE : on accepte temporairement edition/status "archicratie/modele_sociopolitique"
// si tes MDX nont pas encore été normalisés.
// Quand tu voudras "strict", on passera à edition="archicrat-ia" status="essai_these"
// + update frontmatter des 7 fichiers.
const archicratIa = defineCollection({
type: "content",
schema: baseTextSchema.extend({
edition: z.union([z.literal("archicrat-ia"), z.literal("archicratie")]),
status: z.union([z.literal("essai_these"), z.literal("modele_sociopolitique")])
})
});
// Glossaire (référentiel terminologique)
const glossaire = defineCollection({
type: "content",
schema: z.object({
title: z.string().min(1),
term: z.string().min(1),
aliases: z.array(z.string().min(1)).default([]),
urlAliases: z
.array(z.string().regex(/^[a-z0-9]+(?:-[a-z0-9]+)*$/))
.default([]),
mobilizedAuthors: z.array(z.string().min(1)).default([]),
comparisonTraditions: z.array(z.string().min(1)).default([]),
edition: z.literal("glossaire"),
status: z.literal("referentiel"),
version: z.string().min(1),
definitionShort: z.string().min(1),
concepts: z.array(z.string().min(1)).default([]),
links: z.array(linkSchema).default([]),
kind: z.enum([
"concept",
"topologie",
"diagnostic",
"verbe",
"paradigme",
"doctrine",
"dispositif",
"figure",
"qualification",
"epistemologie",
]),
family: z.enum([
"concept-fondamental",
"scene",
"dynamique",
"pathologie",
"topologie",
"meta-regime",
"paradigme",
"doctrine",
"verbe",
"dispositif-ia",
"tension-irreductible",
"figure",
"qualification",
"epistemologie",
]
)
.optional(),
domain: z.enum(["transversal", "theorie", "cas-ia"]),
level: z.enum(["fondamental", "intermediaire", "avance"]),
related: z.array(z.string().min(1)).default([]),
opposedTo: z.array(z.string().min(1)).default([]),
seeAlso: z.array(z.string().min(1)).default([])
})
});
export const collections = {
commencer,
"archicrat-ia": archicratIa,
"cas-ia": casIa,
glossaire,
};

View File

@@ -12,37 +12,46 @@ source:
kind: docx
path: "sources/docx/archicrat-ia/Chapitre_1—Fondements_epistemologiques_et_modelisation_Archicratie-version_officielle.docx"
---
Si les sciences politiques ont longtemps trouvé leur ancrage et leur légitimité dans lanalyse des institutions formelles du pouvoir souveraineté, contrat, autorité, représentation cest que le politique y était toujours présumé se manifester à travers une scène, un lieu, un sujet, un régime. Le pouvoir y avait des signes, des corps, des textes ; il procédait dun fondement — Dieu, la volonté générale, la loi, la nation — et dun opérateur identifié : le prince, le peuple, le juge, lÉtat. De la théorie de Hobbes à celle de Rawls, en passant par Rousseau, Kant ou Habermas, les paradigmes de légitimation sont fondés sur une ontologie de la centralité, de la scène constituante, et dun sujet instituant dont lautonomie garantit la normativité du pouvoir.
Or, ce que nos régimes contemporains de régulation mettent désormais en crise, ce nest pas tant la scène elle-même, que la possibilité de sa tenue effective. La scène subsiste, peut-être, mais elle est vidée, ritualisée, simulée, remplacée, saturée ou dissoute dans des procédures techniques, des protocoles logistiques, des décisions sans auteurs, des gouvernances algorithmiques. Le pouvoir opère sans se déclarer, régule sans se justifier, agit sans se mettre en débat. Il est devenu ce que nous proposons de nommer *archicratistique* — cest-à-dire quil agit selon un régime de régulation autonome sans scène, sans justification visible, sans délai institué pour la dispute, sans temporalité contradictoire. Non pas quil soit tyrannique, autoritaire ou caché au sens classique, mais parce quil *ne se donne plus à la critique* selon les formes instituées de lopposabilité politique.
Or, ce que nos régimes contemporains de régulation mettent désormais en crise, ce nest pas tant la scène elle-même, que la possibilité de sa tenue effective. La scène subsiste, peut-être, mais elle est vidée, ritualisée, simulée, remplacée, saturée ou dissoute dans des procédures techniques, des protocoles logistiques, des décisions sans auteurs, des gouvernances algorithmiques. Le pouvoir opère comme sil navait plus à se déclarer, régule sur des justifications faiblement exposables, et agit dans des configurations où la mise en débat est neutralisée, comprimée ou vidée de prise. Il est devenu ce que nous proposons de nommer archicratistique — cest-à-dire quil agit selon un régime de régulation autonome où la scène dépreuve se trouve neutralisée, mimée, relocalisée hors datteinte ou rendue pratiquement inopérante ; où les justifications demeurent faiblement exposables ou inopposables pour les affectés ; où le délai de la dispute est comprimé, fictif ou supprimé dans les faits ; et où la temporalité contradictoire nest plus tenue comme scène praticable de reprise. Non pas quil soit tyrannique, autoritaire ou caché au sens classique, mais parce quil ne se donne plus à la critique selon les formes instituées de lopposabilité politique. Cela ne signifie pas que toute scène praticable ait disparu ; cela signifie plutôt que leur repérage, leur préservation et leur réactivation deviennent le problème politique décisif de notre temps.
Lambition de ce chapitre est donc de fonder ce paradigme nouveau, ou plus exactement, de nommer et doutiller une forme ancienne mais non encore pensée du pouvoir — la régulation contradictoire institué. Cette forme, nous la nommons *archicratie*, non pour désigner un régime de plus, mais pour désigner un méta-régime viable de régulation lorsquune triade — *arcalité* (fondation déclarable), *cratialité* (opération traçable), *archicration* (épreuve instituée différée) — se tient en tenségrité, cest-à-dire en tension dynamique métastable lun à lautre.
Lambition de ce chapitre est donc de fonder ce paradigme nouveau, ou plus exactement, de nommer et doutiller une forme ancienne mais non encore pensée du pouvoir — la régulation contradictoire instituée. Cette forme, nous la nommons archicratie, non pour désigner un régime de plus, mais pour désigner un méta-régime viable de régulation lorsquune triade — arcalité (fondation déclarable), cratialité (opération traçable), archicration (épreuve instituée différée) — se tient en tenségrité, cest-à-dire en tension dynamique métastable lun à lautre.
À rebours de l*archicratie*, nous appelons désarchicration la configuration où la scène est dissoute, court-circuitée ou relocalisée hors datteinte, tandis que les régulations se poursuivent néanmoins. Il ne sagit pas de prétendre que tout deviendrait opaque, mais de constater que lopacité est structurelle aux dispositifs : non comme accident, mais comme condition de fonctionnement (secret industriel, non-auditabilité des modèles, dilution des responsabilités). Les algorithmes de notation dallocataires, les règles budgétaires qui déclenchent mécaniquement des fermetures, les protocoles dajustement fiscal ou de police sanitaire sont légalement institués, techniquement rationalisés, mais politiquement indisponibles à lopposition procédurale. Cette indisponibilité se mesure : absence de canal de saisine opposable, délai non garanti pour contester, motifs non accessibles ni réutilisables par les contestataires, paramètres non traçables ni réversibles. Ce nest pas une archicratie (qui suppose la tenue dune scène), mais son inverse : une désarchicration où la cratialité et larcalité se conjuguent sans archicration, produisant des décisions *indiscutables* de fait, parce que non opposables en temps et en raison.
À rebours de larchicratie, nous appelons désarchicration le processus par lequel la scène est dissoute, court-circuitée ou relocalisée hors datteinte, tandis que les régulations se poursuivent néanmoins. Il ne sagit pas de prétendre que tout deviendrait opaque, mais de constater que lopacité est structurelle à certains dispositifs : non comme accident, mais comme condition de fonctionnement. Les algorithmes de notation dallocataires, les règles budgétaires qui déclenchent mécaniquement des fermetures, les protocoles dajustement fiscal ou de police sanitaire sont légalement institués, techniquement rationalisés, mais politiquement indisponibles à lopposition procédurale. Cette indisponibilité se mesure : absence de canal de saisine opposable, délai non garanti pour contester, motifs non accessibles ni réutilisables par les contestataires, paramètres non traçables ni réversibles. Ce nest pas une archicratie, qui suppose la tenue dune scène, mais son inverse : une désarchicration dans laquelle larcalité et la cratialité continuent dopérer tandis que larchicration se trouve neutralisée, relocalisée hors datteinte, ou rendue pratiquement inopérante, produisant des décisions indiscutables de fait parce que non opposables en temps et en raison.
Les paradigmes classiques — quils soient contractualistes, décisionnistes ou délibératifs — échouent désormais à rendre compte de ces formes. Le pouvoir nest plus localisé dans un lieu, il ne procède plus dune scène constituante unique, il nest plus incarné par un sujet identifiable. Il opère à travers une multiplicité de dispositifs hétérogènes, qui se soutiennent les uns les autres sans principe transcendant, selon une logique de capture, de redondance, de saturation ou deuphémisation. Michel Foucault lavait annoncé dès la fin des années 1970 avec son analyse de la gouvernementalité : « ce qui se met en place, ce nest plus le droit de faire mourir ou de laisser vivre, mais le pouvoir de faire vivre et de laisser mourir » (1976). Hannah Arendt, bien avant lui, avait déjà diagnostiqué que « la disparition de la scène publique, cest la disparition de la politique elle-même » (1958). Claude Lefort, dans *LInvention démocratique*, avait désigné le pouvoir démocratique comme un lieu vide — précisément parce que sa légitimité dépend de la possibilité constante de remise en scène, de re-questionnement, de re-distribution. Mais que reste-t-il lorsque cette vacance est non plus instituante, mais neutralisée par des automatismes ? Lorsque la scène est formellement prévue mais substantiellement empêchée ? Lorsque les voies de recours sont techniques, absconses, et différées jusquà loubli ?
Les paradigmes classiques — quils soient contractualistes, décisionnistes ou délibératifs — échouent désormais à rendre compte de ces formes. Le pouvoir nest plus localisé dans un lieu, il ne procède plus dune scène constituante unique, il nest plus incarné par un sujet identifiable. Il opère à travers une multiplicité de dispositifs hétérogènes, qui se soutiennent les uns les autres sans principe transcendant, selon une logique de capture, de redondance, de saturation ou deuphémisation. Michel Foucault lavait annoncé dès la fin des années 1970 avec son analyse de la gouvernementalité : « ce qui se met en place, ce nest plus le droit de faire mourir ou de laisser vivre, mais le pouvoir de faire vivre et de laisser mourir » (1976). Hannah Arendt, bien avant lui, avait déjà diagnostiqué que « la disparition de la scène publique, cest la disparition de la politique elle-même » (1958). Claude Lefort, dans LInvention démocratique, avait désigné le pouvoir démocratique comme un lieu vide — précisément parce que sa légitimité dépend de la possibilité constante de remise en scène, de re-questionnement, de re-distribution. Mais que reste-t-il lorsque cette vacance est non plus instituante, mais neutralisée par des automatismes ? Lorsque la scène est formellement prévue mais substantiellement empêchée ? Lorsque les voies de recours sont techniques, absconses, et différées jusquà loubli ?
Ce que nous vivons, ce que nous subissons parfois, ce que nous habitons souvent sans le voir, cest la montée silencieuse des régimes archicratiques : dispositifs de régulation où la scène est inaccessible, où les fondements ne sont plus invoqués, où les décisions ne sont plus motivées, où le temps du différé est supprimé. Ce ne sont pas des régimes de domination au sens fort ; ce sont des régimes dadministration sans épreuve, des formes dordonnancement sans théâtre. Larchicratie ne se pense ni contre la démocratie, ni comme sa dégénérescence, mais comme sa marginalisation structurelle : elle sinstalle dans les interstices, dans les écarts, dans les non-lieux du politique. Elle est ladministration algorithmique des droits, la codification silencieuse des trajectoires, la performativité sans contradictoire des normes automatiques.
Ce que nous vivons, ce que nous subissons parfois, ce que nous habitons souvent sans le voir, ce nest pas la montée silencieuse de régimes archicratiques” au sens fort, mais la prolifération de configurations désarchicratiques et archicratistiques, parfois portées jusquà la dérive autarchicratique. Il sagit de dispositifs de régulation où la scène devient difficilement praticable, neutralisée ou relocalisée hors datteinte ; où les fondements deviennent faiblement invoqués, euphémisés ou difficilement exposables ; où les décisions sont de moins en moins motivées de manière opposable ; et où le temps du différé se trouve comprimé, vidé de sa prise ou rendu fictif.
Il nous faut alors un paradigme, non pour idéaliser une alternative, mais pour diagnostiquer cette configuration, pour la rendre visible, pensable, opposable. Car cest bien cela qui définit un paradigme : sa capacité à faire apparaître ce qui était jusque-là neutralisé. Le paradigme archicratique ne vise pas à remplacer les théories classiques du pouvoir, mais à leur adjoindre une grammaire supplémentaire, permettant de nommer ce qui échappait à leurs catégories. Il ne sagit plus seulement de savoir *qui* gouverne, mais *comment* se tiennent les régulations, *malgré* labsence de légitimation visible, *malgré* leffondrement des scènes instituées, *malgré* la disparition des temporalités différées de la décision. Il sagit de rendre compte des zones grises, des seuils, des bifurcations, des objets métonymiques de lordre, des fonctions qui régulent sans jamais statuer.
Il ne sagit pas nécessairement de régimes de domination au sens classique, mais de formes de régulation administrative dans lesquelles lépreuve est neutralisée, mimée ou rendue pratiquement inopérante, tandis que le théâtre politique saffaiblit, se vide de sa prise ou se trouve relocalisé hors datteinte. Il ne sagit donc pas ici de larchicratie comme méta-régime viable de régulation, mais de son envers pratique : des dispositifs qui continuent dopérer tout en neutralisant les conditions de leur propre mise en discussion. Se déploient ainsi des chaînes de décision où ladministration algorithmique des droits, la codification silencieuse des trajectoires et la performativité de normes automatiques dont le contradictoire est neutralisé ou vidé de prise tendent à soustraire la régulation à lépreuve plutôt quà linstituer.
Dans cette perspective, ce chapitre se donne pour tâche de poser les fondements épistémologiques, conceptuels et politiques du paradigme archicratique. Nous y exposerons son architecture théorique tripolaire — *arcalité* (ce qui fonde), *cratialité* (ce qui opère), *archicration* (ce qui permet la dispute) — ainsi que sa grammaire topologique interne/externe, ses objets de repérage concrets (fonctions, seuils, porteurs, signes, temporalités), et enfin ses critères de validité. Nous chercherons à produire une cartographie intelligible des formes de régulation contemporaine, sans tomber dans le cynisme ni dans lutopie, mais en nommant avec précision les tensions, les prises, les scènes, les ruptures, les points aveugles.
Il nous faut alors un paradigme, non pour idéaliser une alternative, mais pour diagnostiquer cette configuration, pour la rendre intelligible, pensable, opposable. Car cest bien cela qui définit un paradigme : sa capacité à faire apparaître ce qui était jusque-là neutralisé. Le paradigme archicratique ne vise pas à remplacer les théories classiques du pouvoir, mais à leur adjoindre une grammaire supplémentaire, permettant de nommer ce qui échappait à leurs catégories. Il ne sagit plus seulement de savoir qui gouverne, mais comment se tiennent les régulations lorsque les légitimations deviennent faiblement visibles, lorsque les scènes instituées sont neutralisées, vidées ou relocalisées hors datteinte, et lorsque les temporalités différées de la décision se trouvent comprimées, fictives ou pratiquement supprimées. Il sagit de rendre compte des zones grises, des seuils, des bifurcations et des fonctions qui régulent sans jamais statuer.
Car penser larchicratie, ce nest pas inventer un concept : cest lextraire du réel pour en faire un outil de diagnostic, un test de viabilité des régulations, un instrument de critique effective des dispositifs. Cest interroger ce qui gouverne sans débat, ce qui ordonne sans justification, ce qui affecte sans se montrer. Cest rouvrir la possibilité dune pensée politique critique du réel.
Dans cette perspective, ce chapitre se donne pour tâche de poser les fondements épistémologiques, conceptuels et politiques du paradigme archicratique. Nous y exposerons son architecture théorique tripolaire — arcalité (ce qui fonde), cratialité (ce qui opère), archicration (ce qui permet la dispute) — ainsi que sa grammaire topologique interne/externe, ses objets de repérage concrets (fonctions, seuils, porteurs, signes, temporalités), et enfin ses critères de validité. Nous chercherons à produire une cartographie intelligible des formes de régulation contemporaine, sans tomber dans le cynisme ni dans lutopie, mais en nommant avec précision les tensions, les prises, les scènes, les ruptures, les points aveugles.
Si la modernité politique a trouvé dans la souveraineté représentative son axe structurant, sa fiction fondatrice et sa promesse régulatrice, cette architecture intellectuelle et institutionnelle semble aujourdhui en proie à une désynchronisation profonde avec les formes effectives de la régulation contemporaine. La souveraineté, dans sa formulation classique — quelle sincarne dans le peuple, la nation, lÉtat, le contrat ou la loi — présuppose une centralité décisionnelle, une légitimité visible, une continuité symbolique entre le fondement et lexercice du pouvoir. Or, ce que nous observons aujourdhui dans la majorité des dispositifs régulateurs, cest une crise de cette souveraineté représentative non pas tant dans sa légitimité que dans sa capacité à structurer les prises réelles sur le monde. La scène parlementaire subsiste, mais elle est fréquemment contournée ; les mécanismes électoraux se perpétuent, mais ils échouent à produire une autorité agissante sur les déterminations majeures ; les figures institutionnelles traditionnelles persistent, mais elles ne sont plus les lieux doù se décident ni les normes, ni les trajectoires. Ce déphasage — structurel, et non conjoncturel — signe lobsolescence progressive dun régime de pensée : celui qui identifie le pouvoir à une source souveraine, incarnée, stable, légitimée.
Car penser larchicratie, ce nest pas inventer un concept : cest lextraire du réel pour en faire un outil de diagnostic, un test de viabilité des régulations, et un levier de critique effective des dispositifs. Cest interroger ce qui gouverne à débat neutralisé, ce qui ordonne sur des justifications difficilement exposables, ce qui affecte en se soustrayant aux formes ordinaires de visibilité, de contestation et de reprise. Cest rouvrir la possibilité dune pensée politique critique du réel.
À cette crise de la souveraineté sajoute lépuisement des grilles de lecture fondées sur le sujet autonome, contractuel, rationnel — figure centrale de la philosophie politique moderne. La fiction du citoyen-individu, maître de lui-même, capable dentrer en délibération avec autrui, producteur dune volonté générale informée, na plus de prise réelle sur les architectures décisionnelles automatisées, sur les normes codifiées par délégation, sur les processus algorithmiques opérant sans concertation. Lidéal contractualiste — au fondement des démocraties libérales occidentales — repose sur une scène dégalité juridique, dinformation partagée, de temporalité différée. Or les régulations actuelles, dans le champ fiscal, sanitaire, technologique, éducatif ou même sécuritaire, se déploient sans que ces conditions soient réunies. Le sujet y est affecté avant même davoir été informé ; il y est inclus sans quon le consulte ; il y est contraint sans avoir la possibilité démettre un désaccord opposable. La subjectivité politique classique — cette figure du citoyen capable de comprendre, dargumenter, de consentir ou de refuser — est contournée par des formats de décision qui nappellent plus ni la volonté, ni la délibération, ni même la conscience. Larchicratie commence précisément là où le pouvoir ne passe plus par le sujet.
Si la modernité politique a trouvé dans la souveraineté représentative son axe structurant, sa fiction fondatrice et sa promesse régulatrice, cette architecture intellectuelle et institutionnelle semble aujourdhui en proie à une désynchronisation profonde avec les formes effectives de la régulation contemporaine. La souveraine, dans sa formulation classique — quelle sincarne dans le peuple, la nation, lÉtat, le contrat ou la loi — présuppose une centralité décisionnelle, une légitimité visible, une continuité symbolique entre le fondement et lexercice du pouvoir.
Mais cette crise des catégories héritées nest pas une vacance : elle est immédiatement occupée par des formes nouvelles de régulation — que nous appelons ici *archicratiques*. Car ce nest pas labsence de pouvoir qui domine, mais sa redistribution silencieuse selon des régimes techno-fonctionnels. Nous assistons à une montée en régime de ce que Foucault nommait déjà *les dispositifs de gouvernementalité* : régulations discrètes, réparties, non centralisées, opérant par la norme, le calcul, la procédure, le protocole, linterface, le flux. Ce sont des décisions sans fondement visible, sans discours justificatif, sans énonciateur identifiable. La décision se donne comme évidence procédurale, comme injonction technique, comme impératif statistique. Lordre nest plus commandé, il est implémenté ; il ne se fonde plus dans la loi, mais dans lalgorithme ; il ne se légitime plus par le débat, mais par le chiffre.
Or, ce que nous observons aujourdhui dans la majorité des dispositifs régulateurs, cest une crise de la souveraineté représentative non pas tant dans sa légitimité déclarée que dans sa capacité à structurer les prises réelles sur le monde. La scène parlementaire subsiste, mais elle est fréquemment contournée ; les mécanismes électoraux se perpétuent, mais ils échouent souvent à peser sur les déterminations majeures ; les figures institutionnelles traditionnelles persistent, mais elles ne sont plus toujours les lieux effectifs de production, de justification et de révision des normes. Ce déphasage — structurel, et non conjoncturel — ne signifie pas la disparition du politique, mais la transformation de ses modes de régulation.
Cette montée archicratique sobserve dans la prolifération de gouvernances sans contre-pouvoir : agences indépendantes, plateformes numériques, circuits de certification, autorités administratives sans délibération parlementaire. Ce sont des formes de régulation qui ne sont pas illégales, mais qui échappent à toute mise en scène démocratique. Le débat nest pas supprimé : il est rendu impossible. Les délais ne sont pas raccourcis : ils sont supprimés. Les voies de recours ne sont pas fermées : elles sont devenues impraticables. Larchicratie est ce régime où la décision opère sans justification explicite, où lordre normatif na plus besoin de fondation symbolique, et où le politique est remplacé par la régulation performative.
À cette crise de la souveraineté sajoute lépuisement des grilles de lecture fondées sur le sujet autonome, contractuel et rationnel, figure centrale de la philosophie politique moderne. La fiction du citoyen-individu, maître de lui-même, capable dentrer en délibération avec autrui et de participer à une volonté générale informée, na plus de prise suffisante sur des architectures décisionnelles automatisées, sur des normes codifiées par délégation, sur des processus algorithmiques opérant à distance ou sans concertation réelle. Le sujet y est souvent affecté avant même davoir été informé ; inclus sans être consulté ; contraint sans pouvoir formuler un désaccord effectivement opposable. La subjectivité politique classique se trouve ainsi contournée par des formats de décision qui nappellent plus nécessairement ni la volonté, ni la délibération, ni même la conscience explicite des sujets affectés.
Dès lors, ce que ce chapitre propose, cest un paradigme non pas alternatif mais *diagnostic* : il ne sagit pas dimaginer une nouvelle utopie du pouvoir juste, mais de produire une grille dintelligibilité critique des régulations sans scène. Car un paradigme nest pas une hypothèse théorique isolée ; il est une manière de rendre pensable ce qui échappait jusqualors aux catégories existantes. Dans notre cas, il sagit de rendre visibles, pensables et opposables les formes de régulation qui opèrent *en dehors* des critères classiques du politique. Le paradigme archicratique est un paradigme de la non-scène : il suppose leffectivité sans justification, la décision sans énonciateur, la procédure sans fondement, la régulation sans contradictoire.
Mais cette crise des catégories héritées nest pas une vacance. Elle signale au contraire lémergence de formes de régulation dont les prises réelles se redistribuent selon des logiques techno-fonctionnelles, administratives, protocolaires ou computationnelles. Ce ne sont pas des formes quil faut appeler archicratiques au sens fort, dès lors quelles tendent précisément à soustraire la régulation à la scène dépreuve ; elles relèvent plutôt de dynamiques de désarchicration, darchicratistique, ou, lorsquelles se referment durablement sur leur propre logique dexécution, de dérives autarchicratiques.
Or, pour être valide, un tel paradigme doit être opposable. Cest-à-dire quil doit permettre de formuler un diagnostic vérifiable, contestable, falsifiable, reproductible. Il doit désigner des objets de repérage : scènes absentes, fondements éteints, délais supprimés, procédures automatiques, figures dintercession techniques. Il doit nommer des configurations typiques : régimes où tout semble fonctionnel, mais où rien ne peut plus être remis en cause. Il doit permettre une lecture différenciée du réel, et non une généralisation rhétorique. Cest à cette condition — à la fois théorique, épistémique et politique — que le paradigme archicratique peut simposer comme une nouvelle grammaire critique de la régulation contemporaine.
Ce que nous voyons proliférer, ce sont des régulations discrètes, réparties, non centralisées, opérant par la norme, le calcul, la procédure, le protocole, linterface ou le flux : décisions à fondement peu visible, à justification faible, à énonciateur diffus, qui se donnent comme évidences procédurales, injonctions techniques ou impératifs statistiques. Lordre ny est plus principalement commandé ; il est implémenté. Il ne se fonde plus toujours dans une loi explicitement débattue ; il sinscrit dans des chaînes opératoires, des standards, des métriques, des architectures logicielles ou des agencements institutionnels partiellement soustraits à lépreuve.
La crise sanitaire du COVID-19, à cet égard, a constitué une épreuve paradigmatique : décisions exceptionnelles prises en Conseil de défense, sans publication des débats, sans délais, sans contradictoire ; régulations sociales massives imposées par décret, par indicateurs, par plateformes ; gouvernance par courbe épidémique, sans justification autre que lanticipation algorithmique. Dans ce moment extrême, le paradigme archicratique a révélé sa capacité à lire ce que les catégories classiques ne permettaient plus dinterpréter. De même, dans la gouvernance algorithmique des aides sociales, dans la notation automatique des élèves ou dans la gestion budgétaire par règles européennes automatiques, nous observons des dispositifs où *la régulation opère sans pouvoir visible, sans scène explicite, sans fondement justifié*. Ce nest pas la fin du politique, cest sa mutation silencieuse. Et cest cette mutation que larchicratie nous permet de penser, de cartographier, de critiquer — à condition que le paradigme se dote dune architecture rigoureuse, dune typologie opératoire, dune exigence de validation, et dun langage partagé. Ce chapitre en jette les fondements.
Cette montée autarchicratique sobserve dans la prolifération de gouvernances sans contre-pouvoir : agences indépendantes, plateformes numériques, circuits de certification, autorités administratives sans délibération parlementaire effective. Ce sont des formes de régulation qui ne sont pas nécessairement illégales, mais qui échappent progressivement à une mise en scène démocratique substantielle. Le débat ny est pas frontalement supprimé : il est rendu inopérant. Les délais ne sont pas toujours abolis : ils deviennent insuffisants, fictifs ou impraticables. Les voies de recours ne sont pas nécessairement closes en droit : elles cessent dêtre effectivement opposables. Lautarchicratie ne désigne donc pas ici un méta-régime symétrique de larchicratie, mais la dérive par laquelle des architectures régulatrices continuent dopérer tout en se soustrayant à la scène dépreuve, en affaiblissant lexposition de leurs fondements et en comprimant le politique dans lexécution performative de leurs propres procédures.
Mais cette prolifération népuise pas le champ des régulations contemporaines : elle rend dautant plus décisif le repérage des scènes encore tenables, des médiations encore opposables et des prises susceptibles dêtre réinstituées.
Dès lors, ce que ce chapitre propose, ce nest pas de rebaptiser “archicratie” la non-scène contemporaine, mais de construire un paradigme capable de la diagnostiquer. Le paradigme archicratique nest pas un paradigme de la non-scène ; il est une grammaire critique permettant de repérer les conditions sous lesquelles une régulation devient fondée, opérante et révisable — ou, au contraire, dérive vers lopacité, lindisputabilité et la fermeture, cest-à-dire lautarchicratie. Il ne vise donc pas à célébrer une mutation silencieuse du pouvoir, mais à rendre visibles, pensables et opposables les écarts entre une régulation pleinement archicratique, articulant arcalité, cratialité et archicration, et des dispositifs qui, tout en continuant dopérer, se soustraient à la scène de leur propre épreuve. Cest à cette condition quun tel paradigme peut prétendre à une véritable portée diagnostique, critique et politique.
Or, pour être valide, un tel paradigme doit être opposable. Cest-à-dire quil doit permettre de formuler un diagnostic vérifiable, contestable, falsifiable, reproductible. Il doit désigner des objets de repérage : scènes neutralisées, mimées ou relocalisées hors datteinte ; fondements opacifiés, euphémisés ou difficilement exposables ; délais comprimés, fictifs ou pratiquement supprimés, procédures automatiques, figures dintercession techniques. Il doit nommer des configurations typiques : régimes où tout semble fonctionnel, mais où rien ne peut plus être remis en cause. Il doit permettre une lecture différenciée du réel, et non une généralisation rhétorique. Cest à cette condition — à la fois théorique, épistémique et politique — que le paradigme archicratique peut simposer comme une nouvelle grammaire critique de la régulation contemporaine.
La crise sanitaire du COVID-19, à cet égard, a constitué une épreuve paradigmatique : décisions exceptionnelles prises en Conseil de défense, sans publication des débats, avec des délais comprimés et un contradictoire fortement réduit ; régulations sociales massives imposées par décret, par indicateurs, par plateformes ; gouvernance par courbe épidémique, avec des justifications largement internalisées dans la logique de lanticipation sanitaire. Dans ce moment extrême, le paradigme archicratique a révélé sa capacité à lire ce que les catégories classiques ne permettaient plus dinterpréter. De même, dans la gouvernance algorithmique des aides sociales, dans la notation automatique des élèves ou dans la gestion budgétaire par règles européennes automatiques, nous observons des dispositifs où la régulation opère à travers des chaînes de décision faiblement visibles, à scène dépreuve comprimée ou relocalisée, et à fondements difficilement exposables pour ceux quils affectent. Ce nest pas la fin du politique, cest sa mutation silencieuse. Et cest cette mutation que le paradigme archicratique nous permet de penser, de cartographier et de critiquer — à condition quil se dote dune architecture rigoureuse, dune typologie opératoire, dune exigence de validation et dun langage partagé.
## 1.1 — Hypothèse fondatrice : Larchicratie comme paradigme triadique de régulation
@@ -52,11 +61,11 @@ Le premier pôle est celui de *larcalité*. Larcalité nest ni une simp
Le second pôle est celui de *la cratialité*. La cratialité désigne la capacité effective dun dispositif à produire des effets dans le monde : son opérativité, sa puissance daction, sa capacité à structurer, à contraindre, à transformer. Elle inclut les infrastructures matérielles (bâtiments, réseaux, plateformes), les dispositifs techniques (logiciels, bases de données, interfaces), les procédures (circulaires, décrets, codifications), les corps organisés (administrations, directions, opérateurs), ainsi que les flux (budgétaires, logistiques, cognitifs) qui permettent à la régulation de seffectuer. La cratialité nest pas nécessairement visible, mais elle est toujours active. Elle est la force sans laquelle la norme reste lettre morte, la capacité sans laquelle le fondement demeure incantation. Cest la force de transformation, mais aussi, potentiellement, celle de capture, de verrouillage ou deffacement de la scène politique.
Le troisième pôle, enfin, est celui de *larchicration*. Ce néologisme désigne la capacité dun ordre à se rendre *disputable* : cest-à-dire à instituer une scène, un moment, un dispositif, où lordre peut être mis en épreuve, critiqué, reformulé, contesté, amendé. Larchicration est ce qui rend le pouvoir *opposable*, non dans un sens antagonique, mais dans un sens procédural, différé, dialogique. Elle prend la forme dun contradictoire institué, dun recours possible, dun délai interprétatif, dun droit de parole, dun espace de reconfiguration. Là où larcalité fonde, où la cratialité opère, larchicration dispute — et en disputant, elle garantit la *viabilité politique* du dispositif. Sans elle, la régulation devient une pure mécanique ; avec elle, elle devient une architecture habitable.
Le troisième pôle, enfin, est celui de *larchicration*. Ce néologisme désigne la capacité dun ordre à se rendre *disputable* : cest-à-dire à instituer une scène, un moment, un dispositif, où lordre peut être mis en épreuve, critiqué, reformulé, contesté, amendé. Larchicration est ce qui rend le pouvoir *opposable*, non dans un sens antagonique, mais dans un sens procédural, différé, dialogique. Elle prend la forme dun contradictoire institué, dun recours possible, dun délai interprétatif, dun droit de parole, dun espace de reconfiguration. Là où larcalité fonde, où la cratialité opère, larchicration dispute — et en disputant, elle garantit la *viabilité politique* du dispositif.
Mais ce qui fait la force heuristique du paradigme archicratique, cest que ces trois pôles ne sont pas des catégories séparées, ni des moments successifs, mais des *dimensions co-présentes* de tout dispositif. Chacun peut dominer, se retrancher, se dissoudre, ou se substituer aux autres, mais leur tension constitue le *champ de régulation*. Ce trépied constitue ainsi une véritable *grille différentielle de lecture* des régulations : il permet de repérer ce qui fonde sans agir, ce qui agit sans fonder, ce qui opère sans être disputé — et, symétriquement, ce qui fonde tout en opérant, ce qui opère tout en permettant la contestation, ce qui conteste à partir dun fondement consistant.
Mais ce qui fait la force heuristique du paradigme archicratique, cest que ces trois pôles ne sont pas des catégories séparées, ni des moments successifs, mais des *dimensions co-présentes* de tout dispositif. Chacun peut dominer, se retrancher, se dissoudre, ou se substituer aux autres, mais leur tension constitue le *champ de régulation*. Ce trépied constitue ainsi une véritable *grille différentielle de lecture* des régulations : il permet de repérer ce qui fonde sans prise opératoire suffisante, ce qui agit sur fondement peu exposable, ce qui opère sous archicration neutralisée ou rendue pratiquement inopérante — et, symétriquement, ce qui fonde tout en opérant, ce qui opère tout en laissant place à la contestation, ce qui conteste à partir dun fondement consistant.
Ce paradigme triadique ne repose donc pas sur une essence du politique, mais sur une condition de possibilité de la régulation. Il ne dit pas ce que *doit être* un bon régime, mais ce qui fait quun ordre peut être dit *politique*, cest-à-dire exposé à lépreuve, fondé dans un sens, et transformateur dune réalité. Dans un contexte où la scène politique se disloque, où les régulations deviennent silencieuses, où les fondements sont euphémisés et les disputes neutralisées, la force de ce paradigme est de *restituer une cartographie* du fait politique. Il ne suffit plus dinvoquer la légitimité, ni de dénoncer la technicisation : il faut *déplier* chaque dispositif en ses composantes fondamentales — fondation, opération, régulation — et en comprendre les combinaisons, les déséquilibres, les absences, les ruptures.
Ce paradigme triadique ne repose donc pas sur une essence du politique, mais sur une condition de possibilité de la régulation. Il ne dit pas ce que *doit être* un bon régime, mais ce qui fait quun ordre peut être dit *politique*, cest-à-dire exposé à lépreuve, fondé dans un sens, et transformateur dune réalité. Dans un contexte où la scène politique se disloque, où les régulations deviennent silencieuses, où les fondements sont euphémisés et les disputes neutralisées, la force de ce paradigme est de *restituer une cartographie* du fait politique. Il ne suffit plus dinvoquer la légitimité, ni de dénoncer la technicisation : il faut *déplier* chaque dispositif en ses composantes fondamentales — fondation, opération, régulation — et en comprendre les combinaisons, les déséquilibres, les mises en latence, les neutralisations et les ruptures darticulation.
Cest sur cette base que se construiront, dans les sections suivantes, une typologie des arcalités, des cratialités et des archicrations, une cartographie interne/externe de leurs interactions, ainsi quune analyse critique de leurs configurations pathologiques. Ce triptyque constitue la structure paradigmatique minimale pour analyser les dispositifs politiques en dehors des grilles souverainistes, contractualistes ou fonctionnalistes. Et cest précisément en les confrontant à la réalité — textes, objets, fonctions, temporalités, cas dusage — que nous en testerons la robustesse.
@@ -92,7 +101,7 @@ Le terme de cratialité comme nous lavons vu en préambule dérive ici du rad
Dans les régimes politiques classiques, on identifie la *cratialité* à lexécutif : ministère, force publique, budget, bras armé. Mais cette lecture est à la fois trop réductrice et historiquement datée. La *cratialité* contemporaine excède largement les figures classiques du pouvoir dÉtat. Elle sincarne dans des *algorithmes*, des *tableaux de bord*, des *logiciels dévaluation*, des *systèmes de logistique globale*, des *normes ISO*, des *actes administratifs unilatéraux*, des *marchés publics automatisés*, des *protocoles cryptés*, des *formulaires numériques inaccessibles*. Elle peut être discrète, discrétionnaire, distribuée, voire disséminée jusquà devenir opaque. Mais elle est toujours active : elle fait advenir un effet de régulation.
Cest pourquoi la *cratialité* ne saurait être conçue comme un simple rouage intermédiaire entre la fondation (*arcalité*) et la révision (*archicration*). Elle nest ni instrument, ni exécution pure. Elle possède sa logique propre, ses effets dautonomisation, ses inerties internes, ses formes dexpansion ou de court-circuit. Elle peut fonctionner sans justification — cest le cas des algorithmes non documentés — et sans épreuve — cest le cas des procédures automatiques non opposables. Cest en cela quelle constitue lun des points névralgiques du basculement archicratique : là où la *cratialité* devient *indépendante*, *autosuffisante*, *désarrimée*, elle cesse dêtre un vecteur de régulation pour devenir un vecteur de domination silencieuse.
Cest pourquoi la *cratialité* ne saurait être conçue comme un simple rouage intermédiaire entre la fondation (*arcalité*) et la révision (*archicration*). Elle nest ni instrument, ni exécution pure. Elle possède sa logique propre, ses effets dautonomisation, ses inerties internes, ses formes dexpansion ou de court-circuit. Elle peut fonctionner comme si elle navait plus à répondre explicitement de ses justifications — cest le cas des algorithmes non documentés — et comme si la scène dépreuve navait plus de prise effective sur son cours ordinaire — cest le cas des procédures automatiques rendues pratiquement non opposables. Cest en cela quelle constitue lun des points névralgiques du basculement archicratique : là où la *cratialité* devient *indépendante*, *autosuffisante*, *désarrimée*, elle cesse dêtre un vecteur de régulation pour devenir un vecteur de domination silencieuse.
Or, comme l*arcalité*, la *cratialité* se donne elle aussi selon une double topologie : interne et externe. Une *cratialité* est dite *interne* lorsquelle repose sur les moyens daction propres au dispositif : administration, personnels, processus décisionnels, procédures codifiées, infrastructures spécifiques. Elle est dite *externe* lorsquelle mobilise des ressources extérieures : cabinets de conseil, normes transnationales, plateformes numériques privées, logistiques externalisées, financements conditionnés, technologies exogènes. Ce clivage interne/externe nest pas secondaire : il est décisif pour comprendre les asymétries de pouvoir, les dépendances structurelles, les logiques de capture. Un hôpital, par exemple, peut être cratialisé de lintérieur par son système de codage et ses tableaux daffectation, ou de lextérieur par des normes budgétaires européennes ou des logiciels achetés à des firmes privées.
@@ -108,11 +117,11 @@ Ce nest pas la performance qui fait la validité politique dune *cratialit
#### **L*archicration* : ce qui dispute, conteste, met en épreuve, arbitre**
L*archicration* constitue le troisième pôle du paradigme archicratique et, à bien des égards, son point dincandescence politique : cest elle qui transforme une régulation en un ordre véritablement *politique*. Là où l*arcalité* fonde et où la *cratialité* opère, l*archicration* institue lépreuve, ouvre la dispute, rend possible la contestation organisée, et par là confère à lordre de régulation une dimension dialogique et réflexive. Sans *archicration*, une régulation nest quun flux ; le pouvoir nest quun automatisme ; le politique sefface derrière la procédure. L*archicration* est donc la scène instituée du différé, du contradictoire, du droit de regard et de la reprise.
Larchicration constitue le troisième pôle du paradigme archicratique et, à bien des égards, son point dincandescence politique : cest elle qui transforme une régulation en un ordre véritablement politique. Là où larcalité fonde et où la cratialité opère, larchicration institue lépreuve, ouvre la dispute, rend possible la contestation organisée, et confère à lordre de régulation une dimension dialogique et réflexive. Lorsquelle est neutralisée, mimée, relocalisée hors datteinte ou rendue pratiquement inopérante, la régulation tend à devenir une pure mécanique ; lorsquelle est tenue comme scène effective de reprise, elle devient une architecture habitable.
Le terme lui-même est construit à partir de *ἀρχὴ* (principe, origine, autorité) et *κρατέω* (être ou devenir le maître). Il désigne donc la capacité dun dispositif de régulation à se rendre *opposable et amendable* dans un cadre institué : une instance, un rituel, une temporalité qui permet aux acteurs concernés de formuler, argumenter, contester, reconfigurer. Cest lanti-mimétisme de la scène : non pas faire semblant découter, mais *produire les conditions réelles* de lécoute, du délai, du recours, de la révision. L*archicration* nest pas une option morale, ni un supplément dâme procédural ; elle est la condition même de lhabitation politique dun ordre, le fait den être maître, den devenir autorité.
Historiquement, les sociétés se sont dotées de formes d*archicration* très variées : tribunaux, parlements, assemblées populaires, chambres de recours, médiations rituelles, procédures de droit coutumier, juridictions supra-étatiques. Ce sont des *scènes instituantes* qui ralentissent lacte, lexposent, louvrent à la pluralité, et, ce faisant, lui confèrent une légitimité durable. Mais ces scènes peuvent se fermer, se vider, se fragmenter, ou être capturées. Dans les dispositifs archicratiques contemporains, l*archicration* est souvent absente, mimée ou neutralisée. On convoque une « consultation publique » dont les résultats sont déjà fixés ; on ouvre une « plateforme participative » dont les algorithmes filtrent les réponses ; on institue des « délais de recours » dont la brièveté ou la complexité les rend impraticables. Il en résulte un effet dévanescence de la scène : elle est là en apparence, mais elle nopère plus en réalité.
Historiquement, les sociétés se sont dotées de formes d*archicration* très variées : tribunaux, parlements, assemblées populaires, chambres de recours, médiations rituelles, procédures de droit coutumier, juridictions supra-étatiques. Ce sont des *scènes instituantes* qui ralentissent lacte, lexposent, louvrent à la pluralité, et, ce faisant, lui confèrent une légitimité durable. Mais ces scènes peuvent se fermer, se vider, se fragmenter, ou être capturées. Dans les dispositifs archicratiques contemporains, larchicration est souvent neutralisée, mimée, relocalisée hors datteinte ou rendue pratiquement inopérante. On convoque une « consultation publique » dont les résultats sont déjà fixés ; on ouvre une « plateforme participative » dont les algorithmes filtrent les réponses ; on institue des « délais de recours » dont la brièveté ou la complexité les rend impraticables. Il en résulte un effet dévanescence de la scène : elle est là en apparence, mais elle nopère plus en réalité.
Cest pourquoi lanalyse archicratique exige de penser l*archicration* en tant que *dimension constitutive*, et non comme simple accessoire. Comme pour l*arcalité* et la *cratialité*, l*archicration* se déploie selon une double topologie : elle peut être interne — lorsquun dispositif institue en son sein des mécanismes de contestation et dajustement (conseils délibératifs, commissions de médiation, audits internes, organes de gouvernance participative) — ou externe — lorsquil est soumis à des scènes de contrôle ou dépreuve extérieures (juridictions supranationales, contre-pouvoirs citoyens, presse, ONG, instances internationales). Ces deux modalités sont cruciales : un dispositif peut être très opposable en externe mais totalement fermé en interne, ou inversement. La santé démocratique dune régulation se mesure à la combinaison des deux.
@@ -122,7 +131,7 @@ L*archicration* ne se limite pas à ce qui autorise la critique ; elle est ce
Enfin, comme pour l*arcalité* et la *cratialité*, l*archicration* doit pouvoir être mesurée, qualifiée, falsifiée. Il ne suffit pas daffirmer quune scène existe ; il faut interroger sa qualité : est-elle accessible, proportionnée, pluraliste, transparente, effective ? Est-elle un véritable lieu de remise en cause ou une simple mise en scène ? Ces questions sont au cœur de lanalyse archicratique. Elles seront systématisées dans la section 1.6, où nous formulerons des critères dopposabilité et dauthentification, et testées empiriquement dans les études de cas du chapitre.
Ainsi, l*archicration* complète le triptyque fondateur du paradigme archicratique. Sans elle, la régulation nest quun flux technique ; avec elle, elle redevient un ordre politique. Elle nest pas un supplément éthique, mais une condition de viabilité. Elle nest pas un idéal abstrait, mais une variable concrète, observable, localisable, qui signe la différence entre un dispositif gouvernant et un dispositif administrant. Et cest précisément parce quelle est aujourdhui menacée, neutralisée ou mimée que le paradigme archicratique simpose : pour rendre visible ce qui se perd, pour diagnostiquer ce qui persiste, et pour imaginer ce qui pourrait sinstituer.
Ainsi, l*archicration* complète le triptyque fondateur du paradigme archicratique. Privée darchicration effective, la régulation tend à nêtre plus quun flux technique ; lorsquune scène de reprise demeure praticable, elle redevient un ordre politique. Elle nest pas un supplément éthique, mais une condition de viabilité. Elle nest pas un idéal abstrait, mais une variable concrète, observable, localisable, qui signe la différence entre un dispositif gouvernant et un dispositif administrant. Et cest précisément parce quelle est aujourdhui menacée, neutralisée ou mimée que le paradigme archicratique simpose : pour rendre visible ce qui se perd, pour diagnostiquer ce qui persiste, et pour imaginer ce qui pourrait sinstituer.
Les trois prises ne se subsument jamais lune lautre : l*arcalité* fonde, la *cratialité* oblige, l*archicration* met en controverse réglée. Aucune ne vaut sans les deux autres ; toute lecture binaire serait régressive.
@@ -192,9 +201,9 @@ Les *objets archicratifs* sont ceux qui manifestent — ou masquent — lexis
Ces objets nont pas pour fonction de produire un effet régulateur direct. Mais ils changent tout au monde politique, car ils transforment un ordre de fait en un ordre contestable, cest-à-dire potentiellement réversible. Là réside leur pouvoir propre : ils inscrivent la norme dans le champ de la délibération. Ils ne gouvernent pas, mais ils rendent le gouvernement visible, énonçable et amendable.
Un simple registre de saisine citoyenne — tenu à jour, accessible, lisible — est un puissant *objet darchicration*. Il permet à une décision dêtre rouverte, à une politique dêtre contestée, à un dispositif dêtre réévalué. Une décision administrative motivée — dont les motifs sont publiés, les délais indiqués, les voies de recours explicitement mentionnées — devient, en ce sens, un support dopposabilité. Inversement, son absence signe une forme dautoritarisme silencieux, une neutralisation de la scène. De même, un procès-verbal daudition contradictoire — où les arguments des différentes parties sont repris, répondus, hiérarchisés — est un *objet archicratif* à haute valeur politique. Il permet mise en visibilité dune épreuve, une documentation de lécoute, une matérialisation de la scène.
Un simple registre de saisine citoyenne — tenu à jour, accessible, lisible — est un puissant *objet darchicration*. Il permet à une décision dêtre rouverte, à une politique dêtre contestée, à un dispositif dêtre réévalué. Une décision administrative motivée — dont les motifs sont publiés, les délais indiqués, les voies de recours explicitement mentionnées — devient, en ce sens, un support dopposabilité. Inversement, son absence signe une forme dautoritarisme silencieux, une neutralisation de la scène. De même, un procès-verbal daudition contradictoire — où les arguments des différentes parties sont repris, répondus, hiérarchisés — est un *objet archicratif* à haute valeur politique. Il rend visible une épreuve, documente lécoute et matérialise la scène.
Mais comme pour les *objets arcaux et cratiaux*, la puissance politique dun *objet archicratif* ne tient pas à sa simple existence formelle. Encore faut-il quil soit effectif, accessible, activable. Une plateforme de consultation publique qui nest ni analysée, ni suivie deffet, ni même modérée de manière transparente, nest pas un objet darchicration — cest une *simulacre archicratique*. Un délai de recours de 24 heures sans possibilité dassistance juridique nest pas un mécanisme de contradictoire, mais un leurre procédural. Il en va de même pour un registre de doléances enfermé dans une armoire, jamais traité, jamais rendu public, nouvrant aucune scène, ne garantissant aucun différé. Il mime louverture archicrative, tout en lempêchant.
Mais comme pour les *objets arcaux et cratiaux*, la puissance politique dun *objet archicratif* ne tient pas à sa simple existence formelle. Encore faut-il quil soit effectif, accessible, activable. Une plateforme de consultation publique qui nest ni analysée, ni suivie deffet, ni même modérée de manière transparente, nest pas un objet darchicration — cest *un simulacre archicratique*. Un délai de recours de 24 heures sans possibilité dassistance juridique nest pas un mécanisme de contradictoire, mais un leurre procédural. Il en va de même pour un registre de doléances enfermé dans une armoire, jamais traité, jamais rendu public, nouvrant aucune scène, ne garantissant aucun différé. Il mime louverture archicrative, tout en lempêchant.
Ainsi, les *objets darchicration* sont hautement vulnérables à la capture, au vide symbolique, à la neutralisation rituelle. Ce sont les objets les plus spectaculaires, mais aussi les plus faciles à rendre ineffectifs, car leur forme suffit à donner lillusion de la dispute. Doù limportance, dans le paradigme archicratique, de ne jamais les considérer de manière formelle ou nominale, mais toujours selon une grille dévaluation substantielle :
@@ -214,9 +223,9 @@ Chaque *objet darchicration* doit donc être interrogé selon ces critères.
Enfin, il convient dinsister sur la topologie des *objets archicratifs*. Ils peuvent être internes : conseils délibératifs, comités déthique, médiateurs, dispositifs de saisine interne, commissions de réexamen. Ils peuvent être externes : recours juridictionnels, mobilisation dinstances indépendantes (Défenseur des droits, Conseil dÉtat, Autorité de régulation), interventions médiatiques documentées, pétitions publiques structurées, tribunaux populaires. Un système politique robuste combine les deux : il sauto-dispute en interne, mais se rend aussi disputable de lextérieur.
Dans des configurations archicratiques, les *objets darchicration* sont souvent mimés en interne — pour donner lillusion de la scène — tandis que les dispositifs externes dopposabilité sont rendus inopérants, dilués ou purement formels. Ce nest pas quun régime serait ouvertement archicratique ; cest que certaines fonctions, certaines séquences ou certains vecteurs de régulation se déploient de manière archicratique : par neutralisation de lépreuve, occultation des fondements et saturation opératoire. L*archicratie* ne désigne donc pas une oligarchie instituée, mais une modalité silencieuse de la régulation qui peut traverser tous les régimes, tous les secteurs, et dont certains groupes sociaux ou fonctions deviennent les porteurs structurels — sans en revendiquer pour autant le nom. Nous les appelons ici : les *archicrates*.
Dans des configurations autarchicratiques, les objets darchicration sont souvent mimés en interne — pour donner lillusion de la scène — tandis que les dispositifs externes dopposabilité sont rendus inopérants, dilués ou purement formels. Ce nest pas quun régime serait ouvertement autarchicratique ; cest que certaines fonctions, certaines séquences ou certains vecteurs de régulation se déploient selon une logique autarchicratique : par neutralisation de lépreuve, occultation des fondements et saturation opératoire. Lautarchicratie ne désigne donc pas une oligarchie instituée, mais une dérive silencieuse de la régulation qui peut traverser tous les régimes, tous les secteurs, et dont certains groupes sociaux ou certaines fonctions deviennent les porteurs structurels — sans en revendiquer pour autant le nom. Nous les appellerons ici, si lon veut les nommer rigoureusement : des porteurs de fermeture autarchique.
Car cest bien cela qui est en jeu : non pas lexistence théorique dune contestation, mais sa possibilité instituée, régulée, documentée. Là où larchicration est absente, le pouvoir devient indiscutable — non par tyrannie explicite, mais par dissolution des conditions de la scène. Là où elle est simulée, le politique devient un théâtre dombres. Là où elle est instituée, explicite, traçable, elle redonne au pouvoir sa dimension dialogique, sa dimension temporelle, sa dimension politique.
Car cest bien cela qui est en jeu : non pas lexistence théorique dune contestation, mais sa possibilité instituée, régulée, documentée. Là où larchicration est neutralisée, mimée, relocalisée hors datteinte ou rendue pratiquement inopérante, le pouvoir tend à devenir indiscutable — non par tyrannie explicite, mais par dissolution des conditions effectives de la scène. Là où elle est simulée, le politique devient un théâtre dombres. Là où elle est instituée, explicite, traçable et opposable, elle redonne au pouvoir sa dimension dialogique, sa dimension temporelle, sa dimension politique.
Les *objets archicratifs* ne sont donc ni accessoires ni résiduels : ils sont la clef de voûte du politique comme épreuve. Ce sont eux qui assurent quune norme nest pas un destin, quune régulation peut être reconfigurée, quun ordre nest pas clos. Ce sont eux qui, au sein de la structure archicratique, permettent que le pouvoir soit tenu pour comptable, et donc transformable.
@@ -226,7 +235,7 @@ Il est nécessaire mais non suffisant didentifier des principes abstraits —
Un badge daccès, un formulaire de recours, un tableau de bord algorithmique, une charte déthique, une convocation à une commission, un registre de délibération, un logiciel de pilotage budgétaire ou un protocole de saisine sont autant dobjets dapparence neutre — mais qui, situés dans un écosystème de régulation, expriment une position archicratique : ils sont les métonymies de la structure, au sens où chaque objet, bien quapparemment partiel, renvoie à lensemble du régime dont il procède.
Un badge sans nom, sans fonction lisible, sans statut accessible ne signale pas seulement un problème daccès : il objective une dissociation entre *cratialité* et *archicration*, en empêchant la formulation de toute contestation localisée. Une charte dentreprise affichée dans un hall, non opposable juridiquement, manifeste une *arcalité* de façade, sans ancrage normatif. Un algorithme qui produit des décisions sans en publier les règles institue une *cratialité* opaque, sans archicration possible. Ce sont là des objets discrets — mais qui configurent le pouvoir, organisent laction, orientent la reconnaissance, verrouillent les possibilités de mise en cause.
Un badge sans nom, sans fonction lisible, sans statut accessible ne signale pas seulement un problème daccès : il objective une dissociation entre *cratialité* et *archicration*, en empêchant la formulation de toute contestation localisée. Une charte dentreprise affichée dans un hall, non opposable juridiquement, manifeste une *arcalité* de façade, sans ancrage normatif. Un algorithme qui produit des décisions sans en publier les règles institue une *cratialité* opaque, sans archicration effective possible. Ce sont là des objets discrets — mais qui configurent le pouvoir, organisent laction, orientent la reconnaissance, verrouillent les possibilités de mise en cause.
Lire une régulation politiquement, cest donc lire les objets qui la rendent possible, et interroger la grammaire que ces objets rendent visible ou invisible. Or, cette grammaire ne peut être saisie quen articulant trois dimensions :
@@ -244,11 +253,11 @@ Mais cette lecture métonymique ne soppose pas à une lecture systémique : a
Si le paradigme archicratique repose sur cette tripartition fondamentale, il serait erroné den faire une grille statique ou une typologie figée. Ce qui fait sa valeur heuristique ne se résume pas en la distinction de ces trois pôles, mais dans la mise en tension dynamique qui les relie, les contraint, les déséquilibre ou les ajuste dans toute situation de régulation. Loin dêtre des sphères séparées, ces trois dimensions nexistent que dans leur interaction mutuelle, dans une dialectique structurante où chacune affecte la viabilité des deux autres. Cest cette logique dinterdépendance — parfois harmonieuse, souvent tendue, parfois rompue — qui constitue la véritable mécanique différentielle de lanalyse archicratique.
L*arcalité* peut exister sans *cratialité* : cest le cas des idéaux solennels sans effectuation, des textes fondateurs devenus vestiges, des récits politiques non suivis daction. La *cratialité* peut se déployer sans *arcalité* : cest le régime du pur instrument, de la machine sans justification, du dispositif opératoire sans horizon. L*archicration* peut être instituée sans prise réelle : cest la critique sans effet, le recours sans impact, la procédure désarmée. Chacun de ces désajustements produit des formes pathologiques de régulation, non par la faute dun défaut total, mais par la déconnexion des pôles entre eux. L*archicratie* ne devient intelligible quen mesurant le degré darticulation effective — et non déclarative — entre ces trois dimensions.
Larcalité peut subsister à létat de vestige, de référence peu opérante ou de fondement faiblement mobilisé ; la cratialité peut sautonomiser sur fond darcalité peu exposable ou faiblement assumée ; larchicration peut être formellement instituée tout en restant sans prise réelle sur la trajectoire décisionnelle. Chacun de ces désajustements produit des formes pathologiques de régulation, non par la faute dun défaut absolu, mais par la déconnexion ou la dégradation des pôles entre eux. Larchicratie ne devient intelligible quen mesurant le degré darticulation effective — et non simplement déclarative — entre ces trois dimensions.
Pour cette raison, il est nécessaire de substituer à la figure du triangle une figure tensorielle, où les forces de chaque pôle exercent une poussée, un rappel ou un affaissement sur les deux autres. Toute régulation produit ainsi un champ de forces, qui peut être tendu, équilibré, instable ou disjoint. L*arcalité* oriente le sens ; la *cratialité* donne prise au réel ; l*archicration* introduit le différé, le possible, linédit. Leur co-présence est la condition minimale dun ordre politique habitable. Leur absence ou leur domination univoque constitue, à linverse, le signe dun régime appauvri, voire fermé et autoritaire.
Pour cette raison, il est nécessaire de substituer à la figure du triangle une figure tensorielle, où les forces de chaque pôle exercent une poussée, un rappel ou un affaissement sur les deux autres. Toute régulation produit ainsi un champ de forces, qui peut être tendu, équilibré, instable ou disjoint. L*arcalité* oriente le sens ; la *cratialité* donne prise au réel ; l*archicration* introduit le différé, le possible, linédit. Leur co-présence est la condition minimale dun ordre politique habitable. Leur neutralisation, leur mise en latence ou leur domination univoque constitue, à linverse, le signe dun régime appauvri, voire fermé et autoritaire.
Ce nest donc pas la présence de chacun des trois pôles, pris isolément, qui garantit la qualité politique dune régulation, mais la manière dont ils se répondent, se nourrissent, se corrigent ou saffrontent. Une *arcalité* active, mais non révisable, produit du dogmatisme. Une *cratialité* hyper-efficiente sans fondement engendre de la brutalité technicienne. Une *archicration* procédurale sans fondation partagée tourne à vide sans adhésion dans le pur arbitraire. Lanalyse archicratique repose alors sur un principe de consistance dynamique : *toute régulation politiquement viable est un régime où la légitimité fondatrice, la puissance opératoire et la scène contradictoire séquilibrent par ajustements réciproques.*
Ce nest donc pas la présence de chacun des trois pôles, pris isolément, qui garantit la qualité politique dune régulation, mais la manière dont ils se répondent, se nourrissent, se corrigent ou saffrontent. Une *arcalité* active, mais non révisable, produit du dogmatisme. Une *cratialité* hyper-efficiente à fondement peu exposable ou désarrimé engendre de la brutalité technicienne. Une *archicration* procédurale sans fondation partagée tourne à vide sans adhésion dans le pur arbitraire. Lanalyse archicratique repose alors sur un principe de consistance dynamique : *toute régulation politiquement viable est un régime où la légitimité fondatrice, la puissance opératoire et la scène contradictoire séquilibrent par ajustements réciproques.*
Cette dynamique se lit dans la manière dont une règle renvoie à une doctrine, dont un instrument laisse place à une critique, dont une norme peut évoluer par révision. Prenons un exemple : un protocole sanitaire. Il peut être fondé (*arcalité* scientifique ou juridique), appliqué (*cratialité* technique et administrative), mais si aucune révision nest possible en cas de controverse, l*archicration* fait défaut — et le dispositif devient pure contrainte et imposition. À linverse, une procédure ouverte à la contestation qui ne serait pas adossée à un fondement clair produirait du désordre, du flottement ou de lépuisement normatif.
@@ -256,17 +265,17 @@ Il importe alors de penser la régulation non comme une mécanique fluide, mais
Cest pourquoi la cartographie archicratique ne vise pas à repérer des dispositifs « purs », mais à diagnostiquer des régimes de composition : *comment sagencent, dans tel ou tel secteur, larcalité, la cratialité et larchicration ? Quelle est la qualité de leur articulation ? Quels seuils de domination ou de carence observe-t-on ?* Cette dynamique nous conduit directement à la section 1.1.4, où nous décrirons les premiers cas limites — ces régulations déséquilibrées où un seul pôle lemporte, où les autres se retirent, où lordre se fige ou seffondre. Ce sont ces cas extrêmes qui révéleront, par contraste, ce qui fait la cohérence — ou la défaillance — dune régulation.
Ainsi, loin de reposer sur une addition de fonctions ou un empilement de principes, le paradigme archicratique se fonde sur lanalyse différentielle de larticulation dynamique entre fondement, opération et épreuve. Cest cette tension constitutive — ni soluble, ni effaçable — qui fait de la régulation un fait politique, et non une simple organisation. Et cest par lanalyse rigoureuse de cette dynamique que nous pourrons, dans les sections ultérieures, établir une typologie des régimes (1.5), des déséquilibres (1.6), des porteurs (1.7), des temporalités (1.8), et des cas empiriques (1.9).
Ainsi, loin de reposer sur une addition de fonctions ou un empilement de principes, le paradigme archicratique se fonde sur lanalyse différentielle de larticulation dynamique entre fondement, opération et épreuve. Cest cette tension constitutive — ni soluble, ni effaçable — qui fait de la régulation un fait politique, et non une simple organisation. Et cest par lanalyse rigoureuse de cette dynamique que nous pourrons, dans les sections ultérieures, préciser les premiers déséquilibres (1.1.4), puis plus tard dans le chapitre, les formes dynamiques de la tenue archicratique (1.5), les repères heuristiques (1.6) et les morphologies opérantes (1.7).
### 1.1.4 — Premiers cas limites : déséquilibres, courts-circuitages et régulations instables
Encore faut-il que notre construction tripartite permette de repérer les régulations qui échouent, non par absence de dispositifs, mais par déséquilibre interne entre les trois pôles constitutifs du paradigme. Cest précisément dans ces cas limites — ces régimes pathologiques où un seul pôle écrase ou court-circuite les autres — que la robustesse analytique du paradigme archicratique peut se vérifier. Ce ne sont pas des anomalies anecdotiques, mais des figures structurantes de la régulation contemporaine, des formes typiques de désarticulation qui signent lentrée dans une zone grise du politique : ni complètement illégitime, ni ouvertement dictatoriale, mais oblitérant lopposabilité.
La première configuration critique est celle de la *cratialité* orpheline, où la puissance dagir est autonome, sans fondement clair, ni scène dépreuve possible. On y observe des chaînes dexécution hautement performantes — plateformes logistiques, tableaux de pilotage budgétaire, algorithmes décisionnels, procédures automatisées — qui fonctionnent sans invocation fondatrice (*arcalité*) et sans recours institué (*archicration*). La décision devient impersonnelle, inattaquable, et souvent non négociable. La puissance technique se substitue à la justification et à lépreuve.
La première configuration critique est celle de la cratialité orpheline, où la puissance dagir tend à sautonomiser sur fond darcalité faiblement exposable et darchicration neutralisée, comprimée ou rendue pratiquement inopérante. On y observe des chaînes dexécution hautement performantes — plateformes logistiques, tableaux de pilotage budgétaire, algorithmes décisionnels, procédures automatisées — qui fonctionnent avec des fondements peu explicités pour les affectés et avec des voies de reprise, de contestation ou de recours soit relocalisées hors datteinte, soit fictives, soit matériellement impraticables. La décision y devient impersonnelle, difficilement attaquable, et souvent non négociable dans les faits. Ce qui caractérise cette configuration nest donc pas labsence absolue de fondement ou de scène, mais leur dégradation opératoire : larcalité subsiste sous forme implicite, technique ou déléguée ; larchicration subsiste comme possibilité affaiblie, mimée ou neutralisée ; tandis que la cratialité, elle, concentre leffectivité.
La seconde figure limite est celle de l*arcalité* désincarnée, où les récits fondateurs subsistent — parfois en majesté — mais ne produisent plus deffet régulateur. Constitutions vénérées, serments solennels, principes éthiques, déclarations universelles sont mobilisés dans les discours, affichés dans les chartes, mais ne traversent plus les dispositifs opératoires. Il en résulte un régime de performativité déconnectée : les institutions prétendent être fondées en droit ou en humanisme, mais leur fonctionnement réel sémancipe totalement de ce socle. L*arcalité* devient alors décorative, voire cyniquement instrumentalisée : cest le cas des appels républicains dans des politiques autoritaires, des valeurs affichées dans des dispositifs inaccessibles, ou des codes déthique utilisés pour justifier des dispositifs de surveillance. Ce désajustement génère une forme de désorientation politique profonde, où la norme déclarée et la norme opératoire ne se rejoignent plus.
La troisième pathologie est celle de l*archicration* fictive, où des scènes de dispute sont instaurées, mais sans effectivité réelle. Le dispositif donne lapparence dun contradictoire — consultation publique, boîte à idées, forum participatif, convention citoyenne, droit de recours — mais en réalité, aucune des conditions de lopposabilité nest remplie : délais trop courts, opacité des motifs, non-publication des réponses, filtrage des revendications, absence de prise sur la décision finale. Cette forme de mise en scène procédurale produit une illusion de démocratie régulée, où la scène dépreuve est ritualisée sans effet. L*archicration* existe ici comme spectacle, non comme épreuve, et contribue paradoxalement à renforcer lirréversibilité des décisions prises. Cest le cas par exemple de certaines concertations environnementales menées en urgence, où les contributions citoyennes sont enregistrées, mais sans être prises en compte ni motivées dans les décisions finales.
La troisième pathologie est celle de l*archicration* fictive, où des scènes de dispute sont instaurées, mais sans effectivité palpable. Le dispositif donne lapparence dun contradictoire — consultation publique, boîte à idées, forum participatif, convention citoyenne, droit de recours — mais en réalité, aucune des conditions de lopposabilité nest remplie : délais trop courts, opacité des motifs, non-publication des réponses, filtrage des revendications, absence de prise sur la décision finale. Cette forme de mise en scène procédurale produit une illusion de démocratie régulée, où la scène dépreuve est ritualisée sans effet. L*archicration* existe ici comme spectacle, non comme épreuve, et contribue paradoxalement à renforcer lirréversibilité des décisions prises. Cest le cas par exemple de certaines concertations environnementales menées en urgence, où les contributions citoyennes sont enregistrées, mais sans être prises en compte ni motivées dans les décisions finales.
Mais il existe aussi des cas où un seul pôle détourne ou capture les deux autres. On parlera alors de court-circuit paradigmatique, ou deffet de surcodage. Ainsi, une cratialité surpuissante peut simuler un fondement (en produisant des justifications pseudo-techniques ou tautologiques : « cest la procédure », « lalgorithme la déterminé »), tout en neutralisant la scène de lépreuve (« ce nest pas contestable, car cest automatisé »). Nous nommons ce type de dérive : *régime hypercratial*.
@@ -274,9 +283,11 @@ Mais il existe aussi des cas où un seul pôle détourne ou capture les deux aut
Enfin, une *archicration* *hypertrophiée* — une société saturée de recours, dinstances, de médiations — peut empêcher toute effectuation : cest la régulation paralysée par la sur-opposabilité, la scène dépreuve transformée en labyrinthe.
Ces cas limites ne sont pas simplement pathologiques : ils sont heuristiquement structurants. Ils montrent comment léquilibre entre les pôles ne relève ni dune essence ni dune norme, mais dun jeu dajustement toujours instable, toujours à documenter. Cest dans leur désajustement que se révèlent les conditions minimales de viabilité politique dun dispositif. Car un ordre peut survivre longtemps sans fondement (arcalité), ou sans épreuve (archicration), ou même sans action (cratialité), mais il cesse alors dêtre un ordre politique habitable : il devient un régime bloqué de contrainte, de vacance ou dimpuissance.
Ces cas limites ne sont pas simplement pathologiques : ils sont heuristiquement structurants. Ils montrent comment léquilibre entre les pôles ne relève ni dune essence ni dune norme, mais dun jeu dajustement toujours instable, toujours à documenter. Cest dans leur désajustement que se révèlent les conditions minimales de viabilité politique dun dispositif. Car une formation collective peut se maintenir durablement sous déficit darcalité, sous atrophie de larchicration, ou sous affaissement de la cratialité ; mais elle cesse alors dêtre un ordre politique pleinement habitable. Elle persiste au prix dune dégradation de sa co-viabilité, et tend à devenir un régime bloqué de contrainte, de vacance ou dimpuissance.
Enfin, ces déséquilibres ne doivent pas être lus comme des erreurs de conception ou des dysfonctionnements ponctuels. Ils signalent souvent des régimes intentionnels de régulation, où labsence de fondement, la fermeture de la dispute ou la saturation de lopération sont stratégiquement construits pour éviter lépreuve politique. Cest ici que le paradigme archicratique déploie sa force critique : en rendant visibles ces dispositifs qui, tout en étant fonctionnels, se soustraient à la critique, à la scène, à lépreuve.
À linverse, ces cas-limites valent aussi comme révélateurs dune exigence positive : ils indiquent, par contraste, ce quune tenue archicratique minimale doit préserver pour quune régulation demeure habitable, révisable et politiquement soutenable.
Enfin, ces déséquilibres ne doivent pas être lus comme des erreurs de conception ou des dysfonctionnements ponctuels. Ils signalent souvent des régimes intentionnels de régulation, où le défaut dexposition du fondement, la neutralisation de la dispute ou la saturation de lopération sont stratégiquement construits pour éviter lépreuve politique. Cest ici que le paradigme archicratique déploie sa force critique : en rendant visibles ces dispositifs qui, tout en étant fonctionnels, se soustraient à la critique, à la scène, à lépreuve.
Mais dores et déjà, cette exploration des désajustements initiaux nous permet de poser une hypothèse structurante : une régulation devient politiquement problématique non lorsquun pôle manque absolument, mais lorsque ses interactions avec les autres sont rompues, perverties, neutralisées. Ce sont ces configurations, ces bifurcations, ces effets de bascule que lanalyse archicratique doit pouvoir capter, nommer, décrire et critiquer.
@@ -294,7 +305,7 @@ Et cest dans cette tension — entre diagnostic et normativité, entre transv
### 1.2.1 — Régime, forme, structure : clarification des niveaux danalyse
Penser le politique suppose toujours, à un moment donné, de se situer dans une hiérarchie conceptuelle : quels sont les niveaux auxquels se déploient les régulations ? Où sarrête la description ? Où commence la structure ? Quand lanalyse quitte-t-elle lempirisme des formes visibles pour formuler une hypothèse sur les conditions de possibilité elles-mêmes ? Le paradigme archicratique, en tant quhypothèse structurante, impose de clarifier cette gradation. Car on ne peut pas lidentifier ni en mesurer la portée sans distinguer trois plans souvent confondus : le régime, la forme et la structure.
Pour mesurer la portée du paradigme archicratique, il faut dabord distinguer trois plans souvent confondus : le régime, la forme et la structure. Penser le politique suppose toujours, à un moment donné, de se situer dans une hiérarchie conceptuelle : à quels niveaux se déploient les régulations ? où sarrête la description ? où commence lhypothèse sur leurs conditions de possibilité ?
Un régime, au sens classique des sciences politiques (depuis Aristote jusquà Linz, Sartori ou Bobbio), désigne un type de gouvernement fondé sur une certaine configuration dinstitutions, de normes et de principes de légitimation. Démocratie représentative, monarchie constitutionnelle, autoritarisme plébiscitaire, théocratie — autant de régimes qui décrivent des architectures institutionnelles différenciées, avec leurs acteurs, leurs règles du jeu, leurs modes de reproduction. Le régime est donc un ensemble visible, énonçable, formalisé, que lon peut inscrire dans une histoire constitutionnelle, dans un droit positif, dans une morphologie institutionnelle repérable.
@@ -302,7 +313,7 @@ La forme, en revanche, relève dun niveau intermédiaire. Elle désigne les m
Mais en-dessous de ces formes, il y a la structure régulatrice : un plan plus profond, plus transversal, plus déterminant, qui ne désigne ni les institutions ni les pratiques, mais les conditions même de possibilité de la régulation politique. Cette structure est ce qui permet — ou non — quun ordre se rende visible, controversable, habitable. Elle ne renvoie pas à une architecture constitutionnelle, mais à une configuration dagencement entre ce qui fonde, ce qui opère, et ce qui permet den discuter. Cest là que se situe lhypothèse archicratique : non au niveau des régimes ou des formes, mais au niveau de la structure régulatrice profonde, ce que lon pourrait appeler, en empruntant à Lévi-Strauss ou à Althusser, un *inconscient politique de la régulation*.
L*archicratie* nest donc pas un régime de plus. Elle nest pas la cousine néolibérale de la démocratie, ni une dérive technocratique de lÉtat-nation. Elle est le nom donné à une structure de régulation sans scène instituée, sans fondement invocable, sans épreuve contradictoire formelle. Et à ce titre, elle peut traverser différents régimes, sy superposer, y introduire des failles ou des inerties, sy agglomérer comme un parasitage silencieux. Un régime peut être démocratique en apparence, mais archicratique dans sa structure opératoire réelle. Inversement, certaines formes autoritaires peuvent ménager des archicrations ponctuelles, permettant une conflictualité politique minimale. Cest ce qui rend larchicratie si difficile à identifier, et si nécessaire à penser : elle ne se lit pas dans les institutions, mais dans la manière dont un ordre rend — ou non — la régulation opposable, différée, arbitrable.
Lautarchicratie nest donc pas un régime politique de plus. Elle nest ni la cousine néolibérale de la démocratie, ni une simple dérive technocratique de lÉtat-nation. Elle désigne la dérive par laquelle des architectures régulatrices continuent dopérer tout en se soustrayant progressivement à la scène dépreuve : les fondements ne disparaissent pas nécessairement, mais deviennent de moins en moins susceptibles dexposition ; les procédures contradictoires peuvent subsister, mais se vident, se simulent ou deviennent inopérantes ; et la régulation tend à se refermer sur sa propre logique dexécution. À ce titre, lautarchicratie peut traverser différents régimes politiques, sy superposer, y introduire des inerties, des fermetures ou des parasitages silencieux. Un régime peut ainsi être démocratique en apparence, tout en dérivant vers une structure opératoire autarchicratique. Inversement, certaines formes autoritaires peuvent encore ménager des archicrations ponctuelles, permettant le maintien dune conflictualité politique minimale. Cest ce qui rend lautarchicratie difficile à identifier, et pourtant nécessaire à penser : elle ne se lit pas seulement dans les institutions, mais dans la manière dont un ordre rend — ou non — sa régulation exposable, opposable, différable et révisable.
Cette distinction entre régime, forme, et structure nest pas simplement académique. Elle est politiquement décisive. Car cest elle qui permet déviter deux écueils fréquents : le fétichisme institutionnel (croire quun régime démocratique suffit à garantir une régulation juste), et le scepticisme cynique (penser que toute régulation est toujours déjà close, dominée, irréformable). L*archicratie* introduit un plan danalyse transversal, qui oblige à questionner non ce que les institutions prétendent, mais ce quelles permettent réellement en termes de fondement, dopération, et de dispute. Elle ouvre une lecture différentielle du politique, fondée non sur létiquette (démocratie ou non), mais sur la qualité régulatrice de lordre.
@@ -310,34 +321,36 @@ En clarifiant ce niveau danalyse, on peut désormais définir l*archicrati
### 1.2.2 — Larchicratie comme méta-régime transversal de la régulation
Comme nous lavons éta l*archicratie* nest pas un type de régime politique au sens classique du terme. Elle nest ni une démocratie, ni une autocratie, ni une technocratie, ni une bureaucratie au sens formel. Elle nest pas définie par un mode daccès au pouvoir, une forme de représentation, ou une structure constitutionnelle donnée. Elle ne se substitue pas aux régimes : elle les traverse, les parasite, les reconfigure, les dilue ou les redouble. Ce que le paradigme archicratique propose, ce nest donc pas dajouter une étiquette à la typologie déjà saturée des formes politiques, mais de formuler une hypothèse forte sur la structure profonde qui rend possible — ou impossible — la régulation politique dans ses dimensions fondamentales.
Comme nous lavons établi, larchicratie nest pas un type de régime politique au sens classique du terme. Elle nest ni une démocratie, ni une autocratie, ni une technocratie, ni une bureaucratie au sens formel. Elle nest pas définie par un mode daccès au pouvoir, une forme de représentation, ou une structure constitutionnelle donnée. Elle ne se substitue pas aux régimes : elle les traverse, les reconfigure, parfois les parasite ou les redouble. Ce que le paradigme archicratique propose, ce nest donc pas dajouter une étiquette à la typologie déjà saturée des formes politiques, mais de formuler une hypothèse forte sur la structure profonde qui rend possible — ou impossible — la régulation politique dans ses dimensions fondamentales.
Cest en ce sens que nous définissons l*archicratie comme un méta-régime de régulation*.
Un méta-régime nest pas une catégorie de surface. Il ne désigne pas un type dorganisation institutionnelle, ni même un modèle de gouvernement parmi dautres. Il opère à un niveau plus profond : celui des conditions de possibilité de la régulation, celui de larticulation — ou de la disjonction — entre les trois dimensions constitutives que nous avons décrites : l*arcalité* (fondement), la *cratialité* (opération), et l*archicration* (épreuve). Là où les régimes désignent des structures politiques historiquement repérables, le méta-régime désigne la manière dont ces structures rendent (ou non) leurs propres régulations visibles, discutables, contestables et révisables.
Un méta-régime nest pas une catégorie de surface. Il ne désigne pas un type dorganisation institutionnelle, ni même un modèle de gouvernement parmi dautres. Il opère à un niveau plus profond : celui des conditions de possibilité de la régulation, celui de larticulation — ou de la disjonction — entre les trois dimensions constitutives que nous avons décrites : l*arcalité* (fondement), la *cratialité* (opération), et l*archicration* (épreuve). Là où les régimes désignent des structures politiques historiquement repérables, le méta-régime désigne la manière dont ces structures rendent (ou non) leurs propres régulations exposables à la contradiction, à la reprise et à la révision.
Dit autrement, un *méta-régime* nest pas une forme politique particulière, mais un rapport entre les formes, un *agencement systémique entre ce qui fonde, ce qui opère, et ce qui rend opposable*. Il ne se lit pas dans les discours publics, ni même dans les textes constitutionnels : il se repère dans la cohérence (ou lincohérence) dun dispositif de régulation. Ce que propose le paradigme archicratique, cest donc une grille dintelligibilité transversale : un outil analytique permettant de diagnostiquer des états de régulation dans toute configuration politique donnée, en interrogeant non pas leur légalité ou leur conformité, mais leur tenue archicrative effective.
Dit autrement, un *méta-régime* nest pas une forme politique particulière, mais un rapport entre les formes, un *agencement systémique entre ce qui fonde, ce qui opère, et ce qui rend opposable*. Il ne se lit pas dans les discours publics, ni même dans les textes constitutionnels : il se repère dans la cohérence (ou lincohérence) dun dispositif de régulation. Ce que propose le paradigme archicratique, cest donc un analyseur transversal des états de régulation dans toute configuration politique donnée, en interrogeant non pas leur légalité ou leur conformité, mais leur tenue archicrative effective.
Cette grille permet par exemple de comparer un dispositif dallocation daides sociales dans une démocratie représentative, un protocole sanitaire dans une dictature *soft*, ou un mécanisme dajustement budgétaire dans une structure supra-étatique. Ce qui compte, ce nest pas létiquette politique du régime, mais la qualité de sa régulation au regard des trois critères fondamentaux : le fondement mobilisé (*arcalité*), les moyens deffectuation (*cratialité*), et les possibilités instituées de contestation (*archicration*). L*archicratie* devient ainsi un analyseur paradigmatique, cest-à-dire une manière de lire des dispositifs en détectant ce qui sy fonde, ce qui y opère, et ce qui sy dispute — ou non.
Cette approche nest pas purement descriptive. Elle est diagnostique, critique, opposable. Elle permet de dire : « ici, lordre régulateur semble robuste, mais il est archicratique en ce sens quil est devenu indisputable » ; ou bien : « ce dispositif mobilise un fondement fort, mais il est cratialisé sans contrôle, et sans scène de recours ». En ce sens, l*archicratie* nest pas un concept mollement critique : elle est une épreuve conceptuelle pour les régimes existants, un test de viabilité démocratique ou politique, une mise à nu des écarts entre linvocation des principes et la structure réelle de la régulation.
Cette approche nest pas purement descriptive. Elle est diagnostique, critique, opposable. Elle permet de dire : « ici, lordre régulateur semble robuste, mais il fonctionne désormais sur un mode autarchicratique, en ce quil devient indisputable » ; ou bien : « ce dispositif mobilise un fondement fort, mais sa cratialité se déploie avec un contrôle affaibli et une scène de recours neutralisée, comprimée ou rendue pratiquement inopérante ». En ce sens, larchicratie nest pas un concept mollement critique : elle est une épreuve conceptuelle pour les régimes existants, un test de viabilité politique, une mise à nu des écarts entre linvocation des principes et la structure réelle de la régulation.
Mais surtout, cette conceptualisation du *méta-régime archicratique* permet de dépasser deux impasses majeures des théories politiques classiques. La première, *normative*, qui suppose quun régime est légitime parce quil respecte formellement certaines règles (élections, séparation des pouvoirs, État de droit). Or, ces règles peuvent subsister tandis que la régulation réelle devient opaque, automatique ou imperméable à la contestation.
La seconde, que nous nommons *contextualisée*, qui affirme que chaque régime porte sa cohérence interne, ses normes propres, son rythme historique. Certes. Mais le paradigme archicratique montre que certaines tensions traversent tous les régimes : celle entre ce qui fonde, ce qui opère, et ce qui conteste. Et que cest dans cette tension que se joue la co-viabilité politique réelle dun ordre.
En ce sens, on peut dire que le paradigme archicratique relève dune démarche post-weberienne : il ne cherche pas à classer les régimes dautorité selon des types idéaux de légitimation (traditionnelle, charismatique, légale-rationnelle), mais à analyser les conditions concrètes de lopposabilité des régulations, indépendamment de leurs formes déclarées. Il reformule la question du pouvoir non en termes de commandement, mais en termes de co-présence entre les dimensions de fondation, deffectuation, et de mise en épreuve.
En ce sens, on peut dire que le paradigme archicratique relève dune démarche post-wébérienne : il ne cherche pas à classer les régimes dautorité selon des types idéaux de légitimation (traditionnelle, charismatique, légale-rationnelle), mais à analyser les conditions concrètes de lopposabilité des régulations, indépendamment de leurs formes déclarées. Il reformule la question du pouvoir non en termes de commandement, mais en termes de co-présence entre les dimensions de fondation, deffectuation, et de mise en épreuve.
Cest cette transversalité — au-delà des régimes, des époques, des configurations — qui fonde l*archicratie* comme méta-régime analytique. Elle ne se substitue pas aux typologies existantes, mais les traverse. Elle ninvalide pas les concepts de démocratie, dÉtat, de représentation, mais les reconfigure en introduisant une dimension de *régulation par tensions de co-viabilité*.
Pour cette raison, larchicratie peut être mobilisée à la fois comme hypothèse heuristique, comme outil critique, et comme grille de diagnostic différentiel. Elle ne prétend pas tout expliquer, mais elle permet de poser cette question décisive : *dans un régime donné, qui peut invoquer quoi ? Qui peut agir sur quoi ? Qui peut contester quoi ? Et selon quelles formes, sous quels délais, avec quelle effectivité ?*
Pour cette raison, larchicratie peut être mobilisée à la fois comme hypothèse heuristique, comme outil critique, et comme cadre de diagnostic différentiel. Elle ne prétend pas tout expliquer, mais elle permet de poser cette question décisive : *dans un régime donné, qui peut invoquer quoi ? Qui peut agir sur quoi ? Qui peut contester quoi ? Et selon quelles formes, sous quels délais, avec quelle effectivité ?*
Autrement dit : le pouvoir régule — *mais est-il régulé ?*
Et si, non : *où est passée la scène ?*
Et, si ce nest pas le cas, où est passée la scène ?
Inversement, lorsquune scène tient encore, même localement, est-ce elle qui rend de nouveau possible la suspension, la comparution et la requalification des prises régulatrices.
### 1.2.3 — Les critères de validité paradigmatique : fécondité, puissance et opposabilité
Ce qui rend un paradigme légitime, cest sa capacité à soutenir la pensée, à générer de nouvelles distinctions, à organiser lintelligibilité du réel, mais surtout à sexposer à lépreuve, cest-à-dire à la mise en tension critique, à la validation empirique, à la falsifiabilité théorique et à la réversibilité herméneutique. À cette aune, le paradigme archicratique ne saurait se contenter dêtre une intuition éclairante ou une métaphore suggestive ; il doit se doter dun ensemble de critères de validité, rigoureusement définis, qui justifient son usage comme instrument analytique, son efficience comme outil heuristique, et sa robustesse comme cadre de pensée politique. Un paradigme sert à rendre visible ce qui était jusqualors obscurci, dispersé, méconnu ou neutralisé.
Ce qui rend un paradigme légitime, cest sa capacité à soutenir la pensée, à générer de nouvelles distinctions, à organiser lintelligibilité du réel, mais surtout à sexposer à lépreuve, cest-à-dire à la mise à lépreuve contradictoire, à la validation empirique, à la falsifiabilité théorique et à la réversibilité herméneutique. À cette aune, le paradigme archicratique ne saurait se contenter dêtre une intuition éclairante ou une métaphore suggestive ; il doit se doter dun ensemble de critères de validité, précisément définis, qui justifient son usage comme instrument analytique, son efficience comme outil heuristique, et sa robustesse comme cadre de pensée politique. Un paradigme sert à rendre visible ce qui était jusqualors obscurci, dispersé, méconnu ou neutralisé.
Trois conditions principales structurent cette exigence de validité : la fécondité analytique, la puissance explicative, et surtout lopposabilité empirique — cette dernière constituant le seuil le plus élevé de toute ambition théorique sérieuse. En cela, la validité paradigmatique ne relève ni du consensus idéologique, ni de la cohérence formelle interne : elle engage une éthique épistémique, un devoir de rigueur, un engagement de réfutabilité qui doit orienter lensemble de notre construction.
@@ -353,7 +366,7 @@ Il devient ainsi possible, grâce à cette grille tripolaire, de qualifier des r
Mais encore faut-il que le paradigme soit explicatif, cest-à-dire capable de rapprocher des phénomènes épars, de construire des séries intelligibles, de réduire la contingence apparente à des configurations discernables. Là encore, le paradigme archicratique simpose par sa puissance intégratrice : il permet dembrasser dans une même grille danalyse des réalités qui, jusque-là, semblaient hétérogènes — parce que dispersées dans des domaines sectoriels (fiscalité, santé, climat, numérique, sécurité), ou parce quenveloppées dans des langages spécialisés (juridique, économique, algorithmique).
Cest précisément cette capacité à unifier sans uniformiser, à articuler sans réduire, qui signe la force dun paradigme. En *archicratie*, des phénomènes aussi variés que — la gouvernance sanitaire par indicateurs ; la régulation budgétaire par règles automatiques ; la gestion algorithmique des droits sociaux ; lapplication de standards techniques globaux sans débat local ; ou encore la prolifération des plateformes numériques de notification unilatérale — peuvent être reliés, compris, comparés à laune dune même question : *cette régulation est-elle fondée, opérante et opposable ?* Si lun de ces trois pôles fait défaut, la régulation devient fragile, injustifiable ou autoritaire. Ainsi, ce que le paradigme archicratique rend possible, cest une lecture transversale, critique, intersectorielle du politique contemporain — non plus à partir des formes visibles de pouvoir, mais à partir de ses pratiques effectives de régulation, de ses vecteurs techniques, et de ses seuils de dispute.
Cest précisément cette capacité à unifier sans uniformiser, à articuler sans réduire, qui signe la force dun paradigme. En *archicratie*, des phénomènes aussi variés que — la gouvernance sanitaire par indicateurs ; la régulation budgétaire par règles automatiques ; la gestion algorithmique des droits sociaux ; lapplication de standards techniques globaux sans discussion locale ; ou encore la prolifération des plateformes numériques de notification unilatérale — peuvent être reliés, compris, comparés à laune dune même question : *cette régulation est-elle fondée, opérante et opposable ?* Si lun de ces trois pôles fait défaut, la régulation devient fragile, injustifiable ou autoritaire. Ainsi, ce que le paradigme archicratique rend possible, cest une lecture transversale, critique, intersectorielle du politique contemporain — non plus à partir des formes visibles de pouvoir, mais à partir de ses pratiques effectives de régulation, de ses vecteurs techniques, et de ses seuils de dispute.
#### Une opposabilité empirique : falsifiabilité, indicateurs et critères de lecture
@@ -369,13 +382,13 @@ Ces critères sont au nombre de quatre, que nous avons déjà évoqués en filig
- La *possibilité de recours effectif* : une norme est politique si elle peut être contestée dans un délai raisonnable, devant une instance compétente, selon une procédure intelligible et des modalités non excluantes. Le formalisme du recours ne suffit pas ; cest sa praticabilité qui importe.
Ces quatre indicateurs peuvent être mesurés, étayés et comparés. Ils permettent dobjectiver le diagnostic archicratique, den délivrer une cartographie différenciée, et den circonscrire les seuils. Ils rendent la critique opératoire et la théorie falsifiable. Car il est tout à fait possible quun dispositif tienne sans scène, sans délai, sans recours, sans fondement clair — dans ce cas, notre paradigme devra savouer inopérant. Cest précisément cette possibilité qui fonde sa valeur scientifique.
Ces quatre indicateurs peuvent être mesurés, étayés et comparés. Ils permettent dobjectiver le diagnostic archicratique, den délivrer une cartographie différenciée, et den circonscrire les seuils. Ils rendent la critique opératoire et la théorie falsifiable. Car il est tout à fait possible quun dispositif tienne avec une scène neutralisée ou relocalisée hors datteinte, avec des délais fictifs ou comprimés, avec des recours formellement ouverts mais pratiquement impraticables, avec des fondements difficiles à exposer ou à opposer. Dans ce cas, notre paradigme na pas à savouer inopérant : il doit précisément décrire, qualifier et mesurer cette neutralisation, cette compression, cette inopérance ou cette opacification. Cest précisément cette possibilité qui fonde sa valeur scientifique.
Par ailleurs, ce paradigme pourra être confronté à des contre-exemples méthodiques — ce que nous ferons dans la section 1.10 — afin de tester la puissance de sa réfutabilité. Il ne sagit pas de tout faire entrer dans le moule archicratique, mais de tester la pertinence du moule face à des réalités rétives, résistantes, voire incompatibles. Cest cela, lesprit de la critique : ne pas chercher la confirmation, mais la disjonction révélatrice.
Par ailleurs, ce paradigme pourra être confronté à des contre-exemples méthodiques — ce qui devra être éprouvé dans les usages empiriques ultérieurs du paradigme — afin de tester la puissance de sa réfutabilité. Il ne sagit pas de tout faire entrer dans le moule archicratique, mais de tester la pertinence du moule face à des réalités rétives, résistantes, voire incompatibles. Cest cela, lesprit de la critique : ne pas chercher la confirmation, mais la disjonction révélatrice.
En définitive, le paradigme archicratique ne vaut que par sa capacité à rendre visible ce qui opère sans justification, à déplier ce qui agit sans être discuté, à donner langue à ce qui neutralise le contradictoire. Il ne se présente pas comme une nouvelle théorie normative, ni comme un surplomb idéologique, mais comme une grille de détection des régulations silencieuses — celles qui se passent de scène, de délai, de motifs, de recours, et qui, de ce fait, court-circuitent la possibilité même du politique.
En définitive, le paradigme archicratique ne vaut que par sa capacité à élucider ce qui opère à travers des justifications faiblement exposables, à déplier ce qui agit à travers des scènes comprimées, mimées ou relocalisées, à donner langue à ce qui neutralise le contradictoire sans jamais labolir purement et simplement. Il ne se présente pas comme une nouvelle théorie normative, ni comme un surplomb idéologique, mais comme un opérateur de détection des régulations silencieuses — celles où la scène se vide, où les délais deviennent fictifs, où les motifs deviennent inopposables, où les recours cessent dêtre pratiquement saisissables, et qui, de ce fait, court-circuitent la possibilité même du politique.
En ce sens, il est un paradigme à la fois critique et méthodique : critique, car il met à nu les absences, les évasions, les courts-circuits ; méthodique, puisquil les mesure, les nomme, les cartographie, et les expose à lépreuve. Ce nest quà cette double condition — fécondité analytique et opposabilité empirique — que le paradigme archicratique pourra prétendre à une légitimité scientifique, académique et politique. Et cest sur cette base, et cette base seulement, quil pourra accompagner leffort critique contemporain pour penser ce qui régule sans quon le voie, ce qui gouverne sans quon le dise, ce qui décide sans quon puisse le conteste.
En ce sens, il est un paradigme à la fois critique et méthodique : critique, car il met à nu les neutralisations, les évasions, les courts-circuits ; méthodique, puisquil les mesure, les nomme, les cartographie, et les expose à lépreuve. Ce nest quà cette double condition — fécondité analytique et opposabilité empirique — que le paradigme archicratique pourra prétendre à une légitimité scientifique, académique et politique.
## **1.3 —** Les axiomes régulateurs du paradigme archicratique
@@ -383,7 +396,7 @@ La construction conceptuelle que nous avons amorcée ne pourra véritablement ê
Ce que nous proposons ici nest donc pas une compilation de principes abstraits ou de normes morales : il sagit dune *charte de validité*. Les axiomes qui suivent assurent la cohérence interne de la proposition archicratique. Ils ne valent pas comme protocole dévaluation ni comme grille de classement. Ils orientent la lecture conceptuelle des cas, sans prétendre à une mesure. Ces axiomes ont principalement une triple fonction.
Dabord, ils stabilisent le cadre : ils garantissent que le paradigme archicratique ne dérive pas en inflation métaphorique, ni en concept de substitution. Ensuite, ils rendent le paradigme opératoire : en définissant les conditions de son application, ils permettent une lecture outillée et rigoureuse des régulations réelles. Enfin, ils lexposent à la critique : chacun de ces axiomes peut être discuté, révoqué, confronté, ce qui constitue lindice de leur légitimité et non de leur fragilité.
Dabord, ils stabilisent le cadre : ils garantissent que le paradigme archicratique ne dérive pas en inflation métaphorique, ni en concept de substitution. Ensuite, ils en rendent possible la mise en œuvre analytique : en définissant les conditions de son application, ils permettent une lecture outillée et rigoureuse des régulations réelles. Enfin, ils lexposent à la critique : chacun de ces axiomes peut être discuté, révoqué, confronté, ce qui constitue lindice de leur légitimité et non de leur fragilité.
Il faut ici rappeler les grandes exigences posées par les théoriciens de la science : Karl Popper (1934) insistait sur la falsifiabilité comme critère de démarcation entre science et idéologie ; Imre Lakatos (1978) montrait que tout programme de recherche scientifique devait contenir un noyau dur protégé par un ensemble de conditions négociables — cest-à-dire une structure qui permet à la fois la stabilité théorique et louverture à la révision. À leur suite, mais dans un champ spécifique — celui de la philosophie politique — nous affirmons quun paradigme doit se rendre intelligible par sa propre explicitation méthodique, sous peine de sombrer dans la circularité ou dans le fétichisme terminologique.
@@ -401,7 +414,9 @@ Ce premier axiome constitue le socle ontologique minimal du paradigme archicrati
Poser cet axiome, cest affirmer que ces trois dimensions — même lorsquelles sont invisibles, réduites, capturées ou en dormance — sont toujours présentes, repérables, détectables, au moins de façon latente ou implicite. Autrement dit, on ne peut pas penser une régulation sans ce tripode, même si celui-ci est déséquilibré, distordu ou saboté. Un dispositif qui naurait ni *arcalité* (aucun principe fondateur ou récit de justification), ni *cratialité* (aucune opération effective, aucun vecteur daction), ni *archicration* (aucun lieu ou possibilité de contestation ou de révision), ne serait pas un dispositif régulateur : ce serait un chaos, une contingence brute, un pur hasard ou un agrégat sans structure.
Ce que cet axiome implique immédiatement, cest un changement de regard épistémique. Il ne suffit pas de repérer les structures visibles du pouvoir (institutions, lois, autorités) : il faut traquer les trois prises constitutives dans tout agencement régulateur — y compris ceux qui prétendent ne pas être politiques, comme par exemple, les régulations algorithmiques, les logiques dattribution budgétaire, les procédures hospitalières, les normes de conformité technique. Même là, il y a fondement, opération, et possibilité de contestation — et, au pire, leur mise en invisibilité stratégique. De sorte que ce nest pas parce que l*arcalité* est devenue silencieuse (par exemple : une légitimation implicite par la science ou par la nécessité technique), ni parce que l*archicration* est éteinte (absence de scène de recours), que ces dimensions sont absentes : elles sont alors refoulées, verrouillées, court-circuitées — mais leur absence relative est elle-même un indice paradigmatique.
Ce que cet axiome implique immédiatement, cest un changement de regard épistémique. Il ne suffit pas de repérer les structures visibles du pouvoir (institutions, lois, autorités) : il faut traquer les trois prises constitutives dans tout agencement régulateur — y compris ceux qui prétendent ne pas être politiques, comme par exemple, les régulations algorithmiques, les logiques dattribution budgétaire, les procédures hospitalières, les normes de conformité technique. Même là, il y a fondement, opération, et possibilité de contestation — et, au pire, leur mise en invisibilité stratégique. De sorte que ce nest pas parce que l*arcalité* est devenue silencieuse (par exemple : une légitimation implicite par la science ou par la nécessité technique), ni parce que l*archicration* est neutralisée, verrouillée, relocalisée hors datteinte ou rendue pratiquement inopérante (absence de scène de recours), que ces dimensions sont absentes : elles sont alors refoulées, verrouillées, court-circuitées — mais leur absence relative est elle-même un indice paradigmatique.
Toute régulation effective comporte, en acte ou en puissance, une arcalité, une cratialité et une archicration ; les pathologies contemporaines nabolissent pas cette tripolarité, mais en opacifient les fondements, en autonomisent les opérations et en neutralisent, miment ou relocalisent la scène dépreuve, jusquà la dérive autarchicratique.
L*axiome de coprésence* a donc une valeur heuristique fondamentale. Il permet de penser les situations où une régulation semble purement technique ou exclusivement administrative (*cratialité*) comme étant toujours aussi fondée dans un imaginaire (*arcalité*) et exposée ou soustraite à une épreuve (*archicration*). Il impose ainsi une lecture structurale de tout dispositif, quil soit juridique, logistique, algorithmique, sanitaire, éducatif, écologique ou financier. Cest une invitation à lire dans la matière du monde les tripodes de la régulation.
@@ -477,7 +492,7 @@ Dans la section 1.4, nous déploierons une cartographie systémique de ces objet
Cet axiome tire toutes les conséquences analytiques et politiques de ce que nous avons établi comme architecture fondatrice du paradigme archicratique : la régulation politique ne repose pas sur un centre unique dautorité, ni sur une mécanique univoque dexécution, ni sur une utopie dialogique sans ancrage. Elle repose sur une tenue dynamique entre trois fonctions irréductibles : fonder, opérer, disputer.
Mais plus encore que leur distinction, cest leur non-substituabilité qui constitue le cœur de laxiome ici énoncé. Ce que nous affirmons, cest que chacun des trois pôles est nécessaire, mais aucun nest suffisant. Pris isolément, chacun génère une forme de déséquilibre radical, une défaillance politique, un court-circuit de la régulation. Le paradigme archicratique, dès lors, ne repose pas sur une addition bien plus sur une *disjonction fonctionnelle stricte* : les trois fonctions doivent être tenues ensemble, sans quaucune ne puisse se substituer aux deux autres.
Mais plus encore que leur distinction, cest leur non-substituabilité qui constitue le cœur de laxiome ici énoncé. Ce que nous affirmons, cest que chacun des trois pôles est nécessaire, mais aucun nest suffisant. Pris isolément, chacun génère une forme de déséquilibre radical, une défaillance politique, un court-circuit de la régulation. Le paradigme archicratique, dès lors, ne repose pas sur une simple addition, mais bien sur une disjonction fonctionnelle stricte : les trois fonctions doivent être tenues ensemble, sans quaucune ne puisse se substituer aux deux autres.
Ce principe a une portée théorique majeure. Il interdit toute régression vers une ontologie mono-polaire du politique. Il récuse les réductions trop souvent opérées dans lanalyse des dispositifs. Lorsque le politique est saisi uniquement comme fondement, valeur, idéal ou texte, la régulation devient pur symbolisme. Cest le règne du mythe ou du droit sans effets. Les chartes sont proclamées, mais rien ne les rend opératoires. La Constitution devient un fétiche ; la norme, un leurre. Cette sur-arcalisation engendre des régimes rhétoriques, où le fondement reste sans effet.
@@ -487,9 +502,9 @@ Autre réduction, lorsque tout est renvoyé à la dispute, à la consultation,
Lhistoire politique moderne offre de nombreux exemples de ces régimes déséquilibrés : républiques fondées sur des textes constitutionnels irréprochables, mais pratiquement inopérantes ; dictatures fonctionnelles et performantes bien que sans légitimité ni controverse possible ; démocraties dites « délibératives » paralysées par linflation des consultations sans pouvoir réel. Chaque fois quun pôle tend à se substituer aux deux autres, la régulation se dégrade — soit en simulacre, soit en oppression, soit en chaos.
Ce que la*xiome de disjonction fonctionnelle* impose, cest une lecture différentielle, exigeante, des configurations régulatrices. Il oblige à penser non seulement la présence des trois pôles, mais surtout leur non-confusion. Il nest pas rare, en effet, que des dispositifs affichent un fondement alors quil ne sagit que dun effet de langage cratial ; quils prétendent à la dispute alors quils ne permettent aucun recours réel ; quils opèrent à vide sans principe ni scène. L*archicratie* elle-même, dans ses formes les plus avancées, mime les trois pôles tout en les court-circuitant — comme le montrent certaines plateformes de participation citoyenne entièrement encadrées par des algorithmes de tri et deuphémisation, dites de modération.
Ce que laxiome de disjonction fonctionnelle impose, cest une lecture différentielle, exigeante, des configurations régulatrices. Il oblige à penser non seulement la présence des trois pôles, mais surtout leur non-confusion. Il nest pas rare, en effet, que des dispositifs affichent un fondement alors quil ne sagit que dun effet de langage cratial ; quils prétendent à la dispute alors quils ne permettent aucun recours réel ; quils opèrent à vide sans principe exposable ni scène praticable. Ce ne sont pas là des formes accomplies de larchicratie, mais des configurations autarchicratiques ou archicratistiques dans lesquelles les trois pôles sont mimés, exhibés ou stylisés tout en étant partiellement court-circuités — comme le montrent certaines plateformes de participation citoyenne entièrement encadrées par des algorithmes de tri, de hiérarchisation ou deuphémisation.
Autrement dit, ce que lon croit parfois être une régulation équilibrée peut en réalité relever dun effondrement fonctionnel déguisé, dune substitution abusive, dune délégation simulée. L*axiome de disjonction fonctionnelle* agit alors comme outil de discernement critique : il permet de tester si un dispositif tient ensemble les trois fonctions, ou sil glisse vers un monolithe politique — source de désajustement systémique.
Autrement dit, ce que lon croit parfois être une régulation équilibrée peut en réalité relever dun effondrement fonctionnel déguisé, dune substitution abusive, dune délégation simulée. Laxiome de disjonction fonctionnelle (1.3.4) vient ensuite avertir que leffacement, la neutralisation ou lhypertrophie dun seul pôle conduit nécessairement à une régulation pathologique. De sorte quun ordre privé de fondement exposable, de scène dépreuve praticable ou de capacité opératoire effective nest ni pleinement viable, ni légitime, ni habitable.
Mais cet axiome a aussi une portée épistémologique et méthodologique. Il oblige lanalyste à disjoindre ce que la régulation tend à confondre. Il impose de ne pas se satisfaire dun indicateur unique ou dune déclaration de principe. Il exige de chercher, pour chaque dispositif : *Quelle est la source réelle de larcalité invoquée ? Quelle est la structure effective de la cratialité mobilisée ? Quelle est la scène concrète darchicration instituée ?*
@@ -551,7 +566,7 @@ Cet axiome fonde également la dimension anti-dogmatique du paradigme archicrati
**Tout paradigme qui prétend décrire les régulations politiques doit rendre possible sa propre mise à lépreuve. Il doit produire des instruments de falsifiabilité, de critique interne et de différenciation analytique. Un paradigme non falsifiable est un dogme ; un cadre non différenciateur est un slogan.**
Une régulation nest réputée archicratique quà la condition dinstituer une scène contradictoire où les prétentions arcale et cratiale peuvent être opposées, arbitrées et révisées selon des procédures publiques et des indicateurs déclarés.
Une régulation nest réputée pleinement archicratique quà la condition de rendre possible une scène dépreuve où les prétentions arcale et cratiale puissent être opposées, arbitrées et révisées selon des formes de contestation effectives, lesquelles peuvent être publiques, instituées, rituelles, situées ou faiblement codifiées, pourvu quelles soient praticables, opposables et capables dinfléchir la gulation.
Il est une exigence trop oubliée des sciences sociales : un paradigme critique nest pas une grille qui se plaque partout, mais une matrice qui se teste, qui saffine, qui peut échouer. Toute proposition théorique sur le pouvoir, la régulation, lopposabilité doit se soumettre à une exigence que Karl Popper formulait dès 1934 : la condition de scientificité minimale dun énoncé est sa capacité à être réfuté. Autrement dit, un paradigme qui sapplique partout, tout le temps, sans jamais rencontrer de cas-limite, ne serait pas robuste : il serait vide.
@@ -573,7 +588,7 @@ Ce que cet axiome protège, en somme, cest la vitalité épistémique du para
**Un paradigme nest valable que sil résiste à lépreuve des régimes. Un outil danalyse nest robuste que sil traverse les configurations hétérogènes — monarchies, démocraties, technocraties, gouvernances hybrides — sans seffondrer dans la généralité vide ou la contradiction interne. Le paradigme archicratique doit démontrer sa capacité dopérabilité transversale : il doit sappliquer à la diversité des dispositifs politiques sans renoncer à sa grammaire.**
L*archicratie* nest pas une forme de régime politique — elle nest pas un type au sens de la typologie wébérienne (monarchie, démocratie, autoritarisme). Elle ne désigne ni une structure institutionnelle, ni une idéologie, ni une culture politique. Elle est une modalité de régulation, un style dagencement entre trois pôles — *arcalité, cratialité, archicration* — qui peut être observé à travers une variété de formes politiques. Ce que cet axiome affirme, cest que le paradigme archicratique doit pouvoir être mobilisé comme méta-régimes de régulation :
L*archicratie* nest pas une forme de régime politique — elle nest pas un type au sens de la typologie wébérienne (monarchie, démocratie, autoritarisme). Elle ne désigne ni une structure institutionnelle, ni une idéologie, ni une culture politique. Elle est une modalité de régulation, un style dagencement entre trois pôles — *arcalité, cratialité, archicration* — qui peut être observé à travers une variété de formes politiques. Ce que cet axiome affirme, cest que le paradigme archicratique doit pouvoir être mobilisé comme méta-régime de régulation :
- dans des régimes démocratiques libéraux (ex. UE, États-Unis) : où l*arcalité* est pluraliste, la *cratialité* technicisée, et l*archicration* souvent mimée ou saturée ;
@@ -614,7 +629,7 @@ L*axiome de coprésence* (1.3.1) rappelle que tout dispositif de régulation,
L*axiome de détectabilité* (1.3.3) pose que chaque pôle laisse des traces situées : visibles ou occultées, explicites ou latentes, mais toujours repérables dans des objets, des pratiques, des structures ou des langages. Cest cet ancrage dans des matérialités documentaires qui permet de différencier lanalyse archicratique de toute spéculation sans prise sur le réel.
L*axiome de disjonction fonctionnelle* (1.3.4) vient ensuite avertir que labsence ou lhypertrophie dun seul pôle conduit nécessairement à une régulation pathologique. De sorte quun ordre sans fondement, sans régulation ou sans opération nest ni viable, ni légitime, ni habitable.
Laxiome de disjonction fonctionnelle (1.3.4) vient ensuite avertir que la neutralisation, la mise en latence ou lhypertrophie dun seul pôle conduit nécessairement à une régulation pathologique. De sorte quun ordre privé de fondement exposable, de scène dépreuve praticable ou de capacité opératoire effective nest ni viable, ni légitime, ni habitable.
Les axiomes suivants assurent la robustesse transversale du paradigme. L*axiome de variabilité différentielle* (1.3.5) affirme que les formes prises par les trois pôles sont historiquement, culturellement, politiquement, technologiquement variables — sans que cela invalide leur structure minimale. L*axiome dincomplétude systémique* (1.3.6), quant à lui, soutient quaucune régulation nest jamais entièrement close sur elle-même : il y a toujours un reste, un vide, un point de fuite, une indétermination — condition de la critique comme de linvention.
@@ -626,7 +641,7 @@ Ces huit axiomes dessinent ensemble une épistémologie forte, souple, rigoureus
En cela, cette section sest attelée à instituer une discipline de pensée. Bien plus encore, une exigence de probité intellectuelle qui sera maintenue dans les sections suivantes : quil sagisse dexplorer la topologie interne/externe des pôles (section 1.4), de qualifier les formes dynamiques de tenues archicratiques (section 1.5), de présenter des repères de larchicratie (section 1.6), ou den cartographier les morphologies opérantes (sections 1.7), cest toujours à laune de ces axiomes que nos propositions devront être jugées.
Ce chapitre ne vise pas à fonder un dogme, mais à instituer un outil. Et tout outil digne de ce nom devait commencer par lexposé rigoureux de ses conditions de validité.
Ces huit axiomes fixent la discipline de pensée du paradigme archicratique. Cest à leur lumière quil faut désormais lire sa grammaire topologique, ses formes dynamiques, ses repères heuristiques et ses morphologies opérantes.
## **1.4 —** La grammaire topologique interne/externe de l*archicratie*
@@ -642,7 +657,7 @@ Pour comprendre cette architecture mouvante, nous devons prendre appui sur trois
À partir de cette triple assise théorique, nous pouvons affirmer que la grammaire topologique constitue le pivot méthodologique du paradigme archicratique. Elle permet danalyser chaque pôle de la régulation — *arcalité, cratialité, archicration* — comme une structure positionnelle, où linterne et lexterne ne sont pas des essences, mais des effets de configuration, des prises, des agencements différenciés. Une *arcalité* peut être interne lorsquelle émane du récit propre dune communauté politique, mais elle peut devenir externe si elle est dictée par des normes globales imposées. Une *cratialité* peut être locale et maîtrisée, mais aussi captée par des infrastructures techniques venues dailleurs. Une *archicration* peut se déployer dans une scène instituée par les acteurs concernés, ou leur être imposée depuis une juridiction externe, un tribunal arbitral, une plateforme darbitrage privée.
Cest cette plasticité topologique — cette capacité à circuler, à migrer, à se dissimuler — qui fait à la fois la richesse et la dangerosité des régimes archicratiques. Car une régulation peut fonctionner en mimant linterne tout en étant totalement dépendante dun externe invisible. Elle peut se présenter comme autonome, participative, située, alors quelle est en réalité structurée par des standards qui échappent à toute contestation locale. Le risque est alors celui de la dépolitisation radicale, dune perte de repères critiques, dune désorientation normative. Ce que la grammaire topologique rend possible, cest précisément de restaurer cette lisibilité perdue : de retrouver les fils, de remonter les chaînes, de cartographier les prises.
Cest cette plasticité topologique — cette capacité à circuler, à migrer, à se dissimuler — qui fait à la fois la richesse analytique du paradigme et la dangerosité de certaines configurations désarchicratiques ou autarchicratiques. Car une régulation peut fonctionner en mimant linterne tout en étant totalement dépendante dun externe invisible. Elle peut se présenter comme autonome, participative, située, alors quelle est en réalité structurée par des standards qui échappent à toute contestation locale. Le risque est alors celui de la dépolitisation radicale, dune perte de repères critiques, dune désorientation normative. Ce que la grammaire topologique rend possible, cest précisément de restaurer cette lisibilité perdue : retrouver les fils, remonter les chaînes, cartographier les prises.
Cest pourquoi, dans les sections qui suivent, nous déploierons une analyse détaillée de chacun des trois pôles — *arcalité, cratialité, archicration* — en les examinant à travers leurs configurations internes et externes. Nous montrerons comment ces modalités se combinent, se transforment, se superposent. Nous analyserons les effets de ces agencements sur la viabilité, la lisibilité et lopposabilité des dispositifs. Et nous préparerons ainsi le terrain pour une typologie opératoire des régimes de régulation — une typologie qui ne se contente pas de décrire, mais qui permet de diagnostiquer, de contester, de transformer.
@@ -716,15 +731,15 @@ En ce sens, lanalyse archicratique exige une vigilance accrue sur les conditi
Ainsi, linertie dune *arcalité externe* nest pas seulement un échec technique ou politique : cest le symptôme dune absence de portage humain effectif. À linverse, sa puissance régulatrice dépend de sa capacité à être habitée, interprétée, mobilisée, par des professionnels, des agents publics, des collectifs intermédiaires ou des figures institutionnelles. Il y a une condition anthropologique de l*arcalité* : sans corps vivant, pas de fondement durable.
Lorsque ces fondements exogènes sont naturalisés, dépolitisés, non contestables, ils deviennent des vecteurs privilégiés du régime archicratique : leur autorité prétendue neutre masque limpossibilité de les discuter, de les traduire, de les opposer. Ce nest pas leur contenu qui pose problème, mais leur mode dénonciation : sans scène de justification, sans délai, sans dispositif de médiation, ces *arcalités* deviennent des injonctions performatives opaques. Elles gouvernent sans débat, fondent sans sexposer, et neutralisent la discorde.
Lorsque ces fondements exogènes sont naturalisés, dépolitisés ou rendus difficilement contestables, ils deviennent des vecteurs privilégiés de dérives autarchicratiques ou archicratistiques : leur autorité prétendue neutre masque limpossibilité pratique de les discuter, de les traduire ou de les opposer. Ce nest pas leur contenu qui pose problème, mais leur mode dénonciation : lorsque la scène de justification est neutralisée, lorsque les délais de médiation sont comprimés ou rendus fictifs, lorsque les dispositifs de traduction deviennent inopérants, ces arcalités tendent à devenir des injonctions performatives opaques.
Cest pourquoi le paradigme archicratique impose une exigence méthodologique claire : documenter le statut, le portage, lactivation et la contestation des *arcalités externes*. *Qui les invoque ? Qui les traduit ? Qui les fait vivre ? Sont-elles révisables ? Opposables ? Intégrées dans une scène ou dissoutes dans le dogme ?* La critique archicratique ne vise pas à disqualifier lexterne, mais à rendre visibles ses conditions dincarnation.
Une *arcalité externe* bien internalisée, portée par une communauté compétente, disputée dans ses effets, rendue visible dans ses limites, peut renforcer un ordre démocratique. Mais une *arcalité* exogène désincarnée, mimée, figée, peut devenir le vecteur sourd dun pouvoir sans scène. Le facteur humain, ici encore, est la clef de l*arcalité vivante*.
Une *arcalité externe* bien internalisée, portée par une communauté compétente, disputée dans ses effets, rendue visible dans ses limites, peut renforcer un ordre démocratique. Mais une *arcalité* exogène désincarnée, mimée, figée, peut devenir le vecteur sourd dun pouvoir à scène neutralisée, relocalisée hors datteinte ou rendue pratiquement inopérante. Le facteur humain, ici encore, est la clef de l*arcalité vivante*.
### 1.4.3 — *Cratialités internes* : opérativité endogène, chaînes dexécution incarnées et pouvoir discret sans extériorité
La *cratialité interne* constitue lun des points névralgiques du paradigme archicratique. Elle ne se résume ni à laction technique, ni à la simple application de normes venues dailleurs. Elle désigne la capacité dun dispositif régulateur à produire lui-même, depuis lintérieur, sa propre puissance opératoire, sans recourir explicitement à une légitimation transcendante (*arcalité*) ni à une scène dépreuve (*archicration*). En ce sens, linterne nest pas un dedans organique, mais une position topologique de clôture opératoire : là où la régulation se suffit à elle-même, là où lordre dexécution simpose par la seule inertie du dispositif, là où le pouvoir se fait sans être dit.
La *cratialité interne* constitue lun des points névralgiques du paradigme archicratique. Elle ne se résume ni à laction technique, ni à la simple application de normes venues dailleurs. Elle désigne la capacité dun dispositif régulateur à produire lui-même, depuis lintérieur, sa propre puissance opératoire, sans mobiliser explicitement une légitimation transcendante, et avec une scène dépreuve devenue marginale, reléguée à larrière-plan ou pratiquement inopérante dans le cours ordinaire de lexécution. En ce sens, linterne nest pas un dedans organique, mais une position topologique de clôture opératoire : là où la régulation tend à se suffire à elle-même, là où lordre dexécution simpose par linertie du dispositif, et là où le pouvoir agit comme sil navait plus à se dire, à se justifier ni à se laisser reprendre.
Ce qui distingue fondamentalement la *cratialité interne*, cest son auto-suffisance apparente. Elle repose sur la densité cumulative des routines, des instruments, des protocoles, des langages, des procédures et — ce qui est décisif — des humains qui les activent, les maintiennent, les modulent. Car la *cratialité interne* nest jamais une abstraction systémique désincarnée. Elle est portée par des agents, des métiers, des savoir-faire, qui donnent forme, corps et continuité à laction régulatrice. Elle est faite de mains, de gestes, de réflexes, de scripts mentaux, de hiérarchies tacites, de cultures professionnelles. Elle nest pas simplement un logiciel ou un organigramme : elle est le produit vivant de celles et ceux qui opèrent.
@@ -744,7 +759,7 @@ Il convient alors de distinguer plusieurs formes typologiques de *cratialité in
- *Langagières et discursives* : ici, le pouvoir tient au langage : aux jargons techniques, aux syntaxes normalisées, aux grilles dexpression. Il est détenu par ceux qui maîtrisent le langage de linstitution — rédacteurs administratifs, formateurs, communicants, traducteurs techniques, qui donnent forme intelligible à la régulation.
Ce qui fait la puissance silencieuse de cette *cratialité interne*, cest quelle ne demande pas à être légitimée. Elle ne requiert ni fondement transcendant (*arcalité*), ni mise en épreuve contradictoire (*archicration*). Elle opère par inertie, par habitude, par flux. Tout y est déjà cadré, validé, formaté. La régulation se fait delle-même — non parce quelle est juste, mais parce quelle est possible, rapide, fluide.
Ce qui fait la puissance silencieuse de cette cratialité interne, cest quelle peut fonctionner comme si elle navait plus à répondre explicitement de ses justifications, et comme si la scène dépreuve navait plus de prise effective sur son cours ordinaire ; cest le cas des algorithmes non documentés et des procédures automatiques rendues pratiquement inopposables. Tout y est déjà cadré, validé, formaté. La régulation se fait delle-même — non parce quelle serait absolument sans arcalité ni sans archicration, mais parce que celles-ci deviennent peu exposables, reléguées à larrière-plan, ou pratiquement inopérantes dans le cours ordinaire de lexécution.
Mais cest précisément cette fluidité sans extériorité qui peut poser problème. Car elle rend toute remise en cause difficile. Il ny a pas de scène où sadresser, pas de personne clairement responsable, pas de temporalité pour lamendement. Ce nest pas lillégalité qui menace ici, mais la fermeture autoréférentielle : le dispositif fonctionne, donc il est. Le pouvoir sexécute, donc il na pas besoin de sexpliquer.
@@ -836,7 +851,7 @@ Cest ici que le paradigme archicratique prend toute sa valeur : il rend lisib
Autrement dit, l*archicration interne* est ce qui maintient le pouvoir habitable, parce quelle le rend réversible, explicable, explicite et amendable. Elle ne garantit pas la vérité, ni la justice — elle garantit la possibilité dun autrement.
Mais lorsquelle se dissout dans linaction, lorsquelle est mise en scène sans effets, ou déportée vers des figures incapables dassumer lépreuve de la contestation, elle devient un artefact démocratique, un simulacre de dispute, une mise en forme de lillusion délibérative. Cest là que l*archicratie* sinstalle : non comme domination explicite, mais comme court-circuit silencieux de la possibilité de reprise.
Mais lorsquelle se dissout dans linaction, lorsquelle est mise en scène sans effets, ou déportée vers des figures incapables dassumer lépreuve de la contestation, elle devient un artefact démocratique, un simulacre de dispute, une mise en forme de lillusion délibérative. Cest là que sinstalle non larchicratie, mais son envers : une désarchicration susceptible de dériver vers lautarchicratie, cest-à-dire un court-circuit silencieux de la possibilité de reprise.
### 1.4.6 — *Archicrations externes* : scènes surplombantes, interpellations dissidentes et figures de contre-institution
@@ -898,7 +913,7 @@ Cest aussi, plus tragiquement, le lieu où se manifeste leffondrement des
Si lon a distingué, jusquici, les prises internes et externes pour chacun des trois pôles du paradigme archicratique — *arcalité, cratialité, archicration* —, cette cartographie ne saurait être figée. Car les dispositifs régulateurs réels ne sont pas des blocs isolés ; ce sont des ensembles dynamiques, traversés par des circulations, des transferts, des reconfigurations. Autrement dit, linterne et lexterne sont des positions politiques et stratégiques, dont les objets, les fonctions, les signes et les effets peuvent migrer, se dissimuler ou se renverser.
Cest précisément dans cette dynamique migratoire que se déploie toute la plasticité — mais aussi toute lambiguïté — des régulations contemporaines. L*archicratie* ne se limite pas à une absence de scène ou à une saturation cratiale ; elle procède souvent par reconfiguration des prises : ce qui était externe devient interne (capture), ce qui était interne devient externe (délestage), et ce qui devrait être visible est rendu opaque par changement de topologie. Ainsi, la logique archicratique se manifeste autant par ce qui est dit que par lendroit doù cela est dit, tout autant par ce qui est fait que par lendroit doù cela est imposé.
Cest précisément dans cette dynamique migratoire que se déploie toute la plasticité — mais aussi toute lambiguïté — des régulations contemporaines. Les dérives autarchicratiques ne se réduisent pas à une simple absence de scène ou à une saturation cratiale ; elles procèdent souvent par reconfiguration des prises : ce qui était externe devient interne (capture), ce qui était interne devient externe (délestage), et ce qui devrait être visible est rendu opaque par changement de topologie. Ainsi, la dérive autarchicratique se manifeste autant par ce qui est dit que par lendroit doù cela est dit, tout autant par ce qui est fait que par lendroit doù cela est imposé.
#### ***Migrations arcales* : du mythe incorporé au fondement importé**
@@ -954,7 +969,7 @@ Lexcès dinternalité produit des régulations opaques, fermées, surcodé
Mais cest précisément entre ces deux pôles extrêmes que se noue la possibilité dun dispositif politiquement viable : cest-à-dire ni totalement clos, ni intégralement hétéronome, mais articulé dans une dialectique régulée entre interne et externe. Cette *co-viabilité* repose sur la capacité du dispositif à *maintenir une tension active entre ses composantes*, à autoriser la critique venue de lextérieur sans se dissoudre dans une dépendance pure, et à mobiliser des justifications internes sans basculer dans lauto-légitimation close.
Cette tension est particulièrement cruciale dans les formes de régulation dites « silencieuses » — cest-à-dire sans théâtre, sans acteurs identifiables, sans justification publique explicite. Là où linterne lemporte, le risque est celui dune saturation normative : plus rien ne peut venir troubler le cycle opératoire du dispositif. Là où lexterne lemporte, cest lévaporation du sens qui guette : plus rien ne fonde localement la régulation, plus rien ne la rend habitable.
Cette tension est particulièrement cruciale dans les formes de régulation dites « silencieuses » — cest-à-dire à théâtre affaibli ou neutralisé, à acteurs difficilement identifiables, et à justification publique faiblement exposable. Là où linterne lemporte, le risque est celui dune saturation normative : plus rien ne peut venir troubler le cycle opératoire du dispositif. Là où lexterne lemporte, cest lévaporation du sens qui guette : plus rien ne fonde localement la régulation, plus rien ne la rend habitable.
Le paradigme archicratique na pas pour vocation de désigner un juste milieu abstrait entre ces deux extrêmes, mais de fournir les instruments critiques pour repérer les points de bascule, les seuils de rupture, les zones où la régulation cesse dêtre lieu de confrontation parce que ses prises deviennent illisibles. Ces seuils de *co-viabilité* doivent être pensés à partir de critères politiques précis : *existe-t-il un différé ? Un recours ? Une scène ? Une instance dinterpellation ? Une capacité damendement ?* Ces questions ne sont pas secondaires : elles sont les conditions minimales de soutenabilité dun ordre régulateur dans une société qui se dit démocratique.
@@ -1002,25 +1017,27 @@ Cest dans ces configurations que lanalyse archicratique prend tout son sen
En somme, penser la *co-viabilité* dun dispositif régulateur, cest penser sa tenue dans le différé, son ouverture à lextériorité, sa capacité de reconfiguration, sans perdre son ancrage ni dissoudre sa légitimité. Ce nest ni un équilibre idéal, ni une norme absolue : cest une exigence politique minimale. Et cest à cette exigence que répond, dans sa vocation critique, le paradigme archicratique.
## **1.5 — Formes dynamiques de tenues archicratiques**
## **1.5 — Formes dynamiques de la tenue archicratique**
Penser un paradigme relationnel, cest refuser de figer les configurations dans des états fixes, des catégories stables ou des oppositions binaires. Le paradigme archicratique ne cherche pas à déterminer si un système est équilibré ou déréglé, mais à analyser comment il tient, par quelles prises, dans quelle configuration de relations entre *arcalité, cratialité et archicration*, et surtout, jusquoù cette tenue est vivable, soutenable, opposable. La régulation nest pas un état ; cest une forme — toujours en tension, toujours en transformation.
Ce que nous proposons dans cette section, cest une typologie des formes de tenue archicratique — autrement dit, une modélisation des manières dont les trois pôles du paradigme sarticulent ou se désarticulent dans les dispositifs réels. Car toute régulation effective engage nécessairement ces trois dimensions, mais elle le fait selon des équilibres hétérogènes, des désajustements partiels, des déséquilibres provisoirement tenus, des saturations masquées ou des ajustements régénérants.
Nous nommerons ici forme de tenue archicratique toute configuration empirique ou modélisable dans laquelle les trois pôles sont en relation active, selon des degrés de présence, darticulation, de visibilité et deffectivité différenciés. Certaines formes permettent la viabilité démocratique du dispositif — nous les qualifierons de *synchrotopiques* : elles maintiennent la tension entre les pôles dans un espace de co-viabilité. Dautres sont marquées par lhypertrophie dun pôle, leffacement dun autre, ou la déconnexion entre niveaux — elles conduisent à des formes dites *hypertopiques* ou *entropiques*. Enfin, certaines configurations ne relèvent daucune pathologie manifeste, mais laissent émerger des signes cliniques faibles de désarticulation : perte de scène, opacité opérative, ritualisation creuse des fondements, etc.
Nous nommerons ici forme de tenue archicratique toute configuration empirique ou modélisable dans laquelle les trois pôles sont en relation active, selon des degrés de présence, darticulation, de visibilité et deffectivité différenciés. Certaines formes permettent la viabilité démocratique du dispositif — nous les qualifierons de *synchrotopiques* : elles maintiennent la tension entre les pôles dans un espace de co-viabilité. Dautres sont marquées par lhypertrophie dun pôle, leffacement dun autre, ou la déconnexion entre niveaux — elles conduisent à des formes dites hypertopiques, hypotopiques ou atopiques. Enfin, certaines configurations ne relèvent daucune pathologie manifeste, mais laissent émerger des signes cliniques faibles de désarticulation : perte de scène, opacité opérative, ritualisation creuse des fondements, etc.
Ces formes de tenues ne valent ni comme jugement moral, ni comme idéal-type figé. Elles doivent être comprises comme des formes observables et évolutives. Elles ne sont pas des essences, mais des positions dans un espace de viabilité régulatoire. Et leur analyse permet, dans chaque cas empirique, de répondre à la question fondamentale : *quest-ce qui tient ici ? Comment ? À quel prix ? Et pour combien de temps ?*
Ces configurations de tenue ne valent ni comme jugement moral, ni comme idéal-type figé. Elles doivent être comprises comme des formes observables et évolutives. Elles ne sont pas des essences, mais des positions dans un espace de viabilité régulatoire. Et leur analyse permet, dans chaque cas empirique, de répondre à la question fondamentale : *quest-ce qui tient ici ? Comment ? À quel prix ? Et pour combien de temps ?*
Il ne sagit donc pas de réhabiliter une typologie figée (équilibré vs déséquilibré), ni de fantasmer un modèle harmonieux. Il sagit de fournir une cartographie critique, ancrée, falsifiable, capable de guider lanalyse empirique des dispositifs de régulation contemporaine, sans céder à labstraction ni au moralisme.
Il ne sagit donc pas de réhabiliter une typologie figée (équilibré vs déséquilibré), ni de fantasmer un modèle harmonieux.
Dans les sous-sections qui suivent, nous distinguerons trois grandes formes dynamiques de tenue archicratique :
Dans les sous-sections qui suivent, nous distinguerons quatre grandes formes dynamiques de tenue archicratique :
1. La *forme synchrotopique* : tension vivable, différenciation claire des pôles, articulation régulée — une régulation habitable.
La forme *synchrotopique* : tension vivable, différenciation claire des pôles, articulation régulée — une régulation habitable.
2. La *forme hypertopique* : domination dun pôle archicratique, avec effets de blocage, dasymétrie ou de dévitalisation.
La forme *hypertopique* : domination dun pôle archicratique, avec effets de blocage, dasymétrie ou de dévitalisation.
3. La *forme entropique* : perte de liaison, saturation, effondrement de la dispute, invisibilisation des fondements, opacité des instruments.
La forme *hypotopique* : effacements, désaffiliations, mises en latence ou désarrimages des prises régulatrices.
La forme *atopique* : mimétisme des pôles, vacuité des prises, spectralisation de la régulation.
Chacune de ces formes sera décrite avec ses critères de reconnaissance, ses symptômes internes, ses objets dépreuve et ses points de bascule potentiels.
@@ -1084,15 +1101,15 @@ En cela, les *formes hypertopiques* nous enseignent ce que devient une régulati
Il est des régulations dont la fragilité réside dans le défaut même darticulation, dans la carence silencieuse dun ou plusieurs pôles, non pas dominance mais par manquements, effacements, indéterminations. Ces régimes ne sont pas saturés — ils sont désarrimés, désaffiliés, incomplètement ancrés. Ce sont les *formes hypotopiques* : configurations où la triade archicratique ne parvient pas à sincarner pleinement, soit par inachèvement historique, soit par délitement structurel, soit par marginalisation sociale. Non point des régimes de déséquilibre manifeste — mais de décrochements latents.
Dans ces situations, ce nest pas la force excessive dun pôle qui domine, mais leffacement progressif ou brutal de lun de ses vecteurs constitutifs. Cela peut être larcalité qui fait défaut, lorsquune régulation se poursuit sans fondement explicite, sans justification reconnue, sans principe commun. Cela peut être la *cratialité* qui seffondre, lorsque les moyens dopération sont absents, disjoints ou dysfonctionnels. Cela peut être l*archicration* qui se dissout, lorsque plus aucune scène ne permet lexpression du différend, la mise en tension, la confrontation réglée.
Dans ces situations, ce nest pas la force excessive dun pôle qui domine, mais leffacement progressif ou brutal de lun de ses vecteurs constitutifs. Cela peut être larcalité qui fait défaut, lorsquune régulation se poursuit sous des fondements implicites, peu exposables ou dépourvus de justification reconnue. Cela peut être la cratialité qui seffondre, lorsque les moyens dopération sont absents, disjoints ou dysfonctionnels. Cela peut être larchicration qui se dissout, lorsquaucune scène effective ne permet plus lexpression du différend, la mise en tension ou la confrontation réglée.
Un exemple manifeste d*hypoarcalité* se retrouve dans les dispositifs provisoires ou de crise, où laction publique se déploie sans fondement explicite, dans une zone grise entre droit et exception. Létat durgence sanitaire prolongé, la gestion dérogatoire des flux migratoires ou encore les expérimentations territoriales non encadrées sont autant de cas où la *cratialité* et parfois l*archicration* existent, mais où l*arcalité* est suspendu, implicite ou réduit à un vague impératif de « nécessité ». Dans ces cas, la légitimité régulatrice sefface, non pas par volonté autoritaire, mais par inachèvement ou déni de sa propre condition normative. Le pouvoir continue dagir, mais sans adossement symbolique, éthique ou juridique pleinement assumé.
Un exemple manifeste d*hypoarcalité* se retrouve dans les dispositifs provisoires ou de crise, où laction publique se déploie sur fondement implicite, suspendu ou faiblement exposable, dans une zone grise entre droit et exception. Létat durgence sanitaire prolongé, la gestion dérogatoire des flux migratoires ou encore les expérimentations territoriales non encadrées sont autant de cas où la *cratialité* et parfois l*archicration* existent, mais où l*arcalité* est suspendu, implicite ou réduit à un vague impératif de « nécessité ». Dans ces cas, la légitimité régulatrice sefface, non pas par volonté autoritaire, mais par inachèvement ou déni de sa propre condition normative. Le pouvoir continue dagir, mais sur un adossement symbolique, éthique ou juridique faiblement assumé, peu explicité ou difficilement opposable.
À linverse, certaines configurations présentent une *hypocratialité* : les intentions sont fortes, les textes abondants, les dispositifs délibératifs multiples — mais lopérativité est absente ou déficiente. Ce sont les dispositifs de « papier », sur-institutionnalisés et sous-dotés, où les *arcalités* sont proclamées, les *archicrations* ouvertes, mais rien ne se passe. Les plans de transition écologique sans moyens, les comités citoyens sans budget, les programmes dinclusion numérique sans matériel sont des formes classiques de cette dérive. Le geste politique est performé, mais peu outillé. Laction régulatrice meurt dépuisement, faute dinfrastructure ou de continuité dexécution. Le pôle cratial se délite, et avec lui, la consistance de tout lédifice.
Il existe enfin des *régimes hypoarchicratifs*, dans lesquels les tensions sont étouffées, non par répression ou simulation, mais par désertion. Les scènes de dispute séteignent non faute dautorisation, mais faute de participants, faute de prise, faute dappel possible. La démocratie locale peut en être le symptôme : dans certains conseils municipaux ruraux, toutes les délibérations sont publiques, les procès-verbaux accessibles, les voies de recours en théorie ouvertes — mais personne ny vient, personne ne les utilise. Lespace de la critique devient désert, non pas parce quon lempêche, mais parce quil na plus deffet. On ne conteste plus ce que lon ne croit plus modifiable. Lusure de la dispute devient une forme dabstention persistante.
Ces *régulations hypotopiques* sont redoutables précisément parce quelles ne suscitent pas dalarme immédiate. Elles nont ni léclat tyrannique des régimes autoritaires, ni le chaos visible des formes délibératives défaillantes. Elles perdurent, parfois longtemps, dans une grande stabilité apparente, faute de tension, de friction, de dispute. Mais cest une stabilité vide, une paix sans enjeu, un ordre sans scène.
Ces *régulations hypotopiques* sont redoutables précisément parce quelles ne suscitent pas dalarme immédiate. Elles nont ni léclat tyrannique des régimes autoritaires, ni le chaos visible des formes délibératives défaillantes. Elles perdurent, parfois longtemps, dans une grande stabilité apparente, faute de tension, de friction, de dispute. Mais cest une stabilité vide, une paix sans enjeu, un ordre à scène désertée, neutralisée ou pratiquement inopérante.
Le paradigme archicratique nous invite ici à une vigilance particulière : il ne suffit pas de vérifier la présence formelle des trois pôles. Il faut en interroger leffectivité, la consistance, la vitalité, dans la durée et dans la conflictualité. Une *arcalité* proclamée mais jamais invoquée est un décor. Une *cratialité* active mais sans prise humaine est un automatisme. Une *archicration* ouverte mais inopérante est une illusion procédurale. Ce qui fait régulation nest pas lénumération des fonctions, mais leur co-présence dynamique, différenciée, habitée.
@@ -1100,9 +1117,11 @@ Les *formes hypotopiques* sont les signes dune dérégulation par effacement,
### 1.5.4 — *Formes atopiques* : déréalisations, vacuités et simulacres
Il est des dispositifs de régulation où les formes sont présentes, les fonctions identifiables, les terminologies stabilisées — mais où la consistance topologique fait défaut. Ni déséquilibre (hypertopie), ni carence (hypotopie), ni tension co-viable (synchrotopie), ces configurations appartiennent à un tout autre régime : celui de l*irréalité régulatrice*. La structure semble intacte, parfois même sophistiquée, mais aucun des pôles archicratiques nest substantiellement ancré, ni dans la scène, ni dans les corps, ni dans les pratiques. Ce sont des *formes atopiques* — cest-à-dire des régulations sans lieu, sans effectivité, sans consistance — qui simulent lexistence dun ordre tout en ne le rendant ni habitable, ni contestable, ni opératoire.
Il est des dispositifs de régulation où les formes sont présentes, les fonctions identifiables, les terminologies stabilisées — mais où la consistance topologique fait défaut. Ni déséquilibre (hypertopie), ni carence (hypotopie), ni tension co-viable (synchrotopie), ces configurations appartiennent à un autre régime : celui de lirréalité régulatrice. La structure semble intacte, parfois même sophistiquée, mais les pôles archicratiques ny trouvent plus quun ancrage vidé, mimé, stylisé ou rendu artefact, sans consistance vivante ni effectivité praticable. Larcalité y est mimée plutôt quexposée, la cratialité y est stylisée plutôt que véritablement rendue opérante, larchicration y est figurée plutôt quinstituée comme scène de reprise. Nous navons plus affaire à une régulation tenue, mais à une scénographie vide de la régulation.
L*atopie* nest pas labsence pure et simple. Elle est une présence vide, une figuration institutionnelle déconnectée de tout processus régulateur vivant. Elle repose souvent sur des artefacts de légitimation, des outils de pilotage automatisés, des consultations protocolaires — mais dont limpact sur le réel est nul ou illisible. Tout y est là, en apparence : des fondements (arcalité), des instruments (cratialité), des scènes de discussion (archicration) — mais sans prise, sans contrepartie, sans transformation. Linfrastructure normative est creuse, le pilotage est aveugle, la dispute est factice. On y maintient les gestes, les rites, les discours — mais sans monde.
L*atopie* nest pas labsence pure et simple. Elle est une présence vide, une figuration institutionnelle déconnectée de tout processus régulateur vivant. Elle repose souvent sur des artefacts de légitimation, des outils de pilotage automatisés, des consultations protocolaires — mais dont limpact sur le réel est nul ou illisible. Tout y est en apparence : des fondements, des instruments, des scènes de discussion — mais sous des formes vidées de prise, privées de contrepartie effective et incapables de transformation réelle. Linfrastructure normative est creuse, le pilotage est aveugle, la dispute est factice. On y maintient les gestes, les rites, les discours — mais sans prise vivante sur le monde quils prétendent réguler.
Latopie ne décrit donc pas une régulation effective amputée de ses pôles, mais un simulacre régulatif dans lequel les prises ne subsistent plus quà létat mimé, vidé ou rendu artefact.
Cette atopie peut se manifester selon plusieurs figures typiques.
@@ -1124,7 +1143,7 @@ Enfin, latopie peut prendre la forme dun usage symbolique, rhétorique ou
Ce que révèle lanalyse archicratique, cest que la vacuité ne soppose pas frontalement au pouvoir : elle peut en être la forme la plus stable. Le simulacre est parfois plus durable que lautoritarisme, car moins repérable, moins conflictuel, plus fluide. Une démocratie peut périr dans latopie sans jamais suspendre le droit de vote. Une administration peut devenir autistique sans jamais violer la procédure. Un dispositif de participation peut être déserté par saturation symbolique, non par coercition.
L*atopie* est donc le point aveugle de la critique classique. Elle ne se manifeste pas par lexcès de pouvoir, ni par son absence, mais par sa *simulation creuse*. Elle est ce moment où les fonctions sont remplies, mais où aucune scène nest réellement investie, aucun lien nest réellement actif, aucun différé nest institué.
L*atopie* est donc le point aveugle de la critique classique. Elle ne se manifeste pas par lexcès de pouvoir, ni par son absence, mais par sa *simulation creuse*. Elle est ce moment où les fonctions sont remplies, mais où les scènes ne sont plus réellement investies, où les liens deviennent inactifs ou purement formels, et où le différé nest plus institué comme prise effective de reprise, mais seulement figuré ou neutralisé.
### Cartographier la tenue régulatrice : vers une pragmatique des formes archicratiques
@@ -1134,9 +1153,9 @@ Nous avons désigné par *forme synchrotopique* la configuration rare bien que d
Les *formes hypertopiques*, quant à elles, rendent visible la plasticité parfois toxique du paradigme : lorsque lun ou deux des pôles submergent les autres, soit par hégémonie fondatrice (*hyperarcalité*), soit par captation instrumentale (*hypercratialité*), soit par saturation participative (archicration sans opérativité), la régulation se bloque, sétiole ou se pervertit. Les dérives y sont patentes, mais leur diagnostic exige plus que des jugements de valeur : il réclame une lecture structurelle, patiente, stratifiée.
Avec les *formes hypotopiques*, le paradigme archicratique affronte une tout autre pathologie : celle de leffacement, du désarrimage, de la déprise. Il ne sagit plus ici dexcès, mais de manque : manque de justification, deffectuation, de dispute. Ce nest plus la sur-présence dun pôle qui menace, mais labsence réelle ou feinte de tout principe actif de régulation. Ce sont des régulations en dormance, en rétraction, ou en dissociation.
Avec les *formes hypotopiques*, le paradigme archicratique affronte une tout autre pathologie : celle de leffacement, du désarrimage, de la déprise. Il ne sagit plus ici dexcès, mais de manque : manque de justification, deffectuation, de dispute. Ce nest plus la sur-présence dun pôle qui menace, mais leffacement, la mise en dormance ou la désactivation apparente des principes actifs de régulation.
Enfin, les *formes atopiques* révèlent la possibilité la plus troublante, et sans doute la plus contemporaine : celle de gulations sans réalité, où les pôles sont mimés, stylisés, formalisés mais sans consistance, sans scène, sans prise. Ce ne sont plus des déséquilibres, mais des simulacres. Non plus des régimes problématiques, mais des dispositifs qui tiennent sans fonder, sans opérer, sans disputer. Ce sont les formes vides du pouvoir sans régulation véritable — celles qui appellent une reconstitution critique urgente du politique.
Enfin, les formes atopiques révèlent la possibilité la plus troublante, et sans doute la plus contemporaine : celle de configurations où les pôles sont stylisés et formalisés, mais avec des prises mimées, vidées, à ancrage vivant introuvable, à scène devenue impraticable, et à effectivité régulatrice non soutenable. Ils ne “tiennent” pas au sens fort dune régulation viable ; ils se maintiennent comme artefacts, comme figures creuses, comme apparences dordre. Ce sont les formes vides du pouvoir sans régulation habitable — celles qui appellent une reconstitution critique urgente du politique.
Ce qui se donne à voir, à travers cette cartographie dynamique des tenues régulatrices, cest donc une topologie active du paradigme archicratique : un modèle théorique qui permet de penser non seulement les composants, mais leur manière dapparaître, de sordonner, de se désordonner, de se figer, de se dissoudre. Il sagit dun dispositif critique, qui articule diagnostic, description et problématisation, en donnant au lecteur — et plus encore, au chercheur, au praticien, au citoyen — des outils de repérage, de discernement, daction.
@@ -1148,8 +1167,8 @@ Cette section 1.5 constitue ainsi un tournant dans notre essai-thèse. Car elle
|:--:|:--:|:--:|:--:|:--:|:--:|:--:|
| **Synchrotopique** | Trois pôles présents, différenciés, articulés | Équilibre différé et co-tendu | Régulation habitée, amendable, soutenable | — (forme idéale) | Maximal : habitable, critique, stable | Capacité de ralentir, dajuster, de contester |
| **Hypertopique** | Un ou deux pôles hégémoniques (ex. arcalité absolue ou cratialité saturante) | Tension écrasée, figée ou court-circuitée | Régulation asymétrique, autoréférente ou verrouillée | Sur-arcalisation, technogestion, théâtralisation participative | Moyen à faible, selon la plasticité restante | Blocage dun pôle, exclusion dun autre, saturation opératoire |
| **Hypotopique** | Un ou plusieurs pôles effacés, désaffiliés ou en veille | Tension suspendue, inopérante | Régulation dévitalisée, bancale ou inerte | Disparition des fondements, perte defficacité, vide contestataire | Faible, sauf réactivation coordonnée | Absence de scènes, silence des agents, désancrage narratif |
| **Atopique** | Trois pôles présents mais sans ancrage réel | Tension fantomatique ou mimée | Régulation spectrale, simulée ou décorative | Déréalisation, fétichisation, vacuité procédurale | Nul à toxique : simulacre paralysant | Aucun effet de scène, aucune reprise, vacuité masquée par la forme |
| **Hypotopique** | Un ou plusieurs pôles effacés, désaffiliés ou en veille | Tension suspendue, inopérante | Régulation dévitalisée, bancale ou inerte | Effacement, mise en latence ou faible exposition des fondements ; perte defficacité ; dévitalisation contestataire | Faible, sauf réactivation coordonnée | Scènes désertées, neutralisées ou pratiquement inopérantes ; silence des agents ; désancrage narratif |
| **Atopique** | Trois pôles mimés, stylisés ou artefactuels, sans ancrage vivant soutenable | Tension fantomatique ou mimée | Régulation spectrale, simulée ou décorative | Déréalisation, fétichisation, vacuité procédurale | Nul à toxique : simulacre paralysant | Scène figurée sans prise, reprise neutralisée, vacuité masquée par la forme |
Chaque ligne de ce tableau constitue un cadre analytique complet : il peut être utilisé comme outil de diagnostic dans les chapitres suivants, pour évaluer des dispositifs empiriques sectoriels, repérer des évolutions topologiques, ou cartographier des formes de capture et de libération régulatrice.
@@ -1201,7 +1220,7 @@ En somme, la détectabilité est ici un geste critique et herméneutique : recon
L*archicratie*, destinée à saisir autrement les modalités différenciées, évolutives et souvent opaques de la régulation dans les sociétés humaines, nentend pas livrer ici un instrument de mesure, mais proposer une grammaire de discernement — ancrée dans la triade *arcalitécratialitéarchicration* — pour éclairer de réelles situations situées. Lambition est heuristique : offrir des points dancrage et de repérage capables de décrire, de discriminer et de problématiser, sans sacrifier la pluralité des expériences ni la conflictualité inhérente à toute *co-viabilité*.
Nous vivons un moment où l« opérativité » est souvent dévoyée par la prolifération de mesures pseudo-scientifiques érigées en dispositifs de vérité sans scène : tableaux de bord, indicateurs de performance, grilles dévaluation, algorithmes prédictifs et plateformes de pilotage normant laction en amont et rétrécissant les marges du possible en aval. Sous prétexte de rationalisation, sétend une régulation sans scène : sans explicitation des sources, sans exposition des mécanismes, sans différé dinterprétation. La mesure devient sa propre justification, neutralisant le conflit constitutif du social et sapant les conditions dune *archicration* effective.
Nous vivons un moment où lopérativité est fréquemment dévoyée par la prolifération de mesures pseudo-scientifiques élevées au rang de dispositifs de vérité à scène neutralisée, comprimée ou relocalisée hors datteinte. Tableaux de bord, indicateurs de performance, grilles dévaluation, algorithmes prédictifs et plateformes de pilotage étendent ainsi une régulation dont la scène dépreuve se trouve neutralisée : les sources demeurent insuffisamment explicitées, les mécanismes ne sont pas pratiquement exposables, et le différé interprétatif devient fictif ou inopérant. Sous prétexte de rationalisation, ces dispositifs normaient laction en amont et resserrent en aval les marges du possible. La mesure tend alors à se faire sa propre justification, neutralisant le conflit constitutif du social et minant les conditions mêmes dune archicration effective.
Face à cette saturation instrumentale, la tâche du paradigme archicratique est plus modeste et plus exigeante : non pas proposer un outil de pilotage alternatif, ni concurrencer les instruments existants sur leur terrain, mais offrir des repères heuristiques pour identifier des formes différenciées de légitimation, dopération et de contestation dans des contextes socio-politiques, historiques et institutionnels situés. Ces repères ne visent ni universalité formelle ni exclusivité, mais pertinence contextualisée. Ils se proposent comme scène dinterprétation ouverte, susceptible dêtre discutée et ajustée par les acteurs. Ils forment une matrice de discernement, non un schéma dapplication.
Nota bene : la conversion de ces repères en protocoles dévaluation relève dun programme ultérieur, non traité dans louvrage.
@@ -1220,7 +1239,7 @@ Prenons un service public numérisé où les usagers passent par un portail en l
Enfin, l*archicration* constitue le point névralgique de la lecture archicratique. Elle ne se réduit ni au droit au recours formel ni à une contradiction abstraite : elle désigne la scène instituée, différée, située, où le pouvoir se laisse interroger, où la décision devient amendable, où le fondement redevient discours. Instance juridictionnelle, médiation, espace de débat, conseil pluraliste, rituel, forum numérique, procédure contradictoire, délai suspensif : la forme importe moins que la possibilité effective pour les agents affectés de faire entendre leur voix, demander des comptes, suspendre, raconter une autre version, transformer le dispositif en scène contradictoire.
Une régulation sans *archicration* est une régulation sans visage. Une décision sans différé est une décision sans interlocuteur. Là où le contradictoire disparaît, vacille non seulement la démocratie, mais la capacité dune société à se représenter comme traversée de conflits et de désaccords potentiellement féconds. La lecture archicratique consiste à repérer, dans chaque dispositif, les conditions minimales dune telle scène, à diagnostiquer les formes de son effacement et à préfigurer les moyens de sa réapparition. L*archicration* nest pas un luxe : cest la condition de possibilité de toute régulation viable.
Une régulation privée darchicration effective est une régulation sans visage. Une décision sans différé praticable est une décision sans interlocuteur. Là où le contradictoire disparaît ou devient inopérant, vacille non seulement la démocratie, mais la capacité dune société à se représenter comme traversée de conflits et de désaccords potentiellement féconds. La lecture archicratique consiste à repérer, dans chaque dispositif, les conditions minimales dune telle scène, à diagnostiquer les formes de son effacement et à préfigurer les moyens de sa réapparition. Larchicration nest pas un luxe : elle est la condition de possibilité de toute régulation viable.
Une telle lecture ne peut être univoque ni standardisée. Elle suppose une approche située, transversale, dialogique, mobilisant des savoirs institutionnels, juridiques, techniques, mais aussi ethnographiques, narratifs, subjectifs. Elle engage des compétences et lectures croisées, et exige que les sujets soient parties prenantes de linterprétation. Cest dans les récits, résistances, bifurcations, plaintes et silences que la régulation — ou son absence — devient visible. Cest dans les marges, interstices et incidents que l*archicratie* trouve sa matière vive.
@@ -1270,13 +1289,13 @@ De ce point de vue, larchicration nest pas un protocole à décliner, mais
À ce stade du chapitre, le paradigme archicratique sest exposé dans ses principes, dans ses conditions de lisibilité, dusage et dépreuve, dans ses *seuils critiques* (détectabilité, repérage, ouverture critique), ainsi que dans ses *ancrages différés* (scènes, seuils, temporalités). Mais il reste à en consolider la prise morphologique : non plus sous langle de ses conditions de possibilité générales, mais à travers lanalyse concrète de ses formes dincarnation, de ses figures empiriques, de ses variations structurelles. Car une régulation ne se donne jamais dans le vide : elle se trame, se matérialise, se temporalise, et surtout sexpérimente. Le moment morphologique constitue donc le point de bascule entre la formulation du paradigme et sa puissance heuristique dans les régimes concrets.
Ce chantier ne répète en rien ce qui a été posé jusquici. Il sen distingue par son objet, sa méthode et sa finalité. La section 1.1 posait le cadre dintelligibilité général du paradigme : la triade *arcalité-cratialité-archicration*, pensée comme structure de fondation, de mise en œuvre et de reprise dun ordre. La section 1.4 déployait larchitecture du paradigme dans sa forme purement théorique : triptyque de prises, logique de différenciation, schéma des articulations internes. Ce que propose à présent la section 1.7, cest une *approche stratifiée*, *située*, *matérielle* et *expérientielle* de ces trois prises, telles quelles apparaissent, circulent, se figent ou souvrent dans les régimes de régulation réels — avec toute la diversité, la conflictualité, lhétérogénéité et limperfection que cela suppose. Il ne sagit donc plus de conceptualiser les pôles, mais den cartographier les formes.
Ce chantier ne répète en rien ce qui a été posé jusquici. Il sen distingue par son objet, sa méthode et sa finalité. La section 1.1 posait le cadre dintelligibilité général du paradigme : la triade *arcalité-cratialité-archicration*, pensée comme structure de fondation, de mise en œuvre et de reprise dun ordre. La section 1.4 déployait larchitecture du paradigme dans sa forme purement théorique : triptyque de prises, logique de différenciation, schéma des articulations internes. Les sections 1.5 et 1.6 en ont ensuite éprouvé les formes dynamiques et dégagé les premiers repères heuristiques ; la section 1.7 peut dès lors en proposer la cartographie morphologique. Une *approche stratifiée*, *située*, *matérielle* et *expérientielle* de ces trois prises, telles quelles apparaissent, circulent, se figent ou souvrent dans les régimes de régulation réels — avec toute la diversité, la conflictualité, lhétérogénéité et limperfection que cela suppose. Il ne sagit donc plus de conceptualiser les pôles, mais den cartographier les formes.
Car ce qui fait valeur dans un paradigme critique, ce nest pas sa seule élégance morphologique, mais sa capacité à discerner des régularités, à documenter des bifurcations, à nommer des fractures — non pour assigner, mais pour ouvrir la possibilité dune lecture située. Une forme d*arcalité* nest pas un idéal-type, mais une configuration référentielle historiquement, symboliquement et techniquement composée. Une *cratialité* ne vaut pas par sa fidélité à un protocole dexécution, mais par lagencement spécifique de ses opérateurs, de ses instruments, de ses temporalités daction. Une *archicration* ne se mesure pas à lexistence nominale dun droit au recours, mais à la consistance vécue de la scène quelle institue ou quelle empêche. Cest à ces formes multiples — *opérantes, affaiblies, désincarnées, empêchées, contournées* — que nous allons désormais nous confronter.
Ce travail de morphologie opérante repose sur trois exigences conjuguées. Dabord, une *exigence* *référentielle* : comprendre à partir de quels énoncés, objets, récits, modèles, figures ou principes un ordre prétend se légitimer. Ensuite, une *exigence opératoire* : analyser les mécanismes, supports, outils, interfaces, organigrammes, temporalités et frictions par lesquels une règle produit ses effets. Enfin, une *exigence expérientielle* : restituer la manière dont ces formes sont vécues, comprises, redoutées, contournées ou investies par celles et ceux qui y sont exposés. Cest dans cette articulation — du sémantique, du matériel et du sensible — que réside la puissance diagnostique du paradigme.
Mais il nous faut aller plus loin encore, car cette typologie stratifiée ne peut se limiter à un inventaire. Elle constitue davantage le socle critique de lépreuve archicratique. En effet, une *arcalité* peut exister sans être compréhensible ni contestable ; une *cratialité* peut opérer sans être localisable ni amendable ; une *archicration* peut être instituée sans jamais devenir praticable. Le paradigme archicratique nexige pas que ces prises soient parfaites — il exige quelles soient rendues lisibles dans leur état, quelles soient exposées dans leur morphologie effective, et surtout quelles soient analysées pour ce quelles permettent ou empêchent en termes dadresse, de comparution et de remédiation.
Mais il nous faut aller plus loin encore, car cette typologie stratifiée ne peut se limiter à un inventaire. Elle constitue davantage le socle critique de lépreuve archicratique. En effet, une arcalité peut subsister en demeurant difficilement compréhensible ou contestable ; une cratialité peut opérer tout en restant peu localisable ou faiblement amendable ; une archicration peut être instituée tout en devenant pratiquement impraticable. Le paradigme archicratique nexige pas que ces prises soient parfaites — il exige quelles soient rendues lisibles dans leur état, quelles soient exposées dans leur morphologie effective, et surtout quelles soient analysées pour ce quelles permettent ou empêchent en termes dadresse, de comparution et de remédiation.
Il sagit ici dun pas décisif vers lobservation située, vers la formalisation graduée des régimes, vers une grammaire analytique capable de faire apparaître les formes ténues ou massives, explicites ou latentes, ouvertes ou fermées, des prises archicratiques. Cest un appel à regarder autrement ce qui fait régulation. Et cet appel passe par la reconnaissance des formes — même mutilées, même silencieuses — que prennent nos fondements, nos opérations et nos scènes.
@@ -1342,9 +1361,9 @@ Elle peut se déployer dans des *régimes centralisés* — un portail numériqu
Il faut ici récuser toute vision gestionnaire ou techniciste. La *cratialité* ne se résume pas à un processus doptimisation. Elle na pas pour finalité dassurer lefficacité dun dispositif, mais de rendre intelligible les formes deffectuation concrète dun ordre. Une chaîne de traitement peut être rapide, fluide, bien documentée — et pourtant rigide, incompréhensible, impitoyable. À linverse, une *cratialité* peut être lente, manuelle, fragmentée — mais ménager des seuils dajustement, des lieux dappel, des moments dinterruption qui la rendent habitable. Ce nest pas le style de lopération qui compte, mais sa capacité à articuler des effets dans une configuration régulatrice spécifique.
Cette articulation engage la matérialité des infrastructures comme la plasticité des rôles. Un *geste cratial* est conditionné par une forme, un outil, une procédure, un délai, un seuil, un langage. Lorsquun distributeur automatique refuse un retrait parce que le compte est bloqué, il ne fait quopérer un effet déjà inscrit ailleurs dans une chaîne bancaire : encodage dun score de risque, clôture discrète dun accès, préemption sur des soldes en litige. Le geste, ici, est purement machinique, mais sa *cratialité* est pleine : il transforme une trajectoire, conditionne une action, produit un effet de contrainte — sans justification visible et hors de toute scène explicite.
Cette articulation engage la matérialité des infrastructures comme la plasticité des rôles. Un *geste cratial* est conditionné par une forme, un outil, une procédure, un délai, un seuil, un langage. Lorsquun distributeur automatique refuse un retrait parce que le compte est bloqué, il ne fait quopérer un effet déjà inscrit ailleurs dans une chaîne bancaire : encodage dun score de risque, clôture discrète dun accès, préemption sur des soldes en litige. Le geste, ici, est purement machinique, mais sa *cratialité* est pleine : il transforme une trajectoire, conditionne une action, produit un effet de contrainte — sur une justification faiblement visible et dans une scène dépreuve neutralisée, reléguée ou pratiquement hors de portée.
Cest précisément cette possibilité dabsence de scène qui rend la *cratialité* décisive dans notre paradigme. Car elle travaille en amont de toute possible contestation et en aval de tout fondement. Elle agit avant la réclamation et après le principe. Elle ne parle pas, mais elle configure les possibilités daction : ce que lon peut faire, ce que lon doit fournir, où lon peut passer, avec qui lon peut parler, à quel moment une procédure ou une démarche est susceptible de relance ou savère réellement close. En cela, ce sont les chaînes opératoires — non pas les discours — qui rendent compte du régime véritable dun ordre. En quelque sorte, elle en révèle *sa conduite* et *son conduit*.
Cest précisément cette possibilité de neutralisation, de relocalisation ou dinopérance de la scène qui rend la cratialité décisive dans notre paradigme. Car elle travaille en amont de toute possible contestation et en aval de tout fondement. Elle agit avant la réclamation et après le principe. Elle ne parle pas, mais elle configure les possibilités daction : ce que lon peut faire, ce que lon doit fournir, où lon peut passer, avec qui lon peut parler, à quel moment une procédure ou une démarche est susceptible de relance ou savère réellement close. En cela, ce sont les chaînes opératoires — non pas les discours — qui rendent compte du régime véritable dun ordre. En quelque sorte, elle en révèle *sa conduite* et *son conduit*.
Dans les pratiques sociales ordinaires, la *cratialité* se manifeste sans protocole formel. Lorsquun étudiant sadresse à un secrétariat, lorsquun réfugié tente daccéder à un guichet saturé, lorsquun malade cherche un rendez-vous sur Doctolib, ce ne sont pas les normes écrites qui produisent la régulation, mais les séquences dopérations réelles : les créneaux disponibles, la tolérance de lagent, la posture du guichet, lexistence ou non dun canal alternatif, la résilience du dispositif face à la surcharge. Une *cratialité* se reconnaît au fait que le sujet modifie son agir en fonction de la chaîne deffectuation perçue ou anticipée — même sil nen connaît ni la structure ni les règles exactes.
@@ -1352,7 +1371,7 @@ On ne saurait confiner la *cratialité* à lespace institutionnel. Dans les
Dans les logiques environnementales, la *cratialité* peut prendre la forme de barrières physiques (clôtures, canaux), dinterdictions de prélèvement, de modulations de quota, de déclencheurs de dispositifs dalerte. De sorte quun niveau de pollution franchi peut suspendre le trafic, rediriger des flux, interdire lusage dune zone — par leffet combiné dinstruments de mesure, de seuils préprogrammés et de dispositifs de verrouillage. Cette régulation ne suppose ni acteur visible ni débat public. Elle agit par chaîne. Et cest cette chaîne — non sa justification — qui par exemple constitue le *régime cratial* de la gestion écologique — dans les faits.
On retrouve ce même mécanisme dans les mécanismes migratoires : un dispositif de visa, un fichier de police, une fermeture administrative, une alerte biométrique, un fichier dexclusion partagé de ressortissants entre États. Chacun de ces gestes — souvent silencieux, parfois automatisé — transforme létat dun sujet sans jamais apparaître comme une décision. Il ne sagit pas darbitraire, mais de *cratialité brute et opaque* : une régulation agissant par action différée, sans scène, sans fondement explicite.
On retrouve ce même mécanisme dans les mécanismes migratoires : un dispositif de visa, un fichier de police, une fermeture administrative, une alerte biométrique, un fichier dexclusion partagé de ressortissants entre États. Chacun de ces gestes — souvent silencieux, parfois automatisé — transforme létat dun sujet sans jamais apparaître comme une décision. Il ne sagit pas darbitraire, mais de *cratialité brute et opaque* : une régulation agissant par action différée, à scène neutralisée ou relocalisée, et à fondement implicite, euphémisé ou difficilement exposable.
Le problème fondamental nest donc pas à nos yeux de savoir si une régulation est automatisée ou humaine, numérique ou analogique. Ce qui importe, cest la morphologie de la chaîne deffectuation : *peut-on en reconstituer les étapes ? Qui ou quest-ce qui a agi durant celles-ci ? Au nom de quoi ? Quelles ont été concrètement les actions conduites ? Quels en ont été leurs effets ? Au profit ou au détriment de qui ? Existe-t-il des seuils de suspension ? des marges de correction ? des points dinterruption ?* Voilà autant de questions qui constituent la tenue dune enquête sur la *cratialité*. Cest ce à quoi le paradigme archicratique sattèle, et ce quelle entend *in fine* saisir : une topologie factuelle des régimes opératoires prise dans des situations effectives.
@@ -1418,11 +1437,11 @@ Il y a ensuite les *scènes retournées*, plus pernicieuses encore. Celles-ci ne
Autre figure : la *scène saturée*. Ici, le dysfonctionnement ne vient pas de labsence, mais de lexcès non médié. Trop daccès, pas de filtrage, pas de traduction. Trop de voix, pas découte structurée. Trop dinjonctions, pas de temporalité. La scène devient invivable : le volume dinterpellation y déborde toute capacité de traitement, la comparution sy dilue dans le chaos, la réversibilité devient illisible. Ce sont les grandes plateformes numériques dévaluation, les forums de “libre expression”, ou encore certaines réunions communautaires où tout le monde parle sans quaucune écoute mutuelle ne tienne. La scène donne lieu au vacarme. Le seuil dentrée savère ouvert, mais lagencement archicratique se voit détruit. La critique y meurt de sa propre profusion non canalisée.
Plus troublante encore est la *scène spectrale*. Là, il ne sagit plus dun simulacre découte ni dun excès dexpression mais dun ajournement indéfini. Le sujet nest pas exclu ; il demeure suspendu. On lui dit : “bientôt”, “encore un peu de patience”, “votre demande est en cours de traitement”. Mais celui-ci ne vient jamais. La scène est invoquée, toujours repoussée, jamais tenue. Cest le règne de la régulation par la latence, où le temps devient instrument dusure et deffacement sans brutalité. Dans les politiques dasile, dans les systèmes de demande de logement, dans les chaînes dapprobation administratives, on trouve ce type de *scènes spectrales* : le dossier est bien présent, mais ne trouve jamais place dans la scène. Ce qui est produit alors est une suspension sans mémoire, une attente sans comparution, une adresse sans réponse. Le différé se mue dès lors en forme de pouvoir.
Plus troublante encore est la *scène spectrale*. Là, il ne sagit plus dun simulacre découte ni dun excès dexpression mais dun ajournement indéfini. Le sujet nest pas exclu ; il demeure suspendu. On lui dit : “bientôt”, “encore un peu de patience”, “votre demande est en cours de traitement”. Mais celui-ci ne vient jamais. La scène est invoquée, toujours repoussée, jamais tenue. Cest le règne de la régulation par la latence, où le temps devient instrument dusure et deffacement sans brutalité. Dans les politiques dasile, dans les systèmes de demande de logement, dans les chaînes dapprobation administratives, on trouve ce type de *scènes spectrales* : le dossier est bien présent, mais ne trouve jamais place dans la scène. Ce qui est produit alors est une suspension sans mémoire, une attente à comparution différée jusquà linopérance, une adresse privée de réponse effectivement opposable. Le différé se mue dès lors en forme de pouvoir.
Face à cela, il existe des régulations qui sajustent sans jamais organiser de nouvelles scènes. Ce sont les *formes post-interpellatives*. Lordre y intègre la mémoire de scènes passées — plaintes, mobilisations, controverses — pour reconfigurer silencieusement ses opérations. On peut compter dans cette catégorie : un algorithme modifié sans annonce, un seuil déplacé sans justification, une interface ajustée après une vague de critiques. Il ny a pas de comparution, mais une mémoire agissante. Ce nest pas une archicration au sens strict, mais une archicratialisation par effet de sédimentation critique. Ce régime peut être fécond, mais aussi inquiétant, car il soustrait à la vue des concernés les litiges et les dérives établis : *qui contrôle que lajustement a bien eu lieu ?, qui mémorise la scène absente ?, qui peut rejouer linterpellation si elle reste sans forme ?* La critique y est intégrée, donne lieu à évolution darcalités et de cratialités, mais la polémique est désamorcée.
Par *archicratialisation*, nous désignons ce régime post-interpellatif par lequel une régulation intègre la mémoire dépreuves passées (plaintes, controverses, mobilisations) sans pour autant rouvrir de scène : les critiques sédimentent et se transmutent silencieusement en ajustements d*arcalité* (fondements, critères, axiomes) et de *cratialité* (procédures, seuils, algorithmes, interfaces), sans comparution, sans publicité, sans délai contradictoire nouvellement institué. L*archicratialisation* nest donc pas l*archicration* (qui expose et oppose), mais son après-coup opératoire : une auto-réforme qui peut corriger, parfois avec finesse, tout en déplaçant hors scène le litige qui la rendue nécessaire ; doù son ambivalence. Elle peut être féconde si elle demeure traçable et ré-ouvrable, mais devient inquiétante si elle neutralise la polémique en retirant aux concernés la possibilité dune réinterpellation opposable.
Par *archicratialisation*, nous désignons ce régime post-interpellatif par lequel une régulation intègre la mémoire dépreuves passées (plaintes, controverses, mobilisations) sans pour autant rouvrir de scène effective : les critiques sédimentent et se transmutent silencieusement en ajustements d*arcalité* (fondements, critères, axiomes) et de *cratialité* (procédures, seuils, algorithmes, interfaces), sans comparution véritablement praticable, sans publicité opposable, sans délai contradictoire nouvellement institué et opérant. L*archicratialisation* nest donc pas l*archicration* (qui expose et oppose), mais son après-coup opératoire : une auto-réforme qui peut corriger, parfois avec finesse, tout en déplaçant hors scène le litige qui la rendue nécessaire ; doù son ambivalence. Elle peut être féconde si elle demeure traçable et ré-ouvrable, mais devient inquiétante si elle neutralise la polémique en retirant aux concernés la possibilité dune réinterpellation opposable.
Enfin, il existe ce que nous nommons les *contre-scènes auto-organisées*, ou *pré-archicrations*. Là, ce nest plus lordre institué qui ouvre une scène, mais les sujets eux-mêmes qui la fabriquent, à même leurs expériences. Ce sont des collectifs découte mutuelle, des cercles dentraide communautaire, des réunions de colocataires qui instituent des modalités de parole, de suspension, de reconnaissance, de réparation. Ces scènes ne contestent pas toujours lordre en bloc : elles déploient un à-côté, un écart, une grammaire marginale de la régulation. Elles tissent leurs propres conditions de comparution, de mémoire, de reprise — et parfois, dans un second temps, elles viennent frapper à la porte de linstitution pour lobliger à sajuster.
@@ -1456,7 +1475,7 @@ Elle est ce qui empêche lordre de se refermer dans la tautologie de ses prop
## **Conclusion du chapitre 1 — La théorie archicratique : régulation politique, plasticité critique et scène de requalification**
Le paradigme archicratique ne se présente ni comme une doctrine politique parmi dautres, ni comme une méthode normative de classement des régimes. Il najoute pas une théorie supplémentaire à celles de la souveraineté, de la gouvernance ou de lautorité. Ce quil propose, cest un cadre dintelligibilité critique, ancré dans une grammaire morphologique du politique qui ne repose ni sur des catégories fixes, ni sur une logique de fondement ultime. Il sagit dun *outillage rigoureux pour rendre lisibles les formes concrètes de la régulation, dans leur articulation spécifique entre arcalité, cratialité et archicration dans des contextes tout à fait situés*.
Cette conclusion ne referme pas une doctrine ; elle resserre les conditions sous lesquelles le paradigme archicratique peut valoir comme cadre dintelligibilité critique du politique. Il ne sajoute ni comme typologie supplémentaire, ni comme méthode normative de classement des régimes ; il propose un outillage morphologique pour rendre lisibles les formes concrètes de la régulation dans larticulation située de larcalité, de la cratialité et de larchicration.
Le paradigme archicratique nimpose pas une grille préexistante à des réalités déjà constituées ; il permet danalyser, depuis leurs tensions propres, les manières dont ces réalités se composent, se désarticulent, se reconfigurent. En ce sens, il relève dune dynamique transductive, au sens où chaque régulation est saisie non comme un objet figé, mais comme une configuration en devenir, traversée de forces, de seuils, de mémoires et de requalifications. La transduction, ici, ne désigne pas un raisonnement par analogie (au sens psychologique), mais un processus dindividuation progressive, au contact des tensions internes dun système. Le paradigme ne se veut pas surplombant mais co-engendré par les régimes quil examine.
@@ -1476,7 +1495,7 @@ Dans cette perspective, l*archicratie* devient la forme intelligible de cette
Cest en ce sens quil sagit dun paradigme non pas normatif, mais épistémologiquement productif. Il ne dit pas ce que doit être un bon régime : il rend lisible ce qui rend une régulation habitable, amendable, transformable — et ce qui, à linverse, la ferme sur ses effets, la fige dans ses gestes, la condamne à se répéter et à terme à péricliter. Il propose une forme critique non doctrinale, une manière didentifier des seuils, de qualifier des scènes, de repérer des tensions, sans présumer a priori dun idéal de société. En cela, il sadresse autant à des régimes démocratiques quà des régulations algorithmiques, à des dispositifs communautaires quà des configurations bureaucratiques. Cest un instrument découte morphologique, un opérateur dexposition et de traduction entre ce qui agit et ce qui peut être corrigé.
Mais cette productivité critique engage aussi une exigence : si un régime se donne à lire archicratiquement, alors il accepte dêtre adressé, de comparaître, dêtre reconfiguré depuis ce quil fait. Et cest là, précisément, que la valence politique du paradigme se précise. Car un pouvoir peut bien se proclamer légitime, équitable, nécessaire — il ne devient habitable que sil peut être mis à lépreuve de sa propre scène. La *scène archicrative*, au cœur du paradigme, est ce lieu où le pouvoir ne seffondre pas quand il est exposé : il sy rend recevable. Il y gagne en consistance ce quil perd en clôture. Il y devient politique non par proclamation, mais par acceptation de sa propre reformulation.
Mais cette productivité critique engage aussi une exigence : si un régime se donne à lire archicratiquement, alors il accepte dêtre adressé, de comparaître, dêtre reconfiguré depuis ce quil fait. Et cest là que la valence politique du paradigme se précise. Cette précision nérige pas larchicratie en idéal normatif préalable ; elle indique seulement le seuil à partir duquel une régulation cesse dêtre purement fonctionnelle pour devenir politiquement habitable. Car un pouvoir peut bien se proclamer légitime, équitable, nécessaire — il ne devient habitable que sil peut être mis à lépreuve de sa propre scène. La *scène archicrative*, au cœur du paradigme, est ce lieu où le pouvoir ne seffondre pas quand il est exposé : il sy rend recevable. Il y gagne en consistance ce quil perd en clôture. Il y devient politique non par proclamation, mais par acceptation de sa propre reformulation.
Il fallait dès lors que cette modélisation ne se contente pas dune intuition politique, dun geste polémique, ou dun effet dannonce critique. Elle devait pouvoir fonder une validité épistémologique solide, à même de garantir que la grille archicratique ne dérive ni en système doctrinaire, ni en méthodologie molle. Cest à cette exigence que ce premier chapitre a voulu répondre, en établissant les conditions épistémologiques, morphologiques et fonctionnelles dun paradigme rigoureux — autrement dit : sa possibilité scientifique, sa cohérence structurale et son opérabilité critique.
@@ -1518,8 +1537,8 @@ Dans cette optique, le chapitre 2 constituera lépreuve originelle. En retra
Ce qui souvre alors est un laboratoire de différenciation régulatrice. Le paradigme archicratique, tel quil a été posé ici dans sa topologie formelle, trouvera dans le chapitre 2 les premières scènes dépreuve de sa pertinence différentielle : il y montrera quil est capable de rendre intelligible ce qui varie réellement dun régime à lautre — selon la manière dont il fonde, opère, ou se laisse interroger. Loin dimposer ses catégories, il sy laissera *moduler* par les formes historiques, dans une dynamique de transduction critique : non pour valider son propre appareil conceptuel, mais pour en éprouver les seuils, les écarts, les tensions fécondes.
Car si l*arcalité* ne précède pas toujours la *cratialité*, si la scène d*archicration* nest pas partout instituée, si certaines *co-viabilités* se tiennent sans fondement explicite, sans suspension déclarée, sans mémoire stabilisée, alors il faut reconnaître que le paradigme ne détermine pas les régimes quil analyse : il sexpose à leur complexité. Il nest pas un moule, mais un geste de lecture — une manière de faire apparaître les points de tension, de redistribution et de transformation. Le chapitre 2 montrera alors comment des configurations archaïques ou proto-politiques, souvent considérées comme « pré-étatiques », témoignent en réalité de formes complexes de régulation différée, de justification rituelle, dadresse symbolique, de seuils narratifs ou dépreuves collectives. Il révélera que l*archicration* ne coïncide pas nécessairement avec la démocratie formelle, pas plus que la *cratialité* avec la souveraineté étatique, ni l*arcalité* avec la seule Loi écrite : les régimes de viabilité se sont déployés à travers des architectures plus hétérogènes, plus fragiles, plus inventives quon ne le suppose.
Car si larcalité ne précède pas toujours la cratialité, si la scène darchicration nest pas partout formellement instituée, si certaines co-viabilités se soutiennent à travers des fondements implicites, des suspensions peu codifiées ou des mémoires faiblement stabilisées, alors il faut reconnaître que le paradigme ne détermine pas les régimes quil analyse : il sexpose à leur complexité. Il nest pas un moule, mais un geste de lecture — une manière de faire apparaître les points de tension, de redistribution et de transformation. Le chapitre 2 montrera alors comment des configurations archaïques ou proto-politiques, souvent considérées comme « pré-étatiques », témoignent en réalité de formes complexes de régulation différée, de justification rituelle, dadresse symbolique, de seuils narratifs ou dépreuves collectives. Il révélera que larchicration ne coïncide pas nécessairement avec la démocratie formelle, pas plus que la cratialité avec la souveraineté étatique, ni larcalité avec la seule Loi écrite : les régimes de viabilité se sont déployés à travers des architectures plus hétérogènes, plus fragiles, plus inventives quon ne le suppose.
Cest donc une archéologie morphologique qui souvrira. Non pas pour remonter à un commencement, mais pour différencier les formes premières de régulation tenue, et ainsi éprouver en retour — par contraste, par confrontation, par amplification — la validité opératoire du paradigme archicratique. Car ce nest quen le confrontant à ces régimes situés qui navaient pas encore nos institutions, nos catégories, ni nos grammaires politiques, que nous pourrons établir quil sagit bien dun paradigme de lecture différenciateur, et non dun système normatif reconduit à rebours.
Ainsi se clôt ce chapitre 1 : non dans la certitude dun modèle à dérouler, mais dans louverture dun champ dépreuve critique. Car si l*archicration*, comme nous lavons montré, constitue bien la condition dhabitabilité dun ordre, alors cest aussi elle qui nous oblige à interroger chaque régulation depuis ses effets, ses manques, ses devenirs, et non depuis nos catégories héritées. Ce que le chapitre 2 vient éprouver, cest donc moins lorigine du paradigme que sa capacité à rendre compte, sans réduction, des formes historiques de la viabilité collective, autrement dit, sa *co-viabilité*.
Ainsi se clôt ce chapitre 1 : non dans la certitude dun modèle à dérouler, mais dans louverture dun champ dépreuve critique. Car si larchicration constitue bien la condition dhabitabilité dun ordre, encore faut-il reconnaître quelle ne se donne pas partout sous la forme dune scène pleinement formalisée, stable ou juridiquement instituée. Elle peut être diffuse, rituelle, intermittente, faiblement codifiée ; mais partout où elle est durablement neutralisée, vidée de sa prise, relocalisée hors datteinte ou rendue pratiquement inopérante, la régulation se ferme, devient indisponible à ses affectés et compromet sa propre co-viabilité. Cest pourquoi chaque ordre doit être interrogé depuis les formes concrètes par lesquelles il rend ses décisions, ses justifications et ses tensions exposables, discutables et révisables, plutôt que depuis nos seules catégories héritées. Ce que le chapitre 2 vient alors éprouver, ce nest pas lorigine pure du paradigme, mais sa capacité à rendre compte, sans réduction, de la diversité historique des formes de viabilité collective autrement dit, de leur co-viabilité.

View File

@@ -12,6 +12,7 @@ source:
kind: docx
path: "sources/docx/archicrat-ia/Chapitre_2Archeogenese_des_regimes_de_co-viabilite-version_officielle.docx"
---
À ce stade de notre essai, l*archicratie* a été définie, formalisée et modélisée comme une *structure dynamique de co-viabilité tensionnelle*, articulant trois pôles fondamentaux : l*arcalité* (ce qui fonde), la *cratialité* (ce qui opère) et l*archicration* (ce qui régule). Le chapitre 1 a montré que l*archicratie* nest pas une fiction idéologique ni une utopie normative, mais un système intelligible, repérable, heuristique et herméneutique. Ce système, avons-nous démontré, constitue un *régime dintelligibilité politique générale*, susceptible dunifier les lectures hétérogènes du pouvoir, de la gouvernance, de lorganisation sociale et de la dynamique historique.
Mais toute théorie du politique qui se veut universelle doit, pour être complète, affronter le sol rugueux de lempirique. Cest précisément ce que vise ce deuxième chapitre. Ici, le centre de gravité se déplace de lépistémologique vers lhistorique, du théorique vers larchéologique, de labstraction vers la sédimentation. Il sagit de retracer, sur la longue durée, la manière dont les sociétés humaines ont historiquement construit, adopté, incarné, ritualisé, sacralisé, scripturalisé, technicisé et algorithmisé leurs dispositifs de régulation.
@@ -62,53 +63,63 @@ Lhistoire des communautés et sociétés humaines, si elle se laisse parfois
Il ne sagit pas de reconstruire une chronologie historique, mais de mettre au jour les mécanismes canoniques de la régulation, ces *morphologies fondamentales* par lesquelles les groupes humains ont inscrit, encodé, différé ou orchestré leurs équilibres de pouvoir, de normativité et dorganisation des conflits. Chacun de ces mécanismes constitue une forme conceptuellement stabilisée, susceptible de structurer la pensée des *co-viabilités* sociales selon les trois pôles de l*archicratie* : *arcalité*, *cratialité* et *archicration*.
Nous allons donc développer une typologie en cinq profils de régulation archicratique, chacun incarnant une logique dagencement particulière entre les trois vecteurs fondamentaux du pouvoir régulateur. Ces cinq formes sont :
Nous allons donc développer une typologie de douze méta-régimes archicratiques spécifiques, chacun incarnant une logique dagencement particulière entre les trois vecteurs fondamentaux du pouvoir régulateur ; cette typologie sera ensuite prolongée par un treizième plan différentiel-hybride, consacré aux compositions instables, mixtes ou saisonnières des régimes. Ces douze formes sont :
- L*archicratie proto-symbolique*, caractéristique des sociétés paléolithiques ou dites « à mémoire vive », où la coviabilité repose sur lincorporation rituelle, la mémoire affective et la structuration mimétique des appartenances ;
- méta-régime archicratique proto-symbolique, caractéristique des sociétés paléolithiques ou dites « à mémoire vive », où la co-viabilité repose sur lincorporation rituelle, la mémoire affective et la structuration mimétique des appartenances ;
- L*archicratie sacroinstitutionnelle*, propre aux sociétés religieuses ou théocratiques, dans lesquelles linvisible structure le visible et où lautorité se différencie radicalement de la souveraineté ;
- méta-régime archicratique sacro-institutionnelle non étatique, propre aux sociétés religieuses ou théocratiques, dans lesquelles linvisible structure le visible et où lautorité se différencie radicalement de la souveraineté ;
- L*archicratie technologistique*, fondée sur lidée de mégamachine, dans laquelle la coordination impersonnelle précède le commandement et où les flux prennent le pas sur les figures ;
- méta-régime archicratique techno-logistique, fondée sur lidée de mégamachine, dans laquelle la coordination impersonnelle précède le commandement et où les flux prennent le pas sur les figures ;
- L*archicratie scripturonormative*, qui institue la norme dans lécrit, fait de larchive un vecteur dautorité différée, et de la procédure un opérateur de légitimation ;
- méta-régime archicratique scripturo-normative, qui institue la norme dans lécrit, fait de larchive un vecteur dautorité différée, et de la procédure un opérateur de légitimation ;
- L*archicratie scripturocosmologique*, où la forme régulatrice prend appui sur un ordre du monde fixé par lécriture, et où les structures sociales se calquent sur la grammaire cosmique consignée dans le texte sacré, garantissant lhomologie entre le céleste, le terrestre et le politique ;
- *méta-régime archicratique scripturo-cosmologique*, où la forme régulatrice prend appui sur un ordre du monde stabilisé par lécriture, et où les structures sociales se calquent sur une grammaire cosmique consignée dans un texte cosmographique de référence, garantissant lhomologie entre le céleste, le terrestre et le politique ;
- L*archicratie théologique*, fondée sur la révélation comme source immédiate dobligation, où la parole divine, reçue, transmise et commentée, devient principe de légitimation en soi. Lautorité y procède dune instance transcendante, et la régulation sexerce par médiation interprétative — prophétique, doctrinale ou exégétique — sans que la norme ait besoin dautre justification que sa provenance ;
- *méta-régime archicratique théologique*, fondé sur la révélation comme source immédiate dobligation, où la parole divine, reçue, transmise et commentée, devient principe de légitimation en soi. Lautorité y procède dune instance transcendante, et la régulation sexerce par médiation interprétative — prophétique, doctrinale ou exégétique — sans que la norme ait besoin dautre justification que sa provenance ;
- L*archicratie historiographique*, qui fonde la légitimité sur lactivation dun récit collectif institué, consigné dans des textesrepères, et réactualisé par des protocoles publics de lecture, de commémoration ou de transmission. Lordre y repose sur la fidélité narrative à une mémoire partagée, toujours réécrite et rituellement réactivée ;
- méta-régime archicratique historiographique, qui fonde la légitimité sur lactivation dun récit collectif institué, consigné dans des textes-repères, et réactualisé par des protocoles publics de lecture, de commémoration ou de transmission. Lordre y repose sur la fidélité narrative à une mémoire partagée, toujours réécrite et rituellement réactivée ;
- L*archicratie épistémique*, dans laquelle lautorité procède de la preuve, de la démonstration et de la formalisation objective, et où la coviabilité se construit par la validation critique, la reproductibilité et la neutralisation des points de vue dans un espace de raison partagée ;
- méta-régime archicratique épistémique, dans lequel lautorité procède de la preuve, de la démonstration et de la formalisation objective, et où la co-viabilité se construit par la validation critique, la reproductibilité et la neutralisation des points de vue dans un espace de raison partagée ;
- L*archicratie esthéticosymbolique*, qui opère par lajustement du champ sensible, canonise certaines formes comme convenables ou désirables, et instaure lordre à travers la stabilisation des styles perceptifs, sans passage par le discours ni par linjonction explicite ;
- méta-régime archicratique esthético-symbolique, qui opère par lajustement du champ sensible, canonise certaines formes comme convenables ou désirables, et instaure lordre à travers la stabilisation des styles perceptifs, sans passage par le discours ni par linjonction explicite ;
- Les *archicrations différentielles et hybrides*, plus contemporaines, instables et multisituées, où les métarégimes coexistent, se chevauchent, sannulent ou sintensifient selon les contextes, sans stabilisation systémique.
- méta-régime archicratique normativo-politique, dans lequel la co-viabilité se règle par linstitution explicite de normes politiques, de procédures de légitimation, de droits, de souverainetés et de scènes publiques de délibération, de contentieux ou de représentation ;
- méta-régime archicratique marchand, où léchange, le prix, la solvabilité, le contrat et larbitrage concurrentiel deviennent les opérateurs principaux de régulation des conduites, des accès et des priorités ;
- méta-régime archicratique guerrier, dans lequel lordre se construit autour de lépreuve, de lhonneur, du commandement, de la discipline, de la menace organisée et de la violence armée réglée comme scène dappartenance et de hiérarchisation.
À ces douze méta-régimes archicratiques spécifiques sajoute un treizième plan différentiel-hybride, consacré aux compositions instables, mixtes, saisonnières ou composites des régimes, sans que ces configurations constituent pour autant un méta-régime spécifique supplémentaire.
Lordre dexposition nest pas une flèche historique : chaque méta-régime est un attracteur de *co-viabilité* propre susceptible de récurrences, demboîtements et dhybridations. Aucun ne “remplace” les autres ; tous se recomposent tout au long de lévolution des sociétés humaines.
Il convient de préciser avec clarté que l*archicratie cybernético-calculatoire* — bien que porteur dune dynamique de régulation hautement originale — nest pas ici intégré à cette typologie en tant quarchétype. Sa singularité ne réside pas tant dans sa forme pure que dans sa configuration contemporaine, historiquement située et techniquement circonscrite. Pour cette raison, son analyse détaillée est reportée en fin de chapitre.
Il convient de préciser avec clarté que l*archicratie cybernético-calculatoire* — bien que porteuse dune dynamique de régulation hautement originale — nest pas ici intégrée à cette typologie en tant quarchétype. Sa singularité ne réside pas tant dans sa forme pure que dans sa configuration contemporaine, historiquement située et techniquement circonscrite. Pour cette raison, son analyse détaillée est reportée en fin de chapitre.
Ce détour typologique constitue le socle conceptuel et la grille dintelligibilité permettant danalyser les régimes régulateurs historiquement réalisés. Sans cette abstraction structurante, lanalyse risquerait de sabîmer dans un empirisme sans principes ; à linverse, sans mise à lépreuve historico-comparative, le modèle archicratique courrait le risque de rester suspendu dans labstraction.
Les *archicrations* décrites ci-après constituent une cartographie darchétypes irréductibles. Chacun se définit par la conjonction dun opérateur de validité (ce qui fait tenir le méta-régime), dun locus de scène (où se joue lépreuve) et dune temporalité régulatrice (rythmes du faire, de lattente et de la relance). Notre visée nest ni lexhaustivité ni la chronologie, mais la mise au jour de formes de consistance qui, dans des contextes hétérogènes, assurent la tenue dun ordre. Avant dintroduire un nom, nous appliquons un test dirréductibilité : à défaut de cumul des trois critères, la configuration est traitée intra-section comme variante (signalée par encadré) ou comme composition différentielle (2.2.10). Cette discipline nomenclaturale évite linflation de catégories et garantit la lisibilité des discontinuités conceptuelles. Les pages qui suivent doivent ainsi être lues comme un atlas de mécanismes canoniques — non comme un inventaire fermé.
Les *archicrations* décrites ci-après constituent une cartographie darchétypes irréductibles. Chacun se définit par la conjonction dun opérateur de validité (ce qui fait tenir le méta-régime), dun locus de scène (où se joue lépreuve) et dune temporalité régulatrice (rythmes du faire, de lattente et de la relance). Notre visée nest ni lexhaustivité ni la chronologie, mais la mise au jour de formes de consistance qui, dans des contextes hétérogènes, assurent la tenue dun ordre. Avant dintroduire un nom, nous appliquons un test dirréductibilité : à défaut de cumul des trois critères, la configuration est traitée intra-section comme variante (signalée par encadré) ou comme composition différentielle (2.2.13). Cette discipline nomenclaturale évite linflation de catégories et garantit la lisibilité des discontinuités conceptuelles. Les pages qui suivent doivent ainsi être lues comme un atlas de mécanismes canoniques — non comme un inventaire fermé.
### 2.2.1 — *Archicrations proto-symboliques —* gestuelles et linguistiques
@@ -120,7 +131,7 @@ Ce que nous appelons ici *régulation proto-symbolique* ne désigne pas une phas
Il sagit ici de montrer, à partir de données archéologiques certifiées et danalyses anthropologiques convergentes, que ces sociétés ont su distribuer des formes et des forces dans des configurations stables, différenciées et évolutives. L*archicratie*, dans ce cadre, constitue le politique en régime dapparition, dès lors que le collectif humain suspend la violence, institue un seuil et met en forme ce qui pourrait dissoudre le lien. Cest cette grammaire que nous allons maintenant déplier dans quelques figures concrètes, ancrées dans les sols, les corps et les signes du Paléolithique.
Les *sépultures* paléolithiques, au-delà de représenter des gestes dinhumation, sont les premières scènes différées où la communauté séprouve ellemême comme sujet régulé. Là où lanimal abandonne ou dissimule la dépouille, lhumain préhistorique institue un lieu, un temps, un geste: il fait du corps éteint un point de passage, un opérateur dordre. Les archéologues qui ont rouvert ces tombes ont trouvé la trace dune grammaire structurée de la mémoire, où se tissent les trois prises de l*archicratie*: le fondement (*arcalité*), la puissance agissante (*cratialité*) et la mise en scène (*archicration*).
Les sépultures paléolithiques, au-delà de représenter des gestes dinhumation, sont les premières scènes différées où la communauté séprouve elle-même comme sujet régulé. Là où lanimal abandonne ou dissimule la dépouille, lhumain préhistorique institue un lieu, un temps, un geste: il fait du corps éteint un point de passage, un opérateur dordre. Les archéologues qui ont rouvert ces tombes ont trouvé la trace dune grammaire structurée de la mémoire, où se tissent les trois prises de larchicratie: le fondement (arcalité), la puissance agissante (cratialité) et la mise en scène (archicration).
Découvert en 1955 à lest de Moscou, le site de Sungir (culture gravettienne) a livré deux sépultures exceptionnelles: un adulte et deux enfants âgés denviron dix ans, inhumés têtebêche, leurs corps couverts de plus de 10000 perles divoire de mammouth finement taillées, accompagnées de pointes en os, de disques et de bracelets (Trinkaus &Buzhilova,2018). Les analyses isotopiques ont montré quun même groupe dindividus a consacré des centaines dheures à la fabrication des parurescaractérisant un travail collectif différé, un investissement rituel sans finalité utilitaire.
@@ -130,7 +141,7 @@ En termes archicratiques, Sungir manifeste une *arcalité saturée* de signes
En Moravie, à DolníVěstonice, une triple sépulture datée de 28000ans (Svoboda,2015) présente trois jeunes individus déposés côte à côte, orientés vers lest, lun partiellement recouvert docre rouge, les mains croisées sur le bassin. Autour, un vaste habitat de huttes semisouterraines, des fours dargile, et des figurines animales et humaines — dont la célèbre Vénus en terre cuite, lune des plus anciennes céramiques connues.
OlgaSoffer y lit une «invention de la symbolisation partagée»: la céramique — objet de régulation — est un moyen de fixer, de différer et de transformer le geste collectif. Dans cette configuration, la *cratialité* se manifeste dans la fabrication (la main, la chaleur, la matière), l*arcalité* dans la codification du lieu et des orientations, l*archicration* dans la cérémonie funéraire ellemême, qui lie le feu, locre et le corps pour donner forme à la perte.
OlgaSoffer y lit une «invention de la symbolisation partagée»: la céramique — objet de régulation — est un moyen de fixer, de différer et de transformer le geste collectif. Dans cette configuration, la cratialité se manifeste dans la fabrication (la main, la chaleur, la matière), larcalité dans la codification du lieu et des orientations, larchicration dans la cérémonie funéraire elle-même, qui lie le feu, locre et le corps pour donner forme à la perte.
Alain Testart (*Critique du don*,2007,p.8390), quant à lui, rappelle que locre et le feu appartiennent au même champ symbolique de la transformation: «on ne rend pas la vie, on la traduit». Ici, la traduction devient scène de régulation, où la société se confronte à la finitude en la modulant rituellement.
@@ -359,7 +370,7 @@ Ce qui nous intéresse alors, cest leur puissance de modulation du lien, leur
En cela, ces méta-régimes sacrés sans État nous lèguent une leçon politique dune rare intensité : lordre nest pas toujours là où on croit le voir. Il peut résider dans ce qui ne se montre pas, dans ce qui ne se dit pas, dans ce qui ne se décide pas — mais qui se manifeste, se transmet, se déploie à travers une constellation rituelle de formes, de rythmes, de paroles et de silences partagés. Et cest cette grammaire spécifique que nous reconnaissons aussi dans notre paradigme comme *archicratique* : un pouvoir qui peut se donner sans accaparement, qui peut régler sans règne et qui peut moduler sans imposition.
Cette compréhension est absolument capitale pour notre théorie : elle montre que la mise en ordre rituelle, différée, symbolique — sans instance souveraine — est historiquement attestée et empiriquement documentée. Elle éclaire, par contraste, les dispositifs contemporains de régulation distribuée — algorithmes, consensus décentralisés, structures non-hiérarchiques — qui, sans en reproduire la forme sacrale, en partagent une proximité structurelle : une orchestration de la *coviabilité* sans pouvoir constitué et centralisé.
Cette compréhension est absolument capitale pour notre théorie : elle montre que la mise en ordre rituelle, différée, symbolique — sans instance souveraine — est historiquement attestée et empiriquement documentée. Elle éclaire, par contraste, les dispositifs contemporains de régulation distribuée — algorithmes, consensus décentralisés, structures non-hiérarchiques — qui, sans en reproduire la forme sacrale, en partagent une proximité structurelle : une orchestration de la co-viabilité sans pouvoir constitué et centralisé.
Tableau de synthèse — régulation sacrée non-étatique
@@ -503,7 +514,7 @@ Ce qui sinvente ici, cest une forme dintelligence collective, non chari
Cest en ce sens que la *mégamachine* dévoile ici que la régulation peut se passer de voix et de récit fondateur — mais non de trame, de rythme et dagencement. Elle révèle que le politique peut être entièrement disséminé dans les contraintes matérielles, dans les architectures opératoires et dans les successions normalisées dactions coordonnées.
En cela, l*e régime techno-logistique* légitime sa propre autorité par la viabilité reproductible quelle assure, par la stabilité quelle permet et par lefficience quelle distribue. Elle fonde un ordre qui repose sur linteropérabilité maintenue et généralisable ; un lien social qui ne se raconte plus, mais qui sajuste et se répète dans les activités pour assurer la viabilité collective.
En cela, l*e régime techno-logistique* légitime sa propre autorité par la viabilité reproductible quil assure, par la stabilité quelle permet et par lefficience quelle distribue. Il fonde un ordre qui repose sur linteropérabilité maintenue et généralisable ; un lien social qui ne se raconte plus, mais qui sajuste et se répète dans les activités pour assurer la viabilité collective.
De plus, ce régime incarne une organisation non représentée, un pouvoir disséminé, une intelligence structurelle dont la robustesse tient précisément à son retrait du symbolique et à son efficacité immanente et concrète. Pour autant, il ne sagit pas ici didéaliser la *mégamachine* — ni de masquer ses asymétries, ses saturations et ses vulnérabilités. Il sagit plutôt de reconnaître quelle représente une modalité complète et cohérente du politique, dont la force tient à ce quelle ne se présente jamais comme telle. Cest là lun de ses paradoxes majeurs : elle ne dit pas quelle régule et pourtant elle régule ; elle ne représente pas le pouvoir bien quelle distribue des gestes, des charges et des cadences.
@@ -521,7 +532,7 @@ Tableau de synthèse — *Mégamachines : régulation techno-logistique*
| **Standards métriques et calendaires** (unités de poids, de volume, calendriers) | Harmonisation des flux et des cycles | Archicration métrique et cyclique | Mesure comme opérateur duniversalité logistique | Temporisation des gestes, régulation des cadences | Compatibilité des rythmes, régularité des échanges, fluidité opératoire |
| **Agencements opératoires** (plans urbains, séquençage des tâches, structures productives) | Séquençage et optimisation des fonctions sociales | Archicration procédurale par compatibilité structurelle | Organisation géométrique des espaces, circulation modulée | Répartition des efforts, cadencement des énergies | Co-viabilité par interopérabilité des segments et synchronisation des gestes |
Ce tableau synthétique met en lumière, la spécificité du régime techno-logistique en tant que forme historique pleinement archicratique. Chaque composante fonctionnelle y est à la fois opérateur de d*archicration*, vecteur d*arcalité* ou de *cratialité*, et inducteur dune forme de *co-viabilité* calibrée, extensible et durable. Ce qui frappe ici, cest que la régulation ne réside plus dans une figure, un récit ou un interdit, mais dans l*agencement fonctionnel des dispositifs* — des murs, des outils, des axes, des calculs, des activités — dont l*efficacité performative* suffit à assurer la pérennité du lien collectif. En cela, la *mégamachine* cristallise une mutation ontopolitique majeure puisque la régulation opère ici par infrastructure, par ordre distribué et par opérationnalité. Ce modèle constitue un archétype régulateur autonome, dont la fécondité heuristique sera déterminante pour la suite de notre enquête archicratique.
Ce tableau synthétique met en lumière la spécificité du régime techno-logistique en tant que forme historique pleinement archicratique. Chaque composante fonctionnelle y est à la fois opérateur d*archicration*, vecteur d*arcalité* ou de *cratialité*, et inducteur dune forme de *co-viabilité* calibrée, extensible et durable. Ce qui frappe ici, cest que la régulation ne réside plus dans une figure, un récit ou un interdit, mais dans l*agencement fonctionnel des dispositifs* — des murs, des outils, des axes, des calculs, des activités — dont l*efficacité performative* suffit à assurer la pérennité du lien collectif. En cela, la *mégamachine* cristallise une mutation ontopolitique majeure puisque la régulation opère ici par infrastructure, par ordre distribué et par opérationnalité. Ce modèle constitue un archétype régulateur autonome, dont la fécondité heuristique sera déterminante pour la suite de notre enquête archicratique.
### 2.2.4 — *Archicrations scripturo-normatives*
@@ -611,7 +622,7 @@ Ce processus de reconnaissance repose enfin sur une *économie des supports*. La
Ainsi, l*archicration scripturo-normative* sexerce dans la scène dinvocation dinscription : celle qui lie un acte, des supports, des parties prenantes et une situation. Lécrit ne tranche pas en soi, cest lagencement circonstancié qui le rend *tranchant*. Autrement dit : ce nest pas lénonciation dun écrit en lui-même qui décide dun cas de dette ou dhéritage, mais lagencement de multiples éléments situés : la présence dun duplicata authentifié, la concordance dun sceau, voire lattestation par témoins convoqués dans un lieu reconnu de délibération, comme le montre par exemple la tablette M768 de Larsa (Charpin, 2006). Ce qui est en jeu, à chaque conflit, à chaque réclamation, à chaque revendication statutaire, cest la possibilité de faire reconnaître la validité dun lien au travers de la textualité disponible. Ainsi, lécriture ne garantit pas lordre, mais le rend *disponible à la reconnaissance*, sous réserve de conditions précises de mobilisation.
Si ce méta-régime produit une nouvelle modalité de régulation, ce nest pas uniquement par la codification explicite des obligations, ni par la stabilité différée des statuts, mais par la capacité quelle déploie à structurer une *co-viabilité* étendue sans centralité imposée. Cette modalité spécifique de régulation archicratique na pas toujours besoin dune instance souveraine incarnée, ni dun dogme normatif partagé. Il organise, surtout et avant tout, la coexistence sociale par larticulation de lien dinscriptions, de supports et de pratiques dactivation. Il propose une manière dajuster les rapports humains sans avoir à les harmoniser idéologiquement ou à les soumettre à un pouvoir visible. Il règle sans mythifier, il reconnaît sans sacraliser. En cela, il est performatif.
Si ce méta-régime produit une nouvelle modalité de régulation, ce nest pas uniquement par la codification explicite des obligations, ni par la stabilité différée des statuts, mais par la capacité quelle déploie à structurer une *co-viabilité* étendue sans centralité imposée. Cette modalité spécifique de régulation archicratique na pas toujours besoin dune instance souveraine incarnée, ni dun dogme normatif partagé. Elle organise, surtout et avant tout, la coexistence sociale par larticulation de lien dinscriptions, de supports et de pratiques dactivation. Il propose une manière dajuster les rapports humains sans avoir à les harmoniser idéologiquement ou à les soumettre à un pouvoir visible. Il règle sans mythifier, il reconnaît sans sacraliser. En cela, il est performatif.
De plus, cette capacité à maintenir une stabilité relationnelle à travers des documents activables repose sur une infrastructure scripturale qui transcende les sites de production. Lécriture se déploie dans un réseau dinscriptions qui permet à une société de maintenir des régularités sans recourir à la mémoire collective, ni à un arbitre omniprésent. Le cœur de sa puissance régulatrice réside dans sa disposition à créer des médiations trans-situationnelles, cest-à-dire à produire des effets là où le contexte immédiat ne suffit pas à trancher tout en permettant ladaptation aux cas rencontrés.
@@ -623,7 +634,7 @@ Cela signifie que la vérité régulatrice repose sur une configuration et une c
Cest cette temporalité non linéaire stratifiée qui permet au système dabsorber les conflits sans rupture systémique : à tout litige peut correspondre une trace antérieure à requalifier, un précédent à convoquer ou un statut à préciser. Les énoncés deviennent ainsi matrices de référence et de continuité normative, non pas parce quils imposent, mais parce quils permettent la reprise, la comparaison et la relance sous couvert dégalité formelle de traitement.
Cette capacité dadaptation, de souplesse et de requalification confère à la régulation *scripturo-normative* une forme de plasticité procédurale : il peut fonctionner dans des contextes à faible centralisation étatique, dans des systèmes plusieurs statuts, ou même dans des structures palatiales partiellement disjointes. Il suffit quexiste une infrastructure décriture, de classement et dactivation pour que la *co-viabilité* soit maintenue. Et de fait, comme le prouvent les travaux récents de Piotr Michalowski (*The Correspondence of the Kings of Ur*, 2006), certaines cités sumériennes parvenaient à articuler des réseaux de reconnaissance sans administration hiérarchique forte, mais avec une chaîne de tablettes, de messagers et darchives interreliées.
Cette capacité dadaptation, de souplesse et de requalification confère à la régulation *scripturo-normative* une forme de plasticité procédurale : il peut fonctionner dans des contextes à faible centralisation étatique, dans des systèmes à plusieurs statuts, ou même dans des structures palatiales partiellement disjointes. Il suffit quexiste une infrastructure décriture, de classement et dactivation pour que la *co-viabilité* soit maintenue. Et de fait, comme le prouvent les travaux récents de Piotr Michalowski (*The Correspondence of the Kings of Ur*, 2006), certaines cités sumériennes parvenaient à articuler des réseaux de reconnaissance sans administration hiérarchique forte, mais avec une chaîne de tablettes, de messagers et darchives interreliées.
Ce régime ne suppose donc pas une verticalité absolue. Il peut opérer latéralement, par circulation des documents, par interconnexion des archives, par activation circonstanciée des écrits. Il sagit dune architecture de reconnaissance, dont les piliers sont des fragments de texte, des sceaux, des signatures, des clauses, des lieux de dépôt. Ce que la *co-viabilité* gagne ici, cest une forme de stabilité dans lajustement différé, une régulation qui nimpose pas duniformité, mais qui encadre la pluralité des situations dans un maillage dinscriptions mobilisables.
@@ -1006,7 +1017,7 @@ Cette logique est particulièrement visible dans les régimes où lhistoire o
Ainsi que la étudié Yuri Pines, lhistoriographie impériale chinoise, loin dêtre descriptive, « produit de la normativité en articulant le présent à un passé exemplaire, selon une logique rituelle et politique du modèle transmis » (*The Everlasting Empire*, 2012). On retrouve cette même logique dans les livres mérovingiens, où la *Chronique de Frédégaire* reconstruit la succession dynastique autour de la maison royale légitime, ou encore dans les livres impériaux japonais (Nihon Shoki), où les mythes dorigine sont tressés avec les règnes historiques pour fonder la légitimité de lempereur par filiation divine.
Cette régulation est à la fois non sacrée (au sens théologique) et non légale (au sens normatif) : il repose sur une autre forme de régularité qui est celle de la reconduction ordonnée du pouvoir par mémoire racontée. La norme naît ici de la densité narrative des précédents : parce que tel geste fut accompli par tel souverain canonisé, parce que tel règne est tenu pour fondateur, parce que telle conquête est inscrite comme légitime, alors simpose une obligation implicite dinscription, de conformité et dalignement.
Cette régulation est à la fois non sacrée (au sens théologique) et non légale (au sens normatif) : elle repose sur une autre forme de régularité qui est celle de la reconduction ordonnée du pouvoir par mémoire racontée. La norme naît ici de la densité narrative des précédents : parce que tel geste fut accompli par tel souverain canonisé, parce que tel règne est tenu pour fondateur, parce que telle conquête est inscrite comme légitime, alors simpose une obligation implicite dinscription, de conformité et dalignement.
En ce sens, l*arcalité historiographique* est une *arcalité* indirecte bien que puissante : elle fonde lobligation non en la formulant, mais en racontant le lieu, la manière et les figures à travers lesquelles cette obligation a opéré dans le passé. Non à travers le temps cyclique du cosmos, ni par le temps eschatologique de la révélation, mais le temps linéarisé, daté, stratifié, inscrit dans des chaînes de transmission intériorisées. Ce méta-régime produit donc un type d*arcalité* spécifique : non pas fondée sur un fondement extérieur, mais sur laccumulation scripturaire de ce qui fut. Lordre nest pas donné : il est hérité, raconté, enregistré — cette mémoire devient le sol de la régulation.
@@ -1021,7 +1032,7 @@ Ainsi, lautorité historiographique agit par une puissance de précédent : l
Ce mécanisme produit un effet dentraînement. Laction présente ne prend sens quà travers lalignement sur une chaîne de précédents. De sorte quêtre légitime, cest apparaître comme le prolongement dun récit déjà institué. Comme la montré Michel de Certeau, lhistoriographie est une technique dencadrement du présent par le passé. (*Lécriture de lhistoire*, 1975).
Dans ce méta-régime, la contrainte est douce, mais réelle. Elle se manifeste par la naturalisation progressive de certaines figures et de certaines trajectoires comme les seules valables. Le récit impose moins quil norganise, en cela quelle circonscrit le pensable, oriente les loyautés, modèle les attentes. Il devient alors difficile dagir sans se référer à un précédent, ou de penser en dehors de la séquence reconnue.
Dans ce méta-régime, la contrainte est douce, mais réelle. Elle se manifeste par la naturalisation progressive de certaines figures et de certaines trajectoires comme les seules valables. Le récit impose moins quil norganise, en ce quil circonscrit le pensable, oriente les loyautés, modèle les attentes. Il devient alors difficile dagir sans se référer à un précédent, ou de penser en dehors de la séquence reconnue.
Ce qui fait autorité ici, ce nest pas la véracité du récit, mais sa capacité à produire de la valorisation et du suivi. Comme la souligné Paul Veyne dans *Les Grecs ont-ils cru à leurs mythes ?* (1983), ce qui compte dans ces récits, ce nest pas leur vérité historique, mais leur efficacité dans la structuration de ce que lon croit devoir reproduire. Elle repose sur une économie de la fidélité aux figures racontées qui sexerce par une mémoire scripturale qui agit non par argument, mais par filiation, par continuité, par actualisation dun passé raconté comme porteur dautorité.
@@ -1045,15 +1056,15 @@ Cette ambivalence entre narration structurante et analyse réflexive sincarne
Cette méthode, fondée sur lenquête (*historia*), ne relève pas encore de la critique moderne, mais elle constitue un moment décisif de l*archicration* : en confrontant plusieurs récits, Hérodote produit un lieu de régulation où ce qui peut être retenu comme histoire devient objet de débat, de composition, voire de hiérarchisation. Il ne sagit pas seulement de transmettre un récit fondateur, mais de rendre possible une régulation par confrontation de versions. En cela, Hérodote opère à la jonction entre lactivation de figures exemplaires (le courage des Spartiates, la ruse dUlysse) et l*archicration* des récits divergents (sur les origines du conflit, la nature du pouvoir perse ou les mœurs des Scythes).
Dans tous ces cas, larchicration historiographique ne se confond ni avec la censure, ni avec un acte décriture. Elle suppose un dispositif de confrontation, un lieu de régulation, un arbitrage — explicite ou implicite — des formes narratives reconnues comme valides pour assurer la *co-viabilité* politique. celle-ci se donne à voir dans des lieux précis : la chancellerie où lon compile les chroniques, la cour impériale où lon statue sur les versions divergentes dune conquête, lacadémie où lon débat des filiations légitimes, lassemblée où lon statue parfois sur ce qui doit être enseigné comme vérité officielle. Ces espaces sont des institutions de mémoire autorisée.
Dans tous ces cas, larchicration historiographique ne se confond ni avec la censure, ni avec un acte décriture. Elle suppose un dispositif de confrontation, un lieu de régulation, un arbitrage — explicite ou implicite — des formes narratives reconnues comme valides pour assurer la *co-viabilité* politique. Celle-ci se donne à voir dans des lieux précis : la chancellerie où lon compile les chroniques, la cour impériale où lon statue sur les versions divergentes dune conquête, lacadémie où lon débat des filiations légitimes, lassemblée où lon statue parfois sur ce qui doit être enseigné comme vérité officielle. Ces espaces sont des institutions de mémoire autorisée.
Cette histoire politique devient alors une sorte de grammaire en acte : on noblige pas en décrétant, mais en décidant collectivement quel passé fait autorité. Pour autant il serait erroné de réduire la fonction archicratique à la simple réactivation rituelle du passé. La normativité narrative naît de lépreuve du débat régulateur. En effet, lhistoire ne contraint quen tant quelle a été validée par une instance — formelle ou diffuse — de mise en cohérence, darbitrage et de filtration mémorielle. L*archicration historiographique* ne consiste donc pas à répéter, mais à décider ce qui, dans le passé raconté, continue de fonder la possibilité du vivre ensemble.
Cette histoire politique devient alors une sorte de grammaire en acte : on noblige pas en décrétant, mais en décidant collectivement quel passé fait autorité. Pour autant, il serait erroné de réduire la fonction archicratique à la simple réactivation rituelle du passé. La normativité narrative naît de lépreuve du débat régulateur. En effet, lhistoire ne contraint quen tant quelle a été validée par une instance — formelle ou diffuse — de mise en cohérence, darbitrage et de filtration mémorielle. L*archicration historiographique* ne consiste donc pas à répéter, mais à décider ce qui, dans le passé raconté, continue de fonder la possibilité du vivre ensemble.
Dans le méta-régime historiographique, lautorité se perpétue surtout par une grammaire implicite de la légitimité, progressivement intériorisée par les figures de pouvoir, les élites dirigeantes, les héritiers du trône ou les gardiens de lordre social. Cette transmission relève dune pédagogie de la souveraineté et dune logique aristocratique : on apprend à gouverner en lisant lhistoire, on soriente dans le présent en relisant les gestes des fondateurs, on se légitime en sinscrivant dans la lignée des précédents perçus ou reconnus comme exemplaires.
Ce régime de régulation repose sur une codification implicite, dans laquelle le texte historique fonctionne comme miroir normatif — pour orienter, calibrer, formater les attentes liées à lexercice du pouvoir. Cest pourquoi, dans de nombreuses traditions politiques, lapprentissage du pouvoir passe par la lecture dœuvres historiographiques tenues pour canoniques, organisées non comme savoirs passés, mais comme réservoirs de modèles opératoires à mobiliser.
Cette transmission nemprunte pas uniquement les voies du texte écrit ou de lenseignement formel : elle peut aussi sincarner dans des supports iconiques, rituels ou performatifs, qui assurent la continuité normative par dautres formes de répétition régulatrice. Telles peuvent être le cas de fresques murales, stèles commémoratives, bas-reliefs dynastiques, chants narratifs ou cycles iconographiques. Ces dispositifs, bien quextra-textuels, structurent eux aussi des trames de légitimation fondées sur la mémoire séquencée. Ils contribuent à stabiliser visuellement ou rituellement les figures exemplaires, en les insérant publiquement dans une scénographie permanente du pouvoir hérité. En cela, ils participent pleinement de la *cratialité historiographique*, et parfois de son activation archicratique, dès lors que ces images ou récits chantés sont sélectionnés, ritualisés ou modifiés dans un cadre darbitrage politique.
Cette transmission nemprunte pas uniquement les voies du texte écrit ou de lenseignement formel : elle peut aussi sincarner dans des supports iconiques, rituels ou performatifs, qui assurent la continuité normative par dautres formes de répétition régulatrice. Tel peut être le cas de fresques murales, stèles commémoratives, bas-reliefs dynastiques, chants narratifs ou cycles iconographiques. Ces dispositifs, bien quextra-textuels, structurent eux aussi des trames de légitimation fondées sur la mémoire séquencée. Ils contribuent à stabiliser visuellement ou rituellement les figures exemplaires, en les insérant publiquement dans une scénographie permanente du pouvoir hérité. En cela, ils participent pleinement de la *cratialité historiographique*, et parfois de son activation archicratique, dès lors que ces images ou récits chantés sont sélectionnés, ritualisés ou modifiés dans un cadre darbitrage politique.
Cest pourquoi de nombreuses cultures recourent à des formes non textuelles dhistoriographie — fresques murales, stèles commémoratives, chants épiques ou cycles iconographiques — pour insérer les figures exemplaires dans une scénographie publique du pouvoir hérité. Ces dispositifs visuels ou oraux ne transmettent pas simplement un souvenir : ils stabilisent, incarnent, et ritualisent la légitimité par la répétition figurative.
@@ -1174,7 +1185,7 @@ Cest pourquoi, à son niveau le plus abstrait, l*arcalité épistémique*
Comme lécrivait Foucault dans *Les mots et les choses*, ce savoir est référentiel sans transcendance : il fonctionne par agencements, grilles, séries, catégories, sans appel à une révélation, un principe supérieur ou un ordre sacré. Il construit un régime dobjectivité qui fait obligation par sa structure, non par son origine.
Il convient toutefois de noter que certains régimes de transmission orale, bien que rattachés à des méta-régimes théologiques ou cosmologiques (comme la récitation védique, les hadiths ou les canons bouddhiques), manifestent des degrés très élevés de formalisation cognitive : chaînes de validation orale, protocoles mnémotechniques, systèmes de correction. Ces dispositifs ne relèvent pas directement de l*archicration épistémique*, mais en partagent certaines structures formelles : ils construisent des matrices dordre tout aussi rigoureuses, assurant une coviabilité cognitive sans inscription graphique. La parole y est régulée par des protocoles mnémotechniques, des chaînes de validation orale et des systèmes de correction collective. Ce sont là des formes d*arcalité* formelle sans écriture, où la parole ellemême devient structure.
Il convient toutefois de noter que certains régimes de transmission orale, bien que rattachés à des méta-régimes théologiques ou cosmologiques (comme la récitation védique, les hadiths ou les canons bouddhiques), manifestent des degrés très élevés de formalisation cognitive : chaînes de validation orale, protocoles mnémotechniques, systèmes de correction. Ces dispositifs ne relèvent pas directement de larchicration épistémique, mais en partagent certaines structures formelles : ils construisent des matrices dordre tout aussi rigoureuses, assurant une co-viabilité cognitive sans inscription graphique. La parole y est régulée par des protocoles mnémotechniques, des chaînes de validation orale et des systèmes de correction collective. Ce sont là des formes darcalité formelle sans écriture, où la parole elle-même devient structure.
En cela, le savoir institué constitue une source dordre, à la manière dun cosmos intellectuel. Il ne renvoie pas à un Dieu, à une Nature ou à une Loi, mais à une grammaire interne de cohérence, qui oblige parce quelle est reçue comme logique, opératoire et reproductible.
@@ -1218,7 +1229,7 @@ En Inde ancienne, un même processus de filtration sopère à travers les éc
Une autre forme d*archicration épistémique* consiste dans lopération de clôture canonique, cest-à-dire la définition dun corpus considéré comme recevable — par exclusion de ce qui est jugé erroné, apocryphe, ou non conforme. Cest ici que se joue le cœur normatif du régime : non pas transmettre tout ce qui est su, mais décider de ce qui mérite de lêtre et dexclure le reste.
Lexemple de lAcadémie de Platon (fondée vers 387 av. J.-C.) est, à cet égard, éclairant. Les dialogues de Platon ne forment pas à eux seuls un système, mais cest au sein de lAcadémie que va sélaborer, par reprises, commentaires et enseignements, un canon de lectures platoniciennes, au détriment dautres traditions concurrentes (pythagoricienne, sophistique, cynique). Ce que nous considérons aujourdhui comme la « pensée platonicienne » est donc déjà un résultat archicratique : une sélection stabilisée, enseignée, réinterprétée dans un cadre dautorité. Le savoir devient ainsi le lieu dun arbitrage régulateur collectif, assurant la *coviabilité* cognitive des sociétés savantes.
Lexemple de lAcadémie de Platon (fondée vers 387 av. J.-C.) est, à cet égard, éclairant. Les dialogues de Platon ne forment pas à eux seuls un système, mais cest au sein de lAcadémie que va sélaborer, par reprises, commentaires et enseignements, un canon de lectures platoniciennes, au détriment dautres traditions concurrentes (pythagoricienne, sophistique, cynique). Ce que nous considérons aujourdhui comme la « pensée platonicienne » est donc déjà un résultat archicratique : une sélection stabilisée, enseignée, réinterprétée dans un cadre dautorité. Le savoir devient ainsi le lieu dun arbitrage régulateur collectif, assurant la co-viabilité cognitive des sociétés savantes.
Plus tard, au XIIIe siècle, luniversité de Paris fournit un autre exemple majeur. Comme la montré Alain de Libera (*La philosophie médiévale*, 1993), le corpus aristotélicien avait alors fait lobjet dune sélection et dune régulation dans les facultés des arts et de théologie. Certains textes étaient interdits à lenseignement, dautres réservés à des commentaires précis. Le pouvoir ne sexerce plus ici en interdisant laccès aux livres, mais en fixant les modalités acceptables de leur usage — et donc, en orientant leur pouvoir régulateur.
@@ -1305,7 +1316,7 @@ Le régime épistémique moderne trouve son prolongement dans les formes contemp
| **Appareils de validation** | Filtrer et formaliser la légitimité des savoirs transmis | *Archicration* de la reconnaissance (canon, exclusion, agrément) | Constitution de corpus clos, reconnaissance institutionnelle du vrai enseignable | Production de seuils cognitifs (examens, autorisations, habilitations) | Définition institutionnelle du dicible cognitif |
| **Obligation cognitive** | Créer une forme dadhésion sans coercition | Archicration par standardisation des formats de vérité | Obligation par structure (cohérence démonstrative, opérabilité logique) | Contrainte douce par régularité formelle et reproductibilité | Cohésion par alignement intellectuel, non par commandement explicite |
L*archicration épistémique* simpose comme un régime autonome de régulation, où lobligation ne procède ni dun commandement transcendant, ni dune mémoire collective, ni dun récit dynastique, mais de la structuration formalisée du pensable. L*arcalité* y repose sur lobjectivation du réel dans des corpus cohérents et transmissibles ; la *cratialité* sy exerce par la maîtrise technique de ces systèmes par des figures lettrées, experts, scribes ou maîtres ; l*archicration*, enfin, sy manifeste à travers les dispositifs collectifs de certification, de canonisation, de sélection des interprètes autorisés et de filtrage des corpus valides. Ce régime fonde une *co-viabilité cognitive* non pas en prescrivant des comportements, mais en stabilisant des opérations mentales partagées. Lordre y devient synonyme dintelligibilité. En retour, cette coviabilité cognitive conditionne la coviabilité sociale puisque la société se maintient dans la mesure où ses acteurs partagent un langage commun de preuves, darguments et de raisons.
Larchicration épistémique simpose comme un régime autonome de régulation, où lobligation ne procède ni dun commandement transcendant, ni dune mémoire collective, ni dun récit dynastique, mais de la structuration formalisée du pensable. Larcalité y repose sur lobjectivation du réel dans des corpus cohérents et transmissibles ; la cratialité sy exerce par la maîtrise technique de ces systèmes par des figures lettrées, experts, scribes ou maîtres ; larchicration, enfin, sy manifeste à travers les dispositifs collectifs de certification, de canonisation, de sélection des interprètes autorisés et de filtrage des corpus valides. Ce régime fonde une co-viabilité cognitive non pas en prescrivant des comportements, mais en stabilisant des opérations mentales partagées. Lordre y devient synonyme dintelligibilité. En retour, cette co-viabilité cognitive conditionne la co-viabilité sociale puisque la société se maintient dans la mesure où ses acteurs partagent un langage commun de preuves, darguments et de raisons.
Il existe un dernier méta-régime, tout aussi structurant, à traiter : l*archicration esthético-symbolique*. Ici, lefficacité régulatrice ne réside ni dans lexplication, ni dans la déduction, mais dans la capacité de certaines formes — visuelles, rythmiques, architecturales, stylistiques — à produire de ladhésion, de lévidence ou de lajustement. Celui-ci repose sur une économie des formes sensibles, où la régulation opère par saturation symbolique, par allégeance stylistique, par alignement affectif et émotionnel. Il ne se contente pas de transmettre un contenu : il façonne une atmosphère normative.
@@ -1329,7 +1340,7 @@ Un phénomène similaire, mais plus élaboré, se retrouve dans lusage des ti
Cette *arcalité* par la forme sensible sincarne également dans les textiles à motifs normés, dans les cultures andines de Chavín, Paracas ou Nasca (900200 av. J.-C.), où ils remplissaient une fonction de signalisation statutaire. Le vêtement y devient code social : chaque figure — zigzags, losanges, condors stylisés — nest pas un simple ornement, mais une balise de visibilité sociale, comme la démontré Anne Paul dans ses travaux sur les textiles Paracas. La reconnaissance ne passe pas par lindividu, mais par lagencement formel du tissu. Ladhésion naît du port du motif légitime : ce nest pas le sens qui impose la forme, mais la conformité de la forme qui engendre la reconnaissance.
Cette logique *esthético-symbolique* sincarne également dans les gestes stylisés, les postures codifiées, les chorégraphies ritualisées. Dans de nombreuses sociétés anciennes, les danses collectives, les processions réglées ou les attitudes corporelles prescrites — comme le port du buste incliné, la marche hiérarchisée ou létirement des bras en croix — ne traduisent pas une habitude spontanée, mais un dispositif de régulation symbolique par lajustement rythmique des corps. On en trouve des attestations dans les frises cérémonielles de la vallée de lIndus, dans les fresques de Beni Hasan (Égypte, Moyen Empire), ou dans les rituels dansés des sociétés andines. Le geste devient ici forme instituée, et la posture elle-même, une syntaxe silencieuse de la hiérarchie ou de la convenance. Il ne sagit pas dune chorégraphie libre, mais dun langage gestuel chargé de régulation symbolique. Et cela, bien souvent, sans que les participants en aient une conscience articulée : les postures sapprennent par immersion, les rythmes sincorporent par mimétisme, et la justesse du geste se mesure moins à lintention quà laisance à sy conformer. La *coviabilité* naît alors de cette capacité collective à reproduire des intensités collectivement synchronisées, inscrites dans une grammaire sensorielle incorporée.
Cette logique esthético-symbolique sincarne également dans les gestes stylisés, les postures codifiées, les chorégraphies ritualisées. Dans de nombreuses sociétés anciennes, les danses collectives, les processions réglées ou les attitudes corporelles prescrites — comme le port du buste incliné, la marche hiérarchisée ou létirement des bras en croix — ne traduisent pas une habitude spontanée, mais un dispositif de régulation symbolique par lajustement rythmique des corps. On en trouve des attestations dans les frises cérémonielles de la vallée de lIndus, dans les fresques de Beni Hasan (Égypte, Moyen Empire), ou dans les rituels dansés des sociétés andines. Le geste devient ici forme instituée, et la posture elle-même, une syntaxe silencieuse de la hiérarchie ou de la convenance. Il ne sagit pas dune chorégraphie libre, mais dun langage gestuel chargé de régulation symbolique. Et cela, bien souvent, sans que les participants en aient une conscience articulée : les postures sapprennent par immersion, les rythmes sincorporent par mimétisme, et la justesse du geste se mesure moins à lintention quà laisance à sy conformer. La co-viabilité naît alors de cette capacité collective à reproduire des intensités collectivement synchronisées, inscrites dans une grammaire sensorielle incorporée.
L*arcalité esthético-symbolique* agit aussi par évidence partagée de la forme stabilisée. Le tracé récurrent, lagencement bordant, la répétition chorégraphique, la gradation chromatique — tous participent dun monde ordonné par la forme, où le visible devient vecteur de légitimité. Comme le souligne lanthropologue britannique Tim Ingold, dans *Lines: A Brief History* (2007), les lignes que les sociétés tracent, dans lespace, sur les objets ou sur les corps, ne délimitent pas seulement des zones : elles organisent les comportements. Elles prescrivent sans énoncer, elles disposent sans contraindre. Ces lignes ne sont pas uniquement des repères : elles activent une normativité perceptive qui conditionne la reconnaissance conjointe du convenable. Ce qui est perçu comme correct ne passe pas par le jugement, mais par lajustement du corps à une morphologie autorisée.
@@ -2073,15 +2084,18 @@ Ce tableau rend visible ce qui, sans lui, resterait épars : la capacité des so
Cest ce que cette dernière sous-section nous a permis de comprendre : l*archicratie* ne relève pas dun principe de stabilité ontologique, mais dun agencement toujours renouvelé, parfois paradoxal, souvent inattendu, entre des vecteurs fondamentaux qui se recomposent dans lépaisseur des pratiques sociales. Le politique, ainsi entendu, nest jamais réduit à lÉtat, à la loi ou au contrat : il est ce tissu complexe, fragile et tenace, par lequel les sociétés organisent la possibilité de vivre ensemble — même lorsque les formes de cette organisation échappent aux catégories usuelles.
La section 2.2 sachève donc ici, dans lélargissement de notre carte conceptuelle : après les méta-régimes chimiquement purs, elle intègre les méta-régimes marginaux, mixtes, alternatifs — sans céder ni à la confusion, ni au relativisme. La scène est désormais posée pour le basculement que préparera le chapitre suivant : celui dune topologie comparée des philosophies du pouvoir, où il sagira non plus de cartographier des formes de régulation, mais de penser leurs principes dintelligibilité, leurs axiologies et leurs conditions ontologiques de légitimation.
La section 2.2 sachève donc ici, dans lélargissement de notre carte conceptuelle : après les méta-régimes les plus nettement différenciés, elle intègre les méta-régimes marginaux, mixtes, alternatifs — sans céder ni à la confusion, ni au relativisme. La scène est désormais posée pour le basculement que préparera le chapitre suivant : celui dune topologie comparée des philosophies du pouvoir, où il sagira non plus de cartographier des formes de régulation, mais de penser leurs principes dintelligibilité, leurs axiologies et leurs conditions ontologiques de légitimation.
### Typologie archéogénétique des méta-régimes régulateurs
Au terme de ce parcours analytique, la typologie que nous avons rigoureusement établie ne saurait être interprétée comme une classification figée, ni comme un inventaire empirique des régulations observables dans lhistoire humaine. Elle doit être comprise comme une cartographie ontologique des formes de co-viabilité possibles — cest-à-dire comme une formalisation des modes par lesquels une société institue les conditions de son maintien, de sa reproduction, de sa transformation.
En distinguant treize *méta-régimes archicratiques* — chacun structuré selon une *composition singulière entre arcalité, cratialité et archicration*nous avons dégagé des formes pures de régulation, parfois chimiquement distinctes, parfois différentielles ou hybrides. Ces treize méta-régimes — proto-symbolique, sacral non étatique, techno-logistique, scripturo-normatif, scripturo-cosmologique, théologique, historiographique, épistémique, esthético-symbolique, normativo-politique, marchand, guerrier, ainsi que les configurations différentielles et hybrides — constituent les pôles structurants de cette archétypologie. Ces formes ne sont pas des époques, ni des stades évolutifs, ni des seuils de complexité : elles sont des matrices de cohérence régulatrice, des agencements symboliques et politiques par lesquels un ordre peut sinstituer, se maintenir, se réguler sans nécessairement recourir à la souveraineté étatique, à la transcendance divine ou à l'efficacité technocratique.
En distinguant douze méta-régimes archicratiques spécifiques — chacun structuré selon une composition singulière entre arcalité, cratialité et archicration — puis en ouvrant un treizième plan différentiel-hybride, nous avons dégagé des formes de régulation nettement distinctes, mais aussi des configurations composites, instables ou saisonnières.
Ces douze méta-régimes spécifiques — proto-symbolique, sacral non étatique, techno-logistique, scripturo-normatif, scripturo-cosmologique, théologique, historiographique, épistémique, esthético-symbolique, normativo-politique, marchand et guerrier — constituent les pôles structurants de cette archétypologie ; le plan différentiel-hybride en marque louverture composite, sans constituer pour autant un méta-régime spécifique supplémentaire.
Certains régimes archicratiques reposent sur une *mimesis* rituelle (*proto-symbolique*) ou sur lautorité sacrale (*sacral non étatique* et *théologique*) ; dautres sur lingénierie *techno-logistique* des flux, sur la *scripturalité normée* et linscription du droit dans un ordre cosmologique explicite (*scripturo-normatif* et *scripturo-cosmologique*), sur lépreuve marchande, sur le combat dhonneur (*guerrier*) ou sur la juridicisation *normativo-politique* ; dautres encore sur des régimes de savoir (*épistémiques*) et de style sensible (*esthético-symboliques*), où la codification affective, le jeu, le don ou le silence structurent la *co-viabilité*. Tous ont en commun darticuler, selon des tensions spécifiques, une forme (*arcalité*), une force (*cratialité*), et une scène (*archicration*). Et cest cette trialectique dynamique — jamais hiérarchique, jamais univoque — qui constitue le cœur du modèle archicratique.
Ces formes ne sont pas des époques, ni des stades évolutifs, ni des seuils de complexité : elles sont des matrices de cohérence régulatrice, des agencements symboliques et politiques par lesquels un ordre peut sinstituer, se maintenir, se réguler sans nécessairement recourir à la souveraineté étatique, à la transcendance divine ou à l'efficacité technocratique.
Certains régimes archicratiques reposent sur une *mimesis* rituelle (*proto-symbolique*) ou sur lautorité sacrale (*sacral non étatique* et *théologique*) ; dautres sur lingénierie techno-logistique des flux, sur la scripturalité normée (*scripturo-normatif*) et sur linscription dun ordre cosmologique dans des textualités de référence (*scripturo-cosmologique*), sur lépreuve marchande, sur le combat dhonneur (*guerrier*) ou sur la juridicisation *normativo-politique* ; dautres encore sur des régimes de savoir (*épistémiques*) et de style sensible (*esthético-symboliques*), où la codification affective, le jeu, le don ou le silence structurent la *co-viabilité*. Tous ont en commun darticuler, selon des tensions spécifiques, une forme (*arcalité*), une force (*cratialité*), et une scène (*archicration*). Et cest cette trialectique dynamique — jamais hiérarchique, jamais univoque — qui constitue le cœur du modèle archicratique.
Lambition nest pas ici dexpliquer lhistoire universelle des formes politiques, mais de fournir une grammaire généalogique permettant de penser la pluralité des régulations humaines sans les réduire à un modèle unique. Il ne sagit pas de dire *ce qui a été*, mais de rendre intelligible *comment un ordre peut advenir, persister ou se dissoudre, en fonction de configurations archicratiques localisées*. En cela, la typologie nest ni descriptive ni normative : elle est structurante — cest-à-dire apte à saisir les régularités formelles qui sous-tendent des réalités empiriques hétérogènes.
@@ -2776,7 +2790,7 @@ Si linfrastructure machinique forme le soubassement matériel du méta-régim
Cest ici quil nous faut reconfigurer le concept même d*archicration*. Dans ses formes traditionnelles — juridiques, théologiques, bureaucratiques — la régulation procédait par inscription : lois, normes, rites, règles explicites, lisibles, opposables. L*archicration téra-machinique*, elle, procède par anticipation silencieuse : *elle module au lieu de normer, elle prévient au lieu de contraindre*. Dans ce régime, le pouvoir na plus besoin dinterdire : il rend improbable, il redirige lattention, il pré-filtre les possibles. Il német pas de signal fort : il *corrige en amont*, par suggestion, par structuration de lenvironnement. Ce que Deleuze, dans son célèbre *Post-scriptum sur les sociétés de contrôle* (1990), anticipait déjà comme la substitution du *moulage* disciplinaire par la *modulation* *continue* trouve ici son actualisation et sa plénitude. La modulation devient la forme propre de l*archicration prédictive*, *mais en plus dêtre continue, elle en devient discrète*.
Les *algorithmes prédictifs* — quils sappliquent à la gestion des flux logistiques, à lattribution de crédits bancaires, à la surveillance policière prédictive, à la prescription culturelle ou aux plateformes de recrutement — nimposent pas, mais *orchestrent*. Ils régulent non pas par la règle, mais par le poids statistique du comportement probable. Cest là que réside la spécificité du pouvoir machinique : il repose sur lagrégation des passés, sur la projection automatisée de futurs, sur loptimisation probabiliste des présents. Cette orchestration prédictive nest pas que politique ou cognitive : elle est également financière. Dans les méta-régimes *cybernético-calculatoires* contemporains, les algorithmes prédictifs sinsèrent dans des circuits danticipation économique — marchés de la donnée, monétisation du trafic attentionnel, rentabilisation des trajectoires comportementales. Ce que Shoshana Zuboff a nommé le *capitalisme de surveillance* (2019) nest pas simplement un modèle marchand : cest un méta-régime archicratique où la valeur est produite par la prédictibilité elle-même. Plus une conduite est modélisable, plus elle devient exploitable économiquement. Ainsi, la régulation algorithmique opère une fusion silencieuse entre *normativité adaptative* et *captation de valeur* : la *co-viabilité* devient , le social devient dérivé comportemental, la subjectivité devient matière première prédictive. La *temporalité archicratique* est ici transformée : le pouvoir ne sexerce plus dans linstant de la décision, mais dans la continuité dun *temps anticipé*, *continuellement recalculé, potentiellement monétisable*.
Les *algorithmes prédictifs* — quils sappliquent à la gestion des flux logistiques, à lattribution de crédits bancaires, à la surveillance policière prédictive, à la prescription culturelle ou aux plateformes de recrutement — nimposent pas, mais *orchestrent*. Ils régulent non pas par la règle, mais par le poids statistique du comportement probable. Cest là que réside la spécificité du pouvoir machinique : il repose sur lagrégation des passés, sur la projection automatisée de futurs, sur loptimisation probabiliste des présents. Cette orchestration prédictive nest pas que politique ou cognitive : elle est également financière. Dans les méta-régimes *cybernético-calculatoires* contemporains, les algorithmes prédictifs sinsèrent dans des circuits danticipation économique — marchés de la donnée, monétisation du trafic attentionnel, rentabilisation des trajectoires comportementales. Ce que Shoshana Zuboff a nommé le *capitalisme de surveillance* (2019) nest pas simplement un modèle marchand : cest un méta-régime archicratique où la valeur est produite par la prédictibilité elle-même. Plus une conduite est modélisable, plus elle devient exploitable économiquement. Ainsi, la régulation algorithmique opère une fusion silencieuse entre *normativité adaptative* et *captation de valeur* : la co-viabilité devient variable doptimisation, le social devient dérivé comportemental, la subjectivité devient matière première prédictive. La *temporalité archicratique* est ici transformée : le pouvoir ne sexerce plus dans linstant de la décision, mais dans la continuité dun *temps anticipé*, *continuellement recalculé, potentiellement monétisable*.
Cette reconfiguration du pouvoir par la prédiction appelle à la convocation dune autre penseuse majeure de notre époque : *Antoinette Rouvroy*, en collaboration avec *Thomas Berns*, a forgé le concept de *gouvernementalité algorithmique* (2009), qui constitue une des formulations les plus éclairantes de cette nouvelle archicration. Selon eux, lalgorithme ne cherche pas à produire de la subjectivité, mais au contraire à *court-circuiter* le sujet. Il ne sadresse pas à des individus, mais à des profils, à des tendances statistiques, à des *corpus dactions passées* devenus modèles opératoires. Larchicration nest plus interpellation, mais *captation anonyme*. Elle est dé-subjectivante par essence, parce quelle opère dans linconscient computationnel du système, sans interaction réflexive.
@@ -2814,17 +2828,17 @@ Ce régime ne dispose daucune souveraineté visible, mais déploie une souver
Enfin, ce régime pose des questions inédites aux cadres analytiques classiques. Il appelle à une révision profonde des outils de la pensée politique, juridique, sociologique, écologique. Non pas pour statuer sur sa valeur, mais pour en comprendre les logiques internes, en cartographier les dynamiques, en explorer les tensions constitutives. L*archicratie numérique* — cybernético-calculatoire dans son expression dominante — ne peut être pensée ni comme une simple continuité, ni comme une rupture absolue. Elle doit être analysée comme une mutation régulatrice paradigmatique, située à lintersection dinfrastructures matérielles, de processus computationnels et de conditions épistémiques spécifiques à lère contemporaine.
Ce que cette section aura tenté de mettre au jour, cest précisément cette dynamique composite : *un régime régulateur sans visage, mais pas sans effet ; sans souverain, mais pas sans souveraineté ; sans centre, mais non sans ordre*. Une *archicratie* dun nouveau genre, qui ne se déclare jamais comme telle, mais qui *opère* — et qui, pour cette raison même, requiert un outillage conceptuel à la mesure de sa complexité silencieuse.
Ce que cette section aura tenté de mettre au jour, cest précisément cette dynamique composite : *un régime régulateur sans visage explicite, mais non sans effets ; sans souverain identifiable, mais non sans logique de souveraineté ; sans centre unifié, mais non sans ordre*. On peut y reconnaître une configuration archicratique spécifique, qui ne se déclare pas comme telle mais opère effectivement, et qui requiert pour cette raison un outillage conceptuel ajusté à sa complexité.
##
## **Conclusion du chapitre 2 — Archéologie des régimes régulateurs et stabilisation du paradigme archicratique**
Ce deuxième chapitre avait une tâche précise, à la fois modeste et redoutable : vérifier, sur la longue durée historique et à travers des configurations hétérogènes, si lhypothèse archicratique formulée au chapitre 1 tient lorsquon la confronte aux formes effectives de viabilisation des sociétés humaines. Il ne sagissait ni de substituer à lhistoire politique classique une “grande histoire” de l*archicratie*, ni de dresser un inventaire encyclopédique des pouvoirs passés, mais de répondre à une question plus simple et plus exigeante : si lon regarde les sociétés humaines non plus à partir de la souveraineté, de la loi ou du marché, mais à partir de leurs régimes de régulation, la triade *arcalité* / *cratialité* / *archicration* permet-elle réellement de décrire, de discriminer et de comparer leurs manières de “*faire tenir ensemble*” des existences ? Cest ce double geste archéologique et comparatif quil nous fallait conduire, en refusant demblée les trois dérives qui guettent toute ambition de ce genre : lévolutionnisme naïf (*du rite à lalgorithme*), létato-centrisme (lillusion que lÉtat serait la forme ultime de régulation) et léconomicisme réducteur (lidée que les marchés suffiraient à tout ordonner).
Ce deuxième chapitre avait une tâche précise et exigeante : vérifier, sur la longue durée historique et à travers des configurations hétérogènes, si lhypothèse archicratique formulée au chapitre 1 tient lorsquon la confronte aux formes effectives de viabilisation des sociétés humaines. Il ne sagissait ni de substituer à lhistoire politique classique une “grande histoire” de l*archicratie*, ni de dresser un inventaire encyclopédique des pouvoirs passés, mais de répondre à une question plus simple et plus exigeante : si lon regarde les sociétés humaines non plus à partir de la souveraineté, de la loi ou du marché, mais à partir de leurs régimes de régulation, la triade *arcalité* / *cratialité* / *archicration* permet-elle réellement de décrire, de discriminer et de comparer leurs manières de “*faire tenir ensemble*” des existences ? Cest ce double geste archéologique et comparatif quil nous fallait conduire, en refusant demblée les trois dérives qui guettent toute ambition de ce genre : lévolutionnisme naïf (*du rite à lalgorithme*), létato-centrisme (lillusion que lÉtat serait la forme ultime de régulation) et léconomicisme réducteur (lidée que les marchés suffiraient à tout ordonner).
Le chapitre 2 a ainsi constitué le laboratoire historique du paradigme archicratique. Avec la section 2.1, nous avons fixé le cadre méthodologique : archéologie plutôt quhistoire continue, comparaison plutôt que récit, attention aux dispositifs concrets plutôt quaux seules institutions formelles. Avec 2.2, nous avons proposé une archétypologie des méta-régimes régulateurs, qui ne sont pas des “stades” de développement, mais des profils de composition archicratique possibles. Enfin, avec 2.3, nous avons montré comment ces profils se recombinent dans des régimes historiques situés cités grecques, empires, configurations religieuses médiévales, monarchies renaissantes, régimes disciplinaires, totalitaires, démocratico-providentiels, cybernétiques , composant une histoire stratifiée des *co-viabilités*, et non une marche ascendante vers un quelconque accomplissement. Cest lensemble de ce parcours que cette conclusion doit maintenant resserrer : non pour en faire un résumé linéaire, mais pour dégager ce que cette archéogenèse nous permet désormais daffirmer, et ce quelle nous interdit de prétendre.
Le chapitre 2 a ainsi fonctionné comme laboratoire historique du paradigme archicratique. Avec la section 2.1, nous avons fixé le cadre méthodologique : archéologie plutôt quhistoire continue, comparaison plutôt que récit, attention aux dispositifs concrets plutôt quaux seules institutions formelles. Avec 2.2, nous avons proposé une archétypologie des méta-régimes régulateurs, qui ne sont pas des “stades” de développement, mais des profils de composition archicratique possibles. Enfin, avec 2.3, nous avons montré comment ces profils se recombinent dans des régimes historiques situés cités grecques, empires, configurations religieuses médiévales, monarchies renaissantes, régimes disciplinaires, totalitaires, démocratico-providentiels, cybernétiques , composant une histoire stratifiée des *co-viabilités*, et non une marche ascendante vers un quelconque accomplissement. Cest lensemble de ce parcours que cette conclusion doit maintenant resserrer : non pour en faire un résumé linéaire, mais pour dégager ce que cette archéogenèse nous permet désormais daffirmer, et ce quelle nous interdit de prétendre.
Du côté de la typologie 2.2, le chapitre 2 a dabord fait apparaître que les régimes de *co-viabilité* ne se laissent pas ranger dans quelques grandes catégories politiques (cité, empire, État, démocratie), mais quils engagent des modes darticulation très différenciés entre formes, forces et scènes dépreuve. Les treize méta-régimes proposés de larchicratie proto-symbolique à larchicratie différentiel-hybride, en passant par les formalisations sacrales non-étatiques, techno-logistiques, scripturo-normatives, scripturo-cosmologiques, théologiques, historiographiques, normativo-politiques, épistémiques, esthético-symboliques, marchandes ou guerrières ne décrivent pas des “étapes”. Ils configurent un espace de possibilités morphologiques, où chaque combinaison attribue un rôle distinct à l*arcalité* (ce qui donne forme, durée, hiérarchie et limite), à la *cratialité* (ce qui transforme, contraint, propulse, perturbe) et à l*archicration* (ce qui organise la scène de leur confrontation réglée).
Du côté de la typologie 2.2, le chapitre 2 a dabord fait apparaître que les régimes de *co-viabilité* ne se laissent pas ranger dans quelques grandes catégories politiques (cité, empire, État, démocratie), mais quils engagent des modes darticulation très différenciés entre formes, forces et scènes dépreuve. Les douze méta-régimes spécifiques proposés du proto-symbolique au guerrier prolongés par un treizième plan différentiel-hybride — ne décrivent pas des “étapes”. Ils configurent un espace de possibilités morphologiques, où chaque combinaison attribue un rôle distinct à larcalité (ce qui donne forme, durée, hiérarchie et limite), à la cratialité (ce qui transforme, contraint, propulse, perturbe) et à larchicration (ce qui organise la scène de leur confrontation réglée).
Certaines configurations privilégient des *arcalités* incorporées, sensibles, rituelles : cest le cas des méta-régimes proto-symboliques où la mémoire vive, les gestes, les rythmes et les tabous structurent la *co-viabilité* sans passer par des textualités formalisées ; cest aussi le cas de formes sacrales non étatiques, où lordre cosmique se traduit en interdits, en séquences rituelles, en topologies sacrées du territoire. Dautres reposent sur des arcalités scripturales ou discursives : scripturo-normatives, lorsque la loi écrite, le code, la constitution, la réglementation bureaucratique deviennent les principaux supports de la forme ; scripturo-cosmologiques lorsquun récit dorigine, une cosmogonie, une historiographie sacrale produisent une arcalité narrative ; théologiques lorsquune révélation, des dogmes, un droit canonique encadrent lensemble de la *cratialité* sociale ; épistémiques lorsque ce sont des disciplines de savoir, des protocoles de preuve, des dispositifs dexpertise qui organisent la scène. À la charnière de ces registres, les régimes techno-logistiques font jouer comme *arcalité* les architectures matérielles et les réseaux dacheminement routes, ports, canaux, cadastres, grilles de circulation qui spatialement ordonnent la *co-viabilité*, souvent en articulation étroite avec des dispositifs scripturaux. Dautres méta-régimes encore se définissent par une *cratialité* infra-matérielle, transactionnelle, où léchange marchand, la menace guerrière, lalliance, la dette, la logique des flux logistiques au cœur des régimes techno-logistiques impériaux ou administratifs deviennent les vecteurs centraux de la régulation, sans pour autant effacer toute *arcalité* ni toute scène.

View File

@@ -16,39 +16,41 @@ Parmi les mythes historiographiques tenaces, inscrits au plus profond des repré
Or, ce récit est une illusion. Pire : il est un *écran de fumée* qui masque les véritables logiques à lœuvre dans les grandes métamorphoses de la modernité. Ce que lon nomme “révolution industrielle” nest pas un événement technologique en soi. Cest une *mutation profonde des régimes de régulation du monde*, un *reformatage des structures de viabilité collective*, une *refondation du tissu archicratique* dans lequel sinscrivent et se négocient les conditions mêmes de lexistence humaine.
Il nous faut donc, à ce point de notre démonstration, opérer une inflexion radicale du regard, un renversement de perspective, un dépassement conscient de la mythologie technicienne. Notre projet ne consiste pas à produire une énième périodisation de lhistoire industrielle selon les phases de linnovation. Il sagit de reformuler lensemble du problème, de déplacer la focale : non plus partir de linnovation technique pour analyser ses conséquences sociales, mais interroger lindustrialisation comme moment de reconfiguration de la régulation archicratique. *Ce que chaque “révolution industrielle” transforme, ce nest pas seulement la manière de produire, mais la manière de vivre, de percevoir, de gouverner, dobéir, de résister, despérer*.
Il nous faut donc, à ce point de notre démonstration, déplacer radicalement le regard et dépasser la mythologie technicienne. Notre projet ne consiste pas à produire une énième périodisation de lhistoire industrielle selon les phases de linnovation. Il sagit de reformuler lensemble du problème, de déplacer la focale : non plus partir de linnovation technique pour analyser ses conséquences sociales, mais interroger lindustrialisation comme moment de reconfiguration de la régulation archicratique. *Ce que chaque “révolution industrielle” transforme, ce nest pas seulement la manière de produire, mais la manière de vivre, de percevoir, de gouverner, dobéir, de résister, despérer*.
Cest ici que prend pleinement sens la grille analytique tripolaire que nous avons élaborée dans les chapitres précédents : chaque configuration historique peut être comprise comme larticulation dynamique — et toujours tensionnelle — de trois dimensions constitutives du *fait social total* que nous nommons Archicratie :
*larcalité*, soit les *formes dinstitution symbolique et matérielle du monde vécu* (temps, espace, milieux, rythmes, représentations, inscription des existences) ;
- *larcalité*, soit les *formes dinstitution symbolique et matérielle du monde vécu* (temps, espace, milieux, rythmes, représentations, inscription des existences) ;
*la cratialité*, soit les *modes dimposition, de canalisation et de déploiement de la puissance* (extraction, commandement, discipline, optimisation, anticipation) ;
- *la cratialité*, soit les *modes dimposition, de canalisation et de déploiement de la puissance* (extraction, commandement, discipline, optimisation, anticipation) ;
*larchicration*, enfin, comme *scène de régulation*, *soit les dispositifs, les normes, les architectures cognitives et symboliques par lesquels une société rend viable — ou invivable — lagencement tensionnel de ses structures arcalo-cratiales*.
- *larchicration*, enfin, comme *scène de régulation*, *soit les dispositifs, les normes, les architectures cognitives et symboliques par lesquels une société rend viable — ou invivable — lagencement tensionnel de ses structures arcalo-cratiales*.
Cest à partir de ce cadre, et de lui seul, que nous pouvons entreprendre une véritable histoire archicratique des révolutions industrielles. Chacune dentre elles devient alors un moment différent de recomposition du triptyque, une phase de reformulation de léquilibre régulateur, un nœud civilisationnel où se rejouent, sous des formes renouvelées, les grandes tensions constitutives du vivre-ensemble.
Nous montrerons ainsi, dans les sections suivantes, comment :
la première révolution industrielle (17801850) ne fut pas seulement lâge du charbon et de la vapeur, mais linstauration dune *arcalité disciplinaire*, dune *cratialité de leffort musculaire domestiqué*, et dune *archicration fondatrice centrée sur le contrat, la mesure du temps et la loi salariale* ;
- la première révolution industrielle (17801850) ne fut pas seulement lâge du charbon et de la vapeur, mais linstauration dune *arcalité disciplinaire*, dune *cratialité de leffort musculaire domestiqué*, et dune *archicration fondatrice centrée sur le contrat, la mesure du temps et la loi salariale* ;
la seconde révolution industrielle (18701945) opéra une rationalisation infrastructurelle, mettant en place une *archicration institutionnelle*, *qui connut aussi bien des versions sociales* (pacte fordiste, sécurité sociale) *que des dérives exterminatrices* (machinerie totalitaire, Holocauste) ;
- la seconde révolution industrielle (18701945) opéra une rationalisation infrastructurelle, mettant en place une *archicration institutionnelle*, *qui connut aussi bien des versions sociales* (pacte fordiste, sécurité sociale) *que des dérives exterminatrices* (machinerie totalitaire, Holocauste) ;
la troisième révolution industrielle (19501990) inaugura lère des systèmes, des flux, des protocoles interconnectés, avec une *archicration dispersée, cybernétique, post-étatique*, où lÉtat devient un nœud parmi dautres dans un tissu algorithmique naissant ;
- la troisième révolution industrielle (19732015) inaugura lère des systèmes, des flux, des protocoles interconnectés, avec une archicration dispersée, cybernétique, post-étatique, où lÉtat devient un nœud parmi dautres dans un tissu algorithmique naissant ;
la quatrième révolution industrielle (19902025) consacre la montée en puissance dune *bio-algocratie*, où l*arcalité devient invisible*, où la *cratialité anticipe et capte lattention*, et où l*archicration est effacée, dissimulée, désubjectivée* — nous basculons dans une régulation sans scène, sans sujet, sans épreuve explicite.
- la quatrième révolution industrielle (20102025) consacre la montée en puissance dune bio-algocratie, où larcalité devient invisible, où la cratialité anticipe et capte lattention, et où larchicration est effacée, dissimulée, désubjectivée — nous basculons dans une régulation sans scène, sans sujet, sans épreuve explicite.
Les sections 4.2 à 4.5 suivent ainsi des séquences démergence historico-régulatrices ; la matrice synthétique proposée en 4.6, quant à elle, condense des régimes longs de domination relative, partiellement chevauchants, afin de rendre lisibles leurs continuités structurelles sans les rabattre sur une chronologie linéaire.
Mais plus encore : ce chapitre vise à cartographier les logiques différentes de ces régimes successifs, à identifier les points de bascule, les continuités silencieuses, les effets de retour, les seuils critiques, et à interroger lhypothèse dune *cinquième révolution* à venir, non pas technologique, mais proprement régulatoire : l*instauration consciente de la scène archicratique elle-même*.
Ce serait là la révolution réflexive par excellence : non plus un ajout dinnovation technique, mais une mutation épistémologique du rapport à la régulation ; non plus un progrès par leffacement du politique, mais une *réinstauration de la scène du conflit, du commun, du normatif explicite, une archicration qui sassume comme telle*. Loin dun programme utopique, cette hypothèse sancre dans la nécessité même de penser une *viabilité collective* qui ne soit plus dictée par des architectures opaques ou des algorithmes prédictifs, mais *rendue visible, disputée, pluralisée, et reconfigurable*.
Ce serait là une révolution réflexive : non plus un ajout dinnovation technique, mais une mutation du rapport à la régulation ; non plus un progrès par leffacement du politique, mais une réinstauration de la scène du conflit, du commun et du normatif explicite une archicration qui sassume comme telle. Loin dun programme utopique, cette hypothèse sancre dans la nécessité même de penser une *viabilité collective* qui ne soit plus dictée par des architectures opaques ou des algorithmes prédictifs, mais *rendue visible, disputée, pluralisée, et reconfigurable*.
Ainsi, ce chapitre 4 ne propose pas une histoire de lindustrie, mais une *généalogie des régimes de régulation tensionnelle que la modernité industrielle a successivement cristallisés, imposés, et parfois oblitérés*. Il est la scène dune déconstruction méthodique et dune recomposition critique. Il est, pour notre thèse-essai sur lArchicratie, le pivot historique, le point dinflexion, le révélateur dune *épistémologie de la régulation incarnée*.
Ainsi, ce chapitre 4 ne propose pas une histoire de lindustrie, mais une *généalogie des régimes de régulation tensionnelle que la modernité industrielle a successivement cristallisés, imposés, et parfois oblitérés*. Il est la scène dune déconstruction méthodique et dune recomposition critique. Il constitue, pour notre essai-thèse sur l*archicratie*, un pivot historique et un révélateur dune épistémologie incarnée de la régulation.
Et cest pourquoi, à rebours de toute lecture téléologique, nous affirmons ceci : les révolutions industrielles nont jamais été dabord techniques. Elles ont toujours été régulatoires. Et l*Archicratie*, comme concept opératoire, comme modèle heuristique, comme hypothèse civilisationnelle, est la clef dintelligibilité de cette histoire.
Et cest pourquoi, à rebours de toute lecture téléologique, nous affirmons ceci : les révolutions industrielles nont jamais été dabord techniques. Elles ont toujours été régulatoires. Et l*archicratie*, comme concept opératoire, comme modèle heuristique, comme hypothèse civilisationnelle, est la clef dintelligibilité de cette histoire.
## **4.1 — Prélude méthodologique : penser lindustrialisation comme régime archicratique**
Penser lindustrialisation autrement, non comme simple intensification des techniques, mais comme *configuration régulatoire globale*, exige de défaire plusieurs couches denfouissement historiographique. Car le terme même de «révolution industrielle», aujourdhui si couramment mobilisé quil paraît aller de soi, est le produit dune construction idéologique spécifique, forgée dans une temporalité elle-même saturée dintérêts politiques, économiques, et épistémiques. Loin de désigner un processus objectif, il constitue un *acte de nomination normatif*, qui attribue à certains événements ou innovations une valeur de rupture, en leur conférant une centralité quasi messianique dans le récit du progrès moderne.
Penser lindustrialisation autrement, non comme simple intensification des techniques, mais comme *configuration régulatoire globale*, exige de défaire plusieurs couches denfouissement historiographique. Car le terme même de «révolution industrielle», aujourdhui si couramment mobilisé quil paraît aller de soi, est le produit dune construction idéologique spécifique, forgée dans une temporalité elle-même saturée dintérêts politiques, économiques, et épistémiques. Loin de désigner un processus objectif, il constitue un acte de nomination normatif attribuant à certains événements ou innovations une valeur de rupture, et leur conférant une centralité quasi messianique dans le récit du progrès moderne.
La catégorie de *révolution industrielle* est ainsi, dès son origine, profondément téléologique et européocentrée. Elle suppose un mouvement cumulatif daccroissement des capacités productives, rendu possible par linventivité humaine, la rationalité instrumentale et lorganisation économique. Depuis Arnold Toynbee — qui popularisa lexpression dans ses *Lectures on the Industrial Revolution in England* publiées à titre posthume en 1884 — jusquà David Landes, Eric Hobsbawm ou Robert C. Allen, la littérature dominante a tendu à faire des révolutions industrielles des objets danalyse essentiellement économicistes, téléologiques et fonctionnalistes, en les arrimant à des ruptures techniques sans interroger suffisamment les régimes de régulation, de conflictualité et de symbolisation quelles recomposaient.Il conviendra aux lecteurs ayant suivi lévolution de notre pensée que nous ne pouvons nous satisfaire dune telle réduction. En effet, ce qui importe davantage à nos yeux pourrait se résumer en cette question méta-réflexive : Quest-ce qui a été réellement révolutionné dans ces révolutions ?
@@ -58,7 +60,7 @@ Il est alors nécessaire de poser une distinction fondatrice entre technique com
Mais avant de modéliser les quatre grandes phases que la doxa désigne comme “révolutions industrielles”, encore faut-il souligner un point central trop souvent occulté : la *pluralité des temporalités techno-régulatrices*. Aucune des mutations industrielles ne se produit dans un temps homogène, universel, linéaire. Le récit linéaire, quasi-légendaire, selon lequel lAngleterre invente, lEurope généralise, le monde suit, est une image dépinal. La diffusion dun dispositif industriel ne suit jamais un seul axe de propagation, mais sinscrit dans des hétérochronies, des zones de friction, des sédimentations différenciées selon les régimes symboliques, politiques et économiques locaux.
Ainsi, au sein même dune période donnée — disons, la deuxième révolution industrielle — coexistent des régimes arcalo-cratialo-archicratiques très différents selon les lieux : ce que lon observe dans la Ruhr ne correspond pas à ce qui se joue au Japon, à Buenos Aires ou en URSS. Penser lindustrialisation comme régime archicratique, cest donc la désoccidentaliser, la désynchroniser, la désobjectiver. Il ne sagit plus de décrire une série de faits techniques mais de cartographier une pluralité de régimes de régulation qui se recomposent, saffrontent, simitent ou se parasitent. La notion même de “révolution” devient alors suspecte : trop brutale, trop unifiante, trop idéologique. Nous lui préférons celle de *recomposition régulatoire tensionnelle*.
Ainsi, au sein même dune période donnée — disons, la deuxième révolution industrielle — coexistent des régimes arcalo-cratialo-archicratiques très différents selon les lieux : ce que lon observe dans la Ruhr ne correspond pas à ce qui se joue au Japon, à Buenos Aires ou en URSS. Penser lindustrialisation comme régime archicratique, cest donc la désoccidentaliser, la désynchroniser et la dénaturaliser comme évidence historique. Il ne sagit plus de décrire une série de faits techniques mais de cartographier une pluralité de régimes de régulation qui se recomposent, saffrontent, simitent ou se parasitent. La notion même de “révolution” devient alors suspecte : trop brutale, trop unifiante, trop idéologique. Nous lui préférons celle de *recomposition régulatoire tensionnelle*.
Cette approche, que nous appelons archicratique, ne se contente pas de surplomber la réalité par une grille conceptuelle abstraite. Elle sancre dans une tradition intellectuelle exigeante, dont nous assumons lhéritage critique. Déjà *Lewis Mumford*, dans *Technique and Civilization* (1934), montrait que lâge de la machine ne commence pas avec le moteur à vapeur mais avec linvention de la régulation horaire, de la synchronisation du travail et de la domestication du rythme corporel. *Simondon*, dans *Du mode dexistence des objets techniques* (1958), invitait à penser la technique comme milieu associé, cest-à-dire comme médiation collective structurante. *André Gorz*, dans *Métamorphoses du travail* (1988), rappelait que le passage à la société industrielle repose avant tout sur la normalisation de la subjectivité productive. Plus récemment, *Bruno Latour*, à travers sa théorie des agencements sociotechniques, a permis de penser la technologie non comme outil, mais comme acteur régulateur dans des réseaux hybrides de pouvoir.
@@ -70,7 +72,7 @@ On a trop souvent raconté la première révolution industrielle comme une épop
Ce que nous appelons ici «première révolution industrielle» doit être repensé, non comme une *révolution technicienne*, mais comme l*émergence dune nouvelle archicration,* cest-à-dire une configuration encore instable, mais décisive, dune régulation sociotechnique centrée sur notre triptyque tensionnel. Il ne sagit pas simplement dun saut quantitatif dans la production, mais dun basculement qualitatif dans les modalités de viabilité collective, où le temps, le corps, le contrat, le geste, la fatigue, la norme et lespace se trouvent redéployés dans une grammaire régulatoire entièrement nouvelle.
Ce nest pas la machine qui fait la révolution. Cest linstitutionnalisation de ses conditions dusage, de ses temporalités, de ses subjectivations, de ses régimes dobéissance. Autrement dit, ce qui fonde la modernité industrielle dans sa première phase, ce nest pas le charbon, le fer ou lacier, mais la mise en scène régulatoire dun monde productif discipliné — où le pouvoir ne réside pas tant dans lÉtat que dans la capacité dextraire, de mesurer, de synchroniser et de normaliser le corps laborieux. Cest la naissance du *régime usinier* comme scène dimposition du temps, dadministration des gestes et de contractualisation de leffort.
Ce nest pas la machine qui fait la révolution, mais linstitutionnalisation de ses conditions dusage, de ses temporalités, de ses subjectivations et de ses régimes dobéissance. Autrement dit, ce qui fonde la modernité industrielle dans sa première phase, ce nest pas le charbon, le fer ou lacier, mais la mise en scène régulatoire dun monde productif discipliné — où le pouvoir ne réside pas tant dans lÉtat que dans la capacité dextraire, de mesurer, de synchroniser et de normaliser le corps laborieux. Cest la naissance du *régime usinier* comme scène dimposition du temps, dadministration des gestes et de contractualisation de leffort.
Il faut donc ici reformuler radicalement les catégories. Nous ne parlerons pas dinnovations technologiques, mais de transferts de légitimité régulatoire vers des dispositifs machinés ; nous ne dénombrerons pas les brevets, mais cartographierons les formes de stabilisation normative qui rendent possible une production répétée, interchangeable, anonymisée. Cest ainsi que *la figure du salarié apparaît*, que *le temps devient mesure*, que *leffort devient ressource*, que *la discipline devient infrastructure*.
@@ -78,11 +80,11 @@ Cette phase — que nous délimitons entre 1780 et 1850, non par arbitraire chro
La suite de cette section analysera, en trois temps distincts mais intégrés, cette proto-archicration mécanisée à travers notre triptyque constitutif :
une *arcalité disciplinaire*, faite de temps uniformisé, despaces clos et de rythmes segmentés ;
- une *arcalité disciplinaire*, faite de temps uniformisé, despaces clos et de rythmes segmentés ;
une *cratialité extractive*, centrée sur leffort canalisé, lobéissance incorporée et la force productivisée ;
- une *cratialité extractive*, centrée sur leffort canalisé, lobéissance incorporée et la force productivisée ;
une *archicration fondatrice*, où émergent le contrat, le salaire, la norme, et où lordre industriel commence à se donner comme totalité régulatrice.
- une *archicration fondatrice*, où émergent le contrat, le salaire, la norme, et où lordre industriel commence à se donner comme totalité régulatrice.
Nous prolongerons cette lecture par un cas paradigmatique, celui de Manchester, non pas comme “berceau” de lindustrie, mais comme dispositif historique de régulation mécanisée, avant de conclure sur les tensions, instabilités et apories qui marquent cette phase de fondation, encore partielle et conflictuelle, de l*archicratie industrielle*.
@@ -94,7 +96,7 @@ Ces auteurs, bien que parfois critiques à légard du capitalisme, participen
Cest cette lacune, épistémologique et politique, que nous entendons combler. Car nous faisons lhypothèse que la révolution industrielle, dans sa première phase, est dabord linstauration dun régime disciplinaire de la productivité. Non au sens dun ordre brutalement imposé, mais comme émergence dun mode de régulation spécifique, où la production répétée, segmentée, quantifiée, mesurée du travail humain devient la clé de voûte de la viabilité collective. Ce nest pas labondance des techniques qui produit lindustrie, cest la mise en place dun dispositif de synchronisation, de canalisation et de normativité qui permet à ces techniques dêtre stabilisées, répétées, généralisées, opérantes. Autrement dit, linfrastructure industrielle est dabord une infrastructure régulatoire, et non uniquement matérielle.
Nous appellons proto-archicration cette configuration émergente. Le préfixe *proto-* indique que nous avons affaire à une forme naissante, partielle, encore instable de régulation archicratique. Celle-ci ne dispose pas encore dun État organisé autour dun projet industriel centralisé. Elle ne sincarne pas dans un appareil bureaucratique normatif, ni dans une ingénierie sociale pleinement développée. Elle réside dans un ensemble de dispositifs discontinus mais convergents : latelier transformé en fabrique, la fabrique transformée en usine ; la mesure du temps devenue discipline ; le contrat salarial émergent ; les premières tentatives de juridicisation du travail ; les premiers contremaîtres, les premières normes, les premières résistances. La proto-archicration désigne donc cette phase où lindustrialisation devient régulation du monde sans encore pouvoir se nommer comme telle.
Nous appelons proto-archicration cette configuration émergente. Le préfixe *proto-* indique que nous avons affaire à une forme naissante, partielle, encore instable de régulation archicratique. Celle-ci ne dispose pas encore dun État organisé autour dun projet industriel centralisé. Elle ne sincarne pas dans un appareil bureaucratique normatif, ni dans une ingénierie sociale pleinement développée. Elle réside dans un ensemble de dispositifs discontinus mais convergents : latelier transformé en fabrique, la fabrique transformée en usine ; la mesure du temps devenue discipline ; le contrat salarial émergent ; les premières tentatives de juridicisation du travail ; les premiers contremaîtres, les premières normes, les premières résistances. La proto-archicration désigne donc cette phase où lindustrialisation devient régulation du monde sans encore pouvoir se nommer comme telle.
Le choix dinscrire cette proto-archicration dans une période allant de 1780 à 1850 ne relève pas dun arbitraire. Il est fondé sur des repères précis, à la fois historiographiques et régulatoires. 1780 marque le début de laccélération des innovations techniques, avec lamélioration de la machine à vapeur par James Watt, la généralisation de la mule-jenny, la montée en puissance des manufactures textiles, notamment autour de Manchester. Mais cest surtout à partir de cette date que les formes dorganisation du travail commencent à se codifier durablement, que la synchronisation horaire devient impératif collectif, que le rapport salarial se sédimente comme condition de survie. De lautre côté de la séquence, la décennie 18401850 marque plusieurs seuils régulateurs décisifs : les Factory Acts de 1833 et 1847 en Angleterre, la montée des luttes ouvrières, la généralisation du discours hygiéniste et productiviste, mais aussi, à léchelle européenne, les insurrections de 1848, qui signent la fin dune époque dinstitution informelle de la régulation, et le début dune institutionnalisation partielle du social par lÉtat.
@@ -186,7 +188,7 @@ La cratialité extractive qui simpose dans les premières fabriques industrie
À la différence des formes de pouvoir monarchique, bureaucratique ou théologico-politique, la cratialité industrielle naissante ne repose ni sur un principe de légitimité transcendante, ni sur une codification juridique universelle. Elle procède dune logique defficience : celui qui garantit la production décide ; celui qui fait travailler, commande ; celui qui organise le rendement, gouverne sans en avoir le titre. Cette délégation du commandement à lentrepreneur, que Max Weber analysera plus tard dans *Wirtschaft und Gesellschaft* (1922) comme une forme de rationalisation fonctionnelle, préfigure déjà la dissociation entre autorité légitime et autorité opérationnelle. Le pouvoir devient *réseau, outil, mécanisme* : il ne dit plus, il fait faire.
Cette dynamique est particulièrement visible dans les dispositifs patronaux de type paternaliste — comme ceux dRobert Owen à New Lanark, de Titus Salt à Saltaire, ou des familles Peel et Strutt dans le Derbyshire. Le patron y assume un rôle de régulateur global : il loge, surveille, réprimande, éduque, moralise. Mais ce rôle ne relève pas dun mandat public. Il est *propriétaire du sol, de lusine, des machines, des maisons, et par extension, des corps*. Cette privatisation du pouvoir est sans précédent dans lhistoire européenne moderne : elle transfère à lentrepreneur la capacité de déterminer le quotidien, le temps, la norme, la règle, le seuil de tolérance. Ce pouvoir nest pas juridiquement institué, mais économiquement advenu : il procède de la conjonction entre propriété privée des moyens de production et dépendance vitale des individus au revenu de subsistance. Il en résulte une capacité normative sans inscription étatique, que nous pouvons qualifier de souveraineté dusage, sans reconnaissance symbolique.
Cette dynamique est particulièrement visible dans les dispositifs patronaux de type paternaliste — comme ceux de Robert Owen à New Lanark, de Titus Salt à Saltaire, ou des familles Peel et Strutt dans le Derbyshire. Le patron y assume un rôle de régulateur global : il loge, surveille, réprimande, éduque, moralise. Mais ce rôle ne relève pas dun mandat public. Il est *propriétaire du sol, de lusine, des machines, des maisons, et par extension, des corps*. Cette privatisation du pouvoir est sans précédent dans lhistoire européenne moderne : elle transfère à lentrepreneur la capacité de déterminer le quotidien, le temps, la norme, la règle, le seuil de tolérance. Ce pouvoir nest pas juridiquement institué, mais économiquement advenu : il procède de la conjonction entre propriété privée des moyens de production et dépendance vitale des individus au revenu de subsistance. Il en résulte une capacité normative sans inscription étatique, que nous pouvons qualifier de souveraineté dusage, sans reconnaissance symbolique.
Comme le souligne lhistorienne Emma Griffin dans *Libertys Dawn: A People's History of the Industrial Revolution* (2013), ce pouvoir privé sest étendu par la simple logique du marché, sans quaucune révolution juridique ou politique ne vienne lencadrer véritablement. Ce nest quau milieu du XIXe siècle, avec la montée des luttes ouvrières et lextension partielle du droit du travail (notamment avec le *Factory Act* de 1847), que lÉtat commence timidement à réintégrer la régulation cratiale. Mais jusque-là, la gouvernance des efforts, des gestes, des rythmes est entièrement confiée au capital privé.
@@ -300,7 +302,7 @@ Enfin, la synchronisation temporelle impose à lindividu une unification ryth
En croisant ces trois dispositifs, nous pouvons désormais définir larchicration fondatrice comme *le régime régulatoire qui stabilise la domination industrielle par une codification contractuelle, une valuation salariale et une homogénéisation temporelle*. Elle fonde un ordre sans spectaculaire, un pouvoir sans effusion, une autorité sans emblème. Elle institue un monde où le travail vivant est *encadré, mesuré, valorisé*, non à travers des symboles ou des lois visibles, mais par lagencement minutieux de dispositifs techniques et sociaux opérant à bas bruit. Cest ce que nous désignons comme *fondation régulatoire par intégration fonctionnelle*.
Elle représente ainsi la phase culminante de linstitution archicratique de lère industrielle : le moment où la force nest plus seulement extraite (cratialité), où lespace-temps nest plus seulement structuré (arcalité), mais où lensemble du système de production sociale est légitimé, naturalisé et généralisé par la coalescence de dispositifs régulateurs devenus *formes de vie*. Il ne sagit plus de produire sous contrainte, mais de vivre dans la norme. Ce monde est clos non parce quil est coercitif, mais parce quil est *autoévident*. Il nappelle pas à ladhésion il ne laisse pas dalternative.
Elle représente ainsi la phase culminante de linstitution archicratique de lère industrielle : le moment où la force nest plus seulement extraite (cratialité), où lespace-temps nest plus seulement structuré (arcalité), mais où lensemble du système de production sociale est légitimé, naturalisé et généralisé par la coalescence de dispositifs régulateurs devenus *formes de vie*. Il ne sagit plus de produire sous contrainte, mais de vivre dans la norme. Ce monde est clos non parce quil est coercitif, mais parce quil est *auto-référent, évident, sans extériorité pensable*. Il ne cherche pas ladhésion ; il ne laisse aucune alternative.
Cette stabilisation par la contractualisation, la mensualisation et la synchronisation constitue ce que nous devons reconnaître comme le socle normatif dur de larchicration industrielle. Il ne sagit plus ici de coordonner des flux, ni dencadrer des gestes, mais de produire un sujet apte à lintégration régulée. Le travailleur devient lunité fondamentale de cette grammaire, non parce quil serait biologiquement déterminé à produire, mais parce quil est désormais *socialement défini* par sa capacité à signer, à pointer, à fournir un rendement quantifiable.
@@ -308,11 +310,11 @@ Larchicration fondatrice marque ainsi une rupture décisive dans lhistoire
Et cest sur cette assise, désormais installée, que pourra se construire la dynamique suivante : celle de lexpansion archicratique dans la société marchande et contractuelle étendue, à partir des années 1870. Mais ceci relève dun autre régime, et dun autre moment de notre essai.
### 4.2.5 *Exemple paradigmatique : Manchester, berceau de la régulation mécanisée*
### 4.2.5 Exemple paradigmatique : Manchester, laboratoire de la régulation mécanisée
Manchester nest pas une simple ville industrielle parmi dautres ; elle constitue un opérateur paradigmatique dans lhistoire de la régulation archicratique. Ce nest pas une exagération rhétorique que daffirmer quentre 1780 et 1850, Manchester fonctionne comme un laboratoire de transformation du monde vécu, au sens fort que donne Foucault à l*épistémè* : une structure implicite de savoir, dorganisation et de pouvoir, qui rend possible certaines formes de visibilité et daction tout en en excluant dautres (*Les mots et les choses*, 1966). Manchester matérialise ainsi, dans la texture même de ses usines, rues et horaires, lémergence dun régime régulatoire intégral, où sarticulent *arcalité disciplinaire*, *cratialité extractive* et *archicration fondatrice* — dans une convergence maximale des trois régimes définis au §4.1.
Manchester nest pas ici pensée comme une origine absolue de lindustrialisation, mais comme un laboratoire paradigmatique dans lhistoire de la régulation archicratique. Entre 1780 et 1850, elle fonctionne comme un opérateur de transformation du monde vécu, au sens fort où sy cristallisent des formes nouvelles de visibilité, dobéissance, de mesure et dorganisation. Elle matérialise ainsi, dans la texture même de ses usines, de ses rues et de ses horaires, lémergence dun régime régulatoire intensif, où sarticulent arcalité disciplinaire, cratialité extractive et archicration fondatrice.
Ce qui se joue à Manchester nest donc pas simplement une augmentation de la production, ni même une concentration de lindustrie textile : cest linstauration dun nouveau monde régulé, où les dimensions du temps, de lespace, du geste, de la valeur et de lautorité sont restructurées dans une logique defficience machinique. Ce nest pas un lieu ; cest un opérateur dontologie sociale.
Ce qui se joue à Manchester ne représente donc pas une augmentation de la production, ni même une concentration de lindustrie textile : cest linstauration dun nouveau monde régulé, où les dimensions du temps, de lespace, du geste, de la valeur et de lautorité sont restructurées dans une logique defficience machinique. Ce nest pas un lieu ; cest un opérateur dontologie sociale.
Engels, dans *La situation de la classe laborieuse en Angleterre* (1845), consacre à Manchester une analyse saisissante, non pas tant pour dénoncer les conditions dexistence (ce quil fait) que pour identifier lémergence dun monde nouveau, dans lequel les rapports sociaux sont soumis à une rationalité dextraction. Il y observe une transformation de lespace urbain : « Des quartiers entiers construits selon une géométrie rigide, destinée non à lhabitation mais à la circulation de la force de travail » (éd. française, Maspero, 1969, p. 112). La ville nest pas un milieu de vie, mais une machine de transit et de commandement : la rue conduit à lusine, lusine au dortoir, le dortoir à la fatigue. Ce quadrillage urbain fonctionne comme une *grille disciplinaire*, au sens foucaldien : les corps y sont localisés, assignés, rendus opératoires.
@@ -406,7 +408,7 @@ Et cest cette compréhension approfondie, rigoureuse, critique et articulée
### **4.3.1 Arcalité infrastructurelle : réseaux techniques, standardisation dÉtat, gouvernance par les normes**
Ce que la seconde révolution industrielle inaugure, dans le prolongement mais aussi dans la mutation des régimes régulatoires du XIXe siècle, cest une transformation radicale du rôle joué par les *infrastructures techniques* dans lorganisation du monde social. Larcalité, que nous avions définie dans les sections précédentes comme *forme de régulation du pensable, du visible et du faisable*, sy matérialise dans des dispositifs massifs, standardisés, étendus, qui ne se contentent plus de modeler les pratiques — mais reconfigurent désormais *larmature même du réel*.
Ce que la seconde révolution industrielle inaugure, dans le prolongement et aussi dans la mutation des régimes régulatoires du XIXe siècle, cest une transformation radicale du rôle joué par les *infrastructures techniques* dans lorganisation du monde social. Larcalité, que nous avions définie dans les sections précédentes comme *forme de régulation du pensable, du visible et du faisable*, sy matérialise dans des dispositifs massifs, standardisés, étendus, qui ne se contentent plus de modeler les pratiques — mais reconfigurent désormais *larmature même du réel*.
Larcalité devient *infrastructurelle* : cest-à-dire quelle sincarne dans des formes spatiales, matérielles, technologiques, étatiques, qui organisent non plus seulement la discipline des corps (comme dans le régime manchestérien), mais la *condition daccès au monde* — au sens le plus littéral : routes, rails, canaux, réseaux électriques, normes dingénierie, protocoles de mesure, standardisation des unités et des formats, grilles cadastrales, cartes topographiques, lignes de transmission, systèmes postaux, télégraphiques, téléphoniques. Cest une *archéification des milieux*, dans laquelle ce nest plus le geste local qui est régulé, mais lenvironnement structurant dans lequel tout geste peut avoir lieu. Larcalité cesse dêtre un encadrement disciplinaire pour devenir une infrastructure de la possibilité. Il est ici nécessaire de préciser que cette transformation ne relève pas seulement dun changement de format technique ou de support matériel, mais dun basculement épistémologique au sens fort. En reprenant la notion foucaldienne d*épistémè* — entendue comme structure des conditions de possibilité du savoir — larcalité infrastructurelle apparaît comme un dispositif non pas seulement logistique, mais cognitif-normatif : elle structure ce qui peut être dit, vu, mesuré, donc pensé. Mais là où Foucault (dans *Les mots et les choses*) décrit des régimes de visibilité historiquement situés, il nous faut ici compléter avec la perspective de Canguilhem, pour qui la norme est toujours déjà à la fois biologique, sociale et technique, cest-à-dire *vivante*. La normativité arcalitaire ne relève donc pas dun simple cadre technique : elle est une *milieuformung* — une formation du monde — qui configure les possibilités du vivant à travers des formes normatives intégrées. Cette rationalisation par la norme rejoint enfin ce que Supiot identifie, dans *La gouvernance par les nombres*, comme une ontologie de la mesure : celle dans laquelle le réel ne vaut que sil est quantifiable. Autrement dit, larcalité infrastructurelle ne régule pas le réel : elle définit ce qui peut être réel.
@@ -618,7 +620,7 @@ Dans ce contexte, le compromis social devient une technique de gouvernement. Il
Enfin, cette archicration étatique du compromis social saccompagne dun *pacte implicite de croissance et de discipline*. Les syndicats, intégrés dans la gouvernance des dispositifs, acceptent de contenir les revendications en échange dune redistribution partielle de la richesse. Cest lessence du fordisme politique : la paix sociale contre la consommation garantie ; la docilité collective contre la stabilité prévisionnelle. Ce nest pas la fin du conflit — cest sa translation dans un théâtre régulé.
Larchicration institutionnelle négociée, que nous avons décrite dans les blocs précédents comme une ingénierie stabilisatrice des antagonismes sociaux, ne constitue nullement une suppression des tensions : elle en organise la gestion différentielle, en redistribue les seuils dacceptabilité, et surtout en **désactive les foyers de conflictualité non compatibles avec lordre calculé**. Ce nest pas une pacification, cest une *mise en forme* des tensions — dont leffet structurel est de **normaliser la conflictualité acceptable** tout en reléguant dans lindicible, linvisible ou lillégitime, toutes les formes de dissensus inassimilables.
Larchicration institutionnelle négociée, que nous avons décrite dans les blocs précédents comme une ingénierie stabilisatrice des antagonismes sociaux, ne constitue nullement une suppression des tensions : elle en organise la gestion différentielle, en redistribue les seuils dacceptabilité, et surtout en désactive les foyers de conflictualité non compatibles avec lordre calculé. Ce nest pas une pacification, cest une *mise en forme* des tensions — dont leffet structurel est de normaliser la conflictualité acceptable tout en reléguant dans lindicible, linvisible ou lillégitime, toutes les formes de dissensus inassimilables.
Le paradoxe fondamental tient dans le fait que la reconnaissance étatique des revendications collectives — à travers la sécurité sociale, les conventions collectives, les négociations paritaires — fonctionne comme opérateur de neutralisation politique. Là où une lutte pouvait être vécue comme insurrectionnelle ou radicalement antagoniste (grèves sauvages, occupations, refus du travail), elle est reconfigurée en différend technique, soluble dans un dialogue dexperts, de représentants et dinstances. LÉtat ne pacifie pas : il dés-politise. Il transforme les rapports de forces en paramètres dajustement.
@@ -732,7 +734,7 @@ Nous structurerons cette section en quatre moments fondamentaux, correspondant
*Archicration dispersée* : désétatisation, gestion par interfaces, rationalité modulaire — émergence dun pouvoir sans centre.
*Études de cas* : ARPANET, Toyotisme, marchés financiers — trois scènes paradigmatique du basculement cybernétique.
*Études de cas* : ARPANET, Toyotisme, marchés financiers — trois scènes paradigmatiques du basculement cybernétique.
À travers cette architecture, nous poursuivrons notre thèse centrale : larchicration est un opérateur tensionnel, ni intrinsèquement libérateur ni nécessairement oppressif, mais configuré par les milieux régulateurs. Or ici, cest le système lui-même — *autorégulé, automatique, invisible* — qui devient le milieu.
@@ -1278,23 +1280,23 @@ La suite de notre essai-thèse devra donc affronter une question centrale : *com
La séquence ouverte par la quatrième révolution industrielle — bio-algocratique, machinique, post-normative — ne sachève pas dans la clôture dun monde intégralement régulé, entièrement automatisé, parfaitement lissé. Bien au contraire : plus la régulation devient silencieuse, plus elle suscite, en miroir, *des formes de résistance inédites, des gestes dinsoumission latente, des percées critiques imprévisibles*. Car toute oblitération appelle son contre-effet : toute forme de dissolution de la scène régulatoire visible appelle une *refiguration du dissensus*, une réinvention du conflit dans les interstices du système.
Il nous faut ici prendre la pleine mesure dune hypothèse forte : *le régime archicratique oblitéré nannule pas la conflictualité — il la déplace*. Il ne supprime pas lépreuve — il la rend illisible. Et ce déplacement génère *un nouveau régime de luttes*, fondé non plus sur lopposition frontale à une autorité identifiable, mais sur *lexhumation des infrastructures, la désobfuscation des codes, la réactivation des corps*. Dans cette configuration, les figures critiques ne sont plus des représentants institués, des porte-voix organiques ou des opposants identifiés : *elles sont des événements, des gestes, des hacks, des fissures*.
Il nous faut ici prendre la pleine mesure dune hypothèse forte : *le régime archicratique oblitéré nannule pas la conflictualité — il la déplace*. Il ne supprime pas lépreuve — il la rend illisible. Et ce déplacement génère *un nouveau régime de luttes*, fondé non plus sur lopposition frontale à une autorité identifiable, mais sur *lexhumation des infrastructures, la désobfuscation des codes, la réactivation des corps*. Dans cette configuration, les figures critiques ne sont plus principalement des représentants institués, des porte-voix organiques ou des opposants identifiables : elles prennent la forme de gestes, dinterventions, de brèches ou de contre-dispositifs ponctuels.
Ainsi se dessine une constellation mouvante de *résistances émergentes*, que nous devons analyser non comme un catalogue de pratiques, mais comme des tentatives plus ou moins coordonnées de *repolitisation de larchicration par sa re-visibilisation*. Cette refiguration prend plusieurs formes, que nous allons déployer ici comme autant de figures paradigmiques de la contre-archicration contemporaine. Car là où le pouvoir se retire derrière lécran, la plateforme ou lalgorithme, *cest dans le geste de dévoilement que réside lacte politique*.
Ainsi se dessine une constellation mouvante de *résistances émergentes*, que nous devons analyser non comme un catalogue de pratiques, mais comme des tentatives plus ou moins coordonnées de *repolitisation de larchicration par sa restauration visible*. Cette re-figuration prend plusieurs formes, que nous allons déployer ici comme autant de figures paradigmatiques de la contre-archicration contemporaine. Car là où le pouvoir se retire derrière lécran, la plateforme ou lalgorithme, *cest dans le geste de dévoilement que réside lacte politique*.
Dans cette perspective, la présente section abordera successivement :
La figure du lanceur dalerte (*whistleblower*) comme brèche dans la souveraineté opaque : Edward Snowden, Chelsea Manning, Julian Assange, et les formes contemporaines de dévoilement comme reconstruction de lespace public.
La figure du *lanceur dalerte* (*whistleblower*) comme brèche dans la souveraineté opaque : Edward Snowden, Chelsea Manning, Julian Assange, et les formes contemporaines de dévoilement comme reconstruction de lespace public.
La figure du pirate informatique (*hacker*) comme forçage du code archicratique : pratiques de désobéissance numérique, sabotage algorithmique, cryptographie militante, décentralisation autogérée.
La figure du *pirate informatique* (*hacker*) comme forçage du code archicratique : pratiques de désobéissance numérique, sabotage algorithmique, cryptographie militante, décentralisation autogérée.
La figure du commun insurgé comme refus de la captation privative : mouvements des ZAD, squats numériques, logiciels libres, plateformes alternatives, infrastructures post-capitalistes.
La figure du *commun insurgé* comme refus de la captation privative : mouvements des ZAD, squats numériques, logiciels libres, plateformes alternatives, infrastructures post-capitalistes.
La figure du soulèvement situé comme réinscription du conflit dans lexpérience vécue : luttes antiracistes, féministes, écoféministes, décoloniales et intersectionnelles, qui réinjectent de la chair, du lieu, du récit, de la voix là où le système archicratique tend à disqualifier lexpérience.
La figure du *soulèvement situé* comme réinscription du conflit dans lexpérience vécue : luttes antiracistes, féministes, écoféministes, décoloniales et intersectionnelles, qui réinjectent de la chair, du lieu, du récit, de la voix là où le système archicratique tend à disqualifier lexpérience.
Chacune de ces figures ne peut être comprise isolément. *Elles forment un réseau de contre-pouvoirs, souvent fragmenté, parfois contradictoire, mais convergeant dans leur effort commun : rendre à nouveau visible ce que larchicration avait dissimulé* ; réinsuffler de lépreuve là où ne restait que la norme automatisée ; *déstabiliser la prétention au sans-faille, au sans-friction, au sans-discussion*.
Ce sont elles qui tracent, dans les failles du régime, *les lignes de fuite vers une archicration réhumanisée*. Car ce nest pas larchicration elle-même qui est à abolir — mais *son effacement comme épreuve*. La politique ne commence pas où sarrête la régulation, mais *là où elle redevient visible, discutable, disputable*.
Elles ouvrent, dans les failles du régime, des possibilités de réouverture archicrative. Car ce nest pas larchicration elle-même qui est à abolir — mais *son effacement comme épreuve*. La politique ne commence pas où sarrête la régulation, mais *là où elle redevient visible et discutable*.
Ce nest pas un hasard si, à mesure que le pouvoir devient technique, dispersé, silencieux, les figures de la dissidence migrent elles aussi vers les marges de linfrastructure. Dans lunivers de larchicration oblitérée — où la régulation seffectue sans scène, sans garant, sans confrontation explicite — la dissidence ne peut plus se loger dans les formes classiques de lantagonisme institutionnel. Elle doit frapper au cœur de lopacité systémique. *Cest là que surgit la figure du whistleblower : non pas simplement comme lanceur dalerte, mais comme opérateur de vérité dans un monde saturé de gouvernance opaque*.
@@ -1302,13 +1304,13 @@ Edward Snowden, Chelsea Manning, Julian Assange : autant de noms qui, bien au-de
Ce qui sopère ici, cest une désobfuscation du réel : là où le pouvoir numérique repose sur linvisibilité de ses mécanismes, le lanceur dalerte brise le charme opaque du système. Il met en échec ce que Byung-Chul Han nomme *l'inaccessibilité des dispositifs algorithmiques* (cf. *Psychopolitique*, 2014), à savoir limpossibilité structurelle, pour le citoyen ordinaire, de comprendre ou même de soupçonner les logiques réelles de régulation à lœuvre. De sorte que le *whistleblower transforme cette opacité en événement de dévoilement*. Il politise ce qui était présenté comme pur dispositif technique.
Mais cette politisation opère sans organe représentatif, sans cadre délibératif classique. Elle est *sans médiation*. Elle traverse le corps du dissident, le lie immédiatement à linfrastructure numérique, et *court-circuite les scènes conventionnelles de la démocratie libérale*. Ce que Snowden révèle en 2013, ce nest pas seulement lexistence de programmes de surveillance massifs comme PRISM ou XKeyscore, cest lannulation pratique de toute distinction entre contrôle étatique et gouvernance privée, entre surveillance extérieure et extraction permanente de données. *Il ne dénonce pas : il démontre*. Il ne propose pas une réforme : il met en crise larchitecture même de la régulation contemporaine.
Mais cette politisation opère sans organe représentatif, sans cadre délibératif classique. Elle est *sans médiation*. Elle traverse le corps du dissident, le lie immédiatement à linfrastructure numérique, et *court-circuite les scènes conventionnelles de la démocratie libérale*. Ce que Snowden révèle en 2013, ce nest pas seulement lexistence de programmes de surveillance massifs comme PRISM ou XKeyscore, cest lannulation pratique de toute distinction entre contrôle étatique et gouvernance privée, entre surveillance extérieure et extraction permanente de données. Son geste ne se réduit pas à la dénonciation : il documente et met au jour une architecture de régulation contemporaine. Il ne propose pas à lui seul une réforme, mais il oblige à requalifier les conditions mêmes de visibilité du pouvoir technique.
Ce geste constitue en soi une épreuve archicratique. En révélant les mécanismes régulateurs dissimulés, le whistleblower redonne une scène à lépreuve. Il fait apparaître *linfrastructure comme lieu du politique*. Dans ce sens, il ne soppose pas frontalement à une loi ou à un décret : *il oppose la visibilité à lopacité, la parole à lautomatisation, la subjectivation à la captation*. Il démasque la *fausse neutralité* neutre, il perturbe le pouvoir qui prétend ne pas en être un.
Ce geste constitue en soi une épreuve archicratique. En révélant les mécanismes régulateurs dissimulés, le *lanceur dalerte* redonne une scène à lépreuve. Il fait apparaître *linfrastructure comme lieu du politique*. Dans ce sens, il ne soppose pas frontalement à une loi ou à un décret : *il oppose la visibilité à lopacité, la parole à lautomatisation, la subjectivation à la captation*. Il démasque la *fausse neutralité* neutre, il perturbe le pouvoir qui prétend ne pas en être un.
Mais ce geste est aussi radicalement dangereux. Car en révélant larchitecture invisible de larchicration, il menace *la fiction fondamentale de la gouvernance post-normative* : celle selon laquelle il ny aurait plus dautorité, mais seulement des flux, des interfaces, des paramètres. *Il réintroduit la possibilité dune conflictualité là où lon prétendait avoir pacifié le monde*. Doù les châtiments qui frappent ces figures : exils, enfermements, diffamations, harcèlements judiciaires, neutralisation symbolique. La démocratie libérale, en théorie fondée sur la transparence, se révèle ici comme *hostile à ceux qui dévoilent la régulation réelle*. Elle protège lopacité sous couvert de stabilité.
Le *whistleblower* nest donc pas un héros romantique ou un martyr moral : *il est un opérateur critique de premier ordre dans la guerre archicratique contemporaine*. Il révèle que le régime archicratique oblitéré nest pas post-politique — il est anti-politique. Et que *la seule manière den reprendre la maîtrise passe par la révélation de ses architectures*. Le whistleblower opère une refiguration de lespace public : il *remet en scène* les dispositifs, *réinscrit* la conflictualité là où elle avait été oblitérée, *relance* lépreuve là où elle avait été dissoute.
Le *whistleblower* nest donc pas un héros romantique ou un martyr moral : *il est un opérateur critique de premier ordre dans la guerre archicratique contemporaine*. Il révèle que le régime archicratique oblitéré nest pas post-politique — il est anti-politique. Et que *la seule manière den reprendre la maîtrise passe par la révélation de ses architectures*. En cela, le lanceur dalerte opère une re-figuration de lespace public : il *remet en scène* les dispositifs, *réinscrit* la conflictualité là où elle avait été oblitérée, *relance* lépreuve là où elle avait été dissoute.
Si le *lanceur dalerte* incarne la figure du dévoilement, le *pirate informatique* (*hacker*), quant à lui, incarne celle du *forçage*. Là où le premier ouvre à la visibilité ce qui était tenu dans lombre, le second *intervient au cœur du dispositif*, non pour lexposer, mais pour *le détourner, le dérégler, le subvertir de lintérieur*. Le *hacker* est à la fois opérateur technique, acteur politique et *esthète de lincongru numérique*. Il ne soppose pas frontalement au pouvoir ; *il infiltre son code source*, il le déjoue, il lattaque en sa syntaxe même. En cela, il constitue une figure majeure du dissensus dans les régimes d*archicration oblitérée*.
@@ -1352,17 +1354,17 @@ En cela, cette phase terminale de la régulation numérique ne signe pas la fin
Nous voici donc face à un carrefour : soit larchicration se referme dans la transparence automatisée de son propre silence ; soit elle souvre à nouveau comme scène, comme adresse, comme espace disputable. Et cette ouverture, nul ne peut limposer — elle ne peut surgir que des gestes critiques, des insurrections infra-politiques, des bifurcations institutionnelles et technologiques que nous avons commencé ici à tracer. Il nous reste désormais à penser, dans le chapitre suivant, les conditions *archistratégiques* dun tel retournement : comment réinstituer une archicration *exposable*, *habitable*, *négociable* — cest-à-dire, au fond, pourrait-on dire *humaine* ?!?
Contre la désincarnation du pouvoir, contre la neutralisation algorithmique des différences, contre la réduction du monde vécu à des variables techniques, surgit une figure profondément transgressive : celle du *soulèvement situé*. Non pas une révolution abstraite, universelle, téléguidée, mais un cri, un geste, un ancrage — une insurrection qui part du corps, du lieu, de lhistoire vécue, et qui refuse de se laisser réduire à une ligne de code, un score comportemental ou un indicateur de performance. Cette figure, éclatée mais persistante, prend forme dans les luttes **antiracistes**, **féministes**, **écoféministes**, **décoloniales**, **intersectionnelles**, là où larchicration contemporaine prétend précisément avoir *résolu* le conflit par *lintégration*, *linclusion*, ou *lefficience*.
Contre la désincarnation du pouvoir, contre la neutralisation algorithmique des différences, contre la réduction du monde vécu à des variables techniques, surgit une figure profondément transgressive : celle du *soulèvement situé*. Non pas une révolution abstraite, universelle, téléguidée, mais un cri, un geste, un ancrage — une insurrection qui part du corps, du lieu, de lhistoire vécue, et qui refuse de se laisser réduire à une ligne de code, un score comportemental ou un indicateur de performance. Cette figure, éclatée mais persistante, prend forme dans les luttes antiracistes, féministes, écoféministes, décoloniales, intersectionnelles, là où larchicration contemporaine prétend précisément avoir *résolu* le conflit par *lintégration*, *linclusion*, ou *lefficience*.
Ce que ces luttes déploient, cest *lirréductibilité du vécu au format régulatoire*. Elles disent : linjustice nest pas seulement un déséquilibre quantifiable — cest une *blessure située*. Elles rappellent que toute régulation est aussi un *récit*, quelle découpe le monde selon des lignes de visibilité et dinvisibilité, de dignité et dindignité. Et cest précisément dans ces marges que le soulèvement situé opère son *renversement de focale* : il fait remonter lhistoire des corps niés, des voix disqualifiées, des mémoires oblitérées.
La figure du soulèvement situé est donc radicalement **anti-algorithmique**. Elle refuse labstraction, la dislocation, la dissociation. Elle est une réinscription. Elle réintroduit le *poids du lieu*, *la texture du corps*, *la densité du temps*. Les **mouvements féministes intersectionnels**, par exemple, montrent que la norme ne simpose jamais de manière neutre : elle frappe différemment selon les croisements de race, de genre, de classe, de sexualité, de capacité. Comme la montré bell hooks dans *Aint I a Woman?* (1981), luniversel abstrait nest souvent que le nom dissimulé dune exclusion fondée. Ce que produisent ces luttes, cest donc une **critique de luniversalité régulatoire** : elles mettent à nu les biais inscrits dans les structures, dans les algorithmes, dans les indicateurs, dans les dispositifs soi-disant neutres.
La figure du soulèvement situé est donc radicalement anti-algorithmique. Elle refuse labstraction, la dislocation, la dissociation. Elle est une réinscription. Elle réintroduit le *poids du lieu*, *la texture du corps*, *la densité du temps*. Les mouvements féministes intersectionnels, par exemple, montrent que la norme ne simpose jamais de manière neutre : elle frappe différemment selon les croisements de race, de genre, de classe, de sexualité, de capacité. Comme la montré bell hooks dans *Aint I a Woman?* (1981), luniversel abstrait nest souvent que le nom dissimulé dune exclusion fondée. Ce que produisent ces luttes, cest donc une critique de luniversalité régulatoire : elles mettent à nu les biais inscrits dans les structures, dans les algorithmes, dans les indicateurs, dans les dispositifs soi-disant neutres.
Les **luttes écoféministes** en particulier incarnent ce lien essentiel entre **le corps et le territoire**, entre **la dépossession écologique** et **la domination genrée**. Vandana Shiva, dans *Staying Alive: Women, Ecology, and Development* (1988), montre comment la logique extractiviste de léconomie mondiale repose sur une archicration qui invisibilise les savoirs situés, les soins invisibles, les agricultures de subsistance, les formes locales de résilience. Face à cela, le soulèvement situé ne propose pas une nouvelle machine de pouvoir : il propose une **régulation par réinscription**, une archicration réparatrice, lente, polyphonique, incarnée.
Les luttes écoféministes en particulier incarnent ce lien essentiel entre le corps et le territoire, entre la dépossession écologique et la domination genrée. Vandana Shiva, dans *Staying Alive: Women, Ecology, and Development* (1988), montre comment la logique extractiviste de léconomie mondiale repose sur une archicration qui invisibilise les savoirs situés, les soins invisibles, les agricultures de subsistance, les formes locales de résilience. Face à cela, le soulèvement situé ne propose pas une nouvelle machine de pouvoir : il propose une régulation par réinscription, une archicration réparatrice, lente, polyphonique, incarnée.
Enfin, les **mouvements décoloniaux**, en Amérique latine, en Afrique, dans les diasporas, dans les banlieues postcoloniales, posent la question la plus radicale : *Qui décide de la norme ?* Qui possède le pouvoir de réguler ? Qui est vu comme acteur politique, et qui est réduit à une cible de gouvernance ? Cette interrogation est centrale, comme le rappelle Frantz Fanon dans *Les damnés de la terre* (1961) : la violence coloniale nest pas seulement militaire ou économique — elle est *normative*. Elle impose *ce qui compte*, *ce qui vaut*, *ce qui existe*. Les soulèvements situés viennent désactiver cette violence, non par la prise du pouvoir, mais par *la reconstitution dun monde habitable* — un monde dans lequel la norme nest plus une abstraction venue den haut, mais un **tissage situé de récits, de voix, de vécus**.
Enfin, les mouvements décoloniaux, en Amérique latine, en Afrique, dans les diasporas, dans les banlieues postcoloniales, posent la question la plus radicale : *Qui décide de la norme ?* Qui possède le pouvoir de réguler ? Qui est vu comme acteur politique, et qui est réduit à une cible de gouvernance ? Cette interrogation est centrale, comme le rappelle Frantz Fanon dans *Les damnés de la terre* (1961) : la violence coloniale nest pas seulement militaire ou économique — elle est *normative*. Elle impose *ce qui compte*, *ce qui vaut*, *ce qui existe*. Les soulèvements situés viennent désactiver cette violence, non par la prise du pouvoir, mais par *la reconstitution dun monde habitable* — un monde dans lequel la norme nest plus une abstraction venue den haut, mais un tissage situé de récits, de voix, de vécus.
Ainsi, loin dêtre des revendications secondaires ou périphériques, ces figures du soulèvement situé constituent la **ligne de fuite la plus radicale** contre larchicration oblitérée. Elles en révèlent les angles morts, les fractures, les impensés. Elles nabolissent pas la régulation — elles la **redéfinissent depuis les marges**. Et cest précisément là que réside leur puissance critique, mais aussi leur capacité à nourrir une **archicration alternative**, pluraliste, réflexive, traversée par la conflictualité du monde réel.
Ainsi, loin dêtre des revendications secondaires ou périphériques, ces figures du soulèvement situé constituent la ligne de fuite la plus radicale contre larchicration oblitérée. Elles en révèlent les angles morts, les fractures, les impensés. Elles nabolissent pas la régulation — elles la redéfinissent depuis les marges. Et cest précisément là que réside leur puissance critique, mais aussi leur capacité à nourrir une archicration alternative, pluraliste, réflexive, traversée par la conflictualité du monde réel.
## **4.6 — Archidiagnostic, bilan tensionnel et projections dinstauration : vers une cinquième révolution régulatoire consciente**
@@ -1370,20 +1372,22 @@ Ainsi, loin dêtre des revendications secondaires ou périphériques, ces fig
Ce chapitre 4.6 ne se propose pas comme une synthèse terminale, encore moins comme une fermeture. Il est archidiagnostique, au sens fort : il vise à rendre intelligible, par une analyse stratifiée, *la logique proprement différentielle* des régimes de régulation que nous avons mis en évidence — leurs cohérences internes, leurs écarts fondamentaux, leurs continuités invisibles, leurs seuils de tension critique. Il ne sagit pas dénoncer des successions linéaires, mais de tracer la courbure dynamique des dispositifs archicratiques, en montrant comment arcalité, cratialité et archicration se recombinent à chaque phase historique selon des ratios distincts de visibilité, duniversalité, de coercition, de légitimité.
Mais cette cartographie ne serait rien si elle nouvrait pas aussi une bifurcation spéculative, rigoureusement fondée, vers une cinquième configuration régulatoire possible : non plus subie, non plus technique, non plus automatisée ni masquée, mais explicite, située, consciente, instituante. Ce que nous appelons ici « cinquième révolution régulatoire » nest pas un fantasme téléologique, ni une projection technicienne. Cest lhypothèse dune reconfiguration réflexive de la régulation, dans laquelle la scène elle-même — scène de lautorité, scène de la décision, scène du commun — est restaurée comme espace dépreuve, comme forme visible, comme infrastructure politique instituée et discutable.
Mais cette cartographie serait incomplète si elle nouvrait pas aussi une bifurcation spéculative, rigoureusement fondée, vers une cinquième configuration régulatoire possible : non plus subie, non plus technique, non plus automatisée ni masquée, mais explicite, située, consciente, instituante. Ce que nous appelons ici « cinquième révolution régulatoire » nest pas un fantasme téléologique, ni une projection technicienne. Cest lhypothèse dune reconfiguration réflexive de la régulation, dans laquelle la scène elle-même — scène de lautorité, scène de la décision, scène du commun — est restaurée comme espace dépreuve, comme forme visible, comme infrastructure politique instituée et discutable.
Cette cinquième révolution ne sera pas automatique : elle suppose un diagnostic clair de ce qui, dans les régimes antérieurs, a conduit à leffondrement de la scène, à la déshumanisation de la norme, à labstraction des épreuves. Elle exige de penser ensemble les figures de la vulnérabilité structurelle (fragilité des systèmes, opacité algorithmique, déconnexion sociale) et celles du dissensus instituant (lanceurs dalerte, pirates informatiques, luttes situées, formes de réinscription politique). Elle impose de comprendre que réguler, aujourdhui, ne peut plus signifier masquer ou automatiser — mais au contraire : *exposer, rendre contestable, instituer*.
Ainsi, la section 4.6 sera structuré selon une triple visée : dabord, rendre lisible la matrice triptyque ACA à travers les quatre régimes précédemment étudiés ; ensuite, dénouer les points de bascule, les seuils dinstabilité, les contradictions internes qui rendent la continuation du régime actuel insoutenable ; enfin, formuler une projection consciente, non prescriptive mais exploratoire, vers une cinquième archicration possible, définie non par sa technicité mais par sa capacité à réinstaurer lespace du commun comme scène de régulation explicite.
Ainsi, la section 4.6 sera structurée selon une triple visée : dabord, rendre lisible la matrice triptyque ACA à travers les quatre séquences historico-régulatrices précédemment étudiées ; ensuite, dénouer les points de bascule, les seuils dinstabilité et les contradictions internes qui rendent la continuation du régime actuel insoutenable ; enfin, formuler une projection consciente, non prescriptive mais exploratoire, vers une cinquième archicration possible, définie non par sa technicité mais par sa capacité à réinstaurer lespace du commun comme scène de régulation explicite.
La tâche est immense. Mais elle est surtout devenue urgente.
Il convient toutefois de préciser que les sections 4.2 à 4.5 ont suivi des séquences démergence historico-régulatrices, tandis que la matrice qui suit condense des régimes longs de domination relative, partiellement chevauchants, afin den faire apparaître la logique structurelle plutôt que den reconduire une lecture linéaire.
### 4.6.1 — Cartographie des régimes archicratiques : matrice ACA
### **4.6.1 — Cartographie des régimes archicratiques : matrice ACA**
Lenjeu ici nest pas seulement classificatoire. Il est *épistémogénétique*. Ce que nous avons désigné tout au long de notre essai-thèse comme *Archicratie* ne peut désormais plus être pensé comme un concept figé, ni comme une fonction invariante du pouvoir, mais comme une structure évolutive, dont les configurations historiques concrètes sont articulées selon trois dimensions fondamentales : l*arcalité* (formes dinfrastructure du pensable et du faisable), la *cratialité* (formes dactivation de la puissance régulatrice), et l*archicration* proprement dite (niveaux dintégration, dexposition, de délibération, ou deffacement de la scène régulatrice).
Il ne sagit donc pas ici de répéter ce qui a été dit, mais de recomposer une lecture différentielle des quatre grands régimes que nous avons dégagés, à travers une matrice systémique triptyque ACA. Cette triple entrée permet de faire émerger non seulement les contrastes, mais aussi les dynamiques de tension, de translation, de refoulement, ou dexacerbation qui affectent les régimes de régulation dans le temps long de la modernité industrielle et post-industrielle.
Cette matrice ne doit donc pas être lue comme un tableau de successions closes ni comme un récit de substitution aux périodisations historiques classiques, mais comme un outil de condensation heuristique permettant de faire apparaître, dans la longue durée, des régimes de domination relative dont les frontières demeurent poreuses, chevauchées et historiquement réversibles.
#### **I. Le régime proto-industriel (env. 17801914) — Régulation disciplinaire-visible**
Dans ce premier régime, que lon peut rattacher à la première révolution industrielle et à la montée du pouvoir disciplinaire (Michel Foucault, *Surveiller et punir*, 1975), l*arcalité* est *matérielle et visible*. Elle sincarne dans des formes spatiales localisées : usines, casernes, hospices, prisons, écoles. Lespace est compartimenté, lordre est topographié. Les dispositifs de surveillance et de distribution (panoptisme, inspection, quadrillage) constituent les armatures visibles de la régulation.
@@ -1392,10 +1396,10 @@ La *cratialité*, quant à elle, repose sur *la force individuelle modulée*, su
Enfin, l*archicration* se donne encore *comme scène explicite* : le pouvoir est visible, incarné, hiérarchisé ; la régulation est *disciplinaire, située, incarnée* dans des corps de métiers, des figures dautorité, des lieux denfermement. Lautorité est identifiable, le commandement localisé, lépreuve régulatoire vécue comme interpellation directe.
→ *Matrice ACA* (17801914) :
*Arcalité* : visible, localisée, spatialisée
*Cratialité* : corporelle, disciplinaire, gestuelle
*Archicration* : incarnée, explicite, hiérarchique
> → *Matrice ACA* (17801914) :
> *Arcalité* : visible, localisée, spatialisée
> *Cratialité* : corporelle, disciplinaire, gestuelle
> *Archicration* : incarnée, explicite, hiérarchique
#### **II. Le régime fordo-planificateur (env. 19181973) — Régulation technobureaucratique-planifiée**
@@ -1403,12 +1407,12 @@ Ce régime, forgé dans les feux croisés de la rationalisation fordiste, de la
La *cratialité* sinstitue *sur le mode collectif* : elle mobilise des masses, des corps agrégés, des gestes synchronisés par la division scientifique du travail. Taylorisme et fordisme sont les matrices de cette *cratialité systémique*, productiviste, disciplinante à large échelle.
L*archicration*, dans ce régime, devient *stabilisatrice et concertée* : elle repose sur des compromis historiques (pacte fordiste, conventions collectives, co-gestion syndicale), qui donnent lieu à des *formes de régulation formalisées, visibles, négociées*. Le conflit social est reconnu, encadré, régulé. La scène régulatoire est organisée par des institutions politiques, économiques et sociales qui en assurent la visibilité, la représentation, lintelligibilité.
L*archicration*, dans ce régime, devient *stabilisatrice et concertée* : elle repose sur des compromis historiques (pacte fordiste, conventions collectives, co-gestion syndicale), qui donnent lieu à des formes de *régulation formalisées, visibles, négociées*. Le conflit social est reconnu, encadré, régulé. La scène régulatoire est organisée par des institutions politiques, économiques et sociales qui en assurent la visibilité, la représentation, lintelligibilité.
→ *Matrice ACA* (19181973) :
*Arcalité* : technobureaucratique, infrastructurelle, standardisée
*Cratialité* : collectivisée, synchronisée, encadrée
*Archicration* : institutionnalisée, délibérée, stabilisatrice
> → *Matrice ACA* (19181973) :
> *Arcalité* : technobureaucratique, infrastructurelle, standardisée
> *Cratialité* : collectivisée, synchronisée, encadrée
> *Archicration* : institutionnalisée, délibérée, stabilisatrice
#### **III. Le régime néolibéral-cybernétique (env. 19732010) — Régulation algorithmique-distribuée**
@@ -1418,10 +1422,10 @@ La *cratialité*, ici, se loge dans le *signal*. Elle cesse dêtre lactiva
L*archicration* se *disperse et sefface*. Le pouvoir se loge dans les interfaces, les algorithmes, les conventions techniques. Il nest plus visible, ni même situé. La scène régulatrice se retire derrière les infrastructures : elle devient *gouvernance sans garant, gestion sans politique, régulation sans représentation*. Le pouvoir opère sans apparaître.
→ *Matrice ACA* (19732010) :
*Arcalité* : réticulaire, systémique, logique
*Cratialité* : signalétique, inférentielle, informationnelle
*Archicration* : oblitérée, automatisée, dépolitisée
> → *Matrice ACA* (19732010) :
> *Arcalité* : réticulaire, systémique, logique
> *Cratialité* : signalétique, inférentielle, informationnelle
> *Archicration* : oblitérée, automatisée, dépolitisée
#### **IV. Le régime algorithmique-oblitérant (env. 20102025) — Régulation prédictive-effacée**
@@ -1431,14 +1435,14 @@ La *cratialité*, elle, devient *anticipatoire*. *Elle vise à prédire, pré-co
L*archicration*, dans cette configuration, est *oblitérée à un niveau tel quil ny a plus de scène*. Il ny a plus de conflit représentable, plus dépreuve négociable, plus de contradiction visible. La norme nest plus énoncée : elle est *encodée*. Le sujet nest plus interpellé : il est filtré, mesuré, noté, profilé. Cest le règne de la *régulation sans preuve ni procès*, selon lexpression quil faut désormais consacrer.
→ *Matrice ACA* (20102025) :
*Arcalité* : invisible, architecturale, codée
*Cratialité* : prédictive, comportementale, probabiliste
*Archicration* : effacée, désincarnée, silencieuse
> → *Matrice ACA* (20102025) :
> *Arcalité* : invisible, architecturale, codée
> *Cratialité* : prédictive, comportementale, probabiliste
> *Archicration* : effacée, désincarnée, silencieuse
Ce schéma triptyque, cette matrice dynamique ACA, constitue le socle fondamental de la section suivante. Il rend possible une lecture en écarts et tensions, en transitions et basculements. Car ce que cette cartographie fait émerger, au-delà des différences, cest laccélération de leffacement : à mesure que les régimes se perfectionnent techniquement, la scène du pouvoir se dérobe, sefface, sautomatise — jusquà oblitérer lexpérience même du conflit. Cest là le seuil critique. Cest là que doit être pensée lhypothèse nécessaire dun retournement conscient.
### 4.6.2 — Tensions, bifurcations, seuils dinstabilité : pour une trialectique régulatoire
### **4.6.2 — Tensions, bifurcations, seuils dinstabilité : pour une trialectique régulatoire**
Il ne suffit pas didentifier des séquences historiques de la régulation pour en comprendre la dynamique profonde. Il faut saisir ce qui dans chaque régime en vient à excéder ses propres dispositifs, à disjoindre ses fondements internes, à faire imploser ses structures de légitimation. Ce que nous appelons ici *bifurcation* nest donc ni un tournant linéaire, ni un simple glissement conjoncturel, mais un moment dinstabilité radicale où la triade *arcalitécratialitéarchicration* se déséquilibre au point de rendre impossible le maintien du régime sans reconfiguration complète. Chaque mutation historique correspond alors à un seuil de tension maximale, où les dispositifs régulatoires en place ne parviennent plus à absorber ni à articuler les contradictions quils ont eux-mêmes engendrées. Il nous faut ici construire une *trialectique régulatoire des crises*, non pas comme succession, mais comme *épuisement dun modèle de régulation*.
@@ -1460,15 +1464,15 @@ Ce moment nest pas un retour au libéralisme classique : cest une mutation
#### Crise post-2008 et effondrement différé du régime néolibéral : vers larchicration oblitérée
La dernière grande inflexion, celle que nous vivons encore, prend sa source dans la **crise financière globale de 2008**. La bulle spéculative des subprimes, leffondrement de Lehman Brothers, les plans de sauvetage massifs et la reprise de la planche à billets (quantitative easing) exposent au grand jour les fragilités du système néolibéral. Pourtant, cette fois-ci, aucun régime alternatif ne parvient à simposer. LÉtat revient brièvement comme agent de stabilisation, mais il ne propose plus darchitecture régulatrice substantielle. Il ny a plus de New Deal. Plus de grand récit. Plus dutopie fédératrice.
La dernière grande inflexion, celle que nous vivons encore, prend sa source dans la crise financière globale de 2008. La bulle spéculative des subprimes, leffondrement de Lehman Brothers, les plans de sauvetage massifs et la reprise de la planche à billets (quantitative easing) exposent au grand jour les fragilités du système néolibéral. Pourtant, cette fois-ci, aucun régime alternatif ne parvient à simposer. LÉtat revient brièvement comme agent de stabilisation, mais il ne propose plus darchitecture régulatrice substantielle. Il ny a plus de New Deal. Plus de grand récit. Plus dutopie fédératrice.
Cest ici que sinstalle ce que nous avons nommé, dans tout le chapitre 4.5, **larchicration oblitérée**. La scène de régulation nest pas abolie : elle est dissimulée. Elle sautomatise, sencapsule, se déterritorialise dans les data centers, les architectures de cloud, les IA prédictives, les nudges comportementaux, les plateformes souveraines. La régulation seffectue, mais *hors de toute scène identifiable, discutable ou incarnée*.
Cest ici que sinstalle ce que nous avons nommé, dans tout le chapitre 4.5, larchicration oblitérée. La scène de régulation nest pas abolie : elle est dissimulée. Elle sautomatise, sencapsule, se déterritorialise dans les data centers, les architectures de cloud, les IA prédictives, les nudges comportementaux, les plateformes souveraines. La régulation seffectue, mais *hors de toute scène identifiable, discutable ou incarnée*.
Cette configuration repose sur un triple effacement : de la légitimité explicite, de la souveraineté politique, de la conflictualité reconnue. Larcalité devient invisible, la cratialité anticipatoire, larchicration dissoute. Ce régime nest pas moins performant — il est plus dangereux. Car il rend la critique structurellement inaudible, la résistance presque illisible, la reconfiguration politique impraticable.
En somme, à travers ces trois seuils dinstabilité (1929, 1973, 2008), se dessine une logique plus profonde que celle dune simple succession : **la logique des bifurcations archicratiques**. Chaque régime ne meurt pas de ses ennemis, mais de ses contradictions internes ; chaque transition ne procède pas dun renversement idéologique, mais dune **crise immanente de la capacité régulatrice**, selon les trois axes de notre trialectique. Cest cette structure que nous devons désormais rendre pleinement opératoire — pour penser la possibilité, la nécessité, et peut-être lurgence dun *cinquième régime régulatoire*, conscient, exposé, institué comme *scène archicratique ouverte*.
En somme, à travers ces trois seuils dinstabilité (1929, 1973, 2008), se dessine une logique plus profonde que celle dune simple succession : la logique des bifurcations archicratiques. Chaque régime ne meurt pas de ses ennemis, mais de ses contradictions internes ; chaque transition ne procède pas dun renversement idéologique, mais dune crise immanente de la capacité régulatrice, selon les trois axes de notre trialectique. Cest cette structure que nous devons désormais rendre pleinement opératoire — pour penser la possibilité, la nécessité, et peut-être lurgence dun *cinquième régime régulatoire*, conscient, exposé, institué comme *scène archicratique ouverte*.
### 4.6.3 — Critique de la régulation automatisée : du fantasme dauto-pilotage à la décomposition de la scène politique
### **4.6.3 — Critique de la régulation automatisée : du fantasme dauto-pilotage à la décomposition de la scène politique**
Ce que la quatrième configuration archicratique contemporaine a porté à son point dintensité maximal, cest moins une stabilisation efficiente du monde par la technologie quun fantasme technogénétique dauto-pilotage régulatoire — un rêve cybernétique devenu dogme gestionnaire : celui selon lequel un monde complexe pourrait être gouverné sans sujet, sans instance tierce, sans conflit, sans institution. Lillusion, ici, nest pas tant celle dune surpuissance technique, que celle dune *autorégulation sans scène*, où tout se jouerait dans la fluence des flux, la continuité des données, la plasticité des ajustements instantanés. Cest cette croyance dans lauto-équilibrage algorithmique du social qui, aujourdhui, manifeste ses effets délétères les plus profonds : fragilité structurelle, défaillance systémique, dépolitisation radicale et oblitération du dissensus.

View File

@@ -12,26 +12,26 @@ source:
kind: docx
path: "sources/docx/archicrat-ia/Prologue—Archicratie-fondation_et_finalite_sociopolitique_et_historique-version_officielle.docx"
---
Nous vivons dans une époque saturée de diagnostics sur les formes de domination, les mutations du pouvoir, les détournements de la souveraineté. Depuis une vingtaine dannées, les appellations saccumulent : *démocratie illibérale*, *ploutocratie*, *happycratie*, *gouvernement algorithmique*, *démocrature*… À travers ces tentatives de nommer le désordre du présent, un fait se répète, de manière sourde : la scène politique semble désorientée. Les catégories héritées — *État*, *pouvoir*, *représentation*, *volonté générale*, *contrat social* — apparaissent de moins en moins capables de décrire ce qui nous gouverne effectivement.
Nous vivons une époque saturée de diagnostics sur les formes de domination, les mutations du pouvoir, les détournements de la souveraineté. Depuis une vingtaine dannées, les appellations saccumulent : *démocratie illibérale*, *ploutocratie*, *happycratie*, *gouvernement algorithmique*, *démocrature*… À travers ces tentatives de nommer le désordre du présent, un fait se répète, de manière sourde : la scène politique semble désorientée. Les catégories héritées — *État*, *pouvoir*, *représentation*, *volonté générale*, *contrat social* — apparaissent de moins en moins capables de décrire ce qui nous gouverne effectivement.
Cest cette perte de prise sur le réel que ce livre souhaite prendre au sérieux. Non pour lui ajouter un terme de plus au lexique fatigué des contre-pouvoirs ou des impuissances, mais pour repartir dun point plus fondamental, presque en-deçà de la question politique classique. Ce point, cest celui de la *tenue dun monde commun* — cest-à-dire la possibilité, pour des êtres dissemblables, vulnérables, inégaux, traversés de contradictions et situés dans des temporalités hétérogènes, de coexister sans sannihiler.
Cette tenue du monde néquivaut ni à la paix civile, ni à la stabilité des institutions, ni à lordre établi. Cest une difficulté conceptuelle que denvisager *la possibilité pour un ordre de durer sans seffondrer*, alors même quil est traversé en permanence par des forces et des légitimités qui le travaillent, léprouvent, le modifient, lusent, le contestent, le prolongent ou le sapent. Cette possibilité de tenir le monde commun, nous la nommons *co-viabilité*.
Le terme nest pas trivial. Il ne sagit pas simplement dune viabilité partagée, ni dune coexistence pacifique, ni même dune durabilité écologique élargie. Il sagit dun état dynamique, instable, fragile, dans lequel un ensemble — une société, dun système biologique, dune formation historique, dun milieu technique ou dun monde institué — parvient à maintenir une *existence viable*, *malgré et grâce à ses tensions constitutives*.
Le terme nest pas trivial. Il ne désigne ni une simple viabilité partagée, ni une coexistence pacifiée, ni une durabilité écologique élargie. Il renvoie à la possibilité, toujours fragile, pour un monde hétérogène de maintenir une existence viable en travaillant, sans les abolir, les tensions qui le traversent.
La *co-viabilité* ne désigne ni un état déquilibre, ni une finalité normative. Elle nomme un état dynamique et instable, dans lequel un monde — société, milieu technique, formation historique — tient non pas par homogénéité ou harmonie, mais parce quil parvient à réguler ce qui le menace sans se détruire lui-même. Il compose entre des éléments hétérogènes — forces dinertie et dinnovation, attachements profonds et ruptures nécessaires — sans chercher à les unifier. Cest cette disposition active, faite de compromis fragiles et dajustements toujours révisables, que nous tenons pour première, et non dérivée.
La *co-viabilité* ne désigne ni un état déquilibre, ni une finalité normative. Elle nomme un état dynamique et instable, dans lequel un ensemble — une société, un système biologique, une formation historique, un milieu technique ou un monde institué — tient non pas par homogénéité ou harmonie, mais parce quil parvient à réguler ce qui le menace sans se détruire lui-même. Il compose entre des éléments hétérogènes — forces dinertie et dinnovation, attachements profonds et ruptures nécessaires — sans chercher à les unifier. Cest cette disposition active, faite de compromis fragiles et dajustements toujours révisables, que nous tenons pour première, et non dérivée.
Ce qui revient à dire que la question politique — au sens fort — na peut-être jamais été qui commande ? Mais bien plus : *Comment un ordre tient-il malgré ce qui le défait ?* *Quels sont les dispositifs qui permettent à une société de ne pas se désagréger sous leffet de ses propres contradictions ?* *Comment sont régulées les tensions qui traversent le tissu du monde commun sans le déchirer ?*
Cette bascule de perspective prolonge des intuitions anciennes. Max Weber (*Économie et société*, 1922) rappelait que ce qui fait tenir un ordre, ce nest pas seulement la force ou la loi, mais les « chances de validité » socialement reconnues. Norbert Elias (*La dynamique de lOccident*, 1939/1975) montrait, quant à lui, que les sociétés se maintiennent par des équilibres toujours précaires entre interdépendances, rivalités et pacifications. Notre démarche sinscrit dans ce sillage : travailler cette interrogation sur les *conditions de viabilité dun monde commun*.
Ce qui revient à dire que la question politique — au sens fort — na peut-être jamais été : qui commande ? Mais, plus profondément : *Comment un ordre tient-il malgré ce qui le défait ?* *Quels sont les dispositifs qui permettent à une société de ne pas se désagréger sous leffet de ses propres contradictions ?* *Comment sont régulées les tensions qui traversent le tissu du monde commun sans le déchirer ?*
Cette bascule de perspective prolonge des intuitions anciennes. Max Weber (*Économie et société*, 1922) rappelait que ce qui fait tenir un ordre, ce nest pas seulement la force ou la loi, mais les « chances de validité » socialement reconnues. Norbert Elias (*La dynamique de lOccident*, 1939/1975) montrait, quant à lui, que les sociétés se maintiennent par des équilibres toujours précaires entre interdépendances, rivalités et pacifications. Notre démarche sinscrit dans ce sillage : travailler cette interrogation sur les *conditions de viabilité dun monde commun*.
Ce changement de perspective implique une rupture profonde dans la manière même de poser la question politique. Pendant des siècles, les sociétés ont pensé le politique à partir de principes transcendants — Dieu, Nature, Volonté générale, Pacte social. Ces principes, supposés extérieurs aux conflits du présent, garantissaient lordre en surplomb. Comme le rappelle Michel Foucault, il ny a pas de principe extérieur au jeu des forces : seulement des rapports de pouvoir situés, modulés, réversibles. Cest précisément cette exigence — trouver dans les relations elles-mêmes les ressources nécessaires pour maintenir des mondes vivables — qui définit notre époque.
Ce qui émerge nest pas de nouveaux principes, ni une nouvelle idéologie, mais une exigence beaucoup plus modeste, mais aussi beaucoup plus difficile à satisfaire : celle de trouver dans les relations elles-mêmes — entre groupes, entre institutions, entre individus, entre temporalités — les ressources nécessaires pour maintenir leurs mondes viables. Autrement dit : cest *dans* les tensions, *à même* les conflits, *au sein* des alliances, *au cœur* des désaccords et des polémiques, que semble se construire la régulation. Non plus *au-dessus*, par un décret transcendant, mais *au-dedans*, par un agencement toujours révisable. Cest cela que nous voulons dire — sans technicité inutile — quand nous parlons dun déplacement vers une *instance de régulation située de co-viabilité* : un espace commun où les forces hétérogènes, souvent antagonistes, peuvent coexister, se contredire, se confronter, séprouver, sans se détruire mutuellement.
Ce qui émerge, ce ne sont pas de nouveaux principes ni une nouvelle idéologie, mais une exigence beaucoup plus modeste, et aussi beaucoup plus difficile à satisfaire : celle de trouver dans les relations elles-mêmes — entre groupes, entre institutions, entre individus, entre temporalités — les ressources nécessaires pour maintenir leurs mondes viables. Autrement dit : cest *dans* les tensions, *à même* les conflits, *au sein* des alliances, *au cœur* des désaccords et des polémiques, que semble se construire la régulation. Non plus *au-dessus*, par un décret transcendant, mais *au-dedans*, par un agencement toujours révisable. Cest cela que nous voulons dire — sans technicité inutile — quand nous parlons dun déplacement vers une *instance de régulation située de co-viabilité* : un espace commun où les forces hétérogènes, souvent antagonistes, peuvent coexister, se contredire, se confronter, séprouver, sans se détruire mutuellement.
Penser le politique depuis cette approche, cest renoncer à lidée même quun ordre puisse se fonder définitivement, une fois pour toutes. Cest reconnaître que ce qui fait tenir une société nest jamais un principe unique, un commandement souverain, une légitimité première, mais *un espace dépreuve toujours rejoué* où se négocient, se recadrent, sopposent, sajustent des forces hétérogènes dont laccord est constamment partiel, toujours temporaire, perpétuellement instable.
Par conséquent, un ordre durerait moins par ses fondements proclamés que par ses *capacités régulatrices effectives*. Autant dire que ce sont les dispositifs, les formats, les médiations — parfois massifs, parfois imperceptibles — par lesquels un ordre parvient à faire coexister ce qui, en droit, pourrait sexclure : des intérêts antagonistes, des affects discordants, des récits historiques incompatibles, des régimes de valeur irréconciliables, des temporalités sociales déphasées, des exigences contradictoires en matière de justice, d'efficacité, de mémoire ou d'avenir.
Par conséquent, un ordre durerait moins par ses fondements proclamés que par ses *capacités régulatrices effectives*. Autant dire que ce sont les dispositifs, les formats, les médiations — parfois massifs, parfois imperceptibles — par lesquels un ordre parvient à faire coexister ce qui, en droit, pourrait sexclure : des intérêts antagonistes, des affects discordants, des récits historiques incompatibles, des régimes de valeur irréconciliables, des temporalités sociales déphasées, des exigences contradictoires en matière de justice, defficacité, de mémoire ou davenir.
Cet ordre ne les efface pas. Il ne les réconcilie pas dans un consensus fictif. Il ne les fusionne pas dans une synthèse idéologique illusoire. Il les tient ensemble sans les résoudre, par des équilibres instables, des arrangements contingents, des formats dajustement plus ou moins durables. Cest là que se situe toute la puissance — et la fragilité — de la régulation : tenir sans annuler, moduler sans effacer, organiser sans clore.
@@ -47,21 +47,21 @@ Cela ne veut pas dire que le politique ait disparu, mais plutôt quil tend pe
Cest un marché carbone qui, au nom de seuils agrégés à léchelle continentale, conduit à la fermeture dun site industriel local, sans quaucune figure politique ne puisse rendre visible ni opposable larbitrage opéré. Cest un algorithme de régulation hospitalière qui, face à une tension budgétaire ou épidémiologique, déprogramme automatiquement des interventions chirurgicales — sans quaucun médecin, aucun patient, aucun responsable politique ne puisse véritablement en discuter les critères. Cest une plateforme numérique de traitement des titres de séjour qui suspend une demande pour “anomalie de saisie”, sans contact humain, sans justification claire, sans voie de recours instituée. Cest un logiciel de pilotage budgétaire, adossé à des indicateurs defficience, qui impose la réduction dune politique sociale sans passage par une arène délibérative. Cest aussi un score algorithmique de risque bancaire qui écarte discrètement une famille dun prêt, bien avant quelle ait pu formuler son projet.
Contrairement aux apparences, ce qui soffre au regard nest plus la figure massive du pouvoir trônant dans la clarté de ses apparats, mais la trame patiente dune régulation en mouvement. Disparues, les instances fixes ; effacée, la demeure solennelle de lautorité. Le réel geste de gouvernance sinsinue insidieusement dans des protocoles, se glisse sournoisement dans la routine, sentrelace irrémédiablement dans les habitudes, se ramifie inextricablement dans dinnombrables appareils sans visage. Nul acte inaugural nen marque ostensiblement la naissance, nulle proclamation nen scande les rythmes. On constate seulement que la régulation avance sans fracas, tisse patiemment la toile discrète sur laquelle se déplacent nos vies. Ce nest plus tant le décret ni la loi qui pèsent,bien plus les enchevêtrements de normes, limperceptible maillage de procédures et lajustement continu de directives flexibles.
Contrairement aux apparences, ce qui soffre au regard nest plus la figure massive du pouvoir trônant dans la clarté de ses apparats, mais la trame patiente dune régulation en mouvement. Les instances fixes ont disparu ; la demeure solennelle de lautorité sest effacée. Le geste réel de gouvernance sinsinue dans des protocoles, se glisse dans la routine, sentrelace dans les habitudes, se ramifie dans dinnombrables appareils sans visage. Nul acte inaugural nen marque ostensiblement la naissance, nulle proclamation nen scande les rythmes. On constate seulement que la régulation avance sans fracas et tisse patiemment la toile discrète sur laquelle se déplacent nos vies. Ce ne sont plus tant le décret ou la loi qui pèsent que les enchevêtrements de normes, limperceptible maillage de procédures et lajustement continu de directives flexibles.
La contrainte naccable plus par lostentation de lordre, mais sinocule par la subtilité des systèmes. Ainsi, il sagit désormais de façonner, par lagencement soigné déquilibres, de données, de flux, où chacun se trouve relié, indexé, impliqué à même cette dentelle administrative, sans jamais croiser le centre, sans jamais savoir nommer celui ou ce qui agit. La régulation moderne tresse ainsi un univers de seuils mobiles et dagencements souples, où lon ne peut jamais tout à fait fixer le moment ni le lieu du pouvoir agissant — mais où, à chaque pli de la vie collective, se lit lempreinte dune architecture invisible.
La contrainte naccable plus par lostentation de lordre, mais sinocule par la subtilité des systèmes. Désormais, lagencement déquilibres, de données et de flux façonne un monde où chacun se trouve relié, indexé, impliqué dans cette dentelle administrative, sans jamais croiser le centre, sans jamais savoir nommer celui ou ce qui agit. La régulation moderne tresse ainsi un univers de seuils mobiles et dagencements souples, où lon ne peut jamais tout à fait fixer le moment ni le lieu du pouvoir agissant — mais où, à chaque pli de la vie collective, se lit lempreinte dune architecture invisible.
La difficulté dy résister tient moins à une violence perceptible quà leur ontologie dévidence. Elles ne savancent pas comme autorités, ne se proclament pas comme pouvoir: elles fonctionnent, nous relient et donc elles opèrent. Et cette opération sans légitimation démocratique — pouvoir sans figure, contrainte sans théâtre — rend caduques nos anciennes grilles dinterprétation. Désormais, ce qui nous affecte le plus ne sénonce plus, il simpose sans discours jusquau plus intime.
La difficulté dy résister tient moins à une violence perceptible quà leur évidence ontologique. Elles ne savancent pas comme des autorités, ne se proclament pas comme pouvoir : elles fonctionnent, nous relient et, ce faisant, opèrent. Et cette opération sans légitimation démocratique — pouvoir sans figure, contrainte sans théâtre — rend caduques nos anciennes grilles dinterprétation. Désormais, ce qui nous affecte le plus ne sénonce plus ; il simpose sans discours jusquau plus intime.
Cela signifie que le politique sest décousu de ses formes historiques. Il continue dagir, de décider, dorienter — mais sous dautres modalités, dans dautres lieux, avec dautres instruments, selon des régimes dopérativité quaucune des catégories anciennes ne parvient plus à saisir, à rendre intelligible et à traduire sans trahir.
Autrement dit, nous avons changé dépoque sans encore avoir pu changé de lexique. Nous continuons de penser avec des formes obsolètes ce qui sactive sous nos yeux. Nous employons les mots dhier pour décrire des processus qui les excèdent de toutes parts. Nous parlons de gouvernements, là où il faudrait parler de structures de régulation composite. Nous discutons de lois, là où il faudrait décrire des protocoles, des seuils, des scénographies dajustement, des mécanismes de *feedback* algorithmique, des normes sans normalisateurs.
Autrement dit, nous avons changé dépoque sans encore avoir pu changer de lexique. Nous continuons de penser avec des formes obsolètes ce qui sactive sous nos yeux. Nous employons les mots dhier pour décrire des processus qui les excèdent de toutes parts. Nous parlons de gouvernements, là où il faudrait parler de structures de régulation composite. Nous discutons de lois, là où il faudrait décrire des protocoles, des seuils, des scénographies dajustement, des mécanismes de *feedback* algorithmique, des normes sans normalisateurs.
Cette disjonction entre lexpérience vécue de la contrainte et le vocabulaire disponible pour la dire nest pas quun problème théorique. Elle produit une désorientation profonde. Elle empêche de penser le réel, de localiser les responsabilités et rend inopérantes les critiques. Elle altère la capacité collective à formuler des exigences, jusquà dissoudre les repères et les registres daction.
Cette impuissance démocratique généralisée à nommer, situer, orienter les formes réelles de la régulation se donne parfois à voir dans des situations dapparente clarté — et cest peut-être là le plus troublant. Prenons un exemple rendu brûlant par lactualité française en 2025 : la proposition de ce que lon appelle la *taxe Zucman*. Formulée par léminent économiste Gabriel Zucman, cette mesure vise à instaurer un impôt minimal annuel sur le patrimoine des ultra-riches — en France et dans le monde — au-delà dun seuil (autour de 100 millions deuros). Le taux proposé est denviron 2 % sur la valeur totale du patrimoine net, quil soit liquide ou partiellement non liquide (actions non cotées, participations, biens immobiliers), ce qui pose des défis de paiement et dévaluation.
Lidée est de corriger ce que Zucman identifie comme un déséquilibre fiscal majeur : les très grandes fortunes paient aujourdhui, proportionnellement, beaucoup moins que ce que permettrait une imposition équitable et progressive, notamment en raison de lévasion fiscale, de la mise sous structures opaques par *holding*, du transfert du patrimoine privée en patrimoine professionnel ou de la dissociation entre richesse effective et revenu imposable.
Lidée est de corriger ce que Zucman identifie comme un déséquilibre fiscal majeur : les très grandes fortunes paient aujourdhui, proportionnellement, beaucoup moins que ce que permettrait une imposition équitable et progressive, notamment en raison de lévasion fiscale, de la mise en structures opaques via des *holdings*, du transfert du patrimoine privé en patrimoine professionnel ou de la dissociation entre richesse effective et revenu imposable.
Si cette proposition est débattue publiquement — soutenue dans certains milieux politiques, évoquée dans les médias, portée par des organisations internationales — elle ne sest pourtant pas traduite jusquà présent en un espace de régulation pleinement opérationnel : pas de dispositif stable, pas de mécanisme universel, pas dinstance de coordination internationale suffisamment puissante ni opposable pour rendre cette taxe effective à léchelle voulue.
@@ -73,7 +73,7 @@ Ce hiatus, cette fracture, ce décrochage entre lenjeu perceptible dans le
Et face à cette évanescence, deux réflexes saffrontent. Lun, nostalgique, cherche à réhabiliter les anciennes figures du pouvoir : lautorité, la loi, la souveraineté, comme si elles pouvaient encore réactiver un ordre en désagrégation. Lautre, sceptique, postule quil ny a plus rien à faire — que nous vivons lépuisement définitif de larène politique, sa disparition dans le flux, le calcul, le désordre entropique des systèmes.
Pour autant quelque chose continue dagir, de structurer, de différencier, même en labsence de pouvoir identifiable. Ce quelque chose, cest la manière dont une société régule ses tensions internes : non plus en les effaçant, mais en les tenant, en les exposant, en les configurant dans des dispositifs — visibles ou non — capables de contenir sans abolir, de moduler sans figer, de différer sans éluder.
Pour autant, quelque chose continue dagir, de structurer, de différencier, même en labsence de pouvoir identifiable. Ce quelque chose, cest la manière dont une société régule ses tensions internes : non plus en les effaçant, mais en les tenant, en les exposant, en les configurant dans des dispositifs — visibles ou non — capables de contenir sans abolir, de moduler sans figer, de différer sans éluder.
Nous devons donc reprendre à neuf la question la plus enfouie de la politique : *quest-ce qui fait quun monde collectif tient ?* Non plus dans labstrait, mais dans la matérialité de ses pratiques, la texture de ses conflits, larchitecture de ses médiations. *Par quels agencements tient-il ?* *À travers quelles épreuves ? Selon quelles temporalités ? Et sous quelles conditions de réversibilité ?*
@@ -85,7 +85,7 @@ Or ce qui sefface désormais, cest la capacité collective à en formuler
Ces termes politiques sorganisent autour de deux grands suffixes — *-archie* et *-cratie* — forgés dans les débats de la Grèce antique, et largement sédimentés dans les lexiques modernes. Les suffixes en -*archie* désignent un *pouvoir fondé sur un principe premier* (*arkhè*), une origine ou une légitimité verticale : monarchie, oligarchie, etc. Ceux en -*cratie* désignent plutôt les *modalités pratiques dexercice du pouvoir* (*kratos*) : démocratie, technocratie, bureaucratie, etc.
Cette distinction entre fondement et exercice, légitimation et opération, traverse toute la modernité politique. Cependant cette séparation ne permet plus aujourdhui de saisir la réalité des régulations effectives. Car les scènes d*arkhè* se sont en grande partie effondrées sans être remplacées, tandis que les *kratos* contemporains tendent à sexercer sans adresse, sans représentation, sans théâtre. Lon disserte sur les vertus de la démocratie, mais le *dèmos* na plus de lieu de confrontation effective : *serait-ce la rue ? Seraient-ce les réseaux sociaux ? Seraient-ce les médias ? Serait-ce le Parlement ?* Force est de constater quil nen est rien : la première est réprimée ; les seconds sont filtrés et compartimentés ; les suivants sont contrôlés par une poignée de milliardaires ; et ce dernier est loin de représenter lentièreté de la société. Lon invoque la République, mais la *res publica* — la chose publique, appellation la plus vague et la plus creuse que lon puisse donner de lespace politique — se dissout dans des logiques qui échappent à toute délibération commune : absence de débat, passage en force, brutalisme institutionnel. Quant au langage politique, il continue dénoncer des structures et des projets, mais il ne parvient pas à décrire les opérations effectives de régulation tant le système socio-économique, en plus de sêtre libéralisé et privatisé, sest étendu et complexifié tout en confiant les leviers daction au niveau supranational.
Cette distinction entre fondement et exercice, légitimation et opération, traverse toute la modernité politique. Cependant, cette séparation ne permet plus aujourdhui de saisir la réalité des régulations effectives. Car les scènes d*arkhè* se sont en grande partie effondrées sans être remplacées, tandis que les *kratos* contemporains tendent à sexercer sans adresse, sans représentation, sans théâtre. Lon disserte sur les vertus de la démocratie, mais le *dèmos* na plus de lieu de confrontation effective : *serait-ce la rue ? Seraient-ce les réseaux sociaux ? Seraient-ce les médias ? Serait-ce le Parlement ?* Force est de constater quil nen est rien : la première est réprimée ; les seconds sont filtrés et compartimentés ; les troisièmes sont contrôlés par une poignée de milliardaires ; et ce dernier est loin de représenter lensemble de la société. Lon invoque la République, mais la *res publica* — la chose publique, appellation la plus vague et la plus creuse que lon puisse donner de lespace politique — se dissout dans des logiques qui échappent à toute délibération commune : absence de débat, passage en force, brutalisme institutionnel. Quant au langage politique, il continue dénoncer des structures et des projets, mais il ne parvient pas à décrire les opérations effectives de régulation, tant le système socio-économique, en plus de sêtre libéralisé et privatisé, sest étendu et complexifié tout en confiant les leviers daction au niveau supranational.
Cest précisément cette disjonction — entre les principes supposés légitimer le pouvoir, et les dispositifs qui en assurent leffectuation — qui produit aujourdhui notre impuissance à penser la régulation. Car aucun de ces termes ne dit où se tiennent les tensions, comment elles sont traitées, par quelles instances elles sont articulées. Aucune *-archie* ne garantit aujourdhui la dispute de ses fondements. Aucune *-cratie* norganise les conditions de son opposabilité. Et pendant que nous nous obstinons à nommer des formes de régime, les processus réels de régulation — eux — échappent à tout espace visible dépreuve. Jusquà présent, ils opèrent privés de contradictoire, dépourvus de délai, amputés dinstitutions de réversibilité. Autrement dit : nous sommes gouvernés sans être gouvernés, régulés sans régulation légitimée, affectés sans instance délibérative.
@@ -93,57 +93,57 @@ Cette dissociation — entre pouvoir nommé et régulation agissante — peut se
Cet épisode, souvent évoqué sur le ton de lanecdote, mérite dêtre considéré ici comme un symptôme politique majeur. Il indique que la régulation ne passe plus nécessairement par la verticalité du pouvoir, mais par des dispositifs latents, des agencements structurels, des inerties normatives et des coordinations transversales ou distribuées. Il montre quun ordre peut fonctionner sans fondement renouvelé, tenir sans pilotage, résister sans commande visible. Pierre Rosanvallon le soulignait (*La Légitimité démocratique*, 2008), en affirmant que les sociétés reposent aussi sur des « formes de légitimité latentes », moins spectaculaires que le vote ou la loi, mais non moins décisives. Lexpérience belge illustre avec force cette persistance dune régulation sans gouvernement explicite. Ce phénomène suggère que larchitecture régulatrice nest plus identifiable aux lieux habituels de la souveraineté.
Pour autant, le pouvoir na pas disparu ; il sexerce désormais depuis dautres formes que celles qui le légitimaient. Cest quil sest délocalisé, désinstitutionnalisé, déréférencé— tout en continuant à structurer silencieusement la vie collective. Et cest dans cet écart grandissant — entre labsence de gouvernement et la persistance dune régulation — que se dessine le cœur de la problématique contemporain : pour nombre dentre nous, nous continuons à chercher le pouvoir là où il nest plus, et à négliger les régulations implicites là où elles deviennent de plus en plus décisives.
Pour autant, le pouvoir na pas disparu ; il sexerce désormais depuis dautres formes que celles qui le légitimaient. Il sest délocalisé, désinstitutionnalisé, déréférencé — tout en continuant à structurer silencieusement la vie collective. Et cest dans cet écart grandissant — entre labsence de gouvernement et la persistance dune régulation — que se dessine le cœur de la problématique contemporaine : pour nombre dentre nous, nous continuons à chercher le pouvoir là où il nest plus, et à négliger les régulations implicites là où elles deviennent de plus en plus décisives.
Pour que ces dispositifs puissent fonctionner ainsi, discrètement et efficacement, sans quon puisse les identifier ni les contester, il faut dabord que les lieux où ils auraient pu être exposés, discutés ou débattus soient neutralisés, effacés, disqualifiés ou rendus inutiles. Les lieux de pouvoir sévaporent progressivement, les moyens dexpression se désagrègent, et les cadres dappel à la responsabilité deviennent in-entendables. Larène du politique ne disparaît pas brutalement, elle se désagrège lentement à mesure que ses conditions dexistence — la mise en scène, la confrontation et la mise à lépreuve — se retirent.
Pour que ces dispositifs puissent fonctionner ainsi, discrètement et efficacement, sans quon puisse les identifier ni les contester, il faut dabord que les lieux où ils auraient pu être exposés, discutés ou débattus soient neutralisés, effacés, disqualifiés ou rendus inutiles. Les lieux de pouvoir sévaporent progressivement, les moyens dexpression se désagrègent, et les cadres dappel à la responsabilité deviennent inaudibles. Larène du politique ne disparaît pas brutalement, elle se désagrège lentement à mesure que ses conditions dexistence — la mise en scène, la confrontation et la mise à lépreuve — se retirent.
Les anciens espaces dexposition — Parlement, place publique, journal, commission, agora, tribune — ne remplissent plus leur fonction instituante. Non quelles soient abolies : elles subsistent, mais tournent à vide par éléments de langage superposés, par logiques oblitératrices, par interruptions des moments dinterpellation et des déploiements de pensées contre-propositionnelles. Elles parlent sans prise. Elles évoquent sans effet. Elles promettent sans adossement réel. En somme, elles hypnotisent et désactivent. Et tandis quelles persistent comme formes, les lieux effectifs de la régulation — là où sarbitrent réellement les seuils, sajustent véritablement les normes, se décident les niveaux de tolérance ou dexclusion — se déplacent hors de la portée de tous.
Les anciens espaces dexposition — Parlement, place publique, journal, commission, agora, tribune — ne remplissent plus leur fonction instituante. Non quils aient été abolis : ils subsistent, mais tournent à vide, pris dans la superposition déléments de langage, dans des logiques oblitératrices, dans linterruption des moments dinterpellation et dans lempêchement des pensées contre-propositionnelles. Ils parlent sans prise. Ils évoquent sans effet. Ils promettent sans adossement réel. En somme, ils hypnotisent et désactivent. Et tandis quils persistent comme formes, les lieux effectifs de la régulation — là où sarbitrent réellement les seuils, sajustent véritablement les normes, se décident les niveaux de tolérance ou dexclusion — se déplacent hors de la portée de tous.
Cette désactivation des anciennes scènes de visibilité ne relève pas dune abstraction — elle a connu, en France, un moment décisif et révélateur : le référendum de 2005 sur le traité constitutionnel européen (TCE). Ce vote ayant pourtant agrégé près de 55 % de refus, na pas produit les effets régulateurs que lon aurait pu attendre. Deux ans plus tard, son contenu central était repris dans le traité de Lisbonne, adopté par voie parlementaire à Versailles, sans jamais redonner la parole aux citoyens.
Cette désactivation des anciennes scènes de visibilité ne relève pas dune abstraction — elle a connu, en France, un moment décisif et révélateur : le référendum de 2005 sur le traité constitutionnel européen (TCE). Ce vote, qui a pourtant recueilli près de 55 % de refus, na pas produit les effets régulateurs que lon aurait pu attendre. Deux ans plus tard, son contenu central était repris dans le traité de Lisbonne, adopté par voie parlementaire à Versailles, sans jamais redonner la parole aux citoyens.
Ce court-circuitage du résultat du référendum na pas seulement provoqué un malaise démocratique : il a signalé lobsolescence dune arène politique qui prétend encore incarner la souveraineté populaire, tout en sajustant aux impératifs dune régulation supranationale désindexée de tout espace de débat. Depuis, les grandes décisions se prennent largement hors scène, dans des configurations qui échappent aux rituels de la légitimation représentative. Lépisode du TCE fut ainsi moins une exception quun révélateur : la souveraineté na pas disparu, elle sest déplacée et sest muée ; et ce sont les lieux traditionnels de confrontation — qui permettaient de la contester — qui perdent peu à peu de leur puissance.
Il en résulte aujourdhui ce que lon pourrait nommer *une vacance des figures politiques*. Non pas un vide institutionnel — les appareils demeurent — ni un abandon total du pouvoir — les décisions continuent de tomber — mais bien un effacement progressif des repères identifiables à travers lesquelles ce pouvoir pouvait encore être *pensé*, *nommé*, *interrogé*, *disputé ou dénoncé*. Ce qui fait défaut, ce ne sont ni les procédures, ni les organigrammes, ni les énoncés de façade ; le pouvoir ne parvient plus à lui donner horizon partagé, épreuve contradictoire et adresse signifiante.
Il en résulte aujourdhui ce que lon pourrait nommer une vacance des figures politiques. Non pas un vide institutionnel — les appareils demeurent — ni un abandon total du pouvoir — les décisions continuent de tomber — mais un effacement progressif des repères identifiables à travers lesquels ce pouvoir pouvait encore être pensé, nommé, interrogé, disputé ou dénoncé. Ce qui fait défaut, ce ne sont ni les procédures, ni les organigrammes, ni les énoncés de façade, mais les conditions mêmes dun horizon partagé, dune épreuve contradictoire et dune adresse signifiante du pouvoir.
Les institutions demeurent et fonctionnent. Des lois sont encore votées, des ordonnances promulguées, des discours prononcés dans des formes toujours codifiées. Pourtant, ces énoncés institutionnels, malgré leur constance formelle, peinent à produire de lattachement, du conflit réglé, du récit commun. Il faut dire que lorsque les grandes directives sont déjà prises ailleurs, et quune tutelle sexerce sur les marges de manœuvre budgétaire et les politiques publiques, tout programme de rupture avec lexistant ne peut advenir sans discrédit. Ceci conduit jusquà présent à entériner et à traduire en terme juridique les grands principes issus des institutions européennes. Ainsi nos partis politiques et nos institutions samenuisent et perdent de leur influence : elles peinent à percer les seuils et à générer des événements rassembleurs. Ils surviennent, puis sévanouissent — rarement débattus, rarement disputés. Ils tentent néanmoins de transformer mais restent peu crédibles. La vie démocratique ne parvient plus à infléchir ledit pouvoir dans une visée dhorizon partagé puisque sa souveraineté sest vue entachée.
Les institutions demeurent et fonctionnent. Des lois sont encore votées, des ordonnances promulguées, des discours prononcés dans des formes toujours codifiées. Pourtant, ces énoncés institutionnels, malgré leur constance formelle, peinent à produire de lattachement, du conflit réglé et du récit commun. Lorsque les grandes directives sont déjà prises ailleurs, et quune tutelle sexerce sur les marges de manœuvre budgétaire et les politiques publiques, tout programme de rupture avec lexistant se trouve demblée frappé de discrédit. Il en résulte une tendance à entériner et à traduire en termes juridiques les grands principes issus des institutions européennes. Ainsi, nos partis politiques et nos institutions samenuisent et perdent de leur influence : ils peinent à ouvrir des brèches, à franchir des seuils, à générer des événements rassembleurs. Les moments quils produisent surviennent puis sévanouissent — rarement débattus, rarement disputés. Ils prétendent encore transformer, mais peinent de plus en plus à convaincre. La vie démocratique ne parvient plus à infléchir ledit pouvoir dans une visée dhorizon partagé puisque sa souveraineté se voit entachée.
Peut-être faut-il alors suspendre un instant le flux de lanalyse pour ouvrir la perspective : entendre ce que cette disparition fait à nos imaginaires. Car perdre les lieux de confrontation, ce nest pas perdre uniquement un espace politique — cest voir seffacer le langage commun de la mise en tension, de lépreuve contradictoire, du désaccord rendu partageable. En somme, celui-ci nest pas quun cadre, mais aussi une forme sensible, un rythme, un tempo, un théâtre où pouvaient sexprimer les dissensus, mais aussi se nouer des alliances, des compromis, des co-habitations et des promesses de coexistence. Cest cette mise en forme qui vacille aujourdhui — et avec elle, notre capacité à rendre visibles les lignes de fracture, les régimes dattachement, les besoins vitaux et leurs modalités darbitrage.
Depuis les élections se succèdent, mais loffre programmatique suniformise. En France, lors des campagnes présidentielles de 2022, plusieurs observateurs ont noté une quasi-absence de débats contradictoires sur les infrastructures écologiques, la gestion de leau, les algorithmes de tri social ou les seuils budgétaires européens — sujets pourtant structurants et centraux des problématiques actuelles. La parole politique reste intense, mais elle survole en ignorant les points réels dadhérence et de discordance. Elle nexpose ni la texture du monde vécu ni la réalité du tissu productif. Elle ne donne plus à saisir ni la forme ni la scène où les arbitrages sopèrent. Elle devient commentaire sans impact, phrase choc ou viralité polémique sans colonne vertébrale permettant de se figurer les problématiques.
Depuis lors, les élections se succèdent, mais loffre programmatique suniformise. En France, lors des campagnes présidentielles de 2022, plusieurs observateurs ont noté une quasi-absence de débats contradictoires sur les infrastructures écologiques, la gestion de leau, les algorithmes de tri social ou les seuils budgétaires européens — sujets pourtant structurants et centraux. La parole politique reste intense, mais elle survole en ignorant les points réels dadhérence et de discordance. Elle nexpose ni la texture du monde vécu ni la réalité du tissu productif. Elle ne donne plus à saisir ni la forme ni la scène où les arbitrages sopèrent. Elle devient commentaire sans impact, phrase choc ou viralité polémique, sans colonne vertébrale permettant de se figurer les problématiques.
Côté médias, le constat est plus ambivalent, mais tout aussi troublant. Dun côté, linformation est surabondante ; de lautre, les controverses senlisent dans le flux. On discute des intentions, rarement des formats. On spécule sur les effets, sans jamais problématiser les dispositifs. Un exemple emblématique en est lémission télévisée *“Face à Baba”*, ou le Grand Débat National post-Gilets Jaunes qui suscita beaucoup de prises de parole, tout en ayant peu de prise sur le réel. Il y eut certes des paroles fortes, mais sans aucune structure dintégration. Il y eut des opinions tranchées, mais sans lénonciation dune architecture délibérative. De sorte que la parole a circulé, mais elle navait pas autorité à sinstituer. Elle nétait pas dans le bon lieu. Le plateau télévisé nayant pour autre vocation que laudience.
Côté médias, le constat est plus ambivalent, mais tout aussi troublant. Dun côté, linformation est surabondante ; de lautre, les controverses senlisent dans le flux. On discute des intentions, rarement des formats. On spécule sur les effets, sans jamais problématiser les dispositifs. Lémission télévisée « Face à Baba » ou le « Grand Débat national » post-Gilets jaunes en offrent des exemples emblématiques : ils ont suscité de nombreuses prises de parole, tout en ayant peu de prise sur le réel. Il y eut certes des paroles fortes, mais sans véritable structure dintégration. Il y eut des opinions tranchées, mais sans lénonciation dune architecture délibérative. De sorte que la parole a circulé, mais elle navait pas autorité à sinstituer. Elle nétait pas dans le bon lieu : le plateau télévisé na dautre vocation que laudience.
Même les commissions denquête, qui historiquement cristallisaient un moment de vérité ou de remaniement, semblent affectées. Le rapport de lAssemblée nationale sur la gestion de la pandémie de Covid-19, par exemple, a bien été publié en 2022. Il formule des dizaines de propositions. Mais pourtant, peu dentre elles ont fait lobjet dune reprise effective, ni dans la sphère politique, ni dans la sphére médiatique, ni dans la transformation des pratiques administratives. Là encore, la procédure opère — mais sans relai, sans engagement, sans espace de transformation. Même sil faut le reconnaître, certaines analyses ont néanmoins nourri un débat plus large sur létat de la santé publique, contribuant à renforcer la vigilance citoyenne sur les infrastructures hospitalières.
Même les commissions denquête, qui, historiquement, cristallisaient un moment de vérité ou de remaniement, semblent affectées. Le rapport de lAssemblée nationale sur la gestion de la pandémie de Covid-19, par exemple, a bien été publié en 2022. Il formule des dizaines de propositions. Pourtant, peu dentre elles ont fait lobjet dune reprise effective, ni dans la sphère politique, ni dans la sphère médiatique, ni dans la transformation des pratiques administratives. Là encore, la procédure opère — mais sans relais, sans engagement, sans espace de transformation. Même sil faut le reconnaître, certaines analyses ont néanmoins nourri un débat plus large sur létat de la santé publique, contribuant à renforcer la vigilance citoyenne sur les infrastructures hospitalières.
Un autre exemple, plus récent encore, illustre avec une intensité toute particulière ce décalage entre mise en scène délibérative et opérativité réelle : celui de la Convention Citoyenne pour le Climat, initiée en France en 2019 à la suite du mouvement des Gilets Jaunes. Ce dispositif inédit proposait à 150 citoyennes et citoyens, tirés au sort, de formuler des propositions concrètes pour réduire les émissions de gaz à effet de serre (GES) dans un esprit de justice sociale. La procédure fut longue, exigeante, documentée. Les membres furent encadrés par des scientifiques, des spécialistes, des juristes, des praticiens. Leurs recommandations — 149 au total — furent saluées, y compris par les experts du climat, comme ambitieuses, sérieuses, largement compatibles avec les engagements climatiques de la France. Le président de la République sétait engagé à les transmettre « sans filtre ».
Et pourtant. À lissue de la convention, la grande majorité des propositions furent vidées de leur substance, renvoyées en commissions, ou transformées jusquà linverse de leur logique initiale. Certaines furent reprises à la marge dans la loi « Climat et Résilience », dautres enterrées sans débat, dautres encore tournées en dérision. Lexpression « sans filtre » fut rapidement abandonnée, remplacée par des formules dilatoires. Linstance réflexive a existé, mais elle na pas su instituer. La parole a circulé, mais elle na pas performé. La procédure bien que dense, na pas permis là encore linstauration dune architecture de régulation efficiente.
Et pourtant. À lissue de la convention, la grande majorité des propositions furent vidées de leur substance, renvoyées en commissions ou transformées jusquà linverse de leur logique initiale. Certaines furent reprises à la marge dans la loi « Climat et Résilience », dautres enterrées sans débat, dautres encore tournées en dérision. Lexpression « sans filtre » fut rapidement abandonnée, remplacée par des formules dilatoires. Linstance réflexive a existé, mais elle na pas su instituer. La parole a circulé, mais elle na pas performé. La procédure, bien que dense, na pas permis, là encore, linstauration dune architecture de régulation efficiente.
En ce sens, la Convention na pas échoué parce quelle était utopique ; elle a échoué parce quelle na pas trouvé dancrage régulateur dans larchitecture politique réelle. Cet exemple montre bien comment un dispositif peut produire de la parole et de la visibilité, sans pour autant parvenir à instituer une régulation opérante. Ce nest donc pas un lieu de confrontation sans conflit, mais une instance délibérative qui na pas donné suite. Et cest ce type deffacement — non spectaculaire, mais systémique — qui constitue aujourdhui le symptôme dune archéologie du politique désamarrée de ses obligations démocratiques.
Contrairement au discours du sens commun pointant la responsabilité du chef de lÉtat, nous pensons que le pouvoir sest désincarné. Bien que les figures de lautorité demeurent — titres, fonctions, attributs symboliques — elles ne rassemblent plus ni contestation structurée (opposant), ni reconnaissance affective (popularité), ni légitimation opérante (autorité). Pendant ce temps, la conflictualité na jamais autant submergé le tissu social : désaccords éthiques, désynchronisations temporelles, fractures territoriales, crises multifactorielles, paupérisation systémique, violences symboliques ou physiques. Et malgré nous, cette conflictualité ne trouve plus les lieux où sexprimer sans exploser. Elle ne se problématise plus dans des dispositifs communs, mais éclate en formes de colère dispersées, parfois illisibles, parfois délégitimées avant même davoir trouvé son expression stabilisée. Tel fut le cas du mouvement des Gilets Jaunes.
Contrairement au discours du sens commun, qui pointe la responsabilité du chef de lÉtat, nous pensons que le pouvoir sest désincarné. Bien que les figures de lautorité demeurent — titres, fonctions, attributs symboliques —, elles ne cristallisent plus ni contestation structurée, ni reconnaissance affective, ni légitimation opérante. Pendant ce temps, la conflictualité na jamais autant submergé le tissu social : désaccords éthiques, désynchronisations temporelles, fractures territoriales, crises multifactorielles, paupérisation systémique, violences symboliques ou physiques. Et, pourtant, cette conflictualité ne trouve plus les lieux où sexprimer sans exploser. Elle ne se problématise plus dans des dispositifs communs, mais éclate en formes de colère dispersées, parfois illisibles, parfois délégitimées avant même davoir trouvé une expression stabilisée. Tel fut le cas du mouvement des Gilets jaunes.
Et pendant ce temps, les décisions, elles, se ramassent à la pelle : fermeture dun service hospitalier, recentrage budgétaire, ajustement dun seuil déligibilité, réforme à marche forcée du régime des retraites, réforme de lassurance chômage, redéfinition dindicateurs dévaluation du marché de lemploi, déremboursements médicaux, désindexation daide sociale, etc., etc. Ces décisions viennent, mais sans adresse explicite, sans exposition des arbitrages effectués, sans procès public, sans contradictoire. Elles sont le fruit dinstances spécifiques rendues opaques et qui napparaissent pas, ou nassument pas leur fonction politique. Elles opèrent sous couvert de technique, mais agissent comme pouvoir — sans lassumer publiquement.
Et pendant ce temps, les décisions, elles, saccumulent : fermeture dun service hospitalier, recentrage budgétaire, ajustement dun seuil déligibilité, réforme à marche forcée du régime des retraites, réforme de lassurance chômage, redéfinition dindicateurs dévaluation du marché de lemploi, déremboursements médicaux, désindexation daide sociale, etc. Ces décisions adviennent sans adresse explicite, sans exposition des arbitrages effectués, sans procès public, sans contradictoire. Elles sont le fruit dinstances spécifiques rendues opaques, qui napparaissent pas ou nassument pas leur fonction politique. Elles opèrent sous couvert de technique, mais agissent comme pouvoir — sans lassumer publiquement.
Ainsi, ce nest pas la *capacité dagir* qui fait défaut — comme nous le voyons les régulations persistent — mais la *possibilité de rendre visible ce qui agit*. Ce qui tend à seffacer, ce nest pas le politique comme mécanisme de régulation, mais comme *espace de mise à lépreuve*. Nous habitons un monde saturé de normes, mais privé de figures crédibles de justification. Les arbitrages se multiplient sans explication, sans délibération, sans lieu darbitrage démocratiquement établi.
Ainsi, ce nest pas la capacité dagir qui fait défaut — les régulations persistent, comme nous le voyons bien, mais la possibilité de rendre visible ce qui agit. Ce qui tend à seffacer, ce nest pas le politique comme mécanisme de régulation, mais le politique comme espace de mise à lépreuve. Nous habitons un monde saturé de normes, mais privé de figures crédibles de justification. Les arbitrages se multiplient sans explication, sans délibération, sans lieu darbitrage démocratiquement établi.
Et cest précisément cette disparition despaces de controverses et de confrontation — cette disparition des lieux où se mettait en forme le différend, où sexposait le conflit, où se partageait le sensible — qui constitue une perte capitale. Car cest par la mise en scène des dissensus que les sociétés humaines ont, pendant des siècles, pu penser ensemble ce qui les liait, les divisait, les orientait. Cest sur cette instance dépreuve quétaient rendues visibles les visions du monde qui saffrontaient, les justifications qui sopposaient, les intérêts qui sexprimaient. Supprimez la scène dexposition — et ce nest pas le pouvoir qui disparaît, mais la possibilité den débattre. De sorte que la régulation dans les faits ne sinterrompt jamais : cest la possibilité même quelle devienne affaire publique qui sefface. Quant à lordre des choses, il ne se dissout pas, il se mue. Et cest notre capacité collective à le mettre en cause qui se délite faute de compréhension et de préhension.
Privés de lieux publics partagés, devenus propriétés privées, nous sommes aussi privés dune mise en conflit visible et compréhensible. Pourtant, les tensions sont nombreuses, mais elles restent muettes, sans récit commun ni cadre dexpression. Ce qui nous divise cesse dapparaître clairement. Ce qui nous déchire na plus de langage partagé performatif. Ce qui devrait susciter débat et polémique sefface dans lindifférence ou se réduit à une simple gestion technique de lopinion et de la propagande. Le jeu politique ne dispute plus lordre du monde, car il semble ne plus le pouvoir, elle en devient seulement le décor figé, répétant sans contradiction les mêmes ritournelles idéologiques.
Privés de lieux publics partagés, devenus propriétés privées, nous sommes aussi privés dune mise en conflit visible et compréhensible. Pourtant, les tensions sont nombreuses, mais elles restent muettes, sans récit commun ni cadre dexpression. Ce qui nous divise cesse dapparaître clairement. Ce qui nous déchire na plus de langage partagé performatif. Ce qui devrait susciter débat et polémique sefface dans lindifférence ou se réduit à une simple gestion technique de lopinion et de la propagande. Le jeu politique ne dispute plus lordre du monde, car il ne semble même plus pouvoir le contester ; il en devient seulement le décor figé, répétant sans contradiction les mêmes ritournelles idéologiques.
Or, sans polémique et sans cadre robuste de pensée, il ny a plus de politique au sens fort. Il y a de la décision, de la gestion, de la réaction, du pilotage. Mais il ny a plus despace où les fins pourraient être débattues, les normes interrogées, les tensions rendues visibles. Ce qui demeure, cest une sorte de théâtre spectral — où le pouvoir mime encore ses rituels, mais sans adossement, sans prise, sans mise en jeu. Et ce décor fantomatique maintient en vie un imaginaire périmé : celui dun pouvoir situé, identifiable, contestable. Mais cet imaginaire nopère plus. Il flotte comme une relique, un fantasme dépoque révolue. Cest tout du moins ce que nous pensons.
Or, sans polémique et sans cadre robuste de pensée, il ny a plus de politique au sens fort. Il y a de la décision, de la gestion, de la réaction, du pilotage. Mais il ny a plus despace où les fins pourraient être débattues, les normes interrogées, les tensions rendues visibles. Ce qui demeure, cest une sorte de théâtre spectral — où le pouvoir mime encore ses rituels, mais sans adossement, sans prise, sans mise en jeu. Et ce décor fantomatique maintient en vie un imaginaire périmé : celui dun pouvoir situé, identifiable, contestable. Mais cet imaginaire nopère plus. Il flotte comme une relique, un fantasme dépoque révolue. Cest du moins ce que nous pensons.
Ce qui se prépare alors — sans être encore nommé —, cest un changement de condition politique. Une métamorphose souterraine, silencieuse, mais décisive. Nous traversons un déplacement du sol même sur lequel reposait notre compréhension du pouvoir, du conflit, de la régulation. Et ce déplacement appelle un autre langage. Non pas un mot de plus dans une série — mais un geste de pensée qui permette de reconfigurer les coordonnées même à partir desquelles nous pourrions analyser ce qui fait tenir les mondes. Ce changement de condition politique nest pas une abstraction. Il sest incarné historiquement, idéologiquement, structurellement. Et lun de ses vecteurs majeurs — rarement interrogé comme tel — fut le tournant néolibéral du XXᵉ siècle.
Avec son avènement, ce qui mute, c'est la fabrique même de la régulation. Ce qui sest déplacé, ce sont les modalités par lesquelles un ordre devient opérant, ajusté, imposable — sans jamais se dire tel. Le néolibéralisme, en ce sens, décompose les conditions mêmes de la conflictualité démocratique. Il na pas réduit les règles : il a effacé les lieux de confrontation où lon pouvait encore les contester. Il a opéré une reconfiguration des coordonnées fondamentales du politique : *qui agit ? selon quelles justifications ? selon quels formats ? Et où peut-on encore linterroger ?*
Avec son avènement, ce qui mute, cest la fabrique même de la régulation. Ce qui sest déplacé, ce sont les modalités par lesquelles un ordre devient opérant, ajusté, imposable — sans jamais se dire tel. Le néolibéralisme, en ce sens, décompose les conditions mêmes de la conflictualité démocratique. Il na pas réduit les règles : il a effacé les lieux de confrontation où lon pouvait encore les contester. Il a opéré une reconfiguration des coordonnées fondamentales du politique : *qui agit ? selon quelles justifications ? selon quels formats ? Et où peut-on encore linterroger ?*
Nous voici donc au bord dun tournant : bien plus quun langage politique qui sépuise, ce sont les gestes mêmes qui permettaient de nommer, de rendre visible, de mettre à lépreuve les régulations. Il nous faut donc changer de focale. Non plus partir des régimes connus, des formes visibles du pouvoir, des catégories héritées. Mais remonter au plus près des gestes primitifs qui configurent toute forme de régulation : ce qui fonde, ce qui fait agir, et ce qui articule les deux dans des formes tangibles, contestables, visibles et viables qui pourraient expliquer le mouvement évolutif des sociétés.
Nous voici donc à lorée dun tournant : plus encore quun langage politique qui sépuise, ce sont les gestes mêmes qui permettaient de nommer, de rendre visible, de mettre à lépreuve les régulations qui se défont. Il nous faut donc changer de focale. Non plus partir des régimes connus, des formes visibles du pouvoir, des catégories héritées, mais remonter au plus près des gestes primitifs qui configurent toute forme de régulation : ce qui fonde, ce qui fait agir, et ce qui articule les deux dans des formes tangibles, contestables, visibles et viables, susceptibles déclairer le mouvement évolutif des sociétés.
Dans notre analyse, le moment néolibéral a précisément perturbé cette articulation. Il a introduit un brouillage entre lorigine du pouvoir et ses effets, entre ce qui autorise et ce qui contraint, entre ce qui se dit et ce qui agit. Et cest dans ce brouillage que se loge aujourdhui limpensé du politique contemporain.
Pour en sortir, il faut retrouver les gestes fondamentaux à partir desquels un monde collectif peut encore être rendu lisible et vivable. Ce geste, nous le nommons ici : *archéologie de la régulation*. Si lon veut comprendre ce qui se défait dans les régulations contemporaines — non pas de manière conjoncturelle, mais de façon structurelle —, il est impératif de remonter en amont des formes politiques connues, jusquaux forces sémantiques primitives que notre lexique transporte souvent à son insu.
Cest en reprenant le fil depuis ses origines étymologiques que nous pourrons reconstituer la force darrachement de ces termes, les faire parler à nouveau — non comme vestiges, mais comme opérateurs toujours actifs, toujours présents, sous des formes multiples et plurielles. Ce détour par la langue nest pas un exercice érudit. Cest une tentative de ré-accorder le langage à lexpérience vécu, de ressaisir les prises fondamentales du pouvoir à travers leurs gestes constituants et fondateurs.
Cest en reprenant le fil depuis ses origines étymologiques que nous pourrons reconstituer la force darrachement de ces termes, les faire parler à nouveau — non comme vestiges, mais comme opérateurs toujours actifs, toujours présents, sous des formes multiples et plurielles. Ce détour par la langue nest pas un exercice érudit. Cest une tentative de réaccorder le langage à lexpérience vécue, de ressaisir les prises fondamentales du pouvoir à travers leurs gestes constituants et fondateurs.
Ainsi, les suffixes en *-archie* et en *-cratie*, que nous avons évoqués plus haut comme désignations de régimes, sont bien plus que des marqueurs grammaticaux, ils condensent des opérations fondamentales du politique. Plus précisément, ils signalent deux gestes constitutifs et irréductibles dans toute structuration collective : *celui du fondement* (*arkhè*) *et celui de lexercice* (*kratos*). Le premier désigne l*origine légitime* ; le second, la *puissance agissante*. Mais dans leur réduction lexicale, ces deux gestes ont été figés et dissociés en formes de régime, perdant de vue leur fonction dynamique et conjointe dans tout ordre social : *fonder* et *faire agir.* Cest pour restituer leur opérativité conceptuelle que nous introduisons ici les termes d*arcalité* et de *cratialité*.
@@ -157,7 +157,7 @@ Alors pourquoi introduire le mot *arcalité*, au risque du néologisme ? Parce q
L*arcalité* est donc un concept transversal et multiple : elle traverse les époques, les cultures, les régimes — tout en changeant de visage et de figures. Elle peut prendre la forme dun texte sacré, dun contrat social, dune Constitution, dun mythe fondateur, dune promesse technoscientifique, ou même dun jeu dindicateurs économiques. Elle peut être verticalement imposée ou horizontalement négociée. Elle peut être stabilisée dans le droit ou émerger dans la rue. Mais dans tous les cas, elle opère comme ce qui justifie le pouvoir, ce qui lui donne son aura dévidence, ce qui naturalise ses opérations en les rendant pensables et acceptables.
Mais au-delà de ces premiers assertions, l*arcalité* se présente aussi comme un outil épistémologique pour lanalyse des régimes de légitimation — elle peut servir comme *opérateur heuristique* pour lire les sociétés dans leurs *structures de croyance, de reconnaissance, de justification*. Elle permet danalyser des situations aussi différentes que la réforme dun système de retraite, le recours à une IA dans la sélection universitaire ou la fondation dun État théocratique, non pas en fonction de leur contenu normatif, mais en fonction de *ce qui est supposé justifier leur existence*, *ce qui les autorise à simposer*.
Mais au-delà de ces premières assertions, larcalité se présente aussi comme un outil épistémologique pour lanalyse des régimes de légitimation — elle peut servir dopérateur heuristique pour lire les sociétés dans leurs structures de croyance, de reconnaissance, de justification. Elle permet danalyser des situations aussi différentes que la réforme dun système de retraite, le recours à une IA dans la sélection universitaire ou la fondation dun État théocratique, non pas en fonction de leur contenu normatif, mais en fonction de ce qui est supposé justifier leur existence et de ce qui les autorise à simposer.
Pour commencer à en saisir la portée, il nous faut sommairement déplier l*arcalité* dans ses déclinaisons historiques et symboliques. Elle ne renvoie pas à un type de régime, mais à *ce qui autorise un pouvoir à sexercer sans être récusé* : une scène de légitimation, explicite ou tacite. Ainsi, sous lAncien Régime, lautorité du roi nétait pas justifiée par sa compétence, mais par une *sacralité divine incarnée dans le sang, la lignée, le rite* — une *arcalité théologico-politique* où l*arkhè* se vivait du trône jusquà lautel.
@@ -171,9 +171,9 @@ Ainsi, dans la *Déclaration des droits de la Pachamama* (Bolivie, 2010), la Ter
Dans les technostructures contemporaines, comme les agences de notation, les protocoles de régulation algorithmique, ou les plateformes numériques, l*arcalité* devient *data* : ce sont les chiffres, les indicateurs, les modèles prédictifs qui justifient laction. Lautorité repose sur la *robustesse du calcul*, la *neutralité supposée du code*, la *précision des seuils*. Ce que Yuval Noah Harari (*Homo deus, une brève histoire du futur*, 2017) appelle le “*dataïsme”* en est une figure actualisée exemplaire, où le flux des données devient source même de vérités.
Enfin, dans certaines configurations capitalistiques contemporaines, l*arcalité* prend une forme radicalement *autoréférentielle* : elle ne sappuie plus sur une extériorité normative, ni même sur une validation juridique ou démocratique, mais sur la seule *performance passée érigée en légitimité présente*. Cest ce que lon pourrait appeler une *arcalité autogénérative*, où le succès ne demande plus de justification externe — il en révèle sa propre preuve. Une entreprise qui attire des investissements massifs, une plateforme dont la valorisation boursière croît de manière exponentielle, une *startup* qui atteint le statut de “licorne” (plus dun milliard de dollars de capitalisation), na plus besoin de se légitimer par un utilité sociale, une finalité collective ou un adossement institutionnel : *le simple fait davoir réussi* suffit à valider lensemble des choix stratégiques. Elle simpose précisément parce quelle se donne à voir comme ayant *toujours déjà* fonctionné.
Enfin, dans certaines configurations capitalistiques contemporaines, l*arcalité* prend une forme radicalement *autoréférentielle* : elle ne sappuie plus sur une extériorité normative, ni même sur une validation juridique ou démocratique, mais sur la seule *performance passée érigée en légitimité présente*. Cest ce que lon pourrait appeler une *arcalité autogénérative*, où le succès ne demande plus de justification externe — il en révèle sa propre preuve. Une entreprise qui attire des investissements massifs, une plateforme dont la valorisation boursière croît de manière exponentielle, une *startup* qui atteint le statut de “licorne” (plus dun milliard de dollars de capitalisation), na plus besoin de se légitimer par une utilité sociale, une finalité collective ou un adossement institutionnel : *le simple fait davoir réussi* suffit à valider lensemble des choix stratégiques. Elle simpose précisément parce quelle se donne à voir comme ayant *toujours déjà* fonctionné.
Mais l*arcalité* dans ses multiples manifestations, si décisive soit-elle, ne suffit pas à faire tenir un monde. Car un ordre social, quel quil soit, ne repose jamais uniquement sur ses principes le légitimant. Il doit aussi pouvoir opérer, agir, décider, trancher, maintenir — parfois même contraindre ou punir. Il ne suffit pas quun pouvoir soit justifié ; encore faut-il quil se déploie, quil prenne forme dans des pratiques, des formats, des opérateurs. En somme, il ne suffit pas quun ordre se dise fondé ; il faut encore quil sexerce.
Mais larcalité, dans ses multiples manifestations, si décisive soit-elle, ne suffit pas à faire tenir un monde. Car un ordre social, quel quil soit, ne repose jamais uniquement sur les principes qui le légitiment. Il doit aussi pouvoir opérer, agir, décider, trancher, maintenir — parfois même contraindre ou punir. Il ne suffit pas quun pouvoir soit justifié ; encore faut-il quil se déploie, quil prenne forme dans des pratiques, des formats, des opérateurs. En somme, il ne suffit pas quun ordre se dise fondé ; il faut encore quil sexerce.
Il faut pour cela un autre registre, un autre plan de la régulation : celui de laction. Cest ici quintervient ce que nous nommons la *cratialité* — terme forgé comme pour les régimes en -cratie — à partir de *kratos* (κράτος), qui désigne en grec ancien la force, la puissance agissante, la capacité à faire advenir quelque chose dans le réel. Si l*arcalité est ce qui autorise*, la *cratialité est ce qui opère*. Lune pose les conditions de validité, lautre produit les effets. Lune fonde, lautre exerce.
@@ -197,7 +197,7 @@ Dans de nombreux États postcoloniaux, la *cratialité* conserve en grande parti
À lère écologique, la *cratialité* passe par la *norme chiffrée* : marchés du carbone, seuils ISO, critères ESG. Le droit à polluer se négocie, se calcule, séchange. Il sagit moins de régulation morale que dun *pilotage algorithmique* des équilibres. Bien que la Terre devienne une *arcalité*, sa régulation, elle, repose sur une *cratialité technico-financière*, opaque, désarrimée de tout débat public.
Enfin, dans les régimes numériques contemporains, la *cratialité* se dissout dans les infrastructures : IA décisionnelles, *scoring* social, plateformes automatisées. Comme lécrit Shoshana Zuboff, nous sommes entrés dans lère du *capitalisme de surveillance*, où la gouvernance sexerce sans discours et sans voie de recours. Byung-Chul Han y voit un pouvoir transparent totalcelui-ci nest plus énoncé — il agit, module, filtre et exclut.
Enfin, dans les régimes numériques contemporains, la cratialité se dissout dans les infrastructures : IA décisionnelles, scoring social, plateformes automatisées. Comme lécrit Shoshana Zuboff, nous sommes entrés dans lère du capitalisme de surveillance, où la gouvernance sexerce sans discours et sans voie de recours. Byung-Chul Han y voit un « pouvoir transparent total »,le pouvoir nest plus énoncé — il agit, module, filtre et exclut.
Après ce tour dhorizon des *cratialités* à travers lespace et le temps, sil fallait justifier, en dernière instance, lintroduction d*e* ce concept, ce serait en raison dun vide analytique que les cadres existants ne parviennent plus à combler. La question nest pas tant de créer un terme de plus, que de rendre dicible une opération fondamentale du pouvoir : celle qui consiste à *agir sans autorité explicite*, à contraindre sans justification, à réguler sans discours. En ce sens, la *cratialité* ne soppose pas à l*arcalité*, elles se complètent. Elles révèlent lune à lautre leur limite. Car il est possible dagir sans légitimer, de structurer sans fonder, dopérer sans lieu de confrontation ni narration instituante.
@@ -205,9 +205,9 @@ Le concept de *cratialité* nous offre le terme pour penser ce pouvoir qui ne se
Cest pourquoi la *cratialité* ne se confond ni avec la domination, ni avec le pouvoir institutionnel, ni même avec la technique. Elle traverse les formes, en tant qu*opérativité sans fondement*. Elle nexplique pas pourquoi un ordre existe — elle permet de comprendre comment il sexerce effectivement. Et cest là sa puissance critique : déloger le politique de ses seules figures visibles, pour révéler les régulations silencieuses, les contraintes discrètes, les mécanismes délégués, les automatisations sans autorité véritablement légitime. Elle ouvre ainsi une contre-archéologie du pouvoir, attentive à ce qui agit sans se dire, à ce qui règle sans apparaître.
Sur le plan épistémologique, la *cratialité* permet donc un déplacement décisif : elle nous extrait du dualisme éculé entre légitimité et illégitimité, démocratie et anarchie, État et société civile. Elle invite à penser un entre-deux, un tiers-opératoire : là où le politique sinstitue non par la Loi ou par le Chaos, mais par l*agencement de dispositifs producteurs de réalité*. Ce pouvoir-là ne commande pas : il invente et configure. Il ne tranche pas : il jauge et module. Il ne sexpose pas : il infiltre et simpose. Et cest pourquoi il faut un mot pour le désigner — non pas pour lisoler, mais pour en cartographier les régimes, les formats, les seuils dacceptabilité.
Sur le plan épistémologique, la cratialité permet donc un déplacement décisif : elle nous extrait du dualisme éculé entre légitimité et illégitimité, démocratie et anarchie, État et société civile. Elle invite à penser un entre-deux, un « tiers opératoire » : là où le politique sinstitue non par la Loi ou par le Chaos, mais par lagencement de dispositifs producteurs de réalité. Ce pouvoir-là ne commande pas : il invente et configure. Il ne tranche pas : il jauge et module. Il ne sexpose pas : il infiltre et simpose. Et cest pourquoi il faut un mot pour le désigner — non pas pour lisoler, mais pour en cartographier les régimes, les formats, les seuils dacceptabilité.
Sur le plan critique, la *cratialité* permet aussi de distinguer leffet de lauteur : ce nest pas parce que personne ne commande que rien ne simpose. Ce nest pas parce quune norme na pas été votée quelle nopère pas, et à lopposé, ce nest pas parce quune norme est appliquée quelle opère nécessairement. Cest toute la différence entre lordre prescrit et lordre effectif — différence aujourdhui cruciale, tant la puissance régulatrice des systèmes dépasse celle des gouvernements.
Sur le plan critique, la cratialité permet aussi de distinguer leffet de lauteur : ce nest pas parce que personne ne commande que rien ne simpose. Ce nest pas parce quune norme na pas été votée quelle nopère pas et, inversement, ce nest pas parce quune norme est appliquée quelle opère nécessairement. Cest toute la différence entre lordre prescrit et lordre effectif — différence aujourdhui cruciale, tant la puissance régulatrice des systèmes dépasse celle des gouvernements.
Enfin, sur le plan opératoire, la *cratialité* fournit une grille de lecture transversale des phénomènes contemporains : du design dune application mobile à la réorganisation dun hôpital, du protocole logistique dun port à la normalisation de la parole publique, du filtrage des contenus en ligne à la gestion algorithmique de lemploi. Partout où quelque chose agit sans se dire comme pouvoir, sans se nommer comme décision, sans sassumer comme contrainte, la *cratialité* est à lœuvre.
@@ -217,65 +217,65 @@ Mais si ces deux pôles — celui du fondement (*arcalité*) et celui de lop
Et cest précisément ce point darticulation que nous voulons nommer, penser et problématiser ici.
Si l*arcalité* est *ce qui légitime*, et la *cratialité* *ce qui exerce*, alors l*archicration* est le *nœud de leur articulation effective*. Elle désigne cette opération composite, toujours située, par laquelle un pouvoir donné fonde son action et agit selon son fondement — ou, inversement, agit tout en produisant sa propre légitimation — à la condition de se laisser exposer dans une scène dépreuve. L*archicration* est ce *point de nouage où se rejoignent la question du pourquoi* (*pourquoi ce pouvoir est-il reconnu ?*) *et celle du comment* (*comment ce pouvoir opère-t-il effectivement ?*), là où cette rencontre devient publiquement opposable. Non pas deux dimensions juxtaposées, mais deux régimes co-constitutifs de toute scène régulatrice.
Si larcalité désigne ce au nom de quoi un ordre prétend agir, et la cratialité les chaînes par lesquelles il agit effectivement, alors larchicration désigne la scène instituée où cet ordre expose, à sa manière, ses fondements et ses dispositifs à une épreuve, à une contestation, à une confirmation ou à une reconfiguration.
Ainsi, de la fusion des deux termes (*arkhè* et *krateîn*) naît l*archicration* : *lacte de fonder en agissant, ou dagir en fondant*. Factuellement, dans les régulations politiques concrètes, il ny a jamais de pouvoir qui se contente de dire sans faire, ni dagir sans justifier. Tout dispositif un tant soit peu structurant articule, à sa manière, un *arkhè* *qui justifie* et un *krateîn qui effectue*.
Larchicration est la scène dans laquelle se rejoignent la question du pourquoi (pourquoi ce pouvoir est-il reconnu ?) et celle du comment (comment ce pouvoir opère-t-il effectivement ?), lorsque cette rencontre devient exposable, disputable et publiquement opposable. Il ne sagit pas de deux dimensions juxtaposées, mais de deux régimes dont larticulation ne devient politiquement décisive quà travers une épreuve instituée.
Ainsi comprise, larchicration ne nomme pas la totalité de lacte politique, mais la scène où un ordre se rend à nouveau adressable, en exposant ses fondements et ses opérations à une épreuve réglée. Factuellement, dans les régulations politiques concrètes, il ny a jamais de pouvoir qui se contente de dire sans faire, ni dagir sans justifier. Tout dispositif un tant soit peu structurant articule, à sa manière, un *arkhè* *qui justifie* et un *krateîn qui effectue*.
La force heuristique du concept d*archicration*, cest donc de réinscrire dans un même geste ce que la modernité politique avait tendance à dissocier : dun côté, la légitimation (par le droit, le peuple, Dieu, la science…), de lautre, leffectuation (par les lois, les institutions, les techniques, les procédures…). Le pouvoir moderne sest souvent construit sur une prétention à lextériorité : laction devait découler dun principe, comme si lon pouvait dabord fonder, ensuite agir. Cette dissociation était une fiction structurante, utile pour lordre symbolique, mais inopérante pour une lecture du réel.
En vérité, les régulations contemporaines — et peut-être une grande partie des gulations passées, cela reste à être étayé — peuvent être relues comme des agencements archicratifs, plus ou moins explicites, plus ou moins stables, mais toujours composite : lÉtat-nation est une *archicration* qui articule une *arcalité constitutionnelle* (la souveraineté populaire) à des *cratialités institutionnelles* (le gouvernement, ladministration, la police, larmée, etc.). Il en va de même pour les grandes plateformes numériques qui articulent des *arcalités technoscientifiques* (la promesse de linnovation, la rationalité du code, la neutralité de lalgorithme) à des *cratialités infra-visibles* (le filtrage, linstrumentation, la captation de données, la modulation du comportement). Même un ordre religieux — ou un régime dit théocratique — néchappe pas à cette logique : il articule des *arcalités transcendantes* (le texte révélé, la Loi divine, les prophètes, le Messie) à des *cratialités rituelles et doctrinales* (linterprétation, la sanction, le commandement, la discipline).
En vérité, les régulations contemporaines peuvent être relues comme des configurations archicratiques, cest-à-dire comme des agencements variables darcalité, de cratialité et darchicration. LÉtat-nation, par exemple, articule une arcalité constitutionnelle à des cratialités institutionnelles, et ninstitue des archicrations quà travers certaines scènes déterminées — assemblées, tribunaux, procédures de recours, controverses publiques, dispositifs de révision. Même un ordre religieux — ou un régime dit théocratique — néchappe pas à cette logique : il articule des *arcalités transcendantes* (le texte révélé, la Loi divine, les prophètes, le Messie) à des *cratialités rituelles et doctrinales* (linterprétation, la sanction, le commandement, la discipline).
L*archicration* ne désigne donc pas un régime parmi dautres. Elle nomme, selon toute hypothèse, le nœud vivant dune régulation politique qui accepte de se rendre visible, différée et contestable, dès lors quelle vise à perdurer. De sorte quun pouvoir qui échoue à fonder ce quil opère sexpose à larbitraire ; un pouvoir qui échoue à opérer ce quil fonde sépuise dans limpuissance. De même, le simulacre surgit quand l*arcalité* se dissocie de toute effectuation ; linstabilité sinstalle quand la *cratialité* ne sadosse à aucun principe partagé. Ce que nous appelons *archicration*, cest donc ce point de tension active et scénique où sarticulent — ou se désarticulent — le fondement et lopération, la forme et la force, la justification et lexécution.
Larchicration ne désigne pas un régime parmi dautres. Elle nomme la scène instituée où une régulation expose, selon des formes variables — parfois ouvertes, parfois captées, parfois violentes ou asymétriques — larticulation de ses fondements et de ses opérations à une épreuve réglée, dès lors quelle vise à perdurer. De sorte quun pouvoir qui échoue à fonder ce quil opère sexpose à larbitraire ; un pouvoir qui échoue à opérer ce quil fonde sépuise dans limpuissance. De même, le simulacre surgit quand l*arcalité* se dissocie de toute effectuation ; linstabilité sinstalle quand la *cratialité* ne sadosse à aucun principe partagé. Ce que nous appelons archicration, cest donc la scène instituée où sarticulent — ou se désarticulent — le fondement et lopération, la forme et la force, la justification et lexécution, sous la possibilité dune épreuve réglée.
Or, cest lorsque cette articulation devient asymétrique, disjointe, ou captée, que le politique mute en profondeur — non plus sous la forme dun changement visible de régime, mais dun glissement silencieux des coordonnées de la régulation. Et parmi les figures contemporaines de cette désarticulation archicrative, le moment néolibéral occupe une place stratégique, tant par son étendue historique que par sa profondeur de reconfiguration. Non quil ait aboli la régulation — il la redéployée. Non quil ait supprimé le politique — il la déplacé, technicisé, encodé, rendu algorithme.
Or, cest lorsque cette articulation devient asymétrique, disjointe ou captée, que le politique mute en profondeur — non plus sous la forme dun changement visible de régime, mais dun glissement silencieux des coordonnées de la régulation. Et parmi les figures contemporaines de cette désarticulation archicrative, le moment néolibéral occupe une place stratégique, tant par son étendue historique que par sa profondeur de reconfiguration. Non quil ait aboli la régulation — il la redéployée. Non quil ait supprimé le politique — il la déplacé, technicisé, encodé, rendu algorithme.
À partir des années 1970, sous limpulsion dintellectuels comme Friedrich Hayek et Milton Friedman, relayés par les *Chicago Boys,* amplifiés par les politiques de Ronald Reagan et Margaret Thatcher, puis par les prescriptions des grandes organisations transnationales (FMI, Banque mondiale, OMC), le néolibéralisme sest imposé sans conquête déclarée, par glissement, par ruse, par standardisation. Il na pas remplacé les institutions du politique, il les a désactivés en douceur ; il na pas détruit lÉtat, il a recodé ses prérogatives régulatrices selon une nouvelle logique : celles de lefficience, du marché, du seuil, du calcul et dun retour sur ses fonctions régaliennes.
À partir des années 1970, dans un contexte de mondialisation, de financiarisation croissante, de désindustrialisation occidentale et de crise des médiations collectives, le néolibéralisme sest imposé sans conquête déclarée, par glissement, par ruse et par standardisation. Il na pas remplacé les institutions du politique : il les a désactivées en douceur ; il na pas détruit lÉtat : il a recodé ses prérogatives régulatrices selon une logique defficience, de marché, de seuil, de calcul et de recentrage sur ses fonctions régaliennes.
Dun côté, cette idéologie a déplacé l*arcalité* : le principe de fondement ne repose plus sur la souveraineté populaire, la loi, ou la délibération publique, mais sur l*efficience marchande*. Le marché libre est présenté comme naturel, universel, neutre — et se promeut comme seul critère de légitimité. Cest ce que nous appelons ici *arcalité performative* : le fondement est produit par la performance elle-même. Le succès vaut justification. La croissance devient norme. Lindicateur remplace le débat.
Dun autre côté, elle redéfinit la *cratialité* : la régulation ne passe plus par des institutions politiques visibles, mais par une gouvernance par les normes, les seuils, les indicateurs, les standards, les classements (*rankings*) et les interfaces. La décision nest plus revendiquée ; elle sélabore en algorithme opérationnel. Le pouvoir module, ajuste, et encode. Ce que Wendy Brown a appelé, dans *Undoing the Demos*, la “rationalité néolibérale” ne se résume pas à un discours ou à une doctrine — cest une *cratialité généralisée*, une *logique de fonctionnement incorporée* dans les infrastructures mêmes du quotidien, où toute alternative devient impensable.
Le mot dordre de “dérégulation” prôné par les tenants du néolibéralisme masquaient en réalité un déplacement massif de la régulation et non son annihilation. Ce qui a disparu peu à peu, ce ne sont pas les règles — elles pullulent — mais les scènes darbitrage où lon pouvait encore en contester le sens, la pertinence, les effets. Les espaces publics de reconnaissance où elles pouvaient encore être mises à lépreuve se sont effacés ou disséminés. Ainsi, chaque réforme — des retraites, de lassurance chômage, de luniversité, de lhôpital ou de la fiscalité — est dès lors présentée non comme un choix idéologique, mais comme une évidence technico-financière, une réponse dite “rationnelle” à une contrainte supposée incontournable.
Le mot dordre de “dérégulation” prôné par les tenants du néolibéralisme masquait en réalité un déplacement massif de la régulation, et non son annihilation. Ce qui a disparu peu à peu, ce ne sont pas les règles — elles pullulent — mais les scènes darbitrage où lon pouvait encore en contester le sens, la pertinence, les effets. Les espaces publics de reconnaissance où elles pouvaient encore être mises à lépreuve se sont effacés ou disséminés. Ainsi, chaque réforme — des retraites, de lassurance chômage, de luniversité, de lhôpital ou de la fiscalité — est dès lors présentée non comme un choix idéologique, mais comme une évidence technico-financière, une réponse dite “rationnelle” à une contrainte supposée incontournable.
Ce qui simpose alors est une reconfiguration radicale des conditions dexistence. Le pouvoir nest ni aboli ni dissimulé — il est redistribué dans des registres et des protocoles privés, encodé dans des métriques non explicites, traduit dans des novlangues tout en se distillant dans des environnements régulateurs où la fabrique du politique a été méthodiquement neutralisée. Ce que le *néolibéralisme* installe, cest donc une *pseudo-archicration sans scène*, là où la délibération démocratique est dessaisie. Il produit un agencement dans lequel la légitimation ne sédicte plus, mais sinfiltre sous forme de performance antérieure ; dans lequel la régulation ne tranche plus publiquement, mais opère en souterrain, au travers dindicateurs, de seuils, dalgorithmes, de traités supranationaux, de conventions de marché.
Ce qui simpose alors est une reconfiguration radicale des conditions dexistence. Le pouvoir nest ni aboli ni dissimulé — il est redistribué dans des registres et des protocoles privés, encodé dans des métriques non explicites, traduit dans des novlangues tout en se distillant dans des environnements régulateurs où la fabrique du politique a été méthodiquement neutralisée. Ce que le néolibéralisme installe, ce nest pas une dérégulation au sens strict, mais une désarchicration tendancielle : les opérations se poursuivent, les justifications circulent, tandis que les scènes où elles pourraient être réellement éprouvées sont neutralisées, mimées ou confisquées. Il produit un agencement dans lequel la légitimation ne sédicte plus, mais sinfiltre sous forme de performance antérieure ; dans lequel la régulation ne tranche plus publiquement, mais opère en souterrain, au travers dindicateurs, de seuils, dalgorithmes, de traités supranationaux, de conventions de marché.
Arrêtons-nous un instant pour bien préciser les termes de notre propos. Par *scène*, nous entendons l*instance dépreuve où des* *forces*, des *acteurs*, des *registres* ou des *institutions* dordres différents *se confrontent sous règles explicites.* Il ne sagit donc pas uniquement du seul théâtre institutionnel ; nous parlons ici dun espace dapparition conflictuelle, où puisse se rendre audible les dissensus (Jacques Rancière, *La Mésentente*, 1995).
Arrêtons-nous un instant pour bien préciser les termes de notre propos. Par scène, nous entendons linstance dépreuve où des forces, des acteurs, des registres ou des institutions dordres différents se confrontent sous des règles explicites. Il ne sagit donc pas du seul théâtre institutionnel ; nous parlons ici dun espace dapparition conflictuelle, où peuvent se rendre audibles les dissensus (Jacques Rancière, *La Mésentente*, 1995).
Dès lors, penser l*archicration*, cest chercher à rendre lisible le point de tension vive où un ordre se constitue en tenant ensemble des forces hétérogènes. Ce que nous proposons ici nest pas un modèle, mais un geste : un mode dattention aux lignes dopération du pouvoir, une manière de cartographier les régulations en acte, une tentative de réouverture despaces démocratiques. Lobjectif étant de refonder la possibilité dépreuves là où lopacité et loccultation sest installée, et pour rouvrir un espace de visibilité critique là où lefficacité sauto-justifie et prétend se suffire à elle-même.
Dès lors, penser larchicration, cest chercher à rendre lisible la scène où un ordre se constitue en exposant à lépreuve réglée larticulation de forces hétérogènes. Ce que nous proposons ici nest pas un modèle, mais un geste : un mode dattention aux lignes dopération du pouvoir, une manière de cartographier les régulations en acte, une tentative de réouverture despaces démocratiques. Lenjeu est de refonder la possibilité dépreuves là où lopacité et loccultation se sont installées, et de rouvrir un espace de visibilité critique là où lefficacité sautojustifie et prétend se suffire à elle-même.
Sous notre prisme danalyse, l*archicration* séprouve comme une réalité concrète, un espace vivant traversé de tensions permanentes, où se cherche sans cesse un fragile *équilibre entre des formes dassise, des forces productives et des vulnérabilités constitutives*. Or, cet équilibre na rien de garanti : il peut basculer, se rompre, se déformer.
Que faut-il entendre par là ? Certaines *configurations archicratives* tendent à surinvestir l*affectation* — entendu par là, les dimensions idéologique, symbolique, émotionnelle qui prétendent donner sens et légitimer un ordre — tout en négligeant l*effectuation,* soit la capacité de traduire ces principes en dispositifs opératoires stables et durables. Lexemple de la République jacobine de 1793 en fournit une illustration saisissante : exaltée par la fiction dune souveraineté populaire absolue, elle na pas su consolider ses mécanismes de régulation pour perdurer. Lénergie de lidéal a vite été dévorée par lincapacité dinstaurer des équilibres viables, précipitant le régime dans la Terreur et lépuisement institutionnel.
Que faut-il entendre par là ? Certaines configurations archicratives tendent à surinvestir laffectation — entendue ici comme lensemble des dimensions idéologiques, symboliques et émotionnelles qui prétendent donner sens et légitimer un ordre — tout en négligeant leffectuation, soit la capacité de traduire ces principes en dispositifs opératoires stables et durables.
Dautres *archicrations*, à linverse, senferment dans l*effectuation* en oubliant tout récit justificatif. LUnion européenne en fournit un cas exemplaire : sa gouvernance repose sur une accumulation de normes techniques, de seuils budgétaires, de critères de convergence, dindicateurs chiffrés (3 % de déficit, 60 % de dette, pactes de stabilité, règles de concurrence, standards environnementaux...). Ce régime régulateur, dune efficacité incontestable dans sa capacité à contraindre les États membres, opère par une effectuation puissante, mais trop souvent déliée dun langage politique partagé. Les décisions se justifient au nom de la « rationalité économique » ou de la « soutenabilité financière », sans se traduire dans un récit de légitimité accessible aux citoyens. Cest cette asymétrie — abondance de dispositifs opératoires, rareté des justifications symboliques — qui alimente le sentiment dun déficit démocratique chronique, relevé par de nombreux observateurs et confirmé par les épisodes de rejet populaire (référendum français de 2005, Brexit, poussées eurosceptiques). Ici, l*archicration* sépuise dans lopération : elle agit, ajuste, module, mais peine à convaincre et à rassembler.
Dautres *archicrations*, à linverse, senferment dans l*effectuation* en oubliant tout récit justificatif. LUnion européenne en fournit un cas exemplaire : sa gouvernance repose sur une accumulation de normes techniques, de seuils budgétaires, de critères de convergence, dindicateurs chiffrés (3 % de déficit, 60 % de dette, pactes de stabilité, règles de concurrence, standards environnementaux). Ce régime régulateur, dune efficacité incontestable dans sa capacité à contraindre les États membres, opère par une effectuation puissante, mais trop souvent déliée dun langage politique partagé. Les décisions se justifient au nom de la « rationalité économique » ou de la « soutenabilité financière », sans se traduire dans un récit de légitimité accessible aux citoyens. Cest cette asymétrie — abondance de dispositifs opératoires, rareté des justifications symboliques — qui alimente le sentiment dun déficit démocratique chronique, relevé par de nombreux observateurs et confirmé par les épisodes de rejet populaire (référendum français de 2005, Brexit, poussées eurosceptiques). Ici, l*archicration* sépuise dans lopération : elle agit, ajuste, module, mais peine à convaincre et à rassembler.
À lautre extrême, certaines *archicrations* se construisent sur une *fausse fusion* entre fondement et opération. Les régimes autoritaires modernes, comme ceux de la Russie de Vladimir Poutine ou de la Turquie de Recep Tayyip Erdogan, en offrent des incarnations saisissantes. L*arkhè* proclamé — la Nation, la Tradition, la Religion, parfois la Civilisation — est érigé en principe indiscutable, en vérité dorigine inattaquable. Mais cette légitimation abstraite fonctionne comme paravent et sert de couverture à des pratiques de régulation brutales, des répressions ciblées, des ajustements institutionnels opportunistes, des captations oligarchiques et des dispositifs de contrôle opaque. Lillusion dune concordance parfaite entre fondement et action masque en réalité une dissociation : le fondement est vidé de son contenu normatif, réduit à une invocation rituelle, tandis que leffectuation se déploie dans la violence, larbitraire ou la manipulation technique. Dans ce type d*archicration captée*, labsence de véritable contradictoire — presse muselée, opposition criminalisée, société civile réduite — empêche toute mise à lépreuve du pouvoir. Au lieu dêtre travaillé dans une tension féconde, léquilibre *arcalité/cratialité* est réduit à un simulacre qui absolutise le principe pour mieux immuniser laction.
À lautre extrême, certaines *archicrations* se construisent sur une *fausse fusion* entre fondement et opération. Les régimes autoritaires modernes, comme ceux de la Russie de Vladimir Poutine ou de la Turquie de Recep Tayyip Erdogan, en offrent des incarnations saisissantes. L*arkhè* proclamé — la Nation, la Tradition, la Religion, parfois la Civilisation — est érigé en principe indiscutable, en vérité dorigine inattaquable. Mais cette légitimation abstraite fonctionne comme paravent et sert de couverture à des pratiques de régulation brutales, des répressions ciblées, des ajustements institutionnels opportunistes, des captations oligarchiques et des dispositifs de contrôle opaque. Lillusion dune concordance parfaite entre fondement et action masque en réalité une dissociation : le fondement est vidé de son contenu normatif, réduit à une invocation rituelle, tandis que leffectuation se déploie dans la violence, larbitraire ou la manipulation technique. Dans ce type de configuration régulatrice à archicration captée, labsence de véritable contradictoire — presse muselée, opposition criminalisée, société civile réduite — empêche toute mise à lépreuve du pouvoir. Au lieu dêtre travaillé dans une tension féconde, léquilibre *arcalité/cratialité* est réduit à un simulacre qui absolutise le principe pour mieux immuniser laction.
Cest pourquoi penser la régulation politique à travers le prisme de l*archicration*, ce nest pas inventer un nouveau régime ni esquisser une utopie institutionnelle. Cest surtout déplacer le regard. Refuser de prendre les formes pour des essences, les régimes pour des totalités closes ou les normes pour des évidences. Cest ouvrir une autre cartographie du pouvoir, fondée non sur les déclarations, mais sur les agencements ; non seulement sur les formes héritées, mais aussi sur les opérations effectives. Une cartographie qui permette dinterroger chaque configuration politique en termes darticulation concrète entre ce qui justifie (l*arcalité*) et ce qui agit (la *cratialité*).
Cest là le cœur du geste archicratique : restituer aux sociétés la lisibilité critique de leurs propres agencements, là où le pouvoir cherche à effacer ses fondements, et sa régulation à se rendre inattaquable.
Mais allons plus loin. Si l*archicration* désigne, dans une régulation, le moment où larticulation mouvante de la légitimation et de lopération devient scénique, explicite et publiquement opposable, alors l*archicratie* peut être pensée comme la configuration historique dominante dans laquelle cette articulation seffectue aujourdhui sous condition de défiguration, de dissimulation et de dissémination.
Mais allons plus loin. Si larchicration désigne, dans une régulation, la scène instituée où larticulation entre arcalité et cratialité devient exposable, différable et opposable, alors larchicratie nomme le seuil à partir duquel une configuration politique devient habitable parce quelle maintient distinctes, articulées et exposables larcalité, la cratialité et larchicration. La gouvernementalité contemporaine, telle que Michel Foucault en a dégagé la logique dans ses cours au Collège de France (*Sécurité, territoire, population*, 19771978 ; *Naissance de la biopolitique*, 19781979), éclaire au contraire lun des empêchements majeurs de ce seuil : dissémination technique de lopération, fragilisation des fondements exposables, compression ou neutralisation des scènes dépreuve. Ce nest donc pas larchicratie que nous voyons proliférer aujourdhui, mais des formes désarchicratiques, archicratistiques ou autarchicratiques, dans lesquelles la régulation se poursuit tandis que sa mise en scène contradictoire devient de plus en plus difficile, fictive ou captée.
Par *archicratie*, nous entendons une forme contemporaine de *gouvernementalité désancrée* — au sens où Michel Foucault a dégagé, dans ses cours au Collège de France, comme *méta-régime de rationalité politique* qui déportent lexercice du pouvoir vers des dispositifs et des techniques (Sécurité, territoire, population, 19771978 ; Naissance de la biopolitique, 19781979) — dans laquelle larène politique est défaite, le fondement rendu flottant, et lopération disséminée dans des dispositifs qui ne se laissent plus nommer, ni questionner. Il ne sagit ni dun type de régime, ni dun idéal-type ; cest une *condition régulatrice dépolitisée* — où l*arcalité* est rendue *automatisée* (par et pour la data) et où, l*archicration* étant *oblitérée*, la *cratialité* sexerce *hors de toute instance publique* (algorithme, protocole, contrat, externalisation).
Cette entrée en matière vise à dégager le lieu exact où se joue aujourdhui notre impuissance politique. Cette situation nest pas un déficit de principes ni un excès de pouvoir ; cest le dérèglement adémocratique des régimes de régulation, rendu illisible faute de scènes délibératives et dinstruments partagés.
Cette entrée en matière aura eu comme visée de dégager le lieu exact où se joue aujourdhui notre impuissance politique. Cette situation nest pas un déficit de principes ni un excès de pouvoir ; cest le dérèglement a-démocratique des régimes de régulation, rendu illisible faute de scènes délibératives et dinstruments partagés.
Cest en remontant aux rouages primitifs du pouvoir — l*arcalité*, polarité des formes daffectation, et la *cratialité*, polarité des forces deffectuation — que nous déplaçons la question politique des figures du gouvernement vers les prises différenciées de sa régulation.
Cest en remontant aux rouages primitifs du pouvoir — l*arcalité*, *polarité des formes daffectation* ; la *cratialité*, *polarité des forces deffectuation* — que nous déplaçons la question politique des figures du gouvernement vers les prises différenciées de sa régulation.
En nommant archicration non pas larticulation en général entre fondement et opération, mais la scène instituée où cette articulation devient visible, éprouvable et partiellement opposable, nous nous donnons une première grille de lecture des configurations contemporaines, où les dispositifs agissent sans toujours se légitimer, et où les fondements proclamés — droits humains, droits du travail, droits du vivant — voient décroître leur force dobligation effective, au profit dagencements opératoires qui ne se légitiment plus quà la marge.
En nommant *archicration* cette *articulation dynamique* — souvent instable — *entre ce qui affecte le pouvoir et ce qui en déploie les effets*, nous avons pu construire une première grille de lecture propre aux configurations contemporaines, où les dispositifs agissent sans toujours se légitimer, et où les fondements proclamés — droits humains, droits du travail, droits du vivant — voient décroître leur force dobligation effective, au profit dagencements opératoires qui ne se légitiment plus quà la marge.
Ce que cette notion permet de mettre au jour, ne se limite pas au fonctionnement des régulations, mais aux difficultés croissantes à les voir être interrogées, éprouvées, exposées au contradictoire. Loin de nêtre quune propriété secondaire, cette mise à distance de toute possibilité de contestation structurée constitue désormais un trait central de notre condition politique. Ce qui agit nest plus exposé quà la marge de la discussion publique et ce qui régule dorénavant sexerce de plus en plus en silence, dans lombre, à labri des regards, dans un retrait radical du débat sur ses formes, ses conditions, ses seuils, ses formats.
Ce que cette notion permet de mettre au jour ne se limite pas au fonctionnement des régulations, mais concerne aussi les difficultés croissantes à les voir interrogées, éprouvées, exposées au contradictoire. Loin de nêtre quune propriété secondaire, cette mise à distance de toute possibilité de contestation structurée constitue désormais un trait central de notre condition politique. Ce qui agit nest plus exposé quaux marges de la discussion publique, et ce qui régule sexerce désormais de plus en plus en silence, dans lombre, à labri des regards, dans un retrait radical du débat sur ses formes, ses conditions, ses seuils, ses formats.
Mais ce geste inaugural — critique, archéologique, modélisateur — ne restera légitime et significatif que sil séprouve. Et cest justement à cette mise à lépreuve que se consacreront les chapitres à venir. Car le paradigme archicratique nest pas pur appareillage conceptuel, il est avant tout une méthode de dévoilement, une topologie des régimes régulateurs, un cadre opératoire pour penser la viabilité politique en situation.
Le chapitre I en établira le socle épistémologique rigoureux, en articulant les trois prises fondamentales du modèle — *arcalité, cratialité, archicration* — à une grammaire formelle et symbolique, pensée comme modèle falsifiable, susceptible de simulation et dinterprétation. Il posera la structure tripolaire comme condition dune intelligibilité systémique, traversable tant par lhistoire que par la technique ou la psychologie collective.
Le chapitre I en établira le socle épistémologique rigoureux, en articulant les trois prises fondamentales du modèle — arcalité, cratialité, archicration — à une grammaire formelle et symbolique, pensée comme modèle falsifiable, susceptible de formalisation et dinterprétation. Il posera la structure tripolaire comme condition dune intelligibilité systémique, traversable tant par lhistoire que par la technique ou la psychologie collective.
Le chapitre II délaissera toute abstraction normative pour réinscrire le politique dans la généalogie profonde des régimes de co-viabilité. Il retracera, de manière située et incarnée, les formes empiriques de régulation, depuis les dispositifs totémiques mésolithiques jusquaux technorégulations cryptographiques contemporaines. Il tentera de montrer que toute société se constitue dabord comme régime de *co-viabilité* régulée — dont certaines configurations seulement atteignent un seuil proprement archicratique — bien avant de se penser comme État, comme droit, ou comme nation.
Le chapitre III, dinspiration philosophique, viendra tester l*archicratie* comme outil de relecture des grandes pensées du pouvoir. Plutôt que de les aligner par écoles ou doctrines, il les confrontera à une grille archicratique : *quelle arcalité y opère ? Quelle cratialité sy manifeste ? Quelle scène dépreuve, dopposition, ou de captation y est rendue possible ou empêchée ?* Ce faisant, il opérera un déplacement crucial passant de la justification du pouvoir à la morphologie des régimes de régulation.
Le chapitre IV, dorientation techno-historique, incarnera ces tensions dans lhistoire matérielle même de la modernité. Il ne se contentera pas de relire les révolutions industrielles comme des ruptures productives, mais comme des reconfigurations archicratiques profondes. Chaque mutation technique — de la vapeur à lélectricité, du numérique à lautomatisme — a transformé la manière dont un pouvoir se légitime, agit, se distribue ou se dérobe. La technologie, dans sa manifestation même, devient une instance cratiale, et parfois une matrice d*archicration* détournée, empêchée ou rendu invisible. Cest donc à une lecture de la régulation des bifurcations industrielles que ce chapitre sattachera, afin den révéler les architectures implicites de pouvoir.
Le chapitre IV, dorientation techno-historique, incarnera ces tensions dans lhistoire matérielle même de la modernité. Il ne se contentera pas de relire les révolutions industrielles comme des ruptures productives, mais comme des reconfigurations archicratiques profondes. Chaque mutation technique — de la vapeur à lélectricité, du numérique à lautomatisme — a transformé la manière dont un pouvoir se légitime, agit, se distribue ou se dérobe. La technologie, dans sa manifestation même, devient une instance cratiale, et parfois une matrice darchicration détournée, empêchée ou rendue invisible. Cest donc à une lecture de la régulation des bifurcations industrielles que ce chapitre sattachera, afin den révéler les architectures implicites de pouvoir.
Enfin, le chapitre V affrontera la conflictualité maximale de notre temps : celle des tensions de co-viabilité. Il abordera, lune après lautre, les grandes scènes critiques — économique, écologique, sociale, médiatique, psychique, politique, technologique, géopolitique, cosmopolitique et culturelle — en les traitant non comme objets disciplinaires, mais comme *archicrations* problématiques. Chaque tension y sera relue comme une bifurcation possible : vers une régulation viable, une impasse pathologique ou une captation silencieuse. Ce chapitre constituera le point de bascule, le test ultime du paradigme archicratique : *permet-il de nous aider à discerner, sans dogme, ce qui tient un monde debout — ou le fait vaciller ?*

View File

@@ -1,42 +0,0 @@
---
title: "Démarrage — Essai-thèse"
edition: "archicratie"
status: "modele_sociopolitique"
level: 1
version: "0.0.1"
concepts: ["archicratie"]
links:
- type: "definition"
target: "/glossaire/archicratie/"
note: "Terme canonique."
order: 0
summary: "Page de test (structure)."
---
import Callout from "../../components/Callout.astro";
import Term from "../../components/Term.astro";
Ceci est une page de test pour valider la structure de l**Essai-thèse**.
<Callout kind="definition" title="Entrée minimale">
<p>
<Term term="Archicratie" slug="archicratie" /> : régime où linstance régulatrice est tenue dexposer ses prises,
ses critères et ses scènes dépreuve.
</p>
</Callout>
<Callout kind="these" title="Ce que lédition web doit rendre possible">
<p>Une lecture à plusieurs niveaux, sans confusion entre les productions, et une citabilité stable.</p>
</Callout>
<div class="level-2">
<Callout kind="objection" title="Objection (niveau 2)">
<p>Que gagne-t-on par rapport à une simple doctrine ? Réponse : la scène, la contrainte dexposition, la pluralisation des prises.</p>
</Callout>
</div>
<div class="level-3">
<Callout kind="limite" title="Limite (niveau 3)">
<p>Tout schéma darticulation doit préciser ses non-déductions (transpositions), sinon confusion Traité ↔ Archicratie.</p>
</Callout>
</div>

View File

@@ -1,13 +0,0 @@
---
title: "Démarrage — Atlas"
edition: "atlas"
status: "cartographie"
level: 1
version: "0.0.1"
concepts: ["archicrates"]
links: []
order: 0
summary: "Page de test (structure)."
---
Ceci est une page de test pour valider la structure de l**Atlas**.

Some files were not shown because too many files have changed in this diff Show More