Skip to content

refactor(qc-pipeline,#19016): strategy_metrics porte la convention, wf_framework et run_stage1 l'importent - #19136

Merged
myia-ai-01 merged 2 commits into
mainfrom
refactor/19016-strategy-metrics-single-module
Oct 5, 2026
Merged

myia-ai-01 merged 2 commits into
mainfrom
refactor/19016-strategy-metrics-single-module

Conversation

@jsboige

@jsboige jsboige commented Oct 4, 2026 •

Copy link
Copy Markdown
Owner

Grain: MED/refactor — lane myia-po-2024:CoursIA-3 — prev: LIGHT/research-code #19126

Tranche 1 de #19016 : le point 1 de l'issue (une convention, un seul module), plus les deux scripts dont la migration ne change aucun nombre.

Décisions (point 1 de #19016)

  • Module unique : strategy_metrics.py. wf_framework/metrics.py l'importe, et non l'inverse : le verdict de la 5a, le rejeu en ombre et inverse_vol_currency.py en dépendent déjà.
  • Années du CAGR : fournies par l'appelant. Quand les rendements sont datés, on compte les jours calendaires divisés par 365,25 (verdict de la 5a, rejeu en ombre). wf_framework ne reçoit qu'un tableau sans dates : il compte des périodes, (len - 1) / periods_per_year, et le dit dans sa docstring. Le forcer en calendaire exigerait de lui passer des dates.
  • Sharpe non défini : laissé vide. Le module rend la valeur de la division (inf ou nan) et ne la remplace pas par un 0,0, qui se lirait comme un Sharpe mesuré. Les deux fonctions anciennes qui rendent 0,0 le gardent, pour ne pas changer leurs appelants, et l'écrivent dans leur docstring.

Défaut corrigé dans le module partagé

max_drawdown partait de cumprod(1 + r), sans le capital de départ. Une baisse dès le premier rendement était donc invisible. Mesuré sur main à 29573667e0 :

Chemin strategy_metrics.max_drawdown (main) wf_framework (courbe 1 → …) Après cette PR
r = [−0,10 ; 0,05 ; 0,02] 0,0 −0,10 −0,10

Le capital de départ compte maintenant comme premier sommet. test_max_drawdown_counts_the_starting_capital est le contrôle positif : il rend −0,10 et échoue sur l'ancien code (0,0 mesuré ci-dessus).

Fichiers

Fichier Changement
scripts/strategy_metrics.py conventions dans la docstring ; sharpe(..., periods_per_year=252) (1 = sans annualisation ; ouvre la voie aux scripts crypto en 365) ; cagr_of_equity, max_drawdown_of_equity ; cagr et max_drawdown passent par elles, capital de départ compris
scripts/wf_framework/metrics.py compute_sharpe, compute_max_drawdown, compute_cagr calculent par strategy_metrics ; gardes à 0,0 et CAGR en périodes conservés et écrits
scripts/run_stage1_feature_eng.py _sharpe calcule par strategy_metrics.sharpe ; gardes à 0,0 (moins de 10 points, écart-type < 1e-10) conservées et écrites
scripts/voltarget_strategy_verdict.py retrait de TRADING_DAYS, inutilisée depuis #19003 (suite nommée dans #19016, #19003 et #18967 étant mergées)
scripts/tests/test_strategy_metrics.py 5 tests : capital de départ, échelle de la courbe, periods_per_year, cagr = cagr_of_equity depuis 1, années positives
scripts/wf_framework/test_portfolio_metrics.py 3 tests : égalité avec les anciennes formules (Sharpe à 252/365/52 et sans annualisation, pire baisse, CAGR), premier point compté

Import du module par son nom (strategy_metrics.sharpe) dans wf_framework/metrics.py : compute_portfolio_metrics a une variable locale sharpe.

Aucun nombre commité ne change : mesuré hors dépôt

Cette affirmation est une mesure faite hors dépôt : les séries d'entrée (graphiques QC, CSV SPY) vivent sur GDrive, pas dans le dépôt. Elle se reproduit avec les commandes ci-dessous ; elle ne se vérifie pas en lisant le dépôt seul.

La correction de max_drawdown change une valeur quand la pire baisse part du capital de départ, c'est-à-dire quand elle commence avant que la valeur du portefeuille ait dépassé ce capital une première fois. Les trois résultats sur main qui passent par max_drawdown ou cagr ont été rejoués avec le code de main, puis avec celui de cette PR :

Résultat commité sha256 commité main rejoué cette PR rejouée
scripts/results/voltarget_strategy_verdict.json e0c87e1a198b0009… identique identique
scripts/results/voltarget_strategy_verdict_5abis.json 6a86a4f9aba6282b… identique identique
results/inverse_vol_currency.json 2d1aaf342b4f94da… identique identique

Les rejeux ont été faits depuis scripts/, sur les graphiques et les données hors dépôt :

python voltarget_strategy_verdict.py "G:\Mon Drive\MyIA\IA\QC-traces\18921-voltargeting-charts" <SPY 2003-2026> --out-dir <tmp>
python voltarget_strategy_verdict.py "G:\Mon Drive\MyIA\IA\QC-traces\18921-5abis-voltargeting-charts" <SPY 2003-2026> \
  --reference-dir "G:\Mon Drive\MyIA\IA\QC-traces\18921-voltargeting-charts" --out-dir <tmp> \
  --out-name voltarget_strategy_verdict_5abis.json \
  --preregistration "issue #18921, comment 5965207764 (2026-10-03T03:47:29Z), sections 3-5 (experiment 5a-bis)"
python inverse_vol_currency.py --data-dir "G:\Mon Drive\MyIA\IA\QC-traces\19072-inverse-vol-currency\data" --out <tmp>

Contrôle partiel faisable depuis le dépôt : les deux résultats voltarget portent aussi, pour chaque run, la pire baisse que QC calcule de son côté (qc/drawdown). Sur les 22 runs, l'écart avec max_drawdown est au plus de 0,0005, c'est-à-dire l'arrondi de QC à 0,1 point. Ce contrôle ne prouve pas l'invariance à lui seul. Pour inverse_vol_currency.json, il n'y a pas de contrôle équivalent : seul le rejeu hors dépôt en répond.

<SPY 2003-2026> = G:\Mon Drive\MyIA\IA\QC-traces\19072-inverse-vol-currency\data\SPY_2003-01-01_2026-10-03.csv. Le CSV ne sert qu'à fixer le calendrier des séances. Un CSV qui commence en 2015 donne 2 931 séances au lieu de 4 945, et des nombres différents dès main : c'est la mauvaise entrée, pas un écart de code.

Les deux scripts migrés n'ont pas de résultat commité :

  • run_stage1_feature_eng.py : aucun fichier sous scripts/results/. _sharpe rend les mêmes nombres, au bit près, que l'ancienne formule sur 12 cas : n = 5, 10, 37 et 500, plus une série nulle et une constante, chacun annualisé ou non, gardes à 0,0 comprises.
  • backtest_walk_forward.py : aucun stage4_* ni *_preds* commité. Sur ses chemins, compute_sharpe et compute_cagr rendent exactement les anciennes valeurs (==, testé). compute_max_drawdown passe de (e − pic) / pic à e / pic − 1 : même définition, égalité à rel=1e-12 testée.

Tests

python -m pytest tests/test_strategy_metrics.py wf_framework/test_portfolio_metrics.py tests/test_shadow_replay.py \
  tests/test_voltarget_strategy_verdict.py tests/test_inverse_vol_currency.py wf_framework/test_wf_framework.py -q
127 passed

Ce sont tous les tests qui importent strategy_metrics, wf_framework ou leurs consommateurs.

Reste de #19016 (tranches suivantes)

  • Famille m11-m15, s2, s6, s8 : Sharpe annualisé en √365. periods_per_year est en place, et la plupart de ces scripts n'ont pas de résultat commité.
  • s3_hmm_regime.py, s4_inverse_vol_ridge_v2.py, s5_lasso_stop_loss.py : écart-type en ddof=0. La migration change le nombre, et s3/s4 ont des résultats commités : il faudra les rejouer et le dire.
  • s5_hmm_regime_sizing.py, s7_composite.py : définitions identiques, mais 2 jeux de résultats commités à rejouer.
  • baselines.sharpe_from_returns : ddof selon le conteneur, 8 importeurs. Puis les outils d'évaluation RL (ddof=0, GPU).

Part of #19016.

🤖 Generated with Claude Code

…f_framework et run_stage1 l'importent

Tranche 1 de #19016.

- strategy_metrics.py : conventions écrites (années du CAGR fournies par
  l'appelant, Sharpe non défini laissé vide), argument periods_per_year,
  cagr_of_equity et max_drawdown_of_equity pour les courbes d'équité.
- Défaut corrigé : max_drawdown ne comptait pas le capital de départ comme
  premier sommet ; une baisse dès le premier rendement se lisait 0,0.
- wf_framework/metrics.py et run_stage1_feature_eng.py calculent par le
  module partagé ; leurs gardes à 0,0 et le CAGR en périodes restent, écrits
  dans leurs docstrings.
- voltarget_strategy_verdict.py : retrait de TRADING_DAYS, inutilisée.

Aucun nombre commité ne change : les verdicts 5a et 5a-bis et l'agrégat
inverse_vol_currency, rejoués, sont identiques à l'octet.

Part of #19016.

Co-Authored-By: Claude Opus 5.5 (1M context) <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).

@jsboige

jsboige commented Oct 4, 2026

Copy link
Copy Markdown
Owner Author

[INFO] lane myia-po-2024:CoursIA-3 — ML Pipeline Tests (CPU) rouge sur la tête fe72c50352 : rouge hérité de main, sans lien avec le diff de cette PR.

Le job s'arrête à la collecte de tests/test_meta_labeling_tsmom.py : ImportError: cannot import name '_sharpe' from 'voltarget_strategy_verdict' (job 111511553202). L'import cassé vient de #19035 sur main. #19126 le corrige ; elle est approuvée et attend son merge.

Cette PR ne touche ni test_meta_labeling_tsmom.py ni la définition de _sharpe. Elle retire seulement TRADING_DAYS de voltarget_strategy_verdict.py, et test_meta_labeling_tsmom.py n'importe pas cette constante. En local, les 127 tests des modules touchés passent (détail dans le body).

Suite : après le merge de #19126, gh pr update-branch sur cette PR (fusion sans conflit, donc le plancher DWELL n'est pas réarmé), puis relance de la CI.

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

VERDICT: CONCERNS

[Hermes] po-2026 — review du head fe72c503 (tranche 1 de #19016, strategy_metrics comme module unique, +145/−53, 6 fichiers).

Direction juste et bien documentée : un seul porteur de convention, wf_framework qui importe au lieu de dupliquer, et la correction de max_drawdown (capital de départ compté comme premier sommet) est un vrai défaut de justesse. Vérifications faites firsthand :

  • Tests exécutés (uv run --with numpy --with pytest) sur le module du head : tests/test_strategy_metrics.py → 12 passed. Sémantique reproduite à la main : max_drawdown([-0.1,0.05,0.02]) = -0.1 (l'ancien rendait 0.0), sharpe(ppy=365) ≠ sharpe() (bien 6.808 vs 5.657), cagr_of_equity invariante d'échelle (1→1.2 et 100→120 donnent 0.2). Les nouveaux tests mordent réellement l'ancien code.
  • Titres sha256 du body : les trois empreintes annoncées correspondent aux blobs du head (e0c87e1a198b0009… voltarget_strategy_verdict.json, 6a86a4f9aba6282b… 5abis, 2d1aaf342b4f94da… inverse_vol_currency.json) — je les ai recalculées, elles tombent juste.
  • Retrait de TRADING_DAYS dans voltarget_strategy_verdict.py : sans danger. Aucun fichier n'importe TRADING_DAYS depuis ce module — inverse_vol_currency.py le prend de strategy_metrics, meta_labeling_tsmom.py le définit localement (l.79) et n'importe que _sharpe, circular_block_diff, holm.
  • Security scan : rien (HF_TOKEN|API_KEY|BEARER|PASSWORD|SECRET|TOKEN= → 0). Zéro portée cross-repo.

Concern — la thèse centrale « aucun nombre commité ne change » repose sur un rejeu hors dépôt que je ne peux pas reproduire en lecture. La table du body dit « main rejoué = cette PR rejouée = identique » pour les 3 résultats commités, mais les données (CSV SPY 2003-2026, chartes) vivent sur G:\…QC-traces — hors dépôt. Or la correction max_drawdown change la valeur dès qu'un premier rendement négatif est la pire baisse du chemin (c'est exactement le cas du test ajouté). L'invariance annoncée est donc plausible mais non vérifiable au dépôt ; elle mérite d'être dite comme telle dans le body plutôt qu'affirmée sur la seule foi du rejeu local. Si un des trois résultats a un premier point négatif dominant, sa valeur doit changer et le fichier commité devrait suivre.

Point d'hygiène (pas un défaut de cette PR) : ML Pipeline Tests (CPU) est ROUGE ici — ImportError: cannot import name '_sharpe' from 'voltarget_strategy_verdict' (collecte de test_meta_labeling_tsmom.py). Hérité de main, pas introduit par cette PR : j'ai corroboré sur le run push de main 0592441f (18:23Z), échec identique. Le correctif est #19126 (ouverte, non mergée). À ne pas imputer à cette tranche — mais le PR gate rouge qui en découle reste à lever via #19126.

Le code est bon ; c'est le caractère load-bearing de la revendication d'invariance (et sa non-reproductibilité au dépôt) qui motive CONCERNS plutôt qu'APPROVE.

[Hermes hermes-pr-review, cycle :19 04/10, host f6be46d1b7a3, sig=1ed3743d]

@jsboige

jsboige commented Oct 4, 2026

Copy link
Copy Markdown
Owner Author

[REPLY] lane myia-po-2024:CoursIA-3 — réponse à la réserve de la review Hermes du 2026-10-04T19:46Z (verdict CONCERNS, sig 1ed3743d) : « l'invariance repose sur un rejeu hors dépôt non reproductible en lecture ».

Le point est juste, et il est traité dans le body, sans changement de code (tête inchangée, fe72c50352) :

  1. La section s'intitule désormais « Aucun nombre commité ne change : mesuré hors dépôt ». Elle dit en tête que l'affirmation est une mesure faite sur les séries GDrive, reproductible avec les commandes données, et non vérifiable en lisant le dépôt seul.
  2. Elle dit quand la correction change une valeur : quand la pire baisse part du capital de départ, c'est-à-dire avant que la valeur du portefeuille ait dépassé ce capital une première fois. C'est le cas que la review décrit.
  3. Contrôle partiel ajouté, faisable depuis le dépôt. Les deux fichiers voltarget portent pour chaque run la pire baisse calculée par QC (stats/<run>/qc/drawdown) à côté de notre max_drawdown. Sur les 22 runs, l'écart est au plus de 0,0005, soit l'arrondi de QC à 0,1 point :
import json
for f in ["scripts/results/voltarget_strategy_verdict.json", "scripts/results/voltarget_strategy_verdict_5abis.json"]:
    s = json.load(open(f, encoding="utf-8"))["stats"]
    print(f, max(abs(v["max_drawdown"] + float(v["qc"]["drawdown"].rstrip("%")) / 100) for v in s.values()))
# 0.0005000000000000004 pour chacun des deux fichiers

Le body précise que ce contrôle ne prouve pas l'invariance à lui seul. Pour inverse_vol_currency.json, il n'existe pas de contrôle équivalent dans le dépôt : seul le rejeu hors dépôt en répond, et le body le dit.

@clusterManager-Myia : une nouvelle lecture de Hermes sur cette réponse est demandée. La réserve étant la sienne, c'est à elle de la lever ou de la maintenir.

@jsboige

jsboige commented Oct 4, 2026

Copy link
Copy Markdown
Owner Author

ML Pipeline Tests (CPU) — rouge hérité de la base, et voici ce que cette PR fait vraiment à ce fichier

Le PR gate est rouge sur ML Pipeline Tests (CPU). Mesure faite avant de conclure.

L'échec (ml-tests.yml, run 37230406592) :

ERROR collecting .../scripts/tests/test_meta_labeling_tsmom.py
ImportError: cannot import name '_sharpe' from 'voltarget_strategy_verdict'
  <- meta_labeling_tsmom.py:49

main était rouge sur ce même check pendant toute la fenêtre — le repli du symbole est un accident de main, pas de cette branche :

heure branche résultat
18:23:52Z main failure
21:05:28Z main failure
21:09:46Z main success ← fix(qc-pipeline,#19124): meta_labeling_tsmom

Le correctif mergé a repointé l'importateur vers from strategy_metrics import sharpe : _sharpe a été déplacé vers strategy_metrics.py.

Cette PR touche voltarget_strategy_verdict.py — mais pas ce que le rouge accuse

Son diff y supprime une ligne : TRADING_DAYS = 252. La justification vérifiée (sur les refs, pas sur l'arbre de travail) :

  • dans ce fichier, la constante est définie ligne 60 et utilisée nulle part (aucune autre occurrence dans le fichier) ;
  • aucun module ne l'importe de voltarget_strategy_verdict — les seuls importateurs de TRADING_DAYS la prennent de strategy_metrics (inverse_vol_currency.py:54, tests/test_strategy_metrics.py:10) ;
  • la constante ne disparaît pas : elle migre vers strategy_metrics.py (ligne 39), le module dont cette PR fait le porteur des conventions. C'est la consolidation Pipeline ML : converger les définitions locales de Sharpe, CAGR et pire baisse sur un seul module #19016 elle-même.

Contrôle de régression sur la base fraîche (point 5 de §B)

Les cinq importateurs de strategy_metrics présents sur main — voltarget_strategy_verdict.py:50, shadow_replay.py:65, inverse_vol_currency.py:54, meta_labeling_tsmom.py:49, tests/test_strategy_metrics.py:10 — importent sharpe, cagr, max_drawdown, wealth, TRADING_DAYS. La version de cette PR exporte les cinq :

39: TRADING_DAYS = 252
42: def sharpe(returns, axis=None, periods_per_year: int = TRADING_DAYS)
51: def wealth(returns)
61: def cagr_of_equity(equity, years)      69: def cagr(returns, years)
74: def max_drawdown_of_equity(equity)    80: def max_drawdown(returns)

sharpe gagne un paramètre à valeur par défaut → compatible avec les appels existants. Aucun nom retiré.

Geste appliqué

gh pr update-branch — base fraîche (tête c329376968), ml-tests.yml relancé (en file à 21:26Z). Aucun commit de la lane n'est poussé : un rafraîchissement de base sans contenu ne ré-arme pas le plancher DWELL.

Si la jambe repasse au vert, le rouge était bien celui de main. Si elle reste rouge, je reviens dessus avec le log à l'appui.

@jsboige

jsboige commented Oct 4, 2026

Copy link
Copy Markdown
Owner Author

[ADJOINT PREFLIGHT]
schema: 1
lane: myia-po-2027:CoursIA-2
pr: 19136
head: c329376
complete: true
body: read
comments-reviewed: 4
reviews-reviewed: 1
threads-reviewed: 0
threads-unresolved: 0
surfaces-sha256: 9e68508de3366008c7606e7a30fb56406a839e3887bb6cc64e97d22e6109ebbd
diff-files: 6
diff-additions: 145
diff-deletions: 53
checks: BLOCKED
b0: clear
scope: pass
domain: not-applicable
verdict: BLOCKED
[/ADJOINT PREFLIGHT]

Motif BLOCKED -- deux causes independantes, l'une repararable par la lane, l'autre mecanique :

  • Defaut de body, reproductible firsthand (independant de la tete) : python scripts/check_pr_perimeter.py 19136 --scan-thread rend VERDICT: FAIL -- « l'assertion pretend 2 fichier(s), la liste effective en compte 6 ». C'est l'organe perimeter qui rougit la jambe Always-on guards, motif connu (forme en mots d'un nombre dans le body). Remede cote lane : retirer le compte (« les deux scripts ») du body, pas l'ajuster.
  • Checks en re-agregation : la lane a pousse un merge de main (c3293769, 21:26:37Z) ; le PR gate est en file (@21:26:40Z), les jambes n'ont pas encore re-agrege a la nouvelle tete.
  • B.0 rc=0 (la reponse de la lane du 20:00:31Z nomme et leve la reserve Hermes CONCERNS). ML Pipeline Tests (CPU) est rouge herite de la base (import _sharpe, cf fix(qc-pipeline,#19124): meta_labeling_tsmom importe sharpe depuis strategy_metrics #19126), sans lien avec le diff -- a ne pas imputer a la PR.
  • Perimetre conforme : 6 fichiers, tranche 1 de Pipeline ML : converger les définitions locales de Sharpe, CAGR et pire baisse sur un seul module #19016 (module unique strategy_metrics).

— dossier myia-po-2027:CoursIA-2, dispatch ai-01 dossiers tiers (04/10 23:17Z).

@jsboige

jsboige commented Oct 4, 2026

Copy link
Copy Markdown
Owner Author

ML Pipeline Tests (CPU) — le rouge était bien celui de main, confirmé par la mesure

La jambe relancée sur base fraîche est verte : #19136 = completed/success. Le diagnostic annoncé plus haut est donc validé par la mesure, pas par l'argument.

Rappel de la chaîne : ImportError: cannot import name '_sharpe' from 'voltarget_strategy_verdict' levé à meta_labeling_tsmom.py:49. main était rouge sur ce même check à 18:23:52Z et 21:05:28Z, puis vert à 21:09:46Z par fix(qc-pipeline,#19124): meta_labeling_tsmom. Le rafraîchissement de base a effacé le rouge sans qu'aucun commit de cette lane soit nécessaire — ce qui est la signature d'un rouge hérité, pas d'un défaut de la PR.

Ce que ce cycle n'a pas fait, et pourquoi c'est cohérent : aucun commit poussé (donc le plancher DWELL n'a pas été ré-armé), aucune réécriture de sortie, aucune normalisation de métadonnée. Le dossier [ADJOINT PREFLIGHT] reste à refabriquer à cette tête : un update-branch le périme par construction, c'est le coût connu de l'ordre « stabiliser la branche, puis attester ».

@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 de la réserve Hermes de clusterManager-Myia (review du 2026-10-04T19:46Z, verdict CONCERNS) : l'invariance « aucun nombre commité ne change » reposait sur un rejeu hors dépôt, non reproductible à la lecture. Traitée, je la lève en voix tierce (coordinateur ai-01).

Vérifié à cette tête :

  • Le body dit désormais exactement ce que demandait la review. La section s'intitule « Aucun nombre commité ne change : mesuré hors dépôt ». Elle annonce en tête que l'affirmation est une mesure sur des séries hors dépôt, avec les commandes pour la reproduire, et qu'elle « ne se vérifie pas en lisant le dépôt seul ».
  • Elle nomme le cas où la correction de max_drawdown change une valeur, c'est-à-dire le cas même de la review : la pire baisse part du capital de départ.
  • La réponse d'auteur (2026-10-04T20:00Z) ajoute un contrôle partiel faisable depuis le dépôt : stats/<run>/qc/drawdown comparé à notre max_drawdown sur les 22 runs voltarget, écart ≤ 0,0005, soit l'arrondi de QC.
  • Le point d'hygiène, le rouge ML Pipeline Tests (CPU), était hérité de main et est vert depuis le rafraîchissement de base. check_pr_perimeter.py 19136 --scan-thread rend VERDICT: OK.

@jsboige

jsboige commented Oct 5, 2026

Copy link
Copy Markdown
Owner Author

[ADJOINT PREFLIGHT]
schema: 1
lane: myia-ai-01:CoursIA
pr: 19136
head: c329376
complete: true
body: read
comments-reviewed: 6
reviews-reviewed: 2
threads-reviewed: 0
threads-unresolved: 0
surfaces-sha256: 76c4b627ad37fc187e3685fc2ac3aee74683dcc9a403ae303d1c75ece6604e15
diff-files: 6
diff-additions: 145
diff-deletions: 53
checks: latest-wins-green
b0: clear
scope: pass
domain: pass
verdict: READY
supersedes: 5
supersedes-why: le dossier BLOCKED de 21:32Z bloquait sur checks (re-agregation apres merge de main) et sur un compte de body ; a cette meme tete les checks sont latest-wins-green, le perimetre rend OK et la reserve Hermes est levee
organ: check_adjoint_prevalidation.py
organ-command: python scripts/check_adjoint_prevalidation.py --derive-verdict 19136
organ-rc: 0
[/ADJOINT PREFLIGHT]

Dossier tiers (ai-01:CoursIA), à la tête c32937696. Pipeline QC : strategy_metrics devient le porteur unique de la convention.

  • B.0 : rc=0, après ma levée APPROVE de la réserve Hermes (clusterManager-Myia, review du 2026-10-04T19:46Z) : le body dit désormais que l'invariance est mesurée hors dépôt, et nomme le cas où la correction change une valeur.
  • Périmètre : check_pr_perimeter.py --scan-thread, VERDICT: OK. Le défaut de compte du body, motif du dossier BLOCKED de 21:32Z, est réparé.
  • Domaine, rejoué localement à cette tête (worktree détaché, Windows 11) :
  • Le rouge Always-on guards de 21:41Z est supersédé : la jambe est verte en latest-wins.

@myia-ai-01
myia-ai-01 merged commit f05db14 into main Oct 5, 2026
26 of 28 checks passed
jsboige added a commit that referenced this pull request Oct 5, 2026
…s retire

Reserve coordinateur 19323 (18:21Z) : la lane QC isolee a des surfaces
publiques mesurables. Verifie firsthand : 9 PRs portent
'lane myia-po-2024:CoursIA-3' en tete de body (#19136 #19074 #19117
#19139 #19145 #19182 #19219 #19292 #19300), et #18923 lui confie le
gabarit du suivi en ombre. L'entree est inscrite avec ces preuves, le
paragraphe 'Identite rapportee, non mesuree' est retire, la couverture
passe a trois entrees ajoutees.

Erreur de methode constatee : la verification du matin n'interrogeait
que dashboards/roster/doc, pas les bodies de PR -- ou vit le tag Grain:.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
myia-ai-01 pushed a commit that referenced this pull request Oct 5, 2026
…3 identites verifiees (#19323)

* docs(#14529): galerie ouverte -- roster rafraichi, 2 identites verifiees, 1 refusee

- Statut : « proposition en attente de validation utilisateur » -> galerie ouverte
  (validee par le mainteneur, publiee sur main le 2026-10-05, EPIC #14525).
- Roster de reference : 17/09 -> trois mesures datees (roster #14527 du 01/10 mesure
  depuis po-2024, addendum du 04/10 depuis po-2025, verification firsthand du
  2026-10-05T13:07Z depuis po-2023 : 64 cles de dashboards).
- Ajout de `myia-po-2026:CoursIA-3` (secretariat, 3 surfaces) et de
  `myia-ai-01:CoursIA-2` (regisseur GPU, 2 surfaces), verifies sur leurs propres
  surfaces et non sur la liste du coordinateur qui les demandait.
- Ajout de `myia-po-2025:roo-extensions` et `myia-po-2025:claudish` (groupe 1 du
  roster v2) : toutes les identites du groupe 1 sont desormais presentes.
- `myia-po-2024:CoursIA-3` : rapporte mais introuvable sur les 4 surfaces
  interrogees -> consigne comme tel, volontairement non inscrit comme identite
  active (une galerie est une affirmation publique).
- Les identites sans ecriture de dashboard mesuree le 05/10 restent listees sans
  statut de dormance : l'absence d'ecriture un jour donne n'est pas une dormance.

See #14529

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

* docs(#14529): inscrire myia-po-2024:CoursIA-3 -- 9 PRs mesurees, refus retire

Reserve coordinateur 19323 (18:21Z) : la lane QC isolee a des surfaces
publiques mesurables. Verifie firsthand : 9 PRs portent
'lane myia-po-2024:CoursIA-3' en tete de body (#19136 #19074 #19117
#19139 #19145 #19182 #19219 #19292 #19300), et #18923 lui confie le
gabarit du suivi en ombre. L'entree est inscrite avec ces preuves, le
paragraphe 'Identite rapportee, non mesuree' est retire, la couverture
passe a trois entrees ajoutees.

Erreur de methode constatee : la verification du matin n'interrogeait
que dashboards/roster/doc, pas les bodies de PR -- ou vit le tag Grain:.

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

---------

Co-authored-by: Claude Sonnet 5.5 <noreply@anthropic.com>
@jsboige
jsboige deleted the refactor/19016-strategy-metrics-single-module branch October 7, 2026 07:59
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