personal memory agent
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

Change raw media retention default from "keep" to "processed"

New installations now process-and-delete raw media by default instead of
retaining indefinitely. Two real-world storage crises (Ramon ~560GB of 1TB,
jer similar) showed that "keep everything" is the wrong default — users
who want to keep raw media can opt in. Existing installations are unaffected
(their journal.json already has the config persisted).

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

+7 -7
+1 -1
docs/JOURNAL.md
··· 176 176 ``` 177 177 178 178 Fields: 179 - - `raw_media` (string) – Retention mode: `"keep"`, `"days"`, or `"processed"`. Default: `"keep"`. 179 + - `raw_media` (string) – Retention mode: `"keep"`, `"days"`, or `"processed"`. Default: `"processed"`. 180 180 - `raw_media_days` (integer or null) – Number of days to retain raw media when mode is `"days"`. Required when `raw_media` is `"days"`, ignored otherwise. 181 181 - `per_stream` (object) – Per-stream overrides keyed by stream name. Each entry supports `raw_media` and `raw_media_days`. Omitted fields inherit from the global retention settings. 182 182
+2 -2
tests/test_retention.py
··· 220 220 class TestRetentionConfig: 221 221 def test_default_policy(self): 222 222 cfg = RetentionConfig() 223 - assert cfg.policy_for_stream("default").mode == "keep" 223 + assert cfg.policy_for_stream("default").mode == "processed" 224 224 225 225 def test_per_stream_override(self): 226 226 cfg = RetentionConfig( ··· 243 243 def test_default_config(self, monkeypatch): 244 244 monkeypatch.setattr("think.utils.get_config", lambda: {}) 245 245 cfg = load_retention_config() 246 - assert cfg.default.mode == "keep" 246 + assert cfg.default.mode == "processed" 247 247 assert cfg.per_stream == {} 248 248 249 249 def test_custom_config(self, monkeypatch):
+4 -4
think/retention.py
··· 5 5 6 6 Manages the lifecycle of raw media files (layer 1 captures) in journal segments. 7 7 Three retention modes: 8 - - keep: retain raw media indefinitely (default) 8 + - keep: retain raw media indefinitely 9 9 - days: delete raw media after N days, once processing is complete 10 - - processed: delete raw media as soon as processing completes 10 + - processed: delete raw media as soon as processing completes (default) 11 11 12 12 Safety invariant: never delete raw media from segments that haven't finished 13 13 processing. All completion checks must pass before any deletion. ··· 141 141 class RetentionPolicy: 142 142 """Retention policy for a single scope (global or per-stream).""" 143 143 144 - mode: str = "keep" # "keep", "days", or "processed" 144 + mode: str = "processed" # "keep", "days", or "processed" 145 145 days: int | None = None 146 146 147 147 def is_eligible(self, segment_age_days: int) -> bool: ··· 174 174 config = get_config() 175 175 retention = config.get("retention", {}) 176 176 177 - mode = retention.get("raw_media", "keep") 177 + mode = retention.get("raw_media", "processed") 178 178 days = retention.get("raw_media_days") 179 179 default = RetentionPolicy(mode=mode, days=days) 180 180