Skip to content

Predicate Caching Impl - #268

Merged
nikomatsakis merged 5 commits into
symposium-dev:mainfrom
kurasaiteja:feat/predicate-caching-events
Aug 4, 2026
Merged

Predicate Caching Impl#268
nikomatsakis merged 5 commits into
symposium-dev:mainfrom
kurasaiteja:feat/predicate-caching-events

Conversation

@kurasaiteja

Copy link
Copy Markdown
Contributor

What does this PR do?

Implements the predicate-caching RFD (#262). Custom predicates now emitWatch{File,Env,Time} JSONL events on stdout. Symposium caches their exit-coderesult in ~/.symposium/cache/predicates/<workspace-hash>.json and skips
re-evaluation until a watched file, env var, or TTL becomes stale.

Three granular events on a #[non_exhaustive] CustomPredicateEvent enum

  • WatchFile(PathBuf) result depends on this file's mtime + size.
  • WatchEnv(String) result depends on this env var's current value.
  • WatchTime(u64) result becomes stale after this many milliseconds.
  • WatchTime(0) disables caching.

Exit status still determines pass/fail. Events only control cache lifetime.

Cache layout

Per-workspace cache file at <SymposiumDirs::cache_dir>/predicates/<sha256(canonical workspace_root)>.json
I think isolating by workspace prevents two projects on the same machine that emit the same predicate string from stepping on each other's cached answers. Schema version tag invalidates on Symposium upgrade.

Note

  • Built-ins (path_exists, env, shell) stay uncached for now. path_exists is one stat, env is one hashmap lookup and the cache check would cost the same as just running them, so caching them doesn't buy anything. If it's useful to route them through the cache for observability, happy to add.
Disclosure questions

AI disclosure.

  • I used an AI tool for research, autocomplete, or in other minimal ways
  • The AI tool authored small parts of the code (e.g., autocomplete, comments)
  • The AI tool authored large parts of the code
  • Other: (explain)

Questions for reviewers.

@nikomatsakis nikomatsakis left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This looks good. Two minor suggestions.

Comment thread src/predicate.rs

/// Persist the disk cache back to `cache_path`. No-op if this context
/// was not built with `with_disk_cache` or the cache was not modified.
pub fn persist_disk_cache(&mut self, cache_path: &Path) -> Result<()> {

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nit: Hmm, should we do this in the Drop impl?

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@kurasaiteja
kurasaiteja force-pushed the feat/predicate-caching-events branch 2 times, most recently from 6fea6ed to 50468f2 Compare August 4, 2026 15:58
Adds Watch{File,Env,Time} events on a non_exhaustive enum plus SDK emitter and consumer parser.
Unions Watch events into a set with a CacheTtl and captures mtime+size / env-value fingerprints.
at <cache_dir>/predicates/<sha256(workspace)>.json with schema-version invalidation.
@kurasaiteja
kurasaiteja force-pushed the feat/predicate-caching-events branch from 50468f2 to ab64be6 Compare August 4, 2026 19:24
Thin wrappers that emit WatchEnv/WatchFile before delegating to std, so predicates cache correctly.
@kurasaiteja
kurasaiteja force-pushed the feat/predicate-caching-events branch from ab64be6 to 8ed0eda Compare August 4, 2026 19:33
@kurasaiteja

Copy link
Copy Markdown
Contributor Author

Arc change squashed into the wiring commit, also rebased onto mainline.

Wiring commit: f2703d0

@nikomatsakis
nikomatsakis added this pull request to the merge queue Aug 4, 2026
Merged via the queue into symposium-dev:main with commit 4b72e42 Aug 4, 2026
7 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants