Skip to content

fix(coordination): --emit ne produit pas supersedes/supersedes-why -- un READY sur un BLOCKED de la meme lane part puis est refuse #19869

Description

@jsboige

Suite de #18934 (invariant C, livré par #18984) — l'invariant fonctionne, c'est l'outil d'émission qui n'a pas suivi. Issue dédiée parce que le défaut est d'une autre nature que l'invariant : celui-ci vit dans le gate, celui-là dans --emit.

Le défaut

--emit ne produit aucune occurrence de supersedes / supersedes-why.

python scripts/check_adjoint_prevalidation.py <PR> --emit | grep -c supersedes
# -> 0

Ces deux champs sont pourtant obligatoires pour tout READY qui recouvre un BLOCKED intact à la même tête (le refus mute contradiction (#18934), check_adjoint_prevalidation.py l.1285-1320). Le template ne les mentionne nulle part ; le commentaire du module les déclare OPTIONNELS au parse et hors contradiction (l.245) — exact au niveau du parseur, trompeur au niveau de l'émetteur : ils ne sont optionnels que lorsqu'il n'y a pas de contradiction, et c'est l'émetteur qui sait si c'est le cas.

Le piège qui rend le coût réel

post_dossier.py exempte la même lane de son garde anti-double-stamp (existing_lane != args.lane). Donc, pour une lane qui re-émet sur sa propre PR : rien ne prévient avant le POST. Le dossier part, le commentaire est publié, et c'est le gate, relu après coup, qui le déclare NO-DOSSIER. Deux organes distincts, et le seul qui mord est celui qu'on interroge en second.

Coût mesuré (2026-10-08, #19773)

  • Le READY corrigé a été posté puis refusé : NO-DOSSIER — mute contradiction (#18934): verdict READY covers the BLOCKED dossier by jsboige … at the same head without refuting it.
  • Un commentaire de bruit laissé sur la PR (6051555127), plus un cycle de re-émission.
  • Le champ domain était par ailleurs à corriger à la main (not-applicable → pass, mesuré par detect_md_content_loss.py).

Correctif proposé

Quand le gate détecte la contradiction pendant --emit, ajouter les deux champs au template, pré-remplis : supersedes: <position> (il la connaît — c'est celle qu'il cite dans son refus) et supersedes-why: <a completer>. L'émetteur n'a pas à décider à la place de l'auteur ce qui est réfuté ; il doit seulement nommer les champs qui manquent, au lieu de laisser l'auteur découvrir la règle par un refus.

Alternative équivalente : faire avertir post_dossier.py avant le POST quand le gate rend NO-DOSSIER par contradiction. Les deux se cumulent sans se remplacer — le premier évite l'aller-retour, le second évite le bruit.

Portée

Toute lane qui émet un dossier — l'adjoint et, à terme, les auteurs élargis de #17020. Le défaut n'est pas propre à une machine : il vit dans l'outil partagé.

Gouvernance

Correctif d'organe du harnais : PR + sign-off user avant merge (CLAUDE.md §A), comme #18934.

See #18934 · Part of #17020

Activity

  1. jsboige commented on Oct 8, 2026

    @jsboige
    OwnerAuthor

    [CLAIMED] lane myia-ai-01:CoursIA-2 -- correctif d'organe check_adjoint_prevalidation.py --emit (ajout supersedes/supersedes-why quand BLOCKED prealable a meme tete)

  2. added a commit that references this issue on Oct 8, 2026
  3. added a commit that references this issue on Oct 8, 2026
  4. added a commit that references this issue on Oct 8, 2026
  5. added a commit that references this issue on Oct 9, 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

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions