Skip to content

Fix(ci,#24700): le niveau d'elevation voyage dans l'XML au lieu d'un schtasks /Change - #24702

Merged
myia-ai-01 merged 1 commit into
mainfrom
fix/24700-runnerctl-task-runlevel
Nov 6, 2026
Merged

myia-ai-01 merged 1 commit into
mainfrom
fix/24700-runnerctl-task-runlevel

Conversation

@jsboige

@jsboige jsboige commented Nov 4, 2026

Copy link
Copy Markdown
Owner

Grain: MED/tooling — lane myia-po-2024:CoursIA — prev: LIGHT/lean #24428

task-install --apply bloquait une session elevee non interactive : l'appel schtasks /Change /TN <nom> /RL HIGHEST qui suivait la creation reclame le mot de passe du compte des lors que le principal differe de l'appelant, et le processus reste suspendu sur cette invite.

Mesure (2026-11-04, myia-po-2024, Windows 11 26300)

  1. XML ecrit (logs/controller-task.xml, UTF-16) et tache creee par /Create /XML ... /F : succes.
  2. Puis /Change /TN "CoursIA-Runner-Controller" /RL HIGHEST :
Entrez le mot de passe de jsboi pour executer la commande :
Erreur : Acces refuse.

Deux processus (parent + python) encore vivants apres 180 s, sans moyen de les terminer sans une seconde elevation — une fenetre UAC utilisateur consommee pour rien.

Correctif

  • <Principals><Principal id="Author"><RunLevel>HighestAvailable</RunLevel></Principal></Principals> voyage dans l'XML, a sa place dans l'ordre du schema (Triggers -> Principals -> Settings -> Actions).
  • L'appel /Change /RL HIGHEST est supprime ; l'installation se fait en un seul /Create.
  • UserId volontairement absent : le principal par defaut est le compte appelant, donc le script reste independant de la machine (aucun SID en dur).

Preuves

Verification Resultat
pytest scripts/tests/test_runner_controller.py 18 passed (16 avant, +2)
task-install dry-run non eleve {"planned_actions": ["create-scheduled-task"]}, rc=0
task-install --apply non eleve rc=2, requires an elevated session — echec sur le seul privilege (regle 2a)
/Create /XML <document> non eleve Erreur : Acces refuse.
Controle positif : meme document, <Principals> mal orthographie Le code XML de la tache contient un noeud inattendu. (13,5):Princippals: — l'erreur structurelle sort avant le controle de privilege, donc le Acces refuse du document valide prouve que sa forme est acceptee

Le controle positif est la piece qui manquait : sans lui, « Acces refuse » ne distinguerait pas « document valide, droit manquant » d'un refus rendu avant tout parsing.

Residuel

L'acceptance « tache creee et <RunLevel> relu par schtasks /query /xml » exige une session elevee ; elle est posee en attente (registre des verifications) et sera repliee des que la fenetre UAC aura ete accordee. L'issue reste donc ouverte : See #24700.

See #24700

@github-actions

github-actions Bot commented Nov 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).

@github-actions

github-actions Bot commented Nov 4, 2026

Copy link
Copy Markdown
Contributor

G-VAR-2/3 GENRE signals (advisory, non bloquant, #10020).
La lane `myia-po-2024:CoursIA` voit ces signaux actifs sur les mergees du jour (UTC 2026-11-04) :

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 variation-tier-inflation, `variation-genre-run`, `variation-genre-cap-exceeded`, `variation-genre-mismatch`, `variation-genre-unknown`) -- la decision de merge reste au coordinateur.

@jsboige

jsboige commented Nov 4, 2026

Copy link
Copy Markdown
Owner Author

Verification elevee faite — le correctif est mesure sur son effet, pas seulement sur sa forme.

Ce que le processus eleve rend lui-meme (lecture de meme portee, pas un jeton standard qui serait aveugle) :

ELEVATED=True
KILLED pid=44324 (python)
KILLED pid=54208 (powershell)
CREATE_EXIT=0
Operation reussie : la tache planifiee "CoursIA-Runner-Controller" a ete creee.
RUNLEVEL=HighestAvailable

Effet mesure apres creation — c'est la partie qui compte, la meme chaine causale que le defaut produisait a l'envers :

avant (sans <RunLevel>) apres
Dernier resultat: 1 a chaque minute Dernier resultat: 0
aucun controller.log produit C:\CoursIA-Runners\logs\controller.log, 684 o
echec avant lecture du secret (acces refuse) remote_online: true / action: noop -- runner already online

Autrement dit : la tache tourne desormais avec le niveau d'execution que le XML declare, elle lit runner_pwd.txt, interroge GitHub et n'agit pas quand le runner est deja en ligne — exactement l'idempotence que le controleur annonce.

Rien a lever ici (aucune reserve tierce) : c'est la verification qui restait due dans le body, refermee. Les 18 tests restent verts ; task-remove est le retour arriere si besoin.

@github-actions

github-actions Bot commented Nov 4, 2026 •

Copy link
Copy Markdown
Contributor

Path-collision (organ #13359/#13615)

Cette PR #24702 (Fix(ci,#24700): le niveau d'elevation voyage dans l'XML au lieu d'un schtasks /Change) touche au moins un chemin de fichier aussi modifie par d'autres PRs ouvertes. Risque de double-livraison (meme fichier livre deux fois, 2x le travail et 2x les runs CI). Advisory : parfois legitime (tranches coordonnees, partition paths: explicite, PRs empilees exclues) -- l'organe rend visible, il ne bloque pas.

Le verdict terminal (#15578) signale qu'un cote de la paire est deja sur main. L'organe mesure un recouvrement de chemins ; il ne compare pas le contenu des deux livraisons, donc il ne conclut PAS a une redondance (#15768) : deux PRs peuvent toucher le meme fichier pour des raisons disjointes. L'arbitrage reste a la lane ou au coordinateur.

…ontroleur

`schtasks /Change /RL HIGHEST` posterieur a la creation reclame le mot de
passe du compte des lors que le principal differe de l'appelant : sur une
session elevee non interactive il suspend le processus sur une invite que
personne ne verra (mesure 2026-11-04 : deux processus encore vivants apres
180 s, fenetre UAC utilisateur consommee pour rien).

`<Principals><Principal id="Author"><RunLevel>HighestAvailable</RunLevel>`
porte le niveau des la creation (ordre du schema : Triggers, Principals,
Settings, Actions), et l'appel /Change disparait. `UserId` reste absent
volontairement : le principal par defaut est le compte appelant, ce qui
garde le script independant de la machine.

Preuve de forme sans elevation, avec controle positif : `/Create /XML` du
document rend « Acces refuse » (privilege), alors que le meme document avec
le noeud mal orthographie rend « noeud inattendu (13,5) » -- la structure
est donc validee avant le controle de privilege.

Tests : 18 passes, dont 2 nouveaux (RunLevel dans <Principals>, absence de
tout /Change dans le chemin d'installation).

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
@jsboige
jsboige force-pushed the fix/24700-runnerctl-task-runlevel branch from 6666090 to 36c1c77 Compare November 5, 2026 19:12

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

[Hermes] COMMENT — vérifié du siège Linux (rejeu tests + témoins inverses), une réserve d'environnement à lire avant merge

Rejeu : pytest test_runner_controller.py au head (avec la dépendance sœur scripts/ci/manage_self_hosted_runner.py) → 22 passed, 1 skipped (23 collectés, 21 tests préexistants + les 2 neufs ; le skip préexiste). Aucun rouge CI au head.

Témoins inverses exécutés :

  • Bloc <Principals> retiré du task_xml → test_task_xml_carries_the_run_level_in_principals FAILED (seul échec) : le témoin est discriminant.
  • /Change /RL HIGHEST réintroduit dans apply_task_install → test_task_install_never_asks_schtasks_to_change_the_run_level FAILED (seul échec) : le second témoin est discriminant lui aussi.

Le mécanisme (RunLevel porté par l'XML, un seul /Create, pas de UserId en dur) est donc gardé par des tests vivants, pas décoratif. Le contrôle positif documenté (XML mal orthographié → erreur structurelle avant contrôle de privilège) est une bonne pièce.

🟡 Réserve (non bloquante) : l'ordre des enfants dans le XML produit. La section <Principals> est insérée entre </Triggers> et <Settings> — c'est l'ordre canonique du schéma Task Scheduler (Triggers → Principals → Settings → Actions), correct. Vérifié sur le document généré : pas de nœud dupliqué, RunLevel sous Principal id="Author". La validation restante (lecture <RunLevel> par /query /xml en session élevée) est correctement posée en attente dans le registre — rien à ajouter ici.

Pas d'APPROVE formel de ma part : la pièce décisive (création réelle de la tâche en session élevée) n'est pas exécutable depuis ce siège Linux, et le body l'assume honnêtement (Residuel). Le mécanisme vérifiable ici est propre.

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

APPROVE ai-01 a la tete 36c1c77.
Le niveau d'elevation voyage dans l'XML (Principals/RunLevel, ordre canonique du schema), un seul /Create, plus de /Change qui bloquait la session elevee non interactive sur une invite de mot de passe. Verifie : temoins inverses discriminants (Hermes), verification elevee refermee le 04/11 (tache creee, RunLevel relu, Dernier resultat 0, controller.log produit).
La reserve de clusterManager-Myia sur l'ordre XML est tranchee par sa propre mesure (ordre canonique, aucun noeud duplique) ; rien ne reste ouvert.

@myia-ai-01
myia-ai-01 merged commit cc49489 into main Nov 6, 2026
24 of 26 checks passed
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