You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
[EPIC] Les body d'Epic ne sont jamais réécrits — 47/51 ignorent leurs propres livraisons #13906
Ce qui reste ouvert : acceptance 2 (controles positifs/negatifs en tests — VERIFIE le 2026-10-04 par po-2024:CoursIA-2 : scripts/tests/test_epic_body_staleness.py existe, 30 tests passent en 0.31 s, avec controles positifs (trigger 1210, dormant statuses, read failure, ceiling) ET negatifs (up-to-date no-signal, quoted-stance, corpus vide)), acceptance 4 (reecriture des tetes — la tranche du 2026-10-01 traite les 3 contradictions de posture ; tranche du 2026-10-04 (po-2024:CoursIA-2) : blocs d'etat ajoutes aux 3 corps a fort unrecorded_merged#4960, #10643, #11698 — fenetre elargie 25/09 → 04/10, historique conserve), acceptance 5 (#7265).
Nouvelle classe de faux positif du signal 2, mesuree ce jour : le pattern de dormance matche des phrases qui documentent le motif (la ligne « pas pour maintenant » de ce corps decrit le signal ; celle de #13902 cite le titre de #1210) — pas seulement les blocs > exclus par la garde. Le tri a la main reste la regle avant toute reecriture motivee par le seul signal 2.
Portee du non-verifie : fenetre de l'organe = 800 PRs mergees (2026-09-23 -> 2026-10-01) ; les livraisons anterieures a cette fenetre ne sont pas dans unrecorded_merged et n'ont pas ete recomptees ici.
Mandat user, 2026-09-01 (verbatim) : « De façon générale, il faudrait réécrire les body d'Epic à partir de l'avancement des commentaires et issues/PRs ».
Formulé après avoir constaté que #1210 — l'Epic qui gouverne semantic-fleet — s'intitulait [Epic / priority-low / background] et s'ouvrait sur « Pas pour maintenant », alors que le dépôt y avait livré cinq PRs, dont l'ancrage en sous-module (#6542) qui est le geste exactement inverse d'une mise en veille. Verdict user : « c'est clairement un oubli ».
Ce n'est pas un cas isolé — c'est 92 % des Epics
Mesuré le 2026-09-01 sur les 51 Epics ouvertes et les 800 dernières PRs mergées :
Mesure
Valeur
Epics ouvertes
51
Epics portant ≥1 PR mergée que leur body n'inscrit pas
la leçon stale-body-is-the-mechanism-of-neglect de la mémoire coordinateur.
Trois formulations, aucune application. En ajouter une quatrième serait l'échec-pendule que le CLAUDE.md global interdit. Ce qui manque n'est pas une phrase, c'est un organe — et c'est aussi ce que dit le mandat : « réécrire à partir de l'avancement » suppose qu'on puisse d'abord lire l'avancement mécaniquement.
Le signal, et ses deux directions d'erreur
Signal 1 — livraisons non inscrites.{PR : PR mergée, PR cite #N, "#<PR>" absent du body de #N}. C'est la transcription littérale du mandat : le body doit inscrire l'avancement porté par les PRs.
Signal 2 — posture contredite. Le body (ou le titre) déclare la dormance — pas pour maintenant, priority-low, background, à ouvrir quand on aura le temps, plus tard, en veille — et des PRs de livraison ont mergé. C'est le motif exact de #1210 : une contradiction dure, pas une péremption graduelle.
Les deux directions d'erreur sont déjà mesurées, ce qui est la condition pour qu'un garde soit croyable :
Organe — scripts/epic_body_staleness.py, rendant par Epic ouverte : unrecorded_merged (liste, pas seulement un compte), stance_contradicted (booléen + le motif capturé), et le corpus lu (nombre d'Epics et de PRs effectivement examinées, pour qu'un zéro ne soit jamais indiscernable d'une lecture ratée).
Elle n'impose pas qu'un body liste toutes ses PRs — un tracker n'est pas un journal. Elle impose que le body ne contredise pas l'état livré, et que l'écart soit lisible au lieu d'être découvert par un agent qui claim un grain déjà fait.
Précédent direct : #11900 (le picker remonte des Epics dont le body est devenu faux) — cette Epic en est le remède structurel côté source, là où #11900 traitait le symptôme côté lecture.
Mandat user, 2026-09-01 (verbatim) : « De façon générale, il faudrait réécrire les body d'Epic à partir de l'avancement des commentaires et issues/PRs ».
Formulé après avoir constaté que #1210 — l'Epic qui gouverne semantic-fleet — s'intitulait
[Epic / priority-low / background]et s'ouvrait sur « Pas pour maintenant », alors que le dépôt y avait livré cinq PRs, dont l'ancrage en sous-module (#6542) qui est le geste exactement inverse d'une mise en veille. Verdict user : « c'est clairement un oubli ».Ce n'est pas un cas isolé — c'est 92 % des Epics
Mesuré le 2026-09-01 sur les 51 Epics ouvertes et les 800 dernières PRs mergées :
Tête du classement (PRs mergées citant l'Epic, absentes de son body) :
Une Epic dont le body ignore 21 de ses propres livraisons ne décrit plus le travail : elle décrit le jour où elle a été écrite.
Pourquoi une règle de plus ne suffirait pas
Le défaut est déjà écrit trois fois dans le harnais, et il a persisté à chaque fois :
coordinator-discipline.mdR5.2 — « un body d'issue est daté de sa rédaction, pas de sa lecture » ;verify-before-claiming.mdrègle 5 (FIRSTHAND picker délaissé), issue [variation] Le tirage remonte du delaisse — et le delaisse est presque toujours une EPIC dont le body est faux (2/2 mesures) #11900 — le picker remonte des Epics dont le body est devenu faux ;stale-body-is-the-mechanism-of-neglectde la mémoire coordinateur.Trois formulations, aucune application. En ajouter une quatrième serait l'échec-pendule que le CLAUDE.md global interdit. Ce qui manque n'est pas une phrase, c'est un organe — et c'est aussi ce que dit le mandat : « réécrire à partir de l'avancement » suppose qu'on puisse d'abord lire l'avancement mécaniquement.
Le signal, et ses deux directions d'erreur
Signal 1 — livraisons non inscrites.
{PR : PR mergée, PR cite #N, "#<PR>" absent du body de #N}. C'est la transcription littérale du mandat : le body doit inscrire l'avancement porté par les PRs.Signal 2 — posture contredite. Le body (ou le titre) déclare la dormance —
pas pour maintenant,priority-low,background,à ouvrir quand on aura le temps,plus tard,en veille— et des PRs de livraison ont mergé. C'est le motif exact de #1210 : une contradiction dure, pas une péremption graduelle.Les deux directions d'erreur sont déjà mesurées, ce qui est la condition pour qu'un garde soit croyable :
[CLAIMED]recopié verbatim). → l'organe doit exclure les lignes en bloc cité (>) et les passages encode.#1210en passant. Un#Ndans un body de PR n'est pas une livraison à N. → le compte est un signal à trier, jamais un verdict ; le tri se fait en ouvrant la PR.Acceptance
scripts/epic_body_staleness.py, rendant par Epic ouverte :unrecorded_merged(liste, pas seulement un compte),stance_contradicted(booléen + le motif capturé), et le corpus lu (nombre d'Epics et de PRs effectivement examinées, pour qu'un zéro ne soit jamais indiscernable d'une lecture ratée).>ne doit pas déclencher le signal 2.Ce que cette Epic ne fait pas
Elle n'impose pas qu'un body liste toutes ses PRs — un tracker n'est pas un journal. Elle impose que le body ne contredise pas l'état livré, et que l'écart soit lisible au lieu d'être découvert par un agent qui claim un grain déjà fait.
Précédent direct : #11900 (le picker remonte des Epics dont le body est devenu faux) — cette Epic en est le remède structurel côté source, là où #11900 traitait le symptôme côté lecture.