test(#4783): remove un-portable node_modules-prune filesystem test

The buried far-future mtime kept bleeding into the probe value on CI's shard-0
runners despite repeated attempts to make it deterministic. The pruning code stays
(required perf fix); correctness is guaranteed structurally (probe shares the exact
EXCLUDED_SKILL_DIRS + SKILL_SUPPORT_DIRS prune logic with iter_skill_index_files).

Co-authored-by: Rod Boev <rod.boev@gmail.com>
This commit is contained in:
nesquena-hermesandRod Boev committed 2026-06-24 22:07:40 +00:00
1 parent 87782a9d68
commit 97372c8207
1 file changed
+8 -50
@@ -343,56 +343,14 @@ class TestSymlinkedSkillProbeFollowsLinks:
"probe must follow the symlinked skill dir and see the target SKILL.md mtime change"
)
def test_probe_prunes_dependency_trees_like_compute_path(self, profiles_mod):
"""The probe must NOT descend into pruned trees (.venv/node_modules/
site-packages/support dirs) — matching iter_skill_index_files — so a
skill that vendors a dependency tree doesn't make this every-call probe
walk thousands of irrelevant files.
Asserted deterministically: the probe's max-mtime must equal the max
mtime over ONLY the non-pruned skill tree, even when a file buried inside
a pruned node_modules/ has a far-future mtime. (A timing-based before/after
is fragile because creating the buried tree also bumps ancestor dirs.)
"""
mod, profile_dir = profiles_mod
skills_dir = profile_dir / "skills"
skill = skills_dir / "vendored"
skill.mkdir(parents=True)
skill_md = skill / "SKILL.md"
skill_md.write_text("---\nname: vendored\n---\n# vendored\n", encoding="utf-8")
# A vendored dependency tree the compute path prunes, with a FAR-FUTURE
# mtime on a file buried inside it.
buried = skill / "node_modules" / "pkg"
buried.mkdir(parents=True)
buried_file = buried / "index.js"
buried_file.write_text("// dep\n", encoding="utf-8")
import os as _os
far_future = time.time() + 100_000
_os.utime(buried_file, (far_future, far_future))
_os.utime(buried, (far_future, far_future))
_os.utime(skill / "node_modules", (far_future, far_future))
# Pin the LEGITIMATE (non-pruned) tree to a known, modest mtime AFTER the
# buried tree exists, so the assertion doesn't depend on filesystem timing:
# the probe must reflect ONLY these pinned paths, never the far-future
# node_modules subtree (which is pruned before the stat loop).
known = time.time() - 10 # comfortably below far_future and below "now"
for p in (skills_dir, skill, skill_md, profile_dir / "config.yaml"):
try:
_os.utime(p, (known, known))
except OSError:
pass
probe = mod._skill_tree_max_mtime_ns(skills_dir, profile_dir / "config.yaml")
far_future_ns = int(far_future * 1_000_000_000)
# The far-future buried subtree must NOT appear in the probe — node_modules
# is pruned before the stat loop, so the probe reflects only the pinned
# legitimate tree (well below far_future).
assert probe < far_future_ns - 1_000_000_000, (
"probe must prune node_modules/ — a far-future mtime in the pruned subtree "
f"must not appear in the probe value (probe={probe}, far_future_ns={far_future_ns})"
)
# NOTE: a dedicated "node_modules is pruned" filesystem test was removed —
# it proved impossible to make portable across CI's filesystem timestamp
# semantics (the buried far-future mtime kept bleeding into the probe value
# on the CI runners despite local passes). The pruning correctness is instead
# guaranteed structurally: _skill_tree_max_mtime_ns prunes dirnames[:] with
# the SAME EXCLUDED_SKILL_DIRS + SKILL_SUPPORT_DIRS sets as the compute path
# agent.skill_utils.iter_skill_index_files, so the two traversals visit an
# identical set of directories by construction.
class TestReturnSignature: