filiation : nommer l'insemination, et rendre a l'humain l'acte d'emancipation

La parente est la seule exception au zero-confiance, et elle est asymetrique :
un ecosysteme neuf ne peut pas s'amorcer lui-meme. Le SITE materialise le
terrain et amorce `ops-01` ; le tenant acheve le reste. Ce geste n'avait pas de
nom, et un geste sans nom ne se borne pas.

LE PARTAGE D'INTELLIGENCE QUI LE REND POSSIBLE, plus net que « le SITE ignore les
roles » : les deux runners portent le meme moteur et n'en consomment pas la meme
face. Le SITE lit `meta/flux.yml` — ce que les roles exigent du RESEAU — et en
tire SDN, pare-feu Proxmox, frontiere. Le tenant lit tasks/templates/integration
— ce qu'ils exigent de la MACHINE. C'est ce partage qui permet au SITE de poser
les bonnes regles sans jamais lire la configuration d'un tenant.

LE COUPLAGE EXISTAIT DEJA, NON DECLARE. `creer-vm` exige `_instance-requise` :
le runner du SITE a du basculer son symlink `instance` sur OPS-Chezlepro pour
materialiser ses VM, alors que son plan pose `serveur_ops_instance: ""`. Rien ne
borne sur quels tenants il porte ni jusqu'a quand.

L'EMANCIPATION EXIGE LA GOUVERNE D'UN HUMAIN. J'avais propose une condition
d'extinction MESUREE — le lien se ferme quand la machine constate l'autonomie.
Erreur symetrique de celle qu'on corrigeait, et le document disait deja pourquoi.
Le fruit de l'emancipation est livre a quelqu'un ; sans quelqu'un pour le
recevoir, il n'y a pas de livraison, seulement un lien qui tombe. Une
emancipation automatique serait une expulsion. Quatre lignes distinctes : le
moteur porte le lien, la machine INSTRUIT, l'humain ACTE, la machine PROUVE.

DEUX LIMITES NOMMEES PLUTOT QUE TUES.

Qui est le parent ? D-81 vide patient 0 de sa raison d'etre — plus un seul
lecteur depuis le 26 — et la machine hors flotte qu'il existe pour remplacer
alimente la forge qui fait autorite : le SPOF n'a pas ete elimine, il a ete
promu. Trois issues posees, aucune tranchee, aucune bloquante.

La separation des voutes est ORGANISATIONNELLE, pas cryptographique : les
fichiers sont separes (site-ops-01 ne detient que underlay.vault.yml) mais un
seul mot de passe ouvre les trois.

make prouver : CONFORME, 52 OK, 0 echec.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019f91zs9SDdwSzL2CVei6on
This commit is contained in:
Daniel Allaire 2026-08-28 12:31:57 -04:00
parent 35853ff5fb
commit c6f2cb1dd9
2 changed files with 198 additions and 12 deletions

View file

@ -1,5 +1,75 @@
# CHANGELOG — Set-OPS # CHANGELOG — Set-OPS
## 2026-08-28 — L'insémination : la parenté est la seule exception au zéro-confiance
**52 preuves.** Entre tenants, la frontière refuse tout ce qui n'est pas déclaré. Mais un
écosystème neuf **ne peut pas s'amorcer lui-même** : quelqu'un doit poser sa première
machine. Ce geste n'avait pas de nom, et un geste sans nom ne se borne pas.
```
le SITE matérialise VNets, VM, routes, flux — le terrain
le SITE amorce ops-01 la première machine, et elle seule
le TENANT achève ses autres machines, ses rôles, ses intégrations
```
**Le partage d'intelligence qui le rend possible**, et qui est plus net que « le SITE ignore
les rôles » : les deux runners portent le même moteur, et n'en consomment pas la même face.
Le SITE lit `roles/*/meta/flux.yml` — ce que les rôles exigent du **réseau** — et en tire le
SDN, le pare-feu Proxmox, la frontière. Le tenant lit `tasks/`, `templates/`,
`meta/integration.yml` — ce qu'ils exigent de la **machine**. *C'est ce partage qui permet
au SITE de poser les bonnes règles sans jamais lire la configuration d'un tenant ni détenir
sa voûte.*
### Le couplage existait déjà, sans être déclaré
`make creer-vm` exige `_instance-requise`. Pour matérialiser les VM de Chezlepro, le runner
du SITE a donc dû basculer son symlink `instance` sur le dépôt de Chezlepro — alors que son
plan pose `serveur_ops_instance: ""` et que la doctrine dit qu'un SITE n'a pas de plan monté
par ce lien. Mesuré sur la machine :
```
/opt/setops/Set-OPS-public/instance -> ../OPS-Chezlepro (27 août 21:52)
```
Rien ne borne sur quels tenants ce lien porte, ni jusqu'à quand. *Le déclarer, c'est le
rendre limitable ; le taire ne l'a jamais empêché.*
### L'émancipation exige la gouverne d'un humain
J'avais proposé une **condition d'extinction mesurée** : le lien se ferme quand la machine
constate que le tenant se reproduit sans son parent. C'était l'erreur symétrique de celle
qu'on corrigeait, et ce document disait déjà pourquoi — *« chaque émancipation est une
décision du client, jamais une rupture technique »*.
**Le fruit de l'émancipation est livré à quelqu'un.** Sans quelqu'un pour le recevoir, il
n'y a pas de livraison : seulement un lien qui tombe. *Une émancipation qui se déclencherait
toute seule ne serait pas une émancipation, ce serait une expulsion.*
D'où quatre lignes qui ne se confondent pas : le moteur porte le **lien**, la machine
produit le **constat d'aptitude** — elle instruit, elle n'agit pas —, **l'humain** pose
l'**acte** sous `CONFIRMER=true`, et la machine **prouve** ensuite que le lien est coupé.
C'est la forme des autres gestes lourds d'ici : `raser` exige son nom d'instance, le mot de
passe de la voûte se tape à l'exécution. **L'émancipation est le deuxième objet de cette
liste.**
### Deux limites nommées plutôt que tues
**Qui est le parent ?** D-81 donne l'autorité du génome à la forge du SITE. Conséquence non
écrite : patient 0, dont la raison d'être est *« porter les dépôts qui fabriquent les
écosystèmes, et les servir à ses enfants »*, n'a plus un seul lecteur — Chezlepro était le
dernier, corrigé le 26. Et la machine hors flotte qu'il existe pour remplacer alimente
désormais la forge qui fait autorité : le point unique de défaillance n'a pas été éliminé,
**il a été promu**. Trois issues sont posées dans le document ; aucune n'est tranchée, et
aucune ne bloque la reconstruction en cours.
**La séparation des voûtes est organisationnelle, pas cryptographique.** Les fichiers sont
bien séparés — vérifié sur `site-ops-01`, qui ne détient que `underlay.vault.yml`. Mais un
**seul mot de passe** ouvre la voûte du site et celles des tenants. « Deux pouvoirs, aucun
omnipotent » décrit la répartition des fichiers, pas celle des clés.
*Un document qui nomme ce qu'il n'a pas encore résolu vaut mieux qu'un document dont on
découvrira le trou en s'appuyant dessus.*
## 2026-08-27 — P52 : matérialiser n'exige pas d'entrer chez le tenant ## 2026-08-27 — P52 : matérialiser n'exige pas d'entrer chez le tenant
**52 preuves.** `creer-vm` confirmait son succès en attendant une réponse SSH. Le runner du **52 preuves.** `creer-vm` confirmait son succès en attendant une réponse SSH. Le runner du

View file

@ -66,18 +66,80 @@ soi dès le premier jour.
| **identité** (LDAP/SSO) | le plus intime | mutualiser l'annuaire, c'est confier ses gens | | **identité** (LDAP/SSO) | le plus intime | mutualiser l'annuaire, c'est confier ses gens |
| **la voûte** | **jamais** | les secrets ne se mutualisent pas, à aucun âge | | **la voûte** | **jamais** | les secrets ne se mutualisent pas, à aucun âge |
## Ce que l'émancipation doit prouver ## L'insémination — le premier lien, et le seul que le SITE ait le droit d'avoir
Basculer une déclaration ne suffit pas. Une émancipation est un **acte outillé** en trois Entre tenants, le zéro-confiance est le défaut : la frontière refuse tout ce qui n'est pas
temps : déclaré, et c'est cette règle qui rend l'hébergement mutualisé défendable. **La parenté est
la seule exception, et elle est asymétrique** : un écosystème neuf ne peut pas s'amorcer
lui-même. Quelqu'un doit poser sa première machine et lui donner de quoi continuer.
1. **déclarer** — lever le drapeau au plan, déployer le service chez soi ; Ce geste s'appelle l'**insémination** :
2. **migrer l'état** — le génome, les sauvegardes, les certificats existants ;
3. **prouver que le lien est coupé** — et c'est le temps qu'on oublie.
Sans cette troisième preuve, on croirait s'être émancipé en restant dépendant sans le ```
savoir. C'est exactement le défaut que ce dépôt traque partout ailleurs : un vert sur un le SITE matérialise VNets, VM, routes, flux — le terrain
périmètre vide. Une émancipation non prouvée est une émancipation non faite. le SITE amorce ops-01 la première machine, et elle seule
le TENANT achève ses autres machines, ses rôles, ses intégrations
```
**Le partage d'intelligence qui le rend possible.** Les deux runners portent le même
moteur ; ils n'en consomment pas la même face :
| | ce qu'il lit du moteur | ce qu'il en fait |
|---|---|---|
| runner du **SITE** | `roles/*/meta/flux.yml` — la face **réseau** des rôles | SDN, pare-feu Proxmox, frontière OPNsense |
| runner du **TENANT** | `tasks/`, `templates/`, `meta/integration.yml` — la face **machine** | configure ses services |
C'est ce partage qui permet au SITE de poser les bonnes règles pour un tenant **sans jamais
lire sa configuration ni détenir sa voûte**. Il sait de quoi les rôles ont besoin sur le
fil ; il ignore ce qu'ils font sur la machine.
**Ce que le lien doit être, pour ne pas devenir un pouvoir permanent :**
- **étroit** — vers le seul `ops-01` du tenant, jamais vers ses autres machines ;
- **déclaré** — dans `meta/flux.yml`, comme tout le reste, pour que la frontière et
`nftables` le connaissent au lieu de le subir ;
- **borné par un acte**, et cet acte appartient à un humain (voir ci-dessous).
> **Ce qui existe déjà sans être déclaré, au 2026-08-28.** `make creer-vm` exige
> `_instance-requise` : pour matérialiser les VM d'un tenant, le runner du SITE doit
> basculer son symlink `instance` sur le dépôt de ce tenant — alors que son plan pose
> `serveur_ops_instance: ""` et que la doctrine dit qu'un SITE n'a pas de plan monté par ce
> lien. Le couplage est donc **déjà là**, et rien ne borne sur quels tenants il porte ni
> jusqu'à quand. Le déclarer, c'est le rendre limitable ; le taire ne l'a jamais empêché.
## Ce que l'émancipation exige — et de qui
Basculer une déclaration ne suffit pas. Mais l'erreur symétrique est plus tentante encore :
faire de l'émancipation un **automatisme**, que la machine déclencherait dès qu'elle
constate que le tenant se reproduit sans son parent.
**L'émancipation exige toujours la gouverne d'un humain.** Le fruit de l'émancipation est
livré à quelqu'un — un client qui reprend ses clés, sa forge, son écosystème. Sans
quelqu'un pour le recevoir, il n'y a pas de livraison : seulement un lien qui tombe. *Une
émancipation qui se déclencherait toute seule ne serait pas une émancipation, ce serait une
expulsion.*
C'est déjà la forme des gestes lourds de ce dépôt : `raser` exige `CONFIRMER=true` et le
nom de l'instance ; le mot de passe de la voûte se tape à l'exécution — « le seul objet que
la reproduction exige d'un humain ». **L'émancipation est le deuxième objet de cette
liste.**
D'où la répartition, qui ne se confond pas :
| | qui l'exécute |
|---|---|
| **le lien de filiation** — déclaré, étroit, visible au plan | le moteur |
| **le constat d'aptitude** — « ce tenant se reproduit sans son parent » | la machine — elle **instruit**, elle n'agit pas |
| **l'acte d'émancipation** — retirer le lien, remettre les clés | **l'humain**, garde `CONFIRMER=true` |
| **la preuve que le lien est coupé** | la machine, **après** l'acte |
La quatrième ligne est celle qu'on oublie, et c'est elle qui décide si les trois autres ont
servi. Sans elle, on croirait s'être émancipé en restant dépendant sans le savoir —
exactement le défaut que ce dépôt traque partout ailleurs : un vert sur un périmètre vide.
**Une émancipation non prouvée est une émancipation non faite.**
*L'instrument de la quatrième ligne n'existe pas encore. C'est la pièce manquante nommée
au bas de ce document.*
## Forme attendue d'une déclaration ## Forme attendue d'une déclaration
@ -93,9 +155,63 @@ l'état de son écosystème d'un coup d'œil plutôt qu'en fouillant chaque rôl
le drapeau est levé sans que l'amont soit nommé : emprunter sans dire à qui, c'est ne rien le drapeau est levé sans que l'amont soit nommé : emprunter sans dire à qui, c'est ne rien
déclarer du tout. déclarer du tout.
## État au 2026-08-24 ## Qui est le parent ? — dilemme ouvert au 2026-08-28
Ce document décrit la filiation sans dire **de qui** un écosystème descend. La question
n'est plus théorique depuis que les runners savent reconstruire : chaque écosystème rebâti
grave sa réponse dans son plan (`serveur_ops_forge_amont`), et N réponses différentes font
N lignées qu'on ne saura plus rapprocher.
La chaîne réelle, mesurée :
```
poste de l'exploitant ──push──▶ eregion.chezlepro.ca:2222
= forge.alliance-boreale.ca ◀── HORS FLOTTE
│ git bundle │ miroir 8 h
▼ ▼
forge du SITE ★ autorité (D-81) forge de patient 0 ★ « la forge mère »
│ │
▼ ▼
les tenants du site (plus aucun lecteur)
```
Trois faits qui ne tiennent pas ensemble :
1. **Patient 0 ne sert plus personne.** Chezlepro était son dernier lecteur, corrigé le
2026-08-26 vers la forge du site. Son dépôt affirme toujours sa raison d'être — *« porter
les dépôts qui fabriquent les écosystèmes, et les servir à ses enfants »*.
2. **Le point unique de défaillance n'a pas été éliminé, il a été promu.** Patient 0 existe
explicitement pour remplacer une machine hors flotte que Set-OPS ne déploie ni ne prouve
— or c'est de cette machine que la forge faisant autorité tire son contenu.
3. **Le parent est locataire de son enfant.** Patient 0 est un tenant de la fabric d'un
site qui descend de lui. L'ancêtre ne peut pas être le chemin de reprise de son hôte.
Trois issues, à trancher par l'exploitant — et par lui seul, comme toute émancipation :
| issue | ce qu'elle impose |
|---|---|
| **patient 0 redevient la source** ; chaque forge de SITE en miroite | le rendre atteignable depuis **tout** site — il vit aujourd'hui dans la fabric d'un seul |
| **le SITE est la source** ; patient 0 devient une **référence**, non un ancêtre | assumer que la racine est le poste + la machine hors flotte, donc l'intégrer à la flotte ou la remplacer |
| **pas de racine — une famille de pairs** ; D-81 se restreint à « autorité pour les tenants d'un site » | bâtir non pas une hiérarchie mais une **preuve de convergence** entre toutes les copies vivantes |
*Aucune n'est bloquante pour la reconstruction en cours : les tenants pointent déjà sur la
forge de leur site, ce qui reste vrai dans les trois.*
## État au 2026-08-28
Seule la forge porte cette déclaration complète (`serveur_ops`). Les autres services Seule la forge porte cette déclaration complète (`serveur_ops`). Les autres services
mutualisés le sont par des mécanismes antérieurs, cohérents mais non uniformes. Les mutualisés le sont par des mécanismes antérieurs, cohérents mais non uniformes. Les
aligner sur la forme ci-dessus reste à faire — et l'instrument de preuve de l'étape 3 aligner sur la forme ci-dessus reste à faire.
n'existe pas encore.
**Les deux pièces manquantes**, l'une et l'autre nommées plus haut :
- le **lien d'insémination** n'est pas déclaré — il existe pourtant, par le symlink
`instance` du runner du SITE, sans borne ni visibilité ;
- l'**instrument de preuve** de la dernière ligne — « le lien est coupé » — n'existe pas.
Tant qu'il manque, aucune émancipation ne peut être déclarée faite.
**Une limite mesurée le 2026-08-28, à connaître avant de s'appuyer sur cette frontière :**
la séparation des voûtes est **organisationnelle, pas cryptographique**. Les fichiers sont
bien séparés — le runner du SITE ne détient que `underlay.vault.yml`, vérifié sur la
machine — mais **un seul mot de passe ouvre la voûte du site et celles des tenants**. « Deux
pouvoirs, aucun omnipotent » décrit donc la répartition des fichiers, pas celle des clés.