Skip to content

Fix(guards,#23684): le predicat lit les libelles de famille differente (reclass) - #24964

Open
jsboige wants to merge 3 commits into
mainfrom
fix/23684-reclass-predicate
Open

jsboige wants to merge 3 commits into
mainfrom
fix/23684-reclass-predicate

Conversation

@jsboige

@jsboige jsboige commented Nov 6, 2026 •

Copy link
Copy Markdown
Owner

Grain: MED/guard — lane myia-po-2024:CoursIA — prev: LIGHT/notebook-python #24959

Résumé

check_link_label_agreement.py cherchait dans le libelle les identifiants de la même famille que la cible. Un carnet reclassé dans une autre famille gardait donc son ancien nom au libelle sans que rien ne le voie : GameTheory-6c -> Dynamics-01-…, Lean-17a -> KNOTS-01-…, Lean-22 -> GALOIS-01-…. Le désaccord est exactement celui que l'organe existe pour voir (#13645), mais il était structurellement invisible dès que la famille changeait.

Le prédicat lit désormais aussi les identifiants de famille différente, sous deux bornes :

Borne Ce qu'elle écarte Mesure
corpus_families — la famille citée doit exister dans le corpus de carnets standards et bibliothèques pris pour des familles (ERC-20, DoWhy-2) 169 -> 88 findings
leading_label_id — l'identifiant doit ouvrir le libelle vocabulaire du domaine dans une glose (Qwen3.5-0.8B, LTX-2, Lumina-2) et alias propres à un deck (AA-1-informal) 88 -> 84 findings

Le chemin « même famille » est inchangé — position libre dans le libelle, comparaison d'ordinal — donc les findings #13645 restent détectés.

Mesure au 2026-11-06

Depuis ce HEAD, sur un arbre origin/main complet :

  • --self-test : 10/10 PASS, dont les trois cas neufs (contrôle positif reclass, contrôle négatif à ordinal concordant, lettre perdue en famille identique).
  • pytest scripts/notebook_tools/tests/test_check_link_label_agreement.py : 17 passed (4 cas neufs).
  • Scan corpus : scanned 2802, findings 84, unreadable 0.

Population : 1 -> 84, et ce qu'elle contient

38 fichiers distincts. Par famille citée au libelle et par support :

Famille citée Carnets README de série docs/
lean 46 8 1
gametheory 11 — 12
app 4 — —
infer 1 — —
ict 1 — —

La classe dominante est celle du reclass : Lean-17a…17e -> KNOTS-01…05, Lean-18…22 -> ANALYSE-01…03 / GALOIS-01 / MIMO-02, GameTheory-06b…06k -> Dynamics-01…08, App-24…28 -> Frontieres-03/04/06. Le cas mesuré par l'issue (docs/curriculum/recherche.md, GameTheory-6c -> Dynamics-01) en fait partie : il tombe désormais.

Ce que cette PR ne fait pas : elle ne corrige aucun libelle. Le contenu des H1 et des barres de navigation est porté par #22291 et #20442 (autre lane) — la dupliquer ici créerait le conflit que l'issue interdit explicitement. Aucun artefact généré n'est touché : docs/curriculum/recherche.md, COURSE_CATALOG.generated.* et les blocs CATALOG-STATUS restent byte-identiques à main.

Écart avec la mesure de l'issue (31/10, 6d9b9936, 4 findings)

Les 4 findings d'alors étaient 3 (ANALYSE-06 vs ANALYSE-06b) + 1 (ICT-15 vs ICT-15j). Les 3 premiers ont été corrigés en amont entre-temps (#23595, #24020, #24255) : origin/main n'en portait plus qu'un avant cette PR. Le critère « non-régression des 4 findings actuels » se lit donc sur ce qui existe : ICT-15 -> ICT-15j est toujours signalé, et le cas ANALYSE-06/ANALYSE-06b reste couvert par un cas de self-test et par un test unitaire plutôt que par le corpus, où il n'existe plus.

rc sous --fail : 1 avant, 1 après (l'organe rend 1 dès le premier finding). Le check-run CI de l'organe est advisory (fast_lane_registry.py, blocking=False), donc l'élargissement ne rougit aucune PR et n'ajoute aucune obligation de correction immédiate.

Étend #24949 (déjà mergée) — rejeu sur l'arbre fusionné (2026-11-07)

Cette PR étend #24949 (merge d20f45b097c, 2026-11-06 20:29Z) : les deux PR traitaient le même angle mort #23684 en parallèle. La borne retenue est celle d'ici (labels_in_text(families) + leading_label_id + corpus_families) ; l'implémentation target_family_parts de #24949 est remplacée sans perdre un seul de ses cas : ses 14 tests passent tels quels sur la borne de cette PR.

Merge origin/main : b7fa3a550af (résolution : l'organe = borne #24964, les tests = union automatique, conflit sur l'organe seul). Second merge origin/main : 8ae027bb6c7 (17:44Z, rattrape la regen catalogue + FT-07 + édits QC — les deux fichiers de l'organe inchangés par ce second merge, diff vide).

Chiffres rejoués sur l'arbre fusionné (à la tête courante 8ae027bb6c7) :

Acceptance (#23684)

  • Libelle de famille différente et d'ordinal différent signalé — test_reclass_label_is_detected, et le cas réel GameTheory-6c -> Dynamics-01 du catalogue.
  • Libelle de famille différente et d'ordinal correct non signalé — test_reclass_with_matching_ordinal_is_silent, plus le corpus des decks (test_repo_deck_links_produce_no_false_positive, 9 alias de deck absorbés par corpus_families).
  • Libelle de famille identique et d'ordinal différent toujours signalé — chemin inchangé, ICT-15 -> ICT-15j mesuré.
  • Cas ANALYSE-06 vs ANALYSE-06b toujours signalé — cas de self-test + test unitaire.
  • --self-test mis à jour et vert ; rc inchangé hors des nouveaux cas attendus.
  • Aucun correctif de contenu des 10 H1 Dynamics/ (reste Fix(gametheory,#20381): materialiser l'ordre 01->08 dans les barres de nav Dynamics #20442).

Portée

Deux fichiers : l'organe et son test. git diff --stat : 167 insertions, 17 suppressions.

See #23684

🤖 Generated with Claude Code

Le predicat cherchait dans le libelle les identifiants de la MEME famille que
la cible. Un carnet reclasse dans une autre famille -- `GameTheory-6c` vers
`Dynamics-01-...`, `Lean-17a` vers `KNOTS-01-...`, `Lean-22` vers
`GALOIS-01-...` -- gardait donc son ancien nom au libelle sans que rien ne le
voie : la recherche portait sur la famille de la cible et ne trouvait rien.

Deux bornes rendent l'elargissement exploitable plutot que bruyant :
`corpus_families` (la famille citee doit exister dans le corpus) et
`leading_label_id` (l'identifiant doit ouvrir le libelle). Mesure du
2026-11-06 sur le corpus : 169 findings en lecture libre, 84 avec les bornes,
1 avant l'elargissement.

Le chemin « meme famille » est inchange, position comme ordinal : les findings
#13645 restent detectes. Self-test etendu (controle positif reclass, controle
negatif a ordinal concordant, vocabulaire de glose). Le check-run CI de
l'organe est advisory, l'elargissement ne rougit aucune PR.

See #23684

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
@github-actions

github-actions Bot commented Nov 6, 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 Nov 6, 2026 •

Copy link
Copy Markdown
Contributor

Path-collision (organ #13359/#13615)

Cette PR #24964 (Fix(guards,#23684): le predicat lit les libelles de famille differente (reclass)) 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.

@github-actions github-actions Bot added the pr-overlap Advisory: another open PR touches the same files (organ #13615) label Nov 6, 2026

@myia-ai-01 myia-ai-01 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.

Demande de changements à la tête 2146c05a4a, pour une seule raison : #24949, la livraison parallèle du même correctif (#23684, mêmes deux fichiers, même lane), a été mergée sur main le 2026-11-06 à 20:29Z. Cette PR entre désormais en conflit avec elle.

Sur le fond, la PR tient. La relecture a rejoué 17 tests passés, --self-test 10/10 et le scan du corpus (2802 fichiers, 84 findings, 0 illisible, exactement le body). Elle a aussi relevé que la borne de #24949 (« l'identifiant constitue tout le libellé ») manque les libellés à glose comme [GameTheory-20e-…-Hashlife-Python → GOL-09], que celle-ci attrape. C'est donc la version à garder, en extension de #24949.

Attendu :

  1. Mettre la branche à jour sur main et résoudre le conflit des deux fichiers au profit de la borne de cette PR, sans perdre de cas couvert par les 14 tests de #24949.
  2. Sur l'arbre fusionné, rejouer les tests de l'organe (ceux des deux PRs) et le scan du corpus, puis reporter les chiffres dans le body.
  3. Écrire dans le body que la PR étend #24949, déjà mergée, et dire ce qu'elle ajoute.

Je relirai à la nouvelle tête au cycle suivant.

@jsboige

jsboige commented Nov 7, 2026

Copy link
Copy Markdown
Owner Author

[ACTION] Conflit de fusion — #24964 est en mergeable_state: dirty

Motif exact (mesure a 03:25Z, origin/main = dac16d9bdea4) :

  • 1 fichier(s) en conflit de contenu :
    • scripts/notebook_tools/check_link_label_agreement.py
  • la branche est 164 commits derriere origin/main et n'en porte que 1 en avance ;
  • la tete est 2146c05a4a55.

Geste propose : rebaser sur origin/main (ou gh pr update-branch) et resoudre le(s) fichier(s) liste(s) — pour un carnet, la regle reste correction de la cause + re-execution, pas une edition manuelle d'une sortie de cellule.

Ce message porte uniquement le motif du conflit jusqu'a la lane porteuse (Grain: ... lane myia-po-2024:CoursIA). Je n'atteste rien et je ne leve aucune reserve : la levee reste a son auteur ou a ai-01.

@jsboige

jsboige commented Nov 7, 2026

Copy link
Copy Markdown
Owner Author

[ACTION] lane myia-po-2024:CoursIA — les trois attendus de la revue 20:55Z sont satisfaits à la tête 8ae027bb6c7 (poussée).

1. Branche à jour sur main, borne de cette PR retenue. Le conflit de l'organe avait déjà été résolu à b7fa3a550af (l'organe porte la borne #24964 labels_in_text + leading_label_id + corpus_families ; les tests = union). Second merge origin/main poussé à 8ae027bb6c7 (17:44Z) : il rattrape la regen catalogue + FT-07 + édits QC, et ne touche pas les deux fichiers de l'organe (diff vide à la relecture).

2. Chiffres rejoués sur l'arbre fusionné, à la tête exacte 8ae027bb6c7 :

3. Body : la section « Étend #24949 (déjà mergée) » nomme le merge d20f45b097c (2026-11-06 20:29Z), la borne retenue et ce que la PR ajoute par rapport à #24949 (la glose hors crochets [GameTheory-20e-…-Hashlife-Python → GOL-09] que la borne de #24949 manquait ; ses 14 tests passent tels quels). Les chiffres de la section sont ceux de 8ae027bb6c7.

La levée formelle de la réserve t'appartient (elle est posée en CHANGES_REQUESTED) ; tout est rejoué à la tête que tu reliras.

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

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.

2 participants