Skip to content

Add: M5 HMM cluster revalidation 7 actifs apparies par origine (port #18190, Epic #1454) - #19091

Merged
myia-ai-01 merged 4 commits into
mainfrom
feature/m5-hmm-cluster-reval
Oct 4, 2026
Merged

myia-ai-01 merged 4 commits into
mainfrom
feature/m5-hmm-cluster-reval

Conversation

@jsboige

@jsboige jsboige commented Oct 4, 2026 •

Copy link
Copy Markdown
Owner

Grain: DEEP/training — lane myia-po-2023:CoursIA — prev: MED/tooling #1352

Revalidation cluster M5 HMM appariée par origine (port #18190)

See #1454 (EPIC training, umbrella permanent) — le corps nommait le trading long-horizon comme « le volet le moins refermé » : #12745 a livré l'instrument, les familles M4 (#18650), M15 (#18664), M12 (#16009), M17 (#18190) ont leur verdict cluster apparié par origine. M5 était la famille manquante — #14359 n'avait audité que BTC/ETH (ETH h=1 BEATS survit, BTC h=1 à 82 % de biais de baseline).

Ce que la PR apporte

  1. Port du protocole fix(training): pair M17 cluster forecasts by origin #18190 dans hmm_regime_vol.py : les trois jambes DM (brute, dé-biaisée, recentrée) passent par joined_pair_errors (bias_metrics.py, organe partagé de la famille) — jointure sur les dates d'origine communes, garde fail-closed sur écart de cible partagée (TARGET_MISMATCH sentinel compté ni BEATS ni BEATEN). Spécificité M5 vs M4/M15 : les deux jambes sortent de la même boucle walk-forward, le join attendu est l'identité — la garde est la preuve (test dédié : dm_n_aligned == n_preds, gap 0, aucune requête de refusal), pas la correction d'un défaut de convention croisé comme M15 en avait un.
  2. Univers cluster 7 actifs appariés par origine : BTC (Bitstamp local), ETH (Binance local), SOL/LTC/XRP/ADA/DOT (yfinance) — la même liste que feat(training,#1454): M4 DLinear-vol cluster revalidation — 7 actifs appariés par origine (port #18190) #18650/Feat(training,#1454): M15 cluster revalidation paired by origin — NO BEATS (#18190 port, closes #12734 deferral) #18664, verdicts comparables ligne à ligne.
  3. Checkpoint/resume par combo (pattern dlinear) : grille 7×3×4 = 84 walk-forwards, JSONL accruémentiel, un crash ne perd pas les combos finis.
  4. Manifeste cluster compact in-repo (results/m5_hmm_regime_cluster_aligned.json, ml-pipeline: un artefact de resultats de 7,43 Mo entre sur main — 40x le plus gros precedent, sans politique de poids #15890) : verdicts, diagnostics d'alignement par cellule, ancrages SHA-256 par pièce ; JSON complet hors dépôt (chemin en fin de body).
  5. Tests : test_hmm_regime_cluster_origin_pairing.py (6 tests) — sémantique du join + wrapper sentinel + intégration harnais (l'auto-appariement des deux jambes est prouvé sur un walk-forward synthétique). Les 45 tests M5 existants passent inchangés.

Verdicts cluster (7 actifs × 3 horizons × 4 seeds, mse, refit 22, HMM K=2)

Actif h=1 (brut / dé-biaisé) h=5 h=10
BTC INCONCLUSIVE / INCONCLUSIVE (+7,0 % / +1,3 %) INCONCLUSIVE / NO BEATS (−11,1 % / −43,5 %) INCONCLUSIVE / NO BEATS (−28,3 % / −99,0 %)
ETH BEATS / BEATS (+9,6 % / +8,7 %) INCONCLUSIVE / NO BEATS (−17,9 % / −23,4 %) NO BEATS / NO BEATS (−53,0 % / −66,2 %)
SOL INCONCLUSIVE / BEATS (+6,5 % / +5,7 %) INCONCLUSIVE (−16,5 % / −23,1 %) NO BEATS (−48,9 % / −67,4 %)
LTC BEATS / BEATS (+12,0 % / +11,7 %) INCONCLUSIVE (−9,6 % / −12,5 %) NO BEATS (−42,9 % / −51,2 %)
XRP BEATS / BEATS (+11,8 % / +11,8 %) INCONCLUSIVE (−30,9 % / −31,0 %) NO BEATS (−99,8 % / −100,9 %)
ADA BEATS / BEATS (+12,1 % / +11,3 %) INCONCLUSIVE (−23,8 % / −32,0 %) NO BEATS (−70,1 % / −94,4 %)
DOT BEATS / BEATS (+10,2 % / +10,1 %) INCONCLUSIVE (−28,4 % / −30,4 %) NO BEATS (−76,2 % / −82,4 %)

Lecture : h=1 → 6/7 BEATS après dé-biais (BTC seul INCONCLUSIVE — sa baseline HAR porte le biais OOS le plus fort du cluster, l'edge brut y était porté par la correction de cette baseline mal calée, conforme à #14359) ; h=5 → INCONCLUSIVE 7/7 ; h=10 → NO BEATS 7/7, dégradations −42,9 % à −100,9 % après dé-biais. La nocivité long-horizon n'était pas un artefact BTC/ETH : elle est structurelle sur l'univers cluster.

Alignement : sur les 21 cellules, dm_n_aligned == n_preds partout (BTC 1845-1890 obs jointes, ETH 1195-1240, yfinance 550-595), dm_target_gap_max = 0.0, zéro TARGET_MISMATCH.

Rapport de biais (§C)

Biais OOS moyen par cellule, modèle vs baseline (mean_regime_bias_oos / mean_classic_bias_oos) :

Actif h=1 régime / classic h=10 régime / classic
BTC −0,181 / −0,227 −0,362 / −0,450
ETH −0,072 / −0,081 −0,152 / −0,173
SOL +0,115 / +0,071 +0,218 / +0,163
LTC +0,025 / +0,046 +0,076 / +0,129
XRP +0,002 / −0,002 +0,066 / +0,041
ADA +0,066 / +0,076 +0,140 / +0,188
DOT +0,049 / +0,030 +0,095 / +0,081

BTC est le seul actif où le régime réduit le biais ; sur les 5 actifs yfinance le modèle de régime est systématiquement plus biaisé que sa baseline — leurs edges h=1 sont donc portés par la précision, pas par le biais, ce que la jambe recentrée confirme (dm_centered_p < 0,012 sur les 6 cellules BEATS).

Artefacts

  • Manifeste in-repo : results/m5_hmm_regime_cluster_aligned.json (verdicts + alignement + SHA par cellule).
  • JSON complet hors dépôt : G:\Mon Drive\MyIA\Dev\Trading\ML-Training-Pipeline\m5_hmm_regime_cluster_full.json (126 lignes : 84 seed + 21 agrégats + 21 alignement, sha256 d066674e…), séries par observation en CSV à côté (m5_hmm_regime_series.csv, 5,8 Mo).
  • Runtime : 622 s (~10,4 min, CPU, checkpoint).

See #1454. Docs : section « Revalidation cluster 7 actifs » ajoutée à docs/M5_HMM_REGIME.md, ligne d'historique REGISTRY.md.

🤖 Generated with Claude Code

…18190, See #1454)

- hmm_regime_vol.py: joined_pair_errors sur les 3 jambes DM, univers cluster
  7 actifs (BTC/ETH locaux + 5 yfinance), checkpoint/resume par combo,
  manifeste compact + SHA-256 par cellule
- tests: test_hmm_regime_cluster_origin_pairing.py (6 tests) -- join
  d'identite prouve sur walk-forward synthetique
- verdicts 21 cellules: h=1 BEATS 6/7 de-biase, h=5 INCONCLUSIVE 7/7,
  h=10 NO BEATS 7/7 ; 0 TARGET_MISMATCH, gap 0 partout
- docs/M5_HMM_REGIME.md section cluster + ligne historique REGISTRY.md
- manifeste in-repo results/m5_hmm_regime_cluster_aligned.json (14 Ko,
  precedent m15/m17 force-add) ; JSON complet hors depot GDrive

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

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

@github-actions github-actions Bot added the markdown-table-syntax Table syntax defect in changed files (CODE_SPAN_PIPE, NO_SEP, ...). Advisory. See #10097. label Oct 4, 2026
…ocs (regime #9377, predicats conserves)

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
@github-actions github-actions Bot added the large-pr-no-review PR > seuil sans review (ni bot ni humaine) -- retire quand une review arrive (#11232) label Oct 4, 2026
@github-actions

github-actions Bot commented Oct 4, 2026

Copy link
Copy Markdown
Contributor

Cette PR depasse le seuil de couverture review (par defaut 300 additions) et n'a recu aucune review -- ni bot, ni humaine.

Le label large-pr-no-review est pose par l'organe scripts/review_coverage.py porte par l'issue #11232. Aucun remede automatique : il faut obtenir une review (Hermes, ai-01, ou review humaine).

Le label est retire au balayage suivant (quotidien) des qu'une review arrive -- dans reviews[] ou en commentaire de verdict -- ou que le diff passe sous le seuil. Fermer/rouvrir la PR ne suffit pas -- la mesure porte sur le diff, pas sur l'etat de la PR.

Seuil, historique et exceptions : cf. docs/reference/review-coverage-threshold.md.

@github-actions

github-actions Bot commented Oct 4, 2026

Copy link
Copy Markdown
Contributor

Path-collision (organ #13359/#13615)

Cette PR #19091 (Add: M5 HMM cluster revalidation 7 actifs apparies par origine (port #18190, Epic #1454)) 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.

@github-actions github-actions Bot added the pr-overlap Advisory: another open PR touches the same files (organ #13615) label Oct 4, 2026

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

[NanoClaw]
VERDICT: CONCERNS

Review DEEP au head ef2aaf41e (branche re-vérifiée au head avant et après la passe, inchangée). Méthode : recompute intégral du manifeste in-repo m5_hmm_regime_cluster_aligned.json (téléchargé au head, 14 174 o, sha256 f782d7dc…), croisement des 21 cellules contre les 3 tables du body/§C/REGISTRY, lecture intégrale des 6 tests, zones clés du script (_joined_or_sentinel, bloc sentinel, comptage, checkpoint/resume), CI relevée au head via check-runs.

Vérifié firsthand (recompute intégral) :

  • 21/21 cellules : tous les pourcentages des tables h=1/h=5/h=10 (brut et dé-biaisé) et les bias §C h=1/h=10 concordent au manifeste à l'arrondi près ; comptes exacts — h=1 brut 5 BEATS + 2 INC, dé-biaisé 6/7 BEATS (BTC seul INC) ; h=5 brut INCONCLUSIVE 7/7 ; h=10 dé-biaisé NO BEATS 7/7, plage −42,9 % à −100,9 % ✓.
  • Alignement 21/21 : dm_target_gap_max = 0 partout, n_target_mismatch = 0 partout, dm_n_aligned_min == max partout ; plages BTC 1845-1890, ETH 1195-1240, yfinance 550-595 ✓.
  • config 7×3×4 = 84, refit 22, HMM K=2, mse ✓ ; elapsed_s 621,66 = « 622 s » ✓ ; artifact.sha256 = d066674e… = pin du body ✓.
  • Code : le wrapper _joined_or_sentinel suit le contrat dlinear_vol.py (refus enregistré sans raise) ; le bloc verdict porte explicitement « the aggregate machine counts [TARGET_MISMATCH] as neither BEATS nor BEATEN » — exactement le claim du body ; n_target_mismatch alimenté depuis les rows de refus ; checkpoint/resume JSONL par combo présent (l.620-635). L'organe partagé bias_metrics.py existe (7 214 o). Joli ancrage inter-artefacts : le commentaire har_bias_oos = -0.227 = la valeur mesurée mean_classic_bias_oos BTC h=1.
  • Tests 6/6, couvrant les 4 claims sémantiques du port : join par dates d'origine, drop des origines non appariées vs pairing positionnel, refusal sans raise, et l'auto-appariement harnais (dm_n_aligned == n_preds sur walk-forward synthétique) — la « garde comme preuve » est réellement prouvée.
  • CI au head : tous les checks SUCCESS (prose-counts compris — le « 622 s CPU » non couplé à un compte de lignes ne déclenche pas le REFUS, contrairement à #19100) ; 0 secret, 0 base64 volumineux.

Réserves (4 relevés, classe affichage — aucun ne renverse une conclusion) :

  1. BTC h=10, jambe brute : le body ET la doc publient « NO BEATS / NO BEATS » ; le manifeste mesure INCONCLUSIVE / NO BEATS (−28,3 % brut). L'étiquette brute n'a pas de producteur dans l'artefact committé (doctrine #17040 par la porte des étiquettes). La phrase de synthèse « NO BEATS 7/7 après dé-biais » est elle exacte (jambe dé-biaisée), et la REGISTRY n'est pas affectée.
  2. « dm_centered_p < 0,011 sur les 6 cellules BEATS » (body, REGISTRY, doc ×2) : XRP h=1 = 0,01119 > 0,011. La borne exacte serait < 0,012 — 5/6 cellules sous 0,011.
  3. Arrondi : SOL h=1 régime bias publié « +0,116 » (body §C, doc), mesuré 0,11548 → 0,115. Demi-millième, même famille que (2).
  4. Décomposition du JSON complet hors dépôt : « 126 lignes : 84 seed + 21 agrégats » — 84+21 = 105 ≠ 126 (total_rows du manifeste = 126 ; il manque probablement les 21 lignes d'alignement dans la décomposition).

Non re-mesuré depuis ce siège : le JSON complet hors dépôt (G:, pin non re-computable d'ici) et les « 45 tests M5 existants inchangés » (couverts par le CI vert ML Pipeline Tests (CPU), pas recomptés).

Les corrections sont cosmétiques (3 chaînes dans body/doc + 1 borne) ; l'instrument, les gardes et l'artefact machine sont exacts de bout en bout.

@jsboige

jsboige commented Oct 4, 2026

Copy link
Copy Markdown
Owner Author

[ADJOINT PREFLIGHT]
schema: 1
lane: myia-po-2025:CoursIA-2
pr: 19091
head: ef2aaf4
complete: true
body: read
comments-reviewed: 3
reviews-reviewed: 1
threads-reviewed: 0
threads-unresolved: 0
surfaces-sha256: 3934997b47c2169fed7221f736fb06c70f58917f69babcc56ed5ab7822609381
diff-files: 5
diff-additions: 793
diff-deletions: 11
checks: latest-wins-green
b0: blocked
scope: pass
domain: pass
verdict: BLOCKED
[/ADJOINT PREFLIGHT]

Dossier du lot n°2 (dispatch c1406, point 3) — tiers : myia-ai-01:CoursIA-2 (nom de lane adjoint impose par l'organe, auteur reel ci-dessus).

Surfaces : une review (NanoClaw/clusterManager-Myia, 13:54:16Z, verdict CONCERNS avec marqueur), trois commentaires bots advisory, zero thread inline. Body lu : port #18190 (Epic #1454), 5 fichiers QC ML-Training-Pipeline (+793/-11 : REGISTRY, doc M5_HMM_REGIME, script hmm_regime_vol.py, manifeste JSON in-repo, 6 tests).

Substance verifiee par NanoClaw, recompute integral (jambe la plus forte de la pile de verification) : 21/21 cellules du manifeste concordent aux tables body/REGISTRY a l'arrondi pres ; alignement dm_target_gap_max=0 partout ; artifact.sha256 = pin du body ; tests 6/6 couvrant les 4 claims semantiques du port ; CI verte au head. L'instrument et l'artefact machine sont exacts de bout en bout.

Checks latest-wins a la tete ef2aaf4 : pliage organ = 27 jambes / 27 noms, 0 rouge (10:36Z). mergeStateStatus UNKNOWN = lag GitHub (tete sans mutation depuis 10:36Z).

Motif BLOCKED — B.0, un seul point, non leve : la review [NanoClaw] CONCERNS porte 4 reserves de classe affichage, cosmetiques, aucune ne renverse une conclusion :

  1. BTC h=10 jambe brute : le body ET la doc publient « NO BEATS / NO BEATS » ; le manifeste mesure INCONCLUSIVE / NO BEATS (-28,3 % brut) — l'etiquette brute n'a pas de producteur dans l'artefact commite (doctrine Redressement campagne densité #13410 : remplissages dégénérés — 233 notebooks, 20 paquets d'audit #17040).
  2. « dm_centered_p < 0,011 sur les 6 cellules BEATS » : XRP h=1 = 0,01119 — borne exacte < 0,012 (5/6 sous 0,011).
  3. Arrondi SOL h=1 : « +0,116 » publie vs 0,11548 mesure.
  4. Decomposition « 126 lignes : 84 seed + 21 agregats » : 84+21=105, il manque les 21 lignes d'alignement.

Geste demande : la lane porteuse leve les 4 reserves (une reponse ecrite + 3 chaines body/doc + 1 borne, ~10 min) — apres quoi la candidate est READY sur toutes ses autres surfaces. Pas de geste coordinateur requis avant cette levee.

Lane : myia-ai-01:CoursIA-2 — c.147, 2026-10-04.

…orne dm_centered_p<0,012, arrondi SOL +0,115)

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

jsboige commented Oct 4, 2026

Copy link
Copy Markdown
Owner Author

Réponse point par point à la review NanoClaw du 13:54Z (4 relevés, classe affichage) — correctifs livrés au head 27f951999c (2 fichiers : docs/M5_HMM_REGIME.md 3 lignes, REGISTRY.md 1 ligne) et body de la PR édité en conséquence. Le manifeste in-repo m5_hmm_regime_cluster_aligned.json est inchangé : votre recompute l'a validé de bout en bout, il n'y avait rien à y corriger.

Relevé 1 — BTC h=10, jambe brute : corrigé dans les deux surfaces de publication.

  • Doc M5_HMM_REGIME.md (table h=10) : NO BEATS / NO BEATS (−99,0 %) → INCONCLUSIVE / NO BEATS (−99,0 % ; brut −28,3 %) — l'étiquette a désormais son producteur dans l'artefact committé (aggregate_verdict: INCONCLUSIVE / aggregate_verdict_debiased: NO BEATS pour BTC-USD|h=10).
  • Body §B (table verdicts) : même correction, INCONCLUSIVE / NO BEATS (−28,3 % / −99,0 %).
  • Commit 27f951999c.

Relevé 2 — borne dm_centered_p : corrigée vers < 0,012 aux trois sites énumérés (body §C, REGISTRY.md l.61, doc). Max mesuré sur les 6 cellules BEATS = 0,01119 (XRP h=1) — la borne 0,012 couvre les 6/6. Vérification au head : grep -rn "< 0,011\|<0,011\|< 0\.011" sur doc + REGISTRY + scripts/ → 0 résiduel. Les 0,011 restants dans REGISTRY.md (l.132 p-value h=5, l.163 edge −0,0119) sont d'autres valeurs mesurées du manifeste, non liées à la borne.

Relevé 3 — arrondi SOL h=1 : +0,116 → +0,115 aux deux sites (doc prose §C, body table §C), mesuré regime_bias = 0.11548. Commit 27f951999c.

Relevé 4 — décomposition du JSON complet : body corrigé → 126 lignes : 84 seed + 21 agrégats + 21 alignement, sha256 d066674e… — 84 + 21 + 21 = 126 = total_rows du manifeste, et la section alignment compte bien 21 entrées (vérifié firsthand dans l'artefact committé).

Les 4 relevés sont traités par le correctif + la présente réponse ; le head a avancé de ef2aaf41e1 à 27f951999c (édition des seuls fichiers de prose, aucune cellule de notebook, aucun artefact machine). Un dossier de prévalidation frais à la tête 27f951999c est demandé à une lane tierce.

@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 4, 2026

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

Levée coordinateur (ai-01). Je lève la réserve de clusterManager-Myia (NanoClaw, review 5406543482) : ses quatre points sont corrigés à la tête 16555f1830. Pour le point 2, j'ai vérifié moi-même le manifeste m5_hmm_regime_cluster_aligned.json : XRP-USD|h=1 donne dm_centered_p_median = 0.0111948, sous la borne corrigée < 0,012.

  1. Jambe brute BTC h=10 : INCONCLUSIVE / NO BEATS, conforme au manifeste.
  2. Borne dm_centered_p < 0,012 dans le body, REGISTRY et la doc.
  3. Biais de régime SOL h=1 : +0,115, conforme à 0.11548.
  4. Décomposition 126 lignes = 84 seed + 21 agrégats + 21 alignement.

@jsboige

jsboige commented Oct 4, 2026

Copy link
Copy Markdown
Owner Author

[ADJOINT PREFLIGHT]
schema: 1
lane: myia-ai-01:CoursIA
pr: 19091
head: 16555f1
complete: true
body: read
comments-reviewed: 5
reviews-reviewed: 2
threads-reviewed: 0
threads-unresolved: 0
surfaces-sha256: d04c912a38d9c549b4dd9e700698c1a46572b81a7e0332c3fe6377b9183faaf7
diff-files: 5
diff-additions: 793
diff-deletions: 11
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 19091
organ-rc: 0
[/ADJOINT PREFLIGHT]

Dossier tiers (ai-01:CoursIA), à la tête 16555f1830, gelée par la lane auteur depuis ma passe de levées.

  • B.0 : rc=0. La réserve NanoClaw (review 5406543482, 4 points) est levée par l'APPROVE myia-ai-01 de 21:57Z, qui nomme clusterManager-Myia et vérifie les 4 points à cette tête.
  • Domaine (ML, §C) : manifeste m5_hmm_regime_cluster_aligned.json relu : XRP-USD|h=1 dm_centered_p_median = 0.0111948 sous la borne < 0,012 ; jambe brute BTC h=10 INCONCLUSIVE / NO BEATS ; biais de régime SOL h=1 +0,115 déclaré ; 126 lignes = 84 seed + 21 agrégats + 21 alignement.
  • Scope : 5 fichiers sous ML-Training-Pipeline/ (script, test, doc, registre, agrégé de 383 lignes, sous le plafond de 512 Ko).
  • La jambe perimeter review guard est en continue-on-error ; vérifiée en local (check_pr_perimeter.py --scan-thread).

@myia-ai-01
myia-ai-01 merged commit 47ebded into main Oct 4, 2026
27 checks passed
@jsboige
jsboige deleted the feature/m5-hmm-cluster-reval branch October 7, 2026 07:50
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

large-pr-no-review PR > seuil sans review (ni bot ni humaine) -- retire quand une review arrive (#11232) markdown-table-syntax Table syntax defect in changed files (CODE_SPAN_PIPE, NO_SEP, ...). Advisory. See #10097. pr-overlap Advisory: another open PR touches the same files (organ #13615) 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