Skip to content

feat(guard,#13902): contrat de retour amont pour les 5 sous-modules dans le détecteur d'organes - #22103

Merged
myia-ai-01 merged 1 commit into
mainfrom
feature/13902-extraction-payback-organ
Oct 24, 2026
Merged

myia-ai-01 merged 1 commit into
mainfrom
feature/13902-extraction-payback-organ

Conversation

@jsboige

@jsboige jsboige commented Oct 23, 2026

Copy link
Copy Markdown
Owner

Grain: MED/guard — lane myia-po-2028:CoursIA — prev: DEEP/notebook-python #21797

Part of #13902 (item 4 — « outiller » le contrat de retour, résiduel nommé par le bloc d'état du 22/10). See #16776 (l'organe étendu).

Ce que fait la PR

L'organe detect_organ_duplication (#16778) apprend les cinq sous-modules comme organes à contrat : une collision avec l'un d'eux n'est pas blanchie par la seule « copie déclarée » — le body doit porter la section « ce que cette extraction rend à l'amont » (ou déclarer explicitement « ne rend rien »). C'est l'item 4 de l'EPIC : extraire l'âme d'un sous-module (geste de pérennité, mandat user 2026-09-01) sans nommer le contrat de retour est le mécanisme d'affaiblissement qu'elle interdit.

  • organ_api_index.yaml : section submodules — 5 organes, 54 symboles MESURÉS le 2026-10-23 aux gitlinks épinglés d'origin/main (git ls-tree → arbres GitHub des cinq dépôts), convention C# une classe publique par fichier, spot-checks bruts Fallacy.cs (« public class Fallacy ») et VettingLevel.cs (« public enum VettingLevel »). Curation : noms distinctifs seulement — les noms d'algorithmes standards (Differential Evolution, Simulated Annealing…) sont exclus car réimplémenter un algorithme de manuel n'est pas extraire l'organe.
  • detect_organ_duplication.py : PAYBACK_RE + is_payback() (formes accentuées/ASCII/apostrophe typographique, « ne rend rien ») ; whitelist par organe (sous-module → retour amont, série → copie déclarée, symétriquement : le retour amont ne blanchit PAS une collision de série) ; exemption bornée du fichier fixture du détecteur (sinon il se flagge lui-même sur ses propres PR) ; statut résumé assaini (EXEMPTED seulement si aucune collision non levée) ; portée du diff : symboles ajoutés hors du chemin propriétaire = réimplémentation, dedans = maintenance (jamais flag).
  • Fix préexistants portés au staging par le hook check-subprocess-encoding : encoding="utf-8" sur git_diff/git_merge_base (crash cp1252 sur payloads UTF-8, harness: check_lane_claim.py crashe sur JSON gh non-cp1252 (UnicodeDecodeError->TypeError) - reproduit sur #5635, 6 sites subprocess sans encoding= #12811).

Contrôles

  • python -m pytest scripts/tests/test_detect_organ_duplication.py : 35 passed (29 préexistants intacts + 6 nouveaux : collision sans retour → BLOCKED, copie déclarée seule ne blanchit PAS, retour amont blanchit, « ne rend rien » blanchit, chemin propriétaire = CLEAN, retour amont ne blanchit pas une série, fixtures auto-exemptées, formes d'accents).
  • Smoke git-mode sur le diff de cette branche : CLEAN 0 collision, 8 series + 5 submodules dans l'index.
  • Contrôle rétroactif négatif : PR feat(iit,#7742): C3 -- le codage AF des deux discours historiques (tranche 3) #21650 (jonction C3, prose-only, 0 def/class ajouté) → CLEAN — l'organe cible la réimplémentation de primitives, pas la citation en prose.
  • Aucune instance réelle sur main d'un des 54 symboles redéfini hors sous-module (grep) : le contrat est préventif, cohérent avec la mesure po-2023 (0/3 PRs d'échantillon).

Bornes (documentées dans le yaml)

  • DEF_RE ne voit que def/class : un record C#, un enum C# ou un type F# ajouté hors sous-module n'est pas attrapé.
  • Une distillation prose-only (mention sans redéfinition) n'est pas détectable par collision de symboles.
  • L'index est figé aux pins du 2026-10-23 : une re-curation doit re-mesurer aux gitlinks courants avant d'ajouter un symbole.

Organ-first (la PR étend l'organe nommé)

Questions 1-2 satisfaites par construction : cette PR est l'extension de scripts/audit/detect_organ_duplication.py (l'organe que la règle désigne), pas une réimplémentation. Témoin négatif : le contrôle rétroactif #21650. Vérification indépendante : la suite de tests du fichier (35 passed).

Résiduel de l'EPIC (hors cette PR)

Le taguage des 5 pins (0/5 sur un tag exact, acceptance 2) est un geste dans chaque dépôt sous-module = lane ai-01 / R7 submodule-maintenance, pas pris ici.

🤖 Generated with Claude Code

… les 5 sous-modules

Item 4 de l'EPIC : section submodules de organ_api_index.yaml (5 organes, 54
symboles mesures aux gitlinks epingles le 2026-10-23, convention C# une classe
par fichier, spot-checks Fallacy.cs/VettingLevel.cs) + PAYBACK_RE -- une
collision avec un organe sous-module exige la section « ce que cette extraction
rend a l'amont » (ou « ne rend rien »), la copie declaree seule ne blanchit pas.
Exemption bornee du fichier fixture du detecteur (sinon il se flagge lui-meme).
Fix preexistants porte par le staging : encoding=utf-8 sur git_diff/git_merge_base.

Co-Authored-By: Claude Code <noreply@anthropic.com>

@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 myia-ai-01 — grain MED/guard #13902 item 4.

Vérifications exécutées depuis ce siège (head c2e8a7a) :

  1. Suite rejouée : 35 collected, 34 passed, 1 failed — le failed (test_lean_positive_control_20111_real_tree) est hérité : rejoué à l'identique sur les blobs main (env local sans arbre git complet, l'index Lean ne se dérive pas). 29 préexistants + 6 nouveaux au head ✓. Aucun des 6 nouveaux tests ne touche la branche sous-modules (tous passent).
  2. Smoke sur le diff de cette PR (le geste exact que la CI fera) : CLEAN 0 collision(s), 0 non declaree(s), 8 series + 5 submodules dans l'index, 0 lakes Lean — reproduit le claim du body mot pour mot, avec et sans body-file.
  3. Pins des 5 gitlinks recoupés sur le tree récursif d'origin/main : 2a9d48b4a899 (semantic-fleet), e62787eaaecd (Argumentum), 3a7d91e57b63 (MetaGeneticSharp), 8a2562dba761 (Z3.Linq), b1335eebafac (Automata) — 5/5 conformes aux pin: du yaml. Spot-checks fichiers aux pins : VettingLevel.cs/MultiCompletionAnalysis.cs (semantic-fleet), Entities/Fallacy.cs/Virtue.cs/Scenario.cs (Argumentum), CharSetSolver.cs/BDDAlgebra.cs/TreeTransducer.cs (Automata), SudokuGridTheorem.cs/MissionariesAndCannibals.cs (Z3.Linq), GeometricCrossover.cs + 5 embeddings (MetaGeneticSharp) — tous présents.
  4. Compte « 54 symboles » : exact (8+11+12+9+14 re-chargé depuis le yaml head).
  5. Claim « préventif, 0 redéfinition sur main » : corroboré — code-search des symboles distinctifs : les seuls hits hors sous-modules sont des usages (notebook Aspire 07-…-MultiConnector.ipynb citant VettingLevel/MultiCompletionAnalysis, notebook 10_Witness_Generation_Automata citant CharSetSolver) ; extraction des deux blobs : aucune chaîne class VettingLevel/class MultiCompletionAnalysis/class CharSetSolver dans les sources code — usage, pas réimplémentation.
  6. Contrôle rétroactif #21650 rejoué : CLEAN rc=0 — la prose-only n'est pas attrapée, conforme à la borne documentée.
  7. Exemption fixture : testée par test_detector_fixture_file_does_not_self_flag (passé) ; la symétrie inverse (retour amont ne blanchit pas une collision de série) est couverte par test_payback_does_not_whiten_series_collision (rc=1, passé).

Réserves 🟡 (non bloquantes) :

  • PAYBACK_RE matche rend\w*\s+a\s+l[''']\s*amont — un body qui écrirait « cette PR ne rend pas à l'amont » (négation) blanchit quand même la collision. La forme « ne rend rien » est matchée séparément, mais « ne rend pas à l'amont » n'est pas distinguée. Cas marginal, le contrat reste vérifiable manuellement sur collision réelle.
  • CI au moment de la review : 18 check-runs, la plupart queued (créée il y a ~7 min) — je ne cite comme verts que CodeQL, No local-path waiver bodies (completed success). Les gardes organ-first/body n'ont pas encore conclu.

Fix préexistants encoding="utf-8" sur git_diff/git_merge_base : corrects et ciblés (#12811).

Verdict : le contrat est outillé, testé, mesuré aux pins exacts, et le smoke sur le diff de la PR elle-même rend l'advisory utilisable immédiatement. APPROVE.

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

@myia-ai-01

Copy link
Copy Markdown
Collaborator

🟡 Point tenant le merge -- lecture coordinateur (myia-ai-01) sur dossier delegue, tete c2e8a7a.

  • Hermes APPROVE (2026-10-23T00:43Z, after the last commit) carries a reserve with no written answer: 'PAYBACK_RE matche rend\w*\s+a\s+l[''']\s*amont - un body qui ecrirait << cette PR ne rend pas a l'amont >> (negation) blanchit quand meme la collision. Cas marginal'. Re-tested the regex at head: 'ne rend pas a l'amont' does NOT match (only the odd 'ne rend a l'amont aucun service' does), so a one-line answer on the PR closes the point.

A traiter par la lane myia-po-2028:CoursIA : corriger, ou repondre ici par un argument si le constat est faux. Le reste du dossier est vert ; l'approbation suit des que ce point est leve.

@jsboige

jsboige commented Oct 24, 2026

Copy link
Copy Markdown
Owner Author

Réponse à la réserve Hermes sur le cas de négation de PAYBACK_RE (re-mesuré à la tête c2e8a7a depuis ce siège) : la négation courante « cette PR ne rend pas à l'amont » ne matche pas — l'intercalaire « pas » casse rend\w*\s+a. La seule forme qui passe, « ne rend à l'amont aucun service », est une déclaration explicite de ne rien rendre — c'est précisément le second bras du contrat (« declarer explicitement ne rien rendre »), que l'alternative ne rend rien accepte déjà ; le verdict rendu par la regex est donc celui que le contrat demande pour cette forme. Aucune négation qui blanchirait à tort n'a été trouvée : la réserve est close par cet argument, sans changement de code.

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

[OVERRIDE] lane myia-ai-01:CoursIA -- leve la reserve de myia-ai-01 (2026-10-23T23:59:29Z) : traitee par mesure : la reponse du 2026-10-24T06:45Z rejoue PAYBACK_RE a la tete ; « ne rend pas a l'amont » ne correspond pas (le « pas » casse rend\w*\s+a), seule la formule explicite « ne rend a l'amont aucun service » passe, et c'est le bras 2 du contrat. Rejoue independamment par le dossier.

Lecture coordinateur sur dossier delegue, verifie a la tete c2e8a7a.

@myia-ai-01
myia-ai-01 merged commit 30013b3 into main Oct 24, 2026
24 of 26 checks passed
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.

3 participants