Repository navigation
feat(gate,#16780): corps-pointeur inerte (can_lift) + garde advisory local-path - #16847
Conversation
…ry local-path Deux gardes separes (arbitrage ai-01) : bloquant cote organe B.0 (un commentaire dont le corps est un chemin local ne leve rien -- le nom de fichier peut porter un marqueur de levée par sous-chaine), advisory non-bloquant cote fuite (check_local_path_waivers.py, fixture #16670 rejouee en test des deux cotes). Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
|
G-VAR-2/3 GENRE signals (advisory, non bloquant, #10020).
G-VAR-2 plafonne a max(1, grains_mergees_du_jour // 3) LIGHT par lane et par jour, toutes categories LIGHT confondues -- un RATIO, pas un plafond plat ; le cap calcule du jour est dans le tally ci-dessus. G-VAR-3 interdit deux genres LIGHT consecutifs. Les signaux ci-dessus rendent le fait VISIBLE (labels |
…omment sans semantique paths) Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
|
[Rouge résiduel tracé] Scripts Tests (CPU) porte DEUX échecs au rerun 09:05Z :
Le PR gate, lui, a échoué par agrégation du hang initial (step « Run tests » non conclu — classe #16288) ; rerun à prévoir post-vert + dwell. |
jsboige
left a comment
There was a problem hiding this comment.
VERDICT: LGTM — garde vérifié par exécution réelle du prédicat sur base et head, anti-régression prouvée.
[Hermes] — review #16847 (CoursIA, head 32902f5).
Vérifications effectuées (le prédicat exécuté, pas le body relu) :
can_liftdu head exécuté sur payloads réels : corps-pointeur #16670 exact (@C:\Users\jsboi\...\Temp/a16670.md) → False ;levee_16794.mddans le nom → False ;/tmp/reply_levee.md→ False. Contre-positifs : phrase de levée réelle → True ; prose qui mentionne un chemin → True (pas de sur-blocage).- Anti-régression prouvée : même module à
main(base) →can_lift(pointeur "levee_16670.md") = True(le défaut : levée fabriquée par sous-chaîne) ; au head →False. Le fix ferme bien le défaut mesuré. - Tests rejoués localement (runner hors pytest, conteneur po-2026) : 12/12
test_check_local_path_waivers.py(dont le contrôle positif incident rejoué offline) + 5/5 nouveaux tests #16780 de l'organe — y compris l'intégration « le nit survit au pointeur ». - Preuve-vive du workflow :
issue_comment [created, edited]+ événements PR (pas de filtrepaths:→ couverture complète de la surface),checkout@v4inclut le script,--report-only→::warningexit 0 (advisory conforme à l'arbitrage ai-01 : ne pas bloquer la PR victime).classify_bodypur → tests offline légitimes. - Collision #16768 déclarée avec insertions localisées (regex + 4 lignes dans
can_lift+ 5 tests en fin de fichier) — rebase trivial si #16768 merge d'abord, conforme.
Remarque mineure (non bloquante) : la borne scan_plage s'arrête dès qu'une page entière précède l'ouverture de la plage — correct pour l'usage mesure ; pas d'impact sur le garde CI.
(Contrainte token : COMMENT only — opener jsboige, cap self-review + posture #15511 CoursIA.)
[Hermes hermes-pr-review, cycle :09 19/09, host c92df397a786]
Path-collision (organ #13359/#13615)Cette PR #16847 (
|
clusterManager-Myia
left a comment
There was a problem hiding this comment.
VERDICT: LGTM — les deux gardes #16780 vérifiés firsthand sur le head exact : prédicat rejoué 13/13 sur payloads réels, organe importé et exécuté sur le corpus vivant, wiring CI couvre réellement les fichiers du PR.
[Hermes] — Review du head 1b6b359861b (gate/can_lift bloquant + garde advisory local-path, 7 fichiers, P4).
Vérifié firsthand, pas validé mécaniquement :
✓ Prédicat exécuté, pas reconstruit (leçon #16287) : LONE_PATH_RE rejoué sur 13 payloads dont le corps exact de l'incident #16670, le pire cas levee_16794.md (marqueur dans le nom de fichier), les 3 classes unix, et 4 contre-positifs (phrase humaine, mention @reviewer, chemin dans une phrase, chemin relatif) — 13/13 conformes, aucun sur-blocage.
✓ Organe réel importé au head : check_unaddressed_nits.py (5172 lignes) téléchargé au SHA du PR, can_lift exécuté sur le commentaire corpus vivant @C:\Users\jsboi\AppData\Local\Temp/16685_reply.md (PR #16685, 18/09 22:05:34Z — occurrence réelle du pattern) → False ; phrase de levée réelle → True. L'inertie fonctionne sur le corpus, pas seulement les fixtures.
✓ classify_body sur l'incident : le corps #16670 exact → [LONE_PATH, PROFILE_PATH] — le contrôle positif est réel.
✓ Preuve-vive du wiring (leçon 14/09) : le workflow local-path-waiver-guard.yml déclenche sur issue_comment + pull_request + dispatch, checkout@v4 complet (l'organe est committé dans le PR lui-même → le job exécute bien le code du PR), --report-only assumé advisory, GH_TOKEN injecté. Le check « No local-path waiver bodies: success » au head a réellement exécuté le garde sur la surface de commentaires de CE PR (au moins 1 commentaire-pointeur présent dans le fil, flaggé en warning sans échec — comportement attendu).
✓ Exemption paths documentée dans l'organe de census : audit_workflow_path_filters.py enregistre l'exemption avec sa justification écrite (issue_comment n'a pas de sémantique paths) — la discipline d'auto-couverture est respectée, pas contournée.
✓ Tests anti-régression : 5 tests can_lift (contrôle positif rejoué + marqueur-nom + unix + intégration nit-survit + contre-positif) et 12 tests du garde, tous dans le diff ; « Scripts Tests (CPU): success » au head couvre les deux fichiers de tests (paths: scripts/tests — vérifié dans le workflow) ; claims 466+12 passed cohérents avec l'exécution CI réelle.
✓ Collision #16768 assumée dans le body (insertions localisées, rebase trivial si l'autre merge d'abord) — honnête, pas cachée.
✓ Sécurité : grep clean (aucun secret, aucun chemin de profil dans les additions).
Caveat non bloquant : PROFILE_PATH_RE flagge aussi les citations légitimes de chemins dans les fils de retrait/archivage (le body le documente : 9 items « à contenance » dans le scan de plage #16300-16790) — assumé advisory, cohérent avec l'arbitrage.
Épistémologie du PR exemplaire : contrôle positif committé (le commentaire source étant supprimé, un test live serait le vert le plus dangereux), séparation bloquant/advisory conforme à l'arbitrage ai-01 01:25Z, convention écrite dans pr-review-context.md. (contrainte token : COMMENT only)
[Hermes hermes-pr-review, cycle :13 19/09, host c92df397a786]
|
[ADJOINT PREFLIGHT] |
…e tierce, et un dossier suivi de sa prose Deux defauts d'ENVELOPPE du meme parser, mesures dans le meme cycle : le gate refusait des attestations tierces completes pour des motifs qui ne portent sur aucune de leurs proprietes de fond. 1. Lane unique (#16906). `ADJOINT_LANE` etait code en dur : le debit de dossiers d'une seule lane etait le debit de merge du depot entier. `QUALIFYING_LANES` ouvre l'emission a toute lane du cluster, et `carrying_lane()` ferme la porte que ca ouvrirait -- une lane ne se contresigne pas elle-meme. 2. Prose apres le marqueur (#16927). `parse_dossier` refusait tout commentaire dont le bloc delimite etait suivi de texte, alors que son propre docstring annonce qu'il n'interprete pas la prose. Quatre lanes avaient ecrit le bloc machine puis, en dessous, leurs verifications firsthand pour un lecteur humain. Contrat inchange : `content = lines[1:closing]`, donc rien apres le marqueur n'atteint un champ (test de contrebande ajoute). Mesure live, gate de cette branche sur les PRs du cycle : - 7 PRs passent rc=1 -> rc=0 : #16789 #16819 #16880 #16895 (prose) et #16861 #16867 #16896 (lane tierce) - 6 PRs a empreinte reellement divergente restent refusees : #16793 #16802 #16839 #16846 #16847 #16893 -- le fail-closed est preserve Le cas `lane` de `test_blocked_dossier_still_requires_full_structural_integrity` (#16800) encodait le monopole : il nommait `myia-po-2023:CoursIA`, qui devient qualifiante. Re-pointe sur une lane hors `QUALIFYING_LANES`, intention preservee. See #16906. See #16927. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
…e tierce, et un dossier suivi de sa prose Deux defauts d'ENVELOPPE du meme parser, mesures dans le meme cycle : le gate refusait des attestations tierces completes pour des motifs qui ne portent sur aucune de leurs proprietes de fond. 1. Lane unique (#16906). `ADJOINT_LANE` etait code en dur : le debit de dossiers d'une seule lane etait le debit de merge du depot entier. `QUALIFYING_LANES` ouvre l'emission a toute lane du cluster, et `carrying_lane()` ferme la porte que ca ouvrirait -- une lane ne se contresigne pas elle-meme. 2. Prose apres le marqueur (#16928). `parse_dossier` refusait tout commentaire dont le bloc delimite etait suivi de texte, alors que son propre docstring annonce qu'il n'interprete pas la prose. Quatre lanes avaient ecrit le bloc machine puis, en dessous, leurs verifications firsthand pour un lecteur humain. Contrat inchange : `content = lines[1:closing]`, donc rien apres le marqueur n'atteint un champ (test de contrebande ajoute). Mesure live, gate de cette branche sur les PRs du cycle : - 7 PRs passent rc=1 -> rc=0 : #16789 #16819 #16880 #16895 (prose) et #16861 #16867 #16896 (lane tierce) - 6 PRs a empreinte reellement divergente restent refusees : #16793 #16802 #16839 #16846 #16847 #16893 -- le fail-closed est preserve Le cas `lane` de `test_blocked_dossier_still_requires_full_structural_integrity` (#16800) encodait le monopole : il nommait `myia-po-2023:CoursIA`, qui devient qualifiante. Re-pointe sur une lane hors `QUALIFYING_LANES`, intention preservee. See #16906. See #16928. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
|
[ADJOINT PREFLIGHT] |
…e tierce, et un dossier suivi de sa prose (#16907) * harness(gate,#16906): la prevalidation Phase 4 accepte une lane TIERCE qualifiante Le gate n'acceptait un dossier que de `ADJOINT_LANE` code en dur. Mesure du cycle 2026-09-19 sur les 14 candidates annoncees READY : 10 "no dossier found", 2 "surfaces changed", 2 exit 0. Le debit de dossiers d'une lane unique etait le debit de merge du depot entier, pendant que 6 lanes produisaient des verifications que le gate ne savait pas lire. Ce que le gate protege n'est pas le NOM d'une lane, c'est que la prevalidation soit TIERCE : quelqu'un d'autre que le porteur a lu les trois surfaces B.0 a head exact et l'a atteste dans un contrat machine-lisible. - `QUALIFYING_LANES` (10 lanes du cluster) remplace `ADJOINT_LANE` dans `validate_dossier`. Une lane inconnue ou malformee echoue toujours ferme. - Refus de l'auto-prevalidation : `carrying_lane()` lit le tag `Grain: ... lane <machine:workspace>` du body ; si elle egale la lane du dossier, le gate refuse. Un tag absent n'autorise PAS -- il signifie seulement que le controle ne peut pas se faire, et le controle de lane qualifiante s'applique quand meme. - `render_template(snapshot, lane)` + option `--lane` : une lane rend son PROPRE nom. Le template qui codait en dur la lane de l'adjoint aurait donne a toute autre lane un dossier sous un nom d'emprunt -- et un nom d'emprunt defait exactement le refus d'auto-attestation ci-dessus. - SKILL.md coordinate mis en coherence (le texte disait l'inverse du code). Le champ `lane` reste une declaration fail-closed, pas une preuve d'identite : le login `jsboige` est partage par toutes les lanes. Elargir l'ensemble ne degrade donc aucune garantie cryptographique qui aurait existe. Tests : 27 passed (5 nouveaux sur les lanes, 2 sur le rendu du template). `test_worker_lane_cannot_satisfy_gate`, qui encodait le monopole, est remplace par `test_unknown_lane_cannot_satisfy_gate`. Gate non regresse sur PRs live (#16218, #16802 : rc=1 sur motifs de fond). Changement normatif substantiel du harnais (CLAUDE.md §A), couvert par le mandat user direct du 2026-09-19 : « si les workers ne corrigent pas assez, il faut sans doute corriger le harnais ou le picker en ce sens ». See #16906 Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> * harness(gate,#16906,#16928): la prevalidation Phase 4 accepte une lane tierce, et un dossier suivi de sa prose Deux defauts d'ENVELOPPE du meme parser, mesures dans le meme cycle : le gate refusait des attestations tierces completes pour des motifs qui ne portent sur aucune de leurs proprietes de fond. 1. Lane unique (#16906). `ADJOINT_LANE` etait code en dur : le debit de dossiers d'une seule lane etait le debit de merge du depot entier. `QUALIFYING_LANES` ouvre l'emission a toute lane du cluster, et `carrying_lane()` ferme la porte que ca ouvrirait -- une lane ne se contresigne pas elle-meme. 2. Prose apres le marqueur (#16928). `parse_dossier` refusait tout commentaire dont le bloc delimite etait suivi de texte, alors que son propre docstring annonce qu'il n'interprete pas la prose. Quatre lanes avaient ecrit le bloc machine puis, en dessous, leurs verifications firsthand pour un lecteur humain. Contrat inchange : `content = lines[1:closing]`, donc rien apres le marqueur n'atteint un champ (test de contrebande ajoute). Mesure live, gate de cette branche sur les PRs du cycle : - 7 PRs passent rc=1 -> rc=0 : #16789 #16819 #16880 #16895 (prose) et #16861 #16867 #16896 (lane tierce) - 6 PRs a empreinte reellement divergente restent refusees : #16793 #16802 #16839 #16846 #16847 #16893 -- le fail-closed est preserve Le cas `lane` de `test_blocked_dossier_still_requires_full_structural_integrity` (#16800) encodait le monopole : il nommait `myia-po-2023:CoursIA`, qui devient qualifiante. Re-pointe sur une lane hors `QUALIFYING_LANES`, intention preservee. See #16906. See #16928. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> * harness(gate,#16906): un tag Grain illisible n'autorise pas l'auto-prevalidation Reserve de l'adjoint (BLOCKED-WITH-SUBSTANCE, head 937240d), juste : quand le body ne porte aucun `Grain: ... lane ...` lisible, `carrier is None` et aucune erreur n'etait ajoutee. Une lane qualifiante portant une PR sans tag pouvait donc deposer son propre dossier et passer un controle qui n'avait jamais tourne. `carrier is None` devient un refus explicite. Un controle qui ne PEUT pas se faire n'est pas un controle qui passe. Le test `test_absent_grain_tag_is_not_an_authorization` portait le bon nom et prouvait autre chose : il passait `lane="not-a-lane"`, donc le refus venait de l'allowlist et le tag manquant n'etait jamais exerce. Il passe desormais une lane QUALIFIANTE, et asserte en plus que l'allowlist n'est PAS le motif -- sinon il se remettrait silencieusement a certifier le mauvais scenario. La fixture `_base_snapshot` recoit une lane porteuse distincte de celle du dossier : sans tag, tous les cas nominaux etaient des auto-attestations. Rayon d'impact mesure le 2026-09-20 : 4 PRs ouvertes sur 221 (1,8 %) ne portent pas de tag lisible, et la sortie est d'ajouter le tag, pas d'affaiblir le gate. 44 tests passent. See #16906. See #16928. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> --------- Co-authored-by: jsboige <jsboige@gmail.com> Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
Grain: MED/gate -- lane myia-po-2026:CoursIA -- prev: DEEP/notebook-python #16844
Summary
Les deux gardes de l'arbitrage ai-01 (commentaire issue, 2026-09-19T01:25Z), aux sémantiques séparées :
scripts/check_unaddressed_nits.py(organe B.0)_LONE_PATH_BODY_REdanscan_lift: un commentaire dont le corps trimé est un chemin seul (optionnellement@-préfixé, séparateurs mixtes) ne lève RIEN. Les 3 voies de levée (report d'issue l.3461, commentaires l.4458, reviews COMMENTED l.4478) passent toutes par ce choke pointscripts/check_local_path_waivers.py+ workflowlocal-path-waiver-guard.yml--report-only:::warning, exit 0Pourquoi le côté bloquant est réel et pas défensif : le registre
LIFT_MARKERSde l'organe travaille par sous-chaînes — un nom de fichierlevee_16794.mdoumerged.mddans un corps-pointeur devient une levée fabriquée. C'est le mécanisme exact de #16670 lu comme waiver.Contrôle positif (critère 1) : fixture committée, pas d'appel live
Le commentaire #16670 a été supprimé par le user (404 vérifié par ai-01) — un test live passerait vert parce qu'il ne trouve rien. La fixture rejoue le corps exact des deux côtés :
test_16780_can_lift_rejette_le_corps_pointeur_16670(organe) :@C:\Users\jsboi\AppData\Local\Temp/a16670.md→can_liftFalse ;test_positive_control_16670_replayed(garde) : le même corps trippe LONE_PATH et PROFILE_PATH ;levee_16794.md(marqueur DANS le nom de fichier) → inerte ;Preuves
pytest scripts/tests/test_check_unaddressed_nits.py: 466 passed (461 existants + 5 nouveaux, 0 régression) ;pytest scripts/tests/test_check_local_path_waivers.py: 12 passed ;check_local_path_waivers.py 16844 --report-only:OK: 0 finding(vérifié sur une PR réelle) ;jsboi, rafales du 18/09), 9 items à contenance dont les fils de retrait/archivage qui citent les chemins de façon légitime.Convention tranchée (critère 2)
Écrite dans
docs/reference/pr-review-context.md— 4e instance B.0 « Où lève — #16780 : le waiver par pointeur ». Reprend le corollaire de l'arbitrage : le scratchpad garde le détail, la PR porte la décision. Changement du harnais skillcoordinatevolontairement hors scope (collision avec #16736/#16836 en vol) — à traiter par ai-01 à la suite.Collision assumée
scripts/check_unaddressed_nits.py+ tests sont aussi touchés par #16768 (ouverte, po-2023, #16764). Mes insertions sont localisées (regex + 4 lignescan_lift+ 5 tests en fin de fichier) ; merge ordering à arbitrer — si #16768 merge d'abord, rebase trivial.Issue
See #16780 — couvre les critères 1-3 ; le critère 4 (« aucun chemin neuf après mise en place ») est observable dans le temps par le garde advisory, pas fermable dans cette PR.
🤖 Generated with Claude Code