<?xml version="1.0" encoding="UTF-8"?>
<glossary>
  <distinctions>
    <distinction terms="message, conversation, reply, social-dm">
      <rule>Message is an open one-to-one thread owned by messages.elonn.local. A reply extends a conversation or event's discussion (social.elonn.local). A Social DM is a private one-to-one thread that starts from Social context and stays owned by Social. None of these three are interchangeable, and none of them is a generic "message".</rule>
    </distinction>
    <distinction terms="event, calendar event, time event">
      <rule>Event, unqualified, always means a social event (social.elonn.local): a scheduled gathering with participants, RSVPs, and an attached conversation. A calendar event / time event is a time.elonn.local calendar entry. Social pushes event data to Time to mirror it as a calendar entry; Time does not own social events.</rule>
    </distinction>
    <distinction terms="discovery, find, finding">
      <rule>Discovery is the social graph traversal (social.elonn.local) that determines which members and Social objects are reachable at each circle depth. Find (find.elonn.local) is the search and discovery service; a finding is a single candidate result it produces. Discovery is about who you can see. Find is about what content you can search. Do not conflate them.</rule>
    </distinction>
    <distinction terms="activity, notification, presence">
      <rule>Activity is an append-only public feed record of a verb performed on an object. Notification is a targeted, recipient-scoped alert. Presence is a member's real-time availability signal. All three are distinct social.elonn.local objects and must not be used for one another.</rule>
    </distinction>
    <distinction terms="card, window">
      <rule>A card previews or launches an object and is renderer-level. Window is a reserved (not yet implemented) independently managed spatial container with z-order, resizing, and overlap. Do not use window as a synonym for card, workspace, or panel.</rule>
    </distinction>
    <distinction terms="carry, field">
      <rule>Carry is the personal, member-anchored layer that travels with the member. Field is the shared spatial panorama fixed to the world, visible to all members. Anchor mode (carry / field / object) determines which layer an object belongs to.</rule>
    </distinction>
    <distinction terms="field, workspace, carry">
      <rule>Field is the persistent world layer anchored to reality. Workspace is the transient manifestation of the member's current intent. Carry is the member-following layer for personal objects and controls. Do not use Findings as a runtime layer name; findings are Find-owned domain results that may be composed into Workspace.</rule>
    </distinction>
    <distinction terms="world, field">
      <rule>The field is the spatial layer within the world; the world is the full composed experience (identity, maps, social, messages, and time data assembled into the canonical model). The world contains the field — the field is not the world.</rule>
    </distinction>
    <distinction terms="runtime (world runtime), runtime (presence runtime)">
      <rule>World runtime is the platform adapter / execution environment (web, android, desktop, xr) that consumes translated World contracts. Presence runtime is the string identifier (e.g. web.elonn) recorded on a presence record to show which client a member is using. "Runtime" alone is ambiguous between these and must be qualified.</rule>
    </distinction>
    <distinction terms="session">
      <rule>Session alone is ambiguous and must always be qualified: auth session (api.elonn.local, a token-linked record that expires), runtime session (world.elonn.local, the composed world state returned at boot, not stored), or find session (find.elonn.local, a query-grouping session).</rule>
    </distinction>
    <distinction terms="object (runtime term), object (informal spatial noun)">
      <rule>In runtime contracts, object means a renderable data entity originating from a service (place, member, message, etc.). Elsewhere, "carry object", "field object", and "world object" use "object" as a generic noun. Prefer the domain noun (place, member, message) over bare "object" when referring to a specific type.</rule>
    </distinction>
    <distinction terms="member, profile, identity">
      <rule>Member is the API-owned identity record (api.elonn.local) — the person. Identity refers to that same API record and its identity_user_id, and must not be used to mean a profile. Profile is the social-layer representation a member authors for social context (social.elonn.local) and is a distinct record from both.</rule>
    </distinction>
    <distinction terms="circle, relationship, discovery">
      <rule>Circle is a derived set of members computed by traversal (depth: inner / trusted / extended); it is never stored or manually managed. Relationship is an explicit, directional, stored record (currently only "block"). Discovery is the traversal mechanism that computes circles. Circle membership is not a relationship.</rule>
    </distinction>
    <distinction terms="visibility, permissions">
      <rule>Visibility controls read access — who can see a social object (public / community / circle / private, depending on object type). Permissions control write access. Do not use the two interchangeably.</rule>
    </distinction>
    <distinction terms="conversation, thread">
      <rule>Conversation is a titled, threaded discussion anchored to a visibility scope (public / community / private). Thread is reserved for message and Social DM containers, which are strictly one-to-one. One-to-one communication uses a thread, not a conversation.</rule>
    </distinction>
  </distinctions>
  <section name="service-runtime" authority="mixed">
    <term name="api" authority="api.elonn.local">
      <definition>The identity and authentication authority for Elonn. Owns members, auth sessions, and tokens. API issues signed access tokens after member authentication.</definition>
      <details>Owns:
- member identity records
- auth sessions
- auth tokens
- member directory</details>
      <allowed>
        <item>api service</item>
        <item>api base URL</item>
        <item>API token</item>
        <item>api auth</item>
      </allowed>
      <forbidden>
        <item>auth service (not its product name)</item>
        <item>identity service (not its product name)</item>
        <item>user service (deprecated; "user" is not a product term)</item>
        <item>account service (account is the login area, not the service name)</item>
      </forbidden>
      <notes>
        <note>The service hostname is `api.elonn.local` / `api.elonn.com`. Refer to the service by this name or simply "the API."</note>
        <note>All other services reference members by `identity_user_id`, which comes from the API service.</note>
        <note>The API service issues signed access tokens, including the `elonn_api_token` cookie used in browser contexts.</note>
        <note>World validates signed access tokens locally at the Runtime-World boundary. Downstream services receive authenticated member identity through service-authenticated internal calls.</note>
      </notes>
      <related>
        <item>member</item>
        <item>token</item>
        <item>session (auth session)</item>
        <item>identity</item>
      </related>
    </term>
    <term name="contract" authority="world.elonn.local">
      <definition>The named, versioned agreement that defines a World model, runtime payload, or service payload and its behavior. Runtime contracts tell runtimes what primitives, capabilities, services, actions, controls, and objects they can expect.</definition>
      <details>Fields:
- `name` — canonical contract name (e.g. `elonn.home.runtime`)
- `version` — integer version; breaking changes increment this</details>
      <allowed>
        <item>runtime contract</item>
        <item>service contract</item>
        <item>translator contract</item>
        <item>World model contract</item>
        <item>contract name</item>
        <item>contract version</item>
      </allowed>
      <forbidden>
        <item>schema (describes data shape; a contract is broader — it includes capabilities and behavioral expectations)</item>
        <item>API spec (contracts are runtime payloads, not API documentation)</item>
        <item>manifest (too generic)</item>
      </forbidden>
      <notes>
        <note>The current runtime compatibility contract is `elonn.home.runtime` at version 2.</note>
        <note>Runtime adapters read the contract name and version to determine how to execute a translated World payload. Version changes are breaking.</note>
        <note>Runtime contracts are produced by World translators and consumed by runtime adapters. No runtime and no other service produces the runtime contract.</note>
        <note>When a runtime contract version changes, World, the relevant translator, and affected runtime adapters must be updated together.</note>
      </notes>
      <related>
        <item>runtime</item>
        <item>world</item>
        <item>translator</item>
        <item>web</item>
        <item>session (runtime session)</item>
      </related>
    </term>
    <term name="find" authority="find.elonn.local">
      <definition>The search and discovery service. Find owns query records, findings (search results), and heads (classifications). It is distinct from the social discovery graph.</definition>
      <details>Owns:
