Repository navigation
Fix(#13962): check_mathlib_cache -- une jonction pendante n'est plus classee absent/reel - #19866
Conversation
…lassee `absent`/`reel` Le test d'existence precede la detection du lien : `os.path.exists()` SUIT la jonction et rend False des que la cible a disparu, donc on sortait avant de poser la cle `junction` -- et l'affichage rendait `reel`, soit l'inverse de la verite. Mesure po-2025 (2026-10-08) : 14 jonctions pendantes lues `absent` + `reel`. L'API `Path.is_junction()` voit juste : c'est l'ordre des tests qui perd l'information. - detection du lien remontee avant le test d'existence ; nouvelle cle `junction_target`, distincte de `realpath` (une cible disparue n'est pas un cache physique et n'entre pas dans le dedoublonnage) - troisieme etat `dangling`, compte dans `--strict` alors que `absent` ne l'est pas : un lac sans checkout est l'etat normal d'un lac jamais construit localement, une jonction pendante se presente comme un paquet installe et peut faire croire a un cache partage utilisable - ligne de resume, bloc d'avertissement dedie, avis « cache purge » elargi - 5 tests de jonction (dont le controle negatif du repertoire reel) et 2 tests CLI bornant `--strict` des deux cotes - `test_cache_dedups_by_realpath` se skippait en PERMANENCE sous Windows (`symlink_to` exige une elevation) : branche sur le helper `mklink /J`, il tourne et passe -- 35 passed / 0 skipped contre 34 / 1 Arbre reel po-2025 : `non installe` 27 -> 13 + 14 jonctions pendantes. Le `partiel` 1->2 et `caches distincts` 2->3 du meme releve viennent d'un `lake build` de `differential_lean` concurrent, pas de ce correctif. See #13962 Part of #4362 Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
|
[ADJOINT PREFLIGHT] |
|
No organ-duplication: no added def/class collides with another series organ API (scripts/audit/organ_api_index.yaml). Detector: |
|
[ADJOINT PREFLIGHT] Derivation live READY a la tete vive : le dossier BLOCKED anterieur attestait des jambes alors en cours ; jambes latest-wins vertes, B.0 clear, aucun thread non resolu. |
Grain: MED/guard — lane myia-po-2025:CoursIA — prev: DEEP/notebook-python #19620
Le defaut mesure
Sur po-2025,
check_mathlib_cache.pyrendabsent+reelpour les 14 jonctions pendantes de la machine — le premier mot dit « aucun checkout », le second dit « repertoire physique ». Les deux sont faux, et le second est l'inverse exact de la verite.Releve verbatim,
--repo-path D:/dev/CoursIA:La cause est un retour anticipe qui precede la detection du lien :
if not mathlib.exists(): → status = "absent"; returnexists()suit le lien vers une cible disparue →False→ on sort avant la l. 93-96real = os.path.realpath(mathlib)puisjunction = …junctionreste absente du resultatflag = "junction" if r.get("junction") else "reel "reel— l'exact contraire de la veriteL'API n'est pas en cause, l'ordre des tests l'est. Mesure de la divergence, sur le meme chemin :
Le fichier portait deja l'avertissement exact a sa derniere ligne (« un comptage a 0 via
findouislinkne prouve rien sur une junction ») : l'organe qui l'ecrit classait 14 jonctions comme des repertoires reels.Le correctif
Detection du lien avant le test d'existence, et un troisieme etat,
dangling:junction+junction_targetsont calcules en premier (divergence deos.path.realpath) ;mathlib.exists()faux et lien present →dangling(et nonabsent) ;junction_targetest une cle distincte derealpath: une cible disparue n'est pas un cache physique et n'entre donc pas dans le dedoublonnage ;--strictcomptedanglingalors qu'il ne compte pasabsent— un lac sans checkout est l'etat normal d'un lac jamais construit localement (lakele recupere), une jonction pendante se presente comme un paquet installe et peut faire croire a un cache partage utilisable.S'ajoutent la ligne de resume (
jonctions pendantes: N), un bloc d'avertissement dedie et l'elargissement de l'avis « cache purge » acold or partial or dangling.Avant / apres sur l'arbre reel po-2025
Le basculement
27 → 13 + 14est l'effet du correctif : les 14 jonctions pendantes sortent denon installeet deviennent un etat nomme.Le reste du delta ne vient pas de ce correctif et je ne me l'attribue pas :
partiel1→2 etcaches distincts2→3 viennent d'unlake exe cache get+lake builddedifferential_leanqui tournait pendant le releve et a cree son.lake/packages/mathlib(verifie : le repertoire existe, horodate en cours de mesure ; le log montreBuilt Cache.Lean). Le compte de checkouts physiques est donc un instantane, la ou les 18 jonctions sont stables — un lien ne se peuple pas tout seul.Le verdict global
mathlib ok: 0 / 36est inchange : aucune des deux cecites ne fabrique un faux « ok ». Elles faussent le diagnostic (quelle classe de panne, sur quel lac), pas le verdict d'atteignabilite.Tests
python -m pytest scripts/lean/tests/test_check_mathlib_cache.py -q→ 35 passed, 0 skipped.Cinq tests pour les trois etats de lien, chacun avec son controle :
test_live_junction_is_detected_and_countedpartial/oket alimente le cachetest_junction_to_empty_store_stays_coldcold, pasdanglingtest_dangling_junction_is_not_absentdangling+junction_targettest_dangling_junction_does_not_enter_physical_cache_countrealpath)test_control_real_dir_is_not_a_junctionTruepartout passerait les quatre autresPlus deux tests CLI :
--strictrougit sur une jonction pendante (test_strict_counts_dangling_junction) et ne rougit pas surabsent(test_strict_ignores_absent), soit les deux bornes de la decision.Les liens de test passent par une junction (
cmd /c mklink /J), qui ne demande pas d'elevation sous Windows — la ousymlink_toen exige une et faitpytest.skip.Un test qui ne tournait pas se met a tourner.
test_cache_dedups_by_realpathepingle le dedoublonnage parrealpath— precisement la propriete en jeu ici — et se skippait en permanence sous Windows parce qu'il utilisaitsymlink_to. Il est branche sur le meme helper : il passe, et la suite n'a plus aucun skip (35 passed / 0 skipped, contre 34 passed / 1 skipped avant).Perimetre
Deux fichiers, aucun autre :
scripts/lean/check_mathlib_cache.py— detection, etatdangling, resume,--strictscripts/lean/tests/test_check_mathlib_cache.py— 5 tests de jonction, 2 tests CLI, 1 test debloqueAucune modification de
setup_shared_mathlib.ps1ni d'un lake : le rapport de scan (#19860) a mesure que po-2025 n'a ni donneur ni sauvegarde, et unApplyserait au mieux inoperant. Le geste utile sur cette machine — retirer les 18 jonctions — est un geste disque qui attend un GO nominatif ; il n'est pas dans cette PR.See #13962·Part of #4362🤖 Generated with Claude Code