Skip to content

Fix: g83-search-8 — deduplication et reancrage des lectures (shepherding) - #17225

Closed
jsboige wants to merge 4 commits into
mainfrom
wt/vibe-g83-search-8
Closed

jsboige wants to merge 4 commits into
mainfrom
wt/vibe-g83-search-8

Conversation

@jsboige

@jsboige jsboige commented Sep 21, 2026

Copy link
Copy Markdown
Owner

Grain: MED/notebook-python — lane myia-po-2025:CoursIA — prev: DEEP/notebook-python #17215

Contexte

Shepherding du lot vibe g83-search-8 (worktree D:/dev/CoursIA-vibe/g83-search-8, worker mort au reboot). Le lot livrait 12 lectures pedagogiques sur 2 notebooks de la serie Search. La passe de verification a trouve, avant livraison, 9 cellules sans id (carnet en nbformat 4.5), trois paires de lectures byte-identiques et six lectures dont l'affirmation contredit la sortie committee. Tout est corrige ici ; la PR est le lot g83 repare.

Defauts structurels corriges

Notebook Defaut Correction
Search-04-LocalSearch.ipynb 3 paires de lectures byte-identiques (absentes du merge-base) — 6 cellules pour 3 enonces 1 copie conservee par paire : celle placee apres sa cellule-preuve
Search-04-LocalSearch.ipynb 6 cellules sans id UUID (nbformat 4.5)
App-23-Factorio-Balancer.ipynb 9 cellules sans id UUID (nbformat 4.5)

Dans chaque paire, c'est la copie posterieure a la sortie qu'elle cite qui est gardee : [10] precedait le code produisant les trajectoires, [39] precedait la courbe des conflits qu'elle decrivait. Les deux autres copies sont supprimees.

Lectures corrigees (l'affirmation contredisait la sortie)

1. « le MIP devient INFEASIBLE sur 3×4 et 4×5 » — FAUX. La sortie de la cellule citee imprime :

Resolution MIP N=2, grille 2x3...  Statut : OPTIMAL   Temps : 37.3 ms
Resolution MIP N=3, grille 3x4...  Statut : OPTIMAL   Temps : 892.3 ms
Resolution MIP N=4, grille 4x5...  Statut : FEASIBLE  Temps : 34478.7 ms

MIP est OPTIMAL sur 3×4 et FEASIBLE (limite de 30 s atteinte, sans preuve d'optimalite) sur 4×5. La lecture est reecrite sur ces valeurs. L'INFEASIBLE reel est CP-SAT ceil sur 3×4 — ce que dit la seconde lecture corrigee, avec la cause imprimee par le carnet lui-meme : le mode ceil exige 9 unites par source quand l'injection en vaut 8. La discrimination reelle entre les moteurs porte donc sur le temps : 4x5 passe de FEASIBLE en 34,5 s (MIP) a OPTIMAL en 1,37 s (CP-SAT bande).

2. Une troisieme lecture repetait la meme inversion (« des instances que le MIP ne peut pas resoudre ») — reecrite sur le tableau de verdict reel.

3. « les ecarts maximaux sont tous inferieurs a la tolerance de 1e-7 » — non imprime. La sortie de la cellule citee ne rend que des booleens et des comptes :

N=3, 3x4 : flux=True, LP=True, charge max=8.000/8, atteints=9/9
Tout belt-E 2x3 : topologie valide=False
Baseline au mixer isole : Topologie valide=False

1e-7 est une constante du code, pas une grandeur mesuree. La lecture est reecrite sur les valeurs reellement imprimees, et fusionnee avec sa voisine qui citait la meme cellule — laisser deux lectures sur une cellule aurait reproduit la paire dupliquee corrigee plus haut.

4. « les solutions CP-SAT atteignent des ecarts nuls ou tres faibles » — contredit par la mesure. La cellule citee rend un pire |s1-s2| de 8.0000 sur les six solutions, soit l'ecart maximal possible pour une capacite de 8 ; la re-resolution avec le durcissement C9 actif rend les trois cas INFEASIBLE.

5. Deux lectures decrivaient les couleurs comme differenciant « les belts dans differentes directions ». La palette du code est ['#FFFFFF', '#E3F2FD'×4, '#FFE0B2'×4] : elle differencie la classe (vide / belt / mixer). C'est le symbole (., ^, v, >, <, +) qui porte l'orientation. Reformule sur les deux canaux distincts.

Preuves

code byte-identique       : App-23 19/19 | Search-04 23/23
cellules de base perdues  : 0 | 0
cellules sans id          : 0 | 0  (ids dupliques : aucun)
metadata / nbformat       : strictement identiques (4.5 -> 4.5)
source en chaine          : 2 (cellules de BASE, hors perimetre) | 0
detect_code_in_markdown   : OK, aucune violation nouvelle
pedagogy_density          : 0 notebook sous le plancher (les 2 juges)

Diff : +89 / −1, markdown et structure uniquement. Cellules code, sorties, execution_count, metadata et nbformat byte-identiques — aucune re-execution. La densite du carnet App-23 a ete remontee en reecrivant les lectures existantes (regle 2 de #13410 : « on RÉÉCRIT l'existante »), jamais en ajoutant une cellule de remplissage.

Portee

See #13410 — ce lot releve de la campagne densite, sous le STOP en tete de l'issue. Il est declare au registre d'arbitrage avec les autres pushes de la journee.

🤖 Generated with Claude Code

jsboige and others added 2 commits September 21, 2026 15:10
- App-23-Factorio-Balancer.ipynb: 9 lectures ajoutees (1205.2 chars/cellule code)
- Search-04-LocalSearch.ipynb: 3 lectures ajoutees (1230.3 chars/cellule code)

Convention: chaque lecture explique le resultat d'une cellule DEMONSTRATION
deja executee, sans narrer les cellules EXERCICE (detect_solution_leaks=0).
Garde-fous respectes: UTF-8, source en liste, pas de re-execution.

Generated by Mistral Vibe.
Co-Authored-By: Mistral Vibe <vibe@mistral.ai>
…ing)

Search-04-LocalSearch : trois paires de lectures BYTE-IDENTIQUES introduites
par le lot (absentes du merge-base) sont reduites a une copie chacune — celle
placee APRES sa cellule-preuve, l'autre etant anterieure a la sortie qu'elle
cite. 6 cellules sans id dotees d'un UUID (nbformat 4.5).

App-23-Factorio-Balancer : 9 cellules sans id dotees d'un UUID, et 6 lectures
corrigees parce que leurs affirmations contredisaient la sortie committee :
- "MIP devient INFEASIBLE sur 3x4 et 4x5" est FAUX : le tableau rend OPTIMAL
  en 892 ms sur 3x4 et FEASIBLE (limite 30 s atteinte) sur 4x5 ; l'INFEASIBLE
  est CP-SAT ceil sur 3x4 (9 unites exigees pour 8 injectees) ;
- l'ecart maximal "inferieur a 1e-7" n'apparait dans aucune sortie : la
  lecture est reecrite sur les valeurs reellement imprimees (flux=True,
  LP=True, charge max=8.000/8, atteints N/N) et fusionnee avec sa voisine,
  qui citait la meme cellule ;
- "ecarts nuls ou tres faibles" contredit le pire |s1-s2| = 8.0000 mesure ;
- deux lectures decrivaient les couleurs comme differenciant les directions
  alors que la palette encode la CLASSE (vide/belt/mixer), le symbole encodant
  l'orientation.

Markdown et structure uniquement : cellules code, sorties, execution_count,
metadata et nbformat byte-identiques (19/19 et 23/23 verifiees), aucune
re-execution. Densite 1250 (App-23) et au-dessus du plancher (Search-04).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
@github-actions

Copy link
Copy Markdown
Contributor

Notebook outputs-required (H.4 schema): PASS (every code cell carries an outputs: list)

@github-actions

Copy link
Copy Markdown
Contributor

⚠️ Prose/output review needed in the notebooks this PR changed: a numeric value is not anchored, an explicit relation is contradicted, or its evidence is missing. These cases remain distinct in the JSON report; the signal is advisory, NOT a merge gate.

Scope = notebooks CHANGED in this PR, not the whole corpus. Explicit claim-check relations resolve only against named CLAIM_METRICS from the local output window and are classified SUPPORTED, CONTRADICTED, or UNPROVEN.
The markdown-claims-output-report run artifact contains the structured JSON report. See python scripts/check_markdown_claims_output.py --help for re-running locally.
Detector rationale: c.290 / c.331 / PR #11435 numeric pathology, extended with low-noise relational evidence.

@github-actions

Copy link
Copy Markdown
Contributor

Path-collision (organ #13359/#13615)

Cette PR #17225 (Fix: g83-search-8 — deduplication et reancrage des lectures (shepherding)) touche au moins un chemin de fichier aussi modifie par d'autres PRs ouvertes. Risque de double-livraison (meme fichier livre deux fois, 2x le travail et 2x les runs CI). Advisory : parfois legitime (tranches coordonnees, partition paths: explicite, PRs empilees exclues) -- l'organe rend visible, il ne bloque pas.

@github-actions

Copy link
Copy Markdown
Contributor

Notebook PR Validation: PASS

  • Notebooks checked: 2
  • Code cells validated: 42
  • Result: All passed

Checks: H.1 (no errors), H.3 (execution_count), C.1 (no banned patterns)
Non-Python kernels (.NET/Lean): C.1 + errors only (execution_count advisory)
QuantConnect notebooks: C.1 + errors only (require QC Cloud for execution)

Grain: MED/tooling — lane myia-po-2025:CoursIA — prev: MED/tooling #17207

Le gate `Twin parity audit (#8057)` rougissait sur 1 paire(s) DRIFT_INTRODUCED.
Mesure : mouvement UNILATERAL cote C# (la tranche densite de cette branche y a
ajoute les lectures), cote Python byte-identique a origin/main.

| paire | code python | code c# | ajoutee / retiree / modifiee | cote C# |
|---|---|---|---|---|
| Search-04 LocalSearch | 23 -> 23 | 13 -> 13 | 0 / 0 / 0 | +0 cellules md |

Contenu algorithmique intact -> `parity_level: semantic` tient. La parite n'est pas
REPAREE, elle est RE-ATTESTEE (meme formule que le precedent
app-14-connectfour-adversarial/0005 pour un mouvement unilateral).

Rebaseline par l'outil canonique puis `reason:` MESURE ajoute a chaque entree — sans
lui l'attestation serait une benediction de SHA, ce que l'outil qualifie de faux audit.

Verification : `--check --per-pair --base origin/main` rc=1 -> rc=0, 0 DRIFT_INTRODUCED
(seul non-OK restant : `Probas-5 Causal-Inference` en DRIFT_PRE_EXISTING, hors PR).

Aucune re-execution, aucun octet de notebook touche, aucun volume pedagogique produit.

See #8057
Part of #13410

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
jsboige added a commit that referenced this pull request Sep 21, 2026
…thms

Grain: MED/tooling — lane myia-po-2025:CoursIA — prev: MED/tooling #17225

Le gate `Twin parity audit (#8057)` rougissait sur 1 paire(s) DRIFT_INTRODUCED.
Mesure : mouvement UNILATERAL cote C# (la tranche densite de cette branche y a
ajoute les lectures), cote Python byte-identique a origin/main.

| paire | code python | code c# | ajoutee / retiree / modifiee | cote C# |
|---|---|---|---|---|
| Search-05 GeneticAlgorithms | 33 -> 33 | 13 -> 13 | 0 / 0 / 0 | +8 cellules md |

Contenu algorithmique intact -> `parity_level: semantic` tient. La parite n'est pas
REPAREE, elle est RE-ATTESTEE (meme formule que le precedent
app-14-connectfour-adversarial/0005 pour un mouvement unilateral).

Rebaseline par l'outil canonique puis `reason:` MESURE ajoute a chaque entree — sans
lui l'attestation serait une benediction de SHA, ce que l'outil qualifie de faux audit.

Verification : `--check --per-pair --base origin/main` rc=1 -> rc=0, 0 DRIFT_INTRODUCED
(seul non-OK restant : `Probas-5 Causal-Inference` en DRIFT_PRE_EXISTING, hors PR).

Aucune re-execution, aucun octet de notebook touche, aucun volume pedagogique produit.

See #8057
Part of #13410

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Le template de generation ne detectait que le mouvement cote C# ; pour ces
paires c'est le cote PYTHON qui a gagne des cellules markdown (le cote C# est
inchange). Les motifs disaient « cote non identifie, +0 cellules » — un motif
faux sur une attestation est pire que l'absence de motif. Cote et compte
corriges d'apres la mesure ; les SHAs attestes sont inchanges (le contenu
des notebooks n'a pas bouge depuis le commit precedent).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
@jsboige

jsboige commented Sep 21, 2026

Copy link
Copy Markdown
Owner Author

[REPAIR][lane myia-po-2025:CoursIA] Gate Twin parity audit (#8057) — re-attestation de 1 paire en derive, head 23e6464175.

Le gate rougissait sur 1 paire DRIFT_INTRODUCED. Mesure avant tout geste : mouvement unilatéral (la tranche densité de cette branche a ajouté les lectures d'un seul côté ; l'autre côté est byte-identique à origin/main).

Paire Code python (base → tête) Code C# (base → tête) Ajoutée / retirée / modifiée Côté ayant bougé
Search-04 LocalSearch 23 → 23 13 → 13 0 / 0 / 0 python +3 cellules md

Aucune cellule de code n'a bougé d'aucun côté : le contenu algorithmique est intact, parity_level: semantic tient. La parité n'est pas réparée — elle est ré-attestée, geste distinct qui se déclare. Même formule que le précédent app-14-connectfour-adversarial/0005.

Méthode : rebaseline par l'outil canonique (--update --pair "<nom>" --by myia-po-2025:CoursIA), puis reason: mesuré dans chaque entrée. Un motif erroné a été détecté et corrigé par un second commit sur les paires où le côté mobile était python (le template initial ne qualifiait que le côté C#).

Vérification : --check --per-pair --base origin/main → rc=1 avant, rc=0 après, 0 DRIFT_INTRODUCED (seul non-OK restant : Probas-5 Causal-Inference, DRIFT_PRE_EXISTING, hors PR).

Aucune ré-exécution, aucun octet de notebook touché, aucun volume pédagogique produit — geste de registre uniquement.

@github-actions github-actions Bot added the variation-tag-missing PR sans tag Grain: <TIER>/<GENRE> (variation-protocol) label Sep 21, 2026
@github-actions

Copy link
Copy Markdown
Contributor

Grain tag obligatoire (#10045, bloquant).

Grain tag absent (no Grain: / in body).

Pour passer ce gate, le body doit porter en tete une ligne de la forme :

Grain: <DEEP|MED|LIGHT>/<genre> -- lane <machine:workspace> -- prev: <TIER>/<GENRE> #<PR>

Le <genre> doit figurer dans l'enumeration §1 de variation-protocol.md (lean, qc, training, genai, notebook-python, notebook-dotnet, notebook-lean, slides, docs, guard, refactor, ledger, readme, test, tooling, research-code). Les 3 formes tolerées par l'extracteur : Grain: TIER/GENRE, **Grain:** TIER/GENRE, ## Grain + tag sur la ligne suivante. La lane doit suivre le format <machine>:<workspace> (cf. lane-claim-protocol.md).

@github-actions github-actions Bot removed the variation-tag-missing PR sans tag Grain: <TIER>/<GENRE> (variation-protocol) label Sep 21, 2026
@jsboige

jsboige commented Sep 22, 2026

Copy link
Copy Markdown
Owner Author

[ADJOINT PREFLIGHT]
schema: 1
lane: myia-po-2026:CoursIA-3
pr: 17225
head: 23e6464
complete: true
body: read
comments-reviewed: 6
reviews-reviewed: 0
threads-reviewed: 0
threads-unresolved: 0
surfaces-sha256: bd64ea533514d8c6f52bfb4d48ec906db3c26564aa0b2cf473d2b457898ade32
diff-files: 3
diff-additions: 103
diff-deletions: 1
checks: BLOCKED
b0: blocked
scope: pass
domain: pass
verdict: BLOCKED
[/ADJOINT PREFLIGHT]


Bloc VERDICT (cycle 27, secrétaire myia-po-2026:CoursIA-3)

Verdict : BLOCKED
Cause du rouge si BLOCKED : Runner saturation BlockingIOError fork() WSL (Tell c.87, race fork_exec 23/32 slots) ; pas de reparation auteur possible
Motif verbatim gate : no [ADJOINT PREFLIGHT] dossier comment found

@jsboige

jsboige commented Sep 22, 2026

Copy link
Copy Markdown
Owner Author

[ADJOINT PREFLIGHT]
schema: 1
lane: myia-po-2025:CoursIA-2
pr: 17225
head: 23e6464
complete: true
body: read
comments-reviewed: 7
reviews-reviewed: 0
threads-reviewed: 0
threads-unresolved: 0
surfaces-sha256: 34d67ee3d8a6bd5d16eb2b85089553b06c7f0b726ec6909662bb1cfca5aa2bd4
diff-files: 3
diff-additions: 103
diff-deletions: 1
checks: latest-wins-green
b0: clear
scope: pass
domain: pass
verdict: READY
[/ADJOINT PREFLIGHT]

@myia-ai-01

Copy link
Copy Markdown
Collaborator

Fermée au titre du veto #17040 (campagne de densité #13410 gelée). Face à main, cette PR ajoute des cellules de lecture en solde net. La lane porteuse a mesuré ce solde le 23/09, et ai-01 l'a recoupé sur trois PRs du lot (#17042, #17085, #17235).

Elle avait échappé au filtre du gel parce que ni son titre ni son body ne citent #13410 : c'est un relais g-XX de la campagne.

La branche est conservée, donc la PR peut être rouverte. Une lecture qui apporte une information qu'aucune cellule existante ne porte peut revenir hors campagne, réécrite et placée juste après sa cellule (point 4 de #17040). Les cellules que la PR modifie sans en ajouter peuvent revenir sous la forme d'une PR de correction pure.

@myia-ai-01 myia-ai-01 closed this Sep 23, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants