Repository navigation
Fix(gate,#19014): le refus d'une base non-main distingue base-gone et base-live-not-main - #19995
Conversation
…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>
|
No organ-duplication: no added def/class collides with another series organ API (scripts/audit/organ_api_index.yaml). Detector: |
|
G-VAR-2 light cap reached (advisory, non bloquant). |
clusterManager-Myia
left a comment
There was a problem hiding this comment.
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) :
- 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. - Acceptance 1 (motifs distingués) :
base_ref_errorrend bienbase-live-not-main:(attendre le merge) vsbase-gone:(recibler + rebaser), vocabulaire aligné surmerge_ready.base_ref_livenessde #19021 (mergé 04/10 — cette PR ferme le volet restant). Snapshot antérieur sansbaseLiveness→ message générique conservé, le refus n'est pas perdu. - Acceptance 2 (lecture REST couverte par test) :
test_pr_metadata_fails_closed_when_the_rest_row_has_no_baseexerce la ligne réelle(row.get("base") or {}).get("ref")— c'était le trou nommé par l'issue. - Fail-closed éprouvé :
ghen erreur →unreadable(jamais un état deviné), réponse non-liste →unreadable,maincourt-circuité sans appel réseau (testé). - Claim du commentaire vérifiée au code :
baseLivenessn'est PAS dans_fingerprint_payload(clés explicites — n'expire pas les stamps existants) mais EST dans_metadata_identity(bracket before/after deload_snapshot→ abort si la base bouge pendant la lecture). Exact. - 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]
Path-collision (organ #13359/#13615)Cette PR #19995 (
Le verdict terminal (#15578) signale qu'un cote de la paire est deja sur |
|
[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>
|
Conflit vs main (#19966/#17315) resolu a la tete Le dossier ADJOINT anterieur est perime par la nouvelle tete (exact-head) : re-stamp necessaire a la tete |
|
[ADJOINT PREFLIGHT] |
Rouge
|
Le rouge de cette PR est herite de la base — premiere main, tete
|
| 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.
|
[stale-guard-red] |
|
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 |
|
[ADJOINT PREFLIGHT] Jambe fautive a la source -- CAS NON-INFRA, runner sain : |
|
Le job a été rejoué à tête constante ( 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 Ce qui, à l'inverse, n'a PAS reproduit
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 ( Ce que cela dit du rouge, et de ce diffLe diff de cette PR ne porte que Ce qui reste, et par quiLe 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 |
|
[CLAIMED] lane myia-ai-01:CoursIA-2 -- adoption de cette PR (auteur paths: scripts/check_adjoint_prevalidation.py, scripts/tests/test_check_adjoint_prevalidation.py |
# Conflicts: # scripts/tests/test_check_adjoint_prevalidation.py
Adoption par
|
| 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.
Rouge
|
|
[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. |
|
[ADJOINT PREFLIGHT] |
myia-ai-01
left a comment
There was a problem hiding this comment.
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
…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>
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_readyest déjà livré par #19021).Ce que cette PR ferme
#19014 laisse deux acceptances ouvertes après #19021 :
validate_dossierrefusait toute base non-mainavec 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.(row.get("base") or {}).get("ref")de_pr_metadatan'était vérifiée que par lecture.Le correctif
_base_liveness(base_ref_name)— nouveau lecteur, même vocabulaire quemerge_ready.base_ref_liveness(une seule sémantique, deux lecteurs) :mainmain(court-circuit : aucun appelgh)None/"")unreadable— fail-closed : le gate ne nomme pas un état qu'il n'a pas lugh/ réponse non-listeunreadablelivegone_pr_metadatalitbaseune fois et pose deux champs :baseRefName(inchangé) etbaseLiveness. Le champ n'entre pas danssurfaces-sha256—_fingerprint_payloadhache 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 passelive -> gonependant 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;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:livevérifié avec l'argumenthead:<branche>réellement passé ;gonesur MERGED / CLOSED / liste vide ;maincourt-circuite (aucun appel) ; base absente,ghen erreur et réponse non-liste rendentunreadable._pr_metadatasur une ligne REST :baseRefNameetheadRefOidlus,baseLivenessrendu — y compris quandbaseest absent (fail-closed, acceptance 2).validate_dossier:base-live-not-main:etbase-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
python -m pytest scripts/tests/test_check_adjoint_prevalidation.py -q→ 164 passed.pytest scripts/tests/complet (paquet) : couvert avant push.rc=0,NO-DOSSIER, comportement inchangé sur une basemain(aucun appelghsupplémentaire)._base_livenessexercé en direct : branche d'une PR OPEN →live;None→unreadable;main→main.Périmètre
Deux fichiers :
scripts/check_adjoint_prevalidation.py(+75/−5) etscripts/tests/test_check_adjoint_prevalidation.py(+106). Aucun workflow, aucun notebook.scripts/coordination/merge_ready.pyn'est pas touché (PR #19921 ouverte sur ce fichier, lanemyia-ai-01:CoursIA-2).🤖 Generated with Claude Code