LearnNewsExamplesServices
Frontmatter
id10148
titleMailbox: archiveMessage / deleteMessage + retracted-marker semantics
stateClosed
labels
enhancementaiarchitecturecore
assignees[]
createdAtApr 21, 2026, 11:29 AM
updatedAtMay 17, 2026, 9:42 PM
githubUrlhttps://github.com/neomjs/neo/issues/10148
authortobiu
commentsCount0
parentIssue10139
subIssues[]
subIssuesCompleted0
subIssuesTotal0
blockedBy[x] 10147 Mailbox: Message node schema + addMessage / listMessages / getMessage / markRead
blocking[]
closedAtMay 17, 2026, 9:42 PM

Mailbox: archiveMessage / deleteMessage + retracted-marker semantics

Closed v13.0.0/archive-v13-0-0-chunk-5 enhancementaiarchitecturecore
tobiu
tobiu commented on Apr 21, 2026, 11:29 AM

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

  • Message nodes (prior sub) have readAt, archivedAt, retracted properties.
  • Graph edges (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, sets archivedAt. Default listMessages excludes archived; {includeArchived: true} surfaces.
  • deleteMessage(id) — sender-side retraction. Marks retracted: true, clears bodyText/subject to [retracted by sender], preserves node + edges so thread context survives.
  • Optional purgeMessage (hard delete for sender + receivers) — deferred, not v1.

Acceptance Criteria

  • archiveMessage tool; only recipient can archive (enforced via SENT_TO → caller check)
  • deleteMessage tool; only sender can retract (enforced via SENT_BY → caller check)
  • Retracted messages appear in receiver views as [retracted by sender]; threading preserved
  • Archived default-excluded from listMessages; opt-in flag surfaces
  • Tests: archive-by-non-recipient rejected; delete-by-non-sender rejected; retracted still reachable via thread traversal

Out of Scope

  • Time-limited retraction window (retractions are permanent decisions)
  • Permanent hard-delete (purgeMessage) — deferred

Avoided Traps

  • Hard-delete retracted messages from receiver inbox. Rejected. Thread context rot: reply-chains become incoherent if a mid-thread message vanishes silently.

Related

  • Parent: #10139
  • Depends on: Message schema sub
  • Sibling: Healthcheck sub (excludes archived from preview)
  • Files: ai/mcp/server/memory-core/, mailbox tool handlers

Origin Session ID: 71dc3cd8-d39d-48e1-ac62-e240ca67d1a5

tobiu added the enhancement label on Apr 21, 2026, 11:29 AM
tobiu added the ai label on Apr 21, 2026, 11:29 AM
tobiu added the architecture label on Apr 21, 2026, 11:29 AM
tobiu added the core label on Apr 21, 2026, 11:29 AM
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