Skip to content

feat(training,#14579): OOT protocol instrument -- precision DM jambe + train-end freeze - #14629

Merged
myia-ai-01 merged 1 commit into
mainfrom
feature/14579-oot-protocol
Sep 4, 2026
Merged

myia-ai-01 merged 1 commit into
mainfrom
feature/14579-oot-protocol

Conversation

@jsboige

@jsboige jsboige commented Sep 4, 2026 •

Copy link
Copy Markdown
Owner

feat(training,#14579): OOT protocol instrument — precision DM jambe + train-end freeze

Grain: MED/training -- lane myia-po-2027:CoursIA -- prev: LIGHT/ledger #14563

Périmètre

Issue #14579 (sous-grain de l'umbrella #1454) : produire le premier verdict
out-of-time réel pour L4 Decision Transformer — entraînement gelé à une borne,
holdout postérieur absent de tous les folds et de toute sélection d'hyperparamètres.

Cette PR livre l'instrument du protocole (§C renforcé #11010). Le verdict
lui-même (run GPU label oot en cours) est un grain séparé qui mettra à jour
REGISTRY.md et la section verdict de la doc.

Deltas

Fichier Changement
scripts/validate_xrp_dt_holdout.py Jambe de précision §C : erreur directionnelle e_t = position_t − sign(r_{t+1}) — DM mse/mae sign-aware pour des positions ±1 (le mse direct sur les retours positionnés est sign-blind, (−r)² = r², cf #10228). DM linear conservé avec role: bias_control explicite. Biais signés par modèle (mean(return) DT / momentum / BH) rapportés par seed. Verdict = conjonction edge ≥ 2σ cross-seed ET dm_p_mse_median < 0.05 (mae en variante), sinon NO-BEATS/INCONCLUSIVE.
scripts/train_dt_multiseed.py --train-end <date> : tronque le CSV à la borne gelée inclusive avant le walk-forward, data_hash recalculé sur la tranche gelée.
docs/L4_decision_transformer.md Section « Protocole OOT (#14579) » : brique par brique (gel, jambe, contrôle, conjonction) + dataset de référence.

Validation

Étape Résultat
Smoke CPU holdout (--smoke) PASS — les 3 jambes DM rendent (mse 0.78, mae 0.69, linear-ctrl 0.066 sur données synthétiques, 2 seeds × 2 epochs), biais signés rapportés, verdict NO-BEATS cohérent
Dry-run WF (--dry-run --train-end 2025-06-30) --train-end parse + troncature + walk-forward OK (5/10 coins exécutés, puis abandon volontaire du smoke)
Diff doc vs main 17 insertions pures, 0 suppression (aucun churn d'endings)
Pre-commit hooks 9/9 PASS (gitleaks, H.3 n/a scripts, #13326)

Dataset de référence (gitignored, prototype #14579)

datasets/yfinance/crypto_panier/XRP-USD.csv — bornes 2018-01-01 → 2026-09-04
(3169 rows), sha256 71d8aee9d0bda18b, téléchargé yfinance 04/09.

Run en cours

validate_xrp_dt_holdout.py --label oot --train-end 2025-06-30 --seeds 0 1 7 42 99 --epochs 30 sur GPU (RTX 4060). Le verdict (et les chiffres par seed) sera rapporté
dans la PR suivante : mise à jour de la section OOT de la doc + REGISTRY.md ligne L4.

Notes

See #14579

@github-actions

github-actions Bot commented Sep 4, 2026

Copy link
Copy Markdown
Contributor

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

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 commented Sep 4, 2026

Copy link
Copy Markdown
Contributor

prev: genre mots-clé fermant -- bloquant (#10093).

prev: reference(s) fail invariant(s) (prev-not-merged -> [14622]) -> point prev: at a MERGED PR of the same lane, distinct from the current PR. See #13475.

Une prev: dont le genre est fix/close/resolve (ou une inflexion) fait que GitHub interprète <genre> #N comme un ordre de fermeture automatique dès que le texte atterrit dans un message de commit -- c'est exactement ce qui a fermé #10067 (sans la merger) au squash-merge de #10063. Les 14 genres canoniques ne contiennent AUCUN mot-clé fermant : utilisez refactor, guard, ou tooling à la place.

Pour passer ce gate, réécrivez le champ prev: (dans le body ET dans chaque commit concerné) avec un genre non-fermant :

Grain: <TIER>/<genre> -- lane <machine:workspace> -- prev: <TIER>/<refactor|guard|tooling|...> #<PR>

@github-actions

github-actions Bot commented Sep 4, 2026

Copy link
Copy Markdown
Contributor

prev: genre mots-clé fermant -- bloquant (#10093).

prev: reference(s) fail invariant(s) (prev-not-merged -> [14622]) -> point prev: at a MERGED PR of the same lane, distinct from the current PR. See #13475.

Une prev: dont le genre est fix/close/resolve (ou une inflexion) fait que GitHub interprète <genre> #N comme un ordre de fermeture automatique dès que le texte atterrit dans un message de commit -- c'est exactement ce qui a fermé #10067 (sans la merger) au squash-merge de #10063. Les 14 genres canoniques ne contiennent AUCUN mot-clé fermant : utilisez refactor, guard, ou tooling à la place.

Pour passer ce gate, réécrivez le champ prev: (dans le body ET dans chaque commit concerné) avec un genre non-fermant :

Grain: <TIER>/<genre> -- lane <machine:workspace> -- prev: <TIER>/<refactor|guard|tooling|...> #<PR>

…+ train-end freeze

Grain: MED/training -- lane myia-po-2027:CoursIA -- prev: LIGHT/ledger #14563

Instrument du protocole out-of-time (#14579, sous-grain EPIC #1454) pour le
verdict OOT reel de L4 Decision Transformer. Deux deltas de code + doc:

1. validate_xrp_dt_holdout.py — jambe de precision §C (#11010) :
   erreur directionnelle e_t = position_t - sign(r_{t+1}), DM mse/mae
   (sign-aware pour des positions +-1 ; le mse direct sur retours
   positionnes reste sign-blind, (-r)^2 == r^2, cf #10228). DM linear
   conserve comme controle de biais (role explicite). Biais signes par
   modele rapportes (mean return DT/momentum/BH). Verdict : conjonction
   edge >= 2 sigma ET dm_p_mse_median < 0.05.

2. train_dt_multiseed.py — --train-end <date> : tronque le CSV a la borne
   gelée avant le walk-forward, hash recalcule sur la tranche.

3. docs/L4_decision_transformer.md — section "Protocole OOT (#14579)"
   décrivant l'instrument + dataset de reference (bornes 2018-01-01 ->
   2026-09-04, sha256 71d8aee9d0bda18b).

Validation :
- smoke CPU holdout PASS (3 jambes DM rendent : mse 0.78 / mae 0.69 /
  linear-ctrl 0.066, biais signes rapportes, verdict NO-BEATS coherent
  sur data synthetique)
- dry-run WF --train-end 2025-06-30 : parse + troncature + walk-forward
  OK (5/10 coins executes avant abandon manuel du smoke)

Le verdict OOT lui-meme (run GPU label=oot, train-end 2025-06-30, seeds
0,1,7,42,99) est un grain SEPARE : il depend du run en cours et mettra a
jour REGISTRY.md + la section verdict — voir PR suivante.

See #14579
@jsboige
jsboige force-pushed the feature/14579-oot-protocol branch from 33cffd0 to d5b7ea5 Compare September 4, 2026 15:05
jsboige added a commit that referenced this pull request Sep 4, 2026
… futures

Grain: DEEP/training -- lane myia-po-2027:CoursIA -- prev: LIGHT/ledger #14563

Premier verdict out-of-time REEL de L4 Decision Transformer (issue #14579,
sous-grain EPIC #1454) : entrainement gele au 2025-06-30 (hash recalcoule sur
la tranche gelee), holdout 2025-07-10 -> 2026-09-04 absent de tous les folds
et de toute selection d'hyperparametres. Donnees yfinance XRP-USD (3169 rows,
bornes 2018-01-01 -> 2026-09-04, sha256 71d8aee9d0bda18b).

Resultat (10 bps, 5 seeds 0/1/7/42/99, 30 epochs, RTX 4060) :
  VERDICT NO-BEATS : DT net -1.744 (+/- 0.214) vs BH -0.592
  0/5 seeds > BH | edge -5.38 sigma | DM mse p mediane 0.1419
  (mae 0.2642, linear-bias 0.2969) | biais moyens/jour: DT -0.004059,
  momentum -7.5e-05, BH -0.001406

Lecture : troisieme test temporel (apres interne et frais du 06/08) =
troisieme NON-reproduction. L'edge L4 ne survit pas au temps ; il reste
cantonné au panel/cross-section (BEATS @10bps panel seulement). Le biais
signe confirme : le DT perd en moyenne plus que le BH sur fenetre baissiere
XRP.

Livraison : section verdict dans docs/L4_decision_transformer.md +
ligne L4 de REGISTRY.md mise a jour (OOT reel 04/09 NO-BEATS cite).

Preuves : holdout_oot_20260904_164308.json (gitignored, series par seed
incluses pour re-calcul DM). Run POST-fix des scripts instrumentes (PR #14629).

See #14579

@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] — structural review : OOT protocol instrument (jambe de précision §C + gel de borne), 3 fichiers +107/−14

Favorable — vérifié au code, pas au body. Au head d5b7ea5a76 :

  • Jambe de précision §C (validate_xrp_dt_holdout.py l.153-183) : construction e_t = position_t − sign(r_t) sign-aware correcte — politique alignée → 0, opposée → ±2, flat vs mouvement → ±1 ; l'alignement target_sign[i] = sign(test_returns_full[i]) est cohérent avec la convention net_returns (position i tenue pendant le rendement i), donc l'erreur mesure bien la précision directionnelle de chaque politique. DM mse/mae calculés DT vs BH et DT vs momentum, linear conservé avec role: bias_control explicite — exactement la séparation revendiquée (jambe de conjonction ≠ contrôle de biais, #11010).
  • Conjonction verdict (l.325-331) : NO-BEATS si moyenne ≤ BH, sinon BEATS exige seeds_beat ≥ min(4,n) ET edge_sigma ≥ 2 ET dm_p_mse_median < 0.05 — hiérarchie saine (pas de « promising »), médiane cross-seed pour la jambe DM.
  • Gel de borne (train_dt_multiseed.py l.105-113) : troncature raw.index <= train_end avant le walk-forward, data_hash recalculé sur la tranche gelée — le holdout est structurellement invisible des folds. ✓ claim du body.
  • Dépendance : dm_test.py présent au head (7 287 bytes) — l'import n'est pas fantôme.
  • Recomptage croisé avec #14630 (le verdict) : edge_sigma = (−1.744 − (−0.592)) / 0.214 = −5.38 — exactement la valeur du tableau OOT de #14630, et le verdict NO-BEATS suit la branche mean ≤ BH (−1.744 ≤ −0.592). La chaîne instrument → verdict est cohérente de bout en bout.
  • Pas de secret dans les diffs (gitleaks 9/9, confirmé par scan local).

2 points mineurs, non bloquants :

  1. Le code applique 3 conjoncts, le body/doc en citent 2 : seeds_beat ≥ min(4, len) participe au verdict (l.326-328) mais le body dit « edge ≥ 2σ ET dm_p_mse_median < 0.05 ». Le header du script, lui, documente les trois (« ≥4 seeds, edge ≥ 2σ sinon INCONCLUSIVE »). Sur #14630 les trois échouent de toute façon (0/5 seeds), mais la section « Protocole OOT » de la doc gagnerait à citer le 3ᵉ conjonct — c'est celui qui protège contre 1 seed chanceux sur 5.
  2. Cosmétique : l.111-113 de train_dt_multiseed.py, le if/else calcule data_hash dans les deux branches — seule la troncature mérite la branche. Zéro impact.

Lecture d'ensemble : ce couple #14629/#14630 est le genre de livraison qu'on veut voir — résultat négatif assumé (3ᵉ non-reproduction temporelle), instrument re-exécutable, séries par seed persistées pour recalcul DM post hoc (le commentaire l.189-192 montre que la leçon du p-value gelé au buggy mse a été intégrée). #14630 (le verdict) roule au prochain slot pour sa review propre.

Review structurelle (fenêtre contexte) : 2 fichiers porteurs lus en entier sur 3 changés ; le 3ᵉ (docs/L4_decision_transformer.md, +17) non lu ligne à ligne.

@myia-ai-01
myia-ai-01 merged commit 726bf4c into main Sep 4, 2026
19 checks passed
myia-ai-01 added a commit that referenced this pull request Sep 4, 2026
… futures (#14630)

Grain: DEEP/training -- lane myia-po-2027:CoursIA -- prev: LIGHT/ledger #14563

Premier verdict out-of-time REEL de L4 Decision Transformer (issue #14579,
sous-grain EPIC #1454) : entrainement gele au 2025-06-30 (hash recalcoule sur
la tranche gelee), holdout 2025-07-10 -> 2026-09-04 absent de tous les folds
et de toute selection d'hyperparametres. Donnees yfinance XRP-USD (3169 rows,
bornes 2018-01-01 -> 2026-09-04, sha256 71d8aee9d0bda18b).

Resultat (10 bps, 5 seeds 0/1/7/42/99, 30 epochs, RTX 4060) :
  VERDICT NO-BEATS : DT net -1.744 (+/- 0.214) vs BH -0.592
  0/5 seeds > BH | edge -5.38 sigma | DM mse p mediane 0.1419
  (mae 0.2642, linear-bias 0.2969) | biais moyens/jour: DT -0.004059,
  momentum -7.5e-05, BH -0.001406

Lecture : troisieme test temporel (apres interne et frais du 06/08) =
troisieme NON-reproduction. L'edge L4 ne survit pas au temps ; il reste
cantonné au panel/cross-section (BEATS @10bps panel seulement). Le biais
signe confirme : le DT perd en moyenne plus que le BH sur fenetre baissiere
XRP.

Livraison : section verdict dans docs/L4_decision_transformer.md +
ligne L4 de REGISTRY.md mise a jour (OOT reel 04/09 NO-BEATS cite).

Preuves : holdout_oot_20260904_164308.json (gitignored, series par seed
incluses pour re-calcul DM). Run POST-fix des scripts instrumentes (PR #14629).

See #14579

Co-authored-by: myia-ai-01 <myia.ai.01.myia@gmail.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.

3 participants