Learning Platformindex / ADRs / ADR-002E1

ADR-002 — Dedicated home — iron & service topology

Status: Proposed (design-panel synthesis) · Date: 2026-07-22 · Track: E1 (dedicated iron — Pillar 5) Method: adversarial design panel — estate-scout + four thinker-canon lenses (cloud-architecture/load-shape · observability/saturation · simplicity · data-durability). Dissent preserved below.

Follows the ADR-001 template. Brand-free: iron, stores, and services named by capability only.


1. Context

The foundation spec (Pillar 5) commits the platform to its own dedicated iron — off the general estate box — so its three spiky internal workloads (live-event video, AI inference, realtime) never compete with the rest of the estate. §9 leaves the shape open: "one bigger box vs. a small fleet (learning / community+realtime / AI split)." E1 decides that shape.

The load is known and modest: tens → low-thousands of members, a small ops team with no night shift. The stateful heart is already locked by ADR-001 — an append-only conversation log as source of truth (I9), a relational store, a cache/session store, an object/media store (delivery decoupled — a paid host is a URL repoint), an AI index, and the identity store. What is not yet decided is where those bytes physically live, what shares their failure domain, and where the two ruinous-to-own-idle workloads (GPU inference, live-event video egress) run.

The estate-scout confirmed E1 is mostly greenfield iron — the server, service composition, store provisioning, and backup wiring do not exist yet. What the estate does supply is the operate/deploy/roll-back doctrine above the iron: a hook-injectable deploy wrapper with fail-closed smoke + auto-revert, host-hardening/secrets/ingress/backup/observability runbooks, and a push-to-deploy pipeline already staged for exactly this host (down to a live healthcheck fix). That layer is REUSE, not rebuild.

2. Decision drivers

3. Options considered

4. The panel (rankings diverged; read the core argument, not the rank)

Lens Rank #1 Core argument
Load-shape (cloud-architect) D The cruel mapping: the workloads you MUST isolate (video egress, inference) are exactly the ones you must NOT own (spiky, idle-expensive, elastic); the workload you SHOULD own (log + relational + cache + media origin + steady community app) is the flat, cheap one. Reconcilable only by owning the steady part, renting the spike — not a bigger box, not a fleet. Don't buy a GPU, don't buy egress.
Saturation (Gregg) D The live-event spike is a bandwidth + connection-concurrency problem, not a CPU one — a fleet that keeps egress on your own uplink saturates the same pipe. Only D moves the actual saturating resource off owned iron. But you're sizing iron for a load you haven't instrumented — wire U/S/E + RED and run a synthetic live-event load test before buying the box.
Simplicity (Torvalds) B Ops-service-count × team-size is the ballgame. One box off the estate satisfies the hard isolation constraint at minimum ops surface. A workload-fleet is premature generalization — 3× the patch/backup/triage surface for a load one box holds for a year. B is D at an earlier point in time: grow to D by peeling the spike off first, when a measurement forces it. Verify whether "AI inference" is even new GPU iron or just the estate's existing brain.
Data-durability (Kleppmann) D "Split by workload" (C) cuts across the grain — it fragments the source of truth into two authoritative relational stores keyed on the same member sub, inviting a replicated-mutable-tier leak (violates I9). Draw the fault line at stateful-vs-spiky: one owned consistency/backup domain for all durable state; rent only stateless-degradation workloads. And "one box" ≠ "one disk" — the log must not share a failure domain with its only durable copy.
Estate-scout E1 iron is greenfield; the estate supplies the operate/deploy/roll-back doctrine (deploy-wrapper auto-revert + this host's staged pipeline = REUSE), an adaptable agent control surface (dry-run + host-allowlist + .bak), and a read-only console skeleton (wrong data plane) — none shorten standing up the iron, all shorten operating it.

5. The convergence (what all five agree on, under the different ranks)

Despite ranking A/B/C/D differently, the lenses converge on one architecture:

  1. Kill co-tenancy (A). Every lens agrees with Pillar 5: co-residence gives the video spike and inference a path into the log's fsync/durability latency and shares fate with the estate. Dead on arrival.
  2. Kill the workload-fleet (C) at this scale. Torvalds (ops tax) and Kleppmann (fragmented source of truth + tier-leak surface) arrive from opposite doors at the same verdict, and Gregg adds the killer: a fleet split by workload doesn't even solve the egress spike — video still exits your uplink. C is isolation theater: most ops surface, least isolation of the actual saturating resource.
  3. The fault line is stateful-vs-spiky, not workload-vs-workload. Kleppmann names it; the load-shape lens confirms it (own the flat, rent the bursty); Torvalds confirms it (the only split that pays for itself is the genuinely different, genuinely spiky resource profile). Split by statefulness, never by "learning / community / AI."
  4. Own the steady stateful core on one box; rent the spiky stateless edge off-box. Isolation is bought by elasticity (rent and release the spike), never by buying a bigger box (B "isolates" a spike that still lives inside it) and never by owning a GPU that idles 95% of the week.
  5. B and D are the same architecture at two points in time. Start on one owned box carrying all durable state; promote the spike (video delivery, GPU) off-box the day a measured saturation threshold forces it. Growth is a repoint, not a rebuild — the media-delivery repoint the spec already anticipates, extended to inference.
  6. Instrument before you size. You cannot pick or size any option honestly without U/S/E on NIC/proxy/stores and a synthetic live-event load test. The spec names an observability estate and uses none of it in E1.
  7. Durability is a separate axis from topology. "One box" is only safe if the source of truth has an off-box, restore-tested survival path. An untested backup of the log is exactly as real as an unenforced invariant: a wish.

6. Decision — "Own the stateful core · rent the spike · grow by repoint"

A hybrid that takes the winning move from each lens: ship B's single owned box today, architected as D, so the promotion to rented edges is a repoint the day a measured threshold demands it.

6.1 Own (one stateful core — one consistency + backup domain)

6.2 Rent (the spiky stateless edge — hold no source of truth)

6.3 Defer (Torvalds' cut — scoped, not killed)

7. Tradeoff matrix

Dimension A co-tenant B one box C fleet D hybrid Decision (B-as-D)
Isolates the spike off owned iron ❌ (spike lives inside) ⚠️ CPU only, egress still on uplink by elasticity, when measured
One consistency + backup domain for state ⚠️ shared w/ estate ❌ fragmented source of truth
Ops-service count / small team ✅ (no new iron) ❌ 3× surface ◑ (2 rental integrations) ✅ (one box now, edge later)
No owned idle GPU / egress ⚠️ tempts owning both ❌ owned GPU idles
Fault isolation of stateful core (SPOF) ❌ estate fate-share ❌ everything, one blast radius ◑ (edge isolated, core still single) ◑ → standby when justified
Reversibility (grow by repoint) ❌ calcifies by construction
Observable saturation (small footprint) ⚠️ ✅ fully probe-able ❌ N× correlation ⚠️ rented edge opaque ✅ + client-side SLI on edge
Source-of-truth survival (off-box) ⚠️ if drilled ⚠️ gated before first write

8. Consequences

New locked invariants (promote into the foundation spec §7, continuing ADR-001's I9/I10):

New required evals (the topology is only as trustworthy as these):

E1's first task is instrumentation + a load test, not a build: wire U/S/E (per store, proxy, NIC, and — if present — GPU queue depth) and RED at every service boundary into the estate telemetry backend, then run the synthetic live-event load test to size the rented tier against a measured peak. Only then finalize the box shape. Forensic instrumentation added mid-incident is archaeology during a customer outage.

Estate seams (what we actually reuse — from the scout):

9. Preserved dissent (do not resolve away)

10. Follow-up (beads to file in Phase B under the E1 epic)

  1. Lock invariants I11 + I12 + I13 into the foundation spec §7.
  2. P0 restore-the-source-of-truth drill (WAL-consistent + off-box + monthly restore-to-scratch) — gate before the first member write. Sibling to ADR-001's P0 tier-leak eval.
  3. P0 synthetic live-event load test (active-benchmarked to a named saturation metric) — sets the I11 spike-repoint threshold; gate before the first live event.
  4. Wire U/S/E + RED (stores · proxy · NIC · outbox lag · GPU queue if present) into the estate telemetry backend; add the P1 client-side video SLI.
  5. CTO investigation: is E1's "AI inference" new GPU iron or entirely the estate governed-brain + agent-governance plane? Measure the footprint before provisioning any GPU-hour.
  6. Finish the staged push-to-deploy pipeline for this host on the reused deploy-wrapper (fail-closed smoke + auto-revert); register the box as a governed estate service-entity with deploy contract, smoke, backup, and owner.
  7. Specify the media storage abstraction + content-hash/URL-indirection (I13) so the origin→CDN move is a repoint.
  8. Write the spike-repoint runbook: the measured threshold (from #3) that promotes video delivery / inference off-box, and the exact repoint steps.
  9. Hand the inference data-residency question (P1 eval) to the E3/E6 threat model; keep the AI index owned regardless of outcome.

Panel transcript basis: estate-scout + load-shape/observability/simplicity/data-durability lenses, 2026-07-22. Follows the ADR-001 template.