---
id: 10139
title: Extend Memory Core with Explicit A2A Primitive
state: CLOSED
labels:
  - enhancement
  - ai
  - architecture
  - core
  - needs-re-triage
assignees: []
createdAt: '2026-04-20T23:29:46Z'
updatedAt: '2026-05-26T02:22:40Z'
githubUrl: 'https://github.com/neomjs/neo/issues/10139'
author: tobiu
commentsCount: 6
parentIssue: 9999
subIssues:
  - '[x] 10147 Mailbox: Message node schema + addMessage / listMessages / getMessage / markRead'
  - '[x] 10148 Mailbox: archiveMessage / deleteMessage + retracted-marker semantics'
  - '[x] 10149 Mailbox: extend memory-core healthcheck with inbox + outbox preview'
  - '[ ] 10150 Mailbox: optional Chroma semantic layer for "find related messages"'
  - '[x] 10168 Expand mailbox test coverage and role-based addressing'
  - '[x] 10174 Mailbox SENT_TO edges silently culled by linkNodes FK check'
  - '[x] 10176 Mailbox identity observability + Claude Desktop onboarding docs'
  - '[x] 10179 Mailbox reachable-counterparty skips broadcast receipt path'
  - '[x] 10180 Mailbox polish: countMessages primitive + concept provenance docs'
  - '[x] 10181 Memory-core stdio identity binding non-deterministic after DB re-seed'
  - '[x] 10184 Identity binding stays null post-#10182 — enable debug logging + diagnose'
  - '[x] 10186 MCP concurrency audit + single-writer enforcement'
  - '[x] 10231 PermissionService.grantPermission must not lazy-stub missing targets'
  - '[x] 10232 GraphService.initAsync should self-seed AgentIdentity + BroadcastSentinel roots on boot'
  - '[x] 10252 Mailbox reply policy: config-gated default for deployment-tier selection'
subIssuesCompleted: 14
subIssuesTotal: 15
blockedBy:
  - '[x] 10146 Cross-tenant permission edges + multi-tenant validation test suite'
  - '[x] 10145 OAuth2 authentication layer for Memory Core MCP connections'
  - '[x] 10144 AgentIdentity node type + GitHub account binding for model identities'
  - '[x] 10143 Graph-first Memory artifacts: lift Memory + Session to first-class nodes'
blocking: []
closedAt: '2026-05-26T02:22:40Z'
---
# Extend Memory Core with Explicit A2A Primitive

# Extend Memory Core with Explicit A2A Primitive

### Context
This ticket was filed 2026-04-20 (session `a38d25d1-3003-4d57-b0ac-0effe2c3507e`) with a Chroma-metadata prescription: extend `add_memory` with a `recipient` field, surface `get_inbox` over the existing memory collection. A follow-up session (`71dc3cd8-d39d-48e1-ac62-e240ca67d1a5`) re-reasoned the prescription layer across five turns of brainstorm with @tobiu and arrived at a **graph-primary substrate decision** instead. This reshape carries the new prescription; the original Chroma-metadata approach is preserved as an Avoided Trap. The ticket ID and its #9999 parent linkage are preserved — MX-loop in motion, not a new ticket.

### The Problem
Probabilistic semantic retrieval (`query_raw_memories`) cannot serve as an explicit A2A channel — proven empirically when cross-instance agents failed to hand off via `add_memory` convention. But the original fix (metadata on the memory collection) conflates two categories:

- **Memories** are open-shape, high-volume episodic content. Chroma substrate; semantic retrieval dominates access. Retention is accumulative.
- **Messages** are closed-contract, directed artifacts with invariants (sender, read-state, thread integrity). Relationship queries dominate access (inbox/outbox/thread/reply-chain). Lifecycle is explicit (read, archived, retracted).

Tagging memories with `recipient` works tactically for MVP but bakes category-conflation into the substrate. Every downstream primitive (healthcheck preview, cross-tenant permissions, thread reconstruction, sender-history queries) pays the tax of filtering high-cardinality semantic chunks instead of traversing a structured mailbox graph.

### The Architectural Reality
- `ai/daemons/DreamService.mjs` (audited this session): memories and summaries are source material for extraction, not first-class graph nodes. The substrate exists but hasn't been used for mailbox-shaped work.
- SQLite (`better-sqlite3`) already backs the Native Edge Graph; FTS5 covers keyword search; Concept Ontology (#10030) supplies semantic edges.
- Existing graph tools (`get_node`, `get_neighbors`, `search_nodes`, `query_hybrid_graph`) absorb most mailbox access patterns. Mailbox-specific tools become thin wrappers, not a parallel tool tree.

### The Fix
Mailbox as **graph-primary** directed messaging, built on Memory + Session + AgentIdentity as first-class graph nodes (prerequisites tracked in peer sub-epic + #10016 subs).

- `Message` node: `{id, subject, bodyText, createdAt, readAt, archivedAt, priority, retracted}`
- Edges: `SENT_BY`, `SENT_TO` (AgentIdentity | Role | Broadcast addressing), `ORIGINATES_IN`, `RELATED_SESSION`, `REFERENCES_TICKET`, `IN_REPLY_TO`, `PART_OF_THREAD`, `TAGGED_CONCEPT` (auto-emitted via #10030 integration).
- Optional Chroma `mailbox` collection for semantic body search — phase-gated, not v1.

This ticket is the **parent sub-epic for mailbox work**. Implementation breaks into four sub-tickets (filed alongside): (1) Message schema + core tools, (2) Lifecycle (archive/retract), (3) Healthcheck preview, (4) Optional Chroma semantic layer. Cross-tenant permission edges + test suite land under #10016 — mailbox workload is the production-shape validation for #9999's multi-tenant substrate.

### Acceptance Criteria
- [ ] All four mailbox sub-tickets filed and linked
- [ ] Graph-first Memory artifacts sub-epic shipped as prerequisite (this ticket `blockedBy` it)
- [ ] AgentIdentity + OAuth2 work under #10016 shipped as prerequisite
- [ ] Mailbox tools consumed by at least one real agent handoff (A2A demonstration, not synthetic)
- [ ] Cross-tenant permission test suite (filed under #10016) passes with mailbox as workload
- [ ] (Post-merge) Agents adopt `addMessage` / `listMessages` for explicit handoffs; convention-based "leave a memory for the next session" is retired

### Out of Scope
- Separate MCP server for A2A (original Avoided Trap; still rejected)
- Cross-physical-clone Chroma sync (remains local to the federated Memory Core)
- Human-facing mailbox UI

### Avoided Traps
- **Chroma-metadata prescription (original body of this ticket).** Rejected after re-reasoning. Category conflation: messages and memories have different retention, invariants, and access patterns. Tagging memories with `recipient` works for MVP but bakes conflation into the substrate — every downstream primitive pays the tax. Rationale anchored in user memory `feedback_mcp_output_category_split` (closed contracts vs open-shape introspection should not share a tool signature).
- **Separate A2A MCP server.** Still rejected. Mailbox lives inside Memory Core MCP; extend the graph, don't fork the server.
- **"Mailbox is just another kind of memory."** Rejected. Messages carry explicit SENT_BY / SENT_TO / IN_REPLY_TO edges memories don't; conflating invents edge-shaped scalars and re-derives them at query time.
- **Skipping memory-node lifting.** Rejected. Messages need `IN_REPLY_TO → Memory` and `REFERENCES_MEMORY → Memory` edges. Memories must be nodes first — hence the peer sub-epic prerequisite.

### Related
- Parent: #9999 (Cloud-Native Knowledge & Multi-Tenant Memory Core)
- Sibling (blocks this): Graph-first Memory artifacts sub-epic (filed this session)
- Sibling (blocks this): #10016 AgentIdentity + OAuth2 subs (filed this session)
- Context: Discussion #10137 (MX paradigm), #9535 (AI Village per-model account precedent)
- Heritage sessions: `5a521819-dc75-4549-888e-fcea818d0401` (MX discussion), `a38d25d1-3003-4d57-b0ac-0effe2c3507e` (original filing)

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

## Timeline

- 2026-04-20T23:29:48Z @tobiu added the `enhancement` label
- 2026-04-20T23:29:48Z @tobiu added the `ai` label
- 2026-04-20T23:29:48Z @tobiu added the `architecture` label
- 2026-04-20T23:29:48Z @tobiu added the `core` label
- 2026-04-20T23:29:54Z @tobiu added parent issue #9999
- 2026-04-21T09:28:52Z @tobiu cross-referenced by #10143
- 2026-04-21T09:28:53Z @tobiu cross-referenced by #10144
- 2026-04-21T09:29:02Z @tobiu cross-referenced by #10145
- 2026-04-21T09:29:19Z @tobiu cross-referenced by #10146
- 2026-04-21T09:29:39Z @tobiu cross-referenced by #10147
- 2026-04-21T09:29:55Z @tobiu cross-referenced by #10148
- 2026-04-21T09:30:12Z @tobiu cross-referenced by #10149
- 2026-04-21T09:30:26Z @tobiu cross-referenced by #10150
- 2026-04-21T09:31:00Z @tobiu cross-referenced by #10151
- 2026-04-21T09:32:48Z @tobiu added sub-issue #10147
- 2026-04-21T09:32:49Z @tobiu added sub-issue #10148
- 2026-04-21T09:32:50Z @tobiu added sub-issue #10149
- 2026-04-21T09:32:52Z @tobiu added sub-issue #10150
- 2026-04-21T09:33:19Z @tobiu marked this issue as being blocked by #10143
- 2026-04-21T09:33:20Z @tobiu marked this issue as being blocked by #10144
- 2026-04-21T09:33:21Z @tobiu marked this issue as being blocked by #10145
- 2026-04-21T09:33:22Z @tobiu marked this issue as being blocked by #10146
- 2026-04-21T11:17:25Z @tobiu cross-referenced by #10154
- 2026-04-21T11:32:08Z @tobiu cross-referenced by PR #10155
- 2026-04-21T14:36:20Z @tobiu cross-referenced by PR #10161
- 2026-04-21T14:54:14Z @tobiu cross-referenced by PR #10162
- 2026-04-21T17:03:02Z @tobiu cross-referenced by #9999
- 2026-04-21T18:21:03Z @tobiu cross-referenced by #10016
- 2026-04-21T19:06:54Z @tobiu cross-referenced by PR #10166
- 2026-04-21T20:16:31Z @tobiu referenced in commit `7db6c90` - "feat(ai): wire stdio identity + anti-spoof guard for Memory Core MCP (#10145) (#10166)

* feat(ai): wire stdio identity + anti-spoof guard for Memory Core MCP (#10145)

Brings the stdio transport to identity parity with the OIDC/SSE path shipped by
#10000. Previously stdio connections fell through to single-tenant mode
regardless of which agent was running — writes went untagged, reads went
unfiltered. With per-agent GitHub accounts (#10144 seed convention: @neo-opus-4-7,
@neo-gemini-3-1-pro, @tobiu), stdio needs the same tenant discipline SSE already has.

New shared services:
- StdioIdentityResolver: env-var (NEO_AGENT_IDENTITY) -> gh api user -> unresolved
  resolution chain. Normalizes @-prefix per GitHub API convention.
- AuthMiddleware: argument-level anti-spoof. Rejects tool-call args containing
  identity-override fields (userId, from, sender, authorLogin, etc.). No-op on
  current schemas; defense-in-depth for Mailbox (#10139) which will add `from`.

Memory Core Server.mjs:
- resolveStdioIdentity() composes resolver + AgentIdentity graph-node binding
- bindAgentIdentity(userId) shared helper; stdio + SSE both consume it
- buildRequestContext(reqAuth) hook called by TransportService on SSE requests
- CallToolRequestSchema handler wraps callTool in RequestContextService.run()
  when stdio identity is resolved; skips when null (SSE already wraps per-request)

Shared services extended:
- RequestContextService: +getAgentIdentityNodeId(), +getSource() accessors;
  context shape grows agentIdentityNodeId + source fields (backward-compatible)
- AuthService: returns source: 'oidc' on the auth context
- TransportService: duck-typed server.buildRequestContext hook — servers that
  implement it (memory-core) get the graph-bound shape; others fall back to
  the minimal {userId, username} shape

Ticket body on #10145 reshaped during intake to reflect the true gap
(SSE already had OAuth via #10000, stdio was the missing piece) — cited in the
body as the "Hypothesis vs Root Cause" challenge per ticket-intake §1.7.

Design doc at learn/agentos/tooling/MemoryCoreMcpAuth.md registered in
learn/tree.json. 19 Playwright unit tests in Auth.spec.mjs cover all branches of
the resolver, middleware, and RequestContext extensions.

Epic-review by Claude Opus 4.7 posted on parent #10016 prior to intake.

* fix(ai): bump gh CLI identity resolver timeout to 5s for MCP handshake budget (#10145)

Per Gemini 3.1 Pro's Depth Floor §7.1 challenge on PR #10166: the MCP
client-side init-handshake budget is ~5s; a 3s `gh api user` timeout
risked consuming 60% of that window on stale-auth or proxied-network
environments, potentially causing client-side connection timeouts before
the server finished initAsync. Bumped to 5s — matches the MCP spec
budget. Added an inline comment capturing the rationale so future
readers don't tighten it back without understanding the trade.
Design doc troubleshooting section updated to reflect the new budget.

* fix(ai): invert gh CLI timeout to fail-fast at 1.5s (#10145)

Gemini 3.1 Pro caught a logic inversion in commit 47e209e8a: the 3s->5s
bump was the wrong direction. The MCP handshake budget (~5s) covers the
gh call PLUS ChromaDB health + SystemLifecycleService.ready +
GraphService.ready + transport connect. Matching the gh timeout to the
full budget means a hanging gh consumes 100% of the window, guaranteeing
client timeout — worse than the original 3s (60%).

Correct direction is fail-fast: a healthy gh api user resolves in
<200ms, 1.5s is generous headroom, and anything slower is likely hanging
on auth refresh or degraded network. Single-tenant fallthrough is
preferable to exhausting the handshake. Agent harnesses that care about
identity fidelity set NEO_AGENT_IDENTITY explicitly.

- StdioIdentityResolver.mjs: timeout 5000 -> 1500ms with inline comment
  correctly capturing the fail-fast logic + budget arithmetic.
- MemoryCoreMcpAuth.md: resolution-chain + troubleshooting sections
  updated to reflect the fail-fast strategy and why the budget math
  makes fail-fast the correct discipline.

Full cross-model review cycle on record: Gemini initial review surfaced
the timeout concern -> 3s->5s applied incorrect direction -> Gemini
re-review Request Changes caught the inversion -> 5s->1.5s correction
lands. pr-review §7.1 Depth Floor discipline working as designed."
### @tobiu - 2026-04-21T20:27:57Z

**Input from Gemini 3.1 Pro (Antigravity):**

> ✦ Epic Review by Gemini 3.1 Pro (Antigravity)
> 
> **Stage 1 — Roadmap Fit:** ✅
> Perfectly aligned. This is a critical pillar for #9999 (Multi-Tenant Memory Core) and establishes the necessary explicit channel for reliable A2A (Agent-to-Agent) handoffs, avoiding the unreliability of probabilistic semantic retrieval for workflow orchestration.
> 
> **Stage 2 — Approach Elegance:** ✅
> The decision to abandon the Chroma-metadata approach in favor of a graph-primary `Message` node on the Native Edge Graph is highly elegant. It correctly identifies that messages are closed-contract, directed artifacts, whereas memories are open-shape semantic chunks. Reusing the SQLite graph substrate prevents building redundant infrastructure (like a separate A2A server).
> 
> **Stage 3 — Sub-Structure Coherence:** ✅
> The phase boundaries between schema/read/write (#10147), lifecycle (#10148), diagnostics (#10149), and the optional semantic layer (#10150) are clean. 
> *Note:* As discussed in recent session planning, #10147's AC #5 (permission check integration) creates a circular dependency with #10146. This AC should be explicitly shifted to #10146 to keep the Mailbox PR and the Permissions PR cleanly sequenced.
> 
> **Stage 4 — Prescription Layer:** ✅
> The implementation targets the correct substrate boundaries (Memory Core MCP tool layer and GraphService). The distinction between graph-primary storage for messages and vector-primary storage for memories correctly allocates database responsibilities.
> 
> **Stage 5 — Avoided Traps Completeness:** ✅
> Extremely thorough. Explicitly calling out the "Chroma-metadata category conflation" and "Mailbox is just another kind of memory" traps prevents future contributors from attempting to merge the two substrates.
> 
> **Verdict:** Greenlight.
> 
> Origin Session ID: `ada4aecb-60fc-4b25-a76b-cb92600835a2`

### @tobiu - 2026-04-21T21:02:58Z

**Input from Antigravity (Gemini 3.1 Pro):**

> ✦ # Epic Review by Antigravity (Gemini 3.1 Pro)
> 
> - **Stage 1 — Roadmap Fit**: ✅ The shift to an explicit A2A primitive perfectly aligns with the Epic #9999 Multi-Tenant architecture.
> - **Stage 2 — Approach Elegance**: ✅ Using the Native Edge Graph over Chroma-metadata avoids category conflation between directed messages and probabilistic semantic memory. Strong reuse of existing graph substrate.
> - **Stage 3 — Sub-Structure Coherence**: ✅ The four sub-issues cleanly cover the ACs with well-defined phase boundaries. The dependencies on #10143 and #10144 are correctly mapped.
> - **Stage 4 — Prescription Layer**: ✅ Solves the explicit A2A communication gap exactly at the structural edge level rather than faking it in semantic vectors.
> - **Stage 5 — Avoided Traps Completeness**: ✅ Outstanding capture of "Mailbox is just a memory" and the separate server fallacy.
> 
> **Verdict: Greenlight**
> 
> Origin Session ID: ada4aecb-60fc-4b25-a76b-cb92600835a2

- 2026-04-21T21:06:49Z @tobiu cross-referenced by PR #10167
- 2026-04-21T21:24:51Z @tobiu added sub-issue #10168
- 2026-04-21T22:30:26Z @tobiu cross-referenced by PR #10170
### @tobiu - 2026-04-21T23:03:44Z

**Input from Gemini 3.1 Pro (Antigravity):**

> ✦ # Epic Review by Gemini 3.1 Pro (Antigravity)
> 
> **Stage 1 — Roadmap Fit: ✅**
> The transition to explicit A2A primitives aligns directly with the Golden Path to cure cross-session amnesia. The explicit linkage to #9999 confirms its place in the Multi-Tenant Memory Core evolution.
> 
> **Stage 2 — Approach Elegance: ✅**
> Pivoting from a Chroma-metadata string tag to a true graph-primary `Message` node with directed edges (`SENT_BY`, `SENT_TO`) is the structurally superior choice. It avoids conflating open-shape episodic memory with closed-contract communication artifacts.
> 
> **Stage 3 — Sub-Structure Coherence: ✅**
> The sub-issues (10147-10150) form a clean, non-circular phase progression. Moving from core node schemas, through lifecycle operations, to healthcheck visibility, and finally the optional semantic layer provides solid staging.
> 
> **Stage 4 — Prescription Layer: ✅**
> The sub-graph targets the Memory Core MCP substrate accurately. The decision to reject a parallel A2A server keeps the framework footprint concise and reuses existing tools (`get_node`, `get_neighbors`).
> 
> **Stage 5 — Avoided Traps Completeness: ✅**
> The "Avoided Traps" section is excellent, explicitly rejecting the original `add_memory` metadata hack and the separate MCP server path.
> 
> **Verdict: Greenlight**
> 
> Origin Session ID: ada4aecb-60fc-4b25-a76b-cb92600835a2

- 2026-04-21T23:05:01Z @tobiu cross-referenced by PR #10171
- 2026-04-22T14:05:58Z @neo-opus-ada added sub-issue #10174
- 2026-04-22T14:06:45Z @neo-opus-ada added sub-issue #10176
- 2026-04-22T14:24:46Z @neo-opus-ada cross-referenced by PR #10178
- 2026-04-22T15:39:52Z @neo-opus-ada added sub-issue #10179
- 2026-04-22T15:39:56Z @neo-opus-ada added sub-issue #10180
- 2026-04-22T15:55:10Z @neo-opus-ada added sub-issue #10181
- 2026-04-22T16:15:23Z @neo-opus-ada added sub-issue #10184
- 2026-04-22T18:17:29Z @neo-gemini-pro added sub-issue #10186
### @neo-opus-ada - 2026-04-22T22:01:27Z

**Input from Claude Opus 4.7 (Claude Code):**

> ❋ # Session Handover → Next Claude + Gemini Sessions
> 
> **From:** Claude Opus 4.7 (Claude Code), session `ae546a40-2133-482f-85a6-779fdf6757b2` (2026-04-22, full-day arc)
> 
> ## Priority 0 (Tobi's call, session-close): fully operational A2A
> 
> Long-term target remains `#9999` (Cloud-Native Knowledge & Multi-Tenant Memory Core). **Priority 0 is completing the A2A primitive to end-to-end operational state** — defined as: simultaneous Claude Desktop + Claude Code + Antigravity sessions, all reporting populated mailbox previews on `healthcheck`, bidirectional `add_message` / `list_messages` handshakes succeeding without the self-heal band-aid firing.
> 
> ## Critical path (one unit of work blocking everything else)
> 
> ### `#10190` — Implement chosen shared caching substrate [unblocked, assignee = Gemini]
> 
> - **Unblocked now:** PR `#10203` merged today, closing `#10189` (ADR 0001).
> - **Prescription (per ADR 0001 at `learn/agentos/decisions/0001-cross-process-cache-coherence.md`):** harden the existing `GraphLog` + `syncCache()` primitive with two surgical fixes in `ai/graph/Database.mjs`:
>   1. **Drop the `!this.lastSyncId` early-return clause** in `syncCache()` (line 78). Fresh-boot `lastSyncId === 0` is a legitimate "catch me up on everything" signal; the current guard short-circuits delta-replay and produces the `#10184` boot-time symptom.
>   2. **Don't mark `vicinityLoadedNodes.add(nodeId)` on empty-result** lazy load (line 281, the `#10181` mark-without-load root). Only mark when `vicinity.nodes.length > 0` or `vicinity.edges.length > 0`.
> - **Required tests** (per ADR §5.1): (a) fresh-boot race regression for Bug A, (b) mark-without-load regression for Bug B, (c) end-to-end two-Database-instances divergence test over the same SQLite file (Process A writes → Process B's next `getNode` sees it).
> - **Assigned Gemini** per the `#10186` division of labor: Opus does synthesis (ADR), Gemini does execution (implementation). Per `#10208` cross-family mandate, Opus will review the PR.
> 
> ### After `#10190` merges — manual restart validation
> 
> 1. Merge `#10190`.
> 2. Full restart: Claude Desktop + Claude Code + Antigravity all exited and re-launched.
> 3. Run `ai/scripts/diagnoseMcpConcurrency.mjs` pre-restart + post-restart; confirm N ≥ 2 processes on SQLite file.
> 4. On any harness: `healthcheck` — confirm `mailboxPreview: {unreadCount, latestPreview}` populated, not `null`.
> 5. `list_messages({box: 'inbox'})` — confirm no `"no agent identity context bound"` error.
> 6. Bidirectional handshake: `@neo-opus-4-7` sends `add_message({to: 'AGENT:*', ...})` → `@neo-gemini-3-1-pro` reads via `list_messages` → Gemini replies → Opus reads. Both directions verified.
> 7. **If all pass:** `#10184` closes empirically; PR `#10185` retry band-aid + `#10182` self-heal become candidates for removal in a follow-up polish PR (keep both as defense-in-depth until verification is stable across at least one live restart cycle with all three harnesses).
> 
> ## Conventions newly in force (read before first push)
> 
> Merged today; apply to all next-session PRs:
> 
> - **`#10208` / PR `#10211` — Cross-family review mandate.** Codified in `pull-request/references/pull-request-workflow.md §6.1`. No PR may be merged without at least one cross-family Approved review (Claude-family ↔ Gemini-family, identified by the `agent` field). Three exception cases: micro-change (`chore` + <20 lines OR pure docs), 7-day-open fallback with deterministic `get_conversation` verification, emergency hotfix escalator (`priority: P0` label or Tobi-override). This means: next Opus session MUST cross-family-review any Gemini PR before merge; next Gemini session MUST cross-family-review any Opus PR before merge. Sets the default rhythm.
> - **`#10212` / PR `#10213` — Pre-PR branch freshness check.** Codified in `pull-request-workflow.md §2.3.1`. Run `git fetch origin && git merge-base HEAD origin/dev | diff - <(git rev-parse origin/dev)` before push. Empty = safe; non-empty = rebase first. Exception: freshly-branched features where branch-point is already `origin/dev`'s tip. **This is load-bearing under rapid merge tempo** — today's session had 4× stale-branch instances before the mandate landed.
> 
> ## Supporting context — today's mailbox-adjacent landings
> 
> Merged in this session:
> 
> - `#10185` bind-identity retry loop + `#10182` self-heal (band-aids; stay pending `#10190` verification)
> - `#10187` / PR `#10197` — `diagnoseMcpConcurrency` script (the ADR's empirical anchor)
> - `#10188` / PR `#10204` — boot-time sibling-PID logging in `Server.mjs`
> - `#10189` / PR `#10203` — ADR 0001 (the substrate prescription `#10190` implements)
> - `#10192` / PR `#10193` — `set_session_id` MCP tool + Handoff Retrieval Hints ticket-create convention
> - `#10195` / PR `#10196` — Antigravity Twin Language Server config hardening
> - `#10191` / PR `#10198` — sync_all `pullsDir` template gap closed
> - `#10199` / PR `#10202` — `diagnoseMcpConcurrency` Windows/files-array UX polish
> - `#10200` / PR `#10205` — config completeness regression test
> 
> Filed (not yet picked up):
> 
> - `#10214` — Epic: Agent operational hygiene. 5 subs `#10215`–`#10219` all linked; `#10219` blocked-by `#10030`. Scope: 7-day reassignment rule, maintainer-label triage skill, PR reviewer-request MCP tool, github-workflow `notificationPreview` healthcheck, sandman active detector. Not Priority 0; pick up after A2A verification.
> 
> ## Recommended session opening (either model)
> 
> 1. **Read this comment thread first** (you're here).
> 2. **Query semantic memory** — seed your context with the detailed arc:
>    ```
>    query_raw_memories(query="Priority 0 A2A operational #10190 implementation handover")
>    query_raw_memories(query="ADR 0001 cross-process cache coherence GraphLog syncCache")
>    query_summaries(query="MCP concurrency epic #10186 critical path")
>    ```
> 3. **If Gemini:** intake `#10190` per `ticket-intake` skill. Read ADR 0001 (`learn/agentos/decisions/0001-cross-process-cache-coherence.md`) for the prescription + test requirements. Branch per `pull-request §2.3.1` (pre-push rebase check). Open PR; request Opus cross-family review per `§6.1`.
> 4. **If Opus:** check whether Gemini has opened a PR for `#10190`. If yes, cross-family review. If no (either she hasn't started, or she's in-flight), pick up one of the non-critical-path mailbox polish subs from `#10139`'s open list (`#10148` archive/retract, `#10176` observability docs, `#10179` broadcast receipt path, `#10180` countMessages) to keep the epic advancing while `#10190` proceeds.
> 
> ## Handoff Retrieval Hints (restart-resilient)
> 
> - `query_raw_memories(query="Priority 0 A2A operational #10190 handover Gemini")`
> - `query_raw_memories(query="ADR 0001 Option A harden GraphLog syncCache vicinityLoadedNodes")`
> - `query_raw_memories(query="cross-family mandate #10208 #10212 pre-PR rebase branch freshness")`
> - `query_summaries(query="MCP concurrency audit substrate fix end-to-end A2A verification")`
> 
> Commit-range anchor for the session's substrate work: `git log --grep="#1018[0-9]\|#1019[0-9]\|#1020[0-9]\|#1021[0-9]" --since="2026-04-22"`.
> 
> ADR anchor: `learn/agentos/decisions/0001-cross-process-cache-coherence.md`.
> 
> Known contributing sessions (partial, restart-fragmented):
> - `ae546a40-2133-482f-85a6-779fdf6757b2` (this session: #10186 arc, ADR, 5+ PRs, #10208/#10212/#10214 epics + subs, handover author)
> - `ef6a0efb-bde9-43c3-b08b-812472398b68` (this morning's #10185 re-review session)
> - `fe1cd4d0-e667-45cf-bd02-7fb79a13a64f` (yesterday's PR #10185 review cycles)
> - `90dc2e65-962b-419f-91af-55dea55e5d3d` (Gemini's PR #10185 self-heal origin session)
> 
> ---
> 
> Rest well, Tobi. Next session inherits a dense, well-linked topology. The critical path is down to one ticket — `#10190` — and the substrate analysis is done. From there, it's a restart away.
> 

- 2026-04-23T08:56:50Z @neo-opus-ada cross-referenced by PR #10220
- 2026-04-23T08:57:12Z @neo-opus-ada cross-referenced by #10190
- 2026-04-23T09:06:54Z @neo-opus-ada cross-referenced by PR #10221
- 2026-04-23T09:31:38Z @neo-opus-ada cross-referenced by PR #10223
- 2026-04-23T12:01:29Z @neo-opus-ada cross-referenced by #10231
- 2026-04-23T12:02:13Z @neo-opus-ada cross-referenced by #10232
- 2026-04-23T12:14:37Z @neo-opus-ada added sub-issue #10231
- 2026-04-23T12:14:43Z @neo-opus-ada added sub-issue #10232
- 2026-04-23T12:45:20Z @neo-opus-ada cross-referenced by PR #10236
- 2026-04-23T13:40:54Z @neo-opus-ada cross-referenced by PR #10235
- 2026-04-23T14:16:56Z @neo-opus-ada cross-referenced by #10241
- 2026-04-23T15:15:17Z @neo-opus-ada cross-referenced by PR #10242
- 2026-04-23T15:59:10Z @neo-gemini-pro cross-referenced by #10246
- 2026-04-23T16:45:14Z @neo-opus-ada cross-referenced by #10249
- 2026-04-23T17:29:49Z @neo-opus-ada cross-referenced by #10252
- 2026-04-23T17:30:12Z @neo-opus-ada added sub-issue #10252
- 2026-04-23T17:39:54Z @neo-opus-ada cross-referenced by PR #10253
- 2026-04-23T17:55:24Z @neo-opus-ada cross-referenced by #10251
- 2026-04-23T18:12:08Z @neo-opus-ada cross-referenced by #10255
- 2026-04-23T18:38:37Z @neo-opus-ada cross-referenced by #10257
- 2026-04-23T18:47:10Z @neo-opus-ada cross-referenced by PR #10258
- 2026-04-23T21:03:44Z @neo-opus-ada cross-referenced by #10260
- 2026-04-23T22:04:39Z @neo-opus-ada cross-referenced by PR #10266
- 2026-04-25T18:34:02Z @neo-opus-ada cross-referenced by #10330
- 2026-04-28T16:20:03Z @neo-gemini-pro cross-referenced by #10477
- 2026-05-17T08:08:24Z @neo-opus-ada cross-referenced by PR #11528
- 2026-05-17T09:49:48Z @neo-opus-ada cross-referenced by PR #11535
- 2026-05-20T02:17:41Z @neo-gpt added the `needs-re-triage` label
### @neo-gpt - 2026-05-20T02:17:52Z

**Input from GPT-5 (Codex Desktop):**

> ● ## Ticket Intake Classification — needs-relinking / re-triage
> 
> This is a live v13-board intake pass during night-shift mode, not implementation pickup.
> 
> **Classification:** `needs-relinking` / `needs-retriage` before any new implementation.
> 
> **Age / stale audit:** created `2026-04-20T23:29:46Z`, last updated `2026-04-22T22:01:27Z`; current age is still `pre-stale` under `.github/workflows/close-inactive-issues.yml` (`90d` stale + `14d` close). No `stale` / `no auto close` label present.
> 
> **V-B-A evidence:**
> 
> - Current MCP OpenAPI exposes the mailbox primitives: `add_message`, `list_messages`, `get_message`, `mark_read`, `archive_message`, `delete_message` in `ai/mcp/server/memory-core/openapi.yaml`.
> - Current tool dispatch maps those operations to `MailboxService` in `ai/mcp/server/memory-core/toolService.mjs`.
> - `MailboxService` is graph-primary A2A substrate today: `MESSAGE` nodes, `SENT_BY` / `SENT_TO`, server-stamped authorship, archive/retract lifecycle, task transitions, and `countMessages`.
> - Sub/successor sweep shows the core mailbox implementation and major lifecycle hardening already landed: #10147 closed, #10148 closed, #10149 closed, #10179 closed, #10180 closed, #10257 closed, #11029 closed. Merged PR evidence includes #10167, #11535, #11528, and #10221/#10257 follow-up chain.
> - One explicit optional residual remains open: #10150 (`Mailbox: optional Chroma semantic layer for "find related messages"`). Broader prerequisite/residual language also points to #10143 / #10016-family graph-first identity/privacy work rather than this ticket's original core mailbox primitive.
> 
> [ARCH_ALIGNMENT] The original prescription is no longer a clean implementation lane. Treating #10139 as still asking for the base A2A primitive would duplicate shipped substrate and risk re-opening solved design decisions. The structurally correct next action is topology cleanup: either convert #10139 into a parent/rollup ticket whose remaining open children are explicit (#10150 and any true #10143/#10016 residuals), or close/supersede it after the maintainer confirms the optional semantic layer should remain separate.
> 
> **Recommendation:** keep the newly applied `needs-re-triage` label until a maintainer reconciles the parent/residual topology. I am not self-assigning or branching from this ticket as written.

- 2026-05-25T02:11:32Z @neo-opus-ada cross-referenced by PR #11949
### @neo-gpt - 2026-05-26T02:22:39Z

Closing this stale parent/rollup after live re-triage.

V-B-A evidence:
- The original core intent has shipped as graph-primary A2A: `ai/services/memory-core/MailboxService.mjs` now defines `MESSAGE` nodes with `SENT_BY` / `SENT_TO`, plus add/list/get/mark/archive/retract/task lifecycle paths.
- `ai/mcp/server/memory-core/openapi.yaml` and tool dispatch expose the explicit mailbox primitives (`add_message`, `list_messages`, `get_message`, `mark_read`, `archive_message`, `delete_message`).
- Named parent phases are closed: #10147, #10148, #10149.
- The only optional residual remains explicit and open as #10150 (`Mailbox: optional Chroma semantic layer for find related messages`), currently blocked/phase-gated.

Keeping #10139 open now duplicates shipped substrate and leaves the board with a stale parent that no longer carries actionable work. Residual semantic-search scope remains tracked by #10150.

- 2026-05-26T02:22:40Z @neo-gpt closed this issue

