Learning Platformindex / roadmap / adr-001E4 + E5

ADR-001 · the template

Community & Messaging — the full decision

The first track worked all the way to the bottom. Status: Proposed (design-panel synthesis). Method: adversarial design panel — estate-scout + four thinker-canon lenses. Dissent preserved.

→ Read the 5-lens panel in full → The rendered architecture diagram

1Context

The forked learning core provides a per-course flat forum and announcements — and nothing else. The whole social platform — global boards/spaces, member directory, feeds/follows, member↔member DMs + group chat, events, notifications, presence — is greenfield. It must satisfy the locked foundation invariants: one identity, tier gates every object, AI permissioned at retrieval, one shell, on a small team.

The estate-scout confirmed: almost nothing in the estate is reusable turnkey for a human community. But the AI half (index + agent runtime) is real, existing estate.

2The four options considered

AFully custom on our own service (own everything).
BFork + reskin a mature OSS community/forum engine (adopt frontend-and-all).
CHeadless engine behind our shell (adopt the backend/API, render from our shell).
DCompose from estate blocks + our shell.

3The panel — rankings diverged, architecture converged

Every lens ranked the four options differently. Read the core argument, not the rank. Full verdicts →

LensRank #1Core argument
SimplicityB"Self-run stateful services × ops-team size" is the ballgame. Fork a forum, map trust-levels → tiers, use async notifications, kill the AI home + realtime + fleet for v1.
Build-vs-adaptCYou adopt-and-theme the learning core correctly, then contradict it by hand-building the most commodity piece. Put the seam at backend/presentation; own the shell; split boards from realtime; emit to the index via an outbox.
DataAYou've implicitly chosen event sourcing and not noticed. Own an append-only, member-keyed, tier-stamped log as source of truth; boards/DMs/feed are derived views; feed = read-time query; presence = separate AP soft-state.
AI-nativeDThe moat lives in the data layer. A foreign forum = two permission systems (→ tier leaks) + chunk drift. Own the object model + tier + index emission + agent read/write; borrow only the realtime transport.

4The convergence

  1. Never make a foreign forum the system of record. Simplicity picks B only by also cutting the AI moat — a different objective. Every lens that keeps the moat says a vendor schema as source-of-truth is fatal (two permission systems, chunk drift, mutable history, merge tax).
  2. Own the data + permission + write-path-into-the-index; rent the rendering + realtime transport. Three lenses enter from three doors into the same room.
  3. Split durable boards from ephemeral realtime. Different stores, different consistency.
  4. Feed = read-time query, tier evaluated at read. A materialized per-user timeline leaks content after a tier downgrade.
  5. The estate's real contribution is the AI half (brain = index; governance plane = runtime) — not the human-community rendering.

5Decision — "Own the log · rent the rendering · defer the bells"

Own (the moat — cheap now, catastrophic to retrofit)

event_id · conversation_id · seq (per-conversation monotonic, store-assigned — NOT wall-clock) · member_sub (FK) · tier_visibility (immutable on the object) · type · payload · created_at

Rent (the commodity — don't hand-roll, don't let it become the record)

Defer (the simplicity cut — scoped, not killed)

6Tradeoff matrix

DimensionA customB forkC headlessD estateDecision
Own the append-only log⚠️ if disciplined✅ by construction
One permission authority❌ two systems⚠️
Time-to-substance❌ slow✅ fast◑ rent rendering
Ops-service count / small team✅ defer bells
Reversibility of rendering✅ repoint
AI-indexable at write❌ chunk drift⚠️

7Consequences

New locked invariants (promote into the foundation spec)

I9 The conversation log is append-only and is the source of truth; every board/DM/feed is a derived, rebuildable view; tier is evaluated at read time against the reader's current tier. (The single most important missing sentence.)
I10 The community store and the tier/permission authority are ours; any borrowed component is a transport/library/derived-view, never the system of record or the permission authority.

New required evals (the moat is only as trustworthy as these)

P0 Retrieval-permission tier-leak eval, fail-closed. Golden set (member fixtures T0–T3, query, must-return / must-not-return) run on every model bump, prompt change, schema migration. No eval = the invariant is a wish. Built before the first agent reads the first board — a cross-tier leak in a paid, vetted community is the most expensive failure this platform can have.
P1 Directional home-ranking regression eval + a production engagement proxy (so the feed can't rot silently). P1 Per-flow prompt eval for each governed agent; fixtures are source code under review.

First task is a spike, not a build

Evaluate 2–3 candidate rendering engines against the contract (pure derived view fed from our log · presentation owned by our shell · our tier as sole permission authority). Decide C-vs-custom on evidence.

8Preserved dissent (do not resolve away)