0016 — Forum uses admin-curated tags, not member-curated channels
- Status: accepted
- Date: 2026-05-07 (decision locked); ADR documented 2026-05-13
- Deciders: Derek
Context
internalize (the working POC ark is the productized successor to, per ADR 0011) organizes forum discussion into channels — separate threaded surfaces members create and curate. For ark’s ICP (small arts orgs and NFPs, ~5–60 members), this shape was a net negative: channels proliferate, decay, and fragment attention; members spend energy curating taxonomy instead of using the tool. The same content needs to live in two places more often than not, and channel-membership signals create social friction that small orgs don’t have headroom to manage.
The alternative is tags: every thread lives in one stream, and admins curate a small flat set of tags applied N:M to threads. Members read one timeline and filter; admins shape what the taxonomy means for their org. This matches how a tenant’s forum content actually flows.
The decision was locked during the phase 2b design pass — see docs/superpowers/specs/2026-05-07-phase-2b-demo-readiness-design.md §4.4 — and the implementation is queued under Workstream C alongside scheduler/welcome-seeds/presence. This ADR formalizes the decision now (per ADR 0008, ADRs are product copy) rather than waiting for Workstream C to land.
Decision
ark’s forum has one thread stream per org. Threads carry zero or more tags drawn from an admin-curated set. There are no channels.
The data shape (queued for Workstream C):
forum_tags (
id uuid primary key default gen_random_uuid(),
organization_id uuid not null references organizations(id),
slug text not null,
name text not null,
color text,
sort_order int,
unique (organization_id, slug)
);
forum_thread_tags (
thread_id uuid not null references forum_threads(id) on delete cascade,
tag_id uuid not null references forum_tags(id) on delete cascade,
primary key (thread_id, tag_id)
);
Every domain rule that applies to other tables applies here — forum_tags.organization_id is non-null, RLS gates SELECT/INSERT/UPDATE/DELETE on org membership, and the keystone isolation test extends to cover both tables.
Curation is admin-only. Members tag threads from an admin-defined palette but cannot create new tags. This is the load-bearing difference from channels: the taxonomy is shaped intentionally, not emergent from member behavior.
Tags can be filtered combinatorially in the thread list (AND/OR semantics — design call deferred to implementation), and the same data drives the public-site filtering on tenants whose forum is publicly readable (if any; not all tenants surface forum publicly).
Consequences
Good:
- One taxonomy lever for an admin to maintain, no per-member curation tax.
- One thread stream simplifies notifications, search, and the realtime channel-prefix-by-org pattern from ADR 0002.
- Threads can carry multiple tags without duplication, which is the actual shape of NFP discussion (an event thread is
eventsANDvolunteers-needed). - Removing channels removes a source of social friction (who joins which channel, who can post where) that NFPs at our scale don’t have bandwidth to navigate.
Bad / accepted:
- Heavier-handed: admins must shape the taxonomy or the forum feels flat. A small org with no admin maintenance produces an undifferentiated feed. We accept this — admin attention is the lever we’re betting on, and tenants without that attention probably don’t need a forum.
- No private/sub-group sub-forums. If a tenant needs members-only discussion separate from main forum, that’s a feature request (out of scope today).
- Losing the channel concept means losing the natural sub-community shape. Larger orgs may outgrow this; revisit the ADR if a tenant asks.
Alternatives considered
- Channels (the
internalizeshape). Rejected per the rationale above for our ICP. Larger or differently-shaped tenants might disagree; this ADR is reversible by writing a successor. - Free-form member tags (no admin curation). Rejected because emergent taxonomies in small orgs accumulate noise faster than signal. Spell-variation, abandoned tags, near-duplicates — small orgs don’t have the moderator bandwidth to keep this useful.
- Both (tags primary, channels for sub-groups). Rejected as over-architected for v1; second-system warning. If sub-forum scoping is needed later, it can be added.
Trip-wires
Re-open this ADR (write a 0021 superseding it) when any of the following changes:
- A tenant explicitly asks for sub-forum scoping that tags can’t model.
- The forum has scaled to >500 threads per tenant and tag-only filtering becomes unwieldy in practice.
- A second feature (e.g. event scheduling) starts wanting its own thread surface and channel-style separation looks like the right answer for that workflow.
Implementation status
Queued for Workstream C. Decision is locked; schema and route work haven’t landed yet. Tracked in ROADMAP.md §4 (Forum + scheduling track).