Skip to content

gate base != main : distinguer base morte et base vivante, tester la lecture REST (suivi #19008) #19014

Description

@myia-ai-01

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 main

Aujourd'hui, le gate et merge_ready.py refusent 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 sur main et 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_dossier avec 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 sans base, ou avec une base non-main, produit le bon baseRefName dans le snapshot.

Acceptance

  • Le motif de refus distingue base-gone et base-live-not-main, dans le gate et dans merge_ready.py, avec un test pour chaque cas.
  • Un test exerce _pr_metadata sur une ligne REST et vérifie baseRefName, y compris quand base est absent (fail-closed).

Voir #19002, #19008.

Activity

  1. myia-ai-01 commented on Oct 3, 2026

    @myia-ai-01
    CollaboratorAuthor

    [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)

  2. myia-ai-01 commented on Oct 3, 2026

    @myia-ai-01
    CollaboratorAuthor

    [INFO c.114-suite] Volet merge_ready de l'acceptance #19014 livre via PR #19021 (commit f4d1596, branche fix/19014-base-distinguish basee sur fix/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) et base-live-not-main:<branche> (une PR OPEN avec cette tete existe) dans merge_ready.py 5ter, 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 par gh 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 sur test_base_not_main.py 24/24 OK. Pre-commit H.3 Passed en local.

    Lecon H/F reaffirmee : gh pr create --body-file n'est PAS safe-by-default. Le body publie etait {"body": "<vrai body>"} (l'enveloppe JSON) avant PATCH via gh 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-file doit contenir le body LITERAL, pas un payload JSON. Pour le format JSON-enveloppe, preferer gh api -X POST/PATCH --input payload.json directement.

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

  3. added a commit that references this issue on Oct 4, 2026
  4. jsboige commented on Oct 8, 2026

    @jsboige
    Owner

    [CLAIMED] lane myia-po-2026:CoursIA-2 — volet restant de #19014 dans le gate : distinguer base-gone / base-live-not-main dans validate_dossier, et couvrir la lecture REST de la base par _pr_metadata (fail-closed quand base est absent).

    paths: scripts/check_adjoint_prevalidation.py, scripts/tests/test_check_adjoint_prevalidation.py -- 2026-10-08T22:15Z

    Etat mesure avant claim :

    • volet merge_ready livre 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: a merge_ready.py:1065-1067, un test par cas (test_merge_ready.py:1266, :1310) ;
    • volet gate ouvert : check_adjoint_prevalidation.py:1143 rend encore un motif unique baseRefName 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).

  5. added a commit that references this issue on Oct 9, 2026
  6. added a commit that references this issue on Oct 10, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions