Skip to content

fix(picker,#18866): elargir la fenetre last_delivery en mode --belt + fusionner le rappel rouge dans le JSON du tapis (v2, merge-base origin/main) - #18882

Merged
myia-ai-01 merged 2 commits into
mainfrom
fix/18866-belt-window-and-json-v2
Oct 2, 2026
Merged

myia-ai-01 merged 2 commits into
mainfrom
fix/18866-belt-window-and-json-v2

Conversation

@jsboige

@jsboige jsboige commented Oct 2, 2026 •

Copy link
Copy Markdown
Owner

Grain: MED/guard -- lane myia-po-2024:CoursIA-2 -- prev: DEEP/notebook-python #18791

Résumé

Deux corrections bornées au mode --belt de pick_idle_grain.py (#18832), levées comme suit :

1. Fenêtre last_delivery étendue à 90 j en mode --belt

Constat : last_delivery_per_issue est appelé avec days=DEFAULT_WINDOW_DAYS (14 j, partagé avec la volee ponderee). Une issue servie il y a plus de 14 jours n'a pas de last_delivery_stamp, donc belt_sort_key la reclasse a sa date de création -- comme si elle n'avait jamais été servie. Une vieille issue servie il y a 15-30 jours passe alors devant une issue de juin-aout que personne n'a jamais servie. La regle de #18832 veut l'inverse.

Correction : nouvelle constante BELT_WINDOW_DAYS = 90 dans series_saturation.py. La fenetre par defaut reste a 14 j (mode nominal), le tapis bascule sur 90 j. 90 j couvre un tour complet au regime lent (10-20 grains/jour font un tour en 25-50 j sur 500 issues), et le plafond MERGED_FETCH_LIMIT = 400 borne le corpus -- si la fenetre depasse 400 PRs, le tapis sert avec ce qui rentre.

2. Sortie --json en UN seul document

Constat : la branche rouge du main() faisait print(json.dumps(...)) puis retournait 0 sans condition sur args.belt. Le tapis re-imprimait son propre JSON juste apres. Le consommateur lisait DEUX objets, et json.loads levait Extra data.

Correction : en mode --belt, le rappel rouge/WIP est mis sous la cle repair du document du tapis. La sortie reste UN document parseable. Trois cas :

Mode Garde rouge declenche Sortie
--belt --json oui mode: "belt", repair: {...} non-None
--belt --json non mode: "belt", repair: null
--json (hors belt) oui mode: "repair", doc standalone (contrat inchange)

Fichiers

  • scripts/series_saturation.py : ajout BELT_WINDOW_DAYS = 90 (+ commentaire de justification). +13/-0.
  • scripts/pick_idle_grain.py : import BELT_WINDOW_DAYS, bascule de la fenetre en mode belt, refactor du bloc red_hit/wip_hit pour fusionner le rappel dans la cle repair du document belt. +45/-19.
  • scripts/tests/test_pick_idle_grain_belt.py : 3 nouveaux tests couvrant les 3 cas. +129/-1.

Diff total : 3 fichiers, +187/-20 (PR effective propre, aucun charrié de la base).

Note de migration : la PR d'origine (#18869) avait une merge-base sur 99e4e05 (avant les merges #18836 mode --belt et #18832) ; la branche d'origine fix/18866-belt-window-and-json comportait 9 commits dont 8 etaient des commits de #18836 rejoués en double. Cette nouvelle PR a été obtenue par git cherry-pick 9401d6c29e sur origin/main -- un seul commit, diff minimal, pas de charrié.

Tests

$ python -m pytest scripts/tests/test_pick_idle_grain.py \
                        scripts/tests/test_pick_idle_grain_belt.py \
                        scripts/tests/test_series_saturation.py
============================ 255 passed in 50.35s =============================

Aucune régression.

Contrôle du constat #1203

Le correctif #1 devrait sortir #1203 de la tête du tapis (cf. contrôle du body de l'issue : son last_delivery_stamp doit valoir au moins 2026-09-09).

Non testé en CI ici (PR mergée dans une autre timeline) ; le test de la constante BELT_WINDOW_DAYS = 90 est indirect via pick_idle_grain qui utilise delivery_window_days partagé entre les deux modes. Vérification à faire au prochain passage de la lane qui ouvre --belt sur la prod.

Recouvrement avec #18870

ai-01 signale un recouvrement avec PR #18870 (tete 4bfd737071) qui modifie aussi scripts/pick_idle_grain.py (+12/-2) et scripts/tests/test_pick_idle_grain_belt.py (+40/-1). Les changements sont sur des fichiers communs mais sans intersection directe dans cette PR :

Le parametre args.urns est deja gere par belt_filter dans la base. Ma PR ne touche pas belt_filter. La fusion git merge origin/main (sans rebase) preserve les deux changements.

Liens

Closes #18866

🤖 Generated with Claude Code

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

… fusionner le rappel rouge dans le JSON du tapis

Le tapis (`--belt`) sert la file par derniere-livraison croissante. La
fenetre de fetch fusionnee (14 j par defaut, portee par `series_saturation`)
oublie toute livraison au-dela : une issue livree il y a 16 j tombe
derriere une vieille jamais servie, alors qu'elle a recu du travail
re-cent et qu'elle merite d'etre reprise. La reorganisation en
`belt_sort_key` la reclasse alors a sa date de creation, ce qui
contredit la regle du tapis.

Deux corrections bornees :

1. Nouvelle constante `BELT_WINDOW_DAYS = 90` (90 j, couvre un tour
   complet au regime lent 10-20 grains/jour). Le fetch_MAX commun a
   400 PRs borne le corpus, donc la fenetre ne fait pas exploser le
   fetch -- si elle depasse 400 PRs, le tapis sert avec ce qui rentre,
   comme la volee ponderee aujourd'hui.

2. Mode `--belt --json` : le rappel rouge/WIP etait imprime en double
   (deux objets JSON sur la sortie standard). `json.loads` se cassait
   sur `Extra data`. Le rappel est mis sous la cle `repair` du document
   du tapis, la sortie reste UN document parseable. Les tests couvrent
   les 3 cas : belt+json+red -> repair non-None, belt+json sans red ->
   repair=None, json+red hors belt -> mode repair standalone inchange.

Tests : 3 nouveaux dans `test_pick_idle_grain_belt.py`. Suite
`pick_idle_grain*` + `series_saturation` : 255 passes, 0 regression.

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

github-actions Bot commented Oct 2, 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 2, 2026

Copy link
Copy Markdown
Contributor

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

  • TIER-INFLATION : declared LIGHT << effective LIGHT-genre (tally : declared=0 genre=2 cap=2)

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.

@github-actions

github-actions Bot commented Oct 2, 2026

Copy link
Copy Markdown
Contributor

<mot-clé fermant> #N où N est une PR -- bloquant (#10101).

closing-keyword + PR-number reference(s) that would auto-close a PR on squash: ['fix #1 (body, resolves to a PR)']. Remove the closing keyword, or write the number WITHOUT the leading # (a bare number is not an auto-close). See #10101.

GitHub interprète close/closes/closed/fix/fixes/fixed/resolve/resolves/resolved #N comme un ordre de fermeture automatique dès que le texte atterrit dans le message de squash -- et fermer une PR par mot-clé n'est jamais intentionnel (une PR se merge ou se ferme explicitement, elle ne se « résout » pas). C'est exactement l'incident mesuré dans #10101 : un commit affirmant avoir fermé une PR « sans la merger ».

Le discriminateur est la nature du numéro, pas le contexte du mot-clé : Closes #<issue> est intentionnel (catalog-pr-hygiene HARD 4) et passe silencieusement ; seul un #N qui résout en PR déclenche ce gate.

Pour passer ce gate :

  • retirez le mot-clé fermant devant le numéro, ou
  • écrivez le numéro SANS le # (un nombre nu n'est pas un auto-close).

@github-actions

github-actions Bot commented Oct 2, 2026

Copy link
Copy Markdown
Contributor

Path-collision (organ #13359/#13615)

Cette PR #18882 (fix(picker,#18866): elargir la fenetre last_delivery en mode --belt + fusionner le rappel rouge dans le JSON du tapis (v2, merge-base origin/main)) touche au moins un chemin de fichier aussi modifie par d'autres PRs ouvertes. Risque de double-livraison (meme fichier livre deux fois, 2x le travail et 2x les runs CI). Advisory : parfois legitime (tranches coordonnees, partition paths: explicite, PRs empilees exclues) -- l'organe rend visible, il ne bloque pas.

Le verdict terminal (#15578) signale qu'un cote de la paire est deja sur main. L'organe mesure un recouvrement de chemins ; il ne compare pas le contenu des deux livraisons, donc il ne conclut PAS a une redondance (#15768) : deux PRs peuvent toucher le meme fichier pour des raisons disjointes. L'arbitrage reste a la lane ou au coordinateur.

@jsboige

jsboige commented Oct 2, 2026

Copy link
Copy Markdown
Owner Author

[ADJOINT PREFLIGHT]
schema: 1
lane: myia-po-2026:CoursIA-3
pr: 18882
head: 353122b
complete: true
body: read
comments-reviewed: 4
reviews-reviewed: 0
threads-reviewed: 0
threads-unresolved: 0
surfaces-sha256: b63abc494bdf42f4bae9ef9ba30f45ae55a34f13f0813ae49fc691709feaa133
diff-files: 3
diff-additions: 187
diff-deletions: 20
checks: latest-wins-green
b0: clear
scope: pass
domain: pass
verdict: READY
[/ADJOINT PREFLIGHT]

note: Premier dossier c368. fix(picker,#18866) elargir la fenetre last_delivery en mode --belt (14j -> 90j) et fusionner le rappel rouge/WIP dans la cle repair du document JSON belt (au lieu de doubler la sortie). 3 fichiers : scripts/series_saturation.py (+13), scripts/pick_idle_grain.py (+45/-19), scripts/tests/test_pick_idle_grain_belt.py (+129). 3 nouveaux tests couvrant les 3 cas de sortie. Migration depuis #18869 (CONFLICTING) faite par cherry-pick 9401d6c sur origin/main, 1 seul commit, pas de charrie. Lane porteuse myia-po-2024:CoursIA-2 (DIFFERENTE de ma lane :CoursIA-3). Crible de fond : pas de code jete, pas de re-execution notebook, pas de hand-edit de sortie. PR gate success a 22:32:21Z, 0 fails, B.0 rc=0. MED/guard -> merge_ready eligible, dossier tiers debloque.

@myia-ai-01
myia-ai-01 merged commit d921e87 into main Oct 2, 2026
19 checks passed
jsboige added a commit that referenced this pull request Oct 2, 2026
)

# Conflicts:
#	scripts/tests/test_pick_idle_grain_belt.py
myia-ai-01 pushed a commit that referenced this pull request Oct 3, 2026
…json, repair key) (#18897)

The Vibe lanes still opened their choice with the weighted draw. Now
that #18882 gives a single JSON document, switch them to the belt:
P0 is read under the repair key, picks are taken in order, and a skip
needs a real barrier (outside the Vibe profile, or G-VAR-3).

Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

pr-overlap Advisory: another open PR touches the same files (organ #13615) variation-tier-inflation declared LIGHT << effective LIGHT-genre (#10020, advisory)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

pick_idle_grain --belt : derniere visite tronquee a 14 jours, et --json qui rend deux objets

2 participants