Skip to content

[EPIC] Les body d'Epic ne sont jamais réécrits — 47/51 ignorent leurs propres livraisons #13906

Description

@myia-ai-01

Etat mesure au 2026-10-01 (lane myia-po-2024:CoursIA, auto-inscription)

Livraisons non inscrites par le corps ci-dessous :

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 47 / 51 (92 %)
Epics à la fois déclarées dormantes et livrées 2 (#1210 corrigée, #7265 ouverte)

Tête du classement (PRs mergées citant l'Epic, absentes de son body) :

Epic non inscrites sujet
#12373 21 MGS vs mealpy — comparaison appariée
#11703 15 Visibilité des lakes Lean dans les notebooks
#1203 15 MetaGeneticSharp fork
#12904 12 Decision Theory — jambe actuarielle
#12205 11 ICT Chantier 2 — témoins et synthèse
#5081 11 Renumérotation narrative des séries
#1454 11 Training & Post-Training

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 :

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 :

Acceptance

  1. 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).
  2. Contrôles positifs en tests — [Epic] semantic-fleet — repayer la dette SK refacto-rattrapée par-dessus la baseline propre 2023, puis pivoter vers un équivalent claudish #1210 avant correction doit sortir sur les deux signaux ; une Epic à jour ne doit sortir sur aucun ; et le contrôle négatif de la citation : un body qui cite une posture dormante dans un bloc > ne doit pas déclencher le signal 2.
  3. Sortie triable, jamais auto-appliquée. L'organe ne réécrit aucun body. Il produit la liste ordonnée qui rend la réécriture dispatchable.
  4. Réécriture des 7 têtes ([EPIC] MGS vs mealpy — comparaison appariée par paire de moteurs, pour diagnostiquer le noyau MetaGeneticSharp #12373, [EPIC] Visibilite des lakes Lean dans les notebooks — 13-20 % des declarations citees, 97/177 modules invisibles #11703, [EPIC] MetaGeneticSharp fork — embarque PR #87 + rebase upstream + submodule CoursIA + notebooks + release #1203, EPIC — Decision Theory : jambe actuarielle (tarification, crédibilité, ruine, valeur d'information) + pont GT↔DT #12904, [EPIC][ICT] Chantier 2 — Génération de témoins et synthèse certifiée : franchir la Loi II (vérificateur vers constructeur) #12205, [EPIC] Nommage canonique et parcours des notebooks — numéros, accrétions, noyaux et catalogue #5081, [EPIC] Training & Post-Training — trading + sudoku + RL/PPO + GenAI fine-tuning (po-2024 pionnier ⇄ ai-01 approfondit) #1454) : body reconstruit à partir des PRs mergées et des commentaires, en préservant l'historique (on ajoute et on rectifie l'ouverture, on ne tronque pas — patron appliqué à [Epic] semantic-fleet — repayer la dette SK refacto-rattrapée par-dessus la baseline propre 2023, puis pivoter vers un équivalent claudish #1210 : 30325 → 31910 caractères, rien retiré).
  5. [Epic] 🧭 Amorce patrimoine Aricie → MyIA.AI.Shared : index récupérable (CSP/Flee, Lucene/Safari, DCP/Redis, fork Lean) + ordre #7265 — second cas dormant-et-livré (motif « plus tard », 4 PRs : feat(guard,#13420): le picker ADMET au lieu de seulement classer — dwell 24 h + zone sans remède #13466, docs(converter,#7357): README API publique + stack d'origine — critère 1 (a)(b)(c) du déblocage dette doc complet #12887, docs(shared,#7357): substitution du SVM a noyau — SOTA-OK via Accord.NET 2.6.0 (test net9) #12545, docs(shared,#7357): cadrage E2 Option C - precondition dette doc constatee satisfaite, paire ML.NET 9 testee #12541) : même traitement que [Epic] semantic-fleet — repayer la dette SK refacto-rattrapée par-dessus la baseline propre 2023, puis pivoter vers un équivalent claudish #1210.

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.

Activity

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

    EPICEpic tracking issue with sub-issues

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions