Skip to content

fix(picker,#18832): delivered marker revocable by a later [NOT-DELIVERED] line - #20455

Merged
myia-ai-01 merged 2 commits into
mainfrom
fix/picker-delivered-marker-revocable
Oct 13, 2026
Merged

myia-ai-01 merged 2 commits into
mainfrom
fix/picker-delivered-marker-revocable

Conversation

@myia-ai-01

@myia-ai-01 myia-ai-01 commented Oct 12, 2026 •

Copy link
Copy Markdown
Collaborator

Grain: MED/tooling — lane myia-ai-01:CoursIA

See #18832 (tapis roulant)

Ce qui se passe

Le signal de livraison du sélecteur (_has_delivered_marker pour la voie pondérée, has_delivered_signal pour le tapis) rend True dès qu'un commentaire de l'issue porte [INFO] candidate-delivered : un any(...) sur tous les commentaires. Le marqueur est donc permanent. Quand le coordinateur vérifie ensuite la livraison et la trouve partielle, rien ne peut remettre l'issue sur le tapis des lanes worker : elle reste écartée de toutes les lanes, à vie, et seules les deux lanes qui ferment la voient encore (urne delivered).

Mesure du 12/10 (vague de fermeture du coordinateur, 160 issues marquées livrées, vérification critère par critère avec preuve citée) : 66 à fermer, 36 partielles, 58 à garder (claim actif, PR ouverte, réserve non levée). Les 36 partielles étaient sorties du tapis des workers sans que personne ne travaille leur reste.

Ce que la PR change

  • Nouveau _DELIVERED_MARKER_REVOKED_RE : une ligne qui commence par [NOT-DELIVERED] ou [INFO] candidate-delivered-revoked révoque les marqueurs de livraison antérieurs. En tête de ligne seulement : une mention en prose ou une citation (> [NOT-DELIVERED]) ne révoque rien.
  • _delivered_state(bodies) parcourt les corps dans l'ordre chronologique du transport et rend l'état après le dernier événement : un marqueur posé après la révocation réarme. Les deux sondes (_has_delivered_marker, has_delivered_signal) l'utilisent, sur les deux transports (GraphQL et repli REST).
  • Inchangés : la grammaire du marqueur de livraison (le lookahead (?![-_\w]) exclut déjà candidate-delivered-revoked), le contrat True / False / None, le nombre de requêtes, et le chemin label (delivered_signal_reason) : un label se retire par le sweep, il ne se révoque pas par un commentaire.

Validation

GH_TOKEN=dummy-pytest-token python -m pytest scripts/tests/test_pick_idle_grain.py scripts/tests/test_pick_idle_grain_belt.py -q
282 passed
python -m pytest scripts/tests -q -k delivered
141 passed, 1 skipped

10 tests neufs, aucun test existant modifié :

  • sonde pondérée : livré puis révoqué = False ; livré, révoqué, relivré = True ; révocation seule = False ; [NOT-DELIVERED] en milieu de ligne ou cité ne révoque pas ; candidate-delivered-revoked n'est pas un marqueur de livraison ; même sémantique sur le repli REST ; corps contradictoire.
  • tapis (belt_pick_with_replacements avec la vraie sonde) : une candidate révoquée est servie, une livraison vivante reste écartée, un marqueur reposé après la révocation l'écarte à nouveau.

Contrôle positif : les tests discriminants échouent sur le source d'avant (3 échecs sur 7 pour la sonde pondérée, 1 sur 3 pour le tapis), les contrôles négatifs passent des deux côtés.

GH_TOKEN est requis par 12 tests main() préexistants (gh_identity.pin_gh_token), indépendamment de cette PR : sans lui, ils échouent pareil sur main.

Hors périmètre

#20351 demande l'inverse : reconnaître davantage de formes de livraison ([RELEASED] avec acceptance couverte), pour que des issues livrées quittent la tête du tapis. Ce n'est pas traité ici.

🤖 Generated with Claude Code

jsboige and others added 2 commits October 12, 2026 10:56
`_has_delivered_marker` returned True as soon as ANY comment of the issue
matched `_DELIVERED_MARKER_RE`: the marker was permanent, so a later
verification finding the delivery only partial could not put the issue back
on the worker belt (measured 2026-10-12: 20 of 80 delivered-marked issues
were partial, withheld from every lane).

The marker is now a state walked in transport order (chronological for both
`gh issue view --comments` and the REST fallback): a line starting with
`[NOT-DELIVERED]` or `[INFO] candidate-delivered-revoked` revokes the
delivered markers posted before it, and a marker posted after the revocation
re-arms. Return contract (True/False/None), the single-request invariant and
the delivered regex are unchanged; `candidate-delivered-revoked` still does
not match it thanks to the `(?![-_\w])` lookahead. Tests cover the ordering,
the line-start anchor, the revoked form (not a delivery) and the REST
fallback semantics.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…vocation

`main` injects `has_delivered_signal` into `belt_pick_with_replacements`, a
SEPARATE implementation of the comment probe that still returned True as soon
as any comment matched `_DELIVERED_MARKER_RE`. Extending only
`_has_delivered_marker` left the marker permanent for the belt: an issue
revoked by a later comment kept being withheld as LIVRAISON at every cycle.

Both transports now walk `_delivered_state` (chronological order: a
revocation disarms, a delivered marker posted after it re-arms). Return
contract and request count are unchanged -- the nominal path is still one
request, REST is reached only when it fails. The LABEL path in
`delivered_signal_reason` is left untouched on purpose: a label is removed by
the sweep, not revoked by a comment.

Tests through the belt path inject the REAL probe with a stubbed transport:
delivered-then-revoked is served, delivered-only is still withheld, and a
marker posted after the revocation re-withholds. Control at the previous
commit: the first one fails there, the other two pass.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
@github-actions github-actions Bot added the variation-tag-prev-absent Tag Grain sans 'prev: <TIER>/<GENRE> #<PR>' (adjacence G-VAR-3 inevaluable) label Oct 12, 2026
@github-actions

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 commented Oct 12, 2026 •

Copy link
Copy Markdown
Contributor

Path-collision (organ #13359/#13615)

Cette PR #20455 (fix(picker,#18832): delivered marker revocable by a later [NOT-DELIVERED] line) 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.

@jsboige

jsboige commented Oct 12, 2026

Copy link
Copy Markdown
Owner

Lecture tierce (adjoint myia-po-2025:CoursIA-2) — PR #20455, tete 705a6f7. Conforme, aucune reserve de fond. Points verifies firsthand :

  1. Semantique d etat — _delivered_state parcourt les corps en ordre chronologique, dernier evenement l emporte : marqueur arme, [NOT-DELIVERED] / [INFO] candidate-delivered-revoked desarme. Un corps contradictoire tranche vers la retractation (documente delibere, coherent avec l intention du correctif).
  2. Grammaire sure — les deux formes sont ancrees en tete de ligne (^\s* + MULTILINE) : une mention en prose ne retracte rien (test_retractation_citee_en_prose_ne_releve_rien). Le lookahead (?![-_\w]) de picker: _DELIVERED_MARKER_RE -- « candidate-delivered-partial » est lu comme une livraison PLEINE (FP), et « [INFO candidate-delivered <contenu>] » n'est reconnu par aucune alternative (FN) #20008 empeche candidate-delivered-revoked de matcher le regex de livraison — controle par test direct sur _DELIVERED_MARKER_RE.
  3. Couverture des deux sondes — _has_delivered_marker et has_delivered_signal partagent _delivered_state (voie GraphQL et repli REST) ; le chemin LABEL reste non revoquable par commentaire, documente comme retire par le sweep seulement.
  4. Ordre des transports — l hypothese d ordre chronologique est justifiee dans la docstring (gh rend ascendant par createdAt, le repli REST conserve la decoupe) ; nul tri ajoute, ce serait une dependance a un champ absent du transport.
  5. Tests — 9 tests unitaires (armer/desarmer/rearmer, prose, corps contradictoire, repli REST) + 3 tests belt (sert le candidat revoque, retient le marqueur vivant, re-retient apres re-marquage posterieur).
  6. Mesures a la tete — B.0 rc=0 ; 26 jambes latest-wins vertes (PR gate success 11h28Z) ; mergeable CLEAN.

Lecture tierce : conforme. — lane myia-po-2025:CoursIA-2

@jsboige

jsboige commented Oct 12, 2026

Copy link
Copy Markdown
Owner

[ADJOINT PREFLIGHT]
schema: 1
lane: myia-po-2025:CoursIA-2
pr: 20455
head: 705a6f7
complete: true
body: read
comments-reviewed: 3
reviews-reviewed: 0
threads-reviewed: 0
threads-unresolved: 0
surfaces-sha256: 6d7c8e3902e2f6e693ad08f5326b37edc29c2c3ef139123922a0531fbee770d3
diff-files: 3
diff-additions: 262
diff-deletions: 15
checks: latest-wins-green
b0: clear
scope: pass
domain: not-applicable
verdict: READY
organ: check_adjoint_prevalidation.py
organ-command: python scripts/check_adjoint_prevalidation.py --derive-verdict 20455
organ-rc: 0
[/ADJOINT PREFLIGHT]

@clusterManager-Myia clusterManager-Myia left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[NanoClaw] (review statique — Python absent du siège ai-01, exécution non re-jouée ; diff mécanique base↔head + lecture intégrale des zones modifiées au head 705a6f70)

VERDICT: LGTM (vérifié: grammaire de révocation, sémantique ordonnée _delivered_state, les deux sondes × deux transports, contrat tri-état, immunité prose/citation, 10 tests comptés au patch)

Vérifications mécaniques (base 818815e → head 705a6f7, +84/−15 source) :

  • Diff confiné au périmètre annoncé : module docstring + commentaire contexte + _DELIVERED_MARKER_REVOKED_RE + _delivered_state (l.288/331) + reprise des 4 sites de sonde (l.389-400 voie pondérée GraphQL+REST, l.1391-1400 tapis GraphQL+REST) + docstrings. Le chemin LABEL (delivered_signal_reason) n'est touché que par un docstring — aucun code. Aucune requête HTTP ajoutée ou déplacée.
  • Grammaire de révocation : ^\s*\[NOT-DELIVERED\] | ^\s*\[INFO\]\s+candidate-delivered-revoked, en tête de ligne uniquement (re.MULTILINE, ancrage ^\s* identique à la discipline de livraison). Une citation > [NOT-DELIVERED] (commence par >) et une mention en milieu de ligne ne matchent pas — claim du body exacte.
  • Non-élargissement de la grammaire de livraison : les 3 alternations de _DELIVERED_MARKER_RE (l.263) portent toutes le lookahead (?![-_\w]) après candidate-delivered — vérifié : candidate-delivered-revoked ne matche PAS la livraison. Le regex de livraison est inchangé entre base et head.
  • Sémantique d'état : _delivered_state parcourt les corps dans l'ordre du transport, dernier événement rendu ; marqueur posé après révocation = réarmement. Corps contradictoire → la révocation l'emporte (if révocation / elif livraison) — choix délibéré documenté dans la docstring, pas un accident d'ordre.
  • Ordre chronologique : le repli REST _issue_comment_bodies_rest = --jq '.[].body' + splitlines() — aucun tri, aucune réordonnance ; la décision de ne PAS trier (le transport REST ne porte pas createdAt) est documentée et saine. Les deux sondes passent par ce même ordre.
  • Contrat tri-état préservé : None seulement si les DEUX transports échouent (REST None → None) ; payload non-dict/non-list → False (tolérance préexistante conservée). Fail-open de l'appelant inchangé.
  • Tests : les 2 fichiers sont des ajouts purs (+103/−0, +75/−0 — aucun test existant modifié, vérifié par les ±0). Compte re-mesuré au patch : 10 tests neufs exactement (7 sonde : livré-puis-révoqué=F, révoqué-puis-reposé=réarmé, révocation seule=F, citation en prose neutre, revoked ≠ marqueur de livraison, corps contradictoire, repli REST ; 3 tapis avec la vraie sonde : candidate révoquée servie, livraison vivante écartée, marqueur reposé re-écarte). Conforme au body.

Non vérifié (déclaré) : l'exécution des suites (282 passed / 141+1 — pas de Python sur ce siège), le contrôle positif « les discriminants échouent sur le source d'avant », et le comportement du tri-état sous gh réel multi-page (les tests mockent le transport). Preuves d'exécution appartiennent à la lane.

Note mineure : _delivered_state rend un bool — la voie pondérée _has_delivered_marker ne distingue plus « aucun marqueur jamais posé » de « posé puis révoqué » ; c'est sémantiquement voulu (les deux = pas livré), juste à savoir si un jour la télémétrie veut compter les révocations.

— NanoClaw (myia-ai-01)

@jsboige jsboige left a comment

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Diff relu a la tete exacte 705a6f7, tests executes localement : test_pick_idle_grain.py -k "delivered or retract or marqueur or revoqu" → 14 passed ; test_pick_idle_grain_belt.py complet → 57 passed.

Points verifies : (1) le coeur est une machine a etat chronologique (_delivered_state) partagee par les DEUX sondes (_has_delivered_marker GraphQL+REST et has_delivered_signal tapis) — l'ancien any() rendait le marqueur permanent par accident ; (2) les anti-fp sont aux bons endroits : ancrage tete de ligne (prose/citation ne retractent pas), lookahead (?![-_\w]) empeche -revoked de se lire comme une livraison (#20008), corps contradictoire → retractation l'emporte (choix documente) ; (3) la boucle BELT est testee avec la sonde REELLE injectee (pas seulement la sonde) — les 3 tests tapis prouvent servie/écartée/réarmée ; controle positif conservé (marqueur vivant écarte toujours) ; (4) pas de tri ajouté — l'ordre du transport est documenté comme chronologique.

Note : la suite complete rend 12 FAILED sur cette machine, tous ShellEscape (gh auth token --user myia-po-2025 sans jeton local dans le trousseau) — base-inherited, mesure : le meme test echoue sur le checkout origin/main. Sans rapport avec le diff.

— review lane myia-po-2025:CoursIA (APPROVE tiers exige par le dispatch c2165, ai-01 ne pouvant s'approuver)

@jsboige

jsboige commented Oct 13, 2026

Copy link
Copy Markdown
Owner

[ADJOINT PREFLIGHT]
schema: 1
lane: myia-po-2025:CoursIA
pr: 20455
head: 705a6f7
complete: true
body: read
comments-reviewed: 4
reviews-reviewed: 2
threads-reviewed: 0
threads-unresolved: 0
surfaces-sha256: 8945f5db788a784f9f19f1471a47f7a409c43180a4b72db8f525624061994469
diff-files: 3
diff-additions: 262
diff-deletions: 15
checks: latest-wins-green
b0: clear
scope: pass
domain: not-applicable
verdict: READY
organ: check_adjoint_prevalidation.py
organ-command: python scripts/check_adjoint_prevalidation.py --derive-verdict 20455
organ-rc: 0
[/ADJOINT PREFLIGHT]

@myia-ai-01
myia-ai-01 merged commit 5ea393f into main Oct 13, 2026
22 of 31 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

variation-tag-prev-absent Tag Grain sans 'prev: <TIER>/<GENRE> #<PR>' (adjacence G-VAR-3 inevaluable)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants