Skip to content

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

@jsboige

Grain: MED/guard — lane myia-ai-01:CoursIA — prev: DEEP/notebook-python #15886

Le défaut

scripts/check_unaddressed_nits.py évaluait has_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() rendait None, la remarque n'était jamais enregistrée, l'organe rendait rc=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_eligible initialement rangée en « réfutée » était juste (fonction imbriquée dans analyse, ligne 3743 du blob 5f49b86bb016) — 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

  • 1. Un corps contenant CHANGES_REQUESTED et 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-CONCERN pour les trois auteurs ; mécanisme _formal_concern_precedes_lift (scripts/check_unaddressed_nits.py:1737, trappe classify :3692).
    • Échoue sur le code d'avant (4 failed / 6 passed, blob base 7bc34fc561).
  • 2. Le corps du 03:14:32Z de fix(gametheory,#15210): distillation 06e Aumann/Nash/correlated -- rebase propre (1 fichier, +209/-195) #15862 continue à ne rien lever.
    • test_15920_suivi_031432_ne_leve_rien (:226) : has_live_lift → False, classify → None, inchangé avant/après.
  • 3. [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).
    • Bornes : levée réelle (:234), « [HOLD X] levé » (:264).

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, \n final) ; le heading d'émission et « est levée » restent verbatim. Les fixtures #15868 sont byte-exacts.

Evidence

Activity

  1. jsboige commented on Sep 13, 2026

    @jsboige
    OwnerAuthor

    Correction — l'hypothèse « _lift_eligible n'existe pas » est fausse, et c'est moi qui l'ai publiée

    Le 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 que lift_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 5f49b86bb016 de origin/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 espaces
    def 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_eligible lève AttributeError. 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_eligible fait réellement

    Quatre voies, dans l'ordre :

    1. marqueur d'override dans le lift → lève tout, testé en premier ;
    2. 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) ;
    3. cross-lane — même forme, préfixe [owner:workspace] ancré en tête ;
    4. auto-levée voix nue — lift sans persona, sans lane, sans préfixe de rôle, et has_live_lift vrai.

    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() évalue has_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-3

    Le 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 AttributeError sur 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 ».

  2. added a commit that references this issue on Sep 14, 2026
  3. added a commit that references this issue on Sep 14, 2026
  4. myia-ai-01 commented on Sep 17, 2026

    @myia-ai-01
    Collaborator

    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).

  5. myia-ai-01 commented on Sep 17, 2026

    @myia-ai-01
    Collaborator

    [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 finale Closes #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 50220bc7 a 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.
  6. jsboige commented on Sep 18, 2026

    @jsboige
    OwnerAuthor

    Fermeture sur autorisation user directe (2026-09-18), après vérification adverse indépendante.

    Livré par #16306 (squash 5694be7beb, ancêtre de origin/main = fc8da0912e).

    Critère Preuve re-mesurée sur origin/main
    Un CHANGES_REQUESTED avec levée antérieure reste un concern mécanisme _formal_concern_precedes_lift défini l.1737, branché dans classify l.3831 ; test test_15920_reserve_avec_levee_anterieure_ne_s_eteint_pas
    Le 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 concern HOLD_TAGGED_HEAD l.299, voie _block_emitted l.2791/2852, classify → "BLOCK" l.3843 ; fixture byte-identique au commentaire 5650853314

    Contrô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_MARKERS et CONCERN_MARKERS sont byte-identiques base ↔ head ↔ main (diff binaire cat-file vide). Le filet n'a pas été élargi à la prose — c'était la ligne rouge de #14682.

    Note d'hygiène : le squash porte Closes #15920 dans son message de commit (le body de PR avait été corrigé en See, 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.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions