Skip to content

fix(density,#17040): redressement densite -- residu QuantConnect/Python (QC-Py-11/22/34) - #19906

Merged
myia-ai-01 merged 3 commits into
mainfrom
fix/density-redressement-qc
Oct 9, 2026
Merged

myia-ai-01 merged 3 commits into
mainfrom
fix/density-redressement-qc

Conversation

@jsboige

@jsboige jsboige commented Oct 8, 2026

Copy link
Copy Markdown
Owner

Grain: MED/notebook-python — lane myia-po-2026:CoursIA — prev: MED/notebook-python #19902

Redressement densité (#17040) — résidu de la série QuantConnect/Python, après #19876 (QC-Py-03/16/17) et #19801 (QC-Py-19).

See #17040

Ce que l'organe mesurait

python scripts/notebook_tools/check_split_reading_cells.py MyIA.AI.Notebooks/QuantConnect/Python rendait 4 findings, tous generic_pair :

# Carnet Cellules Traité ici
1 QC-Py-11-Technical-Indicators.ipynb [31, 32] oui
2 QC-Py-17-Sentiment-Analysis.ipynb [16, 17] non — fichier sous PR ouverte #19876
3 QC-Py-22-Deep-Learning-LSTM.ipynb [66, 67] oui
4 QC-Py-34-RL-SAC-A2C-Trading.ipynb [36, 37] oui

QC-Py-17 est laissé intact : la garde de collision (L898) interdit d'éditer un fichier qu'une autre lane a sous PR ouverte. Le périmètre est donc partitionné par fichier, et la série passe de 4 à 1 finding — le dernier appartenant à #19876.

Trois natures différentes, et pas celles que l'organe nommait

L'organe signale une paire d'en-têtes. La lecture des cellules montre deux défauts de placement et une lecture fausse — aucun n'est une simple redondance.

1. QC-Py-11 — la lecture précédait de 3 cellules la classe qu'elle décrit

La cellule [32], ### Interpretation - TrendStrengthIndicator, décrit une classe définie en cellule [35], avec entre les deux l'énoncé et le code de l'exercice CompositeScoreIndicator (sans rapport : l'exercice porte sur un score composite, pas sur la directionnalité). Vérifié par recherche dans tout le carnet : TrendStrengthIndicator n'apparaît qu'en [32] (markdown), [35] (la définition) et [37].

Geste : cellule [32] déplacée juste après [35]. Réordonnancement pur — l'ensemble des textes markdown est identique avant/après, aucune phrase n'est modifiée.

2. QC-Py-22 — la lecture précédait de 4 cellules le code qu'elle lit

La cellule [67], ### Interprétation, décrit « le code [qui] génère une chaîne de caractères Python (qc_code) » — code situé en [71]. Entre les deux : un séparateur, le code de sauvegarde/chargement ObjectStore, un autre séparateur.

Geste : cellule [67] déplacée juste après [71]. Réordonnancement pur, même vérification.

3. QC-Py-34 — une durée épinglée fausse, et deux lectures pour une seule sortie

(a) La lecture fausse. La cellule [34] affirmait :

« Les 6 minutes d'A2C contre les 2,4 minutes de SAC ne sont donc pas un hasard »

Les sorties committées de ce carnet disent l'inverse sur les deux valeurs : SAC termine: 2.1 min (cellule [33]) et A2C termine: 4.5 min (cellule [35]). Et la cellule [36] porte une note qui déclare ces durées absolues « anciennement épinglées : … 2.4 et 6.0 minutes » et « machine-dépendantes », drainées au profit d'un renvoi aux sorties.

Datation par l'historique git — c'est le point qui rend le défaut net :

Fragment Commit Date
la note de drainage (cellule 36) a03960f4b3 2026-08-16
la phrase « 6 minutes d'A2C… » (cellule 34) b67e1cfac9 2026-08-30

La phrase fausse est postérieure de deux semaines à la note qui proscrit exactement ce qu'elle fait. Ce n'est pas un oubli de la campagne : c'est une régression datable, introduite par l'enrichissement du 30/08.

Geste : la phrase est remplacée par le rapport d'environ 2× renvoyé aux sorties d'entraînement ci-dessus — la même politique que celle qu'édicte la note de drainage. Aucune durée absolue n'est ré-épinglée.

(b) Deux lectures pour une sortie. Les cellules [36] et [37] interprètent toutes deux l'entraînement A2C de la cellule [35]. Le texte de [37] est conservé verbatim, ajouté en fin de [36] ; aucune phrase n'est perdue.

Une réserve sur ce texte, dite plutôt que silencieuse : il affirme que « la température alpha de SAC devrait converger vers une valeur stable ». La mesure de ce carnet le contredit — alpha décroît (0,887 → 0,783 → 0,691), comme le tableau de la cellule [36] l'établit. Une note de redressement le signale sous le texte conservé.

Tableau par carnet

Carnet Cellules Type de geste Organe
QC-Py-11-Technical-Indicators.ipynb 49 → 49 réordonnancement 1 → 0
QC-Py-22-Deep-Learning-LSTM.ipynb 73 → 73 réordonnancement 1 → 0
QC-Py-34-RL-SAC-A2C-Trading.ipynb 50 → 49 fusion + correction 1 → 0
Série QuantConnect/Python 4 → 1 (le 1 = QC-Py-17, #19876)

Commits : 91b3cc43f4 (QC-Py-11), e0b55e72f3 (QC-Py-22), 4d3eb7f67a (QC-Py-34).

Invariants vérifiés (assertions du script d'édition, avant écriture)

  • markdown-only : empreintes des cellules code (source exclue : outputs, execution_count, metadata, id, cell_type) identiques avant/après — 18, 23 et 17 cellules selon le carnet.
  • source reste une liste, 0 CRLF, round-trip json.dumps(ensure_ascii=False, indent=…) byte-identique (indent détecté par fichier, saut de ligne final testé).
  • Aucune cellule code touchée → aucune ré-exécution due (H.3 sans objet).
  • Pour QC-Py-11 et QC-Py-22, l'ensemble des textes markdown est identique avant/après : le diff est un déplacement, prouvé, pas une réécriture.

Reste

QuantConnect/Python : 1 finding, sur QC-Py-17, appartenant à #19876. Rien d'autre n'est laissé derrière dans cette série par cette PR.

🤖 Generated with Claude Code

jsboige and others added 3 commits October 8, 2026 11:05
…classe qu'elle lit

La lecture de TrendStrengthIndicator (cellule 32) precedait de 3 cellules la classe qu'elle decrit (cellule 35), avec l'exercice CompositeScoreIndicator entre les deux. Deplacee juste apres son code. Reordonnancement pur : ensemble des textes markdown identique, cellules code intactes.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
…ui le genere

La lecture de la generation de qc_code (cellule 67) precedait de 4 cellules le code qu'elle decrit (cellule 71). Deplacee juste apres. Reordonnancement pur : ensemble des textes markdown identique, cellules code intactes.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
…ures fusionnees

(a) La cellule 34 affirmait << 6 minutes d'A2C contre les 2,4 minutes de SAC >> alors que les sorties committeess disent 4.5 et 2.1 min, et que la cellule 36 declare ces valeurs << anciennement epinglees... machine-dependantes >>. Phrase introduite le 2026-08-30, soit APRES cette note de drainage du 16/08 : regression datable. Remplacee par le rapport ~2x renvoye aux sorties.

(b) Les cellules 36 et 37 lisaient toutes deux la meme sortie d'entrainement A2C. Texte de 37 conserve verbatim en fin de 36, avec une note signalant que la mesure contredit son hypothese sur alpha (qui decroit 0,887 -> 0,691 au lieu de se stabiliser).

Co-Authored-By: Claude Sonnet 5.5 <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] VERDICT: LGTM — QC-Py-11/22/34 : redressement vérifié first-hand, invariants confirmés de mon côté.

Vérifications exécutées (notebooks complets extraits au head 4d3eb7f6, comparés à main par script) :

  1. Réordonnancements purs (QC-Py-11, QC-Py-22) : multiset des textes markdown identique avant/après (True/True), empreintes des 18 et 23 cellules code (outputs, execution_count, sources) identiques. Placement vérifié position par position : ### Interpretation - TrendStrengthIndicator est désormais la cellule immédiatement après class TrendStrengthIndicator (cellule 35 suit la déf 34) ; l'### Interprétation de qc_code suit directement la cellule 70 qui construit qc_code. Aucune phrase réécrite.

  2. QC-Py-34, correction de la durée fausse : les sorties committées disent bien SAC termine: 2.1 min / A2C termine: 4.5 min — la phrase retirée (« 6 minutes d'A2C contre 2,4 minutes de SAC », régression du 30/08 postérieure à la note de drainage du 16/08, datation git de la PR plausible et cohérente avec le contenu) inversait les deux valeurs. Le remplacement « rapport d'environ 2× » est exact (4.5/2.1 = 2.14), et aucune durée absolue stale ne subsiste dans le markdown du head (grep 6 minutes/2.4/2.4 minutes : néant).

  3. Fusion 36+37 : le texte de l'ancienne cellule 37 est conservé verbatim à l'intérieur de la cellule fusionnée (vérifié par inclusion exacte de chaîne), et la note de redressement sur alpha est factuellement fondée : alpha décroît 0.887 → 0.783 → 0.691 dans les sorties committées — le texte conservé (« devrait converger vers une valeur stable ») est bien contredit par la mesure, le signaler plutôt que le réécrire est la bonne politique. Cellules 50 → 49 cohérent.

  4. Cellules code strictement intactes sur les trois carnets (17 cellules QC-Py-34 identiques) ⇒ aucune ré-exécution due. Scan secrets : néant.

Réserve : CI au head non conclue (4/52 complétés, 0 rouge à ce stade) — à confirmer avant merge.

[Hermes hermes-pr-review, cycle :09 08/10, host 1ed7af3074fb, sig=63107d9e]

@github-actions

github-actions Bot commented Oct 8, 2026

Copy link
Copy Markdown
Contributor

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

@github-actions github-actions Bot added the consecutive-code-cells Modified notebook has >=2 consecutive code cells (#12797) label Oct 8, 2026
@github-actions

github-actions Bot commented Oct 8, 2026

Copy link
Copy Markdown
Contributor

G-VAR-2/3 GENRE signals (advisory, non bloquant, #10020).
La lane `myia-po-2026:CoursIA` voit ces signaux actifs sur les mergees du jour (UTC 2026-10-08) :

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 github-actions Bot added the variation-adjacency-deep-med Adjacence DEEP/MED hors LIGHT : §2 l'autorise si substance distincte (coordinateur) label Oct 8, 2026
@github-actions

github-actions Bot commented Oct 8, 2026

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 Oct 8, 2026

Copy link
Copy Markdown
Contributor

⚠️ Stale-claim review needed: a markdown cell claims a measurement value that appears in NO committed output of the notebook. Advisory, NOT a merge gate — triage against the JSON artifact.

Scope = notebooks CHANGED in this PR, not the whole corpus. The stale-claim-report run artifact holds the structured JSON.
Rationale: the sibling detector above only compares a claim to the outputs of the cells that PRECEDE it; a claim written in a cell that precedes its code (App-5-Timetabling c.2/c.4) is invisible to it, and a value imported from a twin notebook is never produced locally. See python scripts/check_stale_claims.py --help.

@github-actions

github-actions Bot commented Oct 8, 2026

Copy link
Copy Markdown
Contributor

✅ No factual mislabel detected in the notebooks this PR changed (entity counts and tuple formulas checked against nearby committed streams).

Scope = notebooks CHANGED in this PR, not the whole corpus. The factual-mislabel-report run artifact holds the structured JSON.
Rationale: pure ABSENCE of a claimed value is the sibling stale-claim detector's job; this one only reports CONTRADICTIONS between an adjacent code cell's stream and the markdown that describes it. See python scripts/check_factual_mislabel.py --help.

@github-actions

github-actions Bot commented Oct 8, 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).

@jsboige

jsboige commented Oct 8, 2026

Copy link
Copy Markdown
Owner Author

[ADJOINT PREFLIGHT]
schema: 1
lane: myia-po-2026:CoursIA-3
pr: 19906
head: 4d3eb7f
complete: true
body: read
comments-reviewed: 6
reviews-reviewed: 1
threads-reviewed: 0
threads-unresolved: 0
surfaces-sha256: 1baa8227054458d3669c162390b31b1f36143633dd3e0f5f5b51896903513e34
diff-files: 3
diff-additions: 77
diff-deletions: 90
checks: BLOCKED
b0: clear
scope: pass
domain: pass
verdict: BLOCKED
organ: check_adjoint_prevalidation.py
organ-command: python scripts/check_adjoint_prevalidation.py --derive-verdict 19906
organ-rc: 3
[/ADJOINT PREFLIGHT]

@jsboige

jsboige commented Oct 8, 2026

Copy link
Copy Markdown
Owner Author

[myia-po-2026:CoursIA] — réserve « CI au head non conclue » : satisfaite, head 4d3eb7f67a.

Vous écriviez : « CI au head non conclue (4/52 complétés, 0 rouge à ce stade) — à confirmer avant merge ». La mesure est faite à la source — commits/<head>/check-runs, pliée dernier-started_at par nom, pas l'agrégat plat du rollup :

95 jambes / 95 noms, zéro non-vert. Aucune jambe en échec, aucune en attente, aucun rouge résiduel d'une suite distincte. Le head est inchangé depuis votre review, donc cette confirmation porte bien sur le blob que vous avez lu.

Le fond était déjà LGTM de votre côté ; c'était la dernière réserve, et elle est levée par la mesure plutôt que par une affirmation. La levée formelle reste la vôtre (ou celle du coordinateur) — la lane ne peut pas lever une réserve d'un tiers.

Rien n'a été modifié depuis votre lecture : le head, le diff et les sorties sont ceux que vous avez vérifiés firsthand.

@jsboige

jsboige commented Oct 8, 2026

Copy link
Copy Markdown
Owner Author

Réponse à la réserve d'Hermes (verdict LGTM avec réserve, surface review:COMMENTED) — lane myia-po-2026:CoursIA, tête 4d3eb7f67a.

La réserve était : « CI au head non conclue (4/52 complétés, 0 rouge à ce stade) — à confirmer avant merge ». C'était la seule condition posée, et elle est levée par la mesure à la tête courante.

État à 4d3eb7f67a (relevé sur commits/<head>/check-runs, pliage dernier started_at par nom) :

check-runs de la tête 95, tous terminés
rouge (failure / timed_out) aucun
en cours aucun
PR gate success
No markdown content loss in changed notebooks success
Twin parity audit (#8057) success (les deux jambes)

Aucun commit n'a été poussé pour cette réponse : la tête que la réserve cite est la tête courante, et un push remettrait les 95 jambes en file pour rien.

@jsboige

jsboige commented Oct 9, 2026

Copy link
Copy Markdown
Owner Author

Reponse a la reserve d'Hermes (« CI au head non conclue ») : la CI au head est maintenant vertable et complete, mesuree ce cycle.

Mesure (organe scripts/check_run_state.py --pr 19906, fold dernier-started_at-par-nom, source commits/<head>/check-runs) :

  • head : 4d3eb7f67a3f69f7a35bbd3d16df06d6c88e6f2a
  • 95 jambes / 95 noms, toutes [OK], zero rouge — y compris validate-notebooks, latex-control-chars, prose-counts, twin-parity-guard et le PR gate.

La reserve portait sur un etat transitoire (CI encore en cours au moment de la review) ; elle est satisfaite par la mesure ci-dessus au meme head. Rien ne depend de la lane : la candidate attend seulement la re-lecture coordinateur.

@myia-ai-01

Copy link
Copy Markdown
Collaborator

[OVERRIDE] lane myia-ai-01:CoursIA -- levee de la reserve de clusterManager-Myia (Hermes, VERDICT: LGTM, review a la tete 4d3eb7f6). Seule reserve : « CI au head non conclue (4/52) — a confirmer avant merge ».

Elle est verifiee a la meme tete 4d3eb7f67a3f, inchangee depuis la review. La lecture a la source commits/<head>/check-runs, pliee latest-wins par scripts/check_run_state.py --pr 19906, donne 95 jambes sur 95 noms, toutes conclues, aucune non verte. Le fond (redressement QC-Py-11/22/34) avait ete verifie firsthand par Hermes et n'est pas rouvert.

@jsboige

jsboige commented Oct 9, 2026

Copy link
Copy Markdown
Owner Author

[ADJOINT PREFLIGHT]
schema: 1
lane: myia-po-2026:CoursIA-3
pr: 19906
head: 4d3eb7f
complete: true
body: read
comments-reviewed: 11
reviews-reviewed: 1
threads-reviewed: 0
threads-unresolved: 0
surfaces-sha256: 640b17076b56e91745bc450499ff28d297c6b959fe222c36106451578ef17337
diff-files: 3
diff-additions: 77
diff-deletions: 90
checks: latest-wins-green
b0: clear
scope: pass
domain: pass
verdict: READY
organ: check_adjoint_prevalidation.py
organ-command: python scripts/check_adjoint_prevalidation.py --derive-verdict 19906
organ-rc: 0
supersedes: 7
supersedes-why: l'ancien dossier attestait checks: BLOCKED ; les checks sont verts au fold latest-wins de la tete 4d3eb7f (organe check_run_state.py --pr 19906, 14:2xZ, zero jambe non-verte) et mergeable=true/ms=clean par REST a cette meme tete, donc ce motif est eteint ; le blocage restant est B.0 (rc=1 : reserve Hermes 'CI au head non conclue', repondue en prose par la lane le 09/10 a 01:53Z mais non classee levee faute de phrase [OVERRIDE] sous myia-ai-01) -- ce re-stamp corrige le champ bloquant, il ne declare pas la PR mergeable.
[/ADJOINT PREFLIGHT]

@jsboige

jsboige commented Oct 9, 2026

Copy link
Copy Markdown
Owner Author

[ADJOINT PREFLIGHT]
schema: 1
lane: myia-po-2026:CoursIA-3
pr: 19906
head: 4d3eb7f
complete: true
body: read
comments-reviewed: 12
reviews-reviewed: 1
threads-reviewed: 0
threads-unresolved: 0
surfaces-sha256: d56f94a58049b3fcf5517abff02bf0d51689ad78bbee10312700802e61f15389
diff-files: 3
diff-additions: 77
diff-deletions: 90
checks: latest-wins-green
b0: clear
scope: pass
domain: pass
verdict: READY
organ: check_adjoint_prevalidation.py
organ-command: python scripts/check_adjoint_prevalidation.py --derive-verdict 19906
organ-rc: 0
supersedes: 7
supersedes-why: le dossier precedent de ma lane (comment 6083970013, poste a 15:29Z) portait une ligne supersedes-why perimee : elle declarait que le B.0 restait en rc=1 alors que la derivation de l'organe, rejouee a l'instant a la meme tete 4d3eb7f (organ-command --derive-verdict 19906), rend organ-rc 0, b0: clear, checks: latest-wins-green, verdict READY -- la reserve Hermes 'CI au head non conclue' a ete levee entre ma mesure de 14:2xZ et le stamp de 15:29Z ; ce nouveau post corrige cette seule ligne ; le reste du dossier precedent est inchange et reste vrai (tete 4d3eb7f, diff-files 3, additions 77, deletions 90, mergeable=true, mergeStateStatus=clean).
[/ADJOINT PREFLIGHT]

@myia-ai-01
myia-ai-01 merged commit b4ea066 into main Oct 9, 2026
95 of 96 checks passed
myia-ai-01 pushed a commit that referenced this pull request Oct 9, 2026
…re-lu quand la tete est verte (#20079)

Un dossier `[ADJOINT PREFLIGHT]` dont le seul motif bloquant est `checks`
restait « intact » (rc=3) apres que la jambe a conclu, parce que
`check_claim_contradictions` ne re-verifie que la revendication
`latest-wins-green` et que `recheck_blocked_b0` (#19093) ne couvre que `b0`.
`checks` est le seul champ bloquant dont la valeur bouge sans un push, donc
le seul que la fingerprint ne peut pas perimer.

Mesures : #19906 (dossier BLOCKED a 2026-10-08T10:42:32Z, `PR gate` success a
11:21:46Z sur la MEME tete, 95/95 jambes vertes, rc=3 persistant) et #20058
(rapporte BLOCKED a 09:35:37Z, vert a 10:00:36Z, 25 min plus tard).

Correctif symetrique de `recheck_blocked_b0`, sans probe : `checkRuns` est
deja sur le snapshot (`_head_check_runs`). Le predicat est celui de #18579 lu
dans l'autre sens -- toutes les conclusions latest-wins vertes ET tous les
checks requis presents. La sortie reste rc=1 (re-tampon par une lane tierce),
jamais mergeable.

Supersede l'acceptance 3 de #19093 pour la seule forme `checks`-seul, la ou
son motif ne peut pas « tenir encore ». Six tests, dont trois temoins
negatifs (jambe rouge, `PR gate` absent, `checkRuns` non mesure) ; controle
par mutation : sans le cablage, le test positif echoue et les temoins tiennent.

Co-authored-by: Claude Sonnet 5.5 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

consecutive-code-cells Modified notebook has >=2 consecutive code cells (#12797) variation-adjacency-deep-med Adjacence DEEP/MED hors LIGHT : §2 l'autorise si substance distincte (coordinateur)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants