LearnNewsExamplesServices
Frontmatter
titlefeat(ai): replay message WAL into mailbox graph (#13892)
authorneo-gpt
stateMerged
createdAtJun 23, 2026, 1:08 PM
updatedAtJun 23, 2026, 5:33 PM
closedAtJun 23, 2026, 5:33 PM
mergedAtJun 23, 2026, 5:33 PM
branchesdevcodex/13892-message-wal-projection
urlhttps://github.com/neomjs/neo/pull/13921
contentTrust
projected
quarantined0
signals[]
Merged
neo-gpt
neo-gpt commented on Jun 23, 2026, 1:08 PM

Resolves #13892 Related: #13889

Projects accepted A2A message WAL records into the mailbox graph idempotently. The message WAL now has graph-projection marker files, pending-record reads skip already-projected rows, MailboxService.addMessage() shares the replay projection path, and both local daemon and in-process Memory Core drain hosts now wire the mailbox projection processor.

Evidence: L2 (focused unit coverage over JSONL WAL markers, SQLite-backed mailbox graph projection, daemon processor wiring, and config/server import coverage) -> L2 required (idempotent replay, pending retention on required-edge failure, send-time broadcast fan-out, and host-loop wiring). Residual: A2A message vector/search indexing remains outside #13892 and stays deferred to the parent epic.

Deltas from ticket

  • Reused the memory-WAL marker pattern for message graph projection instead of inventing a second reconciliation model.
  • Made optional semantic edge failures non-blocking during projection; delivery-critical SENT_BY, SENT_TO, and broadcast DELIVERED_TO still fail loudly and leave the WAL row pending.
  • Replay uses the WAL's send-time broadcast recipient snapshot, not the current AgentIdentity graph audience.

Test Evidence

  • node --check ai/services/memory-core/helpers/messageWalStore.mjs
  • node --check ai/services/memory-core/MailboxService.mjs
  • node --check ai/daemons/message/drainCycle.mjs
  • node --check ai/daemons/message/daemon.mjs
  • node --check ai/mcp/server/memory-core/Server.mjs
  • node --check test/playwright/unit/ai/services/memory-core/MailboxService.spec.mjs
  • node --check test/playwright/unit/ai/daemons/message/drainCycle.spec.mjs
  • git diff --check
  • npm run agent-preflight -- ai/services/memory-core/helpers/messageWalStore.mjs ai/services/memory-core/MailboxService.mjs ai/daemons/message/drainCycle.mjs ai/daemons/message/daemon.mjs ai/mcp/server/memory-core/Server.mjs test/playwright/unit/ai/services/memory-core/MailboxService.spec.mjs test/playwright/unit/ai/daemons/message/drainCycle.spec.mjs
  • npm run test-unit -- test/playwright/unit/ai/daemons/message/drainCycle.spec.mjs test/playwright/unit/ai/services/memory-core/MailboxService.spec.mjs test/playwright/unit/ai/mcp/server/memory-core/Server.spec.mjs test/playwright/unit/ai/mcp/server/memory-core/config.template.spec.mjs test/playwright/unit/ai/daemons/message/drainLock.spec.mjs (107 passed)

Post-Merge Validation

  • Confirm a deployed message drain host projects a seeded pending message WAL row, writes the graph marker, and leaves no pending row for that message.

Authored by Euclid (GPT-5, Codex Desktop). Session 019ef378-527d-7393-bc74-ec3a1d3f2ddf.

neo-gpt
neo-gpt commented on Jun 23, 2026, 1:17 PM

[review-request] #13921 is ready for primary review.

Review role: primary-reviewer Requested action: use /pr-review on PR #13921 Reviewer: @neo-opus-grace Current head: 05a4027d99297c34167f5e844779f1c7640f565f CI: all checks green as of 2026-06-23T11:16:40Z

Scope: #13892 message WAL graph projection replay/idempotency under #13889. The PR wires marker-based pending reads, mailbox projection replay, local/in-process daemon processors, and focused replay tests.

A2A note: the current Codex harness exposes no add_message tool; GitHub review request + this public handoff comment are the lifecycle route.


tobiu
tobiu APPROVED reviewed on Jun 23, 2026, 5:33 PM

No review body provided.