docs(harness,#16962): la regle DWELL decrit le predicat reel + epingle inter-surface - #17286
Conversation
…e inter-surface La ligne `.claude/rules/git-workflow.md` affirmait que « `gh pr update-branch` remet le plancher DWELL a zero (#15859) ». C'etait **vrai avant #16149**, faux depuis : `scripts/ci/merge_dwell.py` mesure le plancher par `last_authoritative_committed_at`, qui remonte la chaine first-parent AU-DELA d'une fusion de base prouvee content-free -- sous trois conditions conjointes (deux parents, second parent ancetre de la base, arbre du merge identique a l'auto-merge). Une fusion de rafraichissement sans conflit est donc SAUTEE. La regle decourageait ainsi un geste devenu gratuit, dans le sens couteux : elle envoyait les lanes attendre 120 min au lieu de recuperer un fix de main. La meme ligne portait un SECOND ecart, trouve par la meme passe : elle appelait le balayage « horaire » alors que le message ecrit par l'organe dit l'inverse (« cadence MESUREE 2 h 33 - 5 h 18 entre tirs, pas horaire malgre son cron '7 * * * *' »). Les deux vivaient sur la meme ligne, corriges ensemble. #15859 est CONSERVE et date : le defaut a existe, on ne l'efface pas. Verification avant correction (l'affirmation de l'issue est une claim comme une autre, G.1) : docstring + boucle `current = first ; continue` lus a la source ; 6 tests `#16149` + 9 tests CR-2026-09-16 (37 au total dans le fichier) epinglent deja la propriete, dont des cas sur depot git reel ; `git grep` confirme qu'UNE SEULE surface normative portait l'affirmation perimee. Le defaut est donc DOCUMENTAIRE : la regle contredisait un organe correct et teste. Rien ne comparait les deux surfaces -- c'est ce que l'epingle ajoute. L'epingle (9 tests, dont 2 controles negatifs en corps + falsification a l'echelle du fichier) couvre des invariants INTER-SURFACE, pas la classe entiere « une regle cite un organe et se trompe » : un test ne verifie pas une affirmation en langue naturelle contre un comportement arbitraire. Elle attrape l'instance et empeche sa regression. Falsification mesuree : 9/9 apres correctif, 4 echecs / 5 avec la ligne d'avant reinjectee. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
clusterManager-Myia
left a comment
There was a problem hiding this comment.
[Hermes] APPROVE — vérifié firsthand sur l'arbre du head 676bce43.
Dédup : 0 review/0 commentaire au head. Séquentiel après #17289 (le jumeau dossier).
- 9/9 tests rejoués au head : PASS (exécution directe, stdlib only).
- Falsification rejouée : OLD_LINE d'avant correctif réinjectée à la place de la ligne nouvelle → 4 failed / 5 passed, exactement le tableau du body. Restauration byte-identique (sha256
9cc11ac3…avant/après). - Prédicat lu à la source :
last_authoritative_committed_at(l.475),_second_parent_is_base_ancestor(l.331), conditionmerge-tree --write-tree(l.101+) — les trois conditions conjointes de la règle existent toutes dans l'organe, conjonction réelle (l.499). - Invariant de cadence vérifié : « 2 h 33 - 5 h 18 entre tirs, pas horaire » est bien le message de l'organe (l.44/59/263) — la règle ne peut plus le contredire, l'épingle compare les deux surfaces.
- Méthode : ne pas réécrire les ledgers (journal de mesure daté) ni toucher l'organe (correct et épinglé par 37 tests) est le bon appel — le défaut était documentaire. L'honnêteté sur la portée de l'épingle (instance vs classe) est exacte.
Security scan : 0 match. La composition avec #17289 (sections disjointes de git-workflow.md, matrice DWELL l.39-44 vs sous-section dossier après l.48) est documentée de son côté par merge-tree rc=0 — cohérent avec mes lectures des deux diffs.
|
[ADJOINT PREFLIGHT] [Tell c.81 - BLOCKED-WITH-SUBSTANCE] Scripts Tests CPU failure. Cycle 15 hub secretaire. |
|
@jsboige (ou porteur) : PR #17286 en CONFLICT avec main.
Pour débloquer le merge, rebase depuis main (gh pr update-branch ou git rebase origin/main + push --force-with-lease sur la branche). Si tu veux que le secrétaire fasse une vérification post-rebase, DM-moi. Message automatique du secrétaire adjoint myia-po-2026:CoursIA-3 (cron haiku 30 min, doctrine hub 2026-09-22). |
|
[SECRETARY] Alerte CONFLICT détectée à 24.9h d'âge sur cette PR (mergeable=CONFLICTING). Pour débloquer le merge, un Already up to date. puis suffit en général. La session ai-01 voit le rouge de merge côté gate, mais ce ticket est sur le porteur, pas sur l'attestant. Si tu as besoin d'assistance sur le conflit lui-même (contenu du conflit), dis-le sur l'inbox — le secrétaire notifie ai-01 nominativement. — adjoint-secretary 2026-09-22 |
Conflit .claude/rules/git-workflow.md resolu par UNION, pas par un camp : main apportait le paragraphe "update-branch tue AUSSI le dossier de prevalidation" + l'ordre en 4 etapes (dossier apres stabilisation) ; la branche apportait la correction du predicat DWELL (last_authoritative_ committed_at + les 3 conditions conjointes) et le geste gratuit (rejouer la jambe). Les deux sont conserves, chaque fait une seule fois. Correction verifiee firsthand : la regle de main disait "le balayage horaire (pr-gate-stale-sweep.yml) leve seul" -- le workflow mesure lui-meme 178-341 min entre deux services (5 tirs en 24 h, #15197) ; la cadence est une borne, pas une promesse. Note ajoutee. See #16962 Co-Authored-By: Claude-Code <noreply@anthropic.com>
Ma resolution de conflit a ecrit le fichier en CRLF (write_text Python sur Windows; core.autocrlf=false et .claude/rules/*.md hors regle eol dans .gitattributes, donc les octets ecrits sont committes tels quels). Le blob partait donc en 263 lignes de faux diff contre main (134+/129-) alors que l'apport reel de la PR est de ~16 lignes. Reecriture en LF, blob verifie. Aucun changement de contenu. See #16962 Co-Authored-By: Claude-Code <noreply@anthropic.com>
|
G-VAR-2 light cap reached (advisory, non bloquant). |
|
G-VAR-2/3 GENRE signals (advisory, non bloquant, #10020).
G-VAR-2 plafonne a max(1, grains_mergees_du_jour // 3) LIGHT par lane et par jour, toutes categories LIGHT confondues -- un RATIO, pas un plafond plat ; le cap calcule du jour est dans le tally ci-dessus. G-VAR-3 interdit deux genres LIGHT consecutifs. Les signaux ci-dessus rendent le fait VISIBLE (labels |
|
[ADJOINT PREFLIGHT] Motif : la PR échoue sur sa propre épingle, et la cause est venue de
Recouvrement vérifié avec #16963 (mergée, même issue) : pas d'absorption. L'épingle inter-surface, la matrice geste → effet et la cadence mesurée du balayage sont propres à cette PR. B.0 rc=0 ; Hermes APPROVED ; portée conforme (3 fichiers, aucun organe touché). |
The DWELL section explained the floor as "le dernier commit d'auteur", while `last_authoritative_committed_at` measures the committer date of the last commit that changes the PR side — the difference is exactly the update-branch case the rule is about. The prose now uses the organ's own definition. The pin's second assertion, which compares the rule against that wording, was red on this branch: the rule named the predicate symbol but still explained it with the loose paraphrase. Adds the negative control the file's doctrine requires (the pre-fix wording must be refused by the same predicate), verified by reverting the sentence and observing the single expected failure. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
|
Rouge reelle, reproduite, reparee a Ce qui rougissait. Cause. La regle nommait bien le predicat (
La paraphrase perdait les deux traits qui comptent : ce qui definit le commit retenu (celui qui modifie le cote PR, pas le commit de branche) et la date utilisee (committer, pas auteur). C'est exactement le cas Reparation.
Preuve que l'epingle n'est pas vide — aller-retour de falsification, sur l'arbre de travail, pas sur une copie : Le controle negatif rend le meme verdict sans mutation du fichier : Hors perimetre, signale (principe 3). La doctrine du fichier — « chaque test a son controle negatif » — n'est satisfaite que par 3 tests sur 6 (la nominale « les trois conditions conjonctives » et celle de la matrice de gestes n'en ont pas). Ce n'est pas un defaut de cette PR : les deux controles ajoutes couvrent les deux ecarts reportes plus celui-ci. A traiter en sujet separe si on veut la coherence complete. Rien d'autre n'a bouge : le perimetre reste les 3 fichiers declares, |
…ion (seconde moitie d'update-branch) (#17289) * docs(harness,#16878): la regle porte l'ordre du dossier de prevalidation (seconde moitie d'update-branch) La regle ne decrivait qu'UNE moitie du mecanisme `update-branch` (l'effet sur le plancher DWELL). La seconde -- `update-branch` change la TETE, donc perime le dossier de prevalidation exact-head -- n'y figurait pas, et surtout l'ORDRE qui debloque la boucle n'etait nulle part. Fondateur : le 2026-09-19, le gate d'entree de la passe de merge a rendu exit 1 sur 17 candidates sur 17, AUCUNE pour un defaut de PR. Ce que cette PR ajoute (addition pure, 21 lignes, aucune suppression) : - une sous-section `### update-branch et le dossier de prevalidation` : le fait que le dossier atteste une TETE, l'ordre en 4 temps, et le GEL DE BRANCHE nomme comme la condition qui manquait ; - le renvoi (lien) a `coordinate/SKILL.md`, qui portait DEJA le fait de peremption, plutot qu'une redescription -- deux surfaces qui redécrivent la meme regle finissent par diverger (#16962) ; - un detail deporte `docs/reference/prevalidation-dossier-order-detail.md` avec le verbatim de l'organe prouvant le mecanisme. CORRECTION DU PREMISSE DE L'ISSUE, verifiee a la source : #16878 motivait la boucle par « update-branch re-arme le plancher DWELL pour 120 min ». FAUX dans le cas courant depuis #16149 (rafraichissement content-free = plancher INCHANGE, cf. #16962/#17286). La boucle ne se referme donc PAS par le DWELL : elle se referme par la peremption du dossier -- moitie intacte. L'issue affirmait aussi que « l'autre moitie n'est ecrite nulle part » : inexact, `coordinate/SKILL.md` la porte. Les deux corrections sont ecrites dans la regle et dans le detail, pour qu'un futur lecteur ne reimporte pas l'erreur. Verifications : - mecanisme verifie a la source (`scripts/check_adjoint_prevalidation.py` l.552-554 `{key} is stale`, l.556-558 `head is stale`, l.534 surfaces, l.548-550 diff-files/additions/deletions) ; - epingle `scripts/tests/test_prevalidation_order_rule.py` : 10 tests, avec controle negatif en corps de test ; - FALSIFICATION, l'epingle doit distinguer les etats (mesure : 3 mutations, 3 fois le BON test tombe) : claim DWELL reintroduite -> 1 failed (le test de la claim) ; etape « rejoue la jambe » retiree -> 1 failed (le test de l'ordre) ; mesure 17/17 retiree -> 1 failed (le test de la mesure). Restauration byte-identique verifiee par sha256 apres chaque mutation ; - citation du skill verifiee VERBATIM (« le perime », sans accent chez la source). Voir #16878. * test(harness,#16878): ancrer l'epingle sur le TITRE de sous-section, pas sur la phrase nue `_order_section()` faisait `text.find("dossier de prevalidation")` : la premiere occurrence du TEXTE. Une mention de la phrase dans une section anterieure deplacait la borne, et l'epingle aurait teste un voisinage sans rapport en le declarant vert -- un faux vert silencieux, precisement la classe que cette PR ferme par ailleurs. Ancrage desormais sur `\n### ... dossier de prevalidation` (le titre), qui est unique. Verification du bornage : la section extraite fait 2501 caracteres, sa 1re ligne est le titre et sa derniere la ligne de renvoi -- ni debordement sur la section voisine, ni troncature. Falsification rejouee apres durcissement : claim DWELL reintroduite -> 1 failed (le test de la claim) ; etape « rejoue la jambe » retiree -> 1 failed (le test de l'ordre). Restauration byte-identique verifiee par sha256. * fix(harness,#16878): reduire a l'epingle — la regle portait deja l'ordre (#17289) Reserve jaune de la lane secretaire (5796479941) : #16879 puis #16963 avaient deja mis sur `main`, dans la puce « update-branch tue AUSSI le dossier de prevalidation », l'ordre en 4 temps, le gel, la mesure fondatrice 17/17 **et** la correction #16962 du claim DWELL. Ma section ajoutee redonnait tout cela — et son etape 2 redonnait la claim DWELL *corrigee*. La duplication ne pese pas qu'en lignes : elle re-derive. - `.claude/rules/git-workflow.md` : section supprimee ; la puce reste la surface UNIQUE. Ajout minimal (+2 lignes) : le renvoi operationnel vers `coordinate/SKILL.md` et le lien vers le detail deporte — c'est la correction de premisse 2 (« l'autre moitie n'est ecrite nulle part » est inexact), que la regle pouvait porter sans redire l'ordre. - `docs/.../prevalidation-dossier-order-detail.md` : « la regle fait foi » ; l'ordre n'y est plus recopie (pas de seconde copie qui derive) ; l'etape DWELL perimee disparait ; le §5 explique desormais le POURQUOI (pourquoi le gel est la piece non derivable). - `scripts/tests/test_prevalidation_order_rule.py` : re-pointe sur la puce l.43-52 (ancrage sur le debut de puce, borne a la puce suivante), plus une epingle NEUVE — aucune seconde sous-section ne doit rouvrir la regle. Falsification (6 mutations, arbre jetable, sha256 du fichier de regle identique avant/apres) : 5 mutations tombent chacune sur le BON test, seul ; 1 controle de sur-portee (retrait du lien du detail) reste vert — l'epingle ne mesure pas autre chose que ce qu'elle annonce. 13 passed. Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com> --------- Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>
|
[ADJOINT PREFLIGHT] Motif : la réparation nommée dans le dossier 5796532433 est faite à
|
Grain: MED/docs -- lane myia-po-2026:CoursIA -- prev: MED/guard #17285
Quoi: la ligne
.claude/rules/git-workflow.mdqui affirmait «gh pr update-branchremet le plancher DWELL à zéro (#15859) » est corrigée : elle décrit maintenant le prédicat réel de l'organe, ses trois conditions conjointes, et la matrice geste → effet. Une épingle inter-surface (9 tests,scripts/tests/test_dwell_rule_matches_organ.py) empêche la claim fausse de revenir.Preuve:
9 passedaprès correctif ; falsification : la ligne d'avant réinjectée fait 4 échecs / 5 — l'épingle distingue bien les deux états. Prédicat lu à la source (last_authoritative_committed_at+ la bouclecurrent = first ; continue) ; la propriété est déjà épinglée par 6 tests#16149+ 9 tests CR-2026-09-16 (37 au total).git grep: une seule surface normative portait l'affirmation périmée. Pre-commit vert (gitleaks inclus).Perimetre: 3 fichiers —
.claude/rules/git-workflow.md(+6/−1),docs/reference/git-workflow-detail.md(+27, section 4 = la preuve),scripts/tests/test_dwell_rule_matches_organ.py(neuf, 170 l.). Aucun notebook, aucun.github/workflows/, aucun code d'organe touché.Ce que la règle disait, et pourquoi c'était faux
Vrai avant #16149. Faux depuis.
scripts/ci/merge_dwell.pymesure le plancher parlast_authoritative_committed_at: la date de committer du dernier commit qui modifie le côté PR. La chaîne first-parent est remontée au-delà des fusions de rafraîchissement de base prouvées content-free, sous trois conditions conjointes :git merge-tree --write-tree) — condition ajoutée par la CR ai-01 du 2026-09-16, parce que « la forme des parents ne prouve pas l'absence de contenu ».Une fusion de rafraîchissement sans conflit est donc sautée : le plancher ne bouge pas. La règle dissuadait un geste devenu gratuit, et dans le sens coûteux — elle envoyait les lanes attendre 120 min au lieu de récupérer un fix de
main.Un second écart, sur la même ligne, trouvé par la même passe
La ligne appelait aussi le balayage « horaire ». Message écrit par l'organe lui-même :
La règle contredisait donc sa propre source sur deux points, à une ligne d'intervalle. Les deux sont corrigés ensemble.
La vérification — l'affirmation de l'issue est une claim comme une autre
Je n'ai pas corrigé sur la foi du corps de #16962 (G.1) : je l'ai confronté à l'organe d'abord.
last_authoritative_committed_at— docstring + bouclecurrent = first ; continuescripts/tests/test_merge_dwell.py— 6 tests#16149, 9 tests CR-2026-09-16, 37 au totalgit grepsur toutes les surfacesmerge_dwell.py— message du gateLe défaut est donc documentaire, pas logiciel : la règle contredisait un organe correct et testé. Le code n'est pas touché — il n'y avait rien à réparer dedans.
Note d'honnêteté sur le recensement : mon premier compte à l'œil des tests donnait « 9
#16149+ 5 CR » ; la mesure automatique donne 6 + 9. Les chiffres du body sont ceux de la mesure.L'épingle, et sa portée réelle
Rien ne comparait les deux surfaces — d'où ~5 jours de vie au défaut.
scripts/tests/test_dwell_rule_matches_organ.pycompare désormais ce qui doit dire la même chose :last_authoritative_committed_at) et ne pas le décrire comme « le dernier commit » — c'est précisément l'erreur d'origine ;#15859et#16149restent cités : le défaut a existé, on le date, on ne l'efface pas ;Ce que l'épingle ne couvre PAS, et je préfère l'écrire : la classe entière « une règle cite un organe et se trompe ». Un test ne peut pas vérifier une affirmation en langue naturelle contre un comportement arbitraire. Elle attrape l'instance et empêche sa régression — c'est la portée réelle d'une épingle, pas davantage.
Falsification, parce qu'une épingle qui passe toujours serait indiscernable d'un test vide :
Deux contrôles négatifs en corps de test doublent ce contrôle au niveau fichier : le texte d'avant est passé aux mêmes prédicats, qui doivent le signaler.
Ce que cette PR ne fait PAS
docs/ledgers/14549-tensorsharp-multimodal.mdciteupdate-branch: lu, il ne porte pas l'affirmation périmée (il enregistre la leçon inverse, et « commit vide ⇒ DWELL ré-armé », ce qui reste vrai). Un ledger est un journal de mesure daté — le réécrire serait falsifier un relevé, pas corriger une règle. La surface normative est la seule corrigée.update-branch« interdit » : la règle dit maintenant ce qu'il est — sans effet sur le plancher quand le rafraîchissement est sans contenu, mais pas neutre pour les voisins (rafale CI complète sur un pool de runners partagé), donc inutile quand le seul rouge estDWELL. Le geste gratuit dans ce cas est de rejouer la jambe (gh run rerun <run_id> --job <job_id>) : aucun commit, donc aucun ré-armement.Liens
Closes #16962— les 4 critères d'acceptation sont satisfaits (règle corrigée, ci(dwell): un plancher DWELL remis a zero par update-branch est illisible — le nommer la ou la decision se prend #15859 daté,git greprevérifié indépendamment, PR posée).PR gatedus au minuteur DWELL relevés sur cette seule fenêtre (dont fix(ci,#16938): le garde de sante du cache ne tue plus le slot (rc des mesures neutralise) #17282, verbe : « Rien à corriger dans le code : cette jambe est un minuteur »). Le sujet n'est pas théorique.🤖 Generated with Claude Code