Skip to content

fix(qc,#17066): redressement QC-Py-15 — 8 lectures titrées, 7 fusions de doubles lectures, énoncé Exercice 3 restauré - #17081

Merged
myia-ai-01 merged 2 commits into
mainfrom
fix/17066-qcpy15-duplicates
Sep 23, 2026
Merged

myia-ai-01 merged 2 commits into
mainfrom
fix/17066-qcpy15-duplicates

Conversation

@jsboige

@jsboige jsboige commented Sep 20, 2026

Copy link
Copy Markdown
Owner

Grain: DEEP/notebook-python -- lane myia-po-2025:CoursIA -- prev: DEEP/notebook-python #17080

Redressement critique #17066 — QC-Py-15-Parameter-Optimization : consolidation des sections dupliquées (15 titres « Interprétation » identiques → 8 titres uniques, 0 finding), 7 fusions de doubles lectures, énoncé d'exercice corrompu restauré, 2 repositionnements. See #17066 (tranche 5 de la famille QuantConnect/Python, 1 notebook par PR, référence #17069).

Mesure organ (avant → après)

check_duplicate_sections.py : 1 finding dup_reading « interpretation » ×15 = 14 sections en excès → 0 finding (carriers: 0). Reste 1 advisory multi_closing (préexistant sur main, hiérarchie légitime de conclusion).

L'organe à zéro est nécessaire, jamais suffisant : la lecture critique de bout en bout (92 cellules) a de plus attrapé une corruption que l'organ ne voit pas (énoncé Exercice 3, §C).

Diagnostic de la dégénérescence

Motif distinct des tranches 1-4 : les campagnes de densité ont déjà doté ce notebook de lectures mesurées à titres uniques (« ### Le classement du top 10 se lit dans ses répétitions… », « ### Le résultat central du notebook : 16 folds, 16 fois zéro »…) — mais les anciennes cellules génériques « ### Interprétation » sont restées en place, produisant sept paires de doubles lectures où une cellule mesurée et une cellule générique lisent LA MÊME sortie :

Sortie lue deux fois Cellule mesurée (gardée) Cellule générique (fusionnée)
Analyse résultats grid (30) 31 « Le classement du top 10… » 32
Heatmap Sharpe (33) 34 « Ce que la grille ne peut pas voir… » 35
Tableau walk-forward (49) 50 « Le résultat central… » 51
Viz walk-forward (52) 53 « Pourquoi la corrélation vaut nan… » 54
Sensibilité ±15 % (64) 65 « Plateau ou pic… » 66
Fitness Calmar (72) 73 « Le classement Calmar est vide… » 74
Pipeline complet (84) 85 « La contradiction des deux verdicts… » 86

Deuxième défaut : un énoncé d'exercice corrompu (cellule 67) — les sauts de ligne ont été perdus (« ---### Exercice 3 : Penalisation de la complexiteLa validation croisee brute…Règles :- Utilisez… »), rendant l'énoncé d'Exercice 3 illisible au rendu. Troisième défaut : deux lectures coupées de leur code (lecture des helpers après le préambule « contrat » ; lecture du QCAlgorithm final séparée de son code par les deux blocs QC Cloud).

PLAN du notebook après réparation

Séquence canonique : code → sa lecture (mesurée, titre unique) collée ; jamais deux cellules lisant la même sortie. Bloc final : code QCAlgorithm (87) → sa lecture (90) → bloc résultats QC Cloud (89) → lecture croisée des deux blocs (88). 92 → 85 cellules (7 fusions).

DÉTAIL de chaque consolidation

A. Retitrage des 8 lectures sans concurrente (aucune suppression). « ### Interprétation : les helpers partagés du dossier shared/ », « … le grid search exhaustif — 672 combinaisons, filtre fast < slow », « … les fitness functions QuantConnect — Sharpe, Sortino, Calmar, CAR, MaxDD », « … la distribution des Sharpe et le nuage Sharpe/drawdown », « … la boucle walk-forward — optimiser IS, tester OOS, avancer », « … les données simulées pour 16 folds glissants », « … les distributions Monte Carlo — percentiles 5/95 comme bornes », « … le QCAlgorithm final — paramètres optimisés et fallback GetParameter ». Pattern #17069 : token « Interprétation » préservé (plan-loss exit 0, 15/15 SUBSTANCE_FOUND).

B. Les 7 fusions — contenu unique préservé, mot pour mot, dans la cellule mesurée. (1) 32 → 31 : glossaire des colonnes du classement (sharpe/total_return/max_drawdown/n_trades/win_rate) + rappel OOS. (2) 35 → 34 : légende de la heatmap (lignes slow, colonnes fast, patterns attendus) + « zones de robustesse », relié au vocabulaire plateau/pic de la lecture 65. (3) 51 → 50 : tranches de lecture du WFER (≈100 % / <50 % / >100 %) et légende de la corrélation IS-OOS — cette légende est celle que la lecture 53 cite explicitement, sa survie dans 50 maintient la continuité. (4) 54 → 53 : légende des quatre panneaux de la figure. (5) 66 → 65 : tranches du coefficient de variation (<20 % / 20-50 % / >50 %). (6) 74 → 73 : contraste conceptuel Sharpe/Calmar par aversion au risque — recalé car l'« observation typique » de 74 (les top paramètres diffèrent) est contredite par la sortie mesurée que documente 73 (classement Calmar dégénéré en constante -inf) ; la guidance est préservée comme conditionnelle (« quand les deux fitness passent leurs filtres »). (7) 86 → 85 : les étapes du pipeline (grid 70 %, OOS 30 %, WF, Monte Carlo 50 sims) et les trois ingrédients du score composite — 85 en cite le verdict mais n'énumérait ni les étapes ni la composition. Dédoublonné dans chaque cas : la re-description générique de la sortie que la cellule mesurée lit déjà avec ses valeurs (0.8741/2.78/-inf/66.62 % etc. ne sont jamais re-listés).

C. Restauration de l'énoncé Exercice 3 (cellule 67). Les sauts de ligne avaient été perdus (« ---### Exercice 3 : Penalisation de la complexiteLa validation croisee brute… », « …terme de complexite.Règles :- Utilisez… »). Restauration : structure d'énoncé standard (titre, contexte, ancre savante Akaike, Objectif/Règles/Indices en listes). Preuve de fidélité : égalité whitespace-insensitive entre ancien et nouveau source — zéro caractère ajouté ou supprimé, seuls les retours à la ligne sont restaurés. Défaut invisible à l'organ, attrapé à la lecture critique.

D. Repositionnements (2). Lecture des helpers (8) → immédiatement après l'import des helpers (6), avant le préambule « contrat » ; lecture du QCAlgorithm final (90) → immédiatement après son code (87), le bloc final devenant : code → sa lecture → bloc résultats QC Cloud (89) → lecture croisée des deux blocs QC Cloud (88, qui cite les deux et se place donc après le second).

VERDICT DE SÉQUENCE (honnête)

Chaque sortie est lue une fois, par une cellule titrée qui la suit immédiatement ; les blocs Exercice restent adjacents et intacts. Résiduel assumé : (1) les Exercices 1 et 2 n'ont pas d'énoncé markdown — leurs consignes vivent dans les commentaires des cellules code (39, 56) ; les écrire serait de la re-densification, interdite dans cette campagne, consigné ici pour une éventuelle tranche séparée ; (2) le premier bloc « Résultats Backtest QC Cloud » (19, OptimizableStrategy) n'a pas de lecture dédiée — lisible via la lecture croisée 88 qui couvre les deux blocs ; (3) l'advisory multi_closing de la conclusion est laissé (préexistant) ; (4) la fusion (6) conserve la guidance Sharpe/Calmar sous forme conditionnelle — c'est un recalage documenté, pas une suppression.

Preuves

🤖 Generated with Claude Code

… generique->mesuree, enonce Exercice 3 restaure

- 8 retitrages '### Interpretation : <sujet>' (pattern #17069) dont le QCAlgorithm
  final repositionne contre son code (87 -> 90 avant les blocs QC Cloud)
- 7 doubles lectures fusionnees : la cellule generique '### Interpretation' est
  absorbee par la lecture mesuree qui lit la meme sortie (31, 34, 50, 53, 65, 73,
  85) avec preservation documentee de leur contenu unique (glossaires, legendes,
  tranches WFER/CV, etapes du pipeline, contraste Sharpe/Calmar recale)
- cellule 67 : sauts de ligne perdus de l'enonce Exercice 3 restaures (preuve :
  egalite whitespace-insensitive, zero caractere modifie)
- lecture des helpers repositionnee contre son import (8 apres 6)
- organ check_duplicate_sections : 15 titres -> 0 finding ; markdown-only :
  32 cellules code byte-identiques, outputs/exec_count inchanges, 92 -> 85 cellules

See #17066

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

Copy link
Copy Markdown
Contributor

MD hierarchy drift -- 7e6a568

Cette PR augmente le compte de defauts de rendu markdown
par rapport a la base de fusion d412b5a re-scannee.
Nouveaux defauts imputables au diff :

reference: merge base d412b5a13c794eacc504654fad17741464913996 re-scanned (1 of 1 changed notebook(s) existed at base; others are additions; 0 had findings at base)
  +2  MyIA.AI.Notebooks/QuantConnect/Python/QC-Py-15-Parameter-Optimization.ipynb
        +2 HEADING-IN-LIST

=== drift: +2 across 1 notebook(s), 0 burned down ===

Corriger (ex. - # Indice : ... -> - **Indice :** ...). See #11831.

@github-actions

Copy link
Copy Markdown
Contributor

⚠️ Prose/output review needed in the notebooks this PR changed: a numeric value is not anchored, an explicit relation is contradicted, or its evidence is missing. These cases remain distinct in the JSON report; the signal is advisory, NOT a merge gate.

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

github-actions Bot commented Sep 20, 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 5.6s
2.2-Descente-de-gradient.ipynb ✅ SUCCESS 7.3s
2.3-Regression-lineaire-logistique.ipynb ✅ SUCCESS 6.8s
2.4-Arbres-Forets-Ensembles.ipynb ✅ SUCCESS 4.5s
Search-01-StateSpace.ipynb ✅ SUCCESS 3.7s
SL-1-LogicalLearning.ipynb ✅ SUCCESS 2.8s
rl_4_multi_armed_bandits.ipynb ✅ SUCCESS 21.3s
GameTheory-04c-NashExistence-Python.ipynb ✅ SUCCESS 2.7s

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: 32
  • 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)

@jsboige

jsboige commented Sep 21, 2026

Copy link
Copy Markdown
Owner Author

[ADJOINT PREFLIGHT]
schema: 1
lane: myia-po-2025:CoursIA-2
pr: 17081
head: 7e6a568
complete: true
body: read
comments-reviewed: 5
reviews-reviewed: 0
threads-reviewed: 0
threads-unresolved: 0
surfaces-sha256: cec9638e3ce4a06553cf956ba2c5f83d24b0055e1d691715cb1399c416e07efe
diff-files: 1
diff-additions: 100
diff-deletions: 294
checks: BLOCKED
b0: clear
scope: pass
domain: pass
verdict: BLOCKED
[/ADJOINT PREFLIGHT]

… cellule 62

Reproduit localement au head 7e6a568 : detect_markdown_rendering --check
rc=1, 2 violations ERROR nouvelles dans la cellule de l'enonce Exercice 3
restaure : [yaml_block_open_no_close] (le separateur initial "---" ouvre un
frontmatter jamais ferme, rendu en bloc setext geant) et [heading_in_list]
x2 ("- # Indice :" en ATX heading dans un item de liste). Reparation par
les fixers outilles prescrits par l organe (fix_hr_separator + fix_hint_headings,
notebook entier) : "---" -> "***", "# Indice" passe en code-span. Prose et
enonce integralement preserves, markdown-only, aucune re-execution. Gate
rc=1 -> rc=0.

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

jsboige commented Sep 21, 2026

Copy link
Copy Markdown
Owner Author

[REPAIR][lane myia-po-2025:CoursIA] Gate markdown-rendering guard (main-repo notebooks) — 2 violations corrigées, head 8b1b25c20a.

Rouge reproduit localement au head précédent (7e6a568e4c) avant tout geste : detect_markdown_rendering.py --check --baseline → rc=1, 2 violations ERROR nouvelles, toutes deux dans la cellule 62 — l'énoncé Exercice 3 restauré par cette PR :

Violation Cause Fix outillé
[yaml_block_open_no_close] le séparateur initial --- ouvre un frontmatter jamais fermé → markdown-it rend la cellule entière en bloc setext géant fix_hr_separator.py --apply : --- → ***
[heading_in_list] ×2 - # Indice : … — un # ATX dans un item de liste rend en titre surdimensionné fix_hint_headings.py --apply : # Indice passé en code-span

Réparateurs = ceux que l'organe prescrit lui-même, appliqués au notebook entier (le gating par baseline fait resurgir toute cellule en violation dont le hash a changé). Diff total : 3 lignes dans 1 cellule markdown (+3/−3) — énoncé, ancre savante, règles et indices inchangés au mot près ; aucune cellule code touchée, aucune ré-exécution (markdown-only).

Vérification : gate rc=1 → rc=0 (OK: no new ERROR-level markdown-rendering violations). Le push re-arme DWELL (auto-levant au balayage suivant).

@jsboige

jsboige commented Sep 22, 2026

Copy link
Copy Markdown
Owner Author

[ADJOINT PREFLIGHT]
schema: 1
lane: myia-po-2025:CoursIA-2
pr: 17081
head: 8b1b25c
complete: true
body: read
comments-reviewed: 7
reviews-reviewed: 0
threads-reviewed: 0
threads-unresolved: 0
surfaces-sha256: a2409ac7d7ea7bf0367c5bbdaf4fc1e01acc2becda133336644fce381a3d36c6
diff-files: 1
diff-additions: 99
diff-deletions: 293
checks: latest-wins-green
b0: clear
scope: pass
domain: pass
verdict: READY
[/ADJOINT PREFLIGHT]

@myia-ai-01
myia-ai-01 merged commit 82e10b6 into main Sep 23, 2026
82 of 86 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