Skip to content

feat(genai,#16758): controle par interp — direction du refus, ablation, finetuning shallow - #17763

Merged
myia-ai-01 merged 1 commit into
mainfrom
feature/16758-control-refusal-direction
Sep 25, 2026
Merged

myia-ai-01 merged 1 commit into
mainfrom
feature/16758-control-refusal-direction

Conversation

@jsboige

@jsboige jsboige commented Sep 25, 2026

Copy link
Copy Markdown
Owner

Grain: DEEP/notebook-python — lane myia-po-2024:CoursIA-2 — prev: DEEP/qc #17735

Resume

Notebook T17 de l'arc B (EPIC #16741), sous-grain #16758 : la chaine de controle par interpretabilite de R11 §2.2.5 et R14 §3.1-§3.2, implementee sur un temoin synthetique entraine from scratch — transformeur a 2 blocs, 25 tokens, tache de conjonction verbe x objet (le risque demande les deux : aucun token marqueur ne suffit, le cas n'est pas degenere). Aucun LLM externe, aucun telechargement, GPU non requis.

MyIA.AI.Notebooks/GenAI/Security/Control/Control-Refusal-Direction.ipynb, execute end-to-end (papermill, 36 cellules dont 13 de code, outputs reels committes).

Ce qui est mesure (un run deterministe, valeurs lues dans les outputs)

Section Mesure
Corpus train n=8000 (p_risque=0.25), calibration n=4000, evaluation n=2000 ; conjonction verifiee (v0+o4 -> <comply>, v4+o2 -> <comply>)
Temoin 70809 parametres, 2 blocs ; refus 1.000 / conformite 1.000 sur le split d'evaluation
Direction difference de moyennes sur calibration : norme de d = 15.18 (couche 0) et 39.48 (couche 1) ; d-prime intra 3.35 / 27.45
Ablation centree : refus 0.000 / conformite 1.000 (jailbreak) ; brute : refus 1.000 / conformite 0.000 (tout refuse) ; direction aleatoire : 1.000 / 1.000 (aucun effet)
Steering dose-reponse signee : -1.0σ -> refus 0.044, 0σ -> 1.000/1.000, +1.0σ -> conformite 0.811, +1.5σ -> 0.000
Finetuning shallow 10 exemples risque -> <comply> : refus 0.000 / conformite 1.000 ; controle 10 exemples benins : 1.000 / 1.000 ; cos(d_avant, d_apres) = 0.837
Unlearning tableau forget/retain a 5 lignes ; seules l'ablation centree et le finetuning passent les deux colonnes
Evaluation awareness simulation observe = (1-q) p_deploiement + q p_eval : a q=0.9, taux observe 0.020 pour une verite de deploiement 0.20

Le piege de methode est mesure et documente, pas raconte : l'ablation brute (sans centrage) ne retire pas le facteur discriminant mais la composante partagee le long de l'axe, et le modele se retrouve hors distribution (tout refuse). C'est la variante centree qui reproduit le resultat de la chaine R14.

Ce que ce notebook n'est pas (verdict ecrit dans le notebook, §12)

Reproduction des resultats publies sur un LLM reel : ni Qwen ni Llama ne sont charges. Les methodes sont celles des travaux cites, au code pres ; le terrain est un temoin synthetique, ce qui rend les effets falsifiables (controle a direction aleatoire, controle a dix exemples non contradictoires). Le passage a une famille open-weights est declare RECOVERABLE-MACHINE (stack GenAI / cache HuggingFace sur une lane dediee), pas contourne. Les ordres de grandeur et les nombres d'exemples necessaires ne se transposent pas ; la structure des effets, oui.

Exercices C.1 (trois, repartis)

  1. §6 — la direction comme classifieur sans entrainement (seuil et signe fixes sur calibration, evaluation sur split tenu a part ; controle a direction aleatoire).
  2. §8 — localisation de l'intervention : dose-reponse a la couche 0 contre couche 1 (hypothese a tester, pas resultat pre-ecrit).
  3. §10 — trajectoire de re-apprentissage apres le finetuning shallow (cout de restauration contre cout d'entrainement initial).

Stubs conformes : result = None # TODO etudiant, aucun raise NotImplementedError, aucun assert False, le notebook s'execute de bout en bout.

Validation

papermill Control-Refusal-Direction.ipynb --kernel python3   -> SUCCESS
13/13 cellules code executees, execution_count reels, 0 erreur, 0 chemin machine dans les sorties

Gates rejoues localement sur le diff (origin/main...HEAD) :

  • check_prose_quantitative_claims.py --diff origin/main...HEAD --strict : OK
  • check_markdown_claims_output.py : CLEAN (2 faux positifs de section §3.1-3.2 corriges en §3.1-§3.2 avant commit)
  • check_output_failure_text.py : 0 regressed ; check_cell_source_parses.py : 0 finding ; check_interp_positioning.py : 0 finding
  • check_exec_ratchet.py origin/main : ABSENT->CLEAN
  • check_output_collapse.py / check_source_collapse.py sur origin/main : 0 flagged
  • detect_md_content_loss.py : nouveau fichier, exempt
  • detect_markdown_rendering.py 0 violation ; audit_pip_install_cells.py / detect_solution_leaks.py : 0 ; check_notebook_navlinks.py : 0 lien casse
  • check_null_exec.py (H.3) : 1 notebook OK

Scope

2 fichiers : le notebook (nouveau) et le README.md de la section, qui gagne sa ligne, les sources R11/R14 et l'etat reel des livraisons Oversight (la section « A venir » listait comme a venir des notebooks deja livres — corrige sans toucher aux compteurs).

Test plan

  • Notebook execute end-to-end, outputs committes (C.2/H.3)
  • Guards notebook rejoues localement (liste ci-dessus)
  • Trois exercices C.1 verifies (stubs sans erreur volontaire)
  • Re-review coordinateur / merge

See #16758

…n, finetuning shallow

Notebook T17 de l'arc B (EPIC #16741) : la chaine R14 §3.1-§3.2 implementee sur
un temoin synthetique entraine from scratch (transformeur 2 blocs, tache de
conjonction verbe x objet, aucun LLM externe, aucun telechargement).

Mesures firsthand (un seul run, deterministe) : direction de refus extraite par
difference de moyennes et classee sans entrainement ; ablation centree qui
effondre le refus en preservant la conformite benigne, ablation brute qui
detruit tout (piege de methode documente), controle a direction aleatoire sans
effet ; dose-reponse de steering signee ; dix exemples contradictoires qui
retournent la politique quand dix exemples non contradictoires ne la touchent
pas, avec une direction qui survit au finetuning (cos eleve) ; tableau
forget/retain ; simulation du biais d'evaluation awareness.

Trois exercices C.1 repartis (classifieur sans entrainement, localisation de
l'intervention, trajectoire de re-apprentissage). Notebook execute end-to-end,
outputs committes (execution_count reels, 0 erreur, 0 chemin machine).

README de la section : ajout de la ligne du notebook, des sources R11/R14 et
des quatre notebooks Oversight deja livres (la section « A venir » listait des
livraisons faites).

See #16758

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

Copy link
Copy Markdown
Contributor

Golden-Set Execution (H.7 P3)

✅ 8/8 notebooks passed (certified reproducible)

Notebook Status Time
2.1-Workflow-ML.ipynb ✅ SUCCESS 3.7s
2.2-Descente-de-gradient.ipynb ✅ SUCCESS 3.7s
2.3-Regression-lineaire-logistique.ipynb ✅ SUCCESS 5.0s
2.4-Arbres-Forets-Ensembles.ipynb ✅ SUCCESS 4.5s
Search-01-StateSpace.ipynb ✅ SUCCESS 3.5s
SL-1-LogicalLearning.ipynb ✅ SUCCESS 2.6s
rl_4_multi_armed_bandits.ipynb ✅ SUCCESS 18.5s
GameTheory-04c-NashExistence-Python.ipynb ✅ SUCCESS 2.8s

Pinned lockfile: scripts/notebook_tools/golden_set.lock.txt (H.7 P3, axe A #4208)

@github-actions

Copy link
Copy Markdown
Contributor

Notebook PR Validation: PASS

  • Notebooks checked: 1
  • Code cells validated: 13
  • Result: All passed

Checks: H.1 (no errors), H.3 (execution_count), C.1 (no banned patterns)
Non-Python kernels (.NET/Lean): C.1 + errors only (execution_count advisory)
QuantConnect notebooks: C.1 + errors only (require QC Cloud for execution)

@github-actions

Copy link
Copy Markdown
Contributor

Notebook outputs-required (H.4 schema): PASS (every code cell carries an outputs: list)

@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

Copy link
Copy Markdown
Contributor

✅ No prose/output mismatch detected in the notebooks this PR changed.

Scope = notebooks CHANGED in this PR, not the whole corpus. Explicit claim-check relations resolve only against named CLAIM_METRICS from the local output window and are classified SUPPORTED, CONTRADICTED, or UNPROVEN.
The markdown-claims-output-report run artifact contains the structured JSON report. See python scripts/check_markdown_claims_output.py --help for re-running locally.
Detector rationale: c.290 / c.331 / PR #11435 numeric pathology, extended with low-noise relational evidence.

@github-actions

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-09-25) :

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

Path-collision (organ #13359/#13615)

Cette PR #17763 (feat(genai,#16758): controle par interp — direction du refus, ablation, finetuning shallow) 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 left a comment •

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

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

VERDICT: LGTM (contrainte token : COMMENT only)

[Hermes hermes-pr-review] — Notebook FULL READ au head e6b173e0bf (36 cellules, 13 code, toutes executees, 0 null exec, CI 83 success / 0 failure).

Gates #17040

  • 7 lectures, toutes immediatement APRES leur code cell (4/7/10/13/18/21/26/29/34 — trois exercices intercales en markdown entre deux lectures sans casser la regle) ;
  • 10 claims du body verifies verbatim dans les outputs : 70809 parametres, refus/conformite 1.000, |d|=15.18/39.48, d-prime 3.35/27.45, ablation centree 0.000/1.000, brute 1.000/0.000, aleatoire 1.000/1.000, steering -1.0σ→0.044, +1.0σ→0.811, finetuning cos=0.837 ;
  • 3 exercices avec stubs # TODO etudiant, pas de solution leak ;
  • prose dense mais justifiee (chaine de controle complete, pas du remplissage).

Substance verifiee

  • Corpus synthetique non degenere : conjonction verbe x objet (v0+o4→<comply>, v4+o2→<comply>) — pas de token marqueur unique, le temoin doit apprendre une fonction du contenu ;
  • Temoin entraine from scratch (70809 params, 2 blocs, perte 2.92→0.0002 en 600 pas), refus 1.000 / conformite 1.000 sur eval ;
  • Direction du refus : difference de moyennes sur calibration, couche 1 domine (d-prime 27.45) ;
  • Ablation centree = jailbreak (0.000 refus), brute = tout refuse (1.000 refus), aleatoire = aucun effet (1.000/1.000) — controle negatif present ;
  • Steering dose-reponse signee : -1.0σ→0.044, 0σ→1.000, +1.0σ→0.811, +1.5σ→0.000 — monotone, pas un plateau ;
  • Finetuning shallow : 10 exemples risque→comply suffisent a renverser le comportement (0.000 refus) sans toucher la direction (cos(d_avant,d_apres)=0.837) — le point "le refus est une surface, pas une direction" est mesure, pas affirme ;
  • Unlearning : tableau forget/retain a 5 lignes, seules ablation centree et finetuning passent les deux colonnes.

README (+21/-10) : corps substantiel pour Control-Refusal-Direction (resume complet, statut auto-contenu, declaration RECOVERABLE-MACHINE) — conforme README-TOTALS #17633.

Securite : 0 hit. CI : 83 success, 0 failure.

Bloquant : aucun. LGTM de substance.

Marker cycle: hermes-pr-review 25/09 09:05Z

[Hermes hermes-pr-review, cycle :08 25/09, host f6be46d1b7a3]

@jsboige

jsboige commented Sep 25, 2026 •

Copy link
Copy Markdown
Owner Author

[ADJOINT PREFLIGHT]
schema: 1
lane: myia-po-2026:CoursIA-3
pr: 17763
head: e6b173e
complete: true
body: read
comments-reviewed: 7
reviews-reviewed: 1
threads-reviewed: 0
threads-unresolved: 0
surfaces-sha256: a1b5ed48d128c21ecdb5805786ae7ac8647398869dcda6281925ae55737e402b
diff-files: 2
diff-additions: 1486
diff-deletions: 10
checks: latest-wins-green
b0: clear
scope: pass
domain: not-applicable
verdict: READY
[/ADJOINT PREFLIGHT]

Re-stamp secretaire c.140 -- tiers au titulaire (Tell c.111 strict). NO-DOSSIER -> READY. PR gate SUCCESS, B.0 rc=0 OK. Lane secretaire myia-po-2026:CoursIA-3.

@myia-ai-01
myia-ai-01 merged commit dfb4236 into main Sep 25, 2026
91 of 92 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.

2 participants