Repository navigation
docs(ci,#15770): name the sweep's measured trigger roles -- push heartbeat nominal, cron backstop - #16077
Conversation
…tbeat nominal, cron backstop 24h measurement (100 runs): push heartbeat 89/100 fires, 54 successes, median 11 min between successes; schedule served 5/24 (gaps 178-341 min); queue 25-136 s on the last four successes. Comment-only change: cron, push, runs-on and the job block are byte-identical. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Path-collision (organ #13359/#13615)Cette PR #16077 (
Le verdict terminal (#15578) signale qu'un cote de la paire est deja sur |
|
[stale-guard-red] |
|
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 |
Grain: LIGHT/tooling — lane myia-po-2026:CoursIA — prev: DEEP/notebook-dotnet #16071
Objet
#15770 mesure (2026-09-12, en incident) trois faits : le
schedulehoraire servi ~1 fois sur 5, 25 runners sur un seul hote, et le sweep en file 12+ min sur le pool le plus contendu. Le claim de depart visait les pistes 1+2. La mesure d'aujourd'hui refute la piste 1 : la file s'est resorbee sans changement de routage. Ce qui reste livrable en code est la seconde moitie de la piste 2, que l'issue formule elle-meme : « accepter que le dispatch manuel coordinateur soit le chemin nominal et le dire dans le fichier ». La mesure precise ce que « nominal » veut vraiment dire — ce n'est ni le cron ni le dispatch, c'est le heartbeatpush.Mesures (fresh, 2026-09-14T00:20Z)
Fenetre 24 h, 100 runs du workflow (
gh run list --workflow pr-gate-stale-sweep.yml --limit 100) :push(heartbeatmain)schedule(24 declares)workflow_dispatchCe que fait la PR (et ce qu'elle ne fait pas)
+18/-1, un seul fichier (
pr-gate-stale-sweep.yml), commentaire uniquement dans le blocon:: le bloc nomme le role mesure de chaque declencheur (push = nominal, cron = backstop heures creuses, dispatch = echappatoire), enregistre les chiffres ci-dessus, et documente pourquoi aucun re-routage n'est justifie aujourd'hui :coursia-waiterreste interdit (interblocage nomme par l'issue : les waiters sont tenus par les agregateurs que le sweep doit debloquer) ;Aucun changement comportemental :
cron: '7 * * * *',push: branches: [main],runs-on,timeout-minuteset le blocjobssont byte-identiques (verifie par relecture du YAML parse : triggersschedule/push/workflow_dispatch,runs-on: [self-hosted, coursia-ephemeral, coursia-linux],timeout-minutes: 15).Pourquoi la piste 1 est retiree plutot que livree
Le claim promettait de valider la candidate GitHub-hosted « contre les besoins reels du job avant ecriture ». La validation l'a tuee deux fois : le mandat de cout l'interdit, et la file qu'elle devait reparer n'existe plus (25-136 s). Re-router vers un pool sain un job qui n'attend plus serait du geste speculatif sur du CI partage — le meme type de geste que l'issue elle-meme condamne quand elle refuse de « ralentir la production ».
Acceptance de l'issue, etat rendu
Piste 3 (repartir les runners sur un second hote) reste ouverte et materielle — hors de la portee de cette PR, avec l'utilisateur/coordinateur.
Perimetre
Cette PR touche un seul fichier :
.github/workflows/pr-gate-stale-sweep.yml(workflow « PR gate stale-verdict sweep »). Aucun autre chemin, aucun autre workflow.See #15770
🤖 Generated with Claude Code