Files
archicratie-edition/docs/diagrams/archicratie-web-edition-machine-editoriale.svg
Archicratia 78eb9cbb58
All checks were successful
CI / build-and-anchors (push) Successful in 1m46s
SMOKE / smoke (push) Successful in 14s
chore: add diagrams + scripts + archicrat-ia route
2026-02-20 18:27:25 +01:00

632 lines
14 KiB
XML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
width="1600"
height="1020"
viewBox="0 0 1600 1020"
version="1.1"
id="svg77"
sodipodi:docname="archicratie-web-edition-machine-editoriale.svg"
inkscape:version="1.3-alpha (95f74fb, 2023-03-31)"
inkscape:export-filename="out/archicratie-web-edition-machine-editoriale.png"
inkscape:export-xdpi="96"
inkscape:export-ydpi="96"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<sodipodi:namedview
id="namedview77"
pagecolor="#ffffff"
bordercolor="#000000"
borderopacity="0.25"
inkscape:showpageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1"
inkscape:zoom="0.82625"
inkscape:cx="409.07716"
inkscape:cy="573.0711"
inkscape:window-width="1472"
inkscape:window-height="1022"
inkscape:window-x="234"
inkscape:window-y="30"
inkscape:window-maximized="0"
inkscape:current-layer="svg77" />
<defs
id="defs1">
<marker
id="arrow"
viewBox="0 0 10 10"
refX="9.5"
refY="5"
markerWidth="8"
markerHeight="8"
orient="auto-start-reverse">
<path
d="M 0 0 L 10 5 L 0 10 z"
fill="#222"
id="path1" />
</marker>
<style
id="style1">
.title { font: 700 22px sans-serif; fill:#111; }
.small { font: 12px sans-serif; fill:#111; }
.h2 { font: 700 16px sans-serif; fill:#111; }
.h3 { font: 700 14px sans-serif; fill:#111; }
.txt { font: 13px sans-serif; fill:#111; }
.mono { font: 12px ui-monospace, SFMono-Regular, Menlo, monospace; fill:#111; }
.zone { fill:#f3f3f3; stroke:#111; stroke-width:2; }
.box { fill:#fafafa; stroke:#222; stroke-width:1.5; }
.note { fill:#fff; stroke:#666; stroke-width:1.2; }
.line { stroke:#222; stroke-width:2; fill:none; marker-end:url(#arrow); }
.dash { stroke:#222; stroke-width:2; fill:none; stroke-dasharray:7 6; marker-end:url(#arrow); }
</style>
</defs>
<!-- Header -->
<text
x="40"
y="45"
class="title"
id="text1">Archicratie Web Edition : Machine éditoriale VERBATIM (Proposer / Citer / /_auth/whoami / aliases / apply-ticket)</text>
<text
x="40"
y="75"
class="small"
id="text2">Sources “vraies” : src/layouts/EditionLayout.astro (WHOAMI_PATH=&quot;/_auth/whoami&quot;, GITEA_* via import.meta.env.PUBLIC_*), src/anchors/anchor-aliases.json, scripts/inject-anchor-aliases.mjs, scripts/apply-ticket.mjs --alias.</text>
<!-- ZONE A: Runtime -->
<rect
x="35"
y="110"
width="1530"
height="420"
rx="18"
class="zone"
id="rect2" />
<text
x="60"
y="145"
class="h2"
id="text3">A — Runtime (navigateur) : paragraphe → outils (¶ / Citer / Proposer) → issue Gitea</text>
<!-- Reader -->
<rect
x="60"
y="175"
width="380"
height="160"
rx="12"
class="box"
id="rect3" />
<text
x="80"
y="205"
class="h2"
id="text4">Utilisateur (lecteur/éditeur)</text>
<text
x="80"
y="230"
class="txt"
id="text5">• lit une page</text>
<text
x="80"
y="252"
class="txt"
id="text6">• sur un paragraphe : ¶ / Citer / Proposer</text>
<text
x="80"
y="274"
class="txt"
id="text7">• Proposer visible uniquement si “editors”</text>
<text
x="80"
y="300"
class="small"
id="text8">(le gate est runtime via whoami)</text>
<!-- Astro page + EditionLayout -->
<rect
x="470"
y="175"
width="560"
height="330"
rx="12"
class="box"
id="rect8" />
<text
x="490"
y="205"
class="h2"
id="text9">Site Astro statique — EditionLayout</text>
<text
x="490"
y="230"
class="mono"
id="text10">src/layouts/EditionLayout.astro</text>
<text
x="490"
y="260"
class="h3"
id="text11">Variables publiques injectées</text>
<text
x="490"
y="282"
class="txt"
id="text13"><tspan
class="mono"
id="tspan11">PUBLIC_GITEA_BASE</tspan>, <tspan
class="mono"
id="tspan12">PUBLIC_GITEA_OWNER</tspan>, <tspan
class="mono"
id="tspan13">PUBLIC_GITEA_REPO</tspan></text>
<text
x="490"
y="304"
class="txt"
id="text14">• si une manque : giteaReady=false → Proposer désactivé</text>
<text
x="490"
y="338"
class="h3"
id="text15">Outils paragraphe</text>
<text
x="490"
y="360"
class="txt"
id="text16">• ¶ : lien dancre vers <tspan
class="mono"
id="tspan15">#p-…</tspan></text>
<text
x="490"
y="382"
class="txt"
id="text17">• Citer : copie une citation structurée (titre + URL#ancre)</text>
<text
x="490"
y="404"
class="txt"
id="text18">• Proposer : modal 2 étapes → ouvre <tspan
class="mono"
id="tspan17">/issues/new?...</tspan></text>
<text
x="490"
y="438"
class="h3"
id="text19">Gate “editors” (whoami)</text>
<text
x="490"
y="460"
class="txt"
id="text20"><tspan
class="mono"
id="tspan19">WHOAMI_PATH=&quot;/_auth/whoami&quot;</tspan> + fetch same-origin</text>
<text
x="490"
y="482"
class="txt"
id="text21">• lit header <tspan
class="mono"
id="tspan20">Remote-Groups</tspan> → affiche/retire Proposer du DOM</text>
<!-- Edge/Auth -->
<rect
x="1060"
y="175"
width="250"
height="160"
rx="12"
class="box"
id="rect21" />
<text
x="1080"
y="205"
class="h2"
id="text22">Traefik edge</text>
<text
x="1080"
y="230"
class="txt"
id="text23">• Host(archicratie…)</text>
<text
x="1080"
y="252"
class="txt"
id="text24">• middleware : chain-auth</text>
<text
x="1080"
y="274"
class="txt"
id="text25">• route <tspan
class="mono"
id="tspan24">/_auth/whoami</tspan></text>
<text
x="1080"
y="300"
class="small"
id="text26">forward-auth vers Authelia</text>
<rect
x="1060"
y="350"
width="250"
height="155"
rx="12"
class="box"
id="rect26" />
<text
x="1080"
y="380"
class="h2"
id="text27">Authelia + LLDAP</text>
<text
x="1080"
y="405"
class="txt"
id="text28">• forward-auth : <tspan
class="mono"
id="tspan27">:9091</tspan></text>
<text
x="1080"
y="427"
class="txt"
id="text29">• groupes via LDAP</text>
<text
x="1080"
y="449"
class="txt"
id="text30">• injecte headers Remote-*</text>
<text
x="1080"
y="471"
class="small"
id="text31">non auth ⇒ 302 vers auth.*</text>
<!-- Gitea issue -->
<rect
x="1330"
y="175"
width="220.47655"
height="328.7897"
rx="12"
class="box"
id="rect31" />
<text
x="1350"
y="205"
class="h2"
id="text32">Gitea (UI)</text>
<text
x="1350"
y="230"
class="txt"
id="text33">Issue préremplie :</text>
<text
x="1350"
y="255"
class="mono"
id="text34">BASE/OWNER/REPO/issues/new</text>
<text
x="1350"
y="287"
class="txt"
id="text35">Contenu typique :</text>
<text
x="1350"
y="309"
class="txt"
id="text36">• URL page + <tspan
class="mono"
id="tspan35">#p-…</tspan></text>
<text
x="1350"
y="331"
class="txt"
id="text37">• Type / State / Category</text>
<text
x="1350"
y="353"
class="txt"
id="text38">• proposition / commentaire</text>
<text
x="1350"
y="385"
class="txt"
id="text39">Résultat :</text>
<text
x="1350"
y="407"
class="txt"
id="text40">• issue = backlog éditorial</text>
<text
x="1350"
y="429"
class="txt"
id="text41">• labels (CI/bot) pour tri</text>
<!-- Runtime connections -->
<path
d="M 440 260 L 470 260"
class="line"
id="path41" />
<path
d="M 1030 470 L 1060 470"
class="dash"
id="path42" />
<path
d="M 1310 320 L 1330 320"
class="line"
id="path43" />
<path
d="M 1030 270 L 1060 270"
class="dash"
id="path44" />
<rect
x="60"
y="355"
width="380"
height="150"
rx="12"
class="note"
id="rect44" />
<text
x="80"
y="385"
class="h2"
id="text44">Contrat runtime (robuste)</text>
<text
x="80"
y="410"
class="txt"
id="text45">• Citer marche sans droits (copie + lien)</text>
<text
x="80"
y="432"
class="txt"
id="text46">• Proposer nexiste pas si non “editors”</text>
<text
x="80"
y="454"
class="txt"
id="text47">• whoami renvoie 302 login si non auth</text>
<text
x="80"
y="476"
class="txt"
id="text48">• si PUBLIC_GITEA_* faux → 404/login loop</text>
<!-- ZONE B: CI / labels -->
<rect
x="35"
y="545"
width="1530"
height="210"
rx="18"
class="zone"
id="rect48" />
<text
x="60"
y="580"
class="h2"
id="text49">B — Automatisation : issue → labels + checks qualité</text>
<rect
x="60"
y="610"
width="520"
height="120"
rx="12"
class="box"
id="rect49" />
<text
x="80"
y="640"
class="h2"
id="text50">Gitea Actions (workflows)</text>
<text
x="80"
y="665"
class="txt"
id="text51">• triggers : issues opened / edited (labels)</text>
<text
x="80"
y="687"
class="txt"
id="text52">• checks build : anchors / aliases / inline-js / dist audit</text>
<text
x="80"
y="709"
class="small"
id="text53">token API requis côté job (ex : FORGE_TOKEN) pour écrire labels</text>
<rect
x="610"
y="610"
width="430"
height="120"
rx="12"
class="box"
id="rect53" />
<text
x="630"
y="640"
class="h2"
id="text54">Runner</text>
<text
x="630"
y="665"
class="txt"
id="text55">• conteneur : <tspan
class="mono"
id="tspan54">gitea-act-runner (gitea/act_runner)</tspan></text>
<text
x="630"
y="687"
class="txt"
id="text56">• exécute jobs (souvent en conteneur)</text>
<text
x="630"
y="709"
class="txt"
id="text57">• appelle API Gitea pour labels</text>
<rect
x="1070"
y="610"
width="465"
height="120"
rx="12"
class="box"
id="rect57" />
<text
x="1090"
y="640"
class="h2"
id="text58">Gitea (API) + labels</text>
<text
x="1090"
y="665"
class="txt"
id="text59">• labels = tri natif (type/state/cat)</text>
<text
x="1090"
y="687"
class="txt"
id="text60">• backlog propre, opérable</text>
<text
x="1090"
y="709"
class="small"
id="text61">si 401 : token manquant/mauvais droits</text>
<path
d="M 580 670 L 610 670"
class="line"
id="path61" />
<path
d="M 1040 670 L 1070 670"
class="line"
id="path62" />
<!-- ZONE C: Re-integration + anchors -->
<rect
x="35"
y="780"
width="1530"
height="210"
rx="18"
class="zone"
id="rect62" />
<text
x="300"
y="815"
class="h2"
id="text62"
style="font-style:normal;font-variant:normal;font-weight:700;font-stretch:normal;font-size:16px;line-height:normal;font-family:sans-serif">C — Réintégration : correction → contenu web + stabilité des ancres (aliases build-time)</text>
<rect
x="60"
y="850"
width="520"
height="115"
rx="12"
class="box"
id="rect63" />
<text
x="80"
y="880"
class="h2"
id="text63">Apply-ticket</text>
<text
x="80"
y="905"
class="mono"
id="text64">scripts/apply-ticket.mjs &lt;issue_number&gt; --alias</text>
<text
x="80"
y="929"
class="txt"
id="text65">• applique patch dans src/content/…</text>
<text
x="80"
y="951"
class="txt"
id="text66">• écrit alias old→new dans <tspan
class="mono"
id="tspan65">src/anchors/anchor-aliases.json</tspan></text>
<rect
x="610"
y="850"
width="518.78973"
height="130.73373"
rx="12"
class="box"
id="rect66" />
<text
x="630"
y="880"
class="h2"
id="text67">Aliases canon + injection</text>
<text
x="630"
y="905"
class="mono"
id="text68">src/anchors/anchor-aliases.json</text>
<text
x="630"
y="929"
class="txt"
id="text69">postbuild : <tspan
class="mono"
id="tspan68">node scripts/inject-anchor-aliases.mjs</tspan></text>
<text
x="630"
y="951"
class="txt"
id="text70"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:13px;line-height:normal;font-family:sans-serif"><tspan
sodipodi:role="line"
id="tspan77"
x="630"
y="951">• injecte</tspan><tspan
sodipodi:role="line"
id="tspan78"
x="630"
y="967.25">&lt;span id=&quot;oldId&quot; class=&quot;para-alias&quot;&gt; avant newId dans dist/**/index.html</tspan></text>
<rect
x="1160"
y="850"
width="375"
height="115"
rx="12"
class="box"
id="rect70" />
<text
x="1180"
y="880"
class="h2"
id="text71">Preuves (tests)</text>
<text
x="1180"
y="905"
class="txt"
id="text72"><tspan
class="mono"
id="tspan71">scripts/check-anchor-aliases.mjs</tspan></text>
<text
x="1180"
y="929"
class="txt"
id="text73"><tspan
class="mono"
id="tspan72">scripts/verify-anchor-aliases-in-dist.mjs</tspan></text>
<text
x="1180"
y="951"
class="txt"
id="text74"><tspan
class="mono"
id="tspan73">scripts/check-anchors.mjs</tspan></text>
<path
d="M 1495 545 L 1495 505"
class="dash"
id="path74" />
<path
d="M 220,730 V 850"
class="line"
id="path75" />
<path
d="M 580 908 L 610 908"
class="line"
id="path76" />
<path
d="M 1130 908 L 1160 908"
class="line"
id="path77" />
</svg>