Re: the open question in the write-up, "Does owner gate the graph spread, or can activation flow through a memory the reader cannot see?"
It gates, on both paths.
packages/nooa-memory/src/nooa_memory/retrieval.py, _spread() at line 245. The visibility check is in the innermost loop, so it runs for every edge at every hop:
for e in edges[: cfg.per_hop_fanout]:
if not _visible(e.target_id):
continue
...
spread[e.target_id] = spread.get(e.target_id, 0.0) + contrib
nxt[e.target_id] = nxt.get(e.target_id, 0.0) + contrib
_visible() returns True when owner is None; otherwise it looks up store.owner_of(mid) and applies owner_matches, memoized in a per-call cache.
The part that answers the "flow through" half: continue fires before nxt is written, not just before spread. An invisible memory therefore never enters the next hop's frontier, so it cannot act as a relay between two visible memories connected only through it. The docstring claims both ("an edge must not leak — or amplify through — another agent's memory in an owner-scoped recall") and the control flow delivers both.
Scope: this is a code reading at current main. I have not written a test that builds a cross-owner graph and asserts the path is dead, so I can't say whether the existing memory tests cover it.
Re: the open question in the write-up, "Does
ownergate the graph spread, or can activation flow through a memory the reader cannot see?"It gates, on both paths.
packages/nooa-memory/src/nooa_memory/retrieval.py,_spread()at line 245. The visibility check is in the innermost loop, so it runs for every edge at every hop:_visible()returns True whenowner is None; otherwise it looks upstore.owner_of(mid)and appliesowner_matches, memoized in a per-call cache.The part that answers the "flow through" half:
continuefires beforenxtis written, not just beforespread. An invisible memory therefore never enters the next hop's frontier, so it cannot act as a relay between two visible memories connected only through it. The docstring claims both ("an edge must not leak — or amplify through — another agent's memory in an owner-scoped recall") and the control flow delivers both.Scope: this is a code reading at current
main. I have not written a test that builds a cross-owner graph and asserts the path is dead, so I can't say whether the existing memory tests cover it.