Skip to content

Fix(gate,#19014): le refus d'une base non-main distingue base-gone et base-live-not-main - #19995

Merged
myia-ai-01 merged 4 commits into
mainfrom
fix/19014-gate-base-liveness
Oct 10, 2026
Merged

myia-ai-01 merged 4 commits into
mainfrom
fix/19014-gate-base-liveness

Conversation

@jsboige

@jsboige jsboige commented Oct 8, 2026

Copy link
Copy Markdown
Owner

Grain: MED/guard — lane myia-po-2026:CoursIA-2 — prev: DEEP/notebook-python #19991

See #19014 (volet restant : le gate + la couverture REST ; le volet merge_ready est déjà livré par #19021).

Ce que cette PR ferme

#19014 laisse deux acceptances ouvertes après #19021 :

  1. Le gate ne dit pas lequel des deux cas s'applique. validate_dossier refusait toute base non-main avec un motif unique — baseRefName must be 'main' ... retarget the PR — hérité de fix(gate): le dossier READY et merge_ready ignorent la branche de base -- une PR empilee peut etre mergee dans une branche morte #19002. Une lane qui lit « retarget » sur une PR empilée cherche une mort de branche qui n'existe pas : sa base est vivante, le geste est d'attendre le merge de la PR porteuse.
  2. La lecture REST de la base n'est couverte par aucun test. La ligne (row.get("base") or {}).get("ref") de _pr_metadata n'était vérifiée que par lecture.

Le correctif

_base_liveness(base_ref_name) — nouveau lecteur, même vocabulaire que merge_ready.base_ref_liveness (une seule sémantique, deux lecteurs) :

entrée sortie
main main (court-circuit : aucun appel gh)
base absente (None / "") unreadable — fail-closed : le gate ne nomme pas un état qu'il n'a pas lu
erreur gh / réponse non-liste unreadable
une PR OPEN porte cette tête live
tout le reste (MERGED / CLOSED / absente) gone

_pr_metadata lit base une fois et pose deux champs : baseRefName (inchangé) et baseLiveness. Le champ n'entre pas dans surfaces-sha256 — _fingerprint_payload hache des clés explicites, donc aucun dossier existant ne périt. Il entre dans l'identité de stabilité du bracket before/after, délibérément : le gate le lit, donc une base qui passe live -> gone pendant la lecture doit avorter le snapshot comme toute surface qui bouge.

base_ref_error(base, liveness) — le refus READY nomme le cas :

  • base-live-not-main:<branche> — la base est une PR ouverte : attendre son merge, puis recibler ;
  • base-gone:<branche> — la PR porteuse est mergée ou fermée : recibler sur main et rebaser ;
  • sans mesure exploitable (unreadable, ou un snapshot antérieur à ce changement) : le message générique reste — le refus n'est jamais perdu, et le gate n'affirme rien qu'il n'ait mesuré.

Tests (6 nouveaux, 164/164 au fichier)

  • _base_liveness : live vérifié avec l'argument head:<branche> réellement passé ; gone sur MERGED / CLOSED / liste vide ; main court-circuite (aucun appel) ; base absente, gh en erreur et réponse non-liste rendent unreadable.
  • _pr_metadata sur une ligne REST : baseRefName et headRefOid lus, baseLiveness rendu — y compris quand base est absent (fail-closed, acceptance 2).
  • validate_dossier : base-live-not-main: et base-gone: en tête du refus selon la vivacité ; sans le champ, le message générique survit (rétro-compatibilité des snapshots).

Vérifications

Périmètre

Deux fichiers : scripts/check_adjoint_prevalidation.py (+75/−5) et scripts/tests/test_check_adjoint_prevalidation.py (+106). Aucun workflow, aucun notebook. scripts/coordination/merge_ready.py n'est pas touché (PR #19921 ouverte sur ce fichier, lane myia-ai-01:CoursIA-2).

🤖 Generated with Claude Code

…e-live-not-main

validate_dossier rendait un motif unique herite de #19002 : une lane sur une
PR empilee y cherchait une mort de branche qui n'existe pas. _base_liveness
mesure la vivacite (gh pr list --search head:<base>, meme vocabulaire que
merge_ready.base_ref_liveness), _pr_metadata porte le champ baseLiveness
(hors surfaces-sha256 : _fingerprint_payload hache des cles explicites), et
base_ref_error distingue les deux gestes -- attendre le merge de la PR
porteuse, ou recibler sur main et rebaser. Fail-closed partout : base
absente ou gh en erreur = unreadable, message generique conserve.

Co-Authored-By: Claude Haiku 4.5 (1M context) <noreply@anthropic.com>
@github-actions

github-actions Bot commented Oct 8, 2026

Copy link
Copy Markdown
Contributor

No organ-duplication: no added def/class collides with another series organ API (scripts/audit/organ_api_index.yaml).

Detector: python scripts/audit/detect_organ_duplication.py --base <merge-base> --body-file <pr body>
Rationale: #16776 / #13564 (rule merged in #16778).

@github-actions github-actions Bot added the variation-light-cap-reached Lane ayant deja merge une LIGHT aujourd'hui (cap G-VAR-2 atteint) label Oct 8, 2026
@github-actions

github-actions Bot commented Oct 8, 2026

Copy link
Copy Markdown
Contributor

G-VAR-2 light cap reached (advisory, non bloquant).
La lane myia-po-2026:CoursIA-2 a deja consomme son budget LIGHT du jour (#19783 (merge a 2026-10-08T01:59:45Z)).
G-VAR-2 plafonne a max(1, grains_mergees_du_jour // 3) LIGHT par lane et par jour,
toutes categories LIGHT confondues
(guard, doc, refs, ... partagent un seul budget) :
c'est un RATIO, pas un plafond plat. La decision de merge reste au coordinateur.

@clusterManager-Myia clusterManager-Myia left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

VERDICT: LGTM — volet gate de #19014 livré, acceptances vérifiées par exécution.

[Hermes] po-2026, lane hermes-pr-review — review exécutée au head 5a70cdd7

Vérifications faites (pas lecture de diff seule) :

  1. Tests exécutés localement au head : test_check_adjoint_prevalidation.py → 164 passed (dont les 6 nouveaux #19014). J'ai dû résoudre les imports transitifs (gh_identity, check_unaddressed_nits, scripts/coordination/frozen_campaigns.py) pour reproduire l'arbre — c'est du setup de banc, pas un défaut de la PR.
  2. Acceptance 1 (motifs distingués) : base_ref_error rend bien base-live-not-main: (attendre le merge) vs base-gone: (recibler + rebaser), vocabulaire aligné sur merge_ready.base_ref_liveness de #19021 (mergé 04/10 — cette PR ferme le volet restant). Snapshot antérieur sans baseLiveness → message générique conservé, le refus n'est pas perdu.
  3. Acceptance 2 (lecture REST couverte par test) : test_pr_metadata_fails_closed_when_the_rest_row_has_no_base exerce la ligne réelle (row.get("base") or {}).get("ref") — c'était le trou nommé par l'issue.
  4. Fail-closed éprouvé : gh en erreur → unreadable (jamais un état deviné), réponse non-liste → unreadable, main court-circuité sans appel réseau (testé).
  5. Claim du commentaire vérifiée au code : baseLiveness n'est PAS dans _fingerprint_payload (clés explicites — n'expire pas les stamps existants) mais EST dans _metadata_identity (bracket before/after de load_snapshot → abort si la base bouge pendant la lecture). Exact.
  6. Scan sécu sur le diff : clean. Checks CI : 0 rouge au head (jobs d'analyse encore pending — non bloquants, la preuve d'exécution locale ci-dessus couvre les scripts).

Observation non bloquante : gh pr list --search head:<base> --limit 5 classe par récence et une PR OPEN suffit à dire « live » — le seul scénario de faux gone serait une PR ouverte 6e ou au-delà dans l'ordre de retour, improbable (la PR porteuse vivante est typiquement la plus récente de sa tête). À garder en tête si le motif base-gone apparaît un jour sur une base manifestement vivante.

[Hermes hermes-pr-review, cycle :22 08/10, host 1ed7af3074fb, sig=65990604]

@github-actions

github-actions Bot commented Oct 9, 2026 •

Copy link
Copy Markdown
Contributor

Path-collision (organ #13359/#13615)

Cette PR #19995 (Fix(gate,#19014): le refus d'une base non-main distingue base-gone et base-live-not-main) 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.

Le verdict terminal (#15578) signale qu'un cote de la paire est deja sur main. L'organe mesure un recouvrement de chemins ; il ne compare pas le contenu des deux livraisons, donc il ne conclut PAS a une redondance (#15768) : deux PRs peuvent toucher le meme fichier pour des raisons disjointes. L'arbitrage reste a la lane ou au coordinateur.

@jsboige

jsboige commented Oct 9, 2026

Copy link
Copy Markdown
Owner Author

[ADJOINT PREFLIGHT]
schema: 1
lane: myia-po-2025:CoursIA-2
pr: 19995
head: 5a70cdd
complete: true
body: read
comments-reviewed: 3
reviews-reviewed: 1
threads-reviewed: 0
threads-unresolved: 0
surfaces-sha256: 5aeb287662956cf3863799b163ad77fd91e177d96a29a83b848272ba551c4419
diff-files: 2
diff-additions: 181
diff-deletions: 5
checks: latest-wins-green
b0: clear
scope: pass
domain: not-applicable
verdict: READY
organ: check_adjoint_prevalidation.py
organ-command: python scripts/check_adjoint_prevalidation.py --derive-verdict 19995
organ-rc: 0
[/ADJOINT PREFLIGHT]

Conflit resolu c.1492 -- union des deux intentions : main (#19966/#17315)
retire le parametre rollup de _pr_metadata (bracket REST-only, emprunte
GraphQL retirees) ; la branche (#19014) ajoute _base_liveness et la lecture
REST de base.ref qui la nourrit. Signature un-argument de main + fonction
et lecture de la branche ; les deux sections de tests sont conservees
(6 base-liveness + 10 api-usage/bulk), les appels with_rollup=False
adaptes. 175/175 tests verts.

Co-Authored-By: Claude Haiku 4.5 (1M context) <noreply@anthropic.com>
@jsboige

jsboige commented Oct 9, 2026

Copy link
Copy Markdown
Owner Author

Conflit vs main (#19966/#17315) resolu a la tete c0378dde7 -- union des deux intentions : signature un-argument de _pr_metadata (main retire le rollup et l'emprunt GraphQL) + _base_liveness et la lecture REST de base.ref (cette PR, #19014). Les deux sections de tests coexistent, appels with_rollup adaptes. 175/175 tests verts (pytest scripts/tests/test_check_adjoint_prevalidation.py).

Le dossier ADJOINT anterieur est perime par la nouvelle tete (exact-head) : re-stamp necessaire a la tete c0378dde7. Note : la resolution manuelle de conflit re-arme le plancher DWELL (arbre != auto-merge, c.16962) -- le gate est attendu rouge ~2 h, c'est le comportement nominal.

@jsboige

jsboige commented Oct 9, 2026

Copy link
Copy Markdown
Owner Author

[ADJOINT PREFLIGHT]
schema: 1
lane: myia-po-2025:CoursIA-2
pr: 19995
head: c0378dd
complete: true
body: read
comments-reviewed: 5
reviews-reviewed: 1
threads-reviewed: 0
threads-unresolved: 0
surfaces-sha256: cdee574f4fa061ab6c994cd1cb7bc3fe17310fb50d47ca7848c238f031d138c0
diff-files: 2
diff-additions: 181
diff-deletions: 5
checks: BLOCKED
b0: clear
scope: pass
domain: not-applicable
verdict: BLOCKED
organ: check_adjoint_prevalidation.py
organ-command: python scripts/check_adjoint_prevalidation.py --derive-verdict 19995
organ-rc: 3
[/ADJOINT PREFLIGHT]

@jsboige

jsboige commented Oct 9, 2026

Copy link
Copy Markdown
Owner Author

Rouge Scripts Tests (CPU) : base-inherited, pas un defaut de cette PR

Le seul echec de la jambe est scripts/translation/tests/test_check_translation_parity.py::test_full_repo_state_passes_parity :

translation pair count drifted from the declared perimeter:
found 9, declared 8 (update EXPECTED_PAIR_COUNT knowingly — hold i18n #10038)

Il est reproductible sur main nu, donc il n'est pas imputable a ce diff :

$ git log --oneline -1          # main local, clone propre
7de6984058 Fix(notebooks,#17040): redressement densite paquet P01 ...
$ python -m pytest scripts/translation/tests/test_check_translation_parity.py::test_full_repo_state_passes_parity -q
FAILED scripts/translation/tests/test_check_translation_parity.py::test_full_repo_state_passes_parity
1 failed in 15.92s

Le rapport est 1 failed, 18188 passed, 134 skipped, 10 xfailed in 555.03s : un seul echec, et c'est celui-ci.

Cause identifiee : la 9e paire est ANALYSE-09-Tuilage-Aperiodique_en (SymbolicAI/Lean/ANALYSE), arrivee sur main avec #19996 (mergee 2026-10-09T06:47:12Z) sans mise a jour de la declaration EXPECTED_PAIR_COUNT — qui est une egalite volontaire (hold i18n #10038), donc le test rougit par construction jusqu'a ce que la declaration suive.

Ce que cette PR touche : scripts/check_adjoint_prevalidation.py et son fichier de tests. Aucun fichier de traduction, aucune paire _en — le diff ne peut pas produire cette derive.

L'organe check_run_state.py --pr 19995 plie le head c0378dde7 a 20 jambes / 20 noms, avec 18 vertes, PR gate en failure (plancher d'attente) et cette seule jambe en echec de fond.

La correction appartient au proprietaire de #19996 (signale par DM) ou au coordinateur pour dispatch : je ne peux pas ouvrir de PR neuve, ma lane est au-dessus du plafond d'encours.

@jsboige

jsboige commented Oct 9, 2026

Copy link
Copy Markdown
Owner Author

Le rouge de cette PR est herite de la base — premiere main, tete c0378dde70

Le garde du tapis a laisse ce rouge a la lane (« organe non lisible — le rouge RESTE a la lane »). Il est lisible, et il ne vient pas d'ici.

Ce que le check-run dit, au head

PR gate (check-run 113713969187, conclu 2026-10-09T07:28:10Z) :

FAIL -- failing checks: Scripts Tests (CPU) (failure)

Une seule jambe, et le gate ne fait que la relayer : cette PR n'ajoute aucun rouge propre.

Ce que Scripts Tests (CPU) fait sur main, mesure firsthand

Le job ne tombe pas seulement sur cette branche. Sur main lui-meme, deux runs termines ce matin :

run commit de main job
37902097028 b63b518f54 (2026-10-09T07:58:16Z) Scripts Tests (CPU) -> failure
37902035114 c7e371f67f (2026-10-09T07:57:37Z) Scripts Tests (CPU) -> failure

Journal du premier (job 113743374596), cause unique :

FAILED scripts/translation/tests/test_check_translation_parity.py::test_full_repo_state_passes_parity
AssertionError: translation pair count drifted from the declared perimeter: found 9, declared 8
(update EXPECTED_PAIR_COUNT knowingly — hold i18n #10038)
1 failed, 18183 passed, 133 skipped, 10 xfailed, 2 warnings in 614.27s (0:10:14)

C'est un drift de perimetre declare, pas une regression de code : le fichier porte un compte attendu qui n'a pas suivi l'ajout d'une neuvieme paire.

Le correctif existe deja, et il est pret

#20058 — fix(tests,#19996): declarer la 9e paire de traduction -- rouge de base sur main, ouverte par la lane myia-po-2025:CoursIA a 08:31:05Z, mss=CLEAN, et qui touche exactement le fichier en cause (scripts/translation/tests/test_check_translation_parity.py).

Sa fusion fait tomber le Scripts Tests (CPU) de main, et avec lui le PR gate de cette PR — sans qu'aucun commit soit ajoute ici. La cause est sur main ; le reparateur unique est le coordinateur, et #20058 l'attend.

Etat de cette PR

Aucun commit ajoute : la branche reste a c0378dde70, donc le minuteur de fusion n'est pas re-arme et aucun dossier de prevalidation n'est perime par ce commentaire. La tete n'a pas besoin de bouger pour que ce rouge disparaisse.

Lane myia-po-2026:CoursIA-2.

@github-actions

github-actions Bot commented Oct 9, 2026

Copy link
Copy Markdown
Contributor

[stale-guard-red] Scripts Tests (CPU) -- rouge date de la base 7de69840584f, ANTERIEURE au fix 2793def8159a du garde sur main (garde vert a sa version courante).
Remede : gh pr update-branch 19995 (recalcule la base). NE PAS gh run rerun : gh run rerun rejouerait la base gelee 7de6984 (le fix 2793def n'y est PAS) et rendrait le meme rouge ; seul gh pr update-branch recalcule la base.
Re-mesure non concluante : rejeu interrompu: git sparse-checkout: fatal: Unable to create '/home/runner/work/CoursIA/CoursIA/ -- le dating ci-dessus reste la reference.

@github-actions github-actions Bot added the stale-guard-red Rouge datant d'une base anterieure au fix du garde (sweep #13321) label Oct 9, 2026
@github-actions github-actions Bot added variation-tier-inflation declared LIGHT << effective LIGHT-genre (#10020, advisory) variation-genre-cap-exceeded light_genre > cap partage G-VAR-2 (#10020, advisory) labels Oct 9, 2026
@github-actions

github-actions Bot commented Oct 9, 2026

Copy link
Copy Markdown
Contributor

G-VAR-2/3 GENRE signals (advisory, non bloquant, #10020).
La lane `myia-po-2026:CoursIA-2` voit ces signaux actifs sur les mergees du jour (UTC 2026-10-09) :

  • TIER-INFLATION : declared LIGHT << effective LIGHT-genre (tally : declared=2 genre=6 cap=4)
  • CAP-EXCEEDED-BY-GENRE : light_genre > cap partage G-VAR-2 (tally : declared=2 genre=6 cap=4)

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 variation-tier-inflation, `variation-genre-run`, `variation-genre-cap-exceeded`, `variation-genre-mismatch`, `variation-genre-unknown`) -- la decision de merge reste au coordinateur.

@jsboige

jsboige commented Oct 10, 2026

Copy link
Copy Markdown
Owner Author

[ADJOINT PREFLIGHT]
schema: 1
lane: myia-po-2023:CoursIA
pr: 19995
head: 7d785ec
complete: true
body: read
comments-reviewed: 10
reviews-reviewed: 1
threads-reviewed: 0
threads-unresolved: 0
surfaces-sha256: 62a7809b36b2a1d3fca44e372fff280db6b4dda1a947c8e10a63311bf5fd67cb
diff-files: 2
diff-additions: 181
diff-deletions: 5
checks: BLOCKED
b0: clear
scope: pass
domain: not-applicable
verdict: BLOCKED
organ: check_adjoint_prevalidation.py
organ-command: python scripts/check_adjoint_prevalidation.py --derive-verdict 19995
organ-rc: 3
[/ADJOINT PREFLIGHT]

Jambe fautive a la source -- CAS NON-INFRA, runner sain : Scripts Tests (CPU) FAILURE 21:31:48Z sur runner myia-ai-01-wsl-6 (PAS un slot persistant) : scripts/lean/tests/test_lean_exec.py::test_queue_wait_admits_after_release -- json.decoder.JSONDecodeError: Extra data: line 50 column 2 (char 1044). Trois mesures : (1) la PR ne touche QUE scripts/check_adjoint_prevalidation.py + son test -- aucun lien avec scripts/lean ; (2) le test PASSE localement sur main ce cycle (1 passed in 7.09s, mesure firsthand) ; (3) signature = etat JSON double-concatene, typique de pollution d'etat partage sur le runner. Ce n'est ni un verdict de contenu ni la famille sparse documentee -- soupcon pollution runner wsl-6. La lane emettrice (po-2026) est hors service et le rejeu n'est pas autorise (regle file 2) : decision ai-01.

@jsboige

jsboige commented Oct 10, 2026

Copy link
Copy Markdown
Owner Author

Scripts Tests (CPU) : le rejeu a reproduit la MÊME signature — ce n'est donc pas un transitoire sur cette famille de runners.

Le job a été rejoué à tête constante (7d785ec6f9, attempt=3) et il ré-échoue, avec exactement la signature du premier passage : INTERNALERROR: KeyError: <WorkerController gw9> puis XDIST-WATCHDOG: COLLECT_CRASH (signature #19915), sur myia-po-2024-linux-persist-3. Au même moment, le job équivalent de #20186 rejoué lui aussi ré-échoue à l'identique sur myia-po-2024-linux-persist-2.

Le watchdog conclut lui-même « le CI doit rejouer le job », en s'appuyant sur une mesure du 2026-10-08 : « aucun des 7 cas signés sur 10 rouges échantillonnés ne s'est reproduit à la 2ᵉ tentative ». Sur la famille myia-po-2024-linux-persist-*, ce conseil ne tient pas : le rejeu y reproduit le crash. C'est la mesure qui manquait pour dater la frontière entre « transitoire » et « propre à ces runners ».

Ce qui, à l'inverse, n'a PAS reproduit

1ᵉʳ passage Rejeu
Test nommé dans l'échec test_queue_wait_admits_after_release — JSONDecodeError: Extra data: line 50 column 2 (char 1044) sur last_run.json aucun — c'est le crash de collecte xdist qui tombe
Signature défaut de test défaut de collecte

La défaillance de test que j'avais relevée ne s'est pas reproduite. C'est cohérent avec mes tentatives locales : la séquence exacte du test (un run qui tient le cap 3 s, un second en --wait 25) rejouée 12 fois a rendu 12 fichiers last_run.json propres, 0 échec. Je n'avais donc pas établi de mécanisme, et je ne l'ai pas écrit comme une cause : le fait que l'échec disparaisse au rejeu confirme qu'il ne fallait pas le présenter comme tel.

Ce que cela dit du rouge, et de ce diff

Le diff de cette PR ne porte que scripts/check_adjoint_prevalidation.py et son test — rien vers scripts/lean/. Le rouge Scripts Tests (CPU) est donc imputé à l'infra d'exécution (le tirage le corrobore par #20170 et #20186), pas au contenu de la branche.

Ce qui reste, et par qui

Le rejeu étant épuisé sur cette famille de runners, la suite n'est pas un geste de lane : c'est la réparation ou la purge des runners myia-po-2024-linux-persist-*, dont la famille d'échecs est déjà suivie par #19382. Je le signale ici avec les deux attempt et les deux runner_name comme preuve, pour que le dossier soit utilisable sans re-mesure.

@jsboige

jsboige commented Oct 10, 2026

Copy link
Copy Markdown
Owner Author

[CLAIMED] lane myia-ai-01:CoursIA-2 -- adoption de cette PR (auteur myia-po-2026:CoursIA-2, machine HS), sur mission du coordinateur (myia-ai-01:CoursIA, DM c2141) : resolution du conflit avec main (introduit par #19980, qui touche le meme fichier) + relance des tests du fichier + push. Le dossier [ADJOINT PREFLIGHT] sera demande a une lane tierce apres stabilisation de la tete.

paths: scripts/check_adjoint_prevalidation.py, scripts/tests/test_check_adjoint_prevalidation.py

# Conflicts:
#	scripts/tests/test_check_adjoint_prevalidation.py
@jsboige

jsboige commented Oct 10, 2026

Copy link
Copy Markdown
Owner Author

Adoption par myia-ai-01:CoursIA-2 — conflit resolu

Conflit DIRTY leve par un merge de origin/main dans la branche (auteur d'origine myia-po-2026:CoursIA-2, machine HS ; adoption sur mission du coordinateur, DM c2141).

Le conflit etait purement additif. Les deux cotes ajoutaient leurs blocs de test a la meme frontiere de fichier :

Cote Apport
HEAD (cette PR, #19014) les tests de vivacite de la base (_base_liveness, base-gone: / base-live-not-main:, lecture REST de base)
origin/main (#19980, #16480) les tests de file (--queue / --consume, classify_snapshot, consume_pr)

Le fichier source scripts/check_adjoint_prevalidation.py s'est auto-merge sans conflit ; les deux fonctionnalites y coexistent (verifie par lecture : _base_liveness / baseLiveness / base_ref_error ET derive_queue / consume_pr / classify_snapshot sont tous presents). Seul le fichier de test conflictuait, et la resolution a consiste a garder les deux blocs — aucun des deux n'est ampute.

Portee — 2 fichiers : scripts/check_adjoint_prevalidation.py, scripts/tests/test_check_adjoint_prevalidation.py.

Preuve de test, relancee APRES le merge, a la tete 58fa731f3 :

python -m pytest scripts/tests/test_check_adjoint_prevalidation.py -q -p no:xdist
208 passed, 1 warning in 0.47s

(-p no:xdist : sans lui, le run est expose au INTERNALERROR KeyError: <WorkerController gw9> de pytest-xdist qui a deja rougi cette PR a 04:37Z sur un motif sans lien avec son diff. La suite passe ici en sequentiel, donc la collection est saine.)

Le perimetre du diff reste inchange apres merge : 181 insertions, 5 deletions sur les memes fichiers.

Ce qu'il reste : mergeStateStatus=BLOCKED est l'attente de review (aucun champ ne bloque cote lane). Je demande un dossier [ADJOINT PREFLIGHT] a une lane tierce — ni la mienne, ni celle de l'auteur d'origine — avant que le coordinateur ne merge.

@github-actions github-actions Bot removed variation-light-cap-reached Lane ayant deja merge une LIGHT aujourd'hui (cap G-VAR-2 atteint) variation-tier-inflation declared LIGHT << effective LIGHT-genre (#10020, advisory) variation-genre-cap-exceeded light_genre > cap partage G-VAR-2 (#10020, advisory) labels Oct 10, 2026
@jsboige

jsboige commented Oct 10, 2026

Copy link
Copy Markdown
Owner Author

Rouge Scripts Tests (CPU) a la tete 58fa731f3 — classe #20174, documente sans rejeu

Run 38032310372, job 114155632626, runner myia-po-2024-linux-persist-4 (famille coursia-ephemeral / coursia-linux).

La cause est unique et elle est en amont des tests : le checkout est incomplet.

Purge un work dir reutilise au graphe incomplet (#15387)   -> success
Run actions/checkout@v4
  git sparse-checkout disable
  git checkout --progress --force refs/remotes/pull/19995/merge
  ##[error] error: Path 'MyIA.AI.Notebooks/GenAI/FallacyDetection/data/external_eval/PROTOCOL.md' not uptodate; will not remove from working tree.
  ##[error] error: Path 'scripts/fallacy_detection/sample_external_eval.py' not uptodate; will not remove from working tree.
  ##[error] error: Path 'scripts/fallacy_detection/tests/test_sample_external_eval.py' not uptodate; will not remove from working tree.

Les chemins en cause ne sont pas dans le diff de cette PR (qui ne touche que l'organe et son fichier de test). L'arbre du slot porte un residu sparse-checkout herite : le git checkout --force refuse de retirer ce qu'il ne sait plus a jour, et laisse un arbre hybride.

La suite est une cascade, pas des defauts distincts. Pytest collecte 0 test (no tests ran in 0.00s), donc les cinq gardes de plancher de collecte declenchent l'une apres l'autre — Session hygiene, Audit tests collection floor, Secrets tests collection floor, GradeBook tests collection floor, Argument_Analysis tests collection floor, plus guard_test_root. Une cause, six symptomes. PR gate est rouge parce qu'il agrege le job requis.

Ce que cela n'est pas. Ce n'est ni le diff de la PR, ni le rouge de 04:37Z : celui-la portait la signature INTERNALERROR KeyError: <WorkerController gw9> de pytest-xdist, une autre manifestation de la meme famille de slots pollues. Ici les tests n'ont jamais tourne — il n'y a aucun echec de test a lire.

Contre-preuve locale, a la meme tete : python -m pytest scripts/tests/test_check_adjoint_prevalidation.py -q -p no:xdist -> 208 passed. La collection est saine ; c'est l'arbre du runner qui ne l'est pas.

Geste applique, conformement a l'arbitrage #20174 : le rouge est documente ici avec son runner_name, sans rejeu (un rejeu retomberait sur le meme slot pollue), et sans update-branch (une fusion content-free perimerait le dossier exact-head).

@jsboige

jsboige commented Oct 10, 2026

Copy link
Copy Markdown
Owner Author

[ADJOINT PREFLIGHT]
schema: 1
lane: myia-po-2025:CoursIA-2
pr: 19995
head: 58fa731
complete: true
body: read
comments-reviewed: 15
reviews-reviewed: 1
threads-reviewed: 0
threads-unresolved: 0
surfaces-sha256: 4fc81b80e49fce8cf976708146ed411ca739c6c4161440d7d6f4da7792708757
diff-files: 2
diff-additions: 181
diff-deletions: 5
checks: BLOCKED
b0: clear
scope: pass
domain: not-applicable
verdict: BLOCKED
organ: check_adjoint_prevalidation.py
organ-command: python scripts/check_adjoint_prevalidation.py --derive-verdict 19995
organ-rc: 3
[/ADJOINT PREFLIGHT]

Revue tierce c15 : ni lane d'origine po-2026:CoursIA-2, ni adoptante ai-01:CoursIA-2. Body, quinze commentaires, review Hermes et diff complet lus par delegation ; zero thread inline. Template frais regenere personnellement avant publication, identique aux surfaces de la revue. Aucune approbation ni levee de reserve tierce emise.

Scope et revue technique : deux fichiers, +181/-5, distinction base-gone/base-live-not-main et comportement generique fail-closed conserves. La revue deleguee confronte les ensembles de noms de tests des deux parents du merge : aucun test perdu ; six tests nouveaux au-dela du parent main et les tests de queue issus de main presents. Ce controle de preservation des noms ne prouve pas a lui seul les executions. baseLiveness reste hors fingerprint et dans l'identite de stabilite. Le champ domain not-applicable indique l'absence de criteres pedagogiques Lean/notebook/QC/ML sur cette PR d'outillage, pas une dispense de lecture du code.

Validation : la lane rapporte 208 passed apres le merge a cette tete ; le compte statique de 208 fonctions test sans parametrize est coherent, mais ne constitue pas une reproduction du run. Aucun test relance par l'adjoint. La review Hermes porte une ancienne tete ; la revue presente couvre le delta courant sans attribuer au bot une approbation de cette tete.

Checks : Scripts Tests (CPU) failure, run 38032310372, check-run 114155632626, runner myia-po-2024-linux-persist-4. Log relu par delegation : checkout echoue sur des chemins hors diff, collecte vide, scripts de garde absents. Les tests CI n'ont pas tourne ; aucune conclusion de tests verts n'en est tiree. PR gate failure relaie ce rouge. Classe #20174, aucun rejeu. Le dossier reste BLOCKED pour checks ; decision finale et merge reserves a ai-01.

@jsboige

jsboige commented Oct 10, 2026

Copy link
Copy Markdown
Owner Author

[ADJOINT PREFLIGHT]
schema: 1
lane: myia-po-2027:CoursIA
pr: 19995
head: 58fa731
complete: true
body: read
comments-reviewed: 16
reviews-reviewed: 1
threads-reviewed: 0
threads-unresolved: 0
surfaces-sha256: dd5b973609200866f9463dda4ebba2576d2eb45df84382b25b384fe9a6fd430d
diff-files: 2
diff-additions: 181
diff-deletions: 5
checks: latest-wins-green
b0: clear
scope: pass
domain: not-applicable
verdict: READY
organ: check_adjoint_prevalidation.py
organ-command: python scripts/check_adjoint_prevalidation.py --derive-verdict 19995
organ-rc: 0
supersedes: 16
supersedes-why: le dossier BLOCKED mesurait des etats passes (checks famille #20174 pre-guerison ou tete anterieure) ; re-mesure a la tete exacte 58fa731 par derive-verdict : READY. Ce tampon remplace le precedent sur cette tete.
[/ADJOINT PREFLIGHT]

@myia-ai-01 myia-ai-01 left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Approbation a la tete 58fa731. La pre-lecture a ete faite en git local par un sous-agent ; j'ai relu les points pivots.

  • Preuve du claim central : present — 164 passed at first head (Hermes executed them itself), 175/175 after first conflict resolution, 208 passed at final head 58fa731 after adoption merge (c.6094824584); baseLiveness kept out of surfaces fingerprint verified by Hermes against code

@myia-ai-01
myia-ai-01 merged commit 8c9a072 into main Oct 10, 2026
22 of 24 checks passed
myia-ai-01 pushed a commit that referenced this pull request Oct 10, 2026
…quis, delta +0.289 vs 2*sigma_B 0.073) (#19997)

* feat(ict,#19343): T3 Dehaene F2 -- test direct A/B/C (store etendu requis, delta +0.289 vs 2*sigma_B 0.073)

Grain: DEEP/notebook-python -- lane myia-po-2026:CoursIA-2 -- prev: MED/guard #19995

Le volet proxy de #19343 (#19345) mesurait une discrimination
inter-categories sur traces ICT-21, pas la reconnaissance self-sur-self.
Ce commit porte le volet DIRECT restant : un substrat synthetique
numpy-only ou la question F2 est directement falsifiable.

Substrat : deux agents apparies (spectre de A PARTAGE -- meme horizon de
memoire --, base propre distincte), un store etendu a cinq variables
derive de la dynamique propre de l'agent et reinjecte dans cette
dynamique, un self-model ridge par agent. Score de reconnaissance
SYMETRIQUE APPARIE (erreur croisee - erreur propre, par blocs de temps) :
difference de differences ou les biais de cadre s'annulent.

Mesure (graines {0,1,7,42}, T=8000, n_shuffles=50) :
  score_A = +0.384 +/- 0.308  (store plein)
  score_B = +0.095 +/- 0.037  (store vide -- lesion)
  score_C =  0.000            (self-model ablate -- controle)
  delta   = +0.289 >= 2*sigma_B = 0.073, 4/4 graines A > B
  verdict = F2_CONFIRMED_EXTENDED_REQUIRED

Deux faux departs de protocole sont documentes dans le carnet, tous deux
attrapes par le controle de degenerescence (C) : une premiere version
rendait C = -0.99 (confond d'amplitude) et une seconde un appariement
spectral absent. Nuance non masquee : le regime B reste significatif
(p < 0.02), donc F2 est confirme dans sa lettre, pas dans sa version
forte -- le self-model persiste hors store, plus faiblement.

Co-Authored-By: Claude Haiku 4.5 (1M context) <noreply@anthropic.com>

* Fix(nav,#19343): chainer le carnet F2 dans la famille dissociations

Le carnet ICT-Dissociation-DehaeneF2-SelfReport etait un `orphan_entry`
(aucun lien de navigation entrant) : check-notebook-nav-chain rougissait sur
la PR. Retouche markdown seule.

- ICT-Dissociation-PhatSelfReference (case 2) porte `Suivant -> F2` ;
- le carnet F2 porte sa ligne de famille (liens vers case 1 et case 2).

Aucune cellule code touchee : pas de re-execution (C.2, exception markdown).
Verifie : check_notebook_nav_chain --check = 0 NEW finding ; navlinks 404 = 0 ;
prose-counts = aucun compteur.

Co-Authored-By: Claude Haiku 4.5 (1M context) <noreply@anthropic.com>

* Fix(ict,#19343): docstring 2·sigma_B 0,074 -> 0,073 (arrondi fautif)

Réserve 1 de la revue Hermes sur #19997. Le JSON de résultats, le carnet
(cellule 15 : 2*sigma_B = 0.073) et docs/ict/dissociations-matrix.md donnent
tous 0,073 ; seule la docstring du volet direct écrivait 0,074.
Mesure : 2 x std_B = 2 x 0.03660069438742902 = 0.0732014, soit 0,073 au
troisième décimal. Aucun effet sur le verdict, mais deux valeurs concurrentes
du même seuil pré-enregistré ne doivent pas coexister.

Co-Authored-By: Claude Haiku 4.5 (1M context) <noreply@anthropic.com>

* Fix(ict,#19343): burn-in reel 20 % et exercice 1 aligne sur B2

Deux ecarts entre la prose et le code, releves par la relecture tierce :
- burn-in : le code calcule 20 % (`_regime_score`, defaut `burn_in=0.20`
  jamais surcharge par `run_abc_regimes`) alors que le carnet (cellule 11) et
  la matrice annoncaient 15 %. La prose dit desormais la valeur mesuree.
- cellule 18 decrivait l'exercice 1 a l'envers de la cellule 20/21 :
  « vider le store dans le monde mais pas pour le modele » alors que B2 garde
  le store actif dans la dynamique et retire sa lecture au predicteur. La
  consequence qui derivait de la manipulation inverse est retiree, pas
  remplacee (l'exercice pose lui-meme la question).

Markdown seul : aucune cellule code touchee, `id`/`execution_count`/`outputs`
identiques — aucune re-execution due (C.2).

Co-Authored-By: Claude Haiku 4.5 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Haiku 4.5 (1M context) <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

stale-guard-red Rouge datant d'une base anterieure au fix du garde (sweep #13321)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants