diff --git a/CHANGELOG.md b/CHANGELOG.md index 8dd5a10..60e45f6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,29 @@ # CHANGELOG — Set-OPS +## 2026-07-21 + +### Ajouté +- **Protocole d'épreuve de l'opérateur indépendant** (`docs/audit/protocole-operateur-independant.md`). + Met **AFF-002** (« Set-OPS s'exploite entièrement à la main, sans aucune IA ») à l'épreuve + d'un sysadmin qui n'est pas l'auteur, sur sa propre grappe Proxmox, à froid depuis le modèle + public `socle`. Définit : la **règle du silence** (l'observateur journalise, n'aide pas ; trois + niveaux N0/N1/N2), les **interdits** (aucune IA, aucun accès aux dépôts privés, aucune lecture + de `docs/audit/` qui divulguerait les pièges connus), les **critères de réussite R1→R6 fixés + d'avance**, le périmètre matériel et la sécurité, et le **gabarit de rapport** + (`operateur-independant-AAAA-MM-JJ.md`). Le registre peut **perdre** : le protocole prévoit + explicitement la redescente d'AFF-002 en 🟡 ou ❌ selon le verdict. + +### Modifié +- **`docs/audit/affirmations.md`** — nouvelle limite consignée : **AFF-002 est ✅ *par + inspection*, pas par démonstration**. Ses écarts bloquants sont soldés, mais aucun opérateur + indépendant ne l'a exécutée ; ✅ y signifie « plus aucun défaut connu ». Renvoi vers le + protocole. +- **`docs/audit/README.md`** — « Les trois pièces » → « Les pièces » : ajout du protocole comme + quatrième pièce du dispositif (l'épreuve humaine, hors harnais automatisable). + +Validé : `python3 scripts/prouver.py --verifier` → **CONFORME 16/16** (voûte exportée) ; +équilibre des blocs de code du nouveau document vérifié. Aucun code touché. + ## 2026-07-20 ### Modifié diff --git a/docs/audit/README.md b/docs/audit/README.md index d3309f5..3f3e08e 100644 --- a/docs/audit/README.md +++ b/docs/audit/README.md @@ -3,13 +3,14 @@ Ce dossier contient le dispositif qui garde Set-OPS **honnête** : il ne doit jamais affirmer plus que ce qu'il prouve. -## Les trois pièces +## Les pièces | Fichier | Rôle | |---|---| | [`affirmations.md`](affirmations.md) | **Le registre** : chaque affirmation publique du dépôt (README, AGENTS, QUICKSTART, docs, wiki, aide `make`, GUI) tracée vers une commande de preuve et un statut (✅/🟡/❌/⚪), plus le **journal des traitements** (ce qui a été corrigé, quand, comment). | | `scripts/prouver.py` | **Le harnais** : un orchestrateur mince qui **rejoue** les preuves automatisables du registre en appelant l'outillage existant (les mêmes scripts que `make verifier`). Il ne réimplémente aucune validation. | | `preuve-AAAA-MM-JJ.md` | **La pièce justificative** : le rapport horodaté produit par `make prouver`. Rejouable et présentable (audit, certification, revue). | +| [`protocole-operateur-independant.md`](protocole-operateur-independant.md) | **L'épreuve humaine** : le protocole qui met AFF-002 (« exploitable sans IA ») à l'épreuve d'un sysadmin qui n'est pas l'auteur. Aucune commande locale ne peut prouver cette affirmation ; produit un rapport `operateur-independant-AAAA-MM-JJ.md`. | ## Produire une preuve diff --git a/docs/audit/affirmations.md b/docs/audit/affirmations.md index ea2dea7..630abca 100644 --- a/docs/audit/affirmations.md +++ b/docs/audit/affirmations.md @@ -374,6 +374,13 @@ couvert indirectement par P03), AFF-051 (autorité d'`AGENTS.md`), AFF-073/075 ( ## Limites de cet audit +- **AFF-002 est ✅ *par inspection*, pas par démonstration.** Ses écarts bloquants ont été + soldés (parcours QUICKSTART, `make verifier`) et le parcours relu de bout en bout, mais + **aucun opérateur indépendant ne l'a jamais exécuté**. ✅ signifie ici « plus aucun défaut + connu », pas « démontré ». C'est la seule affirmation du registre qu'aucune commande + locale ne peut prouver : elle exige un humain qui n'est pas l'auteur. Épreuve prévue : + [`protocole-operateur-independant.md`](protocole-operateur-independant.md) — son rapport + fera foi, y compris s'il fait redescendre AFF-002 en 🟡 ou ❌. - **Hors production** : toute affirmation nécessitant une VM, Proxmox, le réseau ou la flotte vivante (`make valider`, `make deployer*`, `make creer-vm`, `--check` réel, les très nombreux « **prouvé sur VM réelles** » du `CHANGELOG.md`) est marquée ⚪ ou 🟡 — diff --git a/docs/audit/protocole-operateur-independant.md b/docs/audit/protocole-operateur-independant.md new file mode 100644 index 0000000..0ca1d5a --- /dev/null +++ b/docs/audit/protocole-operateur-independant.md @@ -0,0 +1,197 @@ +# Protocole — épreuve de l'opérateur indépendant + +Épreuve empirique de l'affirmation **AFF-002** : *« Set-OPS s'exploite entièrement à la +main — la doc, `make` et le GUI suffisent, sans aucune IA »* (README:9 ; `AGENTS.md` +principe 10). + +> **Pourquoi cette épreuve existe.** En phase 5, AFF-002 est passée 🟡 → ✅ **par +> inspection** : ses écarts bloquants ont été soldés et le parcours relu de bout en bout. +> Aucun opérateur indépendant ne l'a jamais exécuté. Tant que ce test n'a pas eu lieu, +> ✅ signifie « plus aucun défaut connu », pas « démontré ». C'est la seule affirmation +> du registre qu'aucune commande locale ne peut prouver : elle exige un humain qui n'est +> pas l'auteur. + +## Ce que l'épreuve mesure + +**Mesuré** : ce que le dépôt public transmet, seul, à un sysadmin compétent qui ne +connaît pas Set-OPS — depuis `QUICKSTART.md`, sur sa propre grappe Proxmox, du dépôt nu +jusqu'à un socle déployé. + +**Non mesuré** : les modèles assemblés (dépôt privé `Set-OPS-modeles`), les services +hors socle, l'ergonomie du GUI au-delà de son ouverture, la tenue en exploitation dans +la durée. + +## Rôles + +| Rôle | Qui | Mandat | +|---|---|---| +| **Opérateur** | un sysadmin qui n'est pas l'auteur | Seul acteur. Exécute, décide, se débloque. | +| **Observateur** | l'auteur / mainteneur du dépôt | Journalise. **N'aide pas.** Ne touche à rien. | + +Le protocole est **réutilisable** : il ne nomme personne. L'identité de l'opérateur d'une +session donnée est portée par son rapport, sous la réserve de consentement ci-dessous. + +## La règle du silence + +C'est le cœur du protocole, et la partie difficile. + +> **Chaque fois que l'observateur a envie d'intervenir, c'est un défaut de +> documentation. Il le note, il se tait.** + +Un opérateur débloqué par l'auteur ne prouve rien — sinon que l'auteur sait. Ce qu'on +mesure est exactement ce qui reste quand l'auteur est absent. + +Trois niveaux d'intervention, décidés d'avance : + +| Niveau | Déclencheur | Effet | +|---|---|---| +| **N0 — silence** | Défaut. C'est l'état par défaut. | Rien n'est dit. Le chrono du blocage tourne. | +| **N1 — déblocage minimal** | L'opérateur est bloqué **> 30 min** sur une même étape et le demande. | Réponse la plus courte possible, sans contexte ni leçon. **Consigné comme défaut**, gravité proportionnelle au temps perdu. | +| **N2 — arrêt sécurité** | Risque de détruire quelque chose de réel (VM, données, réseau hors périmètre). | Interruption immédiate. **N'est pas un défaut.** | + +L'observateur journalise aussi ses **démangeaisons** : chaque fois qu'il a voulu parler +mais que l'opérateur s'est débloqué seul. Même sans N1, c'est un signal de faiblesse +documentaire. + +## Interdits pour l'opérateur + +- **Aucune IA** — pas de Claude, ChatGPT, Copilot ou équivalent, à aucune étape. +- **Aucune question à l'auteur**, hors N1 formalisé et N2. +- **Aucun accès** aux dépôts privés (`Set-OPS-modeles`, `OPS-*`). +- **Aucune lecture de `docs/audit/`** — le registre décrit les pièges connus. Le lire, + c'est connaître les réponses de l'examen. + +**Autorisé** : toute la documentation publique du dépôt, `man`, et le web pour ce qui +n'est pas Set-OPS (Debian, Ansible, Proxmox, nginx…). C'est le comportement réel d'un +sysadmin. + +## Ce que l'auteur fournit + +**Uniquement l'URL du dépôt public**, et ce protocole. + +Rien d'autre. En particulier, l'auteur ne prépare **ni** le jeton API Proxmox, **ni** les +clés SSH, **ni** le mot de passe Vault, **ni** le moindre fichier d'instance : ce sont +les prérequis de `QUICKSTART.md` §0, et savoir les produire fait partie de l'épreuve. + +## Périmètre matériel et sécurité + +L'opérateur part sur **sa propre grappe Proxmox**. + +- [ ] Confirmer **avant de commencer** que le périmètre n'est pas de la production + Technolibre : nœud dédié, ou à défaut plage VMID + stockage réservés à l'épreuve. +- [ ] Noter la plage VMID retenue : `____________` +- [ ] `make nettoyer-modele CONFIRMER=true` est **destructif** — il s'applique à la VM + modèle, jamais à autre chose. Vérifier la cible avant. +- [ ] Prévoir la remise en état : suppression des VM créées en fin d'épreuve. + +## Critères de réussite — fixés d'avance + +Binaires, vérifiables, définis **avant** le début. On ne les renégocie pas en cours. + +| # | Critère | Vérification | +|---|---|---| +| **R1** | Instance créée depuis `socle`, plan renseigné à ses valeurs | `make inventaire-verifier` → rc=0 | +| **R2** | Golden template Debian 13 construit et converti en template Proxmox | `make verifier-modele` OK ; template `modele-debian13` visible dans Proxmox | +| **R3** | Au moins une VM créée depuis le plan | `make creer-vm HOTE=…` OK ; VM jointe par Ansible (`ansible -m ping`) | +| **R4** | Cet hôte déployé selon ses groupes | `make deployer HOTE=…` → rc=0 | +| **R5** | Validation globale du dépôt passée par l'opérateur | `make verifier` → rc=0 | +| **R6** | Socle complet déployé (tous les hôtes du modèle `socle` actifs et déployés) | `make deployer` sur chaque hôte → rc=0 | + +**Verdict :** + +- **Réussite démontrée** — R1→R6 atteints, **zéro N1**. +- **Réussite avec défauts** — R1→R5 atteints, avec N1 consignés. ← *résultat attendu* +- **Échec** — blocage qu'aucune documentation ni l'opérateur seul ne résout. + +> Un test où l'opérateur ne bloque jamais est un test mal conçu ou mal observé. Les +> défauts sont le produit livrable, pas l'accident. + +## Cadence + +Deux séances d'environ 4 h, ou une journée. **Plafond horaire fixé d'avance** pour que +l'épreuve ne s'étire pas : au-delà, on arrête et on consigne l'état atteint — un +plafond dépassé est lui-même un résultat. + +## Conséquence sur le registre + +Le registre doit pouvoir **perdre**. C'est la condition pour qu'il vaille quelque chose. + +| Verdict | Effet sur AFF-002 | +|---|---| +| Réussite démontrée | ✅ **confirmée empiriquement** — la mention « par inspection » tombe | +| Réussite avec défauts | **✅ → 🟡** jusqu'à correction des défauts consignés, puis re-test des étapes touchées | +| Échec | **✅ → ❌**, avec le blocage nommé comme écart | + +Le rapport rejoint `docs/audit/` et devient la preuve rejouable d'AFF-002 : *rejouer* +signifie ici refaire passer l'épreuve à un nouvel opérateur indépendant. + +## Nommage et consentement + +« Volontaire pour participer » ne vaut pas « d'accord pour être nommé ». **Avant toute +publication** du rapport, valider avec l'opérateur **et** avec Technolibre ce qui peut +être cité : nom, organisation, ou anonymat (« un sysadmin indépendant »). Par défaut, et +tant que la réponse n'est pas obtenue : anonyme. + +--- + +# Annexe — gabarit de rapport + +À copier vers `docs/audit/operateur-independant-AAAA-MM-JJ.md` et remplir pendant +l'épreuve, pas après. + +```markdown +# Épreuve de l'opérateur indépendant — AAAA-MM-JJ + +- **Opérateur** : (nom ou « sysadmin indépendant » — cf. consentement) +- **Observateur** : Daniel Allaire +- **Dépôt testé** : Set-OPS-public @ +- **Matériel** : grappe Proxmox de l'opérateur, nœud(s), plage VMID <…> +- **Début / fin** : () +- **Consentement de nommage** : obtenu / en attente / anonymat demandé + +## Verdict + + + +| Critère | Atteint | Note | +|---|---|---| +| R1 inventaire-verifier | ☐ | | +| R2 golden template | ☐ | | +| R3 VM créée | ☐ | | +| R4 hôte déployé | ☐ | | +| R5 make verifier | ☐ | | +| R6 socle complet | ☐ | | + +**Interventions N1** : · **Démangeaisons N0** : · **N2** : + +## Grille d'observation + +| # | Heure | Étape QUICKSTART | Attendu par l'opérateur | Survenu | Débloqué seul ? | Blocage | Fichier à corriger | +|---|---|---|---|---|---|---|---| +| 1 | | §_ | | | O / N / **N1** | __ min | | +| 2 | | | | | | | | + +## Défauts consignés + +| ID | Gravité | Étape | Description | Correctif proposé | Fichier | +|---|---|---|---|---|---| +| D1 | bloquant / majeur / mineur | | | | | + +Gravité : **bloquant** = N1 nécessaire ou critère non atteint · **majeur** = > 15 min +perdues, débloqué seul · **mineur** = friction, hésitation, formulation trompeuse. + +## Verbatim de l'opérateur + +> (citations brutes — les hésitations à voix haute valent de l'or ; ne pas les lisser) + +## Ce que l'épreuve n'a pas couvert + + + +## Suites + +- [ ] Corriger D … +- [ ] Mettre à jour AFF-002 dans `affirmations.md` (→ ✅ confirmée / 🟡 / ❌) +- [ ] Entrée `CHANGELOG.md` +- [ ] Re-test des étapes touchées par les correctifs +```