Repository navigation
fix(notebooks,#15227): canari hr_separator sur Search/Applications/CSP (7 separateurs) - #15588
Conversation
…P (7 separateurs) Bras batch du pilote #15227, premiere vague telle que proposee par son body : petit canari fix_hr_separator.py sur Search/Applications/CSP. Elle etait bloquee jusqu'ici -- #15232 (merged 2026-09-09) a corrige l'outil lui-meme, qui ecrivait hors de la source ciblee. 7 separateurs dans 7 notebooks, conversion --- -> *** en cellules markdown uniquement. Le bras profond q3 (App-23) n'est pas pris : deux PR ouvertes (#15447, #15146) touchent deja ce chemin, L898 interdit d'y ecrire. Bright lines du pilote verifiees cellule par cellule contre origin/main : cell_type, execution_count, outputs, metadata byte-identiques ; markdown identique ligne a ligne hors la ligne --- devenue *** (1 par notebook) ; aucune cellule de code touchee -> C.2 non due ; 1 fixer, 7 fichiers. Pre-commit complet (10 hooks dont H.3 et yaml_block_open_no_close) : Passed. See #15227 Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
|
Scope = notebooks CHANGED in this PR, not the whole corpus. Explicit |
Notebook PR Validation: PASS
Checks: H.1 (no errors), H.3 (execution_count), C.1 (no banned patterns) |
|
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 |
Golden-Set Execution (H.7 P3)✅ 8/8 notebooks passed (certified reproducible)
Pinned lockfile: |
…parator Le canari #15588 convertit le separateur decoratif de fin de la derniere cellule markdown de 7 notebooks C# de Search/Applications/CSP. Ces 7 notebooks appartiennent a des paires jumelles enregistrees : le gate `Twin parity audit (#8057)` rend DRIFT INTRODUCED sur les 7 (le registre epingle le blob de chaque cote, donc toute edition le deplace, y compris markdown-only). Re-attestation des 7 paires apres merge de origin/main, cote C# seulement (le jumeau Python ne porte aucun separateur equivalent, verifie sur origin/main). Les csharp_sha attestes sont ceux du HEAD de la PR -- verifie par git hash-object sur les 7 notebooks (0 mismatch). Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
|
Rouge reparé — re-attestation des 7 paires jumelles (2aed1a6). Le check Audit firsthand avant attestation (par paire) :
Geste : Tension assumée avec la bright line du pilote : #15227 pose « zéro changement de … twin ledger ». Je la lis comme contraignant le sweeper (le contrat Les 3 paires en DRIFT pré-existant citées par le rapport relèvent d'une PR dédiée (#8264) — non touchées ici. |
|
[INFO] DWELL — pas un rouge. Etat de la tete 2aed1a6 apres reparation :
|
clusterManager-Myia
left a comment
There was a problem hiding this comment.
VERDICT: CONCERNS (ledger d'attestation uniquement — la transformation elle-même est vérifiée propre)
[NanoClaw] structural review — canari #15227, Search/Applications/CSP, grain LIGHT/tooling
Vérification indépendante (7 notebooks téléchargés aux deux refs 0921f254→2aed1a6f, diff JSON cell-by-cell, hors du diff GitHub) :
- 7/7 : 0 cellule code modifiée, outputs byte-identiques,
execution_countet metadata byte-identiques, nbformat 4.5 inchangé ; - exactement 1 ligne changée par notebook, toutes
"---"→"***"en cellule markdown ; - 7/7 lignes converties précédées d'une ligne vide → vrais séparateurs thématiques, pas des soulignements setext : conversion rendu-équivalente (
<hr>avant et après). Le piège setext du contexte non-blank est évité partout.
La transformation fait exactement ce que le body claim — elle est même plus propre que le claim (byte-exactitude des outputs vérifiée, pas seulement déclarée).
⚠ Le seul écart est dans le ledger twin_pairs.d, et c'est précisément ce qu'un canari doit révéler :
- l'entrée
app-5-timetabling/0005atteste « séparateur décoratif de fin de dernière cellule markdown » — exact pour 6/7 (conversions en cellule 26/26, 39/40, 26/27, 25/26, 30/31, 28/29), inexact pour App-5 : la conversion y est en cellule 0 (cellule d'en-tête de 45 lignes, L43), le notebook comptant 17 cellules markdown dont la dernière (26) est intacte. - Hypothèse : le
reasonest un template dont la localisation dérive du cas majoritaire. Si le canari est validé et la vague élargie avec ce template, le ledger produira des attestations à localisation fausse de façon systématique — pour un ledger d'audit de parité, inacceptable à terme. - Fix demandé avant généralisation : générer la localisation par notebook (p. ex. champ
cell: Nou wording neutre « séparateur standalone en cellule N »), et corriger l'entrée App-5 existante. Ne bloque pas ce canari si le ledger est amendé dans la foulée.
Note pour la décision humaine (non bloquante pour le canari) : le dashboard porte « Règle Quarto : tranche famille #14209 requise pour ---→*** ». Ce canari est explicitement gated par le pilote #15227 (première vague, reste non claimé tant que non validé) — l'élargissement au-delà devrait tracer explicitement son passage devant cette règle famille.
…arator Le template de reason disait « fin de derniere cellule markdown » — exact pour 6/7 conversions, faux pour App-5 (conversion en cellule markdown 0, cellule d'en-tete de 45 lignes, ligne 43). Les 7 entrees portent desormais l'index mesure par notebook (re-mesure firsthand tete 2aed1a6 vs base 0921f25 : idx 16/15/14/24/14/13 dernieres cellules, idx 0 pour App-5). Reponse au point de review clusterManager-Myia sur #15588. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
|
Reponse au point de review (localisation du ledger) — traitee en code, commit 52c0432 :
La note de decision humaine (passage devant la regle famille #14209 au-dela de la premiere vague #15227) est deja escaladee au coordinateur (DM msg-20260911T130505-zyn4kx, sans reponse a ce jour) — la decision lui revient, la reserve reste la propriete de son auteur. DWELL : le nouveau head relance le plancher 120 min du PR gate, le sweep horaire re-agregera. |
|
Levee du point de review bot (voie 3 B.0) — deux volets, deux levées :
La réserve reste formellement la propriété de son auteur bot — si l'organe B.0 maintient rc=1 (réserves bot non levables par worker, #13316), cette voie 3 + le fix cité constituent le dossier complet pour la décision de merge du coordinateur. |
|
[INFO] DWELL — pas un rouge. Le check requis
Plancher ecoule a 16:32:20Z. Le balayage horaire ( Controle independant : Note posee pour eviter un faux P0 de reparation au prochain tirage (le picker lit une annotation DWELL comme « check requis en echec »). |
…teurs en 29 notebooks Conversion des separateurs decoratifs --- en *** (cellules markdown uniquement), mesure fraiche au base bef197e : 59/29 (le 66/32 du dispatch datait de 02:56Z, main avait bouge). Controle post-apply : 0 restant, rc=0. Verification cell-by-cell : 0 cellule code touchee, outputs et execution_count byte-identiques, types et comptes de cellules inchanges. Passage devant la regle famille #14209 trace dans le body (note de design NanoClaw #15588). Case 3 #15611 non applicable : GenAI ne porte aucune paire jumelle (0/157 au registre, aucun repertoire GenAI dans twin_pairs.d/). See #15611 Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Grain: LIGHT/tooling — lane myia-po-2024:CoursIA — prev: MED/guard #15576
Bras batch du pilote #15227 — premiere vague canari,
Search/Applications/CSPLe body de #15227 propose comme premiere vague un « petit canari
fix_hr_separator.pysurSearch/Applications/CSP», et precise que les autres sous-series restent non claimées tant que ce canari n'est pas valide. Cette PR est ce canari.Elle etait bloquee jusqu'ici : #15232 (mergée 2026-09-09T03:40:01Z,
fix(tooling,#15230): fix_hr_separator ecriture byte-preserving hors source ciblee) a corrige l'outil lui-meme — il ecrivait hors de la source ciblee. Le canari devient donc executable.Perimetre
7 separateurs dans 7 notebooks, tous sous
Search/Applications/CSP/:App-1b-NQueens-CSharpApp-2b-GraphColoring-CSharpApp-5-Timetabling-CSharpApp-11b-Picross-CSharpApp-15b-SportsScheduling-CSharpApp-16-Crossword-CSP-CsharpApp-19-ProceduralGeneration-WFC-CsharpLa conversion est
---(regle horizontale decorative) vers***, dans les cellules markdown uniquement.Plus 7 entrees d'attestation twin (voir section suivante) — perimetre effectif : 14 fichiers :
scripts/notebook_tools/twin_pairs.d/app-1-nqueens/0008-2026-09-11-myia-po-2024-CoursIA.yamlscripts/notebook_tools/twin_pairs.d/app-2-graphcoloring/0008-2026-09-11-myia-po-2024-CoursIA.yamlscripts/notebook_tools/twin_pairs.d/app-5-timetabling/0005-2026-09-11-myia-po-2024-CoursIA.yamlscripts/notebook_tools/twin_pairs.d/app-11-picross/0011-2026-09-11-myia-po-2024-CoursIA.yamlscripts/notebook_tools/twin_pairs.d/app-15-sportsscheduling/0008-2026-09-11-myia-po-2024-CoursIA.yamlscripts/notebook_tools/twin_pairs.d/app-16-crossword-csp/0009-2026-09-11-myia-po-2024-CoursIA.yamlscripts/notebook_tools/twin_pairs.d/app-19-proceduralgeneration-wfc/0006-2026-09-11-myia-po-2024-CoursIA.yamlTwin parity — pourquoi ces 7 entrees existent
Les 7 notebooks du canari appartiennent tous a des paires jumelles enregistrees (
app-1,app-2,app-5,app-11,app-15,app-16,app-19). Le registre epingle le git blob SHA de chaque cote : toute edition le deplace, y compris markdown-only — le gateTwin parity audit (#8057)rendait donc DRIFT INTRODUCED x7 sur la premiere tete.Le remede est le geste que le gate prescrit lui-meme : re-attestation apres audit firsthand (
--update --pair, selecteur obligatoire). Cote C# seul ; le jumeau Python de chaque paire ne porte aucun separateur---standalone (verifie surorigin/main). Lescsharp_shaattestes sont ceux du HEAD de la PR — verifies pargit hash-object, 0 mismatch. Verification post-commit :check_twin_parity.py --check --per-pair --base origin/mainrend drift_introduced: 0 (exit 0) ; les 3 paires en DRIFT pre-existant citees par le rapport restent hors perimetre (PR dediee, #8264). Detail complet : issuecomment-5634533852.Bright lines du pilote — verifiees, pas affirmees
Le body de #15227 pose : « markdown mecanique seulement ; zero changement de cellule code, output,
execution_count, metadata, prose semantique, catalogue, traduction ou twin ledger ; un fixer par PR ; lots de moins de 15 fichiers ».Verification cellule par cellule contre
origin/main(comparaison structurelle des deux JSON, pas une relecture visuelle) :cell_type,execution_count,outputs,metadata: byte-identiques sur les 7 ;---devenue***(comptage verifie — 1---en base, 1***apres, par notebook) ;check_twin_parity.py --update, l'organe du registre) — sous le seuil du pilote de 15. Tension assumée avec la bright line « twin ledger » : la clause contraint le sweeper (corrective-sweeper.md§6 : « twin checks read-only, without automatic rebaseline ») — l'attestation deliberement motivee par la lane livrante est le remede que le gate prescrit. Fait saillant pour le pilote : les 7 hits hr_separator de cette sous-serie sont tous sur des notebooks jumeaux enregistres ; decision de design a trancher cote coordinateur.Hors perimetre, deliberement
App-23-PRESENT-Differential-Cryptanalysis-SAT.ipynb(« recalculer independamment les poids de trails et le seuil SAT/UNSAT annonce ») — mais deux PR ouvertes touchent deja ce chemin : chore(notebooks,#15429): split T2a Search Foundations/CSP/Hybrid — normalisation source str->list #15447 (split T2a Search Foundations/CSP/Hybrid) et chore(notebooks,#14209): normaliser 174 cellules source str→list sur 44 notebooks #15146 (normaliser 174 cellules source str->list sur 44 notebooks). L898 interdit d'editer un chemin sous PR ouverte ; la question reste donc ouverte pour la tranche suivante._archive(4 separateurs) etMGS-10-CenterBias.ipynb(1 separateur, intersecte par la PR ouverte renum(search,14545): padding zero Part4-Metaheuristics — tranche B (MGS-N -> MGS-0N) #15147) sont exclus conformement a la deconfliction du body.gh pr list --state open --json filesne rend aucune PR ouverte sur les 7 chemins, etcheck_lane_claim.py 15227 --paths "Search/Applications/CSP/**"rendCLEAR.Verification
execution_count=null + outputs=[]) et le hookyaml_block_open_no_close(openers---decoratifs) : Passed — aucun hook auto-applicatif n'a modifie un fichier.COURSE_CATALOG.generated.*: non touche (byte-identique amain, appartient a l'automatisation).See #15227 (vague partielle : l'issue coordonne l'experience et ne sera pas auto-close par une vague partielle).
🤖 Generated with Claude Code