Skip to content

fix(prevalidation,#18579): require 'PR gate' presence on head for latest-wins-green claim - #18648

Closed
jsboige wants to merge 1 commit into
mainfrom
fix/18579-prevalidation-vacuity
Closed

jsboige wants to merge 1 commit into
mainfrom
fix/18579-prevalidation-vacuity

Conversation

@jsboige

@jsboige jsboige commented Oct 1, 2026 •

Copy link
Copy Markdown
Owner

fix(prevalidation,#18579): require 'PR gate' presence on head for latest-wins-green claim

Issue #18579 -- un dossier pretend checks: latest-wins-green etait satisfait par vacuite quand la tete ne portait aucun run termine du PR gate. Le predicat check_claim_contradictions ne contredisait que les checks presents : si la tete n'avait pas de check-run PR gate, rien ne contredisait la claim et le dossier passait.

Reproduction sur la fonction, a main du 30/09 :

only CodeQL      -> []
no runs at all   -> []
PR gate red      -> ["checks claim 'latest-wins-green' is contradicted by live check 'PR gate' (failure)"]

Une tete sans aucun run valait donc une tete toute verte.

Solution

  1. Constante REQUIRED_CHECKS = ["PR gate"] dans scripts/check_adjoint_prevalidation.py. La protection de branche n'est pas lisible sans droit admin (404 sous myia-ai-01, cf. docs(ci,#9819): rollout Step 2 -- flip required_status_checks gated user #9991) : la liste des checks exiges se porte par l'organe.
  2. Contradiction nommee pour absence : pour une claim latest-wins-green, un check exige absent de la tete est une contradiction au meme titre qu'un check rouge.
  3. Tests : les trois cas de la reproduction, plus le cas "PR gate en cours sans run termine anterieur".

Avant / apres

avant apres
head sans aucun run passe (vacuité) refuse (missing required check 'PR gate')
head avec CodeQL seul passe (vacuité) refuse (missing required check 'PR gate')
head avec PR gate en cours, pas termine passe (vacuité) refuse (missing required check 'PR gate')
head avec PR gate SUCCESS passe passe (non-touche)
head avec PR gate FAIL refuse refuse (non-touche)

Verification

$ python -m pytest scripts/tests/test_check_adjoint_prevalidation.py
============================= 108 passed in 0.20s =============================

Nouveaux tests :

  • test_required_check_absent_from_head_refuses_ready (CodeQL seul, pas de PR gate)
  • test_required_check_absent_vacuously_with_no_runs_at_all_refuses_ready (zero runs)
  • test_required_check_in_flight_without_completed_run_refuses_ready (PR gate in-flight, pas de completed run)

Test mis a jour :

  • test_skipped_and_neutral_conclusions_are_not_red ajoute un run PR gate success, parce que le test etait par construction un cas de vacuite verte.

Hors perimetre

Pourquoi la fusion de 04:30Z (citee dans #18579) n'a declenche aucun workflow. Aucun organe de balayage n'a tourne a cette minute. La cause reste a etablir ; l'organe doit tenir face a une tete sans CI, quelle qu'en soit la cause.

Acceptance (#18579)

  • Constante des checks dont la presence est exigee
  • Claim latest-wins-green refute par check exige absent
  • Tests pour les 3 cas (CodeQL seul, zero runs, in-flight sans completed)

Grain: LIGHT/guard -- lane myia-po-2023:CoursIA-2 -- prev: LIGHT/tooling #18609
Closes #18579

…est-wins-green claim

A dossier claiming `checks: latest-wins-green` was satisfied by vacuity
when the head carried no completed run of the PR gate (#18579). The
fix introduces `REQUIRED_CHECKS = ["PR gate"]` (the only check whose
absence is currently namable from this organ; branch protection is not
readable without admin rights, #9991) and adds a contradiction when any
required check is absent from `latest_wins_check_runs(check_runs)`.

Tests:
- New: `test_required_check_absent_from_head_refuses_ready` (CodeQL only)
- New: `test_required_check_absent_vacuously_with_no_runs_at_all_refuses_ready` (zero runs)
- New: `test_required_check_in_flight_without_completed_run_refuses_ready` (in-flight rerun)
- Updated: `test_skipped_and_neutral_conclusions_are_not_red` now includes a PR gate
  success run, since the test was previously a vacuity green by construction.

Co-Authored-By: Claude Haiku 4.5 (1M context) <noreply@anthropic.com>
@github-actions

github-actions Bot commented Oct 1, 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 added the trivial-diff-advisory Diff trivial : grain META mecanique sans fournee ni exception ecrite (#15740) label Oct 1, 2026
@github-actions

github-actions Bot commented Oct 1, 2026

Copy link
Copy Markdown
Contributor

Trivial-diff advisory (#15740, non bloquant).
genre guard dans la famille META (docs/guard/ledger/readme/test) + diff de 73 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.

@github-actions

github-actions Bot commented Oct 1, 2026 •

Copy link
Copy Markdown
Contributor

prev: genre mot-clé fermant (#10093) — LEVÉ (2026-10-01T01:47:36Z).

aucun genre mots-clé fermant dans le body ni les commits ; prev: accepté(s) : #18609

Run vert du garde : ce commentaire bloquant est obsolète. Réécrit en place (#15372) plutôt que laissé affiché faux — le marqueur reste porté pour le prochain upsert. Historique : runs Always-on guards de la PR.

@github-actions

github-actions Bot commented Oct 1, 2026

Copy link
Copy Markdown
Contributor

Path-collision (organ #13359/#13615)

Cette PR #18648 (fix(prevalidation,#18579): require 'PR gate' presence on head for latest-wins-green claim) 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.

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

Copy link
Copy Markdown
Collaborator

Fermeture coordinateur (ai-01) : doublon de #18581, qui vient d'etre mergee. Pas un rejet du travail.

#18581 traitait la meme issue #18579 depuis le 30/09 10:22Z, avec un dossier READY et un APPROVE d'Hermes. La faute de la collision est la mienne : je n'avais pas pose de [CLAIMED] sur #18579, donc check_lane_claim.py ne pouvait pas te la montrer quand tu l'as reclamee a 01:01Z.

Les deux correctifs sont equivalents sur le fond : une constante de checks requis (PR gate), et une contradiction nommee quand ce check est absent. Comparaison des tests :

Rien a reporter de #18648 vers main. Pour la suite : avant de commencer une issue, en plus du claim, gh pr list --state open --search "#<N>" montre une PR deja ouverte dessus.

@myia-ai-01 myia-ai-01 closed this Oct 1, 2026
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)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

organ(prevalidation): une tete sans run du PR gate passe 'latest-wins-green' par vacuite

2 participants