silk Cache Management
This document describes the managed cache model used by the silk toolchain
and the silk cache command surface for inspecting and maintaining that cache.
Scope#
silk cache is the user-facing management surface for the compiler-managed
cache root:
- default cache root:
<work_root>/cache - default work root:
.silk - work-root override:
SILK_WORK_DIR
When the effective work root is relative and a package root is in scope,
silk resolves it relative to that package root. Otherwise it is resolved
relative to the current working directory.
Examples:
- default package-local cache root:
<package_root>/.silk/cache - explicit work-root override:
SILK_WORK_DIR=/tmp/silk-workgives/tmp/silk-work/cache
The cache command manages only the recognized cache entries under that cache
root. It does not treat other work-root data such as repl_history, man
scratch files, z3 debug dumps, or general temporary files outside the cache
root as cache entries.
Managed Entry Types#
Today the managed cache root primarily contains the build/ subtree, which may
contain more than one entry format.
CLI Build-Artifact Entries#
The CLI build cache stores completed build outputs under:
<cache_root>/build/<sha256-key>/artifact- optional generated header:
<cache_root>/build/<sha256-key>/header - metadata:
<cache_root>/build/<sha256-key>/meta.txt
These entries are created by silk build when the build inputs are fully
cacheable. The cache key covers the relevant build inputs and options, including
Silk sources, native inputs, linker-affecting settings, toolchain identity, and
selected stdlib overrides.
For a package target, "Silk sources" means the complete local file-module
closure resolved from every declared target root, not only the paths listed in
the manifest's [sources] table. Both the normalized path and file contents of
each transitively imported local module participate in the key. The effective
root and dependency feature selections participate as well. Consequently, an
edit to an imported .slk file or a feature change that can alter checked or
generated code must invalidate the target entry even when the manifest itself
is unchanged.
Managed build-cache updates are coordinated through an internal advisory lock
file under the cache root. Cache hits, cache repopulation, and explicit cache
maintenance commands all use that lock so silk does not delete or rewrite a
live managed entry in place while another silk process is reading or pruning
the same cache root.
std::build Blob Entries#
std::build uses a content-addressed generated-file cache for cached
write_file(...) steps under:
<cache_root>/build/<fnv1a64>.blob
These blobs are managed cache entries too and are visible through
silk cache list, silk cache inspect, silk cache prune, and
silk cache compact.
Unknown / Unmanaged Files#
The cache root may also contain:
- files written by future toolchain versions,
- files written by humans/tools during debugging,
- or partially written data that does not match a recognized managed entry.
silk cache treats those paths conservatively:
- they are reported as unknown/unmanaged when relevant,
- they are not deleted by
clear,prune, orcompact, - and they do not count as recognized cache entries for pruning policy.
This conservative rule is deliberate: the tool should help users clean the managed cache safely without assuming ownership of arbitrary files under the cache root.
Entry Health Model#
Recognized managed entries are classified as:
healthy:- the entry shape matches the current contract and the required files are present.
healable:- the entry is recognizable and usable, but metadata is missing or still in a
legacy/minimal form that
silkcan repair automatically. broken:- the entry is recognizable as a managed cache entry, but required files are missing or the layout is incomplete.
unknown:- the path is not recognized as a current managed cache entry and is preserved by maintenance commands.
silk cache inspect reports these states so users can decide whether to keep,
prune, or compact the cache.
Automatic Maintenance#
The toolchain includes built-in cache maintenance during normal silk build
use.
Auto-Heal#
Auto-heal is enabled by default.
It may:
- create the managed cache directories when needed,
- refresh per-entry metadata on cache hits,
- repair missing/minimal metadata for recognized build-cache entries,
- preserve observed entry recency when healing missing metadata instead of
fabricating a fresh
last_usedtimestamp for old entries, - and clean up stale partial managed entries that no longer represent valid cache data.
Auto-heal never deletes unknown/unmanaged files.
Auto-heal and auto-prune try to acquire the managed cache lock without waiting.
If another silk process is already mutating or reading the managed cache, the
automatic maintenance pass is skipped for that build rather than blocking it or
guessing around concurrent cache state.
Environment:
SILK_CACHE_AUTO_HEAL- default: enabled
- set to
0,false,off, ornoto disable
Auto-Prune#
Auto-prune is enabled by default for recognized managed entries.
The default policy is:
- maximum cache size:
2 GiB - maximum cache age:
30d - minimum entries to preserve by recency:
64
When the cache exceeds the configured size cap, silk prunes the oldest
recognized managed entries first, while still preserving the configured
keep_recent window. When age pruning is enabled, entries older than the age
limit are eligible for removal even when the cache is not over the size cap.
Environment:
SILK_CACHE_AUTO_PRUNE- default: enabled
- set to
0,false,off, ornoto disable SILK_CACHE_MAX_BYTES- default:
2147483648(2 GiB) - accepts raw bytes or
K/M/G/Tsuffixes 0disables size-based pruningSILK_CACHE_MAX_AGE- default:
30d - accepts
s,m,h,d, orwsuffixes 0disables age-based pruningSILK_CACHE_KEEP_RECENT- default:
64 - preserves at least this many most-recently-used recognized managed entries during pruning
silk cache Command Model#
silk cache is the primary CLI entrypoint for inspection and maintenance.
Root Selection#
The command resolves one cache root in this order:
--cache-dir <path>when provided- otherwise the effective
<work_root>/cachecomputed from:
--package <dir|manifest>when provided,- otherwise the nearest package root from the current directory when one is available,
- otherwise the current directory
Commands#
silk cache- print a root-level summary (same as
silk cache inspect) silk cache path- print the effective cache root path
silk cache list- list recognized managed cache entries with type, size, recency, and health
silk cache inspect [<entry>]- without
<entry>, print cache-root summary and active policy - with
<entry>, print entry-specific details silk cache prune- prune recognized managed entries according to the active/default policy
- accepts explicit
--max-age,--max-size, and--keep-recentoverrides silk cache compact- auto-heal recognized entries, remove stale broken managed data, drop
now-empty managed directories such as
build/, and then apply pruning policy - accepts the same
--max-age,--max-size, and--keep-recentoverrides asprune silk cache clear- remove recognized managed cache entries under the selected cache root
- unknown/unmanaged files are preserved
Common Options#
--package <dir|manifest>,--pkg <dir|manifest>- resolve the cache root relative to the selected package root
--json- emit newline-terminated, schema-versioned cache data for
path,list,inspect,prune,compact, orclear --cache-dir <path>- operate on an explicit cache root path
--dry-run- show what would be removed without deleting anything
--max-age <age>- override the active/default age limit for
pruneorcompact --max-size <bytes>- override the active/default size limit for
pruneorcompact --keep-recent <n>- preserve at least
<n>most-recently-used recognized managed entries
Safety Model#
The cache-management commands are intentionally conservative.
clear,prune, andcompactonly remove recognized managed cache entries or stale broken managed residue.- Unknown/unmanaged files are preserved.
--dry-runis available for previewing cleanup decisions before removal.- explicit mutation commands coordinate through the same managed cache lock used
by normal builds, so
silk cache prune,silk cache compact, andsilk cache clearwait until an in-flight managed cache operation finishes instead of racing it. - the internal lock file is intentionally hidden from
silk cache list/inspectoutput and does not count as an unknown user-owned file.
This means users can clean the compiler-managed cache without the command assuming it owns every file under the cache root.
Operator Guidance#
Recommended workflow:
- run
silk cacheto see the current root, size, health, and policy, - run
silk cache listwhen you need entry-level detail, - run
silk cache prune --dry-runto preview policy-based cleanup, - run
silk cache compact --dry-runwhen the cache looks unhealthy, - run
silk cache clearonly when you want to discard all recognized managed cache entries and rebuild from scratch.
Use path when you need to inspect the cache manually in a shell or attach the
path to a bug report.
Use --json when a script, editor, CI job, or agent needs structured cache
facts. Mutation commands keep the same side effects and exit codes; JSON reports
the result with dryRun, healedEntries, removedEntries, and
reclaimedBytes.
Source repository · Edit this page · View Markdown