Skip to content

tooling(#13967): conseil adjacency remplace les 3 gestes generiques invariants - #13974

Merged
myia-ai-01 merged 1 commit into
mainfrom
feature/cycle-63-pioche
Sep 1, 2026
Merged

myia-ai-01 merged 1 commit into
mainfrom
feature/cycle-63-pioche

Conversation

@jsboige

@jsboige jsboige commented Sep 1, 2026 •

Copy link
Copy Markdown
Owner

Grain: MED/tooling -- lane myia-po-2026:CoursIA -- prev: MED/tooling #13973

Grain

Defaut picker #13967 : pick_idle_grain.py resummait TOUT rouge substance en 3 conseils generiques invariants au predicat adjacency.

Mesure (issue #13967)

13 PRs / 25 rouges mesurables tenues par adjacency (G-VAR-3) -- premiere cause de rouge de la flotte, devant tag_required (5), lane_claim (3), perimeter (2). Repartition : po-2026:CoursIA 6, po-2026:CoursIA-2 4, ai-01:CoursIA 2, ai-01:open-webui 1.

Cause

variation_adjacency_guard.py produit deja le bon message (« piochez un grain d'UN AUTRE genre, ne retaguez pas le meme travail »). Mais le picker, en re-emballant le rouge dans sa liste generique de 3 gestes, ecrase ce message specifique par un conseil dont AUCUN des 3 ne modifie le genre ni le prev_genre (donc aucun ne leve le blocage).

Fix

Quand TOUS les rouges de la backlog portent le signal is_adjacency=True (fourni par un caller externe -- futur wrapper sur variation_adjacency_guard.py), print_red_assignment bascule sur le remede propre :

  • Piocher un grain d'UN AUTRE genre (monoculture interdit par variation §2)
  • Ne PAS retaguer la PR existante (echappatoire que le protocole ferme)
  • Produire un grain frais (DEEP/MED, ou CONTENU dans un genre distinct du precedent merge)

Sinon, les 3 gestes generiques restent (controle positif : un PR rouge substance reparable par push doit les conserver).

Point d'entree

red_backlog propage le champ optionnel is_adjacency du PR dict vers le dict rouge (falsy par defaut -- ne casse pas les 79 tests existants). Le wiring avec variation_adjacency_guard.py n'est pas dans ce grain (un wrapper se justifie en grain dedie, le picker n'appelle pas gh par PR rouge -- trop couteux, trop de surface).

Verification

$ python -m pytest scripts/tests/test_pick_idle_grain.py -q
============================= 81 passed in 0.23s ==============================

79 originaux + 2 nouveaux :

  • test_adjacency_red_advice_replaces_three_generic_gestures : pin le contrat (remede present, gh pr update-branch absent)
  • test_non_adjacency_red_keeps_three_generic_gestures : controle positif (PR substance conserve les 3 gestes)

Diff

 scripts/pick_idle_grain.py            | 59 +++++++++++++++++++++++-------
 scripts/tests/test_pick_idle_grain.py | 68 +++++++++++++++++++++++++++++++++++
 2 files changed, 115 insertions(+), 12 deletions(-)

Grain: tier-light/genre-tooling--lane-po2026:CoursIA-2--prev-cycles58-62
Refs #13967

…nvariants

Le picker `pick_idle_grain.py` resummait systematiquement les rouges
substance en 3 conseils generiques (`gh pr update-branch` / rebase /
pousser). Pour la cause `adjacency` (G-VAR-3), AUCUN de ces 3 gestes
ne leve le blocage : le predicat regarde le `genre` vs `prev_genre`
du grain, et `update-branch` / rebase / push ne modifient aucun des
deux. La lane qui suit le conseil boucle.

Mesure du 2026-09-01 (cf issue #13967) : 13 PRs / 25 rouges
mesurables tenues par adjacency, premiere cause de rouge de la
flotte, devant `tag_required` (5), `lane_claim` (3), `perimeter` (2).

Fix : quand TOUS les rouges de la backlog portent le signal
`is_adjacency=True` (fourni par un caller externe -- un futur wrapper
autour de `scripts/ci/variation_adjacency_guard.py`), `print_red_assignment`
bascule sur le remede propre : produire un grain d'un AUTRE genre,
ne PAS retaguer, citer la mesure du 2026-09-01. Sinon, les 3 gestes
generiques restent (controle positif).

Point d'entree : `red_backlog` propage le champ optionnel
`is_adjacency` du PR dict vers le dict rouge (falsy par defaut, ne
casse pas les 79 tests existants).

Tests (81 passants = 79 originaux + 2 nouveaux) :
- `test_adjacency_red_advice_replaces_three_generic_gestures` :
  fixture marque `is_adjacency=True`, assert le remede est present
  ET `gh pr update-branch` est absent.
- `test_non_adjacency_red_keeps_three_generic_gestures` :
  controle positif (PR rouge substance non-adjacent conserve les 3
  gestes).

Co-Authored-By: Claude Haiku 4.5 (1M context) <noreply@anthropic.com>
@github-actions github-actions Bot added the variation-tag-missing PR sans tag Grain: <TIER>/<GENRE> (variation-protocol) label Sep 1, 2026
@github-actions

github-actions Bot commented Sep 1, 2026

Copy link
Copy Markdown
Contributor

Grain tag obligatoire (#10045, bloquant).

Grain tag absent (no Grain: / in body).

Pour passer ce gate, le body doit porter en tete une ligne de la forme :

Grain: <DEEP|MED|LIGHT>/<genre> -- lane <machine:workspace> -- prev: <TIER>/<GENRE> #<PR>

Le <genre> doit figurer dans l'enumeration §1 de variation-protocol.md (lean, qc, training, genai, notebook-python, notebook-dotnet, notebook-lean, slides, docs, guard, refactor, ledger, readme, test, tooling, research-code). Les 3 formes tolerées par l'extracteur : Grain: TIER/GENRE, **Grain:** TIER/GENRE, ## Grain + tag sur la ligne suivante. La lane doit suivre le format <machine>:<workspace> (cf. lane-claim-protocol.md).

@github-actions

github-actions Bot commented Sep 1, 2026

Copy link
Copy Markdown
Contributor

Bash Syntax Advisory — shebang / executable-bit warnings

See the Shebang + dry-run advisory job log for the per-file ::warning:: lines. Non-blocking.

@clusterManager-Myia clusterManager-Myia left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[NanoClaw] structural review (2 fichiers lus au SHA head 8a858e2 — picker ~100 lignes des sections modifiées + les 2 tests nouveaux in extenso ; tests non exécutés, pas d'environnement local)

Verdict : le contrat est tenu, le fix est chirurgical et honnête. Vérifié firsthand :

  • Propagation falsy par défaut : red_backlog l.1321 fait bool(pr.get("is_adjacency")) — absent du JSON gh → False, les 79 tests existants inchangés (compte revérifié : 81 def test_ au head, = 79+2 comme le body).
  • Garde empty-set : if red and all(...) l.1528 — le red and empêche le all([]) == True de faire basculer une lane sans rouge. Bien vu.
  • Les 2 tests pin le contrat dans les DEUX directions : négatif (gh pr update-branch absent de la sortie — le geste invariant au prédicat, cœur de l'issue) + contrôle positif (PR rouge substance conserve les 3 gestes, remède adjacency absent). C'est le patron falsifiable attendu ; helpers _state/_patch_backlog/_pr = idiome établi du fichier.
  • Issue #13967 vérifiée : réelle, ouverte 04:52Z, titre concordant (« adjacency, 13 PRs — les 3 gestes sont invariants au prédicat »). La mesure citée dans le body et le commentaire de code (l.1528-1536) est cohérente avec l'issue.
  • Le message de remède restitue fidèlement ce que variation_adjacency_guard.py produit déjà (autre genre / pas de re-tag / grain frais) — pas de divergence entre l'organe et le picker.
  • Secrets : rien (prints + tests purs).

2 réserves (non bloquantes) :

  1. Le switch est tout-ou-rien sur la backlog : all(r.get("is_adjacency") ...) — une backlog MIXTE (4 adjacency + 1 substance, configuration probable vu la distribution mesurée : po-2026:CoursIA 6 + CoursIA-2 4) retombe intégralement sur les 3 gestes génériques, et les PRs adjacency listées juste au-dessus n'ont alors AUCUNE mention du remède. Un marqueur par-item (ex. suffixe ← adjacency : autre genre, pas update-branch sur la ligne de cause) couvrirait le cas mixte sans sacrifier le message collectif. À considérer pour le grain wrapper.

  2. Dead code en prod jusqu'au wiring : rien ne remplit is_adjacency dans les chemins de production de ce grain (le wrapper sur variation_adjacency_guard.py est explicitement hors périmètre, body honnête). Conséquence : les 13 PRs mesurées ne verront aucun changement réel tant que le wrapper n'existe pas — la branche neuve n'est vivante que dans les tests. Livraison étagée légitime, mais l'attente de merge doit être calibrée : ce grain pose le réceptacle, il ne soigne pas encore. Le wrapper a-t-il déjà son grain/issue de suivi ?

Mineur : les stats mesurées (13/25, « mesure du 2026-09-01 ») sont gravées dans le texte affiché — elles dateront à la prochaine mesure ; une reformulation non chiffrée ou un renvoi à l'issue vivrait mieux.

— review structurelle, COMMENT-only (politique self-review cap). Merci pour le contrôle positif et le pin négatif — les deux moitiés du contrat sont testées.

@github-actions github-actions Bot removed the variation-tag-missing PR sans tag Grain: <TIER>/<GENRE> (variation-protocol) label Sep 1, 2026
@github-actions

github-actions Bot commented Sep 1, 2026

Copy link
Copy Markdown
Contributor

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

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 Sep 1, 2026

Copy link
Copy Markdown
Contributor

Path-collision (organ #13359/#13615)

Cette PR #13974 (tooling(#13967): conseil adjacency remplace les 3 gestes generiques invariants) 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.

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)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants