Repository navigation
chore(tooling,#15429): split T8 — attestations twin de la normalisation str->list - #15449
Conversation
… normalisation str->list See #15429 (T8/T8, derniere tranche). Ajout des neuf attestations twin_pairs.d datees 2026-09-08 (myia-po-2024:CoursIA-2) enregistrees lors de la passe de normalisation : chaque numero est le prochain libre de sa paire sur main (verifie ls-tree), SHA croise avec le blob livre par les tranches T1-T7 (exemple : csharp_sha search-02 == blob exact de T2a). Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
|
G-VAR-2 light cap reached (advisory, non bloquant). |
clusterManager-Myia
left a comment
There was a problem hiding this comment.
[NanoClaw] structural review — CoursIA #15449 (chore(tooling,#15429) : split T8 — attestations twin_pairs.d de la normalisation du résidu, 9 fichiers YAML +54/−0)
Favorable —Closing tranche du split #15429, vérifiée sur ses trois preuves annoncées, dont deux re-vérifiées firsthand de façon indépendante :
- Cross-SHA vérifié sur 2 attestations contre 2 têtes de tranches différentes :
csharp_shade search-02-uninformed =0f80d0a2…= blob sha exact duSearch-02-Uninformed-Csharp.ipynbà la tête T2a #15447 (eee2e1d) ;csharp_shade sudoku-14-bdd =a1f445c8…= blob sha exact duSudoku-14-BDD-Csharp.ipynbà la tête T7 #15446 (f690964, la tranche que j'ai reviewée). Les attestations référencent bien les blobs post-normalisation livrés par les tranches — le mécanisme « SHA croisés » du body fonctionne comme annoncé. - Numérotation vérifiée : records existants sur main (base) 0001-0006 pour search-02-uninformed et 0001-0009 pour sudoku-14-bdd → prochains libres 0007/0010 = exactement les numéros ajoutés (corrobore le ls-tree du body sur ces deux paires).
- Schéma YAML uniforme : 3/9 fichiers lus intégralement — exactement les six clés canoniques (date, by, python_sha, csharp_sha, content_python_sha, content_csharp_sha), parse propre.
- Cohérence avec mes reviews T6/T7 : les 8 notebooks que j'ai vérifiés REFLOW-ONLY firsthand sont couverts par ces attestations côté paires de jumeaux — les deux relations (reflow base↔head, paire python↔csharp) s'ancrent sur les mêmes blobs livrés.
- Sécurité : fichiers de données YAML purs, 0 exécution, 0 secret. La note « See vs Closes #14209 laissé au coordinateur » est la bonne prudence (l'EPIC était à 84 %, résiduels CaseStudies).
OBS non-bloquantes :
content_*_sha(32 octets = sha256 de forme canonique) repose sur la définition de canonique du outil notebook_tools, non incluse dans la PR — les ancrespython_sha/csharp_sha(blob shas git) restent indépendamment vérifiables, ce que j'ai fait ; la couche content est un trust outillé.- 6/9 attestations non individuellement cross-SHA-checkées ici (2 vérifiées + schéma sur 3 échantillons) — le pattern a tenu sur tout l'échantillon, la structure rend une dérive isolée peu plausible.
…p (repair) Twin parity audit failed at f3a8795: the T8 attestations were recorded BEFORE the str->list normalization strips landed on the twin files, so the recorded blob SHAs no longer matched (attest-then-strip invalidates the attestation, #8957). Re-attested all 9 pairs the bot flagged (App-20 SudokuBenchmark, CSP-1 Fundamentals, GameTheory-10 ForwardInduction-SPE, Probas-16 Sparse-Gaussian-Process, Search-02 Uninformed, Search-02b NetworkX, Sudoku-14 BDD, SW-2 RDF-Basics, SW-7 OWL) via check_twin_parity --update --pair ... --by, after every strip -- update last, per the tool's own reminder. Local re-run of the CI mode (--check --base origin/main --per-pair): 0 DRIFT-INTRO, exit 0. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
|
Repair Twin parity livré — head Cause confirmée firsthand en local au head Repair : Preuve locale post-fix : re-run du mode CI complet → 0 DRIFT-INTRO, exit 0 sur les 157 paires. Le second FAIL (Scripts Tests CPU, run 34445363107, logs expirés) est re-déclenché par ce push — attendu vert si son échec était purement l'état twin du head précédent ; le PR gate re-agrégera (DWELL/sweep). |
|
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 |
jsboige
left a comment
There was a problem hiding this comment.
[Hermes] — #15449 follow-up sur le delta f489390 (depuis review [NanoClaw] sur f3a8795).
Le delta « re-attester les 9 paires twin drift-après-strip (repair) » est vérifié firsthand : 9 nouveaux fichiers YAML d'attestation (+6/-0 chacun) dans twin_pairs.d/. Contrôle croisé sur la paire search-02-uninformed : les python_sha/csharp_sha de l'attestation (71b8013cd120 / 2b04acfeef20) matchent exactement les blobs réels au head de la branche (Search-02-Uninformed.ipynb / Search-02-Uninformed-Csharp.ipynb dans le tree Git du head f4893902). Les attestations pointent les vrais contenus.
CI au head : PR gate success (CodeQL, Gitleaks, Scripts Tests CPU, metadata guards tous verts). Delta additif, aucun notebook modifié — cohérent avec la finalité d'attestation. Security scan : 0 match (HF_TOKEN|API_KEY|BEARER|PASSWORD|SECRET|TOKEN\s*=).
(contrainte token : COMMENT only)
…tooling #15449 (adjoint po-2025 preflight, c.430)
…oie 1 cesse d'être morte par construction (#15483) * fix(guard,#15468): verbes de dissipation dans le registre LIFT — la voie 1 cesse d'etre morte par construction Un commentaire worker-self qui NOMME l'etat qu'il dissipe (« 2 contrats dissipés », « ne concerne plus le head ») etait reclasse nouvelle reserve BOT-CONCERN : le marqueur cite restait une emission, « dissipé » ne levait rien. Mesure firsthand sur les 4 follow-ups de myia-po-2027:CoursIA-2 (#15280, #15423) : 4/4 classes BOT-CONCERN avant, 2/4 (les reformulations a encoding propre, 5618921810 / 5618922001) resolus apres. Les 2 autres (5618520801 / 5618522301) restent bloques par un mojibake a la SOURCE (« dissipés ») — defaut du script de post de la lane, hors organe. Ajouts au registre : « dissipé » (cle miroir _unaccent « dissipe », couvre par sous-chaine la famille dissipé(e)(s)/dissipe/dissipent/dissipation) et la locution « ne concerne plus ». Les gardes existantes restent maitresses : negation directe (« n'est pas dissipé ») exclue par _lift_is_negated, narration nominale (« une dissipation ») par _lift_is_narrated, et la revalidation dont le verdict formel precede la dissipation (modele #12798/#12836) garde le classement BOT-CONCERN — pinne par test. Tests : 7 nouveaux (registre, negation, narration, 2 corps fideles, locution, garde de refutation) ; suites dependantes vertes — nits 496, +591 sur les 4 fichiers voisins (lane_claim, pick_idle_grain, variation guards). Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> * fix(guard,#15483): pin des residuels PENDING/intensification/mixte du registre LIFT — la voie 1 reste vraie apres extensions CHANGES_REQUESTED ai-01 sur `071c5763` (clusterManager-Myia structural COMMENTED + ai-01 « le nouveau marqueur sous-chaine `dissipé` blanchit des réserves encore ouvertes : ce point reste à dissiper, il faut dissiper, sera dissipé au prochain push et doit être dissipé »). * garde `_dissipation_is_pending(window_before, window_after, marker)` — court-circuite `_lift_is_narrated`/`_arrow_precedes`/`_lift_is_negated` quand le hit dissipation tombe dans une construction VERBALE non close (infinitif futur `reste à dissiper`, `faut dissiper`, `à dissiper` / futur simple `sera dissipé` / obligation passive `doit être dissipé`, `devra être dissipé`). Discrimination lexicale forte via `_DISSPATION_PENDING_PATTERNS` qui prime sur le narré générique. * post-filtre `_invalidate_dissipation_in_pending_zone` — invalide les hits dissipation ACQUIS d'une même phrase logique (terminateurs `.`/`!`/`?`/`\n`/`\r`/`**`) quand elle contient aussi un PENDING. Couvre le cas aggravant founder « 2 contrats dissipés, MAIS 1 point reste à dissiper » (levait la review entière alors qu'un point vivait). * garde `_lift_is_intensified_marker_negated` — neutralise la négation sur la locution `ne concerne plus` UNIQUEMENT quand l'intensifieur (`rien`/`personne`/`aucun`) est en tête de sous-clause et N'EST PAS suivi d'un mot-outil / verbe actif (`faire`/`aller`/`doit`/…). Faux négatif fondateur « ne concerne plus rien du tout » était classé BOT-CONCERN via le token `rien` dans `_LIFT_NEGATION_TOKENS` ; c'est l'intensification de la dissipation, pas l'annulation. * variante `_lift_is_intensified_marker_negated_marker_active` — couvre les marqueurs `ne concerne plus [rien|personne|aucun|aucune]` (intensifieurs inclus dans le marker) ; suit le même principe de verb-actif-immédiat-après. * 4 entrées ajoutées au registre LIFT_MARKERS : `dissiper`, `dissipant`, `dissipée`, `dissipe`, `dissipées`, `dissipés` (famille infinitive complète pour distinguer PENDING vs ACQUIS) + `ne concerne plus rien`, `ne concerne plus personne`, `ne concerne plus aucun point`, `ne concerne plus aucune reserve` (intensification). 18 tests ajoutés, tous pinnent les résiduels ai-01 + cas mixtes + negative regressions. Suites dépendantes (`test_check_lane_claim.py` / `test_pick_idle_grain.py` / `test_variation_adjacency_guard.py` / `test_variation_light_cap.py` / `test_pr_gate.py`) : 669 verts. Sweep audit --limit 100 : 0 finding, 0 régression. Tell c.1081 strict : `Grain: MED/tooling — lane myia-po-2023:CoursIA-2 — prev: MED/tooling #15483` (REPAIR hérite du genre, c.295-L5). Co-Authored-By: Claude Haiku 4.5 (1M context) <noreply@anthropic.com> * ci(pr,#15483): wake checks apres amend body prev-self -> prev: LIGHT/tooling #15449 (adjoint po-2025 preflight, c.430) --------- Co-authored-by: jsboige <jsboige@gmail.com> Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>
…ge la collision d'ordinal (See #15429) Suite au diagnostic firsthand d'ai-01 sur #15446 : le rouge du garde n'etait pas la normalisation str->list mais une COLLISION D'ORDINAL. La tete portait, dans chaque repertoire, deux fichiers au meme prefixe 0010 (celui de cette PR et le 0010-2026-09-08-myia-po-2024-CoursIA-2.yaml deja sur main), et le 0011 venu de main (#15449, T8) attestait l'etat PRE-normalisation sous un ordinal superieur a celui que cette PR avait alloue. L'outil lit la derniere attestation : il voyait e0cc5d3 la ou l'arbre porte 41aacfc. Geste applique, conformement a la prescription d'ai-01 (on RETIRE l'entree dupliquee et on re-atteste au-dessus, pas de renumeration en cascade) : - git rm des deux 0010-2026-09-10-myia-po-2023-CoursIA.yaml (collision d'ordinal) - le 0011 de main (T8) est conserve tel quel, byte-identique : sha256 386e2daac1a0 (gametheory) et 00f600db8795 (sudoku) verifies contre origin/main - --update --pair alloue 0012-2026-09-11 dans les deux repertoires Verification: - garde --check : les 2 paires passent. DRIFT=3 residuel = Probas-16, SW-2, SW-7, collisions PRE-existantes sur main introduites par a1ae006 (T5, #15445) et couvertes par la PR #15576 ouverte -- hors champ de cette PR. - integrite registre : 45 passes ; le seul echec ne liste que ces 3 paires de main, aucune des deux de cette PR. - diff net vs origin/main = +2 fichiers d'attestation + 2 lignes known_differences (le 0011 restaure etant byte-identique a celui de main). - notebooks non touches : leur contenu est bon, la neutralite semantique de la conversion source str->list est verifiee (SHA canonique identique base vs head). Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
…tion source str->list (#15446) * chore(notebooks,#14209): tranche T7 du split -- normalisation source str->list sur GameTheory/Sudoku/RL/QC See #15429 (T7/T8). Contenu identique cellule par cellule : 10 conversions str->list verifiees par script (source joinee == source str d'origine, zero drift outputs/execution_count/metadata). Reprise du contenu de chore/14209-normalize-residue a1e83ff sur origin/main frais. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> * chore(notebooks,#14209): restore final newline on split tranche T7 (EOF drift #15429) Le writer de normalisation source str->list a perdu la newline finale des notebooks modifies (fin `}` au lieu de `}\n` comme sur main). Restauration d'un octet par fichier : les blobs redeviennent suffixe-identiques a main, contain JSON/nbformat inchange. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> * chore(twin-parity,#15429): rebaseline T7 twin pairs after source normalization The split converted notebook sources to the list form, moving the blob SHAs of 2 registered twin pairs (GameTheory-10 ForwardInduction-SPE, Sudoku-14 BDD) without a re-audit. Canonical rebaseline via check_twin_parity.py --update (after the EOF newline repair), per the twin-parity gate contract (#8057). Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> * chore(ci,#15446): attestation twin parity des 2 paires T7 + renumeration du journal d'audit local (See #15429) Le garde Twin parity audit (#8057) rougissait sur 2 paires du champ de cette PR : GameTheory-10 ForwardInduction-SPE et Sudoku-14 BDD. Re-audit firsthand AVANT attestation (le garde exige d'attester la parite, pas de la reparer). Mesure sur les 4 jumeaux : le SHA canonique du carnet -- toutes les listes-de-chaines jointes, metadata de niveau carnet exclue -- est IDENTIQUE base (origin/main) vs head, et les champs `text` des sorties sont inchanges. L'empreinte de forme montre la seule difference : source_str passe a 0 et source_list gagne exactement les cellules correspondantes (GameTheory-10 Python 2->0 / 35->37 ; Sudoku-14 C# 2->0 / 42->44). Aucun contenu pedagogique touche. Le content_sha du registre (_content_sha hache la forme brute du JSON, donc un re-encodage str->list le deplace autant qu'une edition de prose) bougeait sans divergence : d'ou attestation via --update. Collision d'index propre a la branche : les deux repertoires portaient DEUX fichiers au prefixe 0010 (un po-2024 09-08 herite de main, un po-2023 09-10 local). L'index zero-padde NNNN est la cle de tri de _load_audits_from_files (#14911/#15345), donc renumeration 0011->0012 puis 0010->0011, en preservant l'ordre du journal. Verification : le contenu de chaque fichier renomme est byte-identique a sa source (sha256 : 7b6e04a864f1 et 386e2daac1a0 sur gametheory, 0208891eec5d et 00f600db8795 sur sudoku). Note de lecture : git apparie 0010 -> 0013 dans l'affichage du diff (les YAML d'attestation sont quasi identiques, l'heuristique de renommage est arbitraire ici). Le contenu de l'arbre est le seul verdict et il est verifie : ordre final du repertoire = 0009, 0010 (po-2024 09-08), 0011, 0012, 0013. - 2 entrees d'audit 2026-09-11 (myia-po-2023:CoursIA), forme file-per-audit #14911 - ligne explicative en tete de known_differences de chaque paire - per-pair vs origin/main : INTRO=0 (etait 2), OK=154/157, PRE=3 inchange (Probas-16, SW-2, SW-7 : DRIFT pre-existants sur main, hors champ de cette PR) Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> * chore(ci,#15446): attestation twin parity T7 a l'ordinal 0012 — corrige la collision d'ordinal (See #15429) Suite au diagnostic firsthand d'ai-01 sur #15446 : le rouge du garde n'etait pas la normalisation str->list mais une COLLISION D'ORDINAL. La tete portait, dans chaque repertoire, deux fichiers au meme prefixe 0010 (celui de cette PR et le 0010-2026-09-08-myia-po-2024-CoursIA-2.yaml deja sur main), et le 0011 venu de main (#15449, T8) attestait l'etat PRE-normalisation sous un ordinal superieur a celui que cette PR avait alloue. L'outil lit la derniere attestation : il voyait e0cc5d3 la ou l'arbre porte 41aacfc. Geste applique, conformement a la prescription d'ai-01 (on RETIRE l'entree dupliquee et on re-atteste au-dessus, pas de renumeration en cascade) : - git rm des deux 0010-2026-09-10-myia-po-2023-CoursIA.yaml (collision d'ordinal) - le 0011 de main (T8) est conserve tel quel, byte-identique : sha256 386e2daac1a0 (gametheory) et 00f600db8795 (sudoku) verifies contre origin/main - --update --pair alloue 0012-2026-09-11 dans les deux repertoires Verification: - garde --check : les 2 paires passent. DRIFT=3 residuel = Probas-16, SW-2, SW-7, collisions PRE-existantes sur main introduites par a1ae006 (T5, #15445) et couvertes par la PR #15576 ouverte -- hors champ de cette PR. - integrite registre : 45 passes ; le seul echec ne liste que ces 3 paires de main, aucune des deux de cette PR. - diff net vs origin/main = +2 fichiers d'attestation + 2 lignes known_differences (le 0011 restaure etant byte-identique a celui de main). - notebooks non touches : leur contenu est bon, la neutralite semantique de la conversion source str->list est verifiee (SHA canonique identique base vs head). Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> --------- Co-authored-by: jsboige <jsboige@gmail.com> Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>
… SW-7) -- attestation T8 restauree au rang latest (#15970) La normalisation source str->list (#15444/#15445, merge 2026-09-11) etait correctement attestee par #15449 (T8), mais le journal file-per-audit porte une inversion d'ordre : par paire, l'entree du 09-10 a shas POST-tranche est suivie d'une entree a shas PRE-tranche ecrite en dernier dans la meme PR ; _latest_audit lit audits[-1], donc la garde comparait HEAD post-tranche a une baseline pre-tranche -> 3 DRIFT fantomes sur main. Le renumber #15576 (#15345) a preserve l'ordre relatif, l'inversion a survecu. Zero edition de notebook : texte rendu identique verifie programmatiquement sur les 3 fichiers modifies par la tranche (Infer-16 C# 32 cellules, SW-2b 43, SW-7b 48 -- comparaison normalisee join-liste vs str, aucune divergence, outputs/ids/ordre intacts). Rebaseline d'attestation par script : 3 entrees audit 2026-09-13 (shas HEAD, egaux aux entrees T8 enterrees 0009/0006/0007) + narrations known_differences. --update en DERNIERE operation (cf #8957). Verifications : check_twin_parity --check -> 157/157 OK DRIFT=0 ; test_twin_registry_integrity -> 46 passed. See #15429 See #15345 Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>
Grain: LIGHT/tooling — lane myia-po-2023:CoursIA — prev: LIGHT/notebook-python #15448
Summary
See #15429 — tranche T8/T8, dernière du split : les neuf attestations
twin_pairs.ddatées 2026-09-08 (parmyia-po-2024:CoursIA-2) enregistrées lors de la passe de normalisation du résidu —app-20-sudokubenchmark/0010,csp-1-fundamentals/0013,gametheory-10-forwardinduction-spe/0010,probas-16-sparse-gaussian-process/0008,search-02-uninformed/0007,search-02b-networkx/0007,sudoku-14-bdd/0010,sw-2-rdf-basics/0005,sw-7-owl/0006.Preuves
origin/maincourant (vérifiéls-tree— aucune collision, main est allé jusqu'à 0009/0012/0009/0007/0006/0006/0009/0004/0005 respectivement).csharp_shadesearch-02-uninformed= blob exact duSearch-02-Uninformed-Csharpde T2a chore(notebooks,#15429): split T2a Search Foundations/CSP/Hybrid — normalisation source str->list #15447).date,by,python_sha,csharp_sha,content_python_sha,content_csharp_sha).Vérification finale du split (acceptance #15429)
0 cellule string restante sur les 44 notebooks du résidu (
chore/14209-normalize-residue) — mesuré par parcours JSON complet : aucun fichier non conforme. Le périmètre str→list de #15146 est ainsi intégralement couvert par les tranches T1 #15441, T6 #15442, T3 #15443, T4 #15444, T5 #15445, T7 #15446, T2a #15447, T2b #15448 (43 notebooks convertis ;ICT-15lno-op écarté) + la présente T8 (attestations).Note pour le coordinateur : le
Closes #14209prévu par l'acceptance #15429 sur « la dernière tranche qui ferme l'acceptance » est laissé en arbitrage merge-time — l'EPIC #14209 était à 84 % selon la review de #15146 (résiduels CaseStudies, 45 nb en file) ; cette PR utiliseSeeet le coordinateur tranche.État du split #15429
Toutes les tranches T1-T8 sont livrées. Après merges : la branche résidu
chore/14209-normalize-residueet la PR d'origine #15146 deviennent supersédées (fermeture à arbitrer côté coordinateur).🤖 Generated with Claude Code