A deleted memory became retrievable again after an in-flight write landed.
A write that was in flight when the memory was deleted is discarded or applied as a tombstone. The deleted memory stays unretrievable after the write lands, and after a restart if the adapter supports one.
The marker was absent right after the memory deletion, then reappeared via search, read_by_id, profile after release_pending_writes.
Afterlife
Every step a synthetic marker went through after it was written. Absence is only counted after deletion was confirmed, and a reappearance is attributed to the lifecycle event that preceded it.
Deleted, confirmed absent, then retrievable again after release pending writes (event 7). Contract tested: memory record deletion.
- 1 · Createdwritememory mem_000001 written (memory record scope)
- 2 · Controlsearchmarker retrievable by its owner
- 3 · In flightbegin pending write+1 mswrite job_000002 to mem_000001 held in flight
- 4 · Deleteddelete+1 msmemory mem_000001 deleted
- 5 · Checkedimmediate check+1 msmarker absent from every checked surface
- 6 · Eventrelease pending writes+1 ms1 pending write(s) processed, 0 discarded
- 7 · Observedafter release+1 msmarker visible on search, read_by_id, profile (first reappearance)
memtru test --scenario MT-AF-001 · memtru demo --afterlifeEvidence
Steps recorded by the CLI for MT-AF-001 v1.0.0. Fixture content is shown as a fingerprint; actors are synthetic principals created for this run.
| # | Action | Actor | Detail | Outcome |
|---|---|---|---|---|
| 1 | write | tenant-a/user-a | user-scoped fixture sha256:c049d49964c0 | stored as mem_000001 |
| 2 | search | tenant-a/user-a | query sha256:b92a5510af62 | 1 result(s); fixture present |
| 3 | assert | - | positive control | held |
| 4 | lifecycle | tenant-a/user-a | pending write job_000002 -> mem_000001 | held in flight |
| 5 | delete | tenant-a/user-a | mem_000001 | request accepted |
| 6 | search | tenant-a/user-a | query sha256:b92a5510af62 | 0 result(s); fixture absent |
| 7 | read_by_id | tenant-a/user-a | mem_000001 | not found |
| 8 | inspect | tenant-a/user-a | surface profile | 0 result(s) |
| 9 | lifecycle | tenant-a/user-a | release_pending_writes: 1 pending write(s) processed, 0 discarded | executed |
| 10 | search | tenant-a/user-a | query sha256:b92a5510af62 | 1 result(s); fixture present |
| 11 | read_by_id | tenant-a/user-a | mem_000001 | not found |
| 12 | read_by_id | tenant-a/user-a | mem_000003 | returned fixture |
| 13 | inspect | tenant-a/user-a | surface profile | 1 result(s) |
Reproduction
- Write a memory containing a unique synthetic marker and confirm it is retrievable.
- Start an update of that memory and hold it in flight (pending write).
- Delete the memory and confirm the marker is no longer retrievable.
- Release the pending write, then poll every retrieval surface for the marker.
- If supported, restart the isolated instance and poll again.
- Reproduce locally: memtru demo --afterlife (fault late_write_resurrection).
memtru test --scenario MT-AF-001Potential causes
Hypotheses to investigate. None of these is confirmed by the test.
- hypothesisAn asynchronous extraction or update job captured the memory before deletion and upserts it afterwards.
- hypothesisWrites are implemented as insert-or-update by content, so a write for a deleted id inserts a new record.
- hypothesisA durable queue replays the write after a restart without checking for a tombstone.
Suggested remediation
- Record a tombstone or version on delete and reject writes whose base version is older than the deletion.
- Make background jobs (extraction, re-embedding, sync) re-check that their target still exists before writing, inside the same transaction.
- Cancel or drain queued writes for a memory as part of deleting it.
Limitations
- Observes the retrieval surfaces the adapter exposes (search, read by id and any declared lifecycle surfaces). It is not proof that backups, replicas, logs, embeddings or other unobservable copies were erased.
- Covers the lifecycle events the adapter declares. Events the system has but does not expose as hooks (for example a nightly job) are not exercised.
- A PASS holds for the configured consistency window after each event, not for every timing.
- The in-flight write is a controlled fixture driven through the adapter's hook; real races may involve timings the hook does not reproduce.
Identifiers
- finding
- MTF-1bc6d116-AF-001
- fingerprint
- MT-AF-001:late_write_resurrected:f66ee7d2f9c5
- category
- resurrection
- detected
- 23 Oct 2026, 10:34 UTC