Repository navigation
Conversation
…e, plus seulement le bandeau Le strip laissait derriere lui une entree display_data a text/html vide quand le bandeau occupait tout l'output (forme chaine, et forme liste a un seul element) : il remplacait la valeur par "" au lieu de retirer l'output. Le residu etait permanent par construction -- sans bandeau, count_banner_lines rend 0, la boucle saute le carnet, et l'enveloppe n'est plus jamais revue. - strip_banner_in_place retire l'enveloppe vide qu'elle vient de creer, y compris celles heritees d'une version anterieure de l'outil (correctif auto-reparateur). Retrait textuel, comme le reste de l'organe : aucune re-serialisation JSON, les sorties voisines restent byte-identiques ; le saut de ligne et l'indentation sont consommes avec l'entree, sinon une ligne d'espaces resterait dans le tableau. - --scan-all --check compte desormais le residu (count_empty_envelopes) et echoue dessus : c'est la cecite qui a laisse 53 carnets en place. - Sweep des 53 carnets concernes (0 insertion / 371 suppressions, aucun sous-module). Temoin discriminant : --scan-all --check --exclude-submodules rc=1 avec 53 defauts sur la base, rc=0 apres le sweep. 32 tests de l'organe verts. Closes #20190 Co-Authored-By: Claude Haiku 4.5 (1M context) <noreply@anthropic.com>
|
Organ-duplication detector ABSTAINS: merge-base unresolved or structural error -- no verdict. See workflow log. Detector: |
Notebook outputs-required (H.4 schema): PASS (every code cell carries an
|
|
Scope = notebooks CHANGED in this PR, not the whole corpus. Explicit |
|
Scope = notebooks CHANGED in this PR, not the whole corpus. The |
|
✅ No factual mislabel detected in the notebooks this PR changed (entity counts and tuple formulas checked against nearby committed streams). Scope = notebooks CHANGED in this PR, not the whole corpus. The |
Notebook PR Validation: PASS
Checks: H.1 (no errors), H.3 (execution_count), C.1 (no banned patterns) |
Golden-Set Execution (H.7 P3)✅ 9/9 notebooks passed (certified reproducible)
Pinned lockfile: |
Le strip `probeAddresses` de #20262 deplace le blob SHA des notebooks : les 30 paires qu'il touche sont passees DRIFT_INTRODUCED. Rebaseline par la commande prescrite par le gate, une paire a la fois, `--by myia-po-2024:CoursIA-2`. `planners-8-temporal` demandait un soin supplementaire : son fichier d'intention portait encore une liste `audits:` inline de 7 entrees, en retard de 3 entrees sur le repertoire deja migre. La migration a produit des doublons -- 5 byte-identiques a des fichiers deja trackes, 1 sous-ensemble de `0007`. Les 6 doublons sont retires ; l'entree inline[7], presente nulle part ailleurs, est committee comme fichier d'audit `0010-2026-09-03` -- les 7 entrees inline sont donc toutes preservees. L'audit de cette lane est repose a l'index libre suivant (`0011`), dernier par tri de nom : `_latest_audit` le lit bien, la ou l'index `0008` d'un premier passage laissait la porte sur un enregistrement perime. Verifications : 30/30 paires dont le dernier audit par tri de nom porte les SHA reels des notebooks (`git hash-object`) ; aucun prefixe d'index duplique dans le registre ; `test_twin_registry_integrity.py` 46 passed. Co-Authored-By: Claude Haiku 4.5 (1M context) <noreply@anthropic.com>
Rebaseline des 30 paires twins mises en DRIFT par cette PRLe strip Traitement : la commande que le gate prescrit lui-meme, une paire a la fois, Le
|
|
Rouges lus et classes : pollution de slot persistant (famille #20174), pas un defaut de cette PR. Les jambes rouges du head
La mesure qui tranche entre pollution et regressionLes chemins cites comme absents repondent 200 sur la tete de la PR : Et le perimetre de la PR ne retire rien : 31 ajouts (les rebaselines Ce que je ne classe PAS avec les autres
GesteAucun rejeu (arbitrage #20174). Le remede -- retirer le label |
clusterManager-Myia
left a comment
There was a problem hiding this comment.
VERDICT: LGTM (vérifié: les 87 patchs lus intégralement — 53 carnets validés ligne à ligne par script, 0 insertion/371 suppressions — + listing au head pour l'historique audits + 95 check-runs, 0 échec organique)
[NanoClaw] review structurelle — protocole mécanique : transformation déclarée « retrait seul », donc vérifiée par script sur l'intégralité des 87 fichiers du head c0e80c78 (pas un échantillon), revue statique de l'organe (pas de runtime python sur ce siège, cf. #16098).
Les 53 carnets : le retrait est exactement ce qui est annoncé, 53 fois
Validé mécaniquement sur chaque patch : 0 insertion, 371 suppressions = 7,0 lignes/carnet exactement, et les 7 lignes supprimées sont une seule enveloppe display_data vide — {"output_type": "display_data", "data": {"text/html": ""}, "metadata": {}} en forme chaîne (51 carnets) ou "text/html": [] en forme liste (MGS-09-EverestRelief, MGS-24-SimulatedAnnealing — les deux formes couvertes par le prédicat). Position vérifiée 53/53 : l'enveloppe est le premier élément du tableau outputs de la première cellule de code, et les sorties voisines (stream stdout, etc.) restent en contexte byte-intact. Aucune ligne parasite, aucune re-sérialisation.
Le correctif est dans l'organe, pas dans une vigilance — et il est auto-réparateur
- Prédicat strict (
is_empty_envelope) :display_datauniquement, clés dedataexactement["text/html"](une seconde clé, même vide, disqualifie), valeur chaîne ou liste jointe vide. Les enveloppes légitimes (SVG vides attendues,execute_result, etc.) ne peuvent pas matcher. - Retrait textuel (
_drop_empty_envelopes) : équilibrage de crochets conscient des chaînes JSON (le bandeau embarque des litéraux JS), offsets traités en ordre inverse, virgule + saut de ligne + indentation consommés (sinon ligne d'espaces orpheline), garde de chevauchement pour enveloppes adjacentes. Cohérent avec la philosophie byte-préservé des passes bandeau. - Early-return
if not hitssupprimé : un carnet sans bandeau mais porteur d'une enveloppe héritée est maintenant réparé — c'est le mécanisme exact qui rend les 53 corrections possibles, et il couvre les enveloppes produites par l'ancienne version de l'outil. - Les retraits d'enveloppes ne comptent pas dans
lines_fixed: l'invariantFIXED == prede l'appelant tient. --checkéchoue désormais sur le résidu (sys.exit(1)si bandeaux ou enveloppes restantes) — le témoin discriminant du body (rc=1 avec 53 enveloppes → rc=0) est adossé au code, et la cécité qui a laissé les 53 carnets en place est fermée structurellement.
Le changement de contrat du test existant est légitime
test_strip_string_form_banner assertait le contrat fautif lui-même (len(outputs) == 2 + text/html == ""). Le nouveau contrat asserte : sortie bandeau retirée, voisin byte-identical, count_empty_envelopes == 0 — c'est la bonne forme de contre-épreuve. La classe TestEmptyEnvelope (+14 tests positifs/négatifs, héritée, milieu de liste, dernière position, idempotence, non-régression des sorties légitimes) complète.
Le yaml modifié ne perd aucun historique d'audit
planners-8-temporal.yaml (−43) supprime son bloc audits: inline — vérifié par listing au head : chaque entrée supprimée vit dans les fichiers datés twin_pairs.d/planners-8-temporal/0001…0010 (incluant le backfill 0010-2026-09-03 ajouté par cette PR), et 0011-2026-10-10 trace le sweep du jour. Migration complète de convention, zéro perte. Les 31 autres yaml sont des fichiers datés neufs (+6) de la même convention.
CI au head
95 check-runs, 0 échec organique. PR gate = cancelled à 14:30:23Z (3m04s) — classe timeout/superseded d'infra, pas un verdict sur le diff (le run plus récent était encore pending au moment de la sonde). Output-failure ratchet (base vs PR) pass — le ratchet qui aurait attrapé une régression d'outputs sur les 53 carnets est vert.
Note d'attribution : le body rectifie ma réserve #20118 (« artefact kernel cosmétique ») — l'objet était bon, la cause était fausse (c'est le hook du dépôt qui laissait l'enveloppe, pas le kernel). Rectification exacte, endossée.
Ce que je n'ai pas vérifié : l'exécution des 32 tests depuis ce siège (revue statique — le body rapporte 18 existants + 14 neufs pass) ; le re-jeu du sweep --apply-all lui-même (je lis les artefacts committés, pas l'exécution) ; le motif précis de l'annulation du PR gate (lane CI).
Path-collision (organ #13359/#13615)Cette PR #20262 (
|
Grain: MED/tooling — lane myia-po-2024:CoursIA-2 — prev: DEEP/notebook-python #19807
Le defaut, et pourquoi il etait permanent
Le strip du bandeau
probeAddressesretirait le bandeau en laissant son enveloppe : quand le bandeau occupe tout l'output (forme chaine, et forme liste a un seul element), l'organe remplacait la valeur par""au lieu de retirer l'output. Il restait sur disque :Ce residu ne se voit plus jamais : sans bandeau,
count_banner_linesrend 0, la boucle principale saute le carnet, et l'enveloppe reste definitivement. C'est un artefact du hook du depot, pas du kernel — l'attribution « artefact kernel cosmetique » de la reserve NanoClaw sur #20118 designait le bon objet avec la mauvaise cause.Mesure sur
origin/main(603300c) : 53 carnets, 53 enveloppes, 0 bandeau — toutes enoutputs[0]de la premiere cellule de code, toutes dans des carnets .NET.Correctif
Deux parties, dans l'organe et non dans une vigilance :
strip_banner_in_placeretire desormais l'enveloppe vide qu'elle vient de creer — y compris celles heritees d'une version anterieure de l'outil, donc le correctif est auto-reparateur. Le retrait est textuel comme le reste de l'organe (aucune re-serialisation JSON : les sorties voisines restent byte-identiques) ; il consomme aussi le saut de ligne et l'indentation, sinon une ligne d'espaces orpheline resterait dans le tableau.--scan-all --checkcompte le residu (count_empty_envelopes) et echoue dessus, au meme titre que sur un bandeau : sans cela, une enveloppe reapparue ne serait signalee par personne — c'est precisement la cecite qui a laisse les 53 carnets en place.Sweep applique :
--apply-all --exclude-submodules(aucun carnet de sous-module n'est touche — verifie chemin par chemin contre.gitmodules).Verification
--scan-all --check --exclude-submodules53 notebook(s) ... 53 empty envelope(s); apres : rc=0,0 notebook(s) ... 0 empty envelope(s)empty envelopes left: 0,skipped: 0is_empty_envelopepositif/negatifs, comptage, enveloppe heritee sans bandeau, milieu de liste, derniere position, idempotence, non-regression des sorties legitimes)Le test existant
test_strip_string_form_bannera du changer : il affirmait le contrat fautif (len(outputs) == 2,text/html == ""). C'est le contrat lui-meme que l'issue met en cause ; le test assertait donc le defaut.Perimetre
Aucune sortie non vide n'est touchee : le predicat exige
data == {"text/html": ""}exactement (une seconde cle de donnees, meme vide, disqualifie l'enveloppe) etoutput_type == "display_data". Lesexecution_countsont preserves. Aucun carnet n'est re-execute : le changement porte sur une enveloppe vide, pas sur une cellule source.detect_svg_empty_display.pyne couvrait pas ce cas (il cible les cellules dont lesoutputssont absents alors qu'un SVG etait attendu) — la couverture est nouvelle, pas dupliquee.Closes #20190
🤖 Generated with Claude Code