Deleting an idle scratch entry left two things behind. Headless browsers started by a lane's e2e run kept running for days with a "(deleted)" cwd (about 20 on one host; the process registry never knew them because they were grandchildren of a shell that had exited). Repos whose linked worktree lived in the entry kept a dangling registration until someone ran `git worktree prune` by hand (10 in one repo). The prune now lives in hermes_constants_scratch (hermes_constants keeps the entry point). Before an idle entry is removed, same-user processes whose cwd is inside it, or inside any scratch path that no longer exists, are TERMed then KILLed; the deleted-cwd sweep runs on every pass so orphans from earlier deletions are caught too. `.git` files found in the entry name their repo, which gets `git worktree prune` after the rmtree. cache/terminal used its own 72h fixed-age sweep; it now shares the 24h idle rule and the subtree check. `hermes doctor` warns about cache-root directories over 1 GiB that neither pruner covers, since finished campaign trees parked there sat for weeks (95 GB on one host). System-prompt scratch line updated to match.
17 lines
716 B
Python
17 lines
716 B
Python
"""``hermes doctor`` names cache-root dirs that no pruner covers once they are big enough."""
|
|
|
|
from hermes_cli.doctor_state import unpruned_cache_hogs
|
|
|
|
|
|
def test_unpruned_cache_hogs_skips_pruned_dirs_and_small_entries(tmp_path):
|
|
cache = tmp_path / "cache"
|
|
for name in ("scratch", "terminal", "campaign-x", "web"):
|
|
(cache / name).mkdir(parents=True)
|
|
with open(cache / name / "blob", "wb") as fh:
|
|
fh.truncate(2048)
|
|
fh.write(b"x" * 2048)
|
|
hogs = unpruned_cache_hogs(tmp_path, min_bytes=1024)
|
|
assert {name for name, _ in hogs} == {"campaign-x", "web"}
|
|
assert not unpruned_cache_hogs(tmp_path, min_bytes=1 << 20)
|
|
assert all(size >= 2048 for _, size in hogs)
|