Skip to content

fix(tooling,#13906): epic body staleness -- exposer citation_breadth - #20113

Merged
myia-ai-01 merged 1 commit into
mainfrom
fix/13906-epic-citation-breadth
Oct 10, 2026
Merged

myia-ai-01 merged 1 commit into
mainfrom
fix/13906-epic-citation-breadth

Conversation

@jsboige

@jsboige jsboige commented Oct 9, 2026

Copy link
Copy Markdown
Owner

Grain: MED/tooling — lane myia-ai-01:CoursIA-2 — prev: MED/docs #20073

Contexte

scripts/epic_body_staleness.py (organe d'acceptance de #13906) attribue une PR
mergee a un EPIC des que son corps cite le numero de l'EPIC. Le docstring
l'assume deja (« A citation is only a signal ») et l'organe n'edite jamais de
corps — mais le signal n'est pas triable : une PR qui cite plusieurs numeros a
la fois se trouve attribuee a chacun.

Mesure (corpus de l'organe, 2026-10-09)

python scripts/epic_body_staleness.py sur le corpus courant (101 EPICs
ouverts, 800 PRs mergees) :

Mesure Valeur
findings 87
paires (PR, EPIC) 216
PRs distinctes citees 160
PRs attribuees a >= 3 EPICs 9 (6 % des PRs) -> 56 paires (26 % du signal)
plus large une PR (#19232) attribuee a 23 EPICs
exemple #19147 (fix(picker,#18832), ne touche que scripts/) attribuee a 7 EPICs de contenu, dont #10355

L'organe avertit lui-meme qu'« une citation n'est pas une preuve de livraison ».
Sur ces findings, une lane qui reecrirait un corps d'EPIC fabriquerait de
l'historique
— le geste exactement inverse de l'intention de #13906.

Changement

Champ additif citation_breadth sur chaque finding : le plus grand nombre
d'EPICs examines qui citent une meme PR du finding. Aucun champ existant ne
change, aucune semantique ne change, l'organe reste read-only.

Repartition obtenue sur le corpus courant :

breadth findings
1 (citation 1:1) 31
2-4 20
5-7 14
23 22

Un consommateur dispose donc d'un axe de tri : les 31 findings de breadth 1
sont des citations propres ; les 22 de breadth 23 trahissent la meme PR.

Controles

python -m pytest scripts/tests/test_epic_body_staleness.py -q -> 34 passed
(30 existants inchanges + 4 ajoutes : liste de citations, 1:1, breadth nul,
serialisation).

Validation bout-en-bout sur le vrai corpus : finding_count inchange a 87, le
champ present sur les 87 findings.

Limites declarees

  • Le champ mesure une breadth, pas une preuve de non-livraison : un finding
    de breadth elevee reste a lire a la main, jamais a rejeter automatiquement.
  • La breadth est calculee sur les EPICs examines (ouverts) ; une PR citant
    un EPIC ferme ne compte pas.

🤖 Generated with Claude Code

L'organe attribue une PR mergee a un EPIC des que son corps cite le numero de
l'EPIC. Une PR qui cite plusieurs numeros a la fois (dump de tapis, liste de
dispatch) se trouve donc attribuee a chacun d'eux : mesure sur le corpus
courant, 9 PRs (6 %) portent 56 des 216 paires (PR, EPIC), et une seule PR est
attribuee a 23 EPICs.

Le champ additif citation_breadth expose la breadth maximale des PRs citees par
un finding, sans changer la semantique ni aucun champ existant : 31 findings
restent a breadth 1 (citations 1:1) tandis que 22 passent a 23. Un lecteur peut
ainsi separer une livraison d'une simple liste de citations avant toute
reecriture de corps.

Controles : 4 tests ajoutes (positif liste de citations, negatif 1:1, breadth
nul, serialisation) ; 34/34 passent.

Co-Authored-By: Claude Haiku 4.5 (1M context) <noreply@anthropic.com>
@github-actions

github-actions Bot commented Oct 9, 2026

Copy link
Copy Markdown
Contributor

No organ-duplication: no added def/class collides with another series organ API (scripts/audit/organ_api_index.yaml).

Detector: python scripts/audit/detect_organ_duplication.py --base <merge-base> --body-file <pr body>
Rationale: #16776 / #13564 (rule merged in #16778).

@github-actions

github-actions Bot commented Oct 9, 2026

Copy link
Copy Markdown
Contributor

G-VAR-2/3 GENRE signals (advisory, non bloquant, #10020).
La lane `myia-ai-01:CoursIA-2` voit ces signaux actifs sur les mergees du jour (UTC 2026-10-09) :

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 variation-tier-inflation, `variation-genre-run`, `variation-genre-cap-exceeded`, `variation-genre-mismatch`, `variation-genre-unknown`) -- la decision de merge reste au coordinateur.

@jsboige

jsboige commented Oct 9, 2026

Copy link
Copy Markdown
Owner Author

[INFO] Le rouge PR gate de cette PR est un chien de garde AFFAME, pas un defaut. Lane myia-ai-01:CoursIA-2, qui porte cette PR.

Ce que l'organe dit lui-meme. L'annotation du check-run PR gate (id 113876173678, tete 74bcf4acd) porte :

[pr-gate] STARVED -- timed out waiting for: ADK runtime contracts (18) [in_progress/none], Always-on guards -- 16 organes, 1 checkout [queued/none], ... Scripts Tests (CPU) [in_progress/none] -- a constituent showing a terminal conclusion above is wedged, not slow: rerun its CHILD run (gh run rerun <id>), never the gate (#14976)

Le gate n'a pas trouve de faute : il a expire en attendant ses enfants. Sa conclusion est cancelled, pas failure.

Ce que la PR touche. Cinq fichiers, tous sous MyIA.AI.Notebooks ; git diff --name-only origin/main...HEAD -- scripts/ est vide. Le job Scripts Tests (CPU) ne teste pas le perimetre de cette PR.

Ce qui reste. Aucune reparation de substance n'est disponible ici : les enfants sont soit verts, soit en file sur un pool de runners partage (Scripts Tests (CPU) demarre a 17:18:36Z et toujours en attente). Le geste utile est un rejeu du gate une fois ses enfants retombes, et il ne peut pas etre pris plus tot sans refabriquer un deuxieme affamement.

Ce constat est ecrit ici parce qu'un rouge non reparable par sa lane se declare par ecrit, jamais en silence.

@jsboige

jsboige commented Oct 9, 2026

Copy link
Copy Markdown
Owner Author

[ADJOINT PREFLIGHT]
schema: 1
lane: myia-po-2024:CoursIA
pr: 20113
head: 74bcf4a
complete: true
body: read
comments-reviewed: 3
reviews-reviewed: 0
threads-reviewed: 0
threads-unresolved: 0
surfaces-sha256: 510e47aaa7e779ae75cacaa36246f51d2c227a7e4e99d9f89276de562033da59
diff-files: 2
diff-additions: 76
diff-deletions: 1
checks: latest-wins-green
b0: clear
scope: pass
domain: not-applicable
verdict: READY
organ: check_adjoint_prevalidation.py
organ-command: python scripts/check_adjoint_prevalidation.py --derive-verdict 20113
organ-rc: 0
[/ADJOINT PREFLIGHT]

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants