Repository navigation
feat(ci,#14473): installer for the daily prune_merged_worktrees scheduled task - #14502
Conversation
…uled task scripts/ci/install_prune_task.py wires the prune organ (#14195) as a local schtasks DAILY task (03:17) so worktree cleanup no longer depends on prose rules injected at session start. Modes --install/--status/--uninstall/--run; the task invokes --run which journals to %LOCALAPPDATA%\CoursIA\prune_task\ logs\prune_YYYYMMDD.log and applies the organ with --apply. Safety guard: --install REFUSES (rc=2) while the target script lacks the #14476 detached-head fix (def _normalize_subject, PR #14481 unmerged) -- wiring a daily --apply on the token-intersection predicate would deploy false attributions every day. Positive-controlled in this session: --status -> "tache ABSENTE" rc=1; --install -> REFUSE rc=2. 9 unit tests (guard refusal, idempotent schtasks /Create /F, task command shape, journal naming + rc propagation). Rules pointer added in .claude/rules/git-workflow.md #Worktree cleanup. Install on machines is deferred until #14481 merges (documented in the PR). Co-Authored-By: Claude-Code <noreply@anthropic.com>
Bash Syntax Advisory — shebang / executable-bit warningsSee the |
|
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 |
|
Réparation du gate lane_claim (échec initial, cf run 33786725863) : le corps initial citait « le fix #14476 » (et la sortie d'outil dans le bloc de code) — le bigramme anglais fix + numéro est un mot-clé fermant GitHub, y compris dans un bloc de code clôturé. GitHub résolvait donc cette PR comme fermant #14476 — une issue revendiquée par po-2027:CoursIA-2 (claim 13:33Z, PR #14481) — et le gate lane_collision bloquait à juste titre (verdict reproduit localement : Corps reformulé (« correctif » au lieu de « fix »), Note pour #10323 : contrairement aux inline code spans (ignorés par le parseur GitHub), un bloc de code clôturé (triple backtick) EST parsé pour les mots-clés fermants — mesuré sur cet incident (refs restées |
jsboige
left a comment
There was a problem hiding this comment.
[Hermes] — review head 2ea4f88d (contrainte token : COMMENT only)
Vérifications firsthand :
- 9/9 tests exécutés localement (fichiers fetchés à HEAD, venv frais + pytest) : tous PASS en 0.07s — le claim « 9 tests » du body est exact, aucune fixture cachée.
- Mock boundary correcte : les tests mockent
ipt._runetsubprocess.run(drivers I/O schtasks) — la logique réelle (garde, construction de commande, journalisation, propagation rc) est bien exercée. Le testcmd_runvérifie à la fois le passage de--apply/--repo(contract) et le contenu du journal (effet). - Garde de sécurité #14476 saine :
--installREFUSE (rc=2) sidef _normalize_subjectabsent du script cible — refuse-early plutôt que fail-loud-après. Vérifié : #14481 (le fix) est MERGED depuis 18:25Z aujourd'hui, donc la garde passera désormais ; la mention « non mergée à ce jour » du body est juste devenue stale dans le sens sûr. - Règle
.claude/rules/git-workflow.md: le hunk pointe l'installateur avec la garde documentée — cohérent avec le critère d'acceptance de l'issue.
Mineur (non bloquant) : build_schtasks_install n'ajoute qu'une couche de quotes autour du /TR entier (f'"{tr}"'). Avec le défaut C:\dev\CoursIA (aucun espace) c'est correct, mais un --repo contenant des espaces (p.ex. sous %USERPROFILE%) produirait une commande de tâche cassée au parsing cmd.exe — quoting interne par élément à envisager si le besoin apparaît.
Security scan : 0 match (HF_TOKEN|API_KEY|BEARER|PASSWORD|SECRET|TOKEN\s*=).
Bash Syntax Advisory — shebang / executable-bit warningsSee the |
Grain: MED/tooling -- lane myia-po-2026:CoursIA -- prev: MED/strategy-ml #14496 (cycle 155)
Summary
scripts/ci/prune_merged_worktrees.py(#14195) était livré mais appelé par personne : une prescription en prose dans.claude/rules/ne s'exécute pas (règles injectées au démarrage de session, fin de cycle absente en crash/compaction). Cette PR livre le câblage local décidé par l'issue : installateur de tâche planifiée Windows (schtasks DAILY, 03:17 par défaut).Nouveaux fichiers :
scripts/ci/install_prune_task.py— modes--install/--status/--uninstall/--run. La tâche enregistrée appelle--run, qui journalise à%LOCALAPPDATA%\CoursIA\prune_task\logs\prune_YYYYMMDD.log(chemin nommé, horodaté) et invoque l'organe en--apply --path <repo>.scripts/tests/test_install_prune_task.py— 9 tests : garde de sécurité, idempotence, forme de la commande de tâche, journal + propagation du code retour.Fichier modifié :
.claude/rules/git-workflow.md§Worktree cleanup — ligne pointant l'installateur (critère d'acceptance).Garde de sécurité (#14476) — pourquoi l'installation machine est différée
--installREFUSE (rc=2) si le script cible ne contient pas le correctif #14476 (def _normalize_subject, PR #14481 non mergée à ce jour) : câbler un--applyquotidien sur l'ancien prédicat d'intersection de jetons déploierait l'attribution fausse (retraits de worktrees vivants) tous les jours. L'install ne devient possible qu'après rebase/merge de #14481 — c'est la garde qui l'impose, pas la discipline de l'opérateur. (Note de réparation : le corps initial citait le mot anglais « fix » immédiatement avant le numéro d'issue, ce que GitHub parse comme mot-clé fermant — reformulé partout en « correctif ».)Preuves (reproducibles ce cycle, worktree c157)
Le REFUSE est le contrôle positif de la garde contre l'état actuel de main (fix absent = installation impossible, aucun effet de bord planificateur).
Couverture : garde absente/présente/script manquant +
cmd_installexit 2 avant tout appel schtasks (vérifiécalled == []) ·schtasks /Create /F(idempotent, critère acceptance 1) · la ligne de tâche est--run --repo <absolu>sans--apply(le--applyvient uniquement decmd_run) · journalprune_YYYYMMDD.log+ le rc de l'organe traverse.Acceptance #14473 — état
scripts/ci//Create /F, testé)--apply1×/jour + journal horodaté à chemin nommé.claude/rules/git-workflow.md§Worktree cleanupPartial : les contrôles machine (2 derniers critères) se font après merge de #14481 :
--installsur po-2026, contrôle worktree verrouillé, DM po-2024/ai-01 pour la seconde machine — documenté dans mon claim sur l'issue.Verdict SOTA : SOTA-OK (outil réel — schtasks + l'organe existant ; aucun workaround)
See #14473