# storage-serde-dedup ## COMPLETE (2026-02-01) **Before:** 12 instances of duplicated serialization helpers **After:** 0 instances - all use centralized `crate::serde_helpers` **Enforcement:** Added to `.claude/skills/stemedb-core/SKILL.md`: - Do: "In stemedb-storage: Use crate::serde_helpers::{serialize, deserialize}" - Do Not: "Call stemedb_core::serde::serialize or deserialize directly" **Documentation:** Updated `ai-lookup/services/storage.md`: - Added storage-layer serialization section - Added serde_helpers.rs to file pointers --- ## FIX Progress (2026-02-01) - [x] CREATE serde_helpers.rs with generic serialize/deserialize functions - [x] FIX vote_store.rs - replaced serialize_vote/deserialize_vote - [x] FIX index_store.rs - replaced serialize_hash_list/deserialize_hash_list - [x] FIX trust_rank_store.rs - replaced serialize_trust_rank/deserialize_trust_rank - [x] FIX audit_store.rs - replaced serialize_audit/deserialize_audit - [x] FIX trust_pack_store.rs - replaced serialize_pack/deserialize_pack - [x] FIX quota_store.rs - replaced serialize_record/deserialize_record - [x] Removed unused StorageError imports from 3 files - [x] All 64 stemedb-storage tests pass - [x] All workspace tests pass (225+ tests) - [x] Clippy passes with zero warnings ## AUDIT (2026-02-01) Pattern: Every storage module duplicates serialize_X/deserialize_X helper functions that wrap stemedb_core::serde with StorageError mapping. ```rust // DUPLICATED 12 times (6 serialize + 6 deserialize) fn serialize_X(data: &X) -> Result> { stemedb_core::serde::serialize(data) .map_err(|e| StorageError::Serialization(e.to_string())) } fn deserialize_X(data: &[u8]) -> Result { stemedb_core::serde::deserialize(data) .map_err(|e| StorageError::Serialization(e.to_string())) } ``` Found: **12 instances** in **6 files** | File | Line | Function | |------|------|----------| | vote_store.rs | 150 | serialize_vote | | vote_store.rs | 155 | deserialize_vote | | index_store.rs | 128 | serialize_hash_list | | index_store.rs | 134 | deserialize_hash_list | | trust_rank_store.rs | 248 | serialize_trust_rank | | trust_rank_store.rs | 254 | deserialize_trust_rank | | audit_store.rs | 153 | serialize_audit | | audit_store.rs | 159 | deserialize_audit | | trust_pack_store.rs | 138 | serialize_pack | | trust_pack_store.rs | 143 | deserialize_pack | | quota_store.rs | 291 | serialize_record | | quota_store.rs | 297 | deserialize_record | ## Plan 1. CREATE: Add `stemedb-storage/src/serde_helpers.rs` with generic serialize/deserialize 2. FIX: Replace all 12 type-specific functions with calls to the generic helpers 3. VERIFY: grep returns 0 for old pattern 4. ENFORCE: Add rule to skill or guideline 5. DOCUMENT: Update ai-lookup/services/storage.md