Content-Addressable Storage Immutability
SkillFiles & storageCRITICAL: Never modify files in content-addressable storage systems where the filename IS the content hash (SHA256, IPFS CID, etc.). Use when: (1) Working with Blossom protocol, IPFS, or any CAS system, (2) Considering "optimizing" stored files (faststart, compression), (3) Implementing transcoding or processing pipelines for hash-identified content, (4) Building on top of ProofMode or any cryptographic verification system. Modifying files in place breaks hash verification and content integrity.
Available today. Use it from your connected AI after setup.
No other account needed.
Connect ahel once, and every AI you use reads what you have installed.
Then ask your AI: use the Content-Addressable Storage Immutability skill
What this skill tells your AI
The instructions your AI receives, as published by divinevideo/divine-mobile in .agents/skills/content-addressable-storage-immutability/SKILL.md and read by ahel’s review.
Problem
In content-addressable storage (CAS) systems, files are identified by their content hash. If you modify a file in place (even "harmless" optimizations), the content no longer matches its identifier, breaking the entire system's integrity guarantees.
Context / Trigger Conditions
- Working with Blossom protocol (files at
/{sha256}) - Working with IPFS (files at
/ipfs/{CID}) - Any system where filename = hash of content
- Considering file optimizations like:
- MP4 faststart (moving moov atom)
- Image optimization/compression
- Metadata stripping
- Format conversion
- Systems using ProofMode or cryptographic verification
The Fundamental Rule
NEVER modify a file stored at its content hash.
The hash IS the identity. Change the content → change the hash → file is now at wrong address.
What Goes Wrong
Original file: abc123... (hash) → contains bytes X
After "optimization": abc123... (hash) → contains bytes Y
Result:
- Hash abc123 no longer verifies
- ProofMode signatures invalid
- Content-addressable lookups return wrong data
- Cryptographic proofs broken
- Data integrity compromised
Solution: Store Derivatives Separately
If you need optimized/processed versions, store them at separate paths:
/{hash} ← Original file (NEVER MODIFY)
/{hash}/hls/master.m3u8 ← HLS transcoded version
/{hash}/faststart.mp4 ← Faststart optimized version
/{hash}/thumb.jpg ← Thumbnail
/{hash}/720p.mp4 ← Resolution variant
The original stays byte-for-byte identical. Derivatives live in subdirectories.
Implementation Pattern
// WRONG - modifies original
async fn process_video(hash: &str) {
let path = format!("/{}", hash);
let video = download(&path);
let optimized = apply_faststart(video);
upload(&path, optimized); // ❌ BREAKS HASH!
}
// RIGHT - creates derivative
async fn process_video(hash: &str) {
let original_path = format!("/{}", hash);
let derivative_path = format!("/{}/faststart.mp4", hash);
let video = download(&original_path);
let optimized = apply_faststart(video);
upload(&derivative_path, optimized); // ✓ Original untouched
}
Verification
- Original file hash still verifies:
sha256sum file == filename - ProofMode signatures still valid
- Content lookups return expected data
Common Mistakes
- "It's just moving metadata" - Still changes bytes, still breaks hash
- "We'll update the hash reference" - Now you have dangling references everywhere
- "No one will notice" - Verification systems WILL notice
- "It's an optimization" - Optimize derivatives, not originals
Notes
- This applies to ANY content-addressable system, not just Blossom
- IPFS, Git objects, Docker layers all follow this principle
- If you need the optimized version as primary, the client should upload it that way
- Transcoding to new formats (HLS, DASH) is fine because they're clearly separate files
References
Signals
- GitHub stars
- 264
- Forks
- 55
- Last commit
- Sep 2026
Advanced
- Catalog kind
- skill
- Gateway key
content-addressable-storage-immutability- Source
- github.com/divinevideo/divine-mobile