Domain language for Frequency, a platform for place-based, in-person community practice. The vocabulary is deliberate; the same words appear in the schema, the URLs, and the UI. See DATABASE.md for the tables behind these.
Naming is canon-locked.
docs/NAMING.md(ADR-208) is the single source of truth for every game/community term: ranks, tiers, Pillars, Co-op, Circle Current, the two role axes. This glossary describes the tables and how the canon words map to them; where it once defined a name, it now points to NAMING.md. If a term here and NAMING.md ever disagree, NAMING.md wins.
⚠️ Code paths in this glossary are partly stale (checked 2026-09-04): six of the twelvelib/modules it names (lib/practice-shelf.ts,lib/practice-streaks-job.ts,lib/coop-pulse.ts,lib/awards/witnessed.ts,lib/journey-arc.ts,lib/journey-coop.ts) are no longer in the tree. Trust the term, verify the path;ARCHITECTURE.mdis the doc held to the tree bypnpm check:arch-doc. Status of any work lives indocs/BUILD-BACKLOG.json.
Four product nouns, plus Channels as the topical layer. CORE-MODEL.md is commercial law; NAMING.md wins names. Hubs and Nexuses emerge from clustering; they are not appointed top-down. An Outpost is not the top unit.
| Term | Table | Meaning |
|---|---|---|
| Member | profiles |
A person. Free to join. |
| Space | spaces |
A business's home on Frequency. |
| Circle | circles |
A room inside a Space, where a group meets. type is in-person (cap 50) or online (cap 100). Has location fields (city, neighborhood, lat/lng, timezone). Declares one topical Channel. |
| Event | events, event_rsvps |
When the room is open. |
| Channel | topical_channels |
Global topics you tune into. Circles run them locally. "Interests" is retired. |
Place scaffolding (not primary nav, not the top product unit). Member URLs fold into Space (LIVE-242 / ADR-1439); these tables remain because Circles still attach through circles.hub_id.
| Term | Table | Meaning |
|---|---|---|
| Hub | hubs |
Geography cluster of up to 5 Circles. hubs.space_id is the Space that now is that cluster. |
| Nexus | nexuses |
Geography cluster of Hubs. nexuses.space_id is the containing Space. |
| Outpost | outposts |
The brick-and-mortar home base of a Nexus: one per Nexus, the seed toward a Lab (NAMING.md §Community structure). Circles meet in homes/public spaces, never Outposts. When a Frequency Lab (standalone for-profit venue) exists in the Nexus, the Outpost HQ lives there. Not the top unit. |
| Nexus region | nexus_regions |
Legacy geography tree. Being phased out. |
There is ONE "channel" concept:
topical_channels. Global topical forums, janitor-managed, sorted under a Pillar viapillar_id. It powers the/channelsUI, the/admin/channelsconsole, and the Channel forum (posts.scope_id= a topical channel id). Circles link viacircles.topical_channel_id; members "tune in" viatopical_channel_memberships.The hierarchy-v2
channels/channel_membershipspair (hub/nexus/outpost "focus groups",20240102000000) was replaced by this one a month later and dropped, empty, on 2026-09-15 (ADR-1349). Nothing in the tree or the schema carries it; older docs and ADRs that mention it are history.
Roles are two orthogonal axes plus billing as a third independent attribute
(ADR-208; schema split in migration 20260613000050). NAMING.md
§Roles is the canonical definition; ROLES.md carries the longer-form
spec and ONBOARDING-BUILD-LIST.md §11 the build plan.
community_role: the aspirational community trust ladder, ascending: member → crew → host → guide → mentor.- member: signed up, attended a circle/event (free tier default).
- crew: the paid membership tier; participation + leadership training
tracks. Assignment rule (locked):
community_role='crew'is auto-set when billing goes paid (the billing webhook applies it);membership_tierstays the payment source of truth. "Crew = paid" is a business rule, not a schema coupling. - host: Crew volunteering as a Circle host; can post announcements, moderate, broadcast dispatches. · guide: oversees local hosts. · mentor: oversees Guides in a Nexus.
- "host+" = host or above within
community_roleonly.
web_role: the operational staff axis (not aspirational): admin (Site Admin) | janitor (Executive Admin) | none. It's the coarse gate for who may enter admin surfaces (and the janitor-only crown jewels). Theteam_membersstaff matrix (ADR-127) stays side-by-side as the fine-grained per-domain capability layer for scoped staff hires.profiles.web_roleis the new column (migration20260613000050); the deprecatedcommunity_roleadmin/janitorrungs are kept as no-ops for enum-order stability but no longer consulted by staff gates.- Billing (
membership_tier): a third, independent attribute, and exactly two rungs: Member (free) → Crew (paid). Supporter is a BADGE on Crew (profiles.is_supporter), not a rung: the tier was retired on 2026-08-24 and the column CHECKs tofree/crew.
Community-ladder authz still uses the HIERARCHY index-comparison pattern
(get_my_role() >= 'host'); staff gates read get_my_web_role().
| Term | Table(s) | Meaning |
|---|---|---|
| Post | posts |
Feed content scoped to a Circle (group visibility) or broadcast wider (cluster) for host announcements. |
| Dispatch | dispatches |
Broadcast content (dispatch_type: post / poll / challenge / article) shown at /nearby. Has comments, likes, polls. |
| Room | rooms, room_members, room_messages |
Group chat spaces (crew+ can create). Distinct from DMs. |
| Conversation | conversations, messages, conversation_participants |
1:1 and group direct messages. |
| Event | events, event_rsvps |
Gatherings. Support recurrence (materialised occurrences, not virtual) and ICS export. |
| Report | reports |
Moderation queue item targeting a post/dispatch/comment/member/event. |
The game is named The Quest. It is seasonal: a 13-week cycle aligned to the natural calendar (spring / summer / fall / winter) that resets, so every season is a fresh climb.
Naming is canon-locked. See
NAMING.md§The Quest (ADR-208). The hierarchy is Quest → Journey → Practice: a Quest (tablequests) is one season's 13-week instance and its official, free collection of three Journeys (Mind / Body / Spirit); a Journey (journey_plans) is a set of practices you move through; a practice is the atomic real-world act you do. Everything is free. The Quest is the brand for the year-round game (never in schema); aquestsrow always means the season instance ("Seasonal Quest" is retired phrasing). Named seasons: Stretch (Summer) / Shed (Autumn) / Sit (Winter) / Sprout (Spring). Always say Zaps/Gems, never "points". (Retired & gone: the legacy action-chain "Arc" engine (dropped, ADR-152); the old 6-rank Zap-threshold ladder; per-practice intensity tiers: do not reintroduce.)
Two currencies, split by where the activity happens. The rule is canonical
(ADR-139): anything online → Gems; anything in real life → Zaps, and it
applies to base actions AND the meta-layer (achievements, season challenges,
quests/arcs, streaks). A milestone pays the currency of the act it rewards: an
in-person challenge ("Attend 8 events") pays zaps; an online one ("Make 5 posts")
pays gems. The single source of truth is currencyForCriteria /
currencyForSource (lib/engagement/currency.ts).
- Gems: earned through internal, on-platform (web) engagement (posts,
comments, reactions, logins, RSVPs, joins, welcomes).
gem_transactions,gem_config,store_items,store_redemptions. The spendable currency: buy digital badges/cosmetics and trade for physical merch in the web store.awardGems()(lib/gems.ts). Tracked aslifetime_gems+current_season_gems. - Zaps: earned through external + in-person activity: showing up, hosting,
founding/leading a circle, outreach + invites that land, ghost-node captures,
business/NFC programs, and every practice log (personal or circle, the
real-world doing). Finishing a Journey pays +75 Zaps + a Pillar Trophy and no Gems
(the v2 escalating ladder is RETIRED, ADR-305; the third finish mints the Certificate,
which pays its own 100 Gems). An Expression Challenge pays +50 Zaps
in person at a Circle, or +30 Gems posted solo online. Zaps accumulate during the
season and roll into Gems at season end (5:1 flat). They drive Amplitude (lifetime
total) but no longer gate season rank directly. Ranks are completion-based (see
Season ranks below).
awardZaps()(lib/zaps.ts). Migration20260628010000_quest_completion_model.sqlmoved rank advancement off the Zap trigger. - Twin ledgers + the Vault log. Both currencies write one row per grant
(
gem_transactions/zap_transactions); anAFTER INSERTtrigger on each is the only place profile totals move. Rank advancement is now fired by Journey completion, not the Zap trigger. Those ledgers back the member-facing "how you earned" log in the Vault (/crew/store/ledger,lib/economy/ledger.ts).awardZaps/awardGemsonly ever append a ledger row. (Never call it a "points log"; it's Zaps/Gems.) - Season rollover: at season end,
reset_season()(migration20260614200000, ADR-219) convertsfloor(season_zaps / 5)into Gems flat for everyone (no rank bonus, the per-rank bonus is retired; per-Journey rewards replace it), mints aseason_trophiesrow for everyone who played, then zeroes season counters, all claim-then-pay viareward_grants. So Zaps are the seasonal "doing", Gems are the durable spendable. - Season ranks (completion-based):
ghost → initiate → adept → master(4 values, migration20260628010000_quest_completion_model.sql; the old 6-rank Zap-threshold ladder Echo/Signal/Beacon/Conduit/Luminary is retired). Rank = how many Journeys the member finished this season: 0 = Ghost, 1 = Initiate, 2 = Adept, 3 = Master. Advances automatically the moment a Journey finishes. No Zap threshold, no manual promotion, no challenge gate.rankForCompletion(journeysFinished). - Amplitude: lifetime XP (
profiles.amplitude, ADR-219): cumulative Zaps ever earned, hosting-class actions 2×, accrued only byafter_zap_transaction(). Never resets, never spent, never gates play. Level = largest L with50·L·(L+1) ≤ amplitude(lib/amplitude.ts); shown beside the season rank. Supersedes the lifetime-rank display (thelifetime_rankcolumn stays for the retro rules). Gem tiers (New→Legend) are retired. - Practice weight class:
practices.weight_class ∈ light|standard|heavyis the per-log Zap payout fallback (8/12/15, live inzap_config; ADR-219), used when a practice has no explicitreward_zaps. A property of the practice, never the member's depth tier. The explicit per-log VALUE isreward_zapswhen set (the Quest library values by CADENCE: Daily 10 / 3x-week 15 / Weekly 25, ADR-303);practiceZapValue()resolves value-then-fallback for both the award path and every display. - Practice Shelf: the profile module of per-practice awards (ADR-219): the
consistency ladder (In Motion 2w / Groove 4w / Deep Groove 8w / Full Cycle 13w,
only Full Cycle pays, +50⚡ once per practice) and the depth ladder (10/25/50/100
Deep). Cache:
practice_streaks; truth derives frompractice_logs(lib/practice-shelf.ts, nightlylib/practice-streaks-job.ts). - Co-op Pulse: +3⚡ when 3+ active members of one circle each log the same adopted
Journey the same day (nightly
lib/coop-pulse.ts; once per member/journey/date). Feeds Carrier Wave and the circle-level Co-op Synchrony award. - Witnessed awards: peer-granted (
witnessed_grants, ADR-219): Carried the Room (circle Host → a member of their circle) and Strong Signal (any member), each once per season per granter; displayed with the granted-by name (lib/awards/witnessed.ts). - Quests & Journeys: hierarchy Quest → Journey → Practice (canon; see NAMING.md
and THE-QUEST.md). A Quest (
quests) is a season's official, free container of exactly three Journeys (Mind, Body, Spirit, run sequentially ~4 weeks each); a Journey (journey_plans+journey_plan_items) is a set of practices, official (nested under a Quest viaquest_id) or member-built (open library), with progress derived from the practice log (ADR-144). Finishing a Journey pays +75 Zaps + a Pillar Trophy, no Gems (ADR-305), and advances the member's season rank. All free. (The legacy action-chain engine is retired and dropped, ADR-152.) - Challenge / Expression Challenge: the Expression capstone that completes each
Journey (a
season_challengesrow typedexpression, linked to its Journey viajourney_id). Required to finish the Journey. Pays +50 Zaps in person at a Circle, or +30 Gems posted solo online. The season-wide 15-challenge outreach engine is dormant (kept, not seeded). - Trophy: the award minted when a member finishes a Journey. Advances the season rank.
Pays no Gems: the escalating ladder (Initiate 25 / Adept 50 / Master 100) is RETIRED by
ADR-305 and LIVE-185 removed the code still paying it. Stamped with the rank reached and
stored in
season_trophies. - Pillars: Mind / Body / Spirit / Expression, the taxonomy Journeys are organised by
(table
pillars, migration20260613000010; renamed 2026, see docs/NAMING.md). Three Pillars carry Journeys (Mind / Body / Spirit); Expression is woven in as the Challenge capstone on every Journey, not a fourth Journey. Pillars are never called Channels (Channels = the topical forum feature only). - Per-practice intensity tiers: RETIRED (June 2026). The Initiate / Adept / Master
practice-content tier system is removed:
practice_tierstable +default_tier/tier_override/default_intensity_tiercolumns dropped (migration20260628000000_retire_practice_intensity_tiers.sql). The words Initiate / Adept / Master are now season ranks only (completion-based) and no longer name a practice setting. Weight class (light / standard / heavy) is the only per-practice variant that remains. - Two internal clocks: the rolling rhythm clock (cadence/streak) and the fixed
quest clock (a season = 91 days = 13×7 buckets). Both are internal-only: the UI says
"streak" and "season," never "rhythm/quest clock." A Journey completes when the member has
logged its Practices on 14-16 distinct days inside its ~4-week window and completed its
Expression Challenge. Derived from
practice_logs, no progress table (lib/journey-arc.ts, ADR-197). Completion fires the Trophy + rank advance + Zap/Gem grants viareward_grants(ADR-200). - Co-op: circle co-op completion: ≥3 active circle members on the same Journey
(
lib/journey-coop.ts, ADR-199; renamed 2026, see docs/NAMING.md). Distinct from Resonance: Resonance is the Connection-Layer tie strength (ADR-186), a separate concept. - Circle Current: a circle's collective, non-competitive seasonal standing (replaces
the prior term, renamed 2026, see docs/NAMING.md; internal column
circles.season_current, ledgercircle_current_transactions, migration20260613000040). See EVENTS-SYSTEM.md. - Frequency Signature: a member's four-Pillar practice balance, a derived profile identity
(
lib/frequency-signature.ts). - Achievements / streaks:
achievements,user_achievements,streaks,challenge_progress,season_challenges,season_trophies.
- Soft-hide: posts/dispatches get
hidden_at/hidden_by(recoverable). Listing queries must add.is('hidden_at', null); admin views deliberately don't. - Suspension:
profiles.suspended_{at,until,reason,by}. A DB trigger blocks suspended members from posting. - System profile: seeded row
handle='moderation', is_system=true, auth_user_id=NULL, carrying the Executive-Admin staff axis (web_role='janitor'; the legacycommunity_role='janitor'rung is retained as a deprecated no-op). Used as the DM sender when warning a member. Excluded from the members admin list.