- finding (a single search result)
- findings (a result set)
- finding head (a classification/category label for a finding)
- finding query (a search query record)
- find session</details>
      <allowed>
        <item>find service</item>
        <item>finding</item>
        <item>finding head</item>
        <item>search results (UI prose only)</item>
      </allowed>
      <forbidden>
        <item>discovery service (discovery refers to the social graph traversal, not search results)</item>
        <item>search service (not its product name)</item>
        <item>results (too generic without "findings" qualifier in technical context)</item>
      </forbidden>
      <notes>
        <note>**Discovery** is a social graph concept (traversal through circle memberships). Find is a search service. Do not conflate them.</note>
        <note>Findings are ranked by `ai_score` and have a `source_url` and `source_domain`.</note>
        <note>The find service is not currently exposed in the world runtime.</note>
      </notes>
      <related>
        <item>finding</item>
        <item>head (finding head)</item>
        <item>social (discovery graph; distinct concept)</item>
      </related>
    </term>
    <term name="maps" authority="maps.elonn.local">
      <definition>The spatial data service. Maps is the authority for field layout, field width, and markers. It provides the shared visual environment that all members inhabit.</definition>
      <details>Owns:
- field layout
- field width
- markers
- marker sets</details>
      <allowed>
        <item>maps service</item>
        <item>maps objects</item>
        <item>maps authority</item>
      </allowed>
      <forbidden>
        <item>geography service</item>
        <item>location service</item>
        <item>map (the singular noun; the service is "maps" and the object is "field")</item>
        <item>navigation service</item>
      </forbidden>
      <notes>
        <note>The service is named "maps" (plural). Avoid using "map" as a product noun — the output is a **field**, not a map.</note>
        <note>World fetches field data from maps and includes it in the runtime contract. Maps does not interact with the web runtime directly.</note>
      </notes>
      <related>
        <item>field</item>
        <item>marker</item>
        <item>world</item>
      </related>
    </term>
    <term name="runtime" authority="world.elonn.local">
      <definition>A complete executable presentation environment. Runtimes consume translated World contracts. They are responsible for rendering, input handling, lifecycle, performance, accessibility implementation, and platform adaptation.</definition>
      <details>Runtime instances:
- `web runtime` — the browser-based Elonn experience
- `android runtime` — the Android-based Elonn experience
- `desktop runtime` — the desktop-based Elonn experience
- `xr runtime` — the extended reality Elonn experience

"Runtime" has two additional distinct uses within the existing system and must be qualified when context is ambiguous:

**World runtime** (`world.elonn.local`)
A platform adapter that renders a translated World runtime contract. Existing
Web, Android, iPad, XR, desktop, and future device runtimes consume translated
primitives according to their capabilities.

**Presence runtime** (`social.elonn.local`)
The `runtime` field on a presence record identifying which client the member is currently using (e.g. `web.elonn`, `mobile.elonn`). This is a string identifier, not the execution environment itself.</details>
      <allowed>
        <item>web runtime</item>
        <item>android runtime</item>
        <item>desktop runtime</item>
        <item>xr runtime</item>
        <item>world runtime</item>
        <item>browser runtime</item>
        <item>runtime contract (the payload from World that bootstraps every runtime)</item>
        <item>runtime authority (the world service's designation as the session authority)</item>
        <item>presence runtime (the client identifier in a presence record)</item>
      </allowed>
      <forbidden>
        <item>runtime alone when the meaning is ambiguous between world runtime and presence runtime</item>
        <item>backend (describes infrastructure; not a product term)</item>
        <item>server-side runtime (too technical; not a product term)</item>
        <item>client (too generic; use the specific runtime name)</item>
      </forbidden>
      <notes>
        <note>The world service declares itself `runtime_authority: true` in its service response. This means it is the canonical source of the World model and translated runtime contracts.</note>
        <note>Runtimes execute translated contracts. They do not own translator logic or consume service payloads directly.</note>
      </notes>
      <related>
        <item>contract</item>
        <item>world</item>
        <item>translator</item>
        <item>web</item>
        <item>presence (presence runtime field)</item>
      </related>
    </term>
    <term name="service" authority="varies">
      <definition>An independently deployed Elonn application boundary with its own routes, data ownership, and domain logic.</definition>
      <details>Owns:
- its own routes
- its own database or backing store
- its own domain logic</details>
      <allowed>
        <item>service</item>
        <item>product service</item>
        <item>service boundary</item>
        <item>service contract</item>
      </allowed>
      <forbidden>
        <item>app (too generic without context)</item>
        <item>backend (too generic)</item>
        <item>server (too generic)</item>
        <item>subsystem (implies internal implementation rather than a product boundary)</item>
      </forbidden>
      <notes>
        <note>Use the product name when the specific service is known: API, Time, Social, Find, Maps, World, or Docs.</note>
        <note>A service is a deployment and ownership boundary, not a runtime.</note>
        <note>When a sentence already names the product, prefer that product name over the bare word "service."</note>
        <note>Examples include API, Time, Social, Find, Maps, World, and Docs.</note>
      </notes>
      <related>
        <item>api</item>
        <item>time</item>
        <item>world</item>
      </related>
    </term>
    <term name="social" authority="social.elonn.local">
      <definition>The social object authority. Social owns conversations, communities, events, profiles, presence, activity, notifications, relationships, circles, discovery graph behavior, and Social DMs.</definition>
      <details>Social's key model is circles and discovery. Circles come from shared private communities, not followers, friends, or manual connection lists.

Owns:
- profile
- conversation
- reply (conversation and event replies)
- community
- membership
- event (social gathering with participants and RSVP)
- participant
- presence
- activity
- notification
- relationship (block only)
- circle (derived; not stored)
- discovery graph
- social-dm</details>
      <allowed>
        <item>social service</item>
        <item>social objects</item>
        <item>social panel</item>
        <item>social carry object</item>
      </allowed>
      <forbidden>
        <item>network (overloaded; not the product noun)</item>
        <item>feed service (the activity feed is one feature, not the whole service)</item>
        <item>community service (communities are one object type, not the whole service)</item>
      </forbidden>
      <notes>
        <note>"Social event" is the canonical qualifier when disambiguation with time events is required. In social-only context, **event** alone is sufficient.</note>
        <note>Social does not own calendars — time.elonn.local does. Social pushes event data to time; it does not render calendar UI.</note>
        <note>Social DMs are private one-to-one communications inside Social context. Open platform Messages are a separate bounded context owned by `messages.elonn.local`.</note>
        <note>Public social objects are visible because they are public. Public visibility does not expand circle membership.</note>
      </notes>
      <related>
        <item>conversation</item>
        <item>community</item>
        <item>event</item>
        <item>presence</item>
        <item>social-dm</item>
        <item>circle</item>
        <item>world (consumer)</item>
      </related>
    </term>
    <term name="time" authority="time.elonn.local">
      <definition>The calendar and scheduling service. Time owns calendars and time events. It accepts ingested events from the social service to mirror them as calendar entries.</definition>
      <details>Owns:
- calendar
- time event (a calendar entry; not to be confused with social event)
- calendar slots / time boundaries</details>
      <allowed>
        <item>time service</item>
        <item>calendar event (a time-owned event)</item>
        <item>time event</item>
        <item>time panel</item>
      </allowed>
      <forbidden>
        <item>scheduling service (not its product name)</item>
        <item>events service (ambiguous with social events)</item>
        <item>agenda (UI prose acceptable; not a product noun)</item>
      </forbidden>
      <notes>
        <note>"Event" without qualification is a **social event** (see: social). When referring to a time service entry, say **calendar event** or **time event**.</note>
        <note>The social service pushes event data to time via `syncSocialEventToTime`. Time does not pull from social.</note>
        <note>CalDAV integration uses the member's normal API-owned account credentials through `services.elonn.com/caldav/`.</note>
      </notes>
      <related>
        <item>calendar</item>
        <item>social (event source)</item>
        <item>world</item>
      </related>
    </term>
    <term name="translation" authority="varies">
      <definition>Conversion from one canonical representation to another while preserving domain meaning, provenance, permissions, and action semantics. Translation does not imply ownership by a separate presentation/container service.</definition>
    </term>
    <term name="translator" authority="world.elonn.local">
      <definition>A platform component that converts the canonical World model into a runtime-specific contract for a declared capability class.</definition>
      <details>Translators preserve object identity, action meaning, permissions, focus,
workspace state, field state, findings, context targets, and fallbacks while
adapting presentation shape for runtime capabilities.</details>
      <allowed>
        <item>translator</item>
        <item>runtime translator</item>
        <item>translator contract</item>
        <item>capability-class translator</item>
      </allowed>
      <forbidden>
        <item>renderer (rendering belongs to runtime adapters)</item>
        <item>runtime (a runtime executes a translated contract)</item>
        <item>service adapter (services own domain state; translators do not call services)</item>
        <item>layout engine (too narrow; translators preserve semantics, not just layout)</item>
      </forbidden>
      <notes>
        <note>Translators receive the canonical World model, member/runtime context, and a capability declaration.</note>
        <note>Translators emit named, versioned runtime contracts.</note>
        <note>Translators are first-class platform components, not private logic hidden inside runtime adapters.</note>
        <note>Existing Web, Android, iPad, and Cardboard behavior is not translator precedent.</note>
      </notes>
      <related>
        <item>world</item>
        <item>runtime</item>
        <item>contract</item>
      </related>
    </term>
    <term name="web" authority="web.elonn.local">
      <definition>The browser runtime application. Web renders the World Dataset through Field, Workspace, and Carry layers and delivers the Elonn experience in a browser.</definition>
      <details>Owns:
- browser rendering of Field, Workspace, and Carry
- client-side runtime state
- UI interactions and navigation</details>
      <allowed>
        <item>web runtime</item>
        <item>web.elonn (the client identifier used in presence)</item>
        <item>browser runtime</item>
      </allowed>
      <forbidden>
        <item>frontend (acceptable in engineering conversation; not a product noun)</item>
        <item>client (too generic; acceptable in technical docs)</item>
        <item>app (too ambiguous across platforms)</item>
        <item>SPA (single-page application; technical descriptor, not a product term)</item>
      </forbidden>
      <notes>
        <note>The web runtime reads the world contract from `world.elonn.local` and does not directly call social, maps, or time services. All service access routes through world.</note>
        <note>"web.elonn" is the presence runtime identifier — the string that appears in `runtime` field of presence records when a member is using the browser runtime.</note>
      </notes>
      <related>
        <item>world</item>
        <item>runtime</item>
        <item>contract</item>
        <item>carry</item>
        <item>workspace</item>
        <item>field</item>
        <item>panel</item>
      </related>
    </term>
    <term name="world" authority="world.elonn.local">
      <definition>The composition and aggregation service. World assembles identity, maps, social, messages, and time data into the canonical World model and translated runtime contracts consumed by runtimes. World is also the product noun for the whole experience.</definition>
      <details>Owns:
- runtime contract (the composed session payload)
- layout (carry + field composition)
- world session
- service composition payloads
- relay and rewrite of social, time, and maps endpoints
- canonical World model
- translator input model</details>
      <allowed>
        <item>world service</item>
        <item>world session</item>
        <item>world layout</item>
        <item>world objects</item>
        <item>world runtime (informal; the running experience)</item>
      </allowed>
      <forbidden>
        <item>backend (too generic)</item>
        <item>server (too generic)</item>
        <item>aggregator (internal; not a product term)</item>
        <item>gateway (implies API gateway pattern; not the model)</item>
        <item>BFF (backend-for-frontend; acceptable in architecture discussions but not as a product term)</item>
      </forbidden>
      <notes>
        <note>"World" is both the product noun (the experience the member inhabits) and the service name.</note>
        <note>The field is not the world. The world contains the field.</note>
        <note>World proxies and rewrites service routes for runtime adapters but is not an authority for service-owned data.</note>
        <note>World composes platform state. Translators project that state into runtime-specific contracts.</note>
      </notes>
      <related>
        <item>runtime</item>
        <item>contract</item>
        <item>translator</item>
        <item>carry</item>
        <item>field</item>
        <item>social</item>
        <item>time</item>
        <item>maps</item>
      </related>
    </term>
  </section>
  <section name="spatial" authority="mixed">
    <term name="action" authority="varies — executed by service">
      <definition>An executable interaction exposed by an object, workspace, or runtime affordance. Actions connect user intent to service behavior.</definition>
      <details>Examples:
- open
- join
- navigate
- message
- save
- launch
- share
- pin

Sub-concepts:
- **action target** — the destination or system affected by the action (object, workspace, service, route, external runtime)
- **action provider** — the service executing the action</details>
      <allowed>
        <item>action</item>
        <item>[verb] action (e.g., join action, save action)</item>
        <item>action target</item>
        <item>action provider</item>
      </allowed>
      <forbidden>
        <item>command (implies CLI or OS context)</item>
        <item>operation (too technical)</item>
        <item>function (engineering term)</item>
        <item>button (UI implementation detail; not a model noun)</item>
        <item>event (avoid — event has a canonical social meaning; see: event)</item>
      </forbidden>
      <notes>
        <note>Actions belong to objects, workspaces, services, or runtime affordances, not to visual wrappers. A card may expose an object's actions, but the action is the object's.</note>
        <note>Do not use "event" to mean a user interaction or UI action. "Event" means a social event (see: event).</note>
      </notes>
      <related>
        <item>object</item>
        <item>workspace</item>
        <item>event (distinct; social event — not a UI action)</item>
      </related>
    </term>
    <term name="anchor" authority="world.elonn.local">
      <definition>The placement mode of a world object, determining whether it belongs to the personal carry layer or the shared field layer.</definition>
      <details>Values:
- `carry` — the object travels with the member (also: user anchored)
- `field` — the object is fixed in the shared spatial panorama (also: world anchored)
- `object` — the object is anchored to another object in the field; moves with that object rather than the member or the fixed environment (future; XR-relevant)</details>
      <allowed>
        <item>anchor mode</item>
        <item>anchor_mode (API field name)</item>
        <item>carry anchor</item>
        <item>field anchor</item>
      </allowed>
      <forbidden>
        <item>placement mode (acceptable in technical docs prose; not the canonical noun)</item>
        <item>attachment type</item>
        <item>position type</item>
        <item>slot</item>
      </forbidden>
      <notes>
        <note>`anchor_mode` is the canonical API field name. Use it in code and payloads.</note>
        <note>Do not expose "anchor" as a product-facing noun in UI copy. In UI, present the distinction as the carry layer vs. the field.</note>
      </notes>
      <related>
        <item>carry</item>
        <item>field</item>
        <item>layout</item>
      </related>
    </term>
    <term name="block" authority="world.elonn.local">
      <definition>A structured content group within a workspace or runtime view. Blocks organize objects, cards, controls, and findings into logical groups.</definition>
      <details>Examples:
- nearby block
- friends block
- actions block
- calendar block
- notification block

Block types:
- `list_block` — ordered item list
- `card_block` — visual card grid or row
- `hero_block` — single prominent object
- `action_block` — interactive controls
- `map_block` — spatial field view
- `media_block` — visual or audio content</details>
      <allowed>
        <item>block</item>
        <item>[name] block (e.g., nearby block)</item>
        <item>block type</item>
      </allowed>
      <forbidden>
        <item>section (implies document model)</item>
        <item>widget (implies embeddable third-party component)</item>
        <item>component (engineering term; not a product noun)</item>
        <item>module (ambiguous)</item>
        <item>panel (a runtime presentation area, not a data model)</item>
      </forbidden>
      <notes>
        <note>Blocks are organizational groups for runtime presentation. They are not durable platform containers.</note>
        <note>Block type defines rendering semantics; the runtime selects the appropriate renderer based on block type.</note>
        <note>A block does not represent a context or workspace on its own.</note>
      </notes>
      <related>
        <item>card</item>
        <item>object</item>
        <item>finding</item>
      </related>
    </term>
    <term name="card" authority="web.elonn.local">
      <definition>A visual presentation wrapper for an object within a block. A card is presentation-only — the object exists independently of its card representation.</definition>
      <details>A card:
- previews, launches, expands, or links to an object
- is temporary and replaceable
- is renderer-level
- scales across web, mobile, XR, and desktop runtimes

A card is NOT:
- a runtime container
- a navigation state
- a workspace
- a panel

Examples:
- place card
- member card
- gathering card
- message card
- calendar card

Card variants:
- `compact` — minimal summary
- `expanded` — detailed with more fields visible
- `hero` — single large-format presentation
- `stacked` — overlapping stack of cards
- `floating` — detached from block flow
- `minimal` — icon or indicator only</details>
      <allowed>
        <item>card</item>
        <item>[object] card (e.g., place card, member card)</item>
        <item>card variant</item>
      </allowed>
      <forbidden>
        <item>widget (implies third-party embeddable)</item>
        <item>tile (implies fixed-grid layout)</item>
        <item>cell (implies table model)</item>
        <item>item (too generic)</item>
        <item>window (distinct; see: window)</item>
      </forbidden>
      <notes>
        <note>Cards are presentation wrappers for objects.</note>
        <note>A card never becomes the environment itself.</note>
        <note>Card rendering is runtime-specific, but the card abstraction is platform-neutral.</note>
      </notes>
      <related>
        <item>object</item>
        <item>block</item>
        <item>panel (distinct)</item>
        <item>window (distinct; future)</item>
      </related>
    </term>
    <term name="carry" authority="world.elonn.local">
      <definition>Objects anchored to a member and carried with them through the world. The carry layer is personal and persistent — it moves with the member, not with the field.</definition>
      <allowed>
        <item>carry layer</item>
        <item>carry object</item>
        <item>carry panel (runtime presentation only)</item>
      </allowed>
      <forbidden>
        <item>toolbar</item>
        <item>dock</item>
        <item>HUD (heads-up display)</item>
        <item>inventory</item>
        <item>sidebar</item>
        <item>tray</item>
      </forbidden>
      <notes>
        <note>Carry is the primary member-following region in the runtime.</note>
        <note>Carry objects have `anchor_mode = 'carry'` in the layout.</note>
        <note>A carry panel is runtime presentation, not a Service or World data primitive.</note>
        <note>Contrast with **field**: field objects are spatial and shared; carry objects are personal.</note>
        <note>Do not call the social carry object a "social widget" or "social sidebar." It is the **social carry object** or **social panel**.</note>
      </notes>
      <related>
        <item>field</item>
        <item>anchor</item>
        <item>panel</item>
        <item>world</item>
        <item>layout</item>
      </related>
    </term>
    <term name="workspace" authority="world.elonn.local">
      <definition>The transient manifestation of the member's current intent. Workspace exists in world space until replaced or updated by a new intent.</definition>
      <details>Workspace may contain objects, collections, actions, resources, and placements.

Examples:
- search results
- conversations
- documents
- dashboards
- navigation
- collaborative spaces
- editors
- immersive rooms</details>
      <allowed>
        <item>workspace</item>
        <item>workspace layer</item>
        <item>workspace object</item>
        <item>workspace collection</item>
        <item>workspace placement</item>
      </allowed>
      <forbidden>
        <item>findings layer</item>
        <item>finding overlay</item>
        <item>result dock</item>
        <item>search panel</item>
      </forbidden>
      <notes>
        <note>Workspace is not limited to Find results.</note>
        <note>Find may still produce findings as domain results. Those findings may be composed into Workspace.</note>
        <note>Contrast with Field, which is persistent and world-anchored.</note>
        <note>Contrast with Carry, which follows the member.</note>
      </notes>
      <related>
        <item>field</item>
        <item>carry</item>
        <item>world</item>
        <item>mind</item>
        <item>finding</item>
      </related>
    </term>
    <term name="field" authority="maps.elonn.local">
      <definition>The shared spatial panorama visible to all members of the world. Field objects are placed at coordinates within the field and are not attached to any individual member.</definition>
      <allowed>
        <item>field layer</item>
        <item>field object</item>
        <item>field width (the panoramic width dimension)</item>
        <item>place an object in the field</item>
      </allowed>
      <forbidden>
        <item>map (the maps service generates field data, but "map" implies cartography; the field is not a map)</item>
        <item>environment</item>
        <item>scene</item>
        <item>stage</item>
        <item>world (the world is the composed experience; the field is the spatial layer within it)</item>
      </forbidden>
      <notes>
        <note>Field is the primary world-anchored region in the runtime. The field region contains spatially fixed objects and markers tied to locations in the world.</note>
        <note>Field objects have `anchor_mode = 'field'` in the layout.</note>
        <note>The maps service (`maps.elonn.local`) is the authority for field content. World composes field data into the runtime contract but does not own it.</note>
        <note>`field_width` is the panoramic width in abstract units, used by the web runtime for layout.</note>
      </notes>
      <related>
        <item>carry</item>
        <item>marker</item>
        <item>anchor</item>
        <item>maps</item>
        <item>world</item>
      </related>
    </term>
    <term name="finding" authority="find.elonn.local">
      <definition>A candidate informational result discovered or computed by Find. A finding is not yet normalized runtime content.</definition>
      <details>Examples:
- recommended restaurant
- nearby friend
- active gathering
- traffic alert
- calendar conflict
- suggested route

A finding:
- is produced by Find from a provider
- is contextual and time-bounded
- is distinct from a **notification** (which is targeted and recipient-scoped)
- is distinct from **activity** (which is an append-only feed record)

Sub-concepts:
- **finding provider** — an internal or external source queried by Find</details>
      <allowed>
        <item>finding</item>
        <item>findings</item>
        <item>findings provider</item>
        <item>[type] finding (e.g., nearby finding)</item>
      </allowed>
      <forbidden>
        <item>result (implies a response to an explicit search query; findings may be proactive)</item>
        <item>recommendation (too specific; findings include alerts and computed results)</item>
        <item>suggestion (same)</item>
      </forbidden>
      <notes>
        <note>"Finding" is the product noun for what a provider discovers or computes. "Find" is the service. Do not use "find" as a noun for an individual result.</note>
        <note>Findings are distinct from discovery (the Social graph traversal).</note>
      </notes>
      <related>
        <item>find (service)</item>
        <item>discovery (distinct; social graph traversal)</item>
        <item>block</item>
        <item>object</item>
        <item>notification (distinct)</item>
        <item>activity (distinct)</item>
      </related>
    </term>
    <term name="marker" authority="maps.elonn.local">
      <definition>A visual point-of-interest placed at a position in the field. Markers are authored by the maps service and rendered by the web runtime.</definition>
      <allowed>
        <item>field marker</item>
        <item>place marker</item>
        <item>marker set (a grouped category of markers)</item>
      </allowed>
      <forbidden>
        <item>pin (generic mapping term; not the internal noun)</item>
        <item>waypoint (connotes navigation; not the model)</item>
        <item>location (a property, not an object)</item>
        <item>poi (acceptable as internal shorthand in code; not a product term)</item>
        <item>landmark (too specific)</item>
        <item>icon (describes rendering, not the object)</item>
      </forbidden>
      <notes>
        <note>Markers belong to a `marker_set` which groups them by category (e.g. restaurant, transit, park).</note>
        <note>Markers are field objects; they have coordinates but are not carry objects.</note>
      </notes>
      <related>
        <item>field</item>
        <item>maps</item>
        <item>anchor</item>
      </related>
    </term>
    <term name="navigation" authority="world.elonn.local">
      <definition>The model governing how a member moves through runtime space. Navigation in Elonn is spatial and contextual, not traversal of a document or menu hierarchy.</definition>
      <details>Elonn currently trends toward: spatial stack navigation.

Navigation models:
- `stack` — linear push/pop
- `spatial` — positional movement through space
- `radial` — arc-based arrangement
- `hierarchical` — tree structure
- `linear` — single axis

Sub-concepts:
- **focus** — the currently targeted interactive entity within the runtime
- **context shift** — movement between conceptually distinct states (e.g., messages → maps, calendar → navigation)

Interaction primitives:
- **gesture** — continuous user movement input (drag, swipe, pinch, rotate, hold)
- **gesture capture** — system ownership of input during an active gesture
- **commit** — finalize a state transition after the snap threshold is met
- **settle** — animated stabilization after interaction ends
- **rebound** — return to previous state after a failed threshold crossing</details>
      <allowed>
        <item>navigation</item>
        <item>navigation model</item>
        <item>context shift</item>
        <item>gesture</item>
      </allowed>
      <forbidden>
        <item>routing (implies URL or page model)</item>
        <item>page navigation (implies a document or website model)</item>
        <item>back / forward (implies browser history model)</item>
        <item>menu navigation (implies command-list traversal)</item>
      </forbidden>
      <notes>
        <note>Navigation describes spatial movement, not document traversal. Do not import browser or filesystem navigation metaphors.</note>
        <note>Gesture interaction is the primary input model; programmatic, voice, gaze, and keyboard transitions are also valid.</note>
      </notes>
      <related>
        <item>runtime</item>
        <item>region</item>
      </related>
    </term>
    <term name="object" authority="varies — always qualified by service">
      <definition>A renderable entity originating from a service. Objects are runtime data primitives composed by World.</definition>
      <details>Examples by provider:
- place (maps.elonn.local)
- member (api.elonn.local)
- gathering (social.elonn.local)
- message (messages.elonn.local)
- social-dm (social.elonn.local)
- route (maps.elonn.local)
- calendar item (time.elonn.local)
- notification (social.elonn.local)

Sub-concepts:
- **object provider** — the service responsible for producing the object
- **object state** — current live state of an object (online, active, busy, joined, saved, muted)</details>
      <allowed>
        <item>[name] object (e.g., place object, member object)</item>
        <item>object provider</item>
        <item>object state</item>
      </allowed>
      <forbidden>
        <item>item (too generic; use the domain noun where possible)</item>
        <item>entity (database term; not a product noun)</item>
        <item>record (implies a database row)</item>
      </forbidden>
      <notes>
        <note>In runtime contracts, object means a renderable data entity. This is distinct from informal uses such as carry object, field object, or world object.</note>
        <note>Always prefer the domain noun (place, member, message) over bare "object" when referring to a specific type.</note>
        <note>Objects may expose actions. Cards are the visual presentation of objects.</note>
      </notes>
      <related>
        <item>card (object's visual presentation)</item>
        <item>block (object's container)</item>
        <item>action (object may expose actions)</item>
        <item>finding (objects may be findings)</item>
      </related>
    </term>
    <term name="region" authority="world.elonn.local">
      <definition>A persistent spatial zone within a runtime. Regions divide the runtime into distinct spatial zones with different interaction characteristics and anchor behaviors.</definition>
      <details>Primary regions:
- **carry** — user-following interface space; anchored to the member; high interaction density; persists during movement
- **field** — world-anchored environmental space; spatially fixed; tied to locations; lower interaction density</details>
      <allowed>
        <item>carry region</item>
        <item>field region</item>
        <item>[name] region</item>
      </allowed>
      <forbidden>
        <item>zone (too generic; use region)</item>
        <item>layer (acceptable in technical prose; not the product noun)</item>
        <item>area (too vague)</item>
        <item>pane (implies flat document layout)</item>
      </forbidden>
      <notes>
        <note>Regions are the top structural division within a runtime.</note>
        <note>Carry and field are the canonical region names. Do not introduce additional region names without extending this definition.</note>
        <note>"Carry region" and "field region" are the qualified forms when disambiguation with other carry/field usages is needed.</note>
      </notes>
      <related>
        <item>carry</item>
        <item>field</item>
        <item>runtime</item>
        <item>anchor</item>
      </related>
    </term>
    <term name="surface" authority="contextual">
      <definition>A physical, geometric, or domain-specific working area. In Elonn, use this term only when the ordinary meaning is intended, such as a Paint drawing surface.</definition>
      <details>Valid examples:
- Paint drawing surface
- canvas surface
- touchscreen surface
- geometric surface

Invalid platform meanings:
- persistent runtime container
- service-backed presentation unit
- panel parent
- World or Runtime object carrier
- replacement for workspace, object, card, panel, or window</details>
      <allowed>
        <item>drawing surface</item>
        <item>painting surface</item>
        <item>canvas surface</item>
        <item>touch surface</item>
        <item>geometric surface</item>
      </allowed>
      <forbidden>
        <item>surface.elonn.local</item>
        <item>Surface service</item>
        <item>Surface Object</item>
        <item>surface object</item>
        <item>surface session</item>
        <item>surface schema</item>
        <item>surface state</item>
        <item>surface renderer</item>
        <item>surface as a panel/container/workspace/card/window synonym</item>
      </forbidden>
      <notes>
        <note>Do not use surface as an Elonn platform primitive.</note>
        <note>Do not use surface to refer to the removed `surface.elonn.local` service or any of its former responsibilities.</note>
        <note>When the intended meaning is a member's current work area, use workspace.</note>
        <note>When the intended meaning is service-produced runtime content, use object or the domain noun.</note>
      </notes>
      <related>
        <item>paint</item>
        <item>workspace</item>
        <item>object</item>
      </related>
    </term>
    <term name="window" authority="world.elonn.local" status="reserved">
      <definition>An independently managed spatial container with z-order, resizing, overlap, focus management, and independent lifecycle.</definition>
      <details>**Window is reserved. It is not a current Elonn primitive.**

"Window" implies a desktop OS model (macOS, Windows, visionOS, X11, Wayland). Using it prematurely commits Elonn to desktop window-manager behavior.

When window becomes valid:
- Elonn supports multiple simultaneous movable containers
- Independent positioning exists
- Containers can overlap
- Persistent spatial placement per container is supported
- Simultaneous focus across containers is possible

Future evolution path:
Window should be introduced only when runtime behavior supports independent placement, overlap, resizing, and focus.

Example of correct future usage:
```
Map context opened in a floating map window
```</details>
      <allowed>
        <item>window</item>
        <item>[name] window (e.g., map window, chat window)</item>
        <item>floating window</item>
      </allowed>
      <forbidden>
        <item>Do not use window as a synonym for workspace, object, card, panel, or any current Elonn spatial primitive.</item>
        <item>Do not use window to describe any current runtime container.</item>
      </forbidden>
      <notes>
        <note>The moment "window" appears in product copy or architecture diagrams, users expect macOS/Windows/visionOS behavior: z-order, resizing, overlap. Reserve it until the runtime genuinely supports that model.</note>
        <note>Do not introduce window language until the runtime genuinely supports window behavior.</note>
      </notes>
      <related>
        <item>workspace</item>
        <item>panel</item>
        <item>region (distinct; persistent spatial zone)</item>
      </related>
    </term>
  </section>
  <section name="social" authority="mixed">
    <term name="activity" authority="social.elonn.local">
      <definition>A feed record capturing that a member performed a verb on an object. Activity is append-only and drives the public social feed.</definition>
      <details>Structure:
- `actor_identity_user_id` — who did the action
- `verb` — what they did (created, replied, rsvped)
- `object_type` — what kind of thing they acted on (conversation, community, event, message, profile)
- `object_id` — which specific object
- `visibility` — public / circle / private</details>
      <allowed>
        <item>activity feed</item>
        <item>activity record</item>
        <item>activity verb</item>
      </allowed>
      <forbidden>
        <item>post (a post implies authored content; activity records are derivative of actions, not primary content)</item>
        <item>event (ambiguous with social event; activity records are not events)</item>
        <item>log (implies system/infrastructure logging; activity is a product-facing feed)</item>
        <item>presence (distinct; see: presence)</item>
      </forbidden>
      <notes>
        <note>Activity is written automatically by the social service when members perform actions. Members do not directly create activity records.</note>
        <note>The visibility enum uses `circle` (not `followers`). The `followers` value was removed in migration 004.</note>
        <note>`verb` values should be past-tense action words: `created`, `replied`, `rsvped`. Do not use gerunds (creating, replying).</note>
      </notes>
      <related>
        <item>presence (distinct real-time signal; see: presence)</item>
        <item>notification (activity can trigger notifications)</item>
        <item>visibility</item>
      </related>
    </term>
    <term name="circle" authority="social.elonn.local">
      <definition>A derived set of members reachable from a given member through shared private community co-membership. Circles are computed by traversal; they are not stored as tables and are not manually managed by members.</definition>
      <details>Depth labels:
- **inner circle** — depth 1: members sharing a private community directly
- **trusted** — BFS depth 2: inner circle members' inner circle
- **extended** — BFS depth 3: trusted members' inner circle</details>
      <allowed>
        <item>inner circle</item>
        <item>trusted</item>
        <item>extended</item>
        <item>discovery graph (the full traversal structure across all depths)</item>
        <item>circle depth</item>
      </allowed>
      <forbidden>
        <item>social circle (ambiguous; use "inner circle" for depth 1)</item>
        <item>followers, following (removed; not the model)</item>
        <item>friends (not the model)</item>
        <item>network (too generic)</item>
        <item>circle as a stored entity (the `social_circles` and `social_circle_memberships` tables were dropped in migration 004)</item>
      </forbidden>
      <notes>
        <note>The mechanism that creates circle bonds is **private community co-membership**.</note>
        <note>Public communities and public events do not affect circle membership.</note>
        <note>Private event co-participation is not part of the current circle contract.</note>
        <note>Use "discovery graph" when referring to the full traversal structure. Use depth labels (inner, trusted, extended) when referring to specific scopes.</note>
        <note>In UI copy, the navigation tabs should be: Inner / Trusted / Extended / All.</note>
      </notes>
      <related>
        <item>community (private)</item>
        <item>relationship</item>
        <item>discovery</item>
        <item>visibility</item>
      </related>
    </term>
    <term name="community" authority="social.elonn.local">
      <definition>A named, visibility-scoped group of members. Communities are the primary organizational unit of the social layer and the mechanism that creates inner circle relationships.</definition>
      <allowed>
        <item>public community (open membership by invitation; conversations visible to all members)</item>
        <item>private community (membership by invitation only; creates inner circle bonds)</item>
        <item>community membership</item>
        <item>community conversations</item>
        <item>community visibility</item>
      </allowed>
      <forbidden>
        <item>group (ambiguous; do not use)</item>
        <item>channel (connotes real-time chat; not the model here)</item>
        <item>room (same as channel)</item>
        <item>team (implies work/productivity context)</item>
        <item>club (too casual)</item>
        <item>network (overloaded)</item>
      </forbidden>
      <notes>
        <note>Membership in a **private** community establishes an inner circle relationship (depth 1) between co-members. This is the primary mechanism for circle derivation.</note>
        <note>Public communities do not affect circle membership.</note>
        <note>Members are not self-joining; they are invited. The owner and moderators manage membership.</note>
        <note>Each member gets a default public community and a default private community seeded on first login.</note>
      </notes>
      <related>
        <item>membership</item>
        <item>circle</item>
        <item>conversation</item>
        <item>visibility</item>
        <item>event</item>
      </related>
    </term>
    <term name="conversation" authority="social.elonn.local">
      <definition>A titled, threaded discussion anchored to a visibility scope. Conversations are the primary social object for group discourse. Every conversation has a creator, a visibility setting, and zero or more replies.</definition>
      <details>Visibility scopes:
- `public` — visible to any member within the discovery graph
- `community` — visible to members of the linked community
- `private` — visible only to named participants</details>
      <allowed>
        <item>public conversation</item>
        <item>community conversation</item>
        <item>private conversation</item>
        <item>conversation thread (informal; acceptable in UI copy only)</item>
        <item>reply to a conversation</item>
      </allowed>
      <forbidden>
        <item>thread (reserved for message and Social DM containers; qualify it)</item>
        <item>chat (implies real-time; not the model)</item>
        <item>post (connotes a feed item; not the model)</item>
        <item>topic (ambiguous)</item>
        <item>discussion (acceptable in UI prose but not as a technical noun)</item>
      </forbidden>
      <notes>
        <note>Events have an attached conversation for their discussion. This is an **event conversation**, not a standalone conversation.</note>
        <note>One-to-one communication uses a **thread**, not a conversation. Open Messages belong to Messages; Social DMs belong to Social.</note>
      </notes>
      <related>
        <item>reply</item>
        <item>message</item>
        <item>social-dm</item>
        <item>community</item>
        <item>event</item>
        <item>visibility</item>
      </related>
    </term>
    <term name="discovery" authority="social.elonn.local">
      <definition>The traversal of circle reach, built from private community co-membership. Discovery determines which members and Social objects are reachable at each circle depth.</definition>
      <details>Depth labels:
- depth 0 — self only
- depth 1 — inner circle (direct private community co-membership)
- depth 2 — trusted (inner circle's inner circle)
- depth 3 — extended (trusted's inner circle)</details>
      <allowed>
        <item>discovery graph</item>
        <item>discovery depth</item>
        <item>reachable members</item>
        <item>discovery scope</item>
      </allowed>
      <forbidden>
        <item>search (that is find.elonn.local; see: find)</item>
        <item>network (too generic)</item>
        <item>social graph (acceptable in technical discussion; not the product term)</item>
        <item>connections (LinkedIn-connoted)</item>
        <item>followers (removed from the model; see: relationship)</item>
      </forbidden>
      <notes>
        <note>Discovery is not a stored structure. It is computed on demand from private community co-membership.</note>
        <note>The `GET /social/discovery/graph` endpoint exposes the computed graph for the current member.</note>
        <note>Discovery filters apply to conversations, communities, events, and presence when a `depth` parameter is supplied.</note>
        <note>**Do not conflate discovery with the find service.** Discovery is about who you can see. Find is about what content you can search.</note>
      </notes>
      <related>
        <item>circle</item>
        <item>community (private, the source of inner circle bonds)</item>
        <item>find (distinct search service; see: find)</item>
        <item>visibility</item>
      </related>
    </term>
    <term name="event" authority="social.elonn.local">
      <definition>A scheduled social gathering with a title, optional time bounds, visibility, and an attached conversation. Events have participants who RSVP and can link to communities.</definition>
      <details>Visibility scopes:
- `public` — visible to any member within the discovery graph
- `private` — visible only to the owner and active/invited participants</details>
      <allowed>
        <item>event</item>
        <item>social event (when disambiguation with time events is required)</item>
        <item>event conversation (the conversation attached to an event)</item>
        <item>event participant</item>
        <item>event RSVP</item>
      </allowed>
      <forbidden>
        <item>calendar event (that belongs to the time service; see: time)</item>
        <item>time event (same)</item>
        <item>meeting (implies productivity/work context)</item>
        <item>appointment (same)</item>
        <item>happening (too informal)</item>
      </forbidden>
      <notes>
        <note>Every event has an attached conversation created at the same time as the event. Replies to an event go into this conversation.</note>
        <note>Private event co-participation is not part of the current circle contract.</note>
        <note>"Event" unqualified always means a social event. When referring to a time service calendar entry, always qualify: **calendar event**.</note>
        <note>The social service pushes event data to the time service via sync. Time does not own social events.</note>
        <note>Each member gets a default public event and a default private event seeded on first login.</note>
      </notes>
      <related>
        <item>conversation (event conversation)</item>
        <item>reply (event reply)</item>
        <item>participant</item>
        <item>community</item>
        <item>circle</item>
        <item>time (calendar event recipient)</item>
      </related>
    </term>
    <term name="message" authority="messages.elonn.local">
      <definition>An open one-to-one member communication outside Social context. Messages live in two-participant threads owned by `messages.elonn.local`.</definition>
      <allowed>
        <item>message thread</item>
        <item>message inbox</item>
        <item>send a message</item>
        <item>new message</item>
        <item>open message</item>
      </allowed>
      <forbidden>
        <item>using "message" to mean a reply in a conversation</item>
        <item>using "message" to mean an event reply</item>
        <item>using "message" interchangeably with "conversation"</item>
        <item>using "message" to mean a Social DM</item>
        <item>adding a third member to a message thread</item>
      </forbidden>
      <notes>
        <note>Message threads are strictly one-to-one. If communication needs more than two members, create or use a Social community, conversation, or event instead.</note>
        <note>A **reply** is not a message. Replies go into conversations or events.</note>
        <note>A **Social DM** is not a platform Message. Social DMs start from Social context and remain owned by Social.</note>
        <note>The message inbox aggregates all threads where the current member is a participant.</note>
      </notes>
      <related>
        <item>social-dm</item>
        <item>reply</item>
        <item>conversation</item>
        <item>inbox</item>
      </related>
    </term>
    <term name="notification" authority="social.elonn.local">
      <definition>An alert delivered to a specific member about something that happened and is relevant to them. Notifications are targeted and recipient-scoped, unlike activity which is feed-oriented.</definition>
      <details>Fields:
- `recipient_identity_user_id` — who receives it
- `actor_identity_user_id` — who caused it (optional)
- `object_type` / `object_id` — what it is about (optional)
- `title` — short human-readable label
- `body` — optional longer description
- `read_at` — null until the member reads it</details>
      <allowed>
        <item>notification</item>
        <item>unread notification</item>
        <item>mark notification as read</item>
      </allowed>
      <forbidden>
        <item>alert (acceptable in UI prose; not the technical noun)</item>
        <item>message (notifications are not messages; see: message)</item>
        <item>ping (too informal)</item>
        <item>push (describes delivery mechanism, not the object)</item>
      </forbidden>
      <notes>
        <note>Currently notifications are generated for conversation replies. Event RSVPs, event invitations, and community invitations do not yet generate notifications — this is a known gap.</note>
        <note>A notification is not an activity record. Activity is a public feed; notifications are private and recipient-specific.</note>
        <note>Notifications are marked read via `POST /social/notifications/{id}/read`.</note>
      </notes>
      <related>
        <item>activity (distinct public feed; see: activity)</item>
        <item>conversation</item>
        <item>event</item>
        <item>member</item>
      </related>
    </term>
    <term name="presence" authority="social.elonn.local">
      <definition>A member's real-time availability signal. Presence records the member's current status, availability, and the runtime they are using.</definition>
      <details>Fields:
- `status` — online / away / offline
- `availability` — open / busy / focus / invisible
- `visibility` — public / circle / private
- `context` — optional free-text string describing current activity
- `runtime` — the client environment the member is using (e.g. `web.elonn`)</details>
      <allowed>
        <item>presence signal</item>
        <item>presence status</item>
        <item>presence record</item>
        <item>online presence</item>
      </allowed>
      <forbidden>
        <item>online status (acceptable in UI prose; not the technical noun)</item>
        <item>activity status (activity is a separate object; see: activity)</item>
        <item>indicator (describes UI rendering, not the object)</item>
      </forbidden>
      <notes>
        <note>A member with `visibility = 'circle'` is only visible to their inner circle members.</note>
        <note>A member with `visibility = 'private'` is only visible to themselves.</note>
        <note>Presence is updated by the client via `POST /social/presence`. It is not derived.</note>
        <note>`availability = 'invisible'` does not mean `status = 'offline'` — a member can be invisible while online.</note>
        <note>The `runtime` field identifies which client the member is present in, not a world runtime contract.</note>
      </notes>
      <related>
        <item>activity (distinct; see: activity)</item>
        <item>circle (visibility scoping)</item>
        <item>visibility</item>
        <item>runtime (client identifier; see: runtime)</item>
      </related>
    </term>
    <term name="profile" authority="social.elonn.local">
      <definition>A member's social-layer identity. Profile is distinct from the API identity record — it is the social representation of a member, authored by that member for the social context.</definition>
      <details>Fields:
- `identity_user_id` — foreign key to the API identity record
- `display_name` — the name shown to other members
- `handle` — URL-friendly unique identifier (e.g. @handle)
- `bio` — optional free-text self-description</details>
      <allowed>
        <item>profile</item>
        <item>social profile</item>
        <item>member profile</item>
        <item>display name</item>
        <item>handle</item>
      </allowed>
      <forbidden>
        <item>account (that is the login area at elonn.local)</item>
        <item>user profile (user is not a product term; see: member)</item>
        <item>identity (that is the API service record; distinct)</item>
        <item>avatar (a display property, not the object)</item>
      </forbidden>
      <notes>
        <note>A profile is created automatically on first social service interaction via `ensureProfile()`.</note>
        <note>A member always has exactly one profile per social service instance.</note>
        <note>`display_name` can be null; fall back to the member's email from the identity record for display purposes.</note>
        <note>`handle` must be unique across all profiles and is optional. When set, it becomes the member's social URL segment.</note>
      </notes>
      <related>
        <item>member</item>
        <item>identity</item>
        <item>handle</item>
      </related>
    </term>
    <term name="relationship" authority="social.elonn.local">
      <definition>An explicit, directional record from one member to another expressing a social stance. Currently only the `block` type is supported.</definition>
      <allowed>
        <item>block (the only active relationship type)</item>
        <item>blocking a member</item>
        <item>blocked member</item>
      </allowed>
      <forbidden>
        <item>follow (removed; was a relationship type; do not reintroduce)</item>
        <item>follower (removed along with follow)</item>
        <item>friend, friendship (not part of the model)</item>
        <item>connection (LinkedIn-connoted; not the model)</item>
        <item>subscribe (not the model)</item>
      </forbidden>
      <notes>
        <note>The `follow` relationship type was removed in migration 004_authorization.sql. Do not reintroduce it.</note>
        <note>Circle membership is **not** a relationship. Circles are derived from private community co-membership, not stored as relationship records.</note>
        <note>Block is bidirectional in effect: if A blocks B, B cannot appear in A's discovery graph and vice versa.</note>
      </notes>
      <related>
        <item>circle</item>
        <item>block</item>
        <item>community</item>
        <item>discovery</item>
      </related>
    </term>
    <term name="reply" authority="social.elonn.local">
      <definition>A post added to an existing conversation or event by any member who can view it. Replies extend a conversation or event's discussion. They do not create new threads or branches.</definition>
      <allowed>
        <item>reply to a conversation</item>
        <item>reply to an event</item>
        <item>event reply</item>
        <item>conversation reply</item>
      </allowed>
      <forbidden>
        <item>comment (connotes a secondary or subordinate voice; replies are first-class)</item>
        <item>response (acceptable in error copy; not a domain noun)</item>
        <item>answer (implies Q&amp;A structure)</item>
        <item>post (ambiguous with social feed semantics)</item>
        <item>message (a reply is not the same as an open message)</item>
        <item>Social DM (a reply is not private)</item>
      </forbidden>
      <notes>
        <note>The API action for posting a reply is `POST /social/conversations/{id}/messages` or `POST /social/events/{id}/messages`. The path segment `/messages` is a legacy payload route segment, not the product term — the user action is always called a **reply**.</note>
        <note>Replying to a public conversation automatically adds the replier as a participant.</note>
      </notes>
      <related>
        <item>conversation</item>
        <item>event</item>
        <item>message</item>
        <item>social-dm</item>
        <item>participant</item>
      </related>
    </term>
    <term name="social-dm" authority="social.elonn.local">
      <definition>A private one-to-one communication initiated from Social context. Social DMs belong to `social.elonn.local` because their meaning comes from profiles, conversations, communities, events, replies, presence, activity, circles, discovery, or relationship rules.</definition>
      <allowed>
        <item>Social DM</item>
        <item>DM member</item>
        <item>Social DM thread</item>
        <item>Social DM inbox</item>
      </allowed>
      <forbidden>
        <item>calling a Social DM a platform Message</item>
        <item>placing Social DMs in the member dashboard or global service launcher</item>
        <item>adding a third member to a Social DM thread</item>
      </forbidden>
      <notes>
        <note>Social DMs are contextual Social behavior, not a separate platform Message.</note>
        <note>If a private thread needs more than two members, create or use a Social community, conversation, or event instead.</note>
        <note>Social DMs may appear in Social context, Social object detail, member/profile cards, Social notifications, activity, or Social runtime presentation.</note>
      </notes>
      <related>
        <item>message</item>
        <item>reply</item>
        <item>social</item>
        <item>community</item>
      </related>
    </term>
    <term name="visibility" authority="social.elonn.local">
      <definition>The access scope of a social object. Visibility determines which members can see a given conversation, community, event, presence record, or activity entry.</definition>
      <details>Values (social service):
- `public` — visible to any member within discovery reach
- `community` — visible to members of the linked community (conversations only)
- `circle` — visible to inner circle members (presence and activity only)
- `private` — visible only to named participants or the owner</details>
      <allowed>
        <item>conversation: public / community / private</item>
        <item>community: public / private</item>
        <item>event: public / private</item>
        <item>presence: public / circle / private</item>
        <item>activity: public / circle / private</item>
      </allowed>
      <forbidden>
        <item>`followers` (removed in migration 004; replaced by `circle`)</item>
        <item>`friends` (never existed in this system)</item>
        <item>`unlisted` (not a supported scope)</item>
        <item>Applying `circle` to conversations or communities (not supported)</item>
        <item>Applying `community` to events or presence (not supported)</item>
        <item>Using visibility interchangeably with permissions (visibility controls read access; permissions control write access)</item>
      </forbidden>
      <notes>
        <note>The `followers` visibility value was removed in migration 004_authorization.sql. Any code or migration referencing `followers` as a visibility value is incorrect.</note>
        <note>Find has its own visibility concepts (`public`/`private`) that do not include `circle` or `community`. Those are social-specific.</note>
      </notes>
      <related>
        <item>circle</item>
        <item>community</item>
        <item>discovery</item>
        <item>relationship (block affects visibility indirectly)</item>
      </related>
    </term>
  </section>
  <section name="identity" authority="mixed">
    <term name="member" authority="api.elonn.local">
      <definition>A person with a registered account in the Elonn identity system. Members are the human actors across all services. The API service is the single authority for membership.</definition>
      <allowed>
        <item>member directory</item>
        <item>member count</item>
        <item>invite a member</item>
        <item>member_id (alias for identity_user_id in external-facing contexts)</item>
      </allowed>
      <forbidden>
        <item>user (deprecated; internal DB column only)</item>
        <item>account (UI copy for login only; not a domain noun)</item>
        <item>person, human, individual (too generic)</item>
      </forbidden>
      <notes>
        <note>Internally, the database column is `identity_user_id`. External API responses expose `member_id` or reference the member via their `identity_user_id`. Do not expose `identity_user` as a product term.</note>
        <note>A member always has one profile per social service instance.</note>
      </notes>
      <related>
        <item>profile</item>
        <item>identity</item>
        <item>token</item>
        <item>session (auth session)</item>
      </related>
    </term>
    <term name="session" authority="varies — always qualify">
      <definition>A bounded interaction context. "Session" alone is ambiguous across services and must always be qualified.</definition>
      <details>Qualified forms:

**Auth session** (`api.elonn.local`)
A time-bounded record linking a member to an issued token. Expires. Stored in `identity_sessions`.

**Runtime session** (`world.elonn.local`)
The composed world state returned to the web runtime at boot. Contains the member's layout, services, and contract version. Not stored — computed on each request.

**Find session** (`find.elonn.local`)
A query session grouping a member's search activity. Stored in `finding_sessions`.</details>
      <allowed>
        <item>auth session</item>
        <item>runtime session</item>
        <item>find session</item>
      </allowed>
      <forbidden>
        <item>session alone (must be qualified in all code, routes, payload keys, and UI copy)</item>
      </forbidden>
      <notes>
        <note>In the world runtime contract, the `session` key refers to the **runtime session** — the member's current world context. It is not the auth session.</note>
        <note>Auth sessions are managed entirely by the API service. Other services do not store or extend auth sessions.</note>
      </notes>
      <related>
        <item>token (auth credential; see: token)</item>
        <item>runtime (world runtime session)</item>
        <item>contract</item>
      </related>
    </term>
    <term name="token" authority="api.elonn.local">
      <definition>A credential issued by the API service after successful authentication. Tokens authenticate Runtime-World requests and identify the authenticated member represented by those requests.</definition>
      <allowed>
        <item>API token</item>
        <item>auth token</item>
        <item>signed access token</item>
        <item>elonn_api_token (the cookie name)</item>
        <item>Bearer token (when transmitted via Authorization header)</item>
      </allowed>
      <forbidden>
        <item>key (too generic)</item>
        <item>password (a token is not a password)</item>
        <item>secret (describes storage requirement, not the object)</item>
        <item>JWT (the token format is an implementation detail; not a product term)</item>
      </forbidden>
      <notes>
        <note>The token is transmitted as the `elonn_api_token` HTTP cookie in browser contexts.</note>
        <note>Runtime requests may also transmit the token as a Bearer token when the runtime contract permits it.</note>
        <note>World validates signed access tokens locally at the Runtime-World boundary. Normal runtime requests do not call API for token validation.</note>
        <note>Internal component boundaries use service authentication and authenticated member identity rather than member credentials.</note>
        <note>CalDAV clients use the member's normal account identifier and password; no separate DAV token is issued.</note>
      </notes>
      <related>
        <item>session (auth session; see: session)</item>
        <item>member</item>
        <item>api</item>
      </related>
    </term>
  </section>
</glossary>
