← All decisions

Forum uses admin-curated tags, not member-curated channels

accepted

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 events AND volunteers-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 internalize shape). 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).