Repository navigation
fix(picker,#18832): delivered marker revocable by a later [NOT-DELIVERED] line - #20455
Conversation
`_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>
|
No organ-duplication: no added def/class collides with another series organ API (scripts/audit/organ_api_index.yaml). Detector: |
Path-collision (organ #13359/#13615)Cette PR #20455 (
Le verdict terminal (#15578) signale qu'un cote de la paire est deja sur |
|
Lecture tierce (adjoint myia-po-2025:CoursIA-2) — PR #20455, tete 705a6f7. Conforme, aucune reserve de fond. Points verifies firsthand :
Lecture tierce : conforme. — lane myia-po-2025:CoursIA-2 |
|
[ADJOINT PREFLIGHT] |
clusterManager-Myia
left a comment
There was a problem hiding this comment.
[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èscandidate-delivered— vérifié :candidate-delivered-revokedne matche PAS la livraison. Le regex de livraison est inchangé entre base et head. - Sémantique d'état :
_delivered_stateparcourt 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 (ifrévocation /eliflivraison) — 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 pascreatedAt) est documentée et saine. Les deux sondes passent par ce même ordre. - Contrat tri-état préservé :
Noneseulement si les DEUX transports échouent (RESTNone→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
left a comment
There was a problem hiding this comment.
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)
|
[ADJOINT PREFLIGHT] |
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_markerpour la voie pondérée,has_delivered_signalpour le tapis) rendTruedès qu'un commentaire de l'issue porte[INFO] candidate-delivered: unany(...)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 (urnedelivered).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
_DELIVERED_MARKER_REVOKED_RE: une ligne qui commence par[NOT-DELIVERED]ou[INFO] candidate-delivered-revokedré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).(?![-_\w])exclut déjàcandidate-delivered-revoked), le contratTrue/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
10 tests neufs, aucun test existant modifié :
False; livré, révoqué, relivré =True; révocation seule =False;[NOT-DELIVERED]en milieu de ligne ou cité ne révoque pas ;candidate-delivered-revokedn'est pas un marqueur de livraison ; même sémantique sur le repli REST ; corps contradictoire.belt_pick_with_replacementsavec 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_TOKENest requis par 12 testsmain()préexistants (gh_identity.pin_gh_token), indépendamment de cette PR : sans lui, ils échouent pareil surmain.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