Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
64 changes: 61 additions & 3 deletions scripts/pick_idle_grain.py
Original file line number Diff line number Diff line change
Expand Up @@ -296,8 +296,24 @@
# - la forme espacee a contenu interne (`[INFO candidate-delivered <contenu>]`)
# n'etait reconnue par AUCUNE alternative (FN), la 2e exigeant le `]`
# immediatement apres le mot.
# #19907 predicat 4 : la cloture explicite voie 3 (c.15069, cmt 6055717533) --
# `[DELIVERED] lane <machine:workspace> -- PR #N` posee par une lane sur une
# tete du tapis. La sonde pleine balaie TOUS les commentaires, ou une mention
# incidente de `[DELIVERED]` existe en prose -- l'alternative exige donc la
# forme canonique (`\s+lane\b`), et l'ancrage debut de ligne tient les
# citations `> [DELIVERED] lane` hors du match. Le prefixe de titre markdown
# `(?:#{1,6}\s*)?` lui est applique par symetrie avec les formes [INFO]
# (#21950 : une cloture sous titre `### [DELIVERED] lane ...` se lirait
# sinon comme de la prose). Le filtre recent #19768
# couvre deja `[DELIVERED]` nu sur le DERNIER commentaire ; cette alternative
# attrape les clotures NON dernieres (suivies d'un [NOT-DELIVERED] rearmant,
# d'un ack coordinateur, etc.), que le filtre recent ne voit pas par
# construction. Relevable par `_DELIVERED_MARKER_REVOKED_RE` comme les autres
# formes : un [NOT-DELIVERED] posterieur remet l'issue sur le tapis.
_DELIVERED_MARKER_RE = re.compile(
r"(?:"
r"^\s*(?:#{1,6}\s*)?\[DELIVERED\]\s+lane\b"
r"|"
r"^\s*(?:#{1,6}\s*)?\[INFO\]\s+candidate-delivered(?![-_\w])"
r"|"
r"^\s*(?:#{1,6}\s*)?\[INFO\s+candidate-delivered(?![-_\w])[^\n\]]*\]"
Expand Down Expand Up @@ -1788,9 +1804,10 @@ def delivered_signal_reason(
if verdict:
return (
"SIGNAL LIVRAISON (commentaire `" + DELIVERED_COMMENT_MARKER +
"`) : une lane a deja rendu la main sur cette issue en la "
"refutant. La re-servir comme grain de production fait bruler un "
"cycle a la lane qui la recoit."
"` / `[DELIVERED] lane`) : une lane a deja rendu la main sur "
"cette issue en la refutant, ou l'a cloturee explicitement "
"(voie 3, #15069/#19907). La re-servir comme grain de "
"production fait bruler un cycle a la lane qui la recoit."
)
# Troisieme surface : PR MERGEE <90j citant `#N` (#19907). Couvre les
# LIVREURS dont le label a ete retracte par le sweep post-merge et dont
Expand Down Expand Up @@ -1964,6 +1981,40 @@ def open_cover_reason(



def _delivered_resolved_short_cause(cause: str) -> str:
"""Motif court une-ligne pour la sortie `ECARTE (delivered-resolved)`.

#19907 acceptance 2 : la ligne par candidat porte un MOTIF, pas
seulement un numero. Les causes longues de ``withheld`` sont des
phrases pedagogiques -- on extrait le discriminateur (label /
commentaire / PR mergee / marqueur recent) et rien d'autre, pour que
la ligne tienne sans repli.
"""
m = re.search(r"SIGNAL LIVRAISON \(([^)]+)\)", cause)
if m:
return m.group(1).replace("`", "").strip()
if cause.startswith("LIVRAISON (recent)"):
return "marqueur de cloture sur le dernier commentaire"
return (cause.split(" : ", 1)[0] or "cause illisible")[:60]


def print_delivered_resolved_lines(withheld: list, indent: str = "") -> None:
"""Une ligne `ECARTE (delivered-resolved): #N -- motif` par candidat.

#19907 acceptance 2 : le rapport agrege (« N candidat(s) ECARTE(S) »)
reste pour le decompte, mais chaque candidat ecarte pour LIVRAISON a
droit a SA ligne AVANT les picks servis -- c'est la seule forme qu'un
consommateur (lane, audit, mesure d'acceptance) peut compter sans
re-deriver les causes. Les autres familles de retrait (EN COURS,
BLOQUE, DWELL) ne sont pas des livraisons et ne figurent pas ici.
"""
for it, cause in withheld:
if not cause.startswith("LIVRAISON"):
continue
print(f"{indent}ECARTE (delivered-resolved): #{it['number']} -- "
f"{_delivered_resolved_short_cause(cause)}")


def print_delivered_signal_report(
withheld: list,
state: dict,
Expand Down Expand Up @@ -8166,6 +8217,9 @@ def _probe(n: int) -> str | None:
print(f" BLOQUE par une autre lane (skip + replacement) : {held}")
# Volet livraison (#19390) : ligne propre, distincte du BLOQUE --
# le motif n'est pas une collision mais un travail deja rendu.
# #19907 acceptance 2 : une ligne par candidat ecarte pour
# livraison, avant les agregats -- chaque ecart se lit seul.
print_delivered_resolved_lines(belt_withheld, indent=" ")
# #19768 : le filtre recent a sa ligne a lui, HORS budget -- ne
# pas le fondre dans « Signal de livraison », la distinction est
# la mesure (un candidat ecarte hors budget n'a pas consomme de
Expand Down Expand Up @@ -8723,6 +8777,10 @@ def _probe(n: int) -> str | None:
+ (f" | reroll {args.reroll}" if args.reroll else "")
+ (f" | genres de session penalises : {penalized}" if penalized else ""))
print()
# #19907 acceptance 2 : une ligne par candidat ecarte pour livraison,
# AVANT les picks servis -- le tableau ci-dessous reste la vue de
# tirage, les lignes ECARTE sont la vue d'exclusion.
print_delivered_resolved_lines(withheld)
header = (f"{'urne':<10} {'issue':<8} {'age':>5} {'inact':>6} {'vus':>4} "
f"{'genre':<16} {'p':>5} titre")
print(header)
Expand Down
92 changes: 92 additions & 0 deletions scripts/tests/test_pick_idle_grain.py
Original file line number Diff line number Diff line change
Expand Up @@ -4161,6 +4161,98 @@ def test_candidate_delivered_revoked_n_est_pas_un_marqueur(monkeypatch):
assert pig._has_delivered_marker(14373) is False


# #19907 predicat 4 : cloture explicite voie 3 (`[DELIVERED] lane ...`,
# c.15069 cmt 6055717533). Le filtre recent #19768 ne voit que le DERNIER
# commentaire ; la sonde pleine doit attraper la cloture NON derniere,
# typiquement suivie d'un ack coordinateur -- c'est le cas mesure du
# verdict ai-01 du 14/10 (« non implemente dans delivered_signal_reason »).
_VOIE3_BODY = "[DELIVERED] lane myia-po-2026:CoursIA -- PR #19913"


def test_delivered_lane_voie3_arme_la_sonde_pleine(monkeypatch):
"""Predicat 4 : une cloture voie 3 NON derniere (un ack suit) arme la
sonde pleine -- le filtre recent ne la voyait pas par construction."""
_patch_gh_transports(
monkeypatch, [], issue=_issued_comments(
_VOIE3_BODY,
"Ack coordinateur, livraison prise en compte."))
assert pig._has_delivered_marker(14373) is True


def test_delivered_lane_retracte_par_not_delivered_posterieur(monkeypatch):
"""Meme grammaire d'ETAT que les autres formes : un [NOT-DELIVERED]
posterieur (verdict de livraison partielle) remet l'issue sur le tapis."""
_patch_gh_transports(
monkeypatch, [], issue=_issued_comments(
_VOIE3_BODY,
"[NOT-DELIVERED] verification first-hand : 2 cellules sur 5."))
assert pig._has_delivered_marker(14373) is False


def test_delivered_lane_sans_forme_canonique_ne_sarme_pas():
"""La sonde pleine exige `\s+lane\b` : `[DELIVERED]` nu en milieu de
commentaires reste au filtre recent #19768 (dernier commentaire) --
l'elargir ici ecarterait des grains cites en prose (doc, exemples)."""
assert pig._DELIVERED_MARKER_RE.search(_VOIE3_BODY) is not None
assert pig._DELIVERED_MARKER_RE.search("[DELIVERED] sans forme lane") is None
assert pig._DELIVERED_MARKER_RE.search("merger puis [DELIVERED] lane X") is None


def test_citation_delivered_lane_ne_sarme_pas():
"""Ancrage debut de ligne : un bloc de citation `> [DELIVERED] lane`
(le verbatim d'une cloture citee en revue) ne fait pas livraison."""
assert pig._DELIVERED_MARKER_RE.search(
"> [DELIVERED] lane myia-po-2026:CoursIA -- PR #19913") is None


def test_delivered_resolved_short_cause_les_quatre_motifs():
"""Acceptance 2 : le motif court distingue les 4 predicats sans la
phrase pedagogique complete."""
assert pig._delivered_resolved_short_cause(
"LIVRAISON : SIGNAL LIVRAISON (label `candidate-delivered`) : le "
"travail de cette issue est deja livre.") == "label candidate-delivered"
assert pig._delivered_resolved_short_cause(
"LIVRAISON : SIGNAL LIVRAISON (commentaire `[INFO] "
"candidate-delivered` / `[DELIVERED] lane`) : une lane a deja rendu "
"la main.") == ("commentaire [INFO] candidate-delivered / "
"[DELIVERED] lane")
assert pig._delivered_resolved_short_cause(
"LIVRAISON : SIGNAL LIVRAISON (PR MERGEE <90j) : une PR MERGEE "
"recente cite cette issue.") == "PR MERGEE <90j"
assert pig._delivered_resolved_short_cause(
"LIVRAISON (recent) : marqueur de cloture sur le dernier "
"commentaire ([DELIVERED] / [RELEASED] / [FROZEN] / [INFO] "
"candidate-delivered). Candidat remplace.") == (
"marqueur de cloture sur le dernier commentaire")


def test_print_delivered_resolved_lines_une_ligne_par_candidat(capsys):
"""Acceptance 2 : une ligne `ECARTE (delivered-resolved): #N -- motif`
par candidat livre, AVANT les picks -- les retraits non-livraison (EN
COURS) et le motif recent ne polluent pas la sortie."""
withheld = [
({"number": 19741}, "LIVRAISON : SIGNAL LIVRAISON (label "
"`candidate-delivered`) : deja livre. Candidat remplace."),
({"number": 16031}, "LIVRAISON : SIGNAL LIVRAISON (PR MERGEE <90j) : "
"citee. Candidat remplace."),
({"number": 10643}, "LIVRAISON (recent) : marqueur de cloture sur le "
"dernier commentaire. Candidat remplace."),
({"number": 12345}, "EN COURS : PR ouverte couvrante. Candidat "
"remplace."),
]
pig.print_delivered_resolved_lines(withheld, indent=" ")
out = capsys.readouterr().out.splitlines()
ecartees = [l for l in out if "delivered-resolved" in l]
assert len(ecartees) == 3
assert ecartees[0] == (" ECARTE (delivered-resolved): #19741 -- "
"label candidate-delivered")
assert ecartees[1] == (" ECARTE (delivered-resolved): #16031 -- "
"PR MERGEE <90j")
assert ecartees[2] == (" ECARTE (delivered-resolved): #10643 -- "
"marqueur de cloture sur le dernier commentaire")
assert not any("#12345" in l for l in out)


def test_corps_contradictoire_la_retractation_l_emporte(monkeypatch):
"""Choix documente (`_delivered_state`) : un corps portant les DEUX formes
est contradictoire, la retractation l'emporte -- c'est le geste delibere,
Expand Down
Loading