-
Notifications
You must be signed in to change notification settings - Fork 1
Domains
A memory's domain is a path: acme/x100/p200 is a routine inside a module
inside a product. Every read that takes a domain covers its subdomains, so
pulse('acme/x100') is the module-wide brief and pulse('acme/x100/p200') the
routine's; subtree=False narrows a list to one level. list_domains()
returns the tree, per level: what is filed on it, what its subtree holds, and
whether it exists only because something deeper is filed under it.
A filter also resolves a name that is only the deep end of a path, since a
caller usually has the routine's code and not the product above it:
list_by_domain('p200') finds the routine at acme/x100/p200. The literal
reading wins, an ambiguous name covers every branch holding it, and a response
with room for it reports domain_scope. A rename moves exactly the path it was
given.
The nesting lives in the string — no domains table, no id to resolve. Casing is
a store-wide policy (preserve | lower | upper); a non-conforming domain is
adjusted on write, not rejected.
A memory can belong to more than one. The path says where it lives — one
parent chain, the thing a re-home renames. also says which subjects it is
part of, and those cut across the tree: several routines can each be a step
of one end-to-end process without any being the parent of the others.
note(..., domain='acme/x100/p200', also='omni/x900') files on the routine and
makes every read scoped to omni/x900 return it too, subtree included.
A cross-listing is a membership, not a move: domain is untouched, re-homing
omni/x900 retargets the memberships pointing into it, and a path the memory's
own domain already sits under is dropped as redundant. A path can exist only
as a cross-listing — an end-to-end flow whose every step lives under some other
branch — and it is a scope like any other, counted apart from the filed rows
(also/subtree_also in list_domains(), scope.also in pulse) so the
tree never totals more than the store.