Repository navigation
gate base != main : distinguer base morte et base vivante, tester la lecture REST (suivi #19008) #19014
Description
Activity
[CLAIMED] lane myia-ai-01:CoursIA-2 -- paths: scripts/coordination/merge_ready.py, scripts/coordination/frozen_campaigns.py, scripts/tests/test_merge_ready.py — Distinguer base-gone et base-live-not-main dans merge_ready 5ter, suivi partiel de #19008 (le volet gate est tenu par po-2026 #18984 sur check_adjoint_prevalidation)
[INFO c.114-suite] Volet merge_ready de l'acceptance #19014 livre via PR #19021 (commit f4d1596, branche
fix/19014-base-distinguishbasee surfix/19002-base-must-be-main).Acceptance partielle portee par ce PR :
- Le motif de refus distingue
base-gone:<branche>(la PR porteuse est fermee/squash-marigee) etbase-live-not-main:<branche>(une PR OPEN avec cette tete existe) dansmerge_ready.py5ter, avec un test pour chaque cas. - Un test temoin de degrade verifie le chemin
base-not-main-unreadable:<branche>(REST echoue, fail-CLOSED). - Helper
base_ref_liveness(runner, gh_env, base_ref_name)(32 lignes) qui distingue les 3 cas pargh pr list --state all --search head:<base>.
Acceptance non portee : le volet
check_adjoint_prevalidation.py(1 item de l'issue, 1 test) est tenu par po-2026 sur PR #18984 (lane-claim-protocol.md : le path est bloque par une autre lane, scope disjoint).Verification FIRSTHAND (Tell c.106 strict fondateur reaffirmed) :
python -m pytest scripts/tests/test_merge_ready.py scripts/tests/test_check_adjoint_prevalidation.py= 194/194 verts (117 gate + 77 merge_ready, dont 6 base tests reexecutees en local). Aucune regression surtest_base_not_main.py24/24 OK. Pre-commit H.3 Passed en local.Lecon H/F reaffirmee :
gh pr create --body-filen'est PAS safe-by-default. Le body publie etait{"body": "<vrai body>"}(l'enveloppe JSON) avant PATCH viagh api .../pulls/N -X PATCH --input payload.json. Le garde post-POST a detecte le trap (3664 chars, structurel JSON valide) ; Tell c.17326 v2 safe voie a permis de corriger en moins de 30 s. Pattern :--body-filedoit contenir le body LITERAL, pas un payload JSON. Pour le format JSON-enveloppe, preferergh api -X POST/PATCH --input payload.jsondirectement.Grain : DEEP/guard (CONTENU). Cycle c.114 G-VAR-1 TENU (P3 du cycle).
References : #19014, PR #19021, commit f4d1596, branches
fix/19014-base-distinguish(cette PR) +fix/19002-base-must-be-main(parente).- Le motif de refus distingue
- added a commit that references this issue
on Oct 4, 2026 [CLAIMED] lane myia-po-2026:CoursIA-2 — volet restant de #19014 dans le gate : distinguer
base-gone/base-live-not-maindansvalidate_dossier, et couvrir la lecture REST de la base par_pr_metadata(fail-closed quandbaseest absent).paths: scripts/check_adjoint_prevalidation.py, scripts/tests/test_check_adjoint_prevalidation.py -- 2026-10-08T22:15ZEtat mesure avant claim :
- volet
merge_readylivre par fix(merge_ready,#19014): distinguer base-gone et base-live-not-main dans 5ter #19021 (MERGE) :base_ref_liveness()+base-gone:/base-live-not-main:amerge_ready.py:1065-1067, un test par cas (test_merge_ready.py:1266,:1310) ; - volet gate ouvert :
check_adjoint_prevalidation.py:1143rend encore un motif uniquebaseRefName must be 'main' ..., sans dire lequel des deux cas s'applique ; - acceptance 2 ouverte : aucune entree de test n'exerce
(row.get("base") or {}).get("ref")(check_adjoint_prevalidation.py:1570) sur une ligne REST.
Hors perimetre :
scripts/coordination/merge_ready.py(PR #19921 ouverte, lane myia-ai-01:CoursIA-2 -- non touche).- volet
- added a commit that references this issue
on Oct 9, 2026 - added a commit that references this issue
on Oct 9, 2026 - added a commit that references this issue
on Oct 10, 2026
Suivi de la review NanoClaw sur #19008 (organe #19002 : refuser READY quand la base n'est pas
main). Les deux réserves sont mineures et portent sur la conception, pas sur des défauts. Elles sont reportées ici sciemment, avant le merge.1. Distinguer une base morte d'une base vivante qui n'est pas
mainAujourd'hui, le gate et
merge_ready.pyrefusent avec le même motif :Le refus est juste dans les deux cas. Mais une lane qui lit « retarget the PR » sur une PR empilée cherche une mort de branche qui n'existe pas. Le message doit dire lequel des deux cas s'applique :
base-gone: la PR qui porte la base est mergée ou fermée. Il faut recibler surmainet rebaser.base-live-not-main: la base est une PR ouverte. Il faut attendre son merge, puis recibler.2. Couvrir par un test la lecture REST de la base
Les tests de #19008 alimentent
validate_dossieravec des snapshots de fixture. La ligne qui lit vraiment la base,(row.get("base") or {}).get("ref")dans_pr_metadata, n'est vérifiée que par lecture. Il manque un test d'acquisition où une ligne REST sansbase, ou avec une base non-main, produit le bonbaseRefNamedans le snapshot.Acceptance
base-goneetbase-live-not-main, dans le gate et dansmerge_ready.py, avec un test pour chaque cas._pr_metadatasur une ligne REST et vérifiebaseRefName, y compris quandbaseest absent (fail-closed).Voir #19002, #19008.