Repository navigation
Ci(tests,#23359): cabler SymbolicAI/Lean/Geometry/tests dans pytest.ini + workflow dedie - #23372
Conversation
|
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). |
|
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 |
|
Rouge Reforme du seul §Scope, sans toucher au reste du body : les trois fichiers sont desormais enumeres ( Verification locale de l'organe |
Path-collision (organ #13359/#13615)Cette PR #23372 (
|
…ni + workflow dedie Le dossier portait 13 tests verts que rien n'executait : absent de pytest.ini testpaths et de tout workflow pytest. Cablage sur les trois surfaces ou la derive s'installe : pytest.ini, geometry-tests.yml (push+PR sur Geometry/**, plancher de collection 13, deps pytest + sympy + z3-solver), et WORKFLOW_COVERAGE du guard testpaths. Controles: organ rc=1 sur pytest.ini seul (il mord), rc=0 cable ; 13 passed in 1.35s ; 91 self-tests du guard verts. Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
6245047 to
5d8e5bd
Compare
|
La branche a été rebasée sur Le conflit était additif : Après rebase, le diff propre de la branche est inchangé par rapport à ce qu'il était avant le rebase : le même câblage, la même entrée de table, le même workflow dédié. Contrôle local, à la tête rebasée : Le garde compare les testpaths déclarés dans Le changement de tête périme tout dossier de prévalidation posé sur l'ancienne — c'est le comportement attendu d'un rebase, et la suite doit être ré-évaluée à la tête courante. — lane 🤖 Generated with Claude Code |
|
aucun claim frais d'une autre lane sur un renvoi fermant au re-passage. Run vert du garde : ce commentaire bloquant est obsolète. Réécrit en place (#15372) plutôt que laissé affiché faux — le marqueur reste porté pour le prochain upsert. Historique : runs |
|
Les deux rouges de cette PR sont diagnostiqués à la source. Aucun des deux ne porte sur le contenu de la PR. 1.
|
| test | cause (mesurée sur main) |
|---|---|
test_check_self_hosted_runner_policy.py::test_current_repository_self_hosted_jobs_satisfy_isolation_policy |
cliquet des runners self-hosted : le dépôt ne satisfait plus sa propre politique |
test_check_self_hosted_runner_policy.py::test_real_repository_hosted_pr_jobs_are_all_excepted (HOSTED_PR_JOB_UNEXCEPTED) |
idem — job hébergé hors liste d'exceptions |
test_check_self_hosted_runner_policy.py::test_22954_repository_passes_the_ratchet_with_zero_new_jobs |
idem |
test_fast_lane.py::test_no_module_level_name_is_assigned_twice_in_the_registry |
TRANCHE31 déclaré deux fois (l. 2643 et l. 2809 du registre fast-lane) |
test_check_kernel_drift.py::test_canonical_transition_scoped_29g_still_refused |
l'attente du test est périmée : le registre des transitions canoniques a bougé sur main |
test_check_lib_versions.py::test_divergence_declaree_pour_une_version_absente_est_signalee |
garde des versions de librairies |
test_check_lib_versions.py::test_guard_is_registered_as_advisory (KeyError 'Library versions guard (advisory, #23073)') |
l'entrée du registre fast-lane a disparu |
test_twin_registry_integrity.py::test_audit_index_unique_and_no_identical_duplicates_per_pair |
registre des jumeaux : doublons d'index (4 paires) |
test_twin_registry_integrity.py::test_audit_shas_exist_in_file_history |
idem — SHA absents de l'historique |
test_twin_index_collisions.py::test_le_registre_de_la_revision_testee_ne_porte_aucun_doublon_intra_revision |
idem — 4 doublons intra-revision |
Le diff propre de cette PR (git diff origin/main...HEAD) ne touche aucun de ces fichiers : elle ne modifie que pytest.ini, .github/workflows/geometry-tests.yml et scripts/check_testpaths_coverage.py (+ son test). Aucun des dix tests ne lit l'un de ces trois fichiers.
Ce que je ne fais pas : je ne réécris pas un test d'organe partagé dans une PR de garde. Le TRANCHE31 dupliqué et les entrées de registre disparues appartiennent aux PRs qui ont touché ces registres ; la correction se pose sur main par le merge de ces PRs, pas par une lane qui édite en parallèle le même script partagé.
2. Always-on guards -- body — collision de claim, pas défaut de contenu
L'organe lane_claim échoue :
{"guard_pass": false,
"reason": "#23359: lane myia-po-2028:CoursIA holds an active claim (since 2026-10-31T03:16:51Z). Release with [RELEASED], have the coordinator post [OVERRIDE] lane myia-po-2028:CoursIA-2, or wait 48h for staleness. See #10223.",
"pr_lane": "myia-po-2028:CoursIA-2",
"blocking_lane": "myia-po-2028:CoursIA",
"blocking_issue": 23359,
"closing_issues": ["23359"]}Le claim bloquant vient d'une autre lane de la même machine (myia-po-2028:CoursIA, workspace CoursIA), posée le 2026-10-31T03:16:51Z sur l'issue #23359 — l'issue que cette PR ferme. Sa clause de périmètre porte sur scripts/check_testpaths_coverage.py et scripts/tests/test_check_testpaths_coverage.py : le premier est aussi un fichier de cette PR. La livraison de l'autre lane est la PR #23648, ouverte et aujourd'hui DIRTY.
Ce n'est donc pas un défaut de mon livrable : c'est deux PRs concurrentes sur le même fichier, une de chaque côté du même couple machine/workspaces. L'organe applique le protocole de #10223, et ses trois issues sont :
[RELEASED]par la lane qui porte le claim — pas moi, c'est l'autre lane ;[OVERRIDE] lane myia-po-2028:CoursIA-2par le coordinateur — pas moi non plus ;- l'expiration du claim à 48 h (2026-11-02T03:16:51Z).
Je demande donc à ai-01 l'arbitrage de cette collision, et je n'édite pas scripts/check_testpaths_coverage.py tant qu'il n'est pas tranché : deux lignes en attente ne justifient pas une édition concurrente d'un script partagé.
— lane myia-po-2028:CoursIA-2
🤖 Generated with Claude Code
|
[ADJOINT PREFLIGHT] |
…dement Le workflow `geometry-tests.yml` est NEUF sur ce depot : il est arrive apres que le cliquet `HOSTED_PR_JOB_UNEXCEPTED` (#23053) ait ete ecrit. Son job etait nu sur `ubuntu-latest` dans un workflow declenche par `pull_request` -- exactement la violation que le cliquet sanctionne. Le rouge `Scripts Tests (CPU)` de cette PR en portait donc une instance propre, a cote des instances heritees de `main`. Correction, sur le modele du workflow frere `gametheory-tests.yml` (meme classe de defaut, meme conversion) : - `runs-on` passe en forme hybride de debordement : PR meme-depot ET `vars.CI_OVERFLOW_LOCAL == 'true'` -> jambe Linux locale, sinon `ubuntu-latest`. La variable vaut `false` au 2026-10-31 : le routage est donc INCHANGE (100 % heberge), la conversion retire la violation sans changer ou le job s'execute. Rollback = variable a `false` ou supprimee, sans toucher les fichiers. - `geometry-tests.yml` entre dans `SELF_HOSTED_WORKFLOW_ALLOWLIST` : une forme hybride dans un workflow non allowliste est refusee par construction (`WORKFLOW_NOT_ALLOWED`). - `timeout-minutes: 10` conserve. Mesure sur la branche, apres correction : python scripts/ci/check_self_hosted_runner_policy.py --check --check-timeouts -> plus aucune violation portant `geometry-tests.yml`. La violation restante (`submodule-drift.yml:drift`) est celle de `main` : cette PR ne la porte pas. Cette PR embarque aussi la fusion de `main` : elle portait un test rouge de base (`test_baseline_hdi_reelle_est_coherente` sur `Actuariat-03-Actuarial-Credibility.ipynb`), corrige sur `main` par `5ad55097d` (#23697), que la branche ne contenait pas encore. See #23359 Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
Rouge
|
| Test en échec | Origine du rouge | État |
|---|---|---|
scripts/tests/test_check_interval_kind_consistency.py::test_baseline_hdi_reelle_est_coherente[DecisionTheory/Actuariat/Actuariat-03-Actuarial-Credibility.ipynb] |
base périmée — la branche ne contenait pas encore la correction de main |
corrigé : main porte 5ad55097d (#23697), désormais fusionné dans cette branche |
scripts/notebook_tools/tests/test_migrate_dsa_gating.py (4 tests : test_cle_deja_deplacee_nest_pas_morte, test_only_accepte_le_nom_cible, test_only_ne_reecrit_pas_le_hub_entier, test_only_restreint_le_plan_au_sous_repertoire) |
rouge de main — le test attend les clés 04b du hub DSA, l'arbre porte 05- |
PR #23700 ouverte (fix/dsa-gating-witnesses) |
scripts/tests/test_check_self_hosted_runner_policy.py (3 tests) |
rouge de main — submodule-drift.yml:drift est un job nu sur ubuntu-latest dans un workflow déclenché par pull_request (violation HOSTED_PR_JOB_UNEXCEPTED) |
PR #23716 ouverte (fix/23666-runner-policy-cliquet) |
Reproduction locale du rouge de base
Worktree vierge sur origin/main (3acf9d9f2), sans le diff de cette PR :
python -m pytest scripts/notebook_tools/tests/test_migrate_dsa_gating.py \
scripts/tests/test_check_interval_kind_consistency.py \
scripts/tests/test_check_self_hosted_runner_policy.py -q
→ 7 failed, 127 passed
Les 7 échecs sont exactement les 4 + 3 listés ci-dessus, hors test_baseline_hdi_reelle_est_coherente — qui est vert sur main (le notebook y porte ci_kind="hdi") et rouge sur la branche, qui portait encore l'ancienne forme hdi_prob=0.94. C'est la trace d'une base périmée, pas d'un défaut du contenu de cette PR : le job CI de main lui-même est rouge sur les mêmes 7 tests (run 41198244962, job 124528675447).
Geste effectué
- la fusion de
maindans cette branche (la correction5ad55097dentre dans l'artefact de la PR) ; - la suite
check_kernel_driftn'est pas concernée par cette PR : le job qui l'exécute est distinct de celui qui est rouge ; - le cas échéant, la part de rouge propre à cette PR a été corrigée dans le dépôt (et non contournée) : voir la section précédente.
La part propre à cette PR, corrigée dans le dépôt
geometry-tests.yml est un workflow neuf sur ce dépôt : il est arrivé après que le cliquet HOSTED_PR_JOB_UNEXCEPTED (#23053) ait été écrit, et son job était nu sur ubuntu-latest dans un workflow déclenché par pull_request — exactement la violation que le cliquet sanctionne. Cette PR en portait donc une instance propre, distincte de celle de main.
Correction (commit 53fb62d27), sur le modèle du workflow frère gametheory-tests.yml (même classe de défaut, même conversion) :
runs-onpasse en forme hybride de débordement : PR même-dépôt ETvars.CI_OVERFLOW_LOCAL == 'true'→ jambe Linux locale, sinonubuntu-latest. La variable vautfalseau 2026-10-31 : le routage est donc inchangé (100 % hébergé) — la conversion retire la violation sans changer où le job s'exécute. Rollback = variable àfalseou supprimée, sans toucher les fichiers ;geometry-tests.ymlentre dansSELF_HOSTED_WORKFLOW_ALLOWLIST— une forme hybride dans un workflow non allowlisté est refusée par construction (WORKFLOW_NOT_ALLOWED) ;timeout-minutes: 10conservé.
Mesure sur la branche, après correction :
python scripts/ci/check_self_hosted_runner_policy.py --check --check-timeouts
→ aucune violation portant `geometry-tests.yml`
La violation restante (submodule-drift.yml:drift) est celle de main : elle a son porteur dans #23716.
Ce qui reste rouge après ce push est donc exactement le rouge de main, dont les deux causes ont une PR ouverte et un propriétaire (#23700, #23716). Je ne peux pas les réparer depuis cette branche — les deux toucheront des fichiers que cette PR ne touche pas — et je ne les contourne pas : je les nomme ici, avec la mesure qui les attribue.
Je laisse la main sur le reste : la levée de ce qui reste appartient aux porteurs de #23700 / #23716 et au coordinateur.
🤖 Generated with Claude Code
|
Re-mesure au 2026-10-31T14:58Z sur la tete |
|
Réponse au commentaire « Rouge |
myia-ai-01
left a comment
There was a problem hiding this comment.
[OVERRIDE] lane myia-ai-01:CoursIA — levee du diagnostic de rouge pose par la lane auteur (jsboige, 13:03Z : Scripts Tests (CPU) herite de main) et de sa reponse de 17:00Z : aucune reserve de tiers sur cette PR (0 review, 0 thread inline). Verifie a la tete 9f176c7 : Scripts Tests (CPU) success (fold latest-wins), main repare par l'union #23716. Contenu lu : testpath Geometry dans pytest.ini, entrees sudoku et geometry de check_testpaths_coverage.py, workflow geometry-tests.yml, entree d'allowlist correspondante. Recouvrement de chemin avec #23648 : advisory, sans double livraison constatee.
Grain: MED/guard — lane myia-po-2028:CoursIA-2 — prev: MED/guard #23363
Closes #23359
Ce que ce PR change
Le dossier
MyIA.AI.Notebooks/SymbolicAI/Lean/Geometry/testsportait 13 tests vertsque rien n'exécutait. Ce PR le câble sur trois surfaces, dans l'ordre où la dérive
s'installe :
pytest.initestpathsMyIA.AI.Notebooks/SymbolicAI/Lean/Geometry/testsajouté.github/workflows/geometry-tests.yml(push+PR sur…/Geometry/**, 10 min, ubuntu-latest)scripts/check_testpaths_coverage.pyWORKFLOW_COVERAGELe workflow suit la forme déjà admise pour la même classe de défaut :
gametheory-tests.yml(#13746, tranche 1) etSymbolicAI/Argument_Analysis(#17248) —workflow dédié à
paths:serrés, plancher de collection, deps minimales.Mesures
Ce que le dossier contient (worktree
2f1291f01, 2026-10-29) :Le test vit dans
tests/test_real_geometry_bridge.py. Dépendances réelles :pytest,sympy(1.14 local) etz3— importé en dur parreal_geometry_bridge.py(l.38-39), que le test charge viasys.pathsur l'étageparent. Le job installe donc
pytest sympy z3-solver: sansz3-solver, la collecteéchoue (les contre-exemples réels sont décidés par Z3).
Contrôle négatif et contrôle positif du guard (
scripts/check_testpaths_coverage.py) —l'organe doit rougir sur ce défaut, sinon il ne prouve rien :
Le premier
rc=0est l'angle mort documenté dans l'entréeArgument_Analysisdu mêmefichier : le guard ne compare que les testpaths déclarés. Le
rc=1intermédiaire est lapreuve qu'il attrape cette classe dès qu'elle est déclarée. Le
rc=0final est la preuveque le câblage est complet — un
pytest.iniédité sans workflow rougit la PR.Autres vérifications :
pytest scripts/tests -k "testpaths or coverage"→91 passed, 2 skipped ;
yaml.safe_loaddu nouveau workflow → OK.Scope
Le périmètre de la PR, tel que le diff le porte :
pytest.ini,.github/workflows/geometry-tests.yml(nouveau),
scripts/check_testpaths_coverage.pyetscripts/ci/check_self_hosted_runner_policy.py(ce dernier porte l'entrée d'allowlist qui rend le workflow routable sur runner self-hosted).
Aucune autre modification de
paths:dans les workflows existants :.github/workflows/geometry-tests.ymlest le seul workflow touché par cette PR (la tranche reste traçable ; le piège est noté dans le
précédent
gametheory-tests.yml, que cette PR ne modifie pas).Le déclencheur couvre toute la famille
…/Geometry/**— un carnet ou le pont qui casse sestests doit réveiller le job.
Limite connue
Le plancher
GEOMETRY_TEST_FLOOR: 13est la mesure du jour : si des tests sont retirésintentionnellement, la valeur s'ajuste dans la même PR (le message d'erreur la nomme).
🤖 Generated with Claude Code