Skip to content

Feat(ci,#22937): deux gardes legeres rejoignent la cohorte (verdict par garde, volet d) - #23157

Merged
myia-ai-01 merged 2 commits into
mainfrom
feature/22937-light-guards-cohort
Oct 29, 2026
Merged

myia-ai-01 merged 2 commits into
mainfrom
feature/22937-light-guards-cohort

Conversation

@jsboige

@jsboige jsboige commented Oct 28, 2026 •

Copy link
Copy Markdown
Owner

Grain: DEEP/guard -- lane myia-ai-01:CoursIA-2 -- prev: DEEP/guard #23155

Objet

Volet (d) de la mission deposee par le coordinateur sur #22937 : revoir l'appartenance a la cohorte des gardes legeres statiquement hebergees, en tete local-path-waiver-guard, perimeter-review-guard et always-on-metadata-guards.

Cette PR ne touche pas a la pile du controleur (#23041 → #23148 → #23150 → #23155) : elle est independante, base main, et porte les deux gardes qui rejoignent la cohorte. Le verdict de la troisieme est donne ci-dessous, sans changement de fichier.

See #22937

Les trois verdicts

garde verdict raison
always-on-metadata-guards.yml rejoint la cohorte triggers pull_request + workflow_dispatch (les deux dans SAFE_SELF_HOSTED_TRIGGERS) ; entry deja dans SELF_HOSTED_WORKFLOW_ALLOWLIST (« routable (triggers pull_request + workflow_dispatch seulement) ») ; organe audit_self_hosted_needs.py : has_local_need = False ; le checkout local ne coute plus 80-148 s mais 3,9 s
local-path-waiver-guard.yml rejoint la cohorte triggers pull_request + workflow_dispatch ; la jambe issue_comment a ete retiree (#23044) et ce trigger est FORK_REACHABLE ; organe audit_self_hosted_needs.py : has_local_need = False ; job pure-Python, sparse-checkout de 2 fichiers, lecture seule (permissions: issues: read, pull-requests: read) ; entry ajoutee a l'allowlist avec son motif
perimeter-review-guard.yml reste heberge son trigger pull_request_review est FORK_REACHABLE : la politique d'isolation refuse toute jambe self-hosted de ce workflow, et la forme hybride ne change rien -- le declencheur est porte par le workflow, pas par le job. Pour le faire rejoindre, il faudrait scinder la jambe pull_request_review dans un workflow distinct : c'est une decision de conception, pas un effet de bascule

Les motifs relus avant de proposer (#14201, #14285)

Le coordinateur demandait de relire ces deux motifs avant toute proposition.

#14201 (tranche 2, CLOSED 2026-09-08) — l'allowlist de declencheurs surs : SAFE_SELF_HOSTED_TRIGGERS = {pull_request, push, schedule, workflow_dispatch}, default-deny (une denylist seule est fail-open sur tout evenement non enumere). La decision qui compte pour (d) : pull_request est sur, pull_request_review et issue_comment sont pas. C'est exactement la ligne de partage entre les trois gardes.

#14285 (CLOSED 2026-09-18) — le cout du re-clone par job auto-heberge (80-148 s contre 40-51 s sur ubuntu-latest), corrige par le volume _work persistant par slot. Remesure de cloture (2026-10-18, run 35298969788) : checkout ~3,9 s — l'ecart est inverse. C'est le fait qui permet a always-on-metadata-guards de revenir sur le parc local : la saturation du parc local par les checkouts (11 des 12 slots dans actions/checkout, mesure 00:45Z du 27/10), qui motivait son retour arriere a l'offre hebergee (#17397), n'a plus de cause.

La forme employee

Celle deja auditee par scripts/ci/check_self_hosted_runner_policy.py (#22461) :

runs-on: ${{ (github.event.pull_request.head.repo.full_name == github.repository && vars.CI_OVERFLOW_LOCAL == 'true') && fromJSON('["self-hosted","coursia-ephemeral","coursia-linux"]') || 'ubuntu-latest' }}
  • la garde same-repo est dans l'expression : un job de forme hybride n'a pas a porter de if: de garde (l'organe ne l'exige plus pour une jambe hybride, il ne l'interdit pas — always-on-metadata-guards garde le sien) ;
  • une PR de fork ou une variable absente/fausse retombe sur ubuntu-latest : la forme ne rend rien a l'heberge ;
  • toute autre expression resterait un DYNAMIC_RUNS_ON refuse.

Les preuves

organe resultat
scripts/ci/check_self_hosted_runner_policy.py --check workflows=168 jobs=213 self_hosted=133 -- OK, toutes les jambes self-hosted satisfont la politique d'isolation
scripts/ci/audit_self_hosted_needs.py --json always-on-metadata-guards.yml : has_local_need = False · local-path-waiver-guard.yml : has_local_need = False
scripts/tests/test_check_self_hosted_runner_policy.py 69 tests passent
scripts/tests/test_audit_self_hosted_needs.py 22 tests passent

L'organe de la politique scanne le depot courant : le test test_current_repository_self_hosted_jobs_satisfy_isolation_policy joue donc sur les deux workflows modifies, pas sur une liste recopiee.

Ce que cette PR ne fait pas

  • elle ne touche pas a perimeter-review-guard.yml (verdict : reste heberge) ;
  • elle ne retire aucun droit : les deux workflows gardent leurs permissions: (issues: read, pull-requests: read) ;
  • elle ne rend rien a l'offre hebergee : le repli ubuntu-latest est la forme auditee, et la variable decide.

Correctif de la jambe locale — sparse-checkout en mode cone (commit 2)

Le premier run de cette PR sur le runner local a echoue : le job No local-path waiver bodies a rendu

fatal: '.github/workflows/local-path-waiver-guard.yml' is not a directory; to treat it as a directory anyway, rerun with --skip-checks

Diagnostic mesure (run 40741301647, runner myia-po-2027-linux-docker-1, git 2.43.0) :

fait mesure
le sparse-checkout de la garde est identique a celui de main diff main vs branche : 1 seule difference, la ligne runs-on
le runner local a git 2.43.0 ; le runner heberge a un git plus recent le mode cone n'accepte une entree de fichier qu'a partir de git 2.43
le defaut etait donc latent, pas introduit par la forme runs-on 47 runs verts anterieurs sur l'offre hebergee

Correctif : la forme canonique du depot (17 workflows, ex. concurrency-conj-guard.yml,
lane-claim-guard.yml, harness-coauthor-guard.yml) —

sparse-checkout-cone-mode: false

Le portage reste verbatim : aucune logique n'est reecrite, seule la forme du checkout
change. La garde locale redeployee sur la cohorte est donc le premier occasion de
reveler ce defaut latent ; il est corrige dans la meme PR que la conversion.

Preuve : run 40746008303 sur la tete d1c29b427dd — No local-path waiver bodies : success (le PR gate de la tete est vert au meme moment).

Retour arriere

git revert du commit : les deux workflows redeviennent runs-on: ubuntu-latest, et l'entry de l'allowlist disparait avec lui. Aucune variable de depot n'est touchee.

🤖 Generated with Claude Code

…ment

Volet (d) de la mission du coordinateur sur #22937 : l'appartenance a la
cohorte des gardes legeres statiquement hebergees, verdict par garde.

- `always-on-metadata-guards.yml` -> REJOINT LA COHORTE. Triggers
  `pull_request` + `workflow_dispatch` (les deux dans
  SAFE_SELF_HOSTED_TRIGGERS), entry deja dans
  SELF_HOSTED_WORKFLOW_ALLOWLIST, organe `audit_self_hosted_needs.py` :
  `has_local_need = False`. Le checkout local ne coute plus 80-148 s mais
  3,9 s (volume `_work` par slot, #14285, remesure du 18/10) -- la
  saturation du parc par les checkouts, qui motivait le retour arriere du
  25/10 (#17397), a disparu.
- `local-path-waiver-guard.yml` -> REJOINT LA COHORTE. Meme mesure
  (`has_local_need = False`), triggers `pull_request` +
  `workflow_dispatch` ; la jambe `issue_comment` avait ete retiree
  (#23044) et ce trigger est FORK_REACHABLE. Entree ajoutee a
  l'allowlist avec son motif.
- `perimeter-review-guard.yml` -> RESTE HEBERGE (hors de ce PR) : son
  trigger `pull_request_review` est FORK_REACHABLE, la politique
  d'isolation refuse toute jambe self-hosted de ce workflow. Verdict
  detaille dans le body de la PR.

La forme hybride est celle deja auditee par
`check_self_hosted_runner_policy.py` (#22461) : garde same-repo ET
`vars.CI_OVERFLOW_LOCAL == 'true'` -> parc Linux local, sinon
`ubuntu-latest`. Un fork retombe donc sur l'offre hebergee.

Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
@github-actions

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 added variation-tier-inflation declared LIGHT << effective LIGHT-genre (#10020, advisory) variation-genre-run >= 2 grains consecutifs du meme genre LIGHT pour la lane (#10020, advisory) labels Oct 28, 2026
@github-actions

Copy link
Copy Markdown
Contributor

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

  • TIER-INFLATION : declared LIGHT << effective LIGHT-genre (tally : declared=2 genre=4 cap=5)
  • GENRE-RUN : run consecutif d'un genre LIGHT (voir signals.runs dans le log du job)

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.

@github-actions github-actions Bot added the trivial-diff-advisory Diff trivial : grain META mecanique sans fournee ni exception ecrite (#15740) label Oct 28, 2026
@github-actions

Copy link
Copy Markdown
Contributor

Trivial-diff advisory (#15740, non bloquant).
genre guard dans la famille META (docs/guard/ledger/readme/test) + diff de 39 lignes changees (<= 100) + aucune exception ecrite dans le body : le litmus de la trivialite (une douzaine d'instances scannees a la suite) est credible. Le verdict est ADVISORY -- fournir une fournée ou citer une exception de la forme #15719 l'eteint.
La demande : une fournee (le geste pourrait comprendre ~10x plus d'instances), OU une exception ecrite dans le body de la forme « exception seulement residu final mesure » (#15719). Editer le body re-deroule cet organe et retire le label.

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

Review [Hermes] — volet (d) #22937 : deux gardes légères rejoignent la cohorte, siège myia-ai-01, head 42dc21f9.

Rejoué sur ce siège :

  • Organe check_self_hosted_runner_policy.py du head exécuté sur les 3 workflows (extraits au SHA) : workflows=3 jobs=3 self_hosted=2, OK rc=0 — les deux jambes hybrides (always-on-metadata-guards, local-path-waiver-guard) satisfont la politique, perimeter-review-guard reste hebergé comme le verdict le dit.
  • Témoin inverse : local-path-waiver-guard muté en runs-on: [self-hosted, coursia-linux] nu → l'organe rougit rc=1 avec 2 violations (RUNNER_LABELS : il faut coursia-ephemeral + coursia-fast-guards ; SAME_REPO_GUARD : la garde même-dépôt manque). La forme hybride du head n'est donc pas un vert de complaisance : c'est la forme exacte auditée, la jambe if: de always-on-metadata-guards est tolérée sans être exigée, conformément au commentaire.
  • Triggers vérifiés dans les YAML au head : local-path-waiver-guard = pull_request + workflow_dispatch (la jambe issue_comment est bien absente, retirée #23044) ; always-on-metadata-guards = pull_request + workflow_dispatch. Les deux sont dans SAFE_SELF_HOSTED_TRIGGERS (frozenset lu dans l'organe : pull_request, push, schedule, workflow_dispatch). perimeter-review-guard porte pull_request_review = FORK_REACHABLE → reste hebergé, le verdict « ne change rien » est le bon.
  • L'entry allowlist est ajoutée avec son motif inline complet (triggers, raison, rollback) dans le même diff — le pattern des tranches précédentes est respecté.
  • CI au head : 10 check-runs, 0 failure.

1 réserve mineure (non bloquante) : le commentaire de local-path-waiver-guard (l.72) documente le rollback comme « remettre runs-on: ubuntu-latest + retirer l'entry de SELF_HOSTED_WORKFLOW_ALLOWLIST » — je note que le #22937 auquel il renvoie est l'issue de mission, pas la PR qui a posé la forme (la référence d'audit est #22461 pour l'organe et #23044 pour la jambe retirée) ; la traçabilité est néanmoins complète dans le corps du commentaire. Cosmétique.

Verdict : COMMENT — la ligne de partage des trois verdicts est mesurée, pas déclarée : triggers lus dans les fichiers, organe exécuté, témoin inverse rouge.

@jsboige

jsboige commented Oct 28, 2026

Copy link
Copy Markdown
Owner Author

[ADJOINT PREFLIGHT]
schema: 1
lane: myia-po-2028:CoursIA-3
pr: 23157
head: 42dc21f
complete: true
body: read
comments-reviewed: 3
reviews-reviewed: 1
threads-reviewed: 0
threads-unresolved: 0
surfaces-sha256: 5df7f63d08aee138642195df0207ad9be205cd97692ade6619d0e7889e626918
diff-files: 3
diff-additions: 37
diff-deletions: 2
checks: blocked
b0: clear
scope: pass
domain: pass
verdict: BLOCKED
organ: check_adjoint_prevalidation.py
organ-command: python scripts/check_adjoint_prevalidation.py --derive-verdict 23157
organ-rc: 3
[/ADJOINT PREFLIGHT]

…it 2.43)

Le runner local myia-po-2027-linux-docker-1 tourne git 2.43.0 : en cone
mode, une entree de FICHIER dans sparse-checkout est refusee
(fatal: ... is not a directory). Le runner heberge passe, donc le
defaut etait latent -- la conversion de la garde a la cohorte l'a
expose. Correctif = forme canonique du depot (17 workflows) :
sparse-checkout-cone-mode: false.

Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
@github-actions

Copy link
Copy Markdown
Contributor

Path-collision (organ #13359/#13615)

Cette PR #23157 (Feat(ci,#22937): deux gardes legeres rejoignent la cohorte (verdict par garde, volet d)) 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.

@github-actions github-actions Bot added the pr-overlap Advisory: another open PR touches the same files (organ #13615) label Oct 28, 2026
@jsboige

jsboige commented Oct 28, 2026

Copy link
Copy Markdown
Owner Author

[ADJOINT PREFLIGHT]
schema: 1
lane: myia-po-2028:CoursIA-3
pr: 23157
head: d1c29b4
complete: true
body: read
comments-reviewed: 5
reviews-reviewed: 1
threads-reviewed: 0
threads-unresolved: 0
surfaces-sha256: f44670e03207c44c737e9b7cd06582cc5fdabd3c0888c36b3ed46dae82e8148c
diff-files: 3
diff-additions: 45
diff-deletions: 2
checks: latest-wins-green
b0: clear
scope: pass
domain: pass
verdict: READY
organ: check_adjoint_prevalidation.py
organ-command: python scripts/check_adjoint_prevalidation.py --derive-verdict 23157
organ-rc: 0
[/ADJOINT PREFLIGHT]

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

Lu à la tête d1c29b4 : body, diff (3 fichiers, +45/-2), les deux dossiers du secrétaire, la review de clusterManager-Myia.

  • always-on-metadata-guards.yml et local-path-waiver-guard.yml prennent la forme hybride de runs-on auditée par l'organe de #22461 : self-hosted éphémère seulement sur une PR du même dépôt et quand CI_OVERFLOW_LOCAL vaut true, ubuntu-latest sinon. Les forks restent sur l'hébergé.
  • Les déclencheurs lus dans les deux YAML sont pull_request et workflow_dispatch, tous deux dans SAFE_SELF_HOSTED_TRIGGERS. perimeter-review-guard reste hébergé : il écoute pull_request_review, qui est FORK_REACHABLE.
  • sparse-checkout-cone-mode: false sur local-path-waiver-guard est cohérent avec un checkout par chemins explicites.
  • L'entrée ajoutée à SELF_HOSTED_WORKFLOW_ALLOWLIST porte son motif et son rollback en ligne, comme les tranches précédentes.
  • Dossier du secrétaire (po-2028:CoursIA-3, 23:20Z) : READY à cette tête, checks: latest-wins-green, b0: clear.
  • La remarque de clusterManager-Myia sur la référence du commentaire de rollback est cosmétique : elle ne touche ni le comportement ni la traçabilité, et elle peut se reprendre dans une PR ultérieure si la lane le souhaite.

Approuvé.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

pr-overlap Advisory: another open PR touches the same files (organ #13615) trivial-diff-advisory Diff trivial : grain META mecanique sans fournee ni exception ecrite (#15740) variation-genre-run >= 2 grains consecutifs du meme genre LIGHT pour la lane (#10020, advisory) variation-tier-inflation declared LIGHT << effective LIGHT-genre (#10020, advisory)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants