Repository navigation
feat(genai-audio,#15604): capture page entiere par defaut — le code Strudel redevient visible - #21045
Conversation
…ideo filme editeur+canvas (critere 5a) Le recorder in-page historique (canvas.captureStream) ne filme que la visualisation : le code Strudel n'apparait jamais dans la video (constat c.6203472737, lecture visuelle indirecte + 0% tons moyens). Le critere 5a exige 'le code Strudel en cours d'evolution' -- la capture par defaut passe donc a record_video du contexte Playwright (page entiere : editeur + canvas, disposition native du REPL), fenetre utile extraite au mux par -ss/-t mesures a l'horloge du process. Le mode canvas reste disponible (--capture-mode canvas), garde webm < 10 Ko ajoutee. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Le run reel 180 s a revele que l'etape 6 relisait la webm BRUTE record_video (185,2 s : ~5 s de preambule chargement/play/warmup + 180 s utiles) alors que le mux capture_final.mp4 etait correctement trime (169,7 s borne par le WAV) : mix final 5 s trop long + fade_start decale (calcule sur 185,2 s). - capture_repl_session retourne trim_start dans son dict (None en mode canvas, offset monotonic en mode page) - mix_final_ffmpeg gagne video_trim_start : -ss avant l'input video, duration (donc fade) mesuree sur la fenetre utile - l'appelant etape 6 retranche trim_start du probe et passe le trim Tests : 85/85 (2 neufs : -ss avant -i + fade sur fenetre utile ; comportement historique sans trim inchange). Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
… page Le mix lisait la webm jusqu'a sa fin : la queue d'export (clics menu/export posterieurs a l'attente de capture, ~4 s) entrait dans le livrable — menu flash a pleine luminosite avant le fade. La fenetre utile est par definition capture_seconds : min() borne duration_v (donc -t et fade_start). Mesure du run 180 s : video 184,04 s au lieu de 180, clics export visibles a t=180,6. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Path-collision (organ #13359/#13615)Cette PR #21045 (
|
|
No organ-duplication: no added def/class collides with another series organ API (scripts/audit/organ_api_index.yaml). Detector: |
En CI sans playwright installe, la garde capture_mode inconnu mourrait en ModuleNotFoundError avant de tirer (import ligne 1316 precedait la validation ligne 1318) : test_capture_repl_session_rejette_mode_inconnu echouait sur Scripts Tests (CPU). La validation passe AVANT l'import -- le contrat 'echec explicite sans navigateur' tient aussi sans playwright. Verifie : suite 85/85 ; simulation CI (import playwright bloque) -> ValueError: capture_mode inconnu : 'autre' (page|canvas). Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
|
Rouge Vérifié : suite locale 85/85 passed ; simulation CI (import playwright bloqué par stub) → 🤖 Generated with Claude Code |
clusterManager-Myia
left a comment
There was a problem hiding this comment.
[Hermes] Review du head 583fcddf (re-vérifié après push du commit 583fcdd en cours de review) — capture page entiere par defaut (critere 5a #15604)
Suite de tests executee par mes soins sur le head exact (checkout des deux fichiers, pytest, kernel 3.14) : 85/85 passed — je confirme le compte du body. Les 7 tests neufs vérifient ce qui compte : -ss AVANT les inputs + -t APRÈS (position dans la liste d'arguments), formattage 3 décimales, -t = fenêtre utile et non durée brute (fade st=177.000 pour 180 s utiles avec probe 185.2 s — le défaut du premier run est bien couvert), défaut CLI = page silencieux, valeur hors choix rejetée, comportement historique sans trim inchangé.
Sémantique du trim vérifiée dans le source : run_pipeline retranche trim_start du probe puis borne à capture_seconds (max(0, …) / min(…)), la même valeur file vers mux_ffmpeg et mix_final_ffmpeg(video_trim_start=…) — mux et mix coupent bien la même fenêtre, l'audio démarre à 0 (export offline natif). Garde webm < 10 Ko en mode page : présente (recorded.stat().st_size < 10_000), et la webm n'est déplacée sous son nom canonique qu'après context.close() (finalisation) — cohérent avec le cycle de vie record_video. Le diagnostic du body (canvas seul ne filme jamais le code, par construction) est exact : canvas.captureStream(30) ne peut capter que le canvas.
Scan sécurité du diff : néant (la clé du run réel passe par agent_keyring côté lane, rien en clair ici).
Deux remarques mineures :
-
Ordre garde vs import — RÉSOLU en cours de review : le commit
583fcddf(00:17Z) remonte la gardecapture_mode not in ("page", "canvas")au-dessus de l'import playwright. Vérifié au nouveau head : 85/85 passed, et le test de garde passe même avec playwright masqué (import jamais atteint). Ma première mesure au head précédent (84/85 sans playwright) est donc soldée. -
Le claim du run réel (webm 20,1 Mo / 166 s, fenêtre
-ss 15.9+ 150 s, 11/11 segments) n'est pas reproductible depuis ce siège (gateway tts-multi + clé agent_keyring non disponibles ici) — je m'appuie sur les tests et le source ; les trois commits = trois corrections mesurées sont cohérents avec la sémantique du code.
La conception me convient : défaut = page réversible par --capture-mode canvas, fenêtre bornée par construction, garde d'échec explicite. Pas de réserve bloquante.
|
Le rouge 🤖 Generated with Claude Code |
|
[ADJOINT PREFLIGHT] |
myia-ai-01
left a comment
There was a problem hiding this comment.
Approbation ai-01 a la tete 583fcddf7b. Suite rejouee de mon cote dans un worktree a cette tete : 85 passed. Les deux remarques de la revue Hermes sont soldees : ordre garde/import corrige par 583fcddf ; le run reel n'est pas reproductible hors siege, c'est declare.
…re reelle depuis #21045) test_run_pipeline_transmet_duration_a_la_capture (#20700, merge 18/10 07:37Z) remplace capture_repl_session par un faux a la signature anterieure a #21045 (16/10), qui a ajoute capture_mode et le transmet depuis run_pipeline. Sur main d8b2009 : TypeError, Scripts Tests (CPU) rouge (1 failed, 19337 passed). Le faux reprend le parametre et son defaut reels ; l'assertion du test (capture_seconds == duration) est inchangee. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LRbWZZHE9jZscr8ya3niWA
…3 (+ re-attestation) et faux capture_repl_session sans capture_mode (#21284) * Fix(ci): renumerote l'index twin duplique sudoku-13-symbolicautomata (0024 x2 sur main) Deux attestations portaient le prefixe 0024 dans la paire Sudoku-13 : 0024-2026-10-14-claude-cloud-hors-flotte.yaml (ee3ea84, merge 17/10) et 0024-2026-10-14-hors-flotte-claude-session-16638.yaml (4bcb7f1, #20783, merge 18/10 sur un CI anterieur a ee3ea84). test_twin_registry_integrity ::test_audit_index_unique_and_no_identical_duplicates_per_pair rougit. Geste canonique de check_twin_index_collisions.py : le posterieur (le mien) cede l'index au premier index libre (max + 1 = 0026), par git mv pur. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LRbWZZHE9jZscr8ya3niWA * Fix(twin): re-attestation Sudoku-13 SymbolicAutomata a l'etat de main La derniere attestation (session 16638, 15/10) enregistre le C# 866ad19, anterieur a ee3ea84 (pont PythonNetLoader, C# b5163e3) : la paire sort DRIFT cote C# sur main. Parite verifiee a la main : depuis l'attestation cloud 0024 (Python 05e026e, C# b5163e3), le Python n'a change que dans 2 cellules markdown (accents, #20783) ; 11 cellules de code et leurs sorties identiques. Nouvelle attestation 0027 : Python ec5137a, C# b5163e3. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LRbWZZHE9jZscr8ya3niWA * Fix(test): le faux capture_repl_session accepte capture_mode (signature reelle depuis #21045) test_run_pipeline_transmet_duration_a_la_capture (#20700, merge 18/10 07:37Z) remplace capture_repl_session par un faux a la signature anterieure a #21045 (16/10), qui a ajoute capture_mode et le transmet depuis run_pipeline. Sur main d8b2009 : TypeError, Scripts Tests (CPU) rouge (1 failed, 19337 passed). Le faux reprend le parametre et son defaut reels ; l'assertion du test (capture_seconds == duration) est inchangee. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LRbWZZHE9jZscr8ya3niWA * Fix(test): ancre test_rename_with_modification_is_scanned sur un commit joignable depuis main Le test lisait le diff de ad0142c, commit de la branche de la PR ouverte #20246 (renum/12933-probas-tranche-a). Cette branche a ete reecrite le 18/10 a 09:05Z : ad0142c n'est plus joignable par aucune ref, un clone neuf (fetch-depth 0) ne le recupere plus et scan_diff rend une liste vide (Scripts Tests CPU, runner myia-ai-01-wsl-4 : unknown revision, 1 failed / 19337 passed). Nouvel ancrage : f42b570 (#20400, sur main), R099 IIT-01-IntroToPyPhi.ipynb -> IIT-01-IntroToPyPhi-Python.ipynb. Controle de mutation : avec --diff-filter=AM dans l'organe, le test redevient rouge. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LRbWZZHE9jZscr8ya3niWA --------- Co-authored-by: Claude <noreply@anthropic.com>
…rkdown (lot B) (#20593) * fix(notebooks,#20167): retire execution_count/outputs des cellules markdown (lot B) See #20167 (PR B sur 3). Correcteur livre par #20588 (PR A, commit a6d8584), applique ici sans modification. Seules les cles execution_count/outputs des cellules markdown sont retirees : aucune source et aucune sortie de cellule code modifiee, donc aucune re-execution due (C.2). Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LRbWZZHE9jZscr8ya3niWA * Fix(twin,#20167): re-attestation des 2 paires jumelles touchees par le retrait du schema markdown (lot B) Le retrait des champs execution_count/outputs des cellules markdown deplace le blob SHA de deux carnets appaires (ML-04-Evaluation cote C#, PyMC-15-Recommenders cote Python) : le gate Twin parity les voyait en DRIFT introduit. Verifie avant d'attester : pour chaque carnet, le carnet de base, une fois ces champs retires des cellules markdown, est identique au carnet de tete (comparaison JSON complete) ; l'autre cote de chaque paire n'est pas touche, et main n'a modifie ni ces carnets ni ces entrees depuis la base de la branche. Une ligne en tete de known_differences par paire, puis check_twin_parity.py --update --pair <nom> en dernier geste. Hors flotte : session cloud du mainteneur (exemption #17713). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LRbWZZHE9jZscr8ya3niWA * Fix(ci): renumerote l'index twin duplique sudoku-13-symbolicautomata (0024 x2 sur main) Deux attestations portaient le prefixe 0024 dans la paire Sudoku-13 : 0024-2026-10-14-claude-cloud-hors-flotte.yaml (ee3ea84, merge 17/10) et 0024-2026-10-14-hors-flotte-claude-session-16638.yaml (4bcb7f1, #20783, merge 18/10 sur un CI anterieur a ee3ea84). test_twin_registry_integrity ::test_audit_index_unique_and_no_identical_duplicates_per_pair rougit. Geste canonique de check_twin_index_collisions.py : le posterieur (le mien) cede l'index au premier index libre (max + 1 = 0026), par git mv pur. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LRbWZZHE9jZscr8ya3niWA * Fix(twin): re-attestation Sudoku-13 SymbolicAutomata a l'etat de main La derniere attestation (session 16638, 15/10) enregistre le C# 866ad19, anterieur a ee3ea84 (pont PythonNetLoader, C# b5163e3) : la paire sort DRIFT cote C# sur main. Parite verifiee a la main : depuis l'attestation cloud 0024 (Python 05e026e, C# b5163e3), le Python n'a change que dans 2 cellules markdown (accents, #20783) ; 11 cellules de code et leurs sorties identiques. Nouvelle attestation 0027 : Python ec5137a, C# b5163e3. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LRbWZZHE9jZscr8ya3niWA * Fix(twin): re-attestation Probas-15 Recommenders a l'etat fusionne avec main L'index 0025 de probas-15-recommenders est pris sur main par 0025-2026-10-13-myia-po-2027-CoursIA.yaml (#20513, 17/10 14:35). Mon attestation 0025 du 14/10 (Python 0a3673a, C# 5550bbe) est retiree : apres fusion, le C# est celui de main (594361f, renvois Sona markdown de #20513) et le Python celui de cette PR (cles execution_count/outputs retirees des cellules markdown). Les deux deltas sont markdown seul ; la parite attestee par main (0025, po-2027) et par cette PR se compose. Nouvelle attestation 0026 : Python 0a3673a, C# 594361f. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LRbWZZHE9jZscr8ya3niWA * Fix(test): le faux capture_repl_session accepte capture_mode (signature reelle depuis #21045) test_run_pipeline_transmet_duration_a_la_capture (#20700, merge 18/10 07:37Z) remplace capture_repl_session par un faux a la signature anterieure a #21045 (16/10), qui a ajoute capture_mode et le transmet depuis run_pipeline. Sur main d8b2009 : TypeError, Scripts Tests (CPU) rouge (1 failed, 19337 passed). Le faux reprend le parametre et son defaut reels ; l'assertion du test (capture_seconds == duration) est inchangee. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LRbWZZHE9jZscr8ya3niWA * Fix(test): ancre test_rename_with_modification_is_scanned sur un commit joignable depuis main Le test lisait le diff de ad0142c, commit de la branche de la PR ouverte #20246 (renum/12933-probas-tranche-a). Cette branche a ete reecrite le 18/10 a 09:05Z : ad0142c n'est plus joignable par aucune ref, un clone neuf (fetch-depth 0) ne le recupere plus et scan_diff rend une liste vide (Scripts Tests CPU, runner myia-ai-01-wsl-4 : unknown revision, 1 failed / 19337 passed). Nouvel ancrage : f42b570 (#20400, sur main), R099 IIT-01-IntroToPyPhi.ipynb -> IIT-01-IntroToPyPhi-Python.ipynb. Controle de mutation : avec --diff-filter=AM dans l'organe, le test redevient rouge. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LRbWZZHE9jZscr8ya3niWA --------- Co-authored-by: Claude <noreply@anthropic.com>
…code (#20829) * Docs(gametheory,#18053): place deux cellules markdown à côté de leur code GameTheory-02-NormalForm-Python : la cellule « Interprétation - Visualisations » (60a55803) lit les trois figures produites par la cellule plot_game_with_br (c9ac80b3). Elle était séparée de cette cellule par le titre de la section IESDS. Elle suit désormais directement la cellule de code. Verdict : CONFIRMED. GameTheory-17-MultiAgent-RL-Python : l'annonce « Implementation : Jeux matriciels » (560e3b53) suivait la classe MatrixGame (6a0a83ab) qu'elle annonce. Elle précède maintenant ce code. Verdict : CONFIRMED. Markdown seul : aucune cellule de code n'est modifiée ni déplacée, aucune sortie ni execution_count ne change, aucune ré-exécution. Le texte des cellules déplacées est inchangé. See #18053 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LRbWZZHE9jZscr8ya3niWA * Docs(twin,#18053): re-attestation des paires jumelles apres le deplacement de lectures (GameTheory-02, GameTheory-17) La modification de cette PR deplace le blob SHA de carnets enregistres dans le registre de parite. Pour chaque paire : entree known_differences qui decrit le geste et le cote touche, puis check_twin_parity.py --update --pair en derniere operation (cf #8957). Paires : gametheory-17-multiagent-rl gametheory-2-normalform check_twin_parity.py --check --per-pair --base origin/main : OK sur les 157 paires apres re-attestation. See #18053 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LRbWZZHE9jZscr8ya3niWA * Fix(ci): renumerote l'index twin duplique sudoku-13-symbolicautomata (0024 x2 sur main) Deux attestations portaient le prefixe 0024 dans la paire Sudoku-13 : 0024-2026-10-14-claude-cloud-hors-flotte.yaml (ee3ea84, merge 17/10) et 0024-2026-10-14-hors-flotte-claude-session-16638.yaml (4bcb7f1, #20783, merge 18/10 sur un CI anterieur a ee3ea84). test_twin_registry_integrity ::test_audit_index_unique_and_no_identical_duplicates_per_pair rougit. Geste canonique de check_twin_index_collisions.py : le posterieur (le mien) cede l'index au premier index libre (max + 1 = 0026), par git mv pur. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LRbWZZHE9jZscr8ya3niWA * Fix(twin): re-attestation Sudoku-13 SymbolicAutomata a l'etat de main La derniere attestation (session 16638, 15/10) enregistre le C# 866ad19, anterieur a ee3ea84 (pont PythonNetLoader, C# b5163e3) : la paire sort DRIFT cote C# sur main. Parite verifiee a la main : depuis l'attestation cloud 0024 (Python 05e026e, C# b5163e3), le Python n'a change que dans 2 cellules markdown (accents, #20783) ; 11 cellules de code et leurs sorties identiques. Nouvelle attestation 0027 : Python ec5137a, C# b5163e3. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LRbWZZHE9jZscr8ya3niWA * Fix(twin): re-attestation GameTheory-17 MultiAgent-RL a l'etat fusionne avec main L'index 0009 de gametheory-17-multiagent-rl est pris sur main par 0009-2026-10-13-claude-cloud-hors-flotte.yaml (a8ce3d8, 17/10 14:20), qui atteste le C# 1d61a1e (pont PythonNetLoader) face au Python 8b08221, celui de la base de cette PR. Mon attestation 0009 du 14/10 (Python 0883411, C# 2ba75ee) est retiree. Le delta Python de cette PR est un deplacement de 2 cellules de lecture markdown (12 cellules de code et leur ordre identiques) : la parite attestee par main se transporte. Nouvelle attestation 0010 : Python 0883411, C# 1d61a1e. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LRbWZZHE9jZscr8ya3niWA * Fix(test): le faux capture_repl_session accepte capture_mode (signature reelle depuis #21045) test_run_pipeline_transmet_duration_a_la_capture (#20700, merge 18/10 07:37Z) remplace capture_repl_session par un faux a la signature anterieure a #21045 (16/10), qui a ajoute capture_mode et le transmet depuis run_pipeline. Sur main d8b2009 : TypeError, Scripts Tests (CPU) rouge (1 failed, 19337 passed). Le faux reprend le parametre et son defaut reels ; l'assertion du test (capture_seconds == duration) est inchangee. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LRbWZZHE9jZscr8ya3niWA * Fix(test): ancre test_rename_with_modification_is_scanned sur un commit joignable depuis main Le test lisait le diff de ad0142c, commit de la branche de la PR ouverte #20246 (renum/12933-probas-tranche-a). Cette branche a ete reecrite le 18/10 a 09:05Z : ad0142c n'est plus joignable par aucune ref, un clone neuf (fetch-depth 0) ne le recupere plus et scan_diff rend une liste vide (Scripts Tests CPU, runner myia-ai-01-wsl-4 : unknown revision, 1 failed / 19337 passed). Nouvel ancrage : f42b570 (#20400, sur main), R099 IIT-01-IntroToPyPhi.ipynb -> IIT-01-IntroToPyPhi-Python.ipynb. Controle de mutation : avec --diff-filter=AM dans l'organe, le test redevient rouge. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LRbWZZHE9jZscr8ya3niWA --------- Co-authored-by: Claude <noreply@anthropic.com>
Grain: DEEP/genai -- lane myia-po-2023:CoursIA -- prev: LIGHT/docs #20992
Capture page entiere par defaut : le code Strudel redevient visible dans la demo (critere 5a, See #15604)
Diagnostic (mesure, pas intuition)
La QA du critere 5 du 15/10 ([DELIVERED] c.6199228008) etait mecanique. La lecture visuelle indirecte du 15/10 soir (c.6203472737 — sk-agent, oeil corrobore par contreseing PIL) etablit : la video ne montre AUCUN code. 7/7 frames sans caractere lisible, 0,0 % de tons moyens a 1280x1024 (du texte anti-aliase en produirait obligatoirement). Ce que la camera filme : le canvas de visualisation (piano-roll). Cause racine dans le design, pas dans le run : le recorder in-page cible
canvas.captureStream(30)sur le canvas seul — le code n'est JAMAIS filme, par construction. La QA mecanique du 15/10 (« >=3 etats perceptuels distincts ») corroborait donc des etats du CANVAS.Le critere 5a ecrit : « le code Strudel en cours d'evolution (au moins 3 etats visibles distincts au cours du temps) ».
Le fix
capture_repl_sessiongagnecapture_mode:page(DEFAUT)browser.new_context(record_video_dir=..., record_video_size=...)— Playwright filme la page entierecanvascanvas.captureStream+ MediaRecorder)En mode page,
record_videofilme TOUTE la duree de vie du contexte : chargement, clic play, warmup, capture, export WAV inclus. La fenetre utile s'en extrait par deux bornes appliquees au mux ET au mix final :-ss <offset>: offset mesure a l'horloge du process entre la creation du contexte et le debut de l'attente de capture (le mix final, qui relit la webm, recoit le meme-ss— le premier run a montre qu'il lisait autrement la webm BRUTE : 185,2 s livrees au lieu des 180 utiles, fade decale de 5 s) ;-t capture_seconds: la fenetre est par definitioncapture_seconds— sans cette borne, la queue d'export (clics menu/export posterieurs a l'attente, ~4 s) entrait dans le livrable (mesure : menu flash a pleine luminosite a t=180,6 du run 180 s).Garde webm < 10 Ko (equivalent de la garde « 0 octet / canvas immobile » du mode canvas). CLI :
--capture-mode {page,canvas}, defautpage.Preuves
-ssavant les inputs /-tapres, trim sans duree, defaut CLI = page, valeur hors choix rejetee, gardecapture_mode inconnuavant ouverture navigateur, trim mix-ssavant-ivideo + fade sur la fenetre utile, comportement historique sans trim inchange).--capture-seconds 150) : webm brute 20,1 Mo (166 s de vie du contexte) ; fenetre extraite-ss 15.9+ borne 150,0 s ; mix final video 149,96 s / audio 150,00 s, 11/11 segments TTS mixes, loudnorm -14 LUFS TP -1.5, fade coordonne 147-150 s. Deux runs intermediaires (180 s puis 30 s par omission du flag) ont chacun revele un defaut que les tests unitaires ne voyaient pas — les trois commits de la branche sont les trois corrections mesurees.Findings du run reel (mesures, honnetement)
capture_secondspar defaut = 30 : la premiere re-execution de ce fix a produit un mix de 27,7 s (36 cycles exactement) par omission du flag — comportement correct du pipeline, commande incomplete de l'operateur. Le defaut CLI reste 30 (pas de changement silencieux de contrat) ; la commande canonique de demo porte--capture-secondsexplicitement.Residuel nomme (honetete du livrable)
See #15604 (le critere 5a complet exige le residuel 1 ; cette PR en pose la fondation necessaire).
🤖 Generated with Claude Code