Skip to content

fix(qc,#9768): figer la fenetre du dernier D2 — research_robustness CSharp-BTC-EMA-Cross - #17220

Merged
myia-ai-01 merged 1 commit into
mainfrom
fix/9768-d2-ema-cross
Sep 22, 2026
Merged

myia-ai-01 merged 1 commit into
mainfrom
fix/9768-d2-ema-cross

Conversation

@jsboige

@jsboige jsboige commented Sep 21, 2026 •

Copy link
Copy Markdown
Owner

Grain: MED/qc -- lane myia-po-2027:CoursIA -- prev: DEEP/notebook-python #17196

Ce que fait cette PR

Fige la fenetre du dernier vrai D2 du corpus (research_robustness.ipynb, CSharp-BTC-EMA-Cross), tranche Phase 3 de l'EPIC #9768 — et le notebook est re-execute avec ses outputs reels.

Mesure fraiche qui fonde le grain

scan_d2_window_openness.py sur origin/main (corpus 1465 fichiers) rend 2 D2+ (0.1 %) — la « liste des 16 » du commentaire du 2026-09-02 n'a jamais ete publiee et est de toute facon perimee. Des 2 residuels, un est le FP deja documente (research_classification.ipynb, tableau SHA du 02/09) ; l'autre est le fichier traite ici. Bloc d'etat mesure poste sur l'EPIC (c.5760860898), claim c.5760863986.

Diagnostic derive

  • (a) env/kernel : les outputs committes provenaient d'une execution QC Cloud d'origine (projet 21193838) dont la fenetre datetime.now() s'allongeait a chaque passage.
  • Cause de la divergence future : fenetre ouverte par construction (forme N + forme S dans les recommandations JSON).
  • Verdict : CAUSE_FIXED — bornes figees dans les deux canaux (QuantBook ET fallback yfinance).

Le fix (3 edits source, rien d'autre)

  1. qb.History(..., datetime.now(), ...) -> datetime(2025, 12, 31) (canal primaire)
  2. ticker.history(end=datetime.now().strftime(...)) -> end="2025-12-31" (fallback)
  3. analysis_date figee + recommandation SetEndDate(2025, 12, 31) ajoutee au JSON exporte (le notebook recommandait un SetStartDate(2019,1,1) sans date de fin — la recommandation elle-meme perpetuait la fenetre ouverte)

La graine etait deja posee (np.random.seed(42), generateur synthetique de secours) — verifie, inchange.

Execution reelle (C.2)

Papermill kernel python3 (venv projet), 12/12 cellules, 0 erreur, 6/6 cellules code avec execution_count + outputs :

  • Sortie cell 1 : Period: 2019-01-01 -> 2025-12-30 (derniere barre reelle), 2556 bars BTCUSD Daily
  • Resultats : Sharpe 1.137 periode complete, regimes (bull 2.02), grid search 5 jeux, walk-forward 36 periodes, JSON final avec analysis_date: "2026-09-21" fige
  • Reproductibilite : re-executions consecutives bit-identiques sur les metriques (deterministe, graine + fenetre figees)

Canal d'execution documente : le projet QC Cloud 21193838 porte par le markdown n'existe plus (POST /api/v2/backtests/list {projectId: 21193838} -> The requested project does not exist, verifie 2026-09-21T13:10Z). Le notebook embarque un fallback local yfinance concu dans sa cellule 1 (try QuantBook / except yfinance) : l'execution locale emprunte ce canal avec donnees BTC reelles. Regle F appliquee : quantconnect-stubs installe dans le venv pour rendre AlgorithmImports importable (sans lui l'import hors-try tuait l'execution avant le fallback).

Verifications post-fix

  • scan_d2_window_openness.py sur la branche : D2+ 0/1, CONFORME 1/1 (sur main : 2/1465 -> residu = FP documente seul)
  • Grep C.1 : aucun raise NotImplementedError / assert False / 1/0
  • Diff source : exactement les 3 edits listes (verifie cellule par cellule contre HEAD)
  • Residuel constate, hors scope : la cellule markdown 10 « Resultats et Findings » reste un gabarit [A determiner] — elle n'a jamais ete remplie depuis l'origine, l'enrichir est un grain separe.

See #9768

🤖 Generated with Claude Code

…2019 -> 2025-12-31) + SetEndDate recommande

- qb.History et fallback yfinance: datetime.now() -> bornes figees 2019-01-01/2025-12-31
- analysis_date figee (2026-09-21), recommandation SetEndDate(2025,12,31) ajoutee au JSON exporte
- re-execution reelle via le fallback yfinance du notebook (projet QC 21193838 disparu, preuve API): 2556 bars BTC reelles, Sharpe 1.137, 0 erreur, 6/6 cellules
- scan_d2_window_openness: D2+ 2/1465 -> residu FP documente uniquement (research_classification, FP deja connu du tableau SHA du 02/09)

See #9768

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

Copy link
Copy Markdown
Contributor

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

@github-actions

github-actions Bot commented Sep 21, 2026 •

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.4s
2.2-Descente-de-gradient.ipynb ✅ SUCCESS 3.6s
2.3-Regression-lineaire-logistique.ipynb ✅ SUCCESS 4.1s
2.4-Arbres-Forets-Ensembles.ipynb ✅ SUCCESS 3.7s
Search-01-StateSpace.ipynb ✅ SUCCESS 2.6s
SL-1-LogicalLearning.ipynb ✅ SUCCESS 2.0s
rl_4_multi_armed_bandits.ipynb ✅ SUCCESS 16.2s
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: 6
  • 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

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

@jsboige

jsboige commented Sep 21, 2026

Copy link
Copy Markdown
Owner Author

Le rouge Kernel drift guard du rerun 16:00Z etait un drift de patch Python : language_info.version 3.13.7 -> 3.13.15 (re-execution locale sur le 3.13.15 du venv, base executee en 3.13.7 — les deux 3.13, aucune cellule en signature_drift_cells, 0 erreur d'execution). La cause tenait au format de mon en-tete : ## Diagnostic derive (C.4) ne matche pas la regex du garde (^##\s*Diagnostic\s*d[ée]rive\s*$, fin de ligne stricte) — le suffixe parenthese empechait l'exemption C.4 prevue pour ce cas. Body amende : la ligne est desormais ## Diagnostic derive seule (contenu inchange), jambe relancee. Remarque annexe pour un grain guard futur : la forme canonique avec suffixe (C.4) citee dans les examples devrait aussi matcher.

@github-actions

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

@jsboige

jsboige commented Sep 21, 2026

Copy link
Copy Markdown
Owner Author

[ADJOINT PREFLIGHT]
schema: 1
lane: myia-po-2025:CoursIA-2
pr: 17220
head: c9ee3cf
complete: true
body: read
comments-reviewed: 6
reviews-reviewed: 0
threads-reviewed: 0
threads-unresolved: 0
surfaces-sha256: f28fb85af559d62b65b3089f8ffbc67264a0c923217d3f996c997f38339b0d5f
diff-files: 1
diff-additions: 128
diff-deletions: 136
checks: latest-wins-green
b0: clear
scope: pass
domain: pass
verdict: READY
[/ADJOINT PREFLIGHT]

Au head c9ee3cf : 81 check-runs dedupliques latest-wins, 0 pending, 0 non-verts. b0 rc=0 mesure ce cycle. Porteur myia-po-2027:CoursIA (fenetre du dernier D2 figee, research_robustness CSharp-BTC-EMA-Cross), distinct de la lane emettrice.

@myia-ai-01
myia-ai-01 merged commit fa0d1e4 into main Sep 22, 2026
111 of 118 checks passed
myia-ai-01 pushed a commit that referenced this pull request Sep 22, 2026
…ite + mode 2-couches + analyse multi-echelle (#17305)

* feat(iit,#8236): pilote inoculation -- clamp-scale alpha + mode 2-couches clamp/read

Extension du pipeline GPU d'extraction SAE pour le jalon 3 de l'Epic
#8236 (experience pilote multi-echelle, Livrable 2) :

- --clamp-scale alpha borne [0,1] : h' = h - alpha*delta, retro-compatible
  alpha=1 (annulation exacte Gate 24 historique), suffixe de nommage _s{alpha}
  uniquement si alpha != 1 (trace_filename, param clamp_scale)
- mode inoculation 2-couches (--clamp-frac / --read-frac, defaut lecture =
  resid final) : ClampHook a la couche d'inoculation, CaptureHook a la couche
  de lecture, double SAE (couche du hook != couche d'encodage), garde
  read > clamp -- la bifurcation vit dans la propagation aval, pas dans la
  perturbation injectee
- sanity greedy deplacee AVANT le retrait des hooks : sous inoculation elle
  documente la degradation de la generation
- 9 tests du contrat (tests/test_inoculation_pilot.py) : neutralite alpha=0
  (retour de la sortie elle-meme), annulation exacte alpha=1, linearite en
  alpha (clamp 0.5 = moyenne exacte), tuple preserve, W_dec exige, suffixes

Smoke GPU valide sur les deux modes (2B, RTX 4060) ; cross_scale : 35 passed
+ 1 base-inherited (ModuleNotFoundError import package, reproduit sur arbre
stashe).

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

* feat(iit,#8236): ICT-42 pilote inoculation — notebook execute + 12 traces + README

Grain: DEEP/notebook-python -- lane myia-po-2027:CoursIA -- prev: MED/qc #17220

- ICT-42-InoculationBifurcation-Pilot.ipynb : analyse GPU-free executee
  (11 cellules code, 0 erreur, execution_count non nuls) — dissociation
  de forme : 1.7B saturant (facteur rupture 2.77 < 4, pente max au
  premier cran) vs 2B bascule tardive (8.11 > 4, alpha* = 0.625),
  Spearman prompts cross-echelle negatif (-0.25 a -0.66)
- traces/ : 12 traces neuves (2 echelles x [ref lecture sans hook +
  5 intensites]) + 2 figures (ordre-parametre, cross-echelle)
- README : entrees ICT-42 + ICT-35b/35c (2 non-listes corriges,
  reconciliation 78 notebooks tous documentes)

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

* feat(iit,#8236): ICT-42 controle permute du panel -- phase 6, leve la limite 2 du pilote

--random-panel SEED dans extract_sae_traces.py : remplace le panel
differentiel par un tirage seede de meme taille hors panel (une
permutation de la liste serait un no-op : la somme acts @ W_dec est
invariante a l'ordre). Meta tracee (random_panel,
random_panel_excluded), traces distinguees par prefixe inocrp_.

Sweep 4 runs (2 echelles x alpha in {0.25, 1}) : la bascule
super-lineaire du 2B DISPARAIT sous panel aleatoire (m(1)/m(0.25) =
1.18 vs 8.11), reponse 4x a 28x plus faible, pipeline prouve sensible
(m > 0 partout). Confondant mesure plutot que masque : le tirage est
80x (2B) a 770x (1.7B) moins actif a la couche d'inoculation (audit
d'activite sur les references mi-reseau). Controle apparie en norme =
prolongement nomme.

Notebook : section Controle permute + limite 2 reecrite (LIVRE, forme
panel aleatoire), re-execution complete (12 cellules code, 0 erreur).
Tests : +3 (reproductibilite seed, exclusion + taille, panel saturant
refuse) -- 12/12 verts.

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

* feat(iit,#8236): ICT-42 controle apparie en norme -- phase 6b, leve le confondant d'activite

- --matched-panel SEED + --activity-from NPZ + --matched-band FACTOR dans
  extract_sae_traces.py : tirage seede restreint a la bande d'activite du
  panel differentiel ; gardes croisees (couche ref == couche inoculation,
  d_sae identique, exclusivite avec --random-panel)
- ref_activity() : meme statistique que la derivation du panel (moyenne
  code_python / prose_fr, |act| accumulee par token)
- 4 tests nouveaux (bande+exclusion, seed reproductible, pool insuffisant
  refuse, agregation ref sur trace synthetique) -- 16/16 verts
- Sweep GPU 4/4 RC=0 (2 echelles x alpha {0.25, 1}), traces inocmp_*
- Resultat 2B : la reponse REVIENT sous appariement (m(1)=0.1235, 5.6x le
  tirage uniforme) mais la super-linearite est divisee par 2.4 (8.11 ->
  3.38) et la selectivite par jeu disparait (x3.2-3.9 homogene vs prose_fr
  x11.1 sous panel) : la norme porte l'amplitude, le contenu du panel porte
  la discrimination -- revision assumee de la lecture phase 6
- Bande x8 motivee par la mesure : le panel occupe les rangs 1-19 (2B) de
  la distribution d'activite, une bande x2 n'y laisse que 1-4 candidats
- Notebook re-execute complet (13 cellules code, 0 erreur, 0 exec null) :
  section 6b + interpretation reelle + Retenir/Limites resynchronisees ;
  README etendu

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

* fix(ict,#8236): importorskip torch dans _load_script_module

Le job CI 'ICT tests/ (58)' n'installe pas torch (seulement ict +
pyphi/numpy/scipy/matplotlib) : les 7 tests chargeant
extract_sae_traces.py par chemin echouaient avec ModuleNotFoundError
depuis la phase 6, masque par les morts runner successives.

Convention de la serie (test_causal_hooks.py:52) : importorskip DANS la
fonction de chargement, pas en tete de module -- les tests
trace_filename (sans torch) restent executes en CI. Verifie : 16/16
localement, les 7 concernes passeront en skip en CI sans torch.

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

---------

Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>
myia-ai-01 pushed a commit that referenced this pull request Sep 23, 2026
…ion header (#17257)

The body exemption regex anchored 'd[ée]rive' at end-of-line, so the
suffixed form '## Diagnostic derive (C.4)' -- the canonical C.4 header
with its rule qualifier -- silently failed to exempt a documented drift.
Widened to accept one optional parenthetical qualifier; 3 tests added
(suffixed accented/unaccented exempt, trailing garbage still rejected).
Cas vecu: PR #17220, patch drift 3.13.7 -> 3.13.15 documented under a
suffixed C.4 header, guard red despite the section being present.

Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>
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