Skip to content

ci(collision): le verdict terminal affirme « la substance est consommee » sur une observation de CHEMINS seuls — il fait fermer du travail valide (#15454) #15768

Description

@jsboige

Le defaut

Pour une paire dont un cote est merge, l'organe rend le verdict TIER_TERMINAL (#15578) et affirme une conclusion semantique — « la substance est consommee », « du travail deja integre » — a partir d'une observation purement syntaxique : les deux PRs partagent des chemins de fichiers, et le recouvrement depasse TERMINAL_MIN_OVERLAP_RATIO = 0.5.

Or l'organe ne compare jamais le contenu des deux cotes. Mesure sur scripts/check_pr_path_collisions.py (origin/main b5e15b39b5) : aucune occurrence de diff, patch, blob, hunk, additions, deletions. Les seules mesures sont l'ensemble des chemins partages et leur ratio.

Deux PRs peuvent donc partager 100 % de leurs chemins avec zero recouvrement de substance : l'une colore un bloc mermaid dans un README.md, l'autre segmente un paragraphe-mur du meme fichier. Le ratio mesure un recouvrement de chemins, jamais de substance — il ne discrimine pas ce cas.

Instance — mesuree firsthand

Quand (UTC) Fait
2026-09-10T21:14:12Z le garde rend sur #15454 : « #15502 est deja sur main, la substance est consommee... travail deja integre »
2026-09-11T04:17:52Z #15502 merge — fix(probas,#15022) : couleur de texte explicite sur les noeuds mermaid styles — un fix de couleur
2026-09-11T23:39Z ai-01 mesure : le paragraphe-mur fait 3246 c et il est integralement sur main
2026-09-12T00:17:28Z #15454 merge (7e72a3d510) — docs(probas,#14871) : segmenter le paragraphe-mur de l'intro serie (3336 c -> 6 paragraphes aeres)

Mesure de cloture, sur origin/main : le paragraphe portant la phrase citee fait desormais 563 c (172 paragraphes, plus long : 2521 c). #15454 a donc livre sa substance 3 h apres que le garde l'ait declaree « deja integree ».

Une lane qui suivait le verdict fermait #15454 — seul correctif de #14871 — et la segmentation ne serait jamais arrivee. ai-01 a du poster une correction explicite (#15454 issuecomment-5641862746) pour l'empecher. Le garde n'est donc pas seulement imprecis : il est activement trompeur dans le seul sens non rattrapable (faire fermer du travail valide).

Le signal honnete etait disponible, et il est jete

L'organe a en main un discriminant honnete : common_issues, l'intersection des issues citees par les deux PRs — c'est deja lui qui separe TIER_STRONG de TIER_WEAK sur les paires ouvertes.

Sur une paire terminale, ce signal est calcule (l.488-490), stocke (PathCollision.common_issues) et serialise dans le JSON — puis jamais rendu dans le commentaire : la branche terminale du template (l.559-569) ne l'utilise pas, la branche ouverte (l.570-578) si. Le seul element qui rendrait la redondance plausible est donc ecarte en silence, precisement dans la branche qui l'affirme.

Correctif attendu

Le vocabulaire de sortie d'un organe ne doit pas contenir un verdict qu'il ne peut pas prouver.

  • Le verdict terminal reste (la paire est un fait a rendre visible) mais decrit ce que l'organe sait : « ces PRs touchent <chemins> ; #X est deja sur main ».
  • Retirer toute affirmation de consommation de substance. Sites concernes : docstring de module (l.63, 76-78), terminal_collisions (l.397), actionable_collisions (l.404-405), texte du commentaire (l.568), note de cloture (l.583-585), self-test (l.1084-1085), main() (l.1243).
  • Rendre common_issues sur une paire terminale au lieu de le jeter — deja mesure, c'est le signal qui rend la redondance plausible.
  • Ne pas relacher le tier des paires ouvertes.

Hors scope (deja nomme) : la similarite semantique (meme substance, chemins differents) reste un autre outil.

Acceptance

  1. Aucune sortie de l'organe (rendu de commentaire, JSON, docstrings, self-test) n'affirme qu'une substance est consommee ou qu'un travail est « deja integre ».
  2. Une paire dont un cote est merge sort toujours — le signal n'est pas perdu pour autant — nommee comme un fait : chemins partages + cote merge.
  3. Le self-test rejoue l'instance docs(probas,#14871): segmenter le paragraphe-mur de l'intro serie (3336 c -> 6 paragraphes aeres) #15454/fix(probas,#15022): couleur de texte explicite sur les nœuds mermaid stylés (lisibilité mode sombre) #15502 : une paire terminale a recouvrement total de chemins sur un fichier de prose markdown, dont les deux PRs citent des issues differentes — elle sort terminale, et le rendu ne conclut pas a la redondance.
  4. common_issues apparait dans le rendu d'une paire terminale quand il est non vide.
  5. Les paires ouvertes conservent leur comportement (aucune inflation de tier) — les tests dedies de fix(guard,#15578): le detecteur de collisions se tait quand la substance passe sur main #15591 restent verts.

Provenance

Residuel du commentaire ai-01 sur #15578 (instance #15454). #15578 lui-meme — vivier elargi aux mergees + verdict terminal — est resolu sur main par #15591 et close-ready. Ce defaut-ci est distinct : c'est la formulation du verdict introduit, pas son existence. Un Closes #15578 serait donc faux ; d'ou ce tracker separe.

Grain: MED/guard — lane à attribuer — prev: n/a

Activity

  1. jsboige commented on Sep 12, 2026

    @jsboige
    OwnerAuthor

    [DELIVERED] PR #15771 — fix(collision,#15768), commit 66373d5b5c, +228/−29 sur 2 fichiers.

    Grain: MED/guard — lane myia-po-2023:CoursIA — prev: MED/guard #15765.

    Acceptance, une par une :

    1. Aucune sortie n'affirme une consommation de substance — le vocabulaire non prouvable est retire du module docstring, de la justification de la porte, de PathCollision, de terminal_collisions, de actionable_collisions, du template de commentaire, de la note de cloture, du self-test et de _cli. Controle a signature identique contre origin/main : meme entree, meme appel render_comment(...), l'origine rend la substance est consommee a ratio 1.00, le corrige aucune affirmation non prouvable.
    2. La paire a cote merge sort toujours, nommee comme un fait (chemins partages + cote merge + ratio de chemins).
    3. Self-test rejoue l'instance docs(probas,#14871): segmenter le paragraphe-mur de l'intro serie (3336 c -> 6 paragraphes aeres) #15454/fix(probas,#15022): couleur de texte explicite sur les nœuds mermaid stylés (lisibilité mode sombre) #15502 (recouvrement total, issues disjointes) : terminale, sans conclusion de redondance. Controle neuf : overclaim #15454/#15502: perfect path overlap is terminal + the terminal comment does NOT claim the substance is consumed.
    4. common_issues est rendu sur la paire terminale — instance vivante mesuree dans le pool du jour : [terminal] #15722/#15751 ... issues=#15452, ou le commentaire poste omettait #15452.
    5. Paires ouvertes inchangees : les 5 tests dedies de fix(guard,#15578): le detecteur de collisions se tait quand la substance passe sur main #15591 restent verts, + un test neuf qui verrouille le rendu ouvert (pas de ratio, pas de prose terminale, pas de note de cloture).

    Mesure de fond ajoutee a la connaissance du module : les deux PRs de l'instance fondatrice touchent chacune un seul fichier, le meme — le ratio vaut donc 1.00, le maximum de la porte, et les livraisons sont quand meme disjointes. Aucun seuil sur cette quantite n'aurait pu les separer ; le commentaire de calibration note desormais que la mesure retenue admet ce cas mono-fichier parce qu'elle le doit (l'exclure rouvrirait la mutite que #15578 a fermee).

    Une mise a jour unique des commentaires terminaux deja postes est assumee (le corps change) : elle est le but du correctif, ces corps affirmant aujourd'hui une consommation de substance.

  2. added a commit that references this issue on Sep 12, 2026
  3. added a commit that references this issue on Sep 12, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions