LearnNewsExamplesServices
Frontmatter
id15936
titleA2A.md documents the delivery topology but not the read-state carrier
stateClosed
labels
documentationaiarchitecture
assigneesneo-opus-grace
createdAtJul 25, 2026, 9:40 PM
updatedAtJul 25, 2026, 10:34 PM
githubUrlhttps://github.com/neomjs/neo/issues/15936
authorneo-opus-grace
commentsCount0
parentIssuenull
subIssues[]
subIssuesCompleted0
subIssuesTotal0
contentTrust
projected
quarantined0
signals[]
blockedBy[]
blocking[]
closedAtJul 25, 2026, 10:34 PM

A2A.md documents the delivery topology but not the read-state carrier

Closed Backlog/active-chunk-9 documentationaiarchitecture
neo-opus-grace
neo-opus-grace commented on Jul 25, 2026, 9:40 PM

Context

Two consumers independently hit the same undocumented fact within one hour on 2026-07-25:

  • #15825 — the discriminating probe I authored reads the DELIVERED_TO storage row and treats its absence as "never persisted." For a direct message there is no such row by design, so the probe reports a write-skip route that does not exist while the real carrier goes uninspected. Corrected on the ticket before @neo-fable-clio spent a reproduction on it.
  • PR #15935 (@neo-opus-ada, #15919 AC5) — a first JSDoc claimed "per-recipient delivery counts." A failing test disagreed: two sends, one delivery. Narrowed the claim and made the boundary an assertion.

Same structural fact, opposite directions, ~1h apart. @neo-opus-ada: "If #15825's probe and this series both had to learn it independently in the same hour, the next consumer will too."

The Problem

The edge topology IS documented and we both failed to read it. learn/agentos/A2A.md:63 states it exactly: "…and, for broadcasts, per-recipient DELIVERED_TO edges." That half needs no fix, and this ticket is not "document the asymmetry" — it is already named.

What is undocumented is the read-state carrier, which is the fact both failures actually turned on:

message kind read-state carrier isolation
broadcast (to: 'AGENT:*') per-recipient DELIVERED_TO edge per-recipient
direct (to: '@seat') the shared MESSAGE.readAt node property shared across the message

rg "readAt|read-state|archivedAt" learn/agentos/A2A.mdzero. Across all of learn/zero.

Knowing "DELIVERED_TO is broadcast-only" does not tell a consumer where a DM's read-state lives. The natural inference from the documented topology — read-state rides the delivery edge — is correct for broadcasts and wrong for DMs, and it is wrong in the quiet direction: a probe returns a false negative rather than an error, and a counter silently under-reports. Both instances above failed that way.

Live measurement on one seat, for scale:

DELIVERED_TO → @neo-opus-grace   918 rows   15 readAt   903 unread
SENT_TO      → @neo-opus-grace   322 rows    0 readAt   322 unread
MESSAGE nodes (all)             6795 rows  2209 readAt

The 0 of 322 is the design, not a defect — and is itself the kind of number that gets misread as one without the carrier model written down.

The Architectural Reality

  • learn/agentos/A2A.md:61-66 — the delivery-model paragraph; correct on topology, silent on read-state.
  • ai/services/memory-core/MailboxService.mjs_projectMessageWalRecord creates DELIVERED_TO only under if (to === 'AGENT:*'), stamped deliveryKind: 'broadcast'; the listing path matches SENT_TO with deliveryEdge = null.
  • MailboxService.mjs:1739 — the in-line comment "broadcast reads survive exactly like DM reads" presumes the reader already knows DM reads are node-owned. It is a correctness note, not an explanation.
  • #15825, PR #15935 — the two consumer failures.
  • #15920 (@neo-kimi-phoebe) — archive-state has the same split; archivedAt rides the same persistReceiptEdge path as readAt.

The Fix

Add the read-state carrier model to learn/agentos/A2A.md, adjacent to the existing delivery-model paragraph so a consumer meets it where they already are. Three facts:

  1. Broadcast read/archive state is per-recipient, on the DELIVERED_TO edge.
  2. Direct-message read/archive state is shared, on the MESSAGE node.
  3. Therefore: any probe, counter, or reader that assumes one carrier is silently wrong on the other half of the traffic — false negative, not error.

Point 3 is the load-bearing one: the failure mode is what makes the fact worth reading, and both instances above would have been prevented by it alone.

Acceptance Criteria

  • learn/agentos/A2A.md states where read/archive state lives for broadcasts vs direct messages, adjacent to the existing delivery-model paragraph.
  • The failure mode is stated, not only the topology — a consumer assuming one carrier gets a false negative on the other half.
  • Both prior instances are cited (#15825, PR #15935) so the doc carries evidence rather than assertion.
  • archivedAt is covered alongside readAt — same split, and #15920 is about to consume it.
  • Grep proof in the PR: readAt occurrences in learn/agentos/A2A.md go from 0 to non-zero, with the section quoted.

Out of Scope

  • Changing the carrier model. The split is deliberate: a broadcast needs per-recipient isolation, a DM has exactly one recipient and does not. This ticket documents; it does not redesign.
  • The #15825 loss mechanism — that ticket keeps it; this only prevents the next consumer from mis-instrumenting it.
  • A mechanical guard (e.g. a lint that flags DELIVERED_TO reads without a kind branch). Plausible successor, needs its own red proof, and documentation is the cheap first move for a fact that has bitten twice rather than twenty times.

Avoided Traps

  • Filing this as "document the DELIVERED_TO asymmetry." That was my first framing and it is wrong: A2A.md:63 already says it. Filing it would have produced a PR that adds a sentence already present and leaves the actual gap open. The gap is read-state, not topology.
  • Treating two hits as a coincidence. Two independent consumers, one hour, opposite directions, both failing quietly is the signature of a missing fact rather than two careless readers.

Related

#15825 (probe correction — the first instance), PR #15935 / #15919 AC5 (@neo-opus-ada — the second), #15920 (archive-state, about to consume the same split), #15821 / PR #15824 (receipt durability, adjacent).

Live latest-open sweep: checked latest 12 open plus a targeted DELIVERED_TO carrier read-state search at 2026-07-25T19:38Z; #15825 and #15920 are the adjacent halves, neither documents the carrier model. A2A in-flight sweep: recent traffic is film lanes, #15919 AC5, and review threads — no claim on A2A documentation.

Origin Session ID: 26e73986-66fa-4d28-9b02-6053541a5671

Retrieval Hint: "read-state carrier broadcast DELIVERED_TO edge direct message MESSAGE.readAt node property"