"cacheFile works with basic caching behavior"
"cacheFile caches results and avoids re-running"
"cacheFile tracks multiple dir arguments and vector paths"
"cacheFile handles arguments that fail to evaluate"
"cacheFile treats implicit defaults equal to explicit values"
"Smart hashing detects file modification without new files (mtime check)"
"xxhash64 backend works and produces valid filenames"
"Empty directory handling works with mtime hashing"
"env_vars argument invalidates cache when env vars change"
"Cache invalidates when VALUES change (even if expression is same)"
"Dots (...) are order-independent (sorted by name)"
"Cache persists across separate R sessions (Disk Persistence)"
"Could not find package root containing DESCRIPTION"
"changes in options used by function invalidate cache (no runs counter)"
".atomic_save warns when saving to a non-writable path"
".atomic_save warns on read-only cache directory but function still returns result"
".atomic_save cleans up temp files on failure"
"options(width) does not invalidate cache (Issue #4)"
"body change still invalidates cache after AST hashing (Issue #4)"
"default referencing another arg evaluates correctly (Issue #6)"
"default with stop() falls back gracefully (Issue #6)"
"default referencing function closure evaluates correctly (Issue #6)"
"mid-file change detected in medium file under full hash threshold (Issue #14)"
"seed produces diverse offsets for different paths (Issue #14)"
"full hash threshold boundary works correctly (Issue #14)"
"function returning NULL is cached and not re-executed (Issue #1)"
"function returning NULL with different args creates separate entries (Issue #1)"
"invisible() is preserved on cache miss (Issue #2)"
"invisible() is preserved on cache hit (Issue #2)"
"visible return stays visible after cache reload (Issue #2)"
"recursive cached function produces correct results (Issue #7)"
"recursive cached function uses cache for repeated subcalls (Issue #7)"
"call stack is properly maintained during recursion (Issue #7)"
".load parameter collision with wrapped function is documented (Issue #12)"
"wrapped function's .load default is ignored in cache key (Issue #12)"
"positional and named args hit same cache entry (Issue #15)"
"mixed positional and named args hit same cache (Issue #15)"
"reversed named args hit same cache as positional (Issue #15)"
"detects file paths in nested S4 object"
"detects file paths in data frame columns"
"end-to-end: cache invalidates when file in S4 slot changes"
"end-to-end: cache invalidates when file in attribute changes"
"S4 object with no file paths produces no false positives"
"Graph node cleanup on function error (#8)"
"removes graph node from disk when function errors"
"removes graph node from memory when function errors"
"preserves graph node when function succeeds"
"cachePrune cleans lock and temp files (#9)"
"re-hashing works after clearing file state cache"
"round-trips graph nodes through save/load"
"cache_stats returns correct aggregate statistics"
"cache_stats errors on non-existent directory"
"verbose mode reports 'first execution' on first call"
"verbose mode reports which component changed on miss"
"verbose mode is silent when option is not set"
".load_cacheR_config loads settings from YAML file"
".load_cacheR_config does not override existing options"
"env_vars from config option is used by cacheFile"
"warning on non-writable cache directory"
"warning on corrupt cache file during load"
".force = TRUE re-executes even when cache exists"
".skip_save = TRUE does not write cache file on miss"
".force + .skip_save combined: re-executes and doesn't save"
"version parameter: same version hits cache"
"version parameter: different version causes cache miss"
"version = NULL (default) works normally"
"depends_on_files: file change causes cache miss"
"depends_on_vars: different values cause cache miss"
"depends_on_files and depends_on_vars default to NULL without affecting behavior"
"sentinel file is created during execution and cleaned up after"
"sentinel wait loads result from parallel worker"
"stale sentinel (> 1 hour old) is ignored"
"cachePrune cleans up .computing sentinel files"

File path detection in R objects / detects file path in S4 object slot