82e998273b
The 2026-07-16 review fixed telemetry growth in the GRAPH by calling engram_prune_telemetry(48h) on every ISE insert. The 2026-08-xx move to ENGRAM_ISE_OFFGRAPH=1 then routed every state event to a flat append-only log instead — and that path had no retention of any kind. The prune call still exists in server.el, but it now sits in the branch that production never takes, so the fix reads as present while being inert. Measured on the live store: 17.1 MB / 14,305 events over 3.56 days = 4.81 MB/day, unbounded (~1.76 GB/year). engram_ise_log_append now compacts to a byte bound after append. Byte- and not time-bounded on purpose: this is a flat file with no index, so size is the property that has to be bounded, and ftell on the handle already held is O(1) versus an O(file) timestamp scan per append. Default 64 MB retains ~13 days at the measured rate — more history than the 48h the on-graph path kept. Override with ENGRAM_ISE_LOG_MAX_BYTES. Compaction keeps the TAIL, never the head: engram_dreams_json reads the last ~2 MB of this file for dream-recall, so the recent end is the end with a reader, and KEEP (16 MB) stays well clear of that window. Resumes at the first line boundary so the tail never starts mid-record, and only renames over the live log when the tail was written in full — a short write must not destroy history. The honesty rail is unchanged: rotated-out remains "I don't remember", never a synthesized dream. This only makes the forgetting bounded and explicit instead of deferred forever. Verified against a 4,000-event harness at a 200 KB cap: file bounded, newest record retained, oldest dropped, 883 lines with zero malformed records, tail contiguous, no .tmp residue.