Skip to content

output-failure ratchet: faux positif sur cellule byte-identique a la base (condition #19038 ne verifie pas que la sortie a change) #19877

Description

@jsboige

Sans parent : organe autonome (gate Output-failure ratchet), fondé par #11685 et durci par #19038 (issue #18916) -- tous deux clos. Voisin de #19870 : même famille, une exemption de gate qui ne vérifie pas la condition qu'elle est censée détecter.

Le défaut

scripts/notebook_tools/check_output_failure_text.py, fonction _declared_fallback (condition de base introduite par #19038) :

base_cell = _base_cell_for(base_nb, cell)
if base_cell is not None and _substantial_output(base_cell):
    return False   # -> reste TOOL_FAILURE

L'intention documentée : « la bannière a REMPLACÉ un rendu, c'est une perte de capacité ». Mais la condition ne vérifie jamais que la sortie de la cellule a changé entre base et head. Elle nie l'exemption dès que la cellule de base portait une sortie substantielle -- y compris quand la cellule de head est byte-identique (id, source ET sorties) à la base. Or une cellule identique n'a rien remplacé : la bannière était déjà là, committée sur main.

L'asymétrie vient de compare() : la base est scannée sans base_nb (choix documenté, sain par ailleurs), donc sa bannière déclarée y est comptée DECLARED_FALLBACK ; le head est scanné avec la base, où la même bannière devient TOOL_FAILURE. Delta 0 -> 1 sur une cellule que la branche n'a pas touchée.

Mesure (PR #19831, RL/RL-06d-SAC-Depuis-Zero-Python.ipynb)

La branche modifie une ligne du carnet (un titre markdown de section). La cellule 39 (id=2614768a, exercice 3 : adapter SAC) :

Grandeur Base (origin/main) Head
id 2614768a 2614768a
source — byte-identique
sortie texte bannière « LunarLanderContinuous-v2 non disponible » + lignes substantielles byte-identique
_substantial_output True —

Scan reproduit en local :

BASE TOOL_FAILURE: []
BASE DECLARED    : [(39, 'non disponible')]
HEAD TOOL_FAILURE: [(39, 'non disponible')]
HEAD DECLARED    : []

check_output_failure_text.py origin/main -> FAIL ... TOOL_FAILURE: 0 -> 1 (+1), exit 1 -- alors que le diff du carnet est 1 file changed, 1 insertion(+), 1 deletion(-) (un titre markdown).

La bannière est imprimée par la source de la cellule elle-même (try/except de l'exercice, littéral dans la source) : c'est le repli pédagogique conçu, présent sur main, inchangé par la PR.

Pourquoi aucune action de lane ne verdit ce rouge

Correctif proposé (non appliqué ici)

Nier l'exemption seulement quand la bannière a réellement remplacé quelque chose :

if (base_cell is not None and _substantial_output(base_cell)
        and _cell_output_text(cell) != _cell_output_text(base_cell)):
    return False

Attendu : fixture de regression dans --self-test construite sur ce cas, et rejeu local sur le couple base/head de RL-06d qui passe de FAIL (1 regressed) à 0 regressed.

Contexte de la mesure : PR #19831 (gate rouge à la tête 85f299bde8a).

Activity

  1. jsboige commented on Oct 8, 2026

    @jsboige
    OwnerAuthor

    [CLAIMED] lane myia-po-2024:CoursIA -- fix _declared_fallback (comparaison sortie head vs base) + fixture self-test -- paths: scripts/notebook_tools/check_output_failure_text.py

  2. jsboige commented on Oct 8, 2026

    @jsboige
    OwnerAuthor

    Ferme : le defaut decrit n'existe plus sur main -- il n'existait que sur la copie ancienne de l'organe que porte ma branche.

    Mesure de renversement (rejeu du script ACTUEL de main sur le couple base/head de RL-06d, cwd = branche #19831) :

    python <main>/scripts/notebook_tools/check_output_failure_text.py origin/main
    base origin/main -> merge-base eadde577e459 | 13 changed notebooks | 0 regressed   (rc=0)
    

    Preuve atomique conservee dans le corps de cette issue (la mesure sur la copie ancienne reste exacte pour cette copie). Aucune PR a ouvrir.

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

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions