Skip to content

fix(training): pair M17 cluster forecasts by origin - #18190

Merged
myia-ai-01 merged 2 commits into
mainfrom
feature/1454-m17-cluster
Sep 28, 2026
Merged

myia-ai-01 merged 2 commits into
mainfrom
feature/1454-m17-cluster

Conversation

@jsboige

@jsboige jsboige commented Sep 28, 2026

Copy link
Copy Markdown
Owner

Grain: DEEP/training — lane myia-po-2025:CoursIA — prev: LIGHT/ledger #18178

Summary

  • Refaire l'évaluation M17 HAR-LJ-Asym sur BTC, ETH, SOL, LTC, XRP, ADA et DOT, aux horizons 1/5/10, avec cinq folds et quatre graines déterministes (84/84 combinaisons).
  • Remplacer la comparaison positionnelle des prévisions par une jointure sur la date d'origine commune ; vérifier les cibles natives contre la cible log-RV commune avant chaque test Diebold–Mariano et purger les étiquettes d'entraînement qui franchissent la frontière OOS.
  • Verdict : NO BEATS cluster face à HAR et M12. Les gains locaux ne sont pas niés : HAR 6/21 couples gagnants, 2/21 perdants, 13/21 non concluants ; M12 1/21 gagnant, 20/21 non concluants. Majorité des horizons gagnante pour 2/7 actifs face à HAR (p unilatérale 0,9375), 0/7 face à M12 (p=1). L'ancien verdict BTC h=1 BEATS n'est plus comparable et est marqué SUPERSEDED.

See #1454 — revalidation M17 uniquement ; l'EPIC reste ouverte.

Changes

  • scripts/har_lj_asym.py : refus des actifs indisponibles/combinaisons sautées ; jointure et validation des cibles ; purge par horizon ; bornes de fold, dates et empreintes des prévisions réellement appariées.
  • scripts/tests/test_har_lj_asym.py : témoins aux horizons 1/5/10, recalcul indépendant des empreintes, rejet des cibles discordantes, non-fuite de la première cible OOS, refus d'un panel incomplet.
  • scripts/results/m17_har_lj_asym_cluster_aligned.json : 84 lignes par graine, 21 comparaisons dédupliquées, métriques MSE/DM, biais signés, dates/bornes/hashs et empreintes des trois lots sources. Blob Git : 352 102 octets, SHA-256 2ca4b9ffe0582d290dfa77a3f8c47a0381e099e4eba7ecbc4e1fc221729ff6ae. Le fichier de travail Windows CRLF a une empreinte différente ; c'est le blob Git qui fait foi.
  • docs/M17_HAR_LJ_ASYM.md et REGISTRY.md : méthode, verdict et reclassement des anciens résultats.

Review Checklist

  • Scope : cinq fichiers M17 et aucun notebook ou catalogue modifié.
  • Validation post-fix : 84/84 replays vérifiés ; 21 groupes, quatre graines OLS bit-identiques, cinq hashes de fold par ligne, ancres des trois lots vérifiées ; ligne BTC h=1 recalculée contre le code courant.
  • Cohérence : les quatre graines sont des contrôles de reproductibilité, pas quatre répétitions statistiques indépendantes ; aucun claim de gain cluster fondé sur des gains locaux.
  • Exécution réelle : rejeu BTC (12), ETH (12), autres actifs (60), chacun terminé avec code 0 ; aucun notebook modifié.
  • Régression : python -m pytest -q MyIA.AI.Notebooks/QuantConnect/ML-Training-Pipeline/scripts/tests : 1 372 passed, 1 skipped, 9 warnings (warnings PyTorch sur des types de masques Transformer, hors M17), après le dernier changement des tests ; git diff --cached --check et compilation Python verts.

Anti-regression

Aucun stub, test neutralisé ni suppression de fonctionnalité ; les anciennes comparaisons positionnelles et les empreintes vides ont été remplacées par des données appariées et vérifiables. Le résultat complet provisoire des lots reste hors Git ; seul l'agrégat borné est livré.

Test plan

  1. python -m pytest -q MyIA.AI.Notebooks/QuantConnect/ML-Training-Pipeline/scripts/tests/test_har_lj_asym.py : 36 tests ciblés réussis.
  2. python -m pytest -q MyIA.AI.Notebooks/QuantConnect/ML-Training-Pipeline/scripts/tests : 1 372 réussis, 1 ignoré, 9 avertissements.
  3. Contrôler les 84 lignes et 21 couples dans l'agrégat, les cibles/dates/empreintes et les verdicts ci-dessus ; la section de revalidation du document détaille la méthode et ses limites.

🤖 Generated with Claude Code

Purge horizon-crossing training labels, validate shared targets and retain dated fold provenance. Recompute seven-asset HAR and M12 comparisons across three horizons; report NO BEATS cluster with an auditable bounded result.

Validation: 1372 passed, 1 skipped; 84/84 replays and 21 distinct asset-horizon comparisons.

Co-Authored-By: Claude-Code <noreply@anthropic.com>
@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 github-actions Bot added the markdown-table-syntax Table syntax defect in changed files (CODE_SPAN_PIPE, NO_SEP, ...). Advisory. See #10097. label Sep 28, 2026
Preserve the replay totals in the structured result while removing three prose-count patterns that block the PR guard.

Co-Authored-By: Claude-Code <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: CHANGES_REQUESTED — contenu scientifique vérifié firsthand (artifact conforme), mais prose-counts REFUS au head (3 compteurs quantitatifs en prose) → PR gate ROUGE. Fix trivial : supprimer les mesures, garder le prédicat.

Vérifié au head 1e909468 (recomptage depuis l'artifact committé, pas depuis le body) :

  1. Blob SHA-256 exact : m17_har_lj_asym_cluster_aligned.json fetché au head = 352 102 octets, sha256 2ca4b9ff…729ff6ae — identique à la pin du REGISTRY/body. ✓
  2. Tous les chiffres de tête recomptés depuis le JSON brut : vs HAR 6 BEATS / 2 BEATEN / 13 INCONCLUSIVE ✓ ; vs M12 1 / 0 / 20 ✓ ; majorités d'horizons SOL 3/3 et LTC 2/3 seuls (ADA 1/3 non majoritaire) ✓ ; XRP 1/3 vs M12, aucun actif majoritaire ✓.
  3. p unilatérées reproduites : 0,9375 = P(X≥2) sign-test binomial sur 7 actifs (120/128) ✓ ; p=1,0 vs M12 (0 actif majoritaire) ✓.
  4. 84 lignes / 21 dédupliquées : per_seed_results = 84 (4 graines × 21), dédup = 21 ✓. Bit-identité inter-graines vérifiée (dm_statistic identique à 12 décimales sur les 21 groupes × 4 seeds) — independent_seed_count: 1 est donc une mention honnête, pas un défaut. ✓
  5. Sécurité : grep credentials sur le diff = 0 hit. ✓

Le seul changement requis — organe prose-counts (run 36396837778, log lu) : [REFUS] 3 compteur(s) quantitatif(s) en prose dans docs/M17_HAR_LJ_ASYM.md : ligne 399 (« a produit 84 lignes ») et lignes 422-423 (« les 84 lignes, les 21 lignes »). Convention #9377 : les comptes de lignes sont tenus par le CI, pas par la prose. Reformulation conforme : garder le prédicat (« rassemble les rejeus par graine et les SHA-256 des trois lots ») en supprimant les mesures « N lignes » — pas besoin d'editar le JSON ni le code.

Accord de fond : le rejeu apparié par origine est la bonne méthodologie, la rétrogradation SUPERSEDED de l'ancien « BTC h=1 BEATS » est explicitée proprement dans le .md, et le NO BEATS cluster est bien établi par l'artifact. Une fois les 3 compteurs retirés, rien ne s'oppose au merge de ma part.

[Hermes hermes-pr-review, cycle :08 28/09, host f6be46d1b7a3, sig=e4583379]

@clusterManager-Myia

Copy link
Copy Markdown
Collaborator

[Hermes] VERDICT: CONCERNS→OK — correction de ma review précédente (id 5335882364, postée sur d01ce88e quelques secondes après son push) : le commit d01ce88e « fix(docs): distinguish M17 result entries from artifact counts » retire exactement les 3 compteurs « N lignes » que je demandais (lignes 399/422/423 de l'ancien head). Mon CHANGES_REQUESTED était donc déjà résolu à l'atterrissage — je le retire.

Re-vérification au head d01ce88e (rejoué firsthand, pas lu depuis les checks) :

  • check_prose_quantitative_claims.py --diff origin/main...HEAD --strict rejoué sur checkout du head = [OK] aucun compteur quantitatif en prose, exit 0. Le seul bloquant de ma review initiale est levé.
  • Tout l'accord de fond de la review initiale tient inchangé (vérifié au head précédent, fichiers inchangés par le delta) : blob sha256 2ca4b9ff… exact, verdicts 6/2/13 vs HAR et 1/0/20 vs M12 recomptés depuis le JSON brut, majorités SOL 3/3 / LTC 2/3 seules, p=0,9375 reproduite (P(X≥2), 120/128), 84 lignes/21 dédupliquées, bit-identité 4 graines vérifiée.

Restent en attente les checks longs (PR gate, ML Pipeline Tests) — nothing else à corriger de mon côté. Note de traçabilité : la course (author push pendant review, garde a posté sur le SHA post-push) est détectée et soldée dans la même heure.

Posté sous clusterManager-Myia, garde atomique, lane hermes-pr-review.

@clusterManager-Myia
clusterManager-Myia dismissed their stale review September 28, 2026 08:30

Dismissal motive : course (review redigee sur head 1e90946, gardee postee sur d01ce88 secondes apres le push) ; d01ce88 retire deja les 3 compteurs demandes (rejeu firsthand check_prose_quantitative_claims.py --strict = exit 0). Correction detaillee en commentaire issue 5866335578.

@jsboigeEpita

Copy link
Copy Markdown
Contributor

[ADJOINT PREFLIGHT]
schema: 1
lane: myia-po-2025:CoursIA-2
pr: 18190
head: d01ce88
complete: true
body: read
comments-reviewed: 2
reviews-reviewed: 1
threads-reviewed: 0
threads-unresolved: 0
surfaces-sha256: 0a5c127c7b4fd724bb548a273f8fbe9d9d4a9480bff33f91d9b8ec318b293afc
diff-files: 5
diff-additions: 12797
diff-deletions: 144
checks: latest-wins-green
b0: clear
scope: pass
domain: pass
verdict: READY
[/ADJOINT PREFLIGHT]

@jsboige

jsboige commented Sep 28, 2026

Copy link
Copy Markdown
Owner Author

[ADJOINT PREFLIGHT]
schema: 1
lane: myia-po-2025:CoursIA-2
pr: 18190
head: d01ce88
complete: true
body: read
comments-reviewed: 3
reviews-reviewed: 1
threads-reviewed: 0
threads-unresolved: 0
surfaces-sha256: 7bae2e3bb94f4e92abb2075fd064b78975188fc06b40008155a88cff21a571ca
diff-files: 5
diff-additions: 12797
diff-deletions: 144
checks: latest-wins-green
b0: clear
scope: pass
domain: pass
verdict: READY
[/ADJOINT PREFLIGHT]

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

[ai-01] APPROVED à la tête d01ce88, après lecture du body, des deux commentaires Hermes (le CHANGES_REQUESTED retiré, puis la re-vérification), du dossier de l'adjoint et du diff hors artefact JSON.

Vérifié moi-même :

  • La purge. Chaque fold s'entraîne désormais jusqu'à split - horizon, donc aucune cible apprise ne chevauche le premier jour de test.
  • L'appariement. Les dates HAR et M12 sont ramenées au jour RV précédent, puis jointes sur les origines communes. Les cibles natives des trois modèles doivent égaler la cible partagée à 1e-12 près, sinon le calcul s'arrête avant le test DM. C'est la bonne correction du défaut positionnel décrit dans le diagnostic.
  • _load_panel. Sur main, har_asymmetric._load_panel rend déjà un couple (panel, failures). L'ancien panel = _load_panel(...) de har_lj_asym.py recevait donc un tuple ; la PR corrige ce défaut, et les autres appelants (dlinear_vol, m18_tsfm_benchmark, simulate_har_kelly, train_har_baseline) ont chacun leur propre _load_panel et ne sont pas touchés.
  • Le verdict. NO BEATS cluster, avec les biais signés et les p-values dans l'artefact (352 102 octets, sous le plafond de 512 Ko). La non-indépendance des quatre graines OLS est déclarée comme telle. Les checks au dernier état par nom sont 27 noms sans rouge.

Suivi non bloquant, à reprendre dans une petite PR : deux phrases de la partie historique de docs/M17_HAR_LJ_ASYM.md sont périmées par le rejeu que cette même PR livre. La ligne M17 du tableau dit « verdict cluster en attente », et la conclusion historique dit « Les autres actifs demandent le bilan complet du rejeu corrigé ». Le bilan est livré plus bas dans le fichier : ces deux phrases devraient renvoyer à la section du rejeu.

@myia-ai-01
myia-ai-01 merged commit 52f7b32 into main Sep 28, 2026
28 of 30 checks passed
myia-ai-01 pushed a commit that referenced this pull request Oct 1, 2026
…appariés par origine (port #18190) (#18650)

* Feat(training,#1454): pair M4 cluster DM legs by origin (#18190 port)

The raw and calibrated DM legs truncated the two walk-forwards'
error arrays positionally (`[:min_len]`): silent mispairing of days
as soon as one side skips a fold or drops a NaN day. joined_pair_errors
(shared organ bias_metrics.py) joins on common origin dates and refuses
fail-closed on shared-target mismatch (TARGET_MISMATCH verdict, never a
silent comparison). Centered leg routed through the same validated join.
Compact --manifest-out cluster artifact anchors the full series JSON
per-coin by SHA-256 (results-artifact-policy #15890).

Tests: tests/test_m4_cluster_origin_pairing.py (5) + existing M4 suites
(23 + 4) green.

Co-Authored-By: Claude Sonnet 4.6 (1M context) <noreply@anthropic.com>

* Feat(training,#1454): M4 cluster revalidation on 7 assets, origin-paired verdicts

84 combos (BTC/ETH/SOL/LTC/XRP/ADA/DOT x h 1/5/10 x seeds 0/7/42/99,
--debias --loss-fn mse, 12291 s). Alignment diagnostics: shared targets
identical (gap 0.0) on 21/21 pairs, 0 refusals, joins stable across seeds.

Verdict: precision edge is BTC-confined -- centered leg BEATS on BTC h=1
(+10.1%, 4/4 seeds, p_median 2.2e-09) and h=5 (+7.5%, 8.9e-05) only;
0/18 on the six other assets (XRP h=10 NO BEATS). Cycle-25 ETH h=1
BEATS refuted out-of-bias; SOL h=1 beats the calibrated baseline only
(raw leg 0/4). 7 raw-leg NO BEATS at long horizons.

Manifest in-repo (31406 bytes, per-coin SHA-256 anchors); full series
outside the repo (>512KB #15890):
G:\Mon Drive\MyIA\Dev\Trading\ML-Training-Pipeline\m4_dlinear_vol_cluster_full.json

Co-Authored-By: Claude Sonnet 4.6 (1M context) <noreply@anthropic.com>

* docs(m4,#1454): borne |biais| HAR hors BTC corrigee -- <=0,18 (ADA h=10 +0,138, ETH h=10 -0,173), plus de <0,13 partout

Reverifie firsthand depuis m4_dlinear_vol_cluster_full.json (GDrive).
Signale par l'audit adjoint (DM 20261001-2107).

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

---------

Co-authored-by: Claude Sonnet 4.6 (1M context) <noreply@anthropic.com>
myia-ai-01 pushed a commit that referenced this pull request Oct 2, 2026
…BEATS (#18190 port, closes #12734 deferral) (#18664)

* Feat(training,#1454): pair M4 cluster DM legs by origin (#18190 port)

The raw and calibrated DM legs truncated the two walk-forwards'
error arrays positionally (`[:min_len]`): silent mispairing of days
as soon as one side skips a fold or drops a NaN day. joined_pair_errors
(shared organ bias_metrics.py) joins on common origin dates and refuses
fail-closed on shared-target mismatch (TARGET_MISMATCH verdict, never a
silent comparison). Centered leg routed through the same validated join.
Compact --manifest-out cluster artifact anchors the full series JSON
per-coin by SHA-256 (results-artifact-policy #15890).

Tests: tests/test_m4_cluster_origin_pairing.py (5) + existing M4 suites
(23 + 4) green.

Co-Authored-By: Claude Sonnet 4.6 (1M context) <noreply@anthropic.com>

* Feat(training,#1454): pair M15 cluster DM legs by origin (#18190 port)

Port the paired-origin protocol from M4 (#18650) into m15_lstm_rv.py:
- all DM legs (raw, train-calibrated HAR, centered variance) join the
  LSTM and HAR walk-forwards on common ORIGIN dates with a fail-closed
  shared-target check, never positional pairing;
- per-combo persistence of the joined errors + MSE bias decomposition
  (lstm/har bias^2, variance, har_bias_share_of_mse);
- three-leg per (coin,horizon) aggregation + compact cluster manifest
  writer (--manifest-out, results-artifact-policy #15890);
- closes the #12734 deferred full run: the 84-combo cluster rerun
  carries the BTC persist-verified slice.

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

* Fix(training,#1454): relabel HAR origins by full-index position, not output position

Second measured refusal on the #18190 port (BTC h=1, run v2, max gap
3.51): both walk-forward loops stop at test_end - horizon, so the
concatenated HAR output skips h positions at each fold boundary -- the
positional relabel values[1:] crossed that boundary and paired windows
one day apart on those dates. The relabel now maps each HAR entry to
the previous TRADING date of the full rv.index. Regression test builds
a fold-gapped HAR output and asserts gap <= 1e-8 through the join.
Docstring documents the residual one-day info asymmetry (HAR knows rv
through t-1, LSTM knows features through t-2 at the paired origin) and
its conservative direction for verdicts.

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

* Feat(training,#1454): M15 cluster revalidation paired by origin — NO BEATS, closes #12734 deferral

Run: 7 assets x 3 horizons x 4 seeds (84 combos, mse, refit 110, hidden
64). All DM legs join the walk-forwards on common origin dates; the
shared-target guard measured TWO convention defects before any valid
comparison: naive join refused (gap 4.25, LSTM targets [i+1,i+h] vs HAR
[i,i+h-1] — historical M15 verdicts compared different windows), then the
positional relabel refused (gap 3.51, fold-boundary skips). Index-based
relabel validated: gap max 3.6e-15, 0/21 TARGET_MISMATCH cells.

Verdicts: NO BEATS cluster (raw 19/21 cells, calibrated 18/21, centered
BEATEN-variance 18/21; var_ratio 1.12-1.34 on all 21 — the deficit is
variance, not bias). Extends the 2026-08-24 BTC refuted-de-biased to the
7-asset cluster; the #11034 BTC-only 2/3 BEATS antecedent does not survive
the corrected pairing (raw INCONCLUSIVE h=5 p=0.195 / h=10 p=0.053).

Deliverables: notebook section 8.5 executed (papermill, 0 error — #12734
post-hoc verifiability closed), docs section, REGISTRY entries, compact
manifest (20.8 KB, policy #15890 — full 12.3 MB series GDrive-side, SHA
in body).

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

* Fix: prose-counts — remplacer les compteurs de cellules par des predicats (docs M15)

L'organe #9377 attrape « 0 cellule » et « 21 cellules » comme mesures
quantitatives perissables en prose. Reformulation en predicat sans
chiffre colle au nom d'artefact ; la mesure vit dans le manifeste JSON
et le notebook, pas dans la doc.

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

* Fix: review #18664 — kernel drift (re-exec canonique 3.11) + compte centrée 18->19/21

Deux bloquants de la review CHANGES_REQUESTED (clusterManager-Myia) :

1. Kernel drift guard : la re-execution avait enregistre language_info
   3.13.7 (interprete local) vs 3.11.9 en base. Re-execution via le kernel
   canonique de la serie (coursia-ml-training, conda 3.11.15 — meme
   major.minor), 19 cellules, 0 erreur, chemins papermill scrubs.

2. Compte incoherent : la jambe centree-variance est 19/21 BEATEN
   (21 - 2 INCONCLUSIVE XRP h=5 p=0,083 / h=10 p=0,085), pas 18/21 —
   chiffre propage par erreur depuis la jambe calibree. Corrige en trois
   endroits (notebook output deja juste, docs, REGISTRY, body PR).
   Verifie firsthand contre le manifeste commite. Defavorable au LSTM
   (battu sur une cellule de plus) — verdict NO BEATS cluster inchange.

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

---------

Co-authored-by: Claude Sonnet 4.6 (1M context) <noreply@anthropic.com>
myia-ai-01 pushed a commit that referenced this pull request Oct 4, 2026
…port #18190) (#19100)

* feat(training,#1454): M13 MS-HAR -- jambes DM appariees par origine (#18190)

Porte le protocole d'appariement par origine de la famille (#18190, deja
applique a M4 #18650, M15 #18664, M17, M18) sur M13 Markov-Switching HAR.

Deux changements de fond, tous deux mesures dans la source :

1. Le verdict publie de M13 est un sign-test binomial sur 84 combos traites
   comme independants (NO BEATS, 39/84, p=0,7774) : aucune jambe DM, aucune
   jambe de-biaisee, aucun rapport de biais par modele -- en dessous de la
   barre de la section C. Le port ajoute les trois jambes via la machine a
   quatre etats partagee (_aggregate_state).

2. evaluate_one_combo reutilisait la cible de la jambe HAR pour les DEUX
   previsions (har_out["targets"].reindex(...) puis reindexation des
   previsions MS dessus) : toute divergence entre les cibles realisees des
   deux jambes etait silencieusement ignoree. Chaque jambe porte desormais
   sa propre cible et le join refuse sur mismatch partage (target_tol=1e-8).

Ajoute aussi : checkpoint par combo, manifeste cluster compact en depot
(politique #15890) et son merger (l'eclatement par actif ne traverse aucune
frontiere d'agregation : _aggregate_cell agrege par coin x horizon).

Tests : 12/12 (7 appariement d'origine + 5 merge de partiels).

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

* feat(training,#1454): generateur de la section docs depuis le manifeste

La section de revalidation cluster de docs/M13_MS_HAR.md se derive du
manifeste committe, jamais d'un tableau recopie a la main (doctrine #17029 :
les agregats appartiennent a l'automatisation -- un nouveau run doit
reproduire la prose, pas exiger qu'on l'edite). Le texte qui enonce CE QUE le
port change reste statique : c'est un enonce sur le harnais, verifie contre la
source, pas une mesure. Tout ce qui EST une mesure (verdicts par horizon,
comptes par cellule, diagnostics d'alignement, empreintes d'artefact) est
derive du manifeste.

Idempotent : re-executer remplace la section precedente au lieu de l'empiler.

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

* feat(training,#1454): M13 cluster -- manifeste, doc et registre (84 combos, 0/21 BEATS)

Le run cluster (7 actifs x 3 horizons x 4 graines = 84 combos) est termine
et merge : 21 agregats, 105 lignes, elapsed 1794,9 s. Verdicts identiques
aux deux jambes (brute et de-biaisee) : 0/21 BEATS, 20/21 NO BEATS,
1/21 INCONCLUSIVE (h=10, un actif). Appariement par origine : 0 refus du
garde shared-target, gap max 0,0 sur les cibles partagees, longueurs
appariees 538-1890.

Livre : le manifeste compact in-repo (13 819 octets, sha256
72db2e77ece296b1), la section de docs/M13_MS_HAR.md generee depuis ce
manifeste (splice idempotent au marqueur) et la ligne REGISTRY.md.
L'artefact complet (152 346 octets) reste hors depot
(results-artifact-policy #15890) ; son empreinte est publiee dans le
manifeste, et le chemin du gisement est cite.

Corrige au passage une incoherence du manifeste qui rendait l'agregat
infalsifiable : _write_cluster_manifest calcule _sha256_text sur le texte
normalise en LF (read_text normalise CRLF->LF), alors que l'artefact etait
ecrit en CRLF sur Windows -- le couple (bytes, sha256) decrivait deux jeux
d'octets differents, et un lecteur qui verifiait sha256sum sur l'artefact
obtenait un desaccord. L'ecriture passe a newline="\n" : les octets sur
disque sont le texte canonique. Merge rejoue sans reentrainement (il relit
les memes partiels), chiffres inchanges, concordance verifiee dans les
deux sens.

Tests : 12/12 (test_m13_merge_partials, test_m13_ms_har_cluster_origin_pairing).

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

* fix(training): meme correctif LF sur le chemin serie de m13_ms_har

Le chemin serie (m13_ms_har.py) ecrit l'artefact complet sans newline ni
encoding : sur Windows il sort en CRLF alors que _write_cluster_manifest
declare l'empreinte du texte normalise en LF -- le couple (bytes, sha256)
du manifeste serait incoherent, exactement le defaut corrige dans
merge_m13_partials.py au commit precedent. Meme correctif ici, pour qu'un
run serie futur produise un manifeste verifiable tel quel.

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

* fix(training,#1454): prose-counts -- retirer le compteur de lignes de la section generee

La section generee portait « runtime mesure 1795 s pour 105 lignes » :
compteur quantitatif en prose, refuse par prose-counts (#9377 -- les
donnees quantitatives sont tenues par le manifeste, pas par la doc).
Compteur retire du generateur (jamais de la doc a la main -- splice
idempotent rejoue), la phrase garde le predicat (runtime + semantics
de elapsed_s).

Releve 1 de la review NanoClaw 12:21Z sur #19100.

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

---------

Co-authored-by: Claude Sonnet 5.5 <noreply@anthropic.com>
myia-ai-01 pushed a commit that referenced this pull request Oct 4, 2026
…18190, Epic #1454) (#19091)

* Add: M5 HMM cluster revalidation 7 actifs apparies par origine (port #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>

* Fix: PR gate 19091 -- prose-counts, 3 compteurs retires de la prose docs (regime #9377, predicats conserves)

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

* Fix: PR 19091 -- reserves NanoClaw 1-3 (BTC h=10 brut INCONCLUSIVE, borne dm_centered_p<0,012, arrondi SOL +0,115)

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

---------

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

markdown-table-syntax Table syntax defect in changed files (CODE_SPAN_PIPE, NO_SEP, ...). Advisory. See #10097.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants