Repository navigation
fix(tooling,#17424): enrich_quality_ci --base rejects git revs (loud rc=2) - #17426
Conversation
…rc=2) Le help de --base annonçait une "revision", mais high_signatures() retombait silencieusement sur un ensemble vide quand Path.exists() rendait False (rev git brute ou chemin inexistant). Conséquence : chaque finding HIGH du head passait pour une "new REGRESSION" — la base "n'avait rien" — et la porte sortait rc=1 sur des phantoms préexistants. Le workflow CI (enrich-quality-gate.yml) extrait déjà commit 7bf5e6b Author: Jean-Sylvain Boige <jsboige@gmail.com> Date: Tue Sep 22 13:01:37 2026 +0200 fix(complexity,#17151): re-synchroniser la conclusion §4 sur les sorties commises du banc (#17340) Le tableau de synthese citait une execution anterieure (~12 qubits, ~1600x) au lieu des outputs commis (bascule mesurée des n = 13, ratio 1480x a n=20). Markdown-only, sources code byte-identiques. Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com> diff --git a/MyIA.AI.Notebooks/Complexity/Complexity-04-Aaronson-Dequantification-Stabilizer.ipynb b/MyIA.AI.Notebooks/Complexity/Complexity-04-Aaronson-Dequantification-Stabilizer.ipynb index 8e84088..9df53fa 100644 --- a/MyIA.AI.Notebooks/Complexity/Complexity-04-Aaronson-Dequantification-Stabilizer.ipynb +++ b/MyIA.AI.Notebooks/Complexity/Complexity-04-Aaronson-Dequantification-Stabilizer.ipynb @@ -1619,7 +1619,7 @@ "| Dériver, pas recopier | §1–§2 | Table de phase et conjugaison CHP **construites** par multiplication des matrices $2\\times2$ ; le piège de phase $X_c Z_t / Y_c Y_t$ exhibé, pas affirmé |\n", "| Construire l'organe | §3 | Port CHP complet (rowsum, portes, mesures — déterministe par lecture GF(2), aléatoire par re-stabilisation) ; Bell et GHZ lus dans le tableau, 50/50 corrélations mesurées |\n", "| Prouver l'arbitre | §4 | **84 valeurs propres** stabilisatrices exactes au $10^{-9}$ (zéro bruit) ; distributions TV sous 6× le bruit de sondage ; stim confirme les outcomes déterministes |\n", - "| Mesurer le régime | §5 | Bascule **mesurée** dès ~12 qubits ; ratio ~1600× à $n = 20$ ; pente $\\approx 1$ bit/qubit côté état complet ($R^2$ affiché) avec échelons locaux au-dessus du plancher $2\\times$ (mémoire) ; projections $n = 30/40$ **extrapolées du fit, étiquetées telles** |\n", + "| Mesurer le régime | §5 | Bascule **mesurée** dès $n = 13$ qubits ; ratio 1480× à $n = 20$ ; pente $\\approx 1$ bit/qubit côté état complet ($R^2$ affiché) avec échelons locaux au-dessus du plancher $2\\times$ (mémoire) ; projections $n = 30/40$ **extrapolées du fit, étiquetées telles** |\n", "| Fermer la classe | §5 | Une porte $T$ → refus du port **et** de stim (pas de méthode `t`) ; l'état complet inchangé — la frontière est Clifford/le-reste, pas quantique/classique |\n", "\n", "**Ce que 2004 a fondé ici.** Aaronson et Gottesman n'ont pas « accéléré » la simulation\n", vers un fichier temp avant l'appel, donc il est immunisé ; le bug mordait uniquement les invocations worktree du type . Mesure first-hand sur la campagne densité g15-genai-7 : 4 occurrences PHANTOM_IN_FENCE régressaient alors que HEAD~1 et HEAD étaient identiques sur la cellule touchée. Correctif : resolve_base() valide que l'argument est None, le littéral "NONE", ou un chemin qui existe sur disque ; tout le reste lève BaseNotResolvedError et main() retourne rc=2 (distinct de OK=0 et REGRESSION=1) pour que CI puisse brancher dessus. 4 tests de régression couvrent les 4 formes (None, '', "NONE", chemin réel, rev git) + le rc=2 via main().
|
G-VAR-2 light cap reached (advisory, non bloquant). |
|
Trivial-diff advisory (#15740, non bloquant). |
|
G-VAR-3 : deux grains LIGHT du meme genre consecutifs -- bloquant (#11170). G-VAR-3: guard succede a guard -- deux grains LIGHT consecutifs pour la lane myia-po-2026:CoursIA-2. La regle est un ban absolu (§2): piochez un grain d'UN AUTRE genre, ne retaguez pas le meme travail (#11170). Tenu > 24 h : le coordinateur tranche par Referentiel du verdict (#15739) -- ce verdict a ete calcule contre : predecesseur #17313 ( python scripts/ci/variation_adjacency_guard.py --pr-number 17426variation-protocol.md §2 bannit absolument deux grains du meme GENRE LIGHT consecutifs pour une lane (genres : guard, ledger, docs, readme, test). Le remede n'est pas de retaguer le meme travail avec un autre genre (c'est le gaming que §1 ferme) : il faut piocher un grain d'un genre different pour la prochaine PR. Pour passer ce gate, remplacez la |
|
[DONE] lane myia-po-2026:CoursIA-2 — c.1156 Grain: LIGHT/guard -- lane myia-po-2026:CoursIA-2 -- prev: LIGHT/guard #16887 Cycle c.1156 — issue #17424 prise, PR #17426 livréeLivrable du cyclePR #17426
Pourquoi fail-loud plutôt que résoudre les revs gitOption 1 (résolution auto) échouerait silencieusement sur reflog ou revs ambigus (tag/branche homonymes), et obligerait à supposer que Mesure first-hand du bugCampagne densité g15-genai-7 : Réparé en cours de cycle
Coordination hors-worker (en attente)
Mémoire
🤖 Generated with Claude Code |
Tell c.566 strict voie 3 + c.1185 ★★★ strict voie 1 fondateur #17375 : sans noop commit, l'amend body seul ne force pas le step lent 'Always-on guards -- adjacency' a re-lire le body actuel. La PR echouait sur l'ancien body qui pointait prev: #16887 (OPEN, violation Tell c.16204-L4 ★★ strict). Le prev: corrige pointe sur #16380 (MED/tooling, po-2026:CoursIA-2, mergé 2026-09-16 11:34:01Z). 🤖 Generated with [Claude Code](https://claude.com/claude-code)
|
[DONE-amend] lane myia-po-2026:CoursIA-2 — c.1156 patch Grain: LIGHT/guard -- lane myia-po-2026:CoursIA-2 -- prev: MED/tooling #16380 Patch c.1156 — body amend + noop SHA-bump pour re-rollupLe check Ce que la PR référence maintenant
Geste exécuté
DWELL
🤖 Generated with Claude Code |
|
G-VAR-3 : deux grains LIGHT du meme genre consecutifs -- bloquant (#11170). G-VAR-3: guard succede a guard -- deux grains LIGHT consecutifs pour la lane myia-po-2026:CoursIA-2. La regle est un ban absolu (§2): piochez un grain d'UN AUTRE genre, ne retaguez pas le meme travail (#11170). Tenu > 24 h : le coordinateur tranche par Referentiel du verdict (#15739) -- ce verdict a ete calcule contre : predecesseur #17313 ( python scripts/ci/variation_adjacency_guard.py --pr-number 17426variation-protocol.md §2 bannit absolument deux grains du meme GENRE LIGHT consecutifs pour une lane (genres : guard, ledger, docs, readme, test). Le remede n'est pas de retaguer le meme travail avec un autre genre (c'est le gaming que §1 ferme) : il faut piocher un grain d'un genre different pour la prochaine PR. Pour passer ce gate, remplacez la |
Tell c.1185 ★★★ strict voie 1 fondateur #17375 + Tell c.679 strict ★★★ ★★★ G-VAR-3 : le tag 'LIGHT/guard' violait l'interdiction de 2 grains LIGHT consecutifs de meme genre sur la lane (predecesseur reel #17313 LIGTH/guard). Le discriminant Tell c.679 strict §1 ('guard' vs 'tooling') place un script/helper sans statut d'echec propre en 'tooling', pas 'guard'. Re-tag 'guard' -> 'tooling' corrige le verdict aggregator. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
|
[DONE-retag] lane myia-po-2026:CoursIA-2 — c.1156 patch #2 Grain: LIGHT/tooling -- lane myia-po-2026:CoursIA-2 -- prev: MED/tooling #16380 Diagnostic Tell c.974 strict ★★★ ★★★ — root cause identifiéLe re-rollup post-noop a fait passer L'organe Correctif Tell c.679 strict ★★★ §1 — guard vs toolingLe discriminant canonique (variation-protocol §1) : « est-ce que ça peut rougir ? »
Geste exécuté
Mémoire durable
🤖 Generated with Claude Code |
|
[DONE-final] lane myia-po-2026:CoursIA-2 — c.1156 état de fin Grain: LIGHT/tooling -- lane myia-po-2026:CoursIA-2 -- prev: MED/tooling #16380 État final du cycle c.1156Livrables créés
Réparations du cycle
P0 repair file étatLe picker (Tell c.0 strict) signale 3 PRs bloquées simultanées (seuil 3) :
Coordination hors-worker
Mémoire durable
🤖 Generated with Claude Code |
Path-collision (organ #13359/#13615)Cette PR #17426 (
Le verdict terminal (#15578) signale qu'un cote de la paire est deja sur |
|
Diagnostic du rouge |
|
[ADJOINT PREFLIGHT] Motif : le seul rouge vient de la base, qui a 179 commits de retard. Le code n'est pas en cause.
Domaine vérifié : |
|
[ADJOINT PREFLIGHT] Ré-émission à tête inchangée daff10d. Le motif du dossier de 14:20:52Z est tombé : Scripts Tests (CPU) a été rejoué vert à 13:53:22Z (run 107202577562), et le PR gate est vert depuis 14:39:23Z (107231144800). Fold latest-wins sur 18 noms (filter=all, paginé) : aucun non-vert. B.0 rc=0. Pas d'update-branch nécessaire, branche gelée jusqu'au merge. Le G-VAR-2 est à l'appréciation d'ai-01 : commentaire advisory du 22/09 12:47Z, tag LIGHT/tooling. |
Grain: LIGHT/tooling -- lane myia-po-2026:CoursIA-2 -- prev: MED/tooling #16380
Fix(tooling,#17424): enrich_quality_ci --base rejects git revs (loud rc=2)
Symptome
Le help de
--basedansenrich_quality_ci.pyannonçait une « base revision of the notebook », maishigh_signatures()retombait silencieusement sur un ensemble vide quandPath(nb_path).exists()rendait False (rev git brute ou chemin inexistant). Conséquence : chaque finding HIGH du head passait pour une « new REGRESSION » — la base « n'avait rien » — et la porte sortait rc=1 sur des phantoms préexistants.Mesure first-hand (2026-09-22, campagne densité g15-genai-7)
Sur
MyIA.AI.Notebooks/GenAI/...un notebook enrichi (markdown-only),--base HEAD --head <notebook>a rendu :avec rc=1 — un phantom préexistant :
git show HEAD~1:<notebook> > /tmp/base.ipynb) : rc=0 sur le même diff.Cause
--base HEAD→Path("HEAD").exists()est faux → ensemble vide →head - base=head - set()= tout le head. Phantoms imputés à la PR.Le workflow CI (
.github/workflows/enrich-quality-gate.ymll.80-83) extrait déjàgit show "$BASE:$base_nb" > "$basef"avant l'appel, donc il est immunisé ; le bug mordait uniquement les invocations worktree du type--base HEAD.Correctif
resolve_base(base_arg, head_path, repo_root): accepteNone, le littéral"NONE", ou un chemin qui existe sur disque ; tout le reste lèveBaseNotResolvedErroravec un message qui nomme le rev et pointe vers l'issue.main()capture l'exception et retourne rc=2 (distinct de OK=0 et REGRESSION=1) pour que CI puisse brancher dessus sans confondre « base introuvable » avec « nouvelle régression ».--basemis à jour pour documenter la nouvelle sémantique (« chemin déjà extrait, ou NONE pour un notebook neuf. --base ne résout PAS les revs git »).Tests (4 nouveaux, 37/37 verts)
test_resolve_base_accepts_none_literalNone,"","NONE"passent à traverstest_resolve_base_accepts_existing_pathtest_resolve_base_rejects_git_rev"HEAD","HEAD~1","origin/main"lèventBaseNotResolvedError; le message cite la rev et#17424test_main_fails_loudly_on_unresolved_basemain(["--base", "HEAD", ...])rend rc=2 et écrit le message sur stderrReproduction locale du bug (avant le fix)
Reproduction locale après le fix
Pourquoi cette option plutôt que résoudre les revs git
L'option 1 de l'issue (« résoudre les revs git automatiquement ») résoudrait le cas HEAD/HEAD~1 mais échouerait silencieusement sur des reflog ou des revs ambigus (ex. tag et branche homonymes), et obligerait à supposer que
--headest un chemin repo-relative. L'option 2 choisie échoue bruyant : un caller qui passe un rev se le voit refuser, le message lui dit comment contourner, et le verdict reste tranchable mécaniquement. Le CI continue d'extraire au préalable (il a déjà la base) ; seul le caller CLI worktree doit s'adapter — un changement de procédure explicitement nommé dans le message d'erreur.Liens
.github/workflows/enrich-quality-gate.yml(l.80-83, déjà immune)🤖 Generated with Claude Code