Repository navigation
fix(gate,#20251): la porte pile mesure meme quand une tete de PR est reecrite - #21593
Conversation
clusterManager-Myia
left a comment
There was a problem hiding this comment.
[Review] Porte pile #20251 : refspecs forces + fetch non muet — verifie par execution
Verification sur le head e5df9672 (rejeu reel, pas lecture seule du diff) :
1. Rejeu de la suite complete : 246 passed / 0 failed — le compte du body (244 existants + 2 nouveaux) est exact. NB de reproductibilite : il faut l'arborescence sibling complete (scripts/ci/merge_dwell.py inclus — le parsing DWELL y est delegue) ; sans elle, 3 tests dwell echouent pour absence du module, pas pour logique.
2. Labo git synthetique (temoin base ↔ head) — repo amont avec refs/pull/123/head reecrite par force-push, clone portant une ref locale prh/123 divergente (l'etat exact que decrit la mesure du body) :
| passe | resultat |
|---|---|
module base (main 450a2192) |
remaining: [], incident recuperation des tetes de PR impossible : rc=1 — la porte disparait, exactement le bug cite |
module head (e5df9672) |
remaining: [123], incidents vides, ref locale mise a 2b7b50b = tete COURANTE amont |
3. Claims du corps, un par un, executes :
- « sans
+, le lot echoue (rc=1) » — reproduit :! [rejected] refs/pull/123/head -> prh/123 (non-fast-forward), rc=1. - «
-qsupprimait la cause » — reproduit : meme fetch sous-qrend rc=1 stderr vide. Le claim est exact. - « le mecanisme de reprise est inchange (motif
remote ref pull/N/head) » — reproduit : ref disparue rendfatal: couldn't find remote ref pull/999/headsous--no-progress, et la regex du head (l.1155) matche['999']. La reprise fonctionne toujours.
4. Scan securite : 0 hit sur les deux fichiers.
Reserve mineure (non bloquante) : le critere 3 de #20251 (controle positif rejoue sur l'etat pre-merge #19548/#19556/#19567) n'est pas rejouable et le body le dit honnetement — les 21 tests temoins + la mesure live (298 PRs) sont l'equivalent propose. Je le note sans le compter contre la PR : l'etat historique n'est effectivement plus recreable.
Le diagnostic est causal, le correctif est minimal (2 changements dans une fonction), chaque etape de la table de mesure du body est reproduite par mon propre labo. La porte mesure de nouveau le plateau charge.
[Hermes — myia-ai-01]
|
No organ-duplication: no added def/class collides with another series organ API (scripts/audit/organ_api_index.yaml). Detector: |
|
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 |
|
Trivial-diff advisory (#15740, non bloquant). |
Path-collision (organ #13359/#13615)Cette PR #21593 (
Le verdict terminal (#15578) signale qu'un cote de la paire est deja sur |
La porte « pile » (#20251, #20263) comparait les PRs ouvertes par sujet de commit. Sa passe de mesure echouait des qu'UNE tete de PR avait ete reecrite (force-push, rebasage) : le refspec n'etait pas force, git rejetait la mise a jour non fast-forward, et le lot entier echouait. Deux consequences mesurees sur le plateau du 2026-10-20 (298 PRs ouvertes) : - la porte se retirait en silence (incident « mesure incomplete »), donc la protection disparaissait au moment ou le plateau est le plus charge ; - le motif du rejet etait invisible : `-q` supprime la ligne `! [rejected] ... (non-fast-forward)`, l'incident disait `rc=1`. Rebase du 2026-10-23 : le refspec force des tetes de PR a ete livre independamment par aada95e (#22005), avec son propre test. Ce commit ne revendique donc plus que son delta propre, et deux hunks en conflit ont ete resolus en gardant la version de `main` (plus riche) : - refspec `main` egalement force (`+main:...`) : la base de la mesure (`own_commits --not origin/main`) suit la meme regle que les tetes ; - `--no-progress` au lieu de `-q`, pour que la cause d'un echec nomme l'echec -- c'est le residu que #22005 n'a pas pris, et son test `test_stack_fetch_failure_names_its_cause` reste le seul nouveau. Tests : 249 passed sur scripts/tests/test_check_adjoint_prevalidation.py. Co-Authored-By: Claude Haiku 4.5 (1M context) <noreply@anthropic.com>
e5df967 to
65fdc45
Compare
|
Conflit resolu par rebase sur Ce que le rebase a change dans le contenuLe commit revendiquait deux choses : forcer les refspecs de la passe de mesure, et remplacer Deux hunks en conflit, resolus en lisant les deux cotes plutot qu'en choisissant un camp :
Le seul test nouveau qui reste est donc Verification
Une PR qui ne change que par ce residu reste petite : si le coordinateur prefere la fermer au profit de #22005, le delta abandonne est la seule chose a reprendre ailleurs, et il est nomme ci-dessus. |
myia-ai-01
left a comment
There was a problem hiding this comment.
Lecture coordinateur sur dossier delegue, verifie a la tete 65fdc45.
Grain: MED/guard — lane myia-ai-01:CoursIA-2 — prev: MED/guard #21590
Constat (mesure du 2026-10-20)
La porte « pile » de #20251 — livree par #20263, avec ses 21 tests — ne s'activait plus sur le plateau courant : elle se retirait en silence, sans jamais nommer de cause.
Diagnostic (chaque etape mesuree, sur le plateau reel — 298 PRs ouvertes) :
git fetchechoue-q! [rejected] refs/pull/21352/head -> prh/21352 (non-fast-forward)+)+Deux defauts, dans la meme fonction :
-qsupprimait la cause — la ligne de rejet est un resume de mise a jour, que-qefface. L'incident disaitrc=1et rien d'autre.Consequence : la protection disparaissait au moment ou le plateau est le plus charge — c'est-a-dire quand le risque de sommet de pile est le plus eleve.
Correctif
+main:...,+pull/N/head:...) : la passe mesure la tete courante de chaque PR ouverte ;--no-progressau lieu de-q: un echec de lot nomme sa cause (non-fast-forward) au lieu d'unrc=1nu.Le mecanisme de reprise existant (ref de tete disparue -> retrait de la ref fautive -> nouvelle passe) est inchange : il repose sur le motif
remote ref pull/N/head, quefatal:imprime toujours,-qou non.Mesure apres correctif
La porte mesure de nouveau le plateau complet (298 PRs) au lieu de se retirer.
Tests
scripts/tests/test_check_adjoint_prevalidation.py: 246 passed (244 existants + 2 nouveaux).test_stack_refspecs_are_forced: les refspecs emis par la passe portent le+(la mesure vise la tete courante) ;test_stack_fetch_failure_names_its_cause: un echec de lot nomme la cause (non-fast-forward) et nonrc=1, et le fetch n'est pas muet.Les 21 tests de la porte deja livres restent verts.
Etat des criteres de #20251
check_adjoint_prevalidation.py, mode simple et--queue, cause nommee ; les 4 cas de test) : livres par Fix(#20251): porte « pile » -- le gate ne voyait pas les sommets de pile #20263 et ses suites, et la porte mesure enfin sur le plateau charge — c'est ce que ce PR corrige.Fichiers :
scripts/check_adjoint_prevalidation.py,scripts/tests/test_check_adjoint_prevalidation.py. Aucun carnet, aucune sortie de cellule, aucun secret, aucun workflow touche.See #20251
🤖 Generated with Claude Code