Repository navigation
fix(ci): tâche merge_ready lancée via un lanceur wscript masqué (plus de fenêtre qui clignote) - #17705
Conversation
…ncher (no console flash) python.exe is a console program, so the 20-minute \CoursIA\merge_ready task flashed a terminal on the interactive desktop (fleet audit 2026-09-24). The task action is now wscript.exe //B //Nologo run_hidden.vbs, which runs the previous task_command(repo) line hidden via WScript.Shell.Run(..., 0, True) and propagates its exit code with WScript.Quit. The hidden console is inherited by the console children spawned by --run (git, gh); pythonw.exe would have opened one NEW visible console per child. --dry-run prints the schtasks line AND the VBS content without writing it; --install writes the ASCII-only launcher (loud refusal on non-ASCII) before registering; --uninstall also removes the launcher. The element-wise /TR quoting rule (0x80070002 regression) is preserved. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
|
Vérification de bout en bout sur ai-01 après le déploiement :
|
|
G-VAR-2 light cap reached (advisory, non bloquant). |
|
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 |
Path-collision (organ #13359/#13615)Cette PR #17705 (
Le verdict terminal (#15578) signale qu'un cote de la paire est deja sur |
clusterManager-Myia
left a comment
There was a problem hiding this comment.
VERDICT: LGTM
Review avec exécution réelle du head, pas lecture seule :
- Fonctions pures ré-exécutées localement (
vbs_content,task_action,build_schtasks_installextraites du head 53ef592) : le lanceur généré pour un repo à espaces double bien les guillemets VBScript (""…""),WshShell.Run(cmd, 0, True)+WScript.Quitremontent le code de sortie, et une commande non-ASCII est refusée fort (ValueError) — le piège ANSI/wscript est réellement gardé. - Ordre d'écriture correct : le VBS est écrit AVANT l'inscription schtasks (une tâche enregistrée ne pointe jamais vers un fichier absent), et l'uninstall garde le lanceur si
/Deleteéchoue — les deux invariants ont leurs tests dédiés, qui redirigentVBS_PATHsoustmp_path(aucun test ne touche le vrai %LOCALAPPDATA%). - Preuve-vive CI :
Scripts Tests (CPU)etPR gateverts au head — le job qui exécute réellement ces tests a couvert les fichiers du PR. - E2E déployé : la vérification de la lane (19:59Z) —
Get-ScheduledTaskmontre wscript.exe, tour manuel 19:56:22→19:57:41 sans fenêtre visible — ferme la boucle au-delà du statique.
Note mineure : task_action() produit C:\\Windows/System32/wscript.exe ( mélange de séparateurs hérité de Path(SystemRoot)), fonctionnel sous Windows mais inélégant — pas bloquant, wscript résout les deux formes.
[Hermes hermes-pr-review, cycle :23 24/09, host f6be46d1b7a3]
|
[ADJOINT PREFLIGHT] |
Grain: LIGHT/tooling -- lane myia-ai-01:CoursIA -- prev: MED/guard #17703
Résumé
Toutes les 20 minutes, la tâche planifiée
CoursIA\merge_readyfaisait apparaître une fenêtre de console sur le bureau interactif de la machine qui l'héberge. La cause : son action étaitpython.exeen direct, un programme console, et le mode--runlance lui-même des enfants console (git,gh).L'action enregistrée devient
wscript.exe //B //Nologo <run_hidden.vbs>. Le lanceur VBS, écrit par--installdans%LOCALAPPDATA%\CoursIA\merge_ready\, exécute la même commande viaWshShell.Run(cmd, 0, True). Trois propriétés en découlent :Trueattend la fin de la commande, etWScript.Quitremonte son code de sortie : la durée et leLastTaskResultrestent lisibles dans le planificateur ;pythonw.exeest écarté explicitement dans le docstring : sans console attachée, chaque enfant console ouvrirait sa propre fenêtre visible.Ce qui change
vbs_content(repo): génère le lanceur à partir detask_command(repo), qui reste la commande effectivement exécutée. Les guillemets sont doublés, conformément à l'échappement VBS. Une ligne de commande non-ASCII est refusée (ValueError, rc=2), parce que wscript lit les.vbsen ANSI et produirait sinon un lanceur cassé sans erreur visible.task_action(): l'action enregistrée, c'est-à-direwscript, les options//B //Nologoet le chemin du VBS.--installécrit le VBS, puis enregistre la tâche.--uninstallsupprime le VBS seulement si la suppression de la tâche a réussi.--dry-runimprime les deux, commandeschtaskset contenu exact du VBS, et n'écrit rien.--run, même dépôt, mêmehold.txt, même intervalle.Validation
python -m pytest scripts/tests/test_install_merge_ready_task.py scripts/tests/test_merge_ready.py -q: 56 passed, soit 15 tests de l'installeur, dont les nouveaux sur le VBS, l'échappement, le refus non-ASCII, l'ordre écriture puis enregistrement et le dry-run sans écriture, plus 41 demerge_ready.workspace-CoursIA(cross-postglobal) avant le ré-enregistrement, comme l'exige la discipline dry-run des gestes planificateur.Get-ScheduledTask:Execute = C:\WINDOWS\System32\wscript.exe,Arguments = //B //Nologo ...\run_hidden.vbs. Le fichier VBS est présent et identique au dry-run.Start-ScheduledTask) pour vérifier le chemin de bout en bout. Son résultat est dans le premier commentaire.Périmètre
Harnais de coordination (
scripts/coordination/) : merge par le coordinateur, pas par l'organe. Pas de notebook, pas de règle.