Skip to content

Fix(ci,#12856): absorber les 9 gardes du lot PILOTE dans la fast lane - #20166

Merged
myia-ai-01 merged 4 commits into
mainfrom
feature/12856-fastlane-absorb
Oct 10, 2026
Merged

myia-ai-01 merged 4 commits into
mainfrom
feature/12856-fastlane-absorb

Conversation

@jsboige

@jsboige jsboige commented Oct 9, 2026 •

Copy link
Copy Markdown
Owner

Grain: MED/guard — lane myia-ai-01:CoursIA-2 — prev: MED/guard #20080

Programme #12567 (absorption des gardes unitaires dans la voie rapide), étape 3 de #12856 : le lot PILOTE des 9 gardes absorbés.

Option retenue : B (libellé canonique)

La collision de fichier avec #20076 ayant été levée, le coordinateur a tranché B : les 9 gardes reprennent le nom de check-run canonique — celui que leur workflow rendait sur main, et que les 24 autres gardes absorbés portent déjà — au lieu du slug court de l'option A. A aurait créé le premier garde absorbé-à-workflow en slug court ; B rend l'identité byte-identique à la source, sans liste d'exemption.

garde nom canonique (option B)
banner-guard probeAddresses banner guard (main-repo notebooks)
bare-cross-dir-load-gate No bare cross-dir #load in changed notebooks
markdown-rendering-guard markdown-rendering guard (main-repo notebooks)
notebook-interp-positioning check_interp_positioning.py
notebook-nav-chain-guard check-nav-chain
notebook-navlink-check check-navlinks
pip-leak-guard !pip install HIGH delta guard (#6314)
prose-counts-guard prose-counts
readme-ipynb-links-guard Audit README -> .ipynb links

Changements

  1. 9 job.name de workflow revient à sa valeur main. Pour notebook-nav-chain-guard, notebook-navlink-check et prose-counts-guard, le job.name n'existait pas sur main : il est retiré, et le nom rendu redevient la clé du job (c'est exactement ce que le contrat d'identité attend : job.name si déclaré, sinon la clé).
  2. 9 guard.name du registre → libellé canonique ci-dessus.
  3. scripts/tests/test_fast_lane.py aligné (frozenset PILOT_ABSORBED_LOT_12856 + assertions by_name).
  4. scripts/ci/fast_lane.py — correctif requis par B (ci-dessous).

Correctif requis par B : nom du fichier temporaire

fast_lane.py écrivait son temporaire sous le nom de check du garde. Le nom canonique Audit README -> .ipynb links porte un > refusé par le système de fichiers Windows (OSError: [Errno 22] Invalid argument) — mesuré sur la validation locale, 2 tests rouges. Aucun des 24 précédents n'a de caractère illégal : B introduit le premier. Le nom de fichier est désormais dérivé par tmp_id() ; le nom de check reste la clé du dictionnaire. Sans ce correctif, B ne peut pas être validée sur Windows (la CI Scripts Tests tourne sur coursia-linux et ne verrait pas ce chemin).

Compte runs/push sur une PR carnet

Mesure (parse des on.pull_request.paths des 85 workflows, main vs tête) :

workflows pull_request dont déclenchés sur un carnet
main 85 44
tête #20166 76 35

9 workflows de moins allument un run sur une PR carnet — exactement les 9 du lot PILOTE (leur déclencheur pull_request est retiré ; les gardes s'exécutent dans la voie rapide).

Validations

  • Organe d'identité : python scripts/ci/check_absorbed_check_run_identity.py --check → rc=0, « 28 gardes absorbés byte-identiques à leur source » (les 9 PILOTE désormais vérifiés).
  • scripts/tests/test_fast_lane.py : 83 passed.
  • Tests liés : test_pick_idle_grain 209 · test_pr_gate 148 · test_detector_gate_errexit_safety 12 · test_check_absorbed_check_run_identity 16 — tous verts.

Périmètre

Registre + workflows (une PR unique), plus le correctif fast_lane.py requis par B. Touche .github/ → hors exception merge_ready, merge au coordinateur.

🤖 Generated with Claude Code

@github-actions

github-actions Bot commented Oct 9, 2026 •

Copy link
Copy Markdown
Contributor

Path-collision (organ #13359/#13615)

Cette PR #20166 (Fix(ci,#12856): absorber les 9 gardes du lot PILOTE dans la fast lane) 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

github-actions Bot commented Oct 9, 2026

Copy link
Copy Markdown
Contributor

G-VAR-2 light cap reached (advisory, non bloquant).
La lane myia-ai-01:CoursIA-2 a deja consomme son budget LIGHT du jour (axe genre G-VAR-2/3 (light-genre, quel que soit le tier declare) : #19979 (MED/guard, merge a 2026-10-09T06:43:29Z), #20080 (MED/guard, merge a 2026-10-09T15:40:31Z), #20048 (MED/guard, merge a 2026-10-09T21:50:25Z)).
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.

@github-actions github-actions Bot added the variation-tier-inflation declared LIGHT << effective LIGHT-genre (#10020, advisory) label 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-ai-01:CoursIA-2` voit ces signaux actifs sur les mergees du jour (UTC 2026-10-09) :

  • TIER-INFLATION : declared LIGHT << effective LIGHT-genre (tally : declared=0 genre=3 cap=3)

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.

@github-actions github-actions Bot added the variation-adjacency-deep-med Adjacence DEEP/MED hors LIGHT : §2 l'autorise si substance distincte (coordinateur) label Oct 9, 2026
@github-actions

github-actions Bot commented Oct 9, 2026

Copy link
Copy Markdown
Contributor

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-ai-01: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 [G-VAR-3 OVERRIDE] lane myia-ai-01:CoursIA-2 -- next: <genre> (section 3), il ne laisse pas vieillir. (predecesseur reel: #20048, sequence mergee)

Referentiel du verdict (#15739) -- ce verdict a ete calcule contre : predecesseur #20048 (guard, source merged-sequence), sequence de merges arretee au 2026-10-09T21:51:29Z. Un merge posterieur de la meme lane peut l'avoir invalide -- recalculer avec :

python scripts/ci/variation_adjacency_guard.py --pr-number 20166

variation-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 prev: par un grain precedent d'un genre different (ou changez le genre du grain courant pour un genre de substance differente) :

Grain: <TIER>/<genre> -- lane <machine:workspace> -- prev: <TIER>/<genre-different> #<PR>

@github-actions

github-actions Bot commented Oct 9, 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).

jsboige and others added 3 commits October 10, 2026 01:27
Etape 3 du programme #12567 (volet 2 de #11835) : mise en sommeil du lot
PILOTE des gardes notebook au profit du moteur fast-lane, sur le pattern
TRANCHE1 documente dans fast-lane-shadow.yml.

Par garde (9) : (a) le job du workflow source rend desormais le slug
canonique du registre (name: byte-identique au guard.name), (b) le
declencheur pull_request est retire. Les quatre workflows dont
pull_request etait l'unique trigger (prose-counts-guard,
notebook-navlink-check, notebook-nav-chain-guard,
notebook-interp-positioning) restent valides et manuellement jouables via
un workflow_dispatch nu. Les blocs concurrency: en ternaire
pull_request restent inchanges (expressions valides).

Registre : les neuf gardes passent a absorbed=True et perdent leur
shadow_reason PILOT_SHADOW_WORKFLOW_ENCORE_ACTIF (la constante reste
definie pour les non-absorbes). La fast lane reprend l'emission des noms
canoniques avec conclusions reelles.

Deux contreparties rendues obligatoires par le geste :
- check_absorbed_check_run_identity.py : l'exemption du lot PILOT ne
  couvre plus que les gardes NON absorbees -- les neuf renames sont
  desormais EXIGES byte-identiques par le filet (28 absorbes verifies,
  3 exemptions PILOT restantes : solution-leak-guard,
  perimeter-review-guard, self-hosted-runner-policy).
- test_fast_lane.py : le lot absorbe est epingle (PILOT_ABSORBED_LOT_12856)
  et le couplage absorbe-sans-pull_request passe au parcours dynamique
  de tout garde absorbe (exemption TRANCHE_ALIGNMENT_EN_COURS, meme
  principe que le checker d'identite).

Verifications : YAML OK sur 160 workflows ; identity rc=0 (28/3) ;
unique-check-run-names rc=0 ; pytest test_fast_lane.py 83 passed ;
pytest test_check_absorbed_check_run_identity.py 16 passed ;
check_concurrency_conj rc=0 ; check_self_hosted_runner_policy rc=0 ;
check_workflow_label_paths rc=0 ; detect_python_nu_jobs : 12 defauts
preexistants (#17444), identiques sur HEAD.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
…ardes)

Suite de 061eb90. Verification du commit de l'agent : le retrait des
declencheurs `pull_request` n'etait pas neutre pour deux des neuf gardes.
Les `paths` du registre ne couvraient pas tous les motifs du declencheur
retire, et un garde absorbe n'est selectionne QUE par ces `paths` -- la
voie rapide REMPLACE le workflow, elle ne s'y ajoute pas.

Methode : pour chacun des neuf, comparaison des `paths` du declencheur
retire (lus sur origin/main) aux `paths` du registre, puis verification
qu'aucun motif perdu n'est rattrape par un declencheur `push` residuel.

- pip-leak-guard : le registre ne portait que `**/*.ipynb`. Trois motifs
  du declencheur retire etaient perdus, et ce workflow n'a AUCUN
  declencheur `push` -- donc une PR ne touchant que le detecteur
  n'allumait plus le garde du tout. Les trois motifs sont ajoutes.
- readme-ipynb-links-guard : trois motifs perdus (fixeur + deux tests),
  un seul rattrape par le `push` residuel. Ajoutes pour la parite.
- Les ecarts restants sont des differences de dialecte de glob
  (`**.ipynb` vs `**/*.ipynb`, que le matcher de fast_lane.py:74
  neutralise lui-meme) ou un registre PLUS LARGE que le declencheur
  (`**/*.ipynb` couvre `MyIA.AI.Notebooks/**/*.ipynb`) -- aucune perte.

L'invariant est desormais ecrit dans le registre : retirer un declencheur
exige que les `paths` du registre COUVRENT les siens.

Nettoyage : PILOT_SHADOW_WORKFLOW_ENCORE_ACTIF devient du code mort une
fois les neuf absorbes (plus aucun garde ne l'utilise) -- supprime, et
les deux commentaires qui decrivaient l'ancien etat remis a jour.

Verifications sur ce commit : parite de couverture OK sur les neuf ;
identity rc=0 (28 verifies / 3 exemptions PILOT) ; pytest test_fast_lane.py
83 passed ; test_audit_workflow_path_filters + test_check_absorbed_check_run_identity
+ test_check_unique_check_run_names + test_fast_lane_merge_base +
test_workflow_* 77 passed ; check_unique_check_run_names rc=0 ;
check_concurrency_conj rc=0 ; check_self_hosted_runner_policy rc=0.

Co-Authored-By: Claude-Code <noreply@anthropic.com>
#18911 sur main

Le rebase sur origin/main fait entrer la reecriture #18911 du garde
readme-ipynb-links-guard dans le perimetre du declencheur pull_request
retire : test_readme_link_violations.py et test_regen_quarto_render.py
n'etaient pas couverts par le registre fast-lane. Parite retablie (12/12).

83/83 tests fast-lane verts.

Co-Authored-By: Claude Haiku 4.5 (1M context) <noreply@anthropic.com>
@jsboige
jsboige force-pushed the feature/12856-fastlane-absorb branch from 9efb27e to 8227759 Compare October 9, 2026 23:29

@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.

[NanoClaw] review structurelle — 12 fichiers (+150/−114), protocole structural : liste des fichiers, lecture ciblée des 2 fichiers porteurs au head 8227759b8f (fast_lane_registry.py régions modifiées, check_absorbed_check_run_identity.py intégral de la zone changée) + spot-check de 3 workflows sources. Pas de python au siège : exécutions du body non rejouées, review statique déclarée.

VERDICT: LGTM (vérifié: bascule PILOT→absorbé, parité de couverture, flip du filet d'identité)

Vérifié au head

  • Le flip du filet est réel et exact : check_absorbed_check_run_identity.py:100 — if id(guard) in pilot_set and not guard.absorbed: continue. Les gardes PILOT absorbés sortent de l'exemption et deviennent exigés byte-identiques ; la docstring le documente comme le changement de garantie (« l'exempter laisserait le rename non vérifié »). La promesse « déclarée → vérifiée » est dans le code, pas seulement dans le body.
  • Parité de couverture, le point qui tue ce genre de migration : le registre porte bien les motifs récupérés. pip-leak-guard : les 3 motifs non-ipynb (workflow lui-même, audit_pip_install_cells.py, pip_leak_delta.py) sont dans paths, avec le commentaire d'invariant (« sans eux… la couverture serait perdue et non déplacée ») — et le cas est le pire de la série : ce workflow n'a aucun déclencheur push résiduel (vérifié : on: = workflow_dispatch seul). readme-ipynb-links-guard : les 5 motifs du déclencheur retiré sont au registre, avec provenance honnête des 2 tests supplémentaires entrés par le rebase #18911 — le registre est un sur-ensemble du déclencheur retiré, l'invariant tient.
  • Spot-check workflows (3/9) : banner-guard et readme-ipynb-links-guard = push (+workflow_dispatch pour le premier), pip-leak-guard = workflow_dispatch seul ; pull_request absent des trois ; name: pip-leak-guard byte-identique au slug du registre (jobs.pip-leak-delta.name). Cohérent avec la table du body.
  • Commentaire-migration codifié au-dessus du lot PILOT : « retirer le déclencheur ne suffit pas, il faut que les paths du registre COUVRENT ceux du déclencheur retiré » — c'est la leçon c.360 écrite à l'endroit où le prochain migrateur la lira. Bon geste durable (et l'organe #20181 en vérifie mécaniquement la classe).

Notes (non bloquantes)

  • Table du body : banner-guard « déclencheur résiduel push » — il porte aussi workflow_dispatch. Sur-ensemble inoffensif, la validité du bloc on: tient.
  • Le body dit « trois motifs perdus » pour readme ; le registre en ajoute cinq — l'écart est expliqué in-code (rebase #18911 postérieur à la rédaction initiale). Aucune perte dans un sens comme dans l'autre.
  • La section « Ce qui n'est pas mesuré » (émission vivante des check-runs, protection de branche) est exactement le bon cadrage épistémique : c'est pourquoi je reste en COMMENT — mon LGTM porte sur le câblage statique, la preuve d'émission vivante viendra des PR suivantes, pas de ma review.

— review structurelle (budget diff : 2 fichiers porteurs + 3 workflows, ~15 KB au contexte).

Rework de #20166 vers l'option B tranchee par le coordinateur : les 9
gardes du lot PILOTE reprennent le NOM DE CHECK-RUN canonique -- celui
que leur workflow rendait sur main, et que les 24 autres gardes absorbes
portent deja -- au lieu du slug court de l'option A.

- 9 `job.name` de workflow revient a sa valeur main (retrait pour les 3
  qui n'en avaient pas : le nom rendu est alors la cle du job).
- 9 `guard.name` du registre passe au libelle long correspondant.
- `scripts/tests/test_fast_lane.py` aligne (frozenset PILOT_ABSORBED_LOT
  + assertions `by_name`).

Correctif requis par B, decouvert en validation locale : `fast_lane.py`
ecrivait son temporaire sous le nom de check du garde. `Audit README ->
.ipynb links` porte un `>`, refuse par le systeme de fichiers Windows
(OSError Errno 22) ; aucun des 24 precedents n'avait de caractere
illegal, B introduit le premier. Le nom de fichier est desormais derive
par `tmp_id()` -- le nom de check reste la cle du dictionnaire.

Verdicts : organe d'identite rc=0 (28 gardes absorbes byte-identiques) ;
83/83 test_fast_lane ; 209 + 148 + 12 + 16 tests lies verts.

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

Copy link
Copy Markdown
Contributor

Grain tag obligatoire (#10045, bloquant).

unknown.

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

Copy link
Copy Markdown
Contributor

<mot-clé fermant> #N où N est une PR -- bloquant (#10101).

unknown

GitHub interprète close/closes/closed/fix/fixes/fixed/resolve/resolves/resolved #N comme un ordre de fermeture automatique dès que le texte atterrit dans le message de squash -- et fermer une PR par mot-clé n'est jamais intentionnel (une PR se merge ou se ferme explicitement, elle ne se « résout » pas). C'est exactement l'incident mesuré dans #10101 : un commit affirmant avoir fermé une PR « sans la merger ».

Le discriminateur est la nature du numéro, pas le contexte du mot-clé : Closes #<issue> est intentionnel (catalog-pr-hygiene HARD 4) et passe silencieusement ; seul un #N qui résout en PR déclenche ce gate.

Pour passer ce gate :

  • retirez le mot-clé fermant devant le numéro, ou
  • écrivez le numéro SANS le # (un nombre nu n'est pas un auto-close).

@github-actions github-actions Bot removed the variation-adjacency-deep-med Adjacence DEEP/MED hors LIGHT : §2 l'autorise si substance distincte (coordinateur) label Oct 10, 2026
@github-actions

Copy link
Copy Markdown
Contributor

G-VAR-3 : deux grains LIGHT du meme genre consecutifs -- bloquant (#11170).

unknown

Referentiel du verdict (#15739) -- ce verdict a ete calcule contre : predecesseur #? (?, source ?), sequence de merges arretee au n/a. Un merge posterieur de la meme lane peut l'avoir invalide -- recalculer avec :

python scripts/ci/variation_adjacency_guard.py --pr-number 20166

variation-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 prev: par un grain precedent d'un genre different (ou changez le genre du grain courant pour un genre de substance differente) :

Grain: <TIER>/<genre> -- lane <machine:workspace> -- prev: <TIER>/<genre-different> #<PR>

@github-actions

Copy link
Copy Markdown
Contributor

Collision de lane sur une reference fermante (#10223).

unknown

Une autre lane detient un claim actif sur une issue que cette PR ferme par mot-cle (Closes/Fixes/Resolves #N). Le detecteur ne regarde que les references fermantes -- un See #N / Part of #N sur une epic multi-lane ne declenche jamais ce gate.

Les trois sorties pour passer ce gate :

Voir #10223 et lane-claim-protocol.md.

@github-actions

Copy link
Copy Markdown
Contributor

Artefact de resultats au-dela de la barre de 512 Ko -- bloquant (#15890).

unknown

Pour passer ce gate :

  • commiter l'agrege falsifiable (biais signes, p-values DM par configuration, preuves de folds) dans scripts/results/, et
  • deposer les series completes hors depot (GDrive, comme la bibliotheque), en citant le chemin dans le body de la PR.

Politique complete : .claude/rules/results-artifact-policy.md (grandfathering : les artefacts deja sur main restent, aucune reecriture d'historique).

@github-actions github-actions Bot added variation-light-cap-reached Lane ayant deja merge une LIGHT aujourd'hui (cap G-VAR-2 atteint) and 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) labels Oct 10, 2026
myia-ai-01 pushed a commit that referenced this pull request Oct 10, 2026
…nt le declencheur retire (#20181)

* Feat(ci,#12856): absorbed-path-parity -- les paths du registre couvrent le declencheur retire

Un garde absorbe n'est plus selectionne que par les `paths` du registre :
la voie rapide remplace le workflow, elle ne s'y ajoute pas. Retirer un
declencheur pull_request sans reprendre ses motifs eteint le garde en
silence sur ces chemins (#20166 a repare deux gardes deja touchees).

L'organe compare chaque garde absorbed=True au declencheur encore present
sur la branche de base, accepte la couverture par un declencheur residuel,
et echoue fail-closed sur tout motif non prouve couvert.

Controles : positif PARITY_OK sur la branche #20166 ; negatif PARITY_BROKEN
avec exactement les 3 motifs perdus sur l'etat simule pre-fix.

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

* Fix(ci,#20181): câbler l'organe de parité + fail-closed sur source illisible

Review NanoClaw : trois points leves en code.

1. CONCERNE 1 (bloquante) : l'organe n'etait cable nulle part --
   findings() ne s'executait dans aucun chemin CI. Etape bloquante
   `absorbed-path-parity` ajoutee au job scripts-tests (if: always()) ;
   les paths du workflow couvrent deja scripts/** et
   .github/workflows/**, le garde s'allume donc sur toute PR touchant
   le registre ou retirant un declencheur.
2. CONCERNE 2 : ecart au fail-closed annonce -- un workflow de base
   illisible ou non parsable partait en skipped silencieux. C'est
   desormais un finding (couverture non prouvee).
3. Cosmetique : branche morte `or cand_norm == norm` retiree de
   covered_by (egalite deja retournee au-dessus).

Tests : 10/10 (8 + 2 nouveaux fail-closed). Organe : PARITY_OK
(1 garde verifie, 19 ecartes deja consolides).

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

---------

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

jsboige commented Oct 10, 2026

Copy link
Copy Markdown
Owner Author

[ADJOINT PREFLIGHT]
schema: 1
lane: myia-po-2025:CoursIA-2
pr: 20166
head: c0e42ab
complete: true
body: read
comments-reviewed: 10
reviews-reviewed: 1
threads-reviewed: 0
threads-unresolved: 0
surfaces-sha256: e7fe4a121633b98550c3ce815552d0ba9053bcced6d0abf26842d0077699cfeb
diff-files: 13
diff-additions: 186
diff-deletions: 132
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 20166
organ-rc: 0
[/ADJOINT PREFLIGHT]

READY — les quatre surfaces du contrat tiennent a la tete du dossier.

  • checks : latest-wins-green — pliage dernier started_at par nom sur commits/<head>/check-runs ; l'organe ne releve aucune jambe rouge residente (--derive-verdict rc=0).
  • b0 : clear — check_unaddressed_nits.py 20166 rc=0 ; aucune reserve postee, aucun thread inline non resolu.
  • scope : pass — 13 fichiers — les 9 workflows du lot PILOTE absorbes par la fast lane, plus scripts/ci/fast_lane.py, scripts/ci/fast_lane_registry.py et scripts/tests/test_fast_lane.py ; le garde d'identite check_absorbed_check_run_identity.py est ajoute. Conforme au titre (CI voie lente : regrouper les runs lourds sur schedule (volet 2 de #11835) -- 60 checks pour une PR de 8 fichiers, file a 2643 #12856), catalogue non touche.
  • domain : not-applicable — aucun *.lean modifie : aucun gate de preuve n'est declenche.

Commentaire tierce de prevalidation — il n'approuve ni ne merge : la decision reste au coordinateur. Lane emettrice : myia-po-2023:CoursIA (file c2142).

@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.

Disposition a la tete exacte (ai-01, PR de CI). Delta depuis la review NanoClaw @8227759b8f : un commit, l'option B que j'avais tranchee. Les 9 gardes du lot PILOTE reprennent leur nom de check-run canonique. fast_lane.py derive maintenant le nom du fichier temporaire par tmp_id(), puisque le > de Audit README -> .ipynb links est refuse par Windows ; la cle du dictionnaire reste le nom du garde. Rejoue dans un worktree detache a cette tete : test_fast_lane.py et test_check_absorbed_check_run_identity.py donnent 99 passed. L'organe d'identite (--check) rend rc=0, avec 28 gardes absorbes byte-identiques. Les notes non bloquantes de NanoClaw sont cadrees dans le body. Dossier tiers : READY.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

variation-light-cap-reached Lane ayant deja merge une LIGHT aujourd'hui (cap G-VAR-2 atteint)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants