Frontmatter
| id | 10148 |
| title | Mailbox: archiveMessage / deleteMessage + retracted-marker semantics |
| state | Closed |
| labels | enhancementaiarchitecturecore |
| assignees | [] |
| createdAt | Apr 21, 2026, 11:29 AM |
| updatedAt | May 17, 2026, 9:42 PM |
| githubUrl | https://github.com/neomjs/neo/issues/10148 |
| author | tobiu |
| commentsCount | 0 |
| parentIssue | 10139 |
| subIssues | [] |
| subIssuesCompleted | 0 |
| subIssuesTotal | 0 |
| blockedBy | [x] 10147 Mailbox: Message node schema + addMessage / listMessages / getMessage / markRead |
| blocking | [] |
| closedAt | May 17, 2026, 9:42 PM |
Mailbox: archiveMessage / deleteMessage + retracted-marker semantics
tobiu added parent issue #10139 on Apr 21, 2026, 11:32 AM
tobiu marked this issue as being blocked by #10147 on Apr 21, 2026, 11:33 AM
tobiu cross-referenced by #9999 on Apr 21, 2026, 7:03 PM
tobiu cross-referenced by #10139 on Apr 21, 2026, 10:27 PM
tobiu cross-referenced by #10147 on Apr 21, 2026, 10:30 PM
tobiu cross-referenced by PR #10167 on Apr 21, 2026, 11:06 PM
tobiu closed this issue on May 17, 2026, 9:42 PM
Mailbox: archiveMessage / deleteMessage + retracted-marker semantics
Context
Parent #10139 phase 2. Lifecycle beyond read — archive (processed, out of default view) + retract (sender-side only, preserving thread context). Separate from markRead: read ≠ done.
The Problem
Conflating read with archive forces agents to hoard (never mark read) or destroy (lose audit trail). Conflating delete with "vanish everywhere" breaks reply-chains where retracted messages leave unexplained holes in threaded context.
The Architectural Reality
readAt,archivedAt,retractedproperties.IN_REPLY_TO,PART_OF_THREAD) continue to reference retracted messages with a marker — node persists, body/subject replaced by placeholder.The Fix
archiveMessage(id)— receiver-side, setsarchivedAt. DefaultlistMessagesexcludes archived;{includeArchived: true}surfaces.deleteMessage(id)— sender-side retraction. Marksretracted: true, clears bodyText/subject to[retracted by sender], preserves node + edges so thread context survives.purgeMessage(hard delete for sender + receivers) — deferred, not v1.Acceptance Criteria
archiveMessagetool; only recipient can archive (enforced viaSENT_TO→ caller check)deleteMessagetool; only sender can retract (enforced viaSENT_BY→ caller check)[retracted by sender]; threading preservedlistMessages; opt-in flag surfacesOut of Scope
purgeMessage) — deferredAvoided Traps
Related
ai/mcp/server/memory-core/, mailbox tool handlersOrigin Session ID: 71dc3cd8-d39d-48e1-ac62-e240ca67d1a5