Couverture : le cliquet passe dans la base du service d'état (bascule couverture-objectif) #1697
Loading…
Reference in a new issue
No description provided.
Delete branch "hermes/migration-couverture-objectif"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Carte : t_3f89c2d1 (STUD-1110) — migrer
_tableau/couverture-objectif.json(le cliquet de couverture :objectif courant et dernière mesure, par famille) dans la base SQLite partagée, avec comparaison, bascule et
retour arrière. Recette établie par STUD-1107, comme les autres fichiers d'état.
Ce qui change
etat_partage.sql: tablecouverture_objectif— une seule ligne (id = 1), une colonne par valeur(
coeur,ensemble,maj,mesure_coeur,mesure_ensemble,mesure_t,vu), contraintes sur lespourcentages et sur les heures ISO (fuseau compris). Pas de colonne JSON fourre-tout : la règle du fichier
veut qu'une valeur ait une colonne et une contrainte. La table
basculesn'a plus de liste fermée denoms ;
etat_partage._reparer_basculesrefait une base restée sur l'ancienne (celle de production l'est),sans perdre une ligne.
etat_partage.py:couverture_lire,couverture_remplacer,objectif_verifie(un cliquet qu'on nesait pas ranger est REFUSÉ, jamais tronqué),
_heure._infra/etat-service.py:GET /couverture,POST /couverture/remplacer.etat_client.py:couverture(),couverture_remplacer(),basculer couverture-objectif [--essai],revenir couverture-objectif._tableau/couverture_commun.py(nouveau) : le foyer. Le fichier est écrit toujours (atomique, mêmeforme qu'avant) ; la base fait foi quand la bascule est posée ; un service muet ou un refus est DIT sur la
sortie d'erreur, jamais avalé.
_tableau/lancer-tests.py:lire_cliquet/ecrire_cliquetpassent par ce module. Les règles ducliquet (paliers, refus d'une baisse, rien écrit sur un refus) ne bougent pas.
controle/bancs_concernes.py: le nouveau module entre dansPARTAGES(c'est une pièce de la porte).OUTILS.md(la section du cliquet),_tableau/LXC-132.md,autopilotes/revue-de-code-de-la-semaine.md.Ce qui fait foi, et ce qu'il faut savoir avant de basculer
Après la bascule, la base fait foi et le fichier en est la copie (écrite à chaque mesure, pour git et pour
le cas où le service se taise) : une mesure unique pour tout le studio, là où le fichier était une copie par
machine — mesuré le 2026-10-13 (STUD-1124), le PC et le conteneur des agents ne mesurent pas la même couverture.
Conséquence, écrite dans
OUTILS.md: une machine qui mesure plus bas refusera pour toutes. La bascule n'estpas posée par cette PR : elle se pose par
python3 etat_client.py basculer couverture-objectif, et c'est unedécision d'opérateur.
Aucun banc ne parle au service de production : le service n'est consulté que pour le cliquet du dépôt
(
couverture_commun.FICHIER), et les bancs du lanceur détournent ce chemin — le banc le prouve en rendanturlopenimpossible.Tests
Relevé local sur le PC (l'exécutant
pc-studio), têtecf1146c8, basemain=a3575e4d:TZ=UTC python3 _tableau/lancer-tests.py --tout: le cliquet refuse sur cette machine, comme surmain—cœur 99,1 % (99,4 % enregistrés en base), ensemble 96,7 % (99,0 %). Mesuré des deux côtés, mêmes chiffres :
Deux bancs rouges sur
mainle sont aussi ici, sans rapport :_tableau/test_accueil_parite.pyet_tableau/test_atelier_parite.py(mesurés rouges surmainseul, même assertion). La couverture decouverture_commun.py(module neuf) est de 92 % (48/52 lignes).Ce que je n'ai pas mesuré
192.168.1.142:8799ne répond pas d'ici(
Connection refused). La comparaison, la bascule et le retour arrière sont mesurés contre le service dudépôt, lancé sur
127.0.0.1avec une base jetable (_tableau/test_couverture_bascule.py) — pas contre labase de production, et l'ancien fichier n'a pas été renommé.
Relevé local, tête poussée
cf1146c8, basemain=a3575e4d, sur le PC (l'exécutantpc-studio).Les deux ROUGE et le refus du cliquet sont ceux de
main, mesurés sur la même machine, mêmes chiffres :Le passage n'a rien écrit dans le cliquet du dépôt :
git statusreste propre après le lancement complet(le cliquet refuse, donc il n'écrit rien, et un passage qui répète la même mesure n'écrit plus rien non plus).
Ce que je n'ai pas mesuré : la bascule réelle contre le service de production (
192.168.1.142:8799ne répondpas d'ici —
Connection refused) ; la comparaison/la bascule/le retour arrière sont mesurés contre le servicedu dépôt sur
127.0.0.1avec une base jetable, et l'ancien fichier n'a pas été renommé. Les bancs denavigateur (Chromium) ne tournent pas ici, seulement dans la porte complète de la forge.
fusion-auto: pas de fusion, la PR est en conflit avec main : à rebaser. Le chef de l'atelier renvoie la carte à l'agent ; l'étiquette tombera d'elle-même une fois corrigé.Relecture (relecteur) — le fond est conforme, un seul point manque : la branche n'est plus fusionnable.
Mesuré sur
cf1146c8: CI 4/4 verte ; 11 cas du banc de bascule, bancs du lanceur, gardes,etat_partageetetat_serviceverts ;cargo test --release --locked77 réussis / 0 échec ;vitest run27 fichiers / 200 tests verts ;vite buildcode 0 ; suite complète 168 bancs verts, le seul rouge (test_accueil_parite.py) l'est aussi surmain; cliquet refusant avec les mêmes chiffres quemain; aucun fichier du front ni du service Rust touché, aucun secret, aucun binaire, aucun emoji.Ce qui bloque :
git merge-treecontremaine6a8582edonne un conflit de contenu dans_infra/test_etat_service.py,etat_client.py,etat_partage.pyetetat_partage.sql— #1694 (sujets) a touché les mêmes zones partagées.mainporte déjà le même CHECK élargi debasculeset le même_reparer_bascules: la reprise est un « garder les deux » (NOMSavecsujetsetcouverture-objectif, table et routes de couverture EN PLUS de celles de sujets). À rebaser sure6a8582e, bancs concernés rejoués, puis nouvelle relecture (relecteur).cf1146c837ce3197891dfusion-auto: pas de fusion, la CI est rouge (Rust). Le chef de l'atelier renvoie la carte à l'agent ; l'étiquette tombera d'elle-même une fois corrigé.NOMSgardait les deux versionsFusionnée automatiquement par
fusion-auto(forge) : CI verte, sans conflit.