fiche : les panneaux etaient caches derriere l exportateur

Le tableau des panneaux vivait DANS la condition de l exportateur. Le premier
role a declarer des panneaux sans exportateur — client_metrique, dont le job
node est universel — affichait « aucun exportateur declare » et cachait ses
quatre panneaux.

Une fiche qui tait ce qu un role declare est pire qu une fiche absente : elle
affirme que rien n existe.

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 16:34:51 -04:00
parent 311f33d6f6
commit 392da4d3f5
5 changed files with 44 additions and 10 deletions

View file

@ -85,6 +85,17 @@ Eprouvee dans les deux sens.
`docs/supervision-conception.md` porte desormais la moitie « metriques » a cote de la
moitie « sondes ».
### Et la fiche cachait ce que le role declarait
`fiche_role.py` imbriquait le tableau des panneaux DANS la condition de l'exportateur. Le
premier role a declarer des panneaux sans exportateur affichait donc « aucun exportateur
declare » — et cachait ses quatre panneaux.
Une fiche qui tait ce qu'un role declare est pire qu'une fiche absente : elle affirme que
rien n'existe. Les deux moities sont desormais lues separement, et chacune dit ce qu'elle
trouve — y compris « series collectees, aucun panneau declare : personne ne les regarde
encore », qui est une carte de ce qui reste a faire.
### Ce qui reste
Le tableau de PostgreSQL est assemble, charge, et **vide** : l'exportateur exige

View file

@ -72,7 +72,7 @@
| P57 | Comptes en prose : les chiffres du depot sur lui-meme | — | ✅ OK | Les comptes ecrits en prose correspondent a la mesure (77 preuves, 68 roles, 41 groupes). |
| P58 | Habilitations : chaque service dit a quel GROUPE, et par quoi | — | ✅ OK | 8 habilitation(s) declarees, toutes nommant un groupe, un mecanisme connu et une raison ; les `role-realm` sont projetees. |
| P59 | Enumerations annoncees : le nombre correspond a ce qui suit | — | ✅ OK | 2 enumeration(s) annoncee(s) correspondent a ce qu'elles annoncent (formes non ambigues seulement). |
| P60 | Wiki publie : la forge sert ce que le depot dit | AFF-002 | ✅ OK | Le wiki publie correspond au depot : `wiki/` n'a pas bouge depuis `aac74f6` (publie le 2026-09-14). |
| P60 | Wiki publie : la forge sert ce que le depot dit | AFF-002 | ✅ OK | Le wiki publie correspond au depot : `wiki/` n'a pas bouge depuis `311f33d` (publie le 2026-09-14). |
| P61 | Schema du plan : il decrit tout ce que les plans contiennent | AFF-033 | ✅ OK | Le schema decrit 47 champ(s) sur 6 registres ; il couvre tout ce que les plans reels contiennent, et la FORME de chaque champ (scalaire / objet / table) corresp |
| P62 | Schema du plan : il decrit tout ce que le MOTEUR accepte | AFF-033 | ✅ OK | Les 4 validateurs n'acceptent aucun champ que le schema ignore (applications:8, bases_donnees:4, domaines_publics:5, serveurs:3 champ(s) lus par validateur). |
| P63 | cloud-init nait avec la VM et ne lui survit pas | — | ✅ OK | cloud-init est au gabarit (la premiere seconde), absent du socle (pas de va-et-vient), et retire par le durcissement — avec la garde qui verifie que le reseau s |

View file

@ -1,5 +1,5 @@
---
# Ecrit par `make wiki-publier`, lu par la preuve P60. Ne pas editer a la main.
remote: ssh://git@eregion.chezlepro.ca:2222/Alliance-Boreale/Set-OPS-Public.wiki.git
source: aac74f6
source: 311f33d
date: 2026-09-14

View file

@ -132,16 +132,32 @@ def fiche(role: str) -> str:
"aucune mérite qu'on se demande pourquoi — voir `docs/supervision-conception.md`.*")
L.append("")
# LES DEUX MOITIES DE `metriques.yml` SONT INDEPENDANTES, ET LA FICHE LES LISAIT
# IMBRIQUEES (corrige le 2026-09-14). Le tableau des panneaux vivait DANS la condition
# de l'exportateur : un role qui declare des panneaux SANS exportateur — comme
# `client_metrique`, dont le job `node` est universel et ecrit ailleurs — affichait
# « aucun exportateur declare » et cachait ses quatre panneaux.
#
# Une fiche qui tait ce qu'un role declare est pire qu'une fiche absente : elle
# affirme que rien n'existe.
L += ["## Ce qu'il expose en séries", ""]
if (met or {}).get("exportateur"):
e = met["exportateur"]
L += [f"Exportateur `{e.get('paquet')}` — port **{e.get('port')}**, "
f"job `{e.get('job')}`.", "",
"| panneau | unité | pourquoi on le regarde |", "|---|---|---|"]
for p in met.get("panneaux", []):
L.append(f"| {p['titre']} | {p.get('unite', '—')} | {p.get('raison', '').strip()} |")
expo = (met or {}).get("exportateur")
panneaux = (met or {}).get("panneaux") or []
if expo:
L += [f"Exportateur `{expo.get('paquet')}` — port **{expo.get('port')}**, "
f"job `{expo.get('job')}`.", ""]
elif panneaux:
L += ["*Aucun exportateur propre : les séries viennent d'un collecteur universel "
"(`node_exporter`), déclaré une seule fois.*", ""]
else:
L.append("*Aucun exportateur déclaré — voir `docs/metriques-conception.md`.*")
if panneaux:
L += ["| panneau | unité | pourquoi on le regarde |", "|---|---|---|"]
for p in panneaux:
L.append(f"| {p['titre']} | {p.get('unite', '—')} | {p.get('raison', '').strip()} |")
elif expo:
L.append("*Séries collectées, aucun panneau déclaré : personne ne les regarde "
"encore.*")
L.append("")
L += ["## Ce qu'il coûte, et qui entre", ""]

View file

@ -26,7 +26,14 @@ graph LR
## Ce qu'il expose en séries
*Aucun exportateur déclaré — voir `docs/metriques-conception.md`.*
*Aucun exportateur propre : les séries viennent d'un collecteur universel (`node_exporter`), déclaré une seule fois.*
| panneau | unité | pourquoi on le regarde |
|---|---|---|
| Mémoire disponible (part du total) | ratio | CELUI-LA COMPTE DEPUIS QUE LE BALLON EST ACTIF. L'hyperviseur reprend de la memoire a une VM qui n'en a pas besoin — silencieusement, 100 Mio par cycle. La VM ne voit pas son plafond bouger : elle voit sa marge fondre. Aucun verdict ne peut se poser la-dessus, parce qu'il n'y a pas de seuil juste : c'est la PENTE qui dit si le plancher a ete pris trop bas. |
| Espace libre — le point de montage le plus serré | octets | La sonde `sante` crie quand un seuil est franchi. Ce panneau dit ce qu'elle ne peut pas dire : DANS COMBIEN DE TEMPS. Un disque qui perd 2 Go par semaine n'a rien casse — il annonce la date ou il cassera, et c'est la seule chose qu'on ne peut pas mesurer apres coup. |
| Charge par cœur | nombre | NORMALISEE, sinon elle ne se compare pas : une charge de 4 est confortable sur huit coeurs et desastreuse sur deux. Au-dessus de 1, la machine attend plus qu'elle ne travaille. C'est le contexte des trois autres — une memoire qui fond a charge CONSTANTE ne dit pas la meme chose qu'une memoire qui fond parce que le travail a double. |
| Trafic réseau entrant | octets_par_seconde | Il n'aura JAMAIS de verdict, et c'est pourquoi il est la. Aucun seuil de trafic n'est juste : ce qui se lit, c'est le changement de FORME — un plateau la ou il y avait des vagues, un creux aux heures ouvrables. Une sauvegarde qui ne part plus et un flux qu'on vient de fermer se ressemblent ici, et ne se voient nulle part ailleurs. |
## Ce qu'il coûte, et qui entre