content-hash-cache-pattern
Cache expensive file processing results via SHA-256 content hashes — path-independent, auto-invalidating, service layer separation.
Skill by signalo-rust
Install
Works with Claude Code, Claude apps, Codex, Cursor, Gemini CLI, GitHub Copilot, VS Code, OpenCode, Goose, Windsurf. Read the repository before you give any tool access to your data.
npx agentmarket install skill/signalo-rust-content-hash-cache-pattern-dc3933
Asks which of your tools to add it to (Claude Code, Codex, Cursor, VS Code, Windsurf, Gemini CLI, Claude Desktop) and shows the change first. See https://agentmart.dev/cli.
Get the weekly diff
The weekly diff: one email a week with new agent tools, notable updates and grade changes, plus security alerts for tools you follow. Double opt-in, one-click unsubscribe.
About
Use cases: writing
Reviews
Write a reviewNo reviews yet. Installed it? Reviews come from verified installers only. How reviews work
Permissions
What this skill can do and what it asks for, from its SKILL.md. Checked Oct 25, 2026.
- Tools
- No tools found
- Secrets
- None asked for
- Install scripts
- None found
Network hosts it talks to 1
codeload.github.com· found in install command
Files it touches
~/.claude/skills/content-hash-cache-pattern
What's inside
- Skill name
content-hash-cache-pattern- Description
- Cache expensive file processing results via SHA-256 content hashes — path-independent, auto-invalidating, service layer separation. Useful for caching results of costly pipelines (transcription, OCR, text extraction, image analysis) so re-processing the same file is an instant hit. Triggers: "content hash cache", "file dedup", "already processed this file", "SHA-256 cache".
- License
- MIT
- Instructions
- 156 lines in SKILL.md · view on GitHub
Files (1)
- SKILL.md
SKILL.md (first lines)
# Content-Hash File Cache Pattern
Cache expensive file processing results (PDF parsing, text extraction, image analysis, transcription) using SHA-256 content hashes as cache keys. Unlike path-based caching, this approach survives file moves/renames and auto-invalidates when content changes.
## When to Activate
- Building file processing pipelines (PDF, images, text extraction, audio transcription)
- Processing cost is high and same files are processed repeatedly
- Need a `--cache/--no-cache` CLI option
- Want to add caching to existing pure functions without modifying them
## Core Pattern
### 1. Content-Hash Based Cache Key
Use file content (not path) as the cache key:
```python
import hashlib
from pathlib import Path
_HASH_CHUNK_SIZE = 65536 # 64KB chunks for large files
def compute_file_hash(path: Path) -> str:
"""SHA-256 of file contents (chunked for large files)."""
if not path.is_file():
raise FileNotFoundError(f"File not found: {path}")
sha256 = hashlib.sha256()
with open(path, "rb") as f:
while True:
chunk = f.read(_HASH_CHUNK_SIZE)
if not chunk:
break
sha256.update(chunk)
return sha256.hexdigest()
```
**Why content hash?** File rename/move = cache hit. Content change = automatic invalidation. No index file needed.
### 2. Frozen Dataclass for Cache Entry
```python
from dataclasses import dataclass
@dataclass(frozen=True, slots=True)
class CacheEntry:
file_hash: str
source_path: str
document: ExtractedDocument # The cached result
```
### 3. File-Based Cache Storage
Each cache entry is stored as `{hash}.json` — O(1) lookup by hash, no index file required.
```python
import json
from typing import Any
def write_cache(cache_dir: Path, entry: CacheEntry) -> None:
cache_dir.mkdir(parents=True, exist_ok=True)
cache_file = cache_dir / f"{entry.file_hash}.json"
data = serialize_entry(entry)
cache_file.write_text(json.dumps(data, ensure_ascii=False), encoding="utf-8")
def read_cache(cache_dir: Path, file_hash: str) -> CacheEntry | None:
cache_file = cache_dir / f"{file_hash}.json"
if not cache_file.is_file():
return None
try:
raw = cache_file.read_text(encoding="utf-8")
data = json.loads(raw)
return deserialize_entry(data)
except (json.JSONDecodeError, ValueError, KeyError):
return None # Treat corruption as cache miss
```
### 4. Service Layer Wrapper (SRP)
Keep the processing function pure. Add caching as a separate service layer.
```python
def extract_with_cache(
file_path: Path,
*,
cache_enabled: bool = True,
cache_dir: Path = Path(".cache"),
) -> ExtractedDocument:
"""Service layer: cache check -> extraction -> cache write."""
if not cache_enabled:
return extract_text(file_path) # Pure function, no cache knowledge
file_hash = compute_file_hash(file_path)
# Check cache
cached = read_cache(cache_dir, file_hash)
if cached is not None:
logger.info("Cache hit: %s (hash=%s)", file_path.name, file_hash[:12])
return cached.document
# Cache miss -> extract -> store
logger.info("Cache miss: %s (hash=%s)", file_path.name, file_hash[:12])
doc = extract_text(file_path)
entry = CacheEntry(file_hash=file_hash, source_path=str(file_path), document=doc)
write_cache(cache_dir, entry)
return doc
```
## Key Design Decisions
| Decision | Rationale |
|----------|-----------|
| SHA-256 content hash | Path-independent, auto-invalidates on content change |
| `{hash}.json` file naming | O(1) lookup, no index file needed |
| Service layer wrapper | SRP: extraction stays pure, cache is a separate concern |
| Manual JSON serialization | Full control over frozen dataclass serialization |
| Corruption returns `None` | Graceful degradation, re-processes on next run |
| `cache_dir.mkdir(parents=True)` | Lazy directory creation on first write |
## Best PracticesFrom signalo-rust/agent-guardrails, MIT.
More from signalo-rust/agent-guardrails
- 0.497score
output-coverage-assertion
signalo-rust
BEFORE claiming "full coverage" / "covers all N minutes" / "X highlights across the whole recording", assert the min/max timeSec of the real output against…
SkillCFreshness: C★ 1Claude Code +9 - 0.497score
api-contract-audit
signalo-rust
Inventory every API endpoint that surfaces a field to clients BEFORE dropping, renaming, or semantically changing it.
SkillCFreshness: C★ 1Claude Code +9 - 0.497score
reviewer-gate
signalo-rust
Run the machine review gate over the current repo — map changed files to the specialist reviewers they require, scan the diff for hardcoded secrets and…
SkillCFreshness: C★ 1Claude Code +9 - 0.497score
docker-push-verify
signalo-rust
After `docker buildx build --push`, always verify the image actually landed on the upstream registry.
SkillCFreshness: C★ 1Claude Code +9 - 0.497score
anti-bug-prevention
signalo-rust
Production deploy safety pipeline.
SkillCFreshness: C★ 1Claude Code +9 - 0.497score
eval-harness
signalo-rust
Formal eval-driven development (EDD) framework.
SkillCFreshness: C★ 1Claude Code +9 - 0.497score
brainstorm-first
signalo-rust
Before starting any non-trivial task (>0.5 day, new feature, new UI page, new integration, refactor spanning >5 files), it is mandatory to ask the requester…
SkillCFreshness: C★ 1Claude Code +9 - 0.494score
verification-loop
signalo-rust
Run a practical quality gate before closing work — typecheck, sync/consistency check, and task-specific validation.
SkillCFreshness: C★ 1Claude Code +9 - 0.494score
clean-build-verification
signalo-rust
Before committing changes that touch workspace deps, DB schema, or >500 LOC — verify a real clean build.
SkillCFreshness: C★ 1Claude Code +9 - 0.494score
money-math-invariants
signalo-rust
Lint checklist for money fields in a billing subsystem.
SkillCFreshness: C★ 1Claude Code +9 - 0.494score
regex-vs-llm-structured-text
signalo-rust
Decision framework for parsing structured text — regex covers 95-98% cheaply and deterministically, and an LLM handles only the low-confidence edge cases.
SkillCFreshness: C★ 1Claude Code +9 - 0.494score
search-first
signalo-rust
Research-before-coding workflow.
SkillCFreshness: C★ 1Claude Code +9
Signals
- Stars
- 1
- Forks
- 0
- Open issues
- 0
- Last commit (this folder)
- Jul 11, 2026 (3 months ago)
From GitHub (fetched Oct 24, 2026).
Details
- License
- MIT
- Repository
- github.com/signalo-rust/agent-guardrails
- First seen
- Oct 24, 2026
- Last checked
- Oct 24, 2026
- Source
- GitHubgithub-graphql
Same skill elsewhere
Copies of this SKILL.md published by others; search shows only one of them.
More from signalo-rust
- 0.497score
output-coverage-assertion
signalo-rust
BEFORE claiming "full coverage" / "covers all N minutes" / "X highlights across the whole recording", assert the min/max timeSec of the real output against…
SkillCFreshness: C★ 1Claude Code +9 - 0.497score
api-contract-audit
signalo-rust
Inventory every API endpoint that surfaces a field to clients BEFORE dropping, renaming, or semantically changing it.
SkillCFreshness: C★ 1Claude Code +9 - 0.497score
reviewer-gate
signalo-rust
Run the machine review gate over the current repo — map changed files to the specialist reviewers they require, scan the diff for hardcoded secrets and…
SkillCFreshness: C★ 1Claude Code +9 - 0.497score
docker-push-verify
signalo-rust
After `docker buildx build --push`, always verify the image actually landed on the upstream registry.
SkillCFreshness: C★ 1Claude Code +9 - 0.497score
anti-bug-prevention
signalo-rust
Production deploy safety pipeline.
SkillCFreshness: C★ 1Claude Code +9 - 0.497score
eval-harness
signalo-rust
Formal eval-driven development (EDD) framework.
SkillCFreshness: C★ 1Claude Code +9
Cite this page
content-hash-cache-pattern skill. Agent Mart. https://agentmart.dev/skills/signalo-rust-content-hash-cache-pattern-dc3933 (last updated 2026-10-24)