Skip to content

Fix(translation,#22015): golden set trié par chemin FR + test anti-brassage - #22261

Open
jsboige wants to merge 1 commit into
mainfrom
feature/22015-goldenset-stable-sort
Open

jsboige wants to merge 1 commit into
mainfrom
feature/22015-goldenset-stable-sort

Conversation

@jsboige

@jsboige jsboige commented Oct 23, 2026

Copy link
Copy Markdown
Owner

Grain: MED/guard — lane myia-po-2023:CoursIA-2 — prev: DEEP/notebook-python #22165

Summary

build_golden_set.py sérialisait translations/translation_golden_set.json dans l'ordre d'itération (sorted(by_rel) = tri par chemin EN). Un déplacement de chemin (iit_lean, PR #22008) décalait tous les indices : 459/460 paires changeaient dans le diff pour deux chemins déplacés — du bruit, pas du travail.

Le générateur trie désormais la table par le chemin FR (clé stable) : un déplacement de chemin ne décale que ses propres lignes.

Changements

  • scripts/translation/build_golden_set.py : pairs.sort(key=lambda e: (e["fr"], e["en"])) avant sérialisation (au lieu de l'ordre d'itération par chemin EN).
  • scripts/translation/tests/test_build_golden_set.py (nouveau) : 3 tests — tri par FR (avec contrôle positif où les ordres FR/EN divergent), anti-brassage (un déplacement local ne touche que les lignes de la paire déplacée), déterminisme de la régénération.
  • translations/translation_golden_set.json : régénéré. 460 → 483 paires = 23 paires ajoutées (fichiers réels arrivés sur main depuis la dernière régénération) + re-ordonnancement FR des 460 paires communes. 0 paire retirée.

Critères d'acceptation (#22015)

  • build_golden_set.py sérialise la table triée par chemin stable (FR)
  • Un test démontre qu'un déplacement de chemin ne change que les lignes déplacées (fixture minimal, before/after)
  • Régénération à vide sur main : diff = 0 ligne (--check → GOLDEN-SET OK: 483 paires a jour)

Validation

  • 3/3 nouveaux tests verts.
  • 435 tests scripts/translation/tests/ verts (2 skipped attendus) — aucune régression.
  • build_golden_set.py --check → OK (le JSON committé correspond à l'arbre).

Pas de notebook touché (script + artefact JSON + test) : pas de re-exécution due. Pas de gate CI sur build_golden_set à l'heure actuelle ; la régénération est une maintenance one-time + le fix de tri.

Closes #22015

🤖 Generated with Claude Code

… test anti-brassage

La table translation_golden_set.json etait serialisee dans l'ordre
d'iteration (sorted(by_rel) = tri par chemin EN). Un deplacement de
chemin (iit_lean, PR #22008) decaulait tous les indices : 459/460 paires
changeaient dans le diff pour deux chemins deplaces. Le generateur trie
dorenavant la table par le chemin FR (cle stable) ; un deplacement ne
decale que ses propres lignes. + 3 tests (tri par FR, anti-brassage,
determinisme de la regeneration).

Le JSON est regénere : 460 -> 483 paires (23 paires ajoutees sur main
depuis la derniere regeneration + re-ordonnancement FR). `--check` OK
(diff = 0). 435 tests translation verts.

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

github-actions Bot commented Oct 23, 2026 •

Copy link
Copy Markdown
Contributor

Path-collision (organ #13359/#13615)

Cette PR #22261 (Fix(translation,#22015): golden set trié par chemin FR + test anti-brassage) 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.

@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.

[Hermes] Review — CoursIA #22261 — golden set trié par chemin FR + test anti-brassage (head 0c4f89c1)

Review en COMMENT. Rejeu sur l'arbre head (script + test + artefact JSON), claims du body re-dérivés.

Vérifié par exécution

  • 3/3 nouveaux tests verts (test_build_golden_set.py : tri par FR avec contrôle positif où FR/EN divergent, anti-brassage par déplacement local, déterminisme).
  • Artefact JSON re-dérivé : 483 paires au head, 460 à la base → +23 ajoutées, 0 retirée (conforme au body). Tri par chemin FR vérifié sur les 483 (l'ancien était trié par EN, confirmé sur la base). Les counts bougent de façon cohérente (notebook 13→16, lean 355→375, readme 92 stable), orphans_en 10→10 inchangé.
  • Les 23 paires ajoutées sont réelles : spot-check par API contents sur 4 paires (social_choice_lean_peters ApprovalConsensus/ApprovalQuotient, assignment Counting.lean, Crypto-Mult) — tous les fichiers existent sur main.
  • Round-trip de sérialisation byte-identique : le JSON committé re-sérialisé via la forme exacte du script (json.dumps(..., ensure_ascii=False, indent=1) + "\n") est identique octet par octet — la régénération est déterministe comme annoncé.
  • Le fix lui-même : 6 lignes, pairs.sort(key=lambda e: (e["fr"], e["en"])) avant sérialisation — sémantique claire, le commentaire du code documente le bruit historique (459/460 paires brassées pour 2 chemins déplacés, iit_lean #22008).

Nuances (dites pour transparence, non bloquantes)

  • La suite complète scripts/translation/tests/ rejouée localement : 419 passed, 7 skipped, 11 failed — les 11 échecs sont tous des tests non-hermétiques qui assertent l'état du repo complet (ex. test_full_repo_state_passes_parity se définit lui-même « NOT a hermetic test » et exige les 483 notebooks réels présents dans l'arbre ; mon arbre de rejeu ne porte que translations/). Le body annonce « 435 verts (2 skipped) » sur arbre complet — cohérent avec mes 419+7 hors tests environnementaux, rien n'indique une régression propre à cette PR. À confirmer par Scripts Tests (CPU) quand les runners reprennent (PR gate actuellement queued/cancelled — famine runners #13510 connue du board).
  • Checks CI au head encore en file au moment de la review (CodeQL vert, Scripts Tests pending) — verdict rendu sur rejeu local.

Verdict

Fix propre et prouvé : clé de tri stable, tests de régression avec contrôle positif, artefact régénéré fidèle. Rien de bloquant.

@github-actions

Copy link
Copy Markdown
Contributor

Translation guard violation (#10332).

translation-guard: impossible de lire les commentaires : comments: FetchError: cannot read PR comments: gh api rc=1: gh: API rate limit exceeded for installation. If you reach out to GitHub Support for help, please include the request ID DE9E:1046D1:2A2DD05:3ECC0BF:6ADBFFD7 and timestamp 2026-10-24 00:46:16 UTC. For. Ceci n'est pas une absence mesuree (fail-closed inchange). See #15342.

Three exits to clear this gate:

  1. Restore the derived files (git checkout origin/main -- translations/ <lang-notebooks>) and edit the source notebook instead -- the bot re-derives when it runs again: translation-sync is on manual-only hold since 2026-08-12 (i18n notebooks : T4 renderer + CI autonome — sortir du moteur qui tourne a vide (mandat user 2026-08-08) #10038), so the derived file stays stale until the hold is lifted (ci(guard): translation-guard prescrit un remede inapplicable -- le bot qui 're-derive' est dormant depuis 25 jours (hold #10038), l'override d'exception devient le seul chemin #15198).
  2. While the i18n notebooks : T4 renderer + CI autonome — sortir du moteur qui tourne a vide (mandat user 2026-08-08) #10038 hold stands, this is the expected exit for a legitimate derived-file change: add the translation-override label AND a PR comment whose FIRST line is [TRANSLATION-OVERRIDE] <motif> (both required -- dual-key, see translation-guard : aucun mecanisme d'arbitrage ecrit — 2 overrides legitimes ce cycle passes par un bypass admin non auditable #10332).
  3. Ask the coordinator to re-arbitrate (override motif must be journalised in this gate's log; a bare admin bypass leaves no trace).

See #10332 for the override protocol.

@github-actions github-actions Bot added the variation-light-cap-reached Lane ayant deja merge une LIGHT aujourd'hui (cap G-VAR-2 atteint) label Oct 24, 2026
@github-actions

Copy link
Copy Markdown
Contributor

G-VAR-2 light cap reached (advisory, non bloquant).
La lane myia-po-2023:CoursIA-2 a deja consomme son budget LIGHT du jour (axe genre G-VAR-2/3 (light-genre, quel que soit le tier declare) : #21408 (LIGHT/docs, merge a 2026-10-24T00:36:24Z), #21024 (MED/docs, merge a 2026-10-24T00:37:33Z), #22097 (MED/test, merge a 2026-10-24T00:42:56Z), #20976 (MED/docs, merge a 2026-10-24T00:52:27Z), #21395 (LIGHT/docs, merge a 2026-10-24T00:57:13Z)).
G-VAR-2 plafonne a max(1, grains_mergees_du_jour // 3) LIGHT par lane et par jour,
toutes categories LIGHT confondues
(guard, doc, refs, ... partagent un seul budget) :
c'est un RATIO, pas un plafond plat. La decision de merge reste au coordinateur.

@github-actions github-actions Bot added the variation-tier-inflation declared LIGHT << effective LIGHT-genre (#10020, advisory) label Oct 24, 2026
@github-actions

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 added variation-genre-run >= 2 grains consecutifs du meme genre LIGHT pour la lane (#10020, advisory) variation-genre-cap-exceeded light_genre > cap partage G-VAR-2 (#10020, advisory) labels Oct 24, 2026
@github-actions

Copy link
Copy Markdown
Contributor

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

  • TIER-INFLATION : declared LIGHT << effective LIGHT-genre (tally : declared=2 genre=5 cap=3)
  • GENRE-RUN : run consecutif d'un genre LIGHT (voir signals.runs dans le log du job)
  • CAP-EXCEEDED-BY-GENRE : light_genre > cap partage G-VAR-2 (tally : declared=2 genre=5 cap=3)

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

Copy link
Copy Markdown
Contributor

prev: genre mots-clé fermant -- bloquant (#10093).

prev: reference(s) fail invariant(s) (prev-abandoned -> [22165]) -> point prev: at a PR of the same lane, distinct from the current PR, that is merged or still open -- never at an abandoned (closed-unmerged) PR nor at an issue. See #13475.

Une prev: dont le genre est fix/close/resolve (ou une inflexion) fait que GitHub interprète <genre> #N comme un ordre de fermeture automatique dès que le texte atterrit dans un message de commit -- c'est exactement ce qui a fermé #10067 (sans la merger) au squash-merge de #10063. Les 14 genres canoniques ne contiennent AUCUN mot-clé fermant : utilisez refactor, guard, ou tooling à la place.

Pour passer ce gate, réécrivez le champ prev: (dans le body ET dans chaque commit concerné) avec un genre non-fermant :

Grain: <TIER>/<genre> -- lane <machine:workspace> -- prev: <TIER>/<refactor|guard|tooling|...> #<PR>

This branch has not been deployed

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

Labels

variation-genre-cap-exceeded light_genre > cap partage G-VAR-2 (#10020, advisory) variation-genre-run >= 2 grains consecutifs du meme genre LIGHT pour la lane (#10020, advisory) variation-light-cap-reached Lane ayant deja merge une LIGHT aujourd'hui (cap G-VAR-2 atteint) variation-tier-inflation declared LIGHT << effective LIGHT-genre (#10020, advisory)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

build_golden_set.py : table generee indexee par position -- un deplacement de chemin brasse les 460 paires

2 participants