Repository navigation
feat(training,#14390): aggregate the uncentered DM sanity leg in the aggregated block - #14516
Conversation
…aggregated block Co-Authored-By: Claude-Code <noreply@anthropic.com>
|
G-VAR-2/3 GENRE signals (advisory, non bloquant, #10020).
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 |
jsboige
left a comment
There was a problem hiding this comment.
[Hermes] Review sur d936e00 (contrainte token : COMMENT only, opener=jsboige).
Vérifié en exécution réelle : modules clonés au SHA de tête (btc_vol, bias_metrics, intraday_loader, realized_variance, dlinear_vol, dm_test, har_model + tests), venv propre (numpy/pandas/scipy/torch-cpu) → 20 passed in 9.73s, soit les 16 existantes + les 4 nouvelles #14390, conformes au claim du body.
Claims numériques recoupés sur l'artefact régénéré (téléchargé au SHA de tête) :
- Reconstruction indépendante des médianes non centrées depuis
rows[]: h=1 → 0.0000e+00, h=5 → 1.4354e-10, h=10 → 3.0833e-09 — identiques au blocaggregated, même seeds (4/horizon, graines 0/7/42/99), champ bien positionné juste aprèsdm_centered_p_median. - Confrontation keeper #11011 : les 3 valeurs du body (0,000e+00 / 1,435e-10 / 3,083e-09) sont bien celles de l'artefact, écarts vs keeper honnêtement nommés (x1,57 et +29 %, même ordre de grandeur) — pas de cosmétique.
elapsed_s= 1571,17 s = le « 1571 s ce run » du body ;config(epochs=50, seeds=[0,7,42,99], horizons [1,5,10]) inchangée.- Cohérence verdicts : per-row h=1 et h=5 = 4×BEATS, h=10 = 4×INCONCLUSIVE →
verdict_scagrégés BEATS/BEATS/INCONCLUSIVE, y compris le p=0,102 §C h=10 (1.021e-01 mesuré) tel qu'annoncé.
Design : le mécanisme défenseur est juste — une jambe qui n'existe qu'en champ par-ligne ne peut pas rougir ; la dupliquer à la surface agrégée, sur les mêmes seeds, avec un garde test_legs_cannot_silently_collapse_at_the_aggregate_surface, referme exactement la classe #14362. Le guard "skipped" in r protège l'agrégation des lignes sentinelle.
Mineur non bloquant : n_beats compte v == "BEATS baseline" (comparaison exacte) alors que n_beaten utilise "BEATEN" in v (sous-chaîne) — incohérence stylistique sans effet ici, mais fragile si le libellé de verdict évolue un jour.
Security scan : 0 match (HF_TOKEN|API_KEY|BEARER|PASSWORD|SECRET|TOKEN\s*=). Rien d'autre à signaler.
Grain: MED/strategy-ml -- lane myia-po-2026:CoursIA -- prev: MED/tooling #14511 (cycle 158)
Summary
La jambe de sanité DM non centrée vit désormais dans le bloc
aggregated, à côté de la jambe de verdict — 3 fichiers :btc_vol.py(champ additif), son test de garde, l'artefact régénéré.aggregate_verdicts_recenteredcalcule maintenantdm_uncentered_vs_har_raw_p_median= médiane desdm_uncentered_vs_har_raw_pvaluepar horizon, sur les mêmes seeds quedm_centered_p_median. C'est le mécanisme qui a laissé passer le défaut de #14362 : une jambe qui n'existe qu'en champ par ligne ne peut pas rougir — la seule surface de confrontation (à côté dedm_centered_p_median) ne la portait pas.Champ strictement additif : aucun consommateur positionnel (le notebook de validation rend
aggregateden DataFrame, la colonne s'ajoute sans casser).Confrontation au keeper #11011 (acceptance 2)
Run :
--horizons 1 5 10 --seeds 0 7 42 99 --epochs 50(12 combos, 1571 s ce run).Écarts nommés : le keeper est le run publié d'origine (#11011), pas ce re-run ; la jambe reproduit l'ordre et la magnitude (h=1 ≪ h=5 ≪ h=10, toutes « 1e-00 » ou sous 5e-9, verdicts DM « BEATS baseline » par ligne inchangés). Aucun écart de verdict : le bloc
aggregatedreprend les verdicts du run #14392 à l'identique (h=1 BEATS, h=5 BEATS, h=10 INCONCLUSIVE sur la jambe centrée §C, p=0,102).Preuves
Garde anti-disparition (acceptance 3) :
TestAggregateVerdictsRecentered— (a) le champ est présent dans chaque entréeaggregated; (b) c'est bien la médiane des mêmes seeds (0,0 / 1,5e-10 reconstruits indépendamment) ; (c) les deux jambes ne peuvent pas silencieusement recoller à la surface agrégée (le défaut #14362 était exactement une collision non détectée) ; (d) position clé immédiatement aprèsdm_centered_p_median, là où on la cherche.Artefact régénéré de bout en bout (config
epochs=50, seeds=[0,7,42,99]inchangée) — reproductibilité vérifiée contre le run #14392 : les 12 lignes reproduisent leurs valeurs au bruit flottant près (écart relatif max 2,1e-06 sur les p-values non centrées), le blocaggregatedreprend edge/sigma/verdicts à l'identique et gagne uniquement le nouveau champ.Verdict SOTA : SOTA-OK (run réel complet, pas de workaround)
Closes #14390