le wiki suit le genome : un locataire n en est pas depositaire

Decision : seuls les SITES portent la forge, le cache APT et les artefacts. Meme
geste que le retrait de serveur_artefacts d un plan de locataire, un cran plus
loin — le site fournit tout ce dont un tenant a besoin pour venir au monde.

La generalisation de forge_amorcer a un locataire est revenue en arriere : elle
implementait le modele ecarte, et la garder en ferait un piege.

ma_forge ne derive plus MA forge mais la forge qui porte MON genome. Le signal
est deja au plan : serveur_ops_forge_externe dit je lis mon genome ailleurs. Qui
le declare consulte, il ne republie pas.

Reste vrai : une forge de locataire peut exister pour LE CODE DE SES GENS —
c est l offre Atelier. Ce n est pas l endroit ou vit le moteur.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Crgis8CxCWkAGFA1ecBz3q
This commit is contained in:
Daniel Allaire 2026-09-14 14:41:23 -04:00
parent 8574b7b540
commit f307a23345
2 changed files with 66 additions and 1 deletions

View file

@ -1,5 +1,43 @@
# CHANGELOG — Set-OPS # CHANGELOG — Set-OPS
## 2026-09-14 (11) — Le wiki suit le genome, et un locataire n'en est pas depositaire
Decision de l'exploitant : **seuls les SITES portent la forge, le cache APT et les
artefacts.** Un locataire n'a pas besoin de sa propre forge pour le moteur — il le lit
chez son hebergeur, comme il y prend ses paquets et son gabarit.
C'est le meme geste que le retrait de `serveur_artefacts` du plan d'un locataire, un cran
plus loin, et la meme phrase le porte : *le site fournit tout ce dont un tenant a besoin
pour venir au monde*.
### Ce que la soiree avait deja chiffre
Une forge par locataire, c'est une organisation, des depots, un mot de passe d'admin en
voute, un mecanisme d'amorcage, un wiki, un miroir a tenir synchrone, et une preuve qu'il
ne derive pas. Mesure du 2026-09-14 sur TechnoLibre : forge servie en `https=200`, cle du
runner acceptee, **zero depot**. La chaine n'existait pas — pour UN locataire.
### La distinction qui reste vraie
« Un locataire n'a pas besoin d'une forge **pour le genome** » n'est pas « un locataire n'a
jamais de forge ». L'offre **Atelier** vend precisement une forge a des equipes qui
developpent : depots, tickets, revues, pour LEUR code. Ce n'est simplement pas l'endroit ou
vit le moteur.
### Ce qui a ete defait, et pourquoi
La generalisation de `forge_amorcer.py` a un locataire est **revenue en arriere** : elle
implementait le modele ecarte. La garder en ferait du code mort au mieux, un piege au pire
— quelqu'un finirait par le lancer.
`ma_forge.py` change de regle : il ne derive plus « MA forge » mais **la forge qui porte
mon genome**. Le signal est deja au plan — `serveur_ops_forge_externe: true` dit « je lis
mon genome ailleurs ». Un ecosysteme qui le declare ne publie pas : il consulte, la ou le
genome vit.
OPS-Technolibre -> refus : lit son genome sur 10.37.33.11
SITE-Chezlepro -> forge.genese.internal
## 2026-09-14 (10) — Le temoin du wiki pointait une forge VIDE ## 2026-09-14 (10) — Le temoin du wiki pointait une forge VIDE
En publiant les fiches de role, `make wiki-publier` a refuse : le wiki vise par le temoin En publiant les fiches de role, `make wiki-publier` a refuse : le wiki vise par le temoin

View file

@ -1,5 +1,5 @@
#!/usr/bin/env python3 #!/usr/bin/env python3
"""L'adresse du wiki de MA forge — celle de l'ecosysteme monte. """L'adresse du wiki de la forge QUI PORTE MON GENOME.
CHAQUE RUNNER PUBLIE POUR SA FORGE (decide le 2026-09-14). CHAQUE RUNNER PUBLIE POUR SA FORGE (decide le 2026-09-14).
@ -20,6 +20,19 @@ DEUX NOTIONS A NE PAS CONFONDRE, et c'est ce qui a rendu le sujet trouble :
Le runner d'un locataire lit sur la forge du SITE et sert sur la SIENNE. Les deux adresses Le runner d'un locataire lit sur la forge du SITE et sert sur la SIENNE. Les deux adresses
different, et le wiki appartient a la seconde. different, et le wiki appartient a la seconde.
LE WIKI SUIT LE GENOME (decide le 2026-09-14). Un locataire ne porte PAS le moteur : il le
lit sur la forge de son hebergeur, comme il y prend ses paquets et son gabarit. Lui faire
publier la documentation du moteur sur SA forge reviendrait a l'en rendre depositaire —
donc a lui imposer l'organisation, les depots, le miroir a tenir synchrone et la preuve
qu'il ne derive pas. Pour un service qu'il ne rend a personne.
LE SIGNAL EST DEJA AU PLAN : `serveur_ops_forge_externe: true` dit « je lis mon genome
ailleurs ». Un ecosysteme qui le declare ne publie pas — il consulte, la ou le genome vit.
CE QUI RESTE VRAI D'UNE FORGE DE LOCATAIRE : elle peut exister, et servir LE CODE DE SES
GENS — depots, tickets, revues. C'est l'offre « Atelier ». Ce n'est simplement pas
l'endroit ou vit le moteur.
CE QUI N'EST PAS DERIVABLE, ET C'EST DIT PLUTOT QUE DEVINE : le poste du mainteneur n'est CE QUI N'EST PAS DERIVABLE, ET C'EST DIT PLUTOT QUE DEVINE : le poste du mainteneur n'est
le runner d'aucun ecosysteme. Il publie vers le domicile PUBLIC du projet, qui n'est la le runner d'aucun ecosysteme. Il publie vers le domicile PUBLIC du projet, qui n'est la
forge d'aucun plan. La, `WIKI_REMOTE` reste explicite — et il l'emporte toujours. forge d'aucun plan. La, `WIKI_REMOTE` reste explicite — et il l'emporte toujours.
@ -53,6 +66,20 @@ def ma_forge() -> tuple[str | None, str]:
except (OSError, ValueError) as e: except (OSError, ValueError) as e:
return None, f"plan illisible ({e.__class__.__name__})" return None, f"plan illisible ({e.__class__.__name__})"
# UN ECOSYSTEME QUI LIT SON GENOME AILLEURS NE LE PUBLIE PAS. Le wiki suit le genome :
# il vit la ou le moteur vit, et un locataire n'est pas son depositaire.
gv = Path(inst) / "inventories" / "principal" / "group_vars" / "serveur_ops.yml"
if gv.is_file():
try:
import yaml
d = yaml.safe_load(gv.read_text(encoding="utf-8")) or {}
except (OSError, yaml.YAMLError):
d = {}
if d.get("serveur_ops_forge_externe"):
amont = d.get("serveur_ops_forge_amont") or "sa forge amont"
return None, (f"{Path(inst).resolve().name} lit son genome sur {amont} — "
"le wiki s'y consulte, il ne s'y republie pas d'ici")
# LE NOM DU SERVICE, PAS CELUI DE LA MACHINE. Un FQDN expose survit au demenagement du # LE NOM DU SERVICE, PAS CELUI DE LA MACHINE. Un FQDN expose survit au demenagement du
# service ; `forge-01` non. C'est la meme regle que partout ailleurs dans ce depot. # service ; `forge-01` non. C'est la meme regle que partout ailleurs dans ce depot.
for nom, app in (apps.items() if isinstance(apps, dict) else []): for nom, app in (apps.items() if isinstance(apps, dict) else []):