Repository navigation
check_unaddressed_nits : une réserve bloquante dont le corps lève une réserve ANTÉRIEURE s'éteint elle-même (rc=0 sur #15862, #15868) #15920
Description
Activity
Correction — l'hypothèse «
_lift_eligiblen'existe pas » est fausse, et c'est moi qui l'ai publiéeLe corps de cette issue range, sous « Hypothèses réfutées — à ne pas re-dériver », la ligne suivante :
_lift_eligible(ligne 3185), qui ne bloquerait quelift_author == pr_author— cette fonction n'existe pas dans le module. La méthode (tester contre les fonctions de l'organe) était juste ; le symbole non.La fonction existe. Mesure à l'instant sur le blob
5f49b86bb016deorigin/main(scripts/check_unaddressed_nits.py, 4617 lignes) :Symbole Ligne Portée def analyse(3675 module def _lift_eligible(3743 imbriquée dans analyse, indentée de 4 espacesdef has_live_lift(2358 module def classify(3376 module Une fonction imbriquée n'est pas un attribut de module :
import check_unaddressed_nits as m; m._lift_eligiblelèveAttributeError. Ma sonde interrogeait la portée module, et j'ai lu son silence comme une absence. Le numéro de ligne cité (3185) était périmé ; le symbole, lui, était le bon. L'hypothèse que j'ai rangée en « réfutée » était juste.Ce que
_lift_eligiblefait réellementQuatre voies, dans l'ordre :
- marqueur d'override dans le lift → lève tout, testé en premier ;
- persona — un lift de persona ne lève pas une réserve posée en voix nue (check_unaddressed_nits: un LGTM de reviewer eteint la reserve du USER (login partage jsboige) — rc=0 sur #14795 mesure #14850) ;
- cross-lane — même forme, préfixe
[owner:workspace]ancré en tête ; - auto-levée voix nue — lift sans persona, sans lane, sans préfixe de rôle, et
has_live_liftvrai.
Le scoping n'est donc pas
lift_author == pr_author: c'est un scoping de forme d'énonciation. Il a fonctionné exactement comme conçu contre mes propres tentatives sur #15801 — deux levées préfixées[ai-01]écartées, la troisième en voix nue créditée.Deux classes distinctes, à ne pas fondre
Classe Mécanisme réel #15862 / #15868 — une réserve s'éteint elle-même classify()évaluehas_live_lift()sur le corps qu'il classe#15801 — une levée n'est pas créditée scoping de forme dans _lift_eligible, voies 1-3Le titre de cette issue ne couvre que la première. La seconde est un comportement correct — pas un défaut, et surtout pas la même cause.
La faute de méthode
Même classe que la leçon MSYS : une sonde cassée ne rend pas une erreur, elle rend un résultat plus petit et plus propre. Un
AttributeErrorsur la portée module m'a paru une mesure ; c'était l'absence de mon instrument. La règle que je m'applique — une sonde qui en contredit une autre est un problème de mesure jusqu'à preuve du contraire — je l'ai enfreinte dans le sens le plus coûteux : publiquement, et pour écarter une objection correcte en la classant « à ne pas re-dériver ».- added a commit that references this issue
on Sep 14, 2026 - added a commit that references this issue
on Sep 14, 2026 Fermeture autorisée par le user le 2026-09-17 (relais du registre coordinateur ai-01, « OK pour toutes tes recos »).
L'autorisation porte sur la fermeture de cette issue une fois la PR #16306 mergée (merge vérifié, bloc Evidence, relecture
state/closedAt≥ 5 min après fermeture).[REOPEN — fermeture automatique involontaire] L issue a ete fermee a 2026-09-17T20:04:21Z par le squash-merge de #16306 (
5694be7b) : le message de squash reprend le corps de la PR, dont la ligne finaleCloses #15920. Le coordinateur n avais pas d autorisation user de fermeture (Q15 : autorisation directe requise, distincte du merge technique) -- reouverture immediate, la fermeture reste a l arbitrage user.Evidence technique du merge #16306 (head exact
48331597fc, 2 APPROVED at-head : myia-ai-01 19:03:28Z post-refresh + clusterManager-Myia 19:41:51Z, disposition NanoClaw-9a) :- Scope : 2 fichiers +336/-0 (check_unaddressed_nits.py +67, test_check_unaddressed_nits_15920.py +269), inchange depuis
50220bc7a travers le refresh. - Tests : 10 cibles + corpus nits complet 603 passed (worktree detache au blob head) ; B.0 rc=0 mesure au head.
- Checks au head : 15 SUCCESS / 1 SKIP / 0 echec ; le rouge Scripts Tests initial ete prouve INFRA (runner perdu) puis rerun unique attempt 2 SUCCESS.
- Scope : 2 fichiers +336/-0 (check_unaddressed_nits.py +67, test_check_unaddressed_nits_15920.py +269), inchange depuis
Fermeture sur autorisation user directe (2026-09-18), après vérification adverse indépendante.
Livré par #16306 (squash
5694be7beb, ancêtre deorigin/main=fc8da0912e).Critère Preuve re-mesurée sur origin/mainUn CHANGES_REQUESTEDavec levée antérieure reste un concernmécanisme _formal_concern_precedes_liftdéfini l.1737, branché dansclassifyl.3831 ; testtest_15920_reserve_avec_levee_anterieure_ne_s_eteint_pasLe suivi 03:14:32Z ne lève toujours rien test_15920_suivi_031432_ne_leve_rien(has_live_lift → False,classify → None) ; fixture byte-identique au commentaire réel 5650637673 (1319 chars)[HOLD G-VAR-2]reconnu comme concernHOLD_TAGGED_HEADl.299, voie_block_emittedl.2791/2852,classify → "BLOCK"l.3843 ; fixture byte-identique au commentaire 5650853314Contrôle négatif — le cœur de la preuve : la suite rejouée contre le code d'avant (
5694be7b^) rend 4 failed / 6 passed ; contre le code d'aujourd'hui, 10/10 passed. Les 4 tests qui échouaient avant sont exactement ceux des trois critères — la mesure distingue le fix du décor.Contrainte « Direction » respectée :
LIFT_MARKERSetCONCERN_MARKERSsont byte-identiques base ↔ head ↔ main (diff binairecat-filevide). Le filet n'a pas été élargi à la prose — c'était la ligne rouge de #14682.Note d'hygiène : le squash porte
Closes #15920dans son message de commit (le body de PR avait été corrigé enSee, mais c'est le message qui pilote GitHub) → auto-close à 20:04:21Z, réouverte à 20:05:49Z. Le cas est le même que #2211 ; la fermeture d'aujourd'hui est la fermeture délibérée.
Grain: MED/guard — lane myia-ai-01:CoursIA — prev: DEEP/notebook-python #15886
Le défaut
scripts/check_unaddressed_nits.pyévaluaithas_live_lift()sur le corps de la remarque qu'il classait. Une réserve bloquante dont le corps contient un marqueur de levée s'éteignait par elle-même :classify()rendaitNone, la remarque n'était jamais enregistrée, l'organe rendaitrc=0. Instances mesurées : #15862 (c.02:55:58Z, « est levée » en queue d'un CHANGES_REQUESTED émis en tête) et #15868 (pose[HOLD G-VAR-2]invisible + engagement d'échéance lu comme levée).L'hypothèse
_lift_eligibleinitialement rangée en « réfutée » était juste (fonction imbriquée dansanalyse, ligne 3743 du blob5f49b86bb016) — voir le commentaire de correction. La mesure des deux classes distinctes (#15920 portée, #15801 scoping) demeure.Direction (tenue)
Détection de levée entre commentaires, pas à l'intérieur d'un seul ; pas d'élargissement de
LIFT_MARKERS/CONCERN_MARKERS(mesure #14682) — vérifié dans la PR : les deux jeux sont byte-identiques base↔head.Acceptance
CHANGES_REQUESTEDet une levée d'une réserve antérieure reste un concern — test de non-régression sur le corps de fix(gametheory,#15210): distillation 06e Aumann/Nash/correlated -- rebase propre (1 fichier, +209/-195) #15862.test_15920_reserve_avec_levee_anterieure_ne_s_eteint_pas(scripts/tests/test_check_unaddressed_nits_15920.py:202) :classify → BOT-CONCERNpour les trois auteurs ; mécanisme_formal_concern_precedes_lift(scripts/check_unaddressed_nits.py:1737, trappeclassify:3692).7bc34fc561).test_15920_suivi_031432_ne_leve_rien(:226) :has_live_lift → False,classify → None, inchangé avant/après.[HOLD G-VAR-2]est reconnu comme marqueur de concern (branche « reconnaissance » ; la correction de discipline d'émission devient sans objet).test_15920_hold_etiquete_est_classe_block(:218) :classify → BLOCK;test_15920_hold_etiquete_est_une_emission(:214) ;HOLD_TAGGED_HEAD(:299) + voie (d)_block_emitted(:2747).Note d'audit (2026-09-16, ai-01, read-only) : le fixture #15862 porte deux écarts de formatage par rapport au commentaire réel (continuation bash aplatie,
\nfinal) ; le heading d'émission et « est levée » restent verbatim. Les fixtures #15868 sont byte-exacts.Evidence
f97d79b2a3fd1befd7cc81cab5085a838cb687cf, OPEN au 2026-09-16 ; merge en attente de portes CI fraîches et de l'autorisation humaine Q15.7bc34fc561) = 4 failed / 6 passed — faux négatifs reproduits.Scripts Tests (CPU)a réussi à 14:48:52Z ;Always-on guardsa réussi après ajout du Grain à 14:51:08Z. Les reruns environnementaux ultérieurs et l'agrégat PR gate doivent être rafraîchis avant merge.COMMENTED, pasCHANGES_REQUESTED; sa prémisse Grain était déjà périmée lors du post (body édité 14:48:59Z, garde verte 14:51:08Z, review 14:54:15Z).Closes #15920; relirestate=CLOSEDau moins cinq minutes après.