session-close-phase-2-4-new-cache-categories

Session-close Phase 2 evolution — 4 new cache categories (cross-agent applicable)

Discovered post-MCP-image-rebuild: standard session-close Deep Storage Cleanup misses 4 cache types that regrow silently on any container rebuild involving Python/Node toolchains. ~2.8 GB drift per rebuild-heavy session until caught.

The 4 missing categories (now in every future session-close):

  1. .npm/_npx — npx-driven tool discovery cache. Separate from _cacache. Regrows with every npx <tool> invocation. Typical size 64+ MB.

  2. .cache/pnpm — pnpm’s global store (content-addressable package cache). Completely separate from npm/_cacache. Typical size 400+ MB after pnpm-based rebuilds. Auto-repopulates on next pnpm install.

  3. .cache/puccinialin — Rust toolchain cache (cargo + rustup + rustup-init). Embedded by Rust-backed Python wheels (pydantic-core, some ML libs, cryptography builds). Typical size 600+ MB after fastmcp 3.x-era rebuilds. Auto-regenerates on next Rust compile.

  4. syslog force-rotate — logrotate silently skips /var/log/syslog when parent-directory permissions are world-writable (systemd default on some Ubuntu configs: “Set su directive in config file” error). Manual bypass: cp /var/log/syslog → .1 && truncate -s 0 && systemctl reload rsyslog. Guard: only when live syslog >50 MB.

Meta-pattern for session-close cleanup protocols: when a new Python package ecosystem (pydantic v2 Rust wheels) or a new JS tool (pnpm over npm) gets adopted, its cache location is NEW infrastructure to sweep. Cleanup protocols have to evolve with dependency ecosystems — not a one-time authoring exercise.

Safety: all 4 categories auto-regenerate on next use — no data loss, no broken builds. Cache purge is idempotent.

Rollout: any cross-agent cleanup cron or session-close equivalent should incorporate these 4 categories. Measured reclaim: 2.8 GB on a MCP-rebuild-heavy session.