The BBB Method,
explained end-to-end.
The methodology, the engine, and the platform — what each one is, why it exists, and how they fit together. Read this top to bottom to understand the whole system; jump to the 28-day cycle validator to see it run against any client profile.
Philosophy
Every engine number traces back to Ben's first principles. Read this before anything mechanical.
Every engine number traces back here. Volume is scaling; Frequency is density. The denominator decides how much of the numerator the body can actually convert into tissue.
The whole methodology, on one face.
Train with intent. Recover with discipline. Eat with purpose. Each pillar maps to engine mechanics — the methodology articles in 00-philosophy/ spell out which.
Tension
Mechanical load on the target muscle. The cellular trigger for growth.
Control
Tempo + range. Convert load into productive tension instead of momentum.
Recruitment
Mind–muscle connection. The trainable skill that makes the target do the work.
Fatigue
Effective reps (0–3 RIR). The on-8 Set Score threshold codifies it.
Recovery
Per-muscle recovery windows. The denominator of the Hypertrophy Equation.
Progressive Overload
Seven levers: execution > load > reps > sets > range > tempo > density.
Consistency
Same stimulus, repeated. Staple exercises across years; variation within structure.
System architecture
Three layers, one direction of flow. Methodology defines what; engine computes; platform delivers.
Methodology
built-by-ben/methodologyThe canonical source of truth. Every article in this repo is what the engine is supposed to do. Edits flow through methodology PRs; auto-sync mirrors them into platform.
- 00-philosophy/ — Ben's first-principles articles (11)
- 01-engine-pipeline/ — the 12 stages, spec-side
- 02-reference-systems/ — exDB, equipment, variants
- 05-governance/ — audit-trail · era archives · CHANGELOG
Engine
bbb-platform · lib/engine/Twelve pure-function stages. Same inputs always produce the same outputs. The engine pins itself to a methodology version; tests pin engine outputs against canonical fixtures.
- stages/ — one file per stage · pure (input) → output
- tables/ — tbl_* lookup data (exDB, focus, equipment presets)
- fixtures/ — canonical sample clients pinned to methodology §5
- __tests__/ — per-stage + per-D-decision + integration
Platform
bbb-platform · app/ + components/Next.js 16 App Router. Three rendering tiers project from the same methodology: public (marketing), subscriber (in-app coaching), internal (this validator + admin tools).
- lib/methodology/public.ts — marketing pages (access_tier: public)
- lib/methodology/subscriber.ts — in-app coaching (gated)
- ai/methodology-loader.ts — prompt-cached "Ask Ben" chatbot
- Supabase · Stripe · Cloudflare R2 + Stream · Resend
Code-canonical here. Methodology-canonical at built-by-ben/methodology. The subtree at methodology/ is read-only — edits flow back through the methodology repo.
Postgres + RLS. Per-client equipment profile, admin exclusion list, intake notes, session history. Engine is persistence-agnostic; it reads ClientProfileInput from whatever loads it.
access_tier frontmatter on every methodology article decides which renderer projects it: public marketing, gated subscriber, or internal-only.
Engine pipeline
Five phases, twelve stages — each one produces something concrete you can inspect inside the validator. Read it top to bottom like a coaching journey.
Intake
Tell us who the client is.
21-field client profile validated end-to-end.
Read the client
Figure out where they are physically + where they're heading.
Body comp, energy, volume scalar, where they are in the phase cycle.
Match the goal × experience to the right rep scheme.
Pick the training split — honor the client's preference if it fits the frequency.
Set the week
What training shape fits today.
Pick today's focus from 19 internal IDs × 4 variant rotations = 76 structures.
Per-muscle monthly volume target driven by AdjVol + frequency.
How many slots actually fire today — clamp(4, 8).
Pick the work
Which exercises actually fire today, and what comes next.
Cluster lookup → equipment + admin exclusion filter (D62) → variant filter → ordinal pick → coach override.
Rotate focus across sessions · D30 pairing across the 4-week cycle.
Build the session
Sets, reps, loads — what the client actually sees.
Allocate working sets per slot via D13 / D17 / D22 rules.
Accumulate effective sets per muscle; advance the phase when ready.
Final session card — set-by-set table, totals, per-muscle accumulator.
Stage 11 (Memory) feeds Phase 2 on the next session. Phase advances automatically when every muscle hits its weekly minimum — Base → Build → Peak → Deload.
One client, end-to-end
The same sample client runs through every test we ship. Here are the real inputs and what Stage 12 actually returns.
The 21-field client profile
One real intake — the canonical sample client from lib/engine/fixtures/sample-client.ts. Every downstream stage reads from this shape; the schema doubles as the contract for the subscriber-facing intake form.
- name
- Sample Client
- age
- 32
- sex
- Male
- height
- 5′ 10″
- weight
- 185 lb
- body fat
- 18%
- experience
- Intermediate
- current freq
- 3/wk
- goal freq
- 4/wk
- goal
- Build Muscle
- split
- Push/Pull/Legs
- weak 1
- Back
- weak 2
- Quads
- strong
- Chest
- activity
- Moderate
- nutrition phase
- Maintenance
- legEmphasis
- Both
- mode
- FallWhereTheyFall
- static days
- —
- squat
- —
- bench
- —
- deadlift
- —
- biceps_double_iso
- false
What Ben knows about this client
The engine doesn't try to model coaching judgment. It accepts structured constraints from Ben + the client and applies them at Stage 7 Step 0c.
Equipment availability
Tier preset (bodyweight_only / home_gym / apartment_gym / commercial_gym) + per-implement overrides + quantitative caps (max DB lbs, max plate inventory).
Admin exclusions
Per-client list of exercise IDs to drop from the candidate pool. Set by Ben on the onboarding Zoom (injuries, preferences, equipment edge cases collapsed into structured decisions).
Free-text intake notes
Client's own words. Collapses into Domain 2 via Ben's judgment — Ben IS the rules engine for coaching nuance. The engine never parses free text.
Engine output for the same client
All values below are computed live by runPipeline() against the sample client. Refresh and the page re-runs the full 12-stage pipeline — no fixtures, no drift.
What the subscriber experiences
One 28-day cycle from signup to phase boundary. Ben enters the flow exactly once.
Subscriber
What the paying client experiences from signup through one full monthly phase. Ben enters the flow once (the onboarding Zoom). The engine does everything else.
- Step 1 / 8
Sign up
builtbyben.comPublic marketing site → email + payment intent. Subscriber tier unlocked on Stripe confirmation.
- Step 2 / 8
Subscribe
StripeEmbedded Checkout → customer record at app layer (clean separation from Supabase Auth identity).
- Step 3 / 8
Intake form
21 fields · D62 domainsPersonal + fitness + priorities + equipment toggles + free-text notes. Saved as ClientIntakeInput in Supabase.
- Step 4 / 8
Onboarding Zoom
Ben · onceBen reviews intake live. Converts free-text notes + injury history into structured admin exclusions.
- Step 5 / 8
First session prescribed
runPipeline()Engine fires Stage 0-12 with empty history. Returns Stage 12 rendered session — slots, sets, reps, loads.
- Step 6 / 8
Daily session loop
Stage 8b · 28 daysEach day, Stage 8b decides train-or-rest. If train, runPipeline returns today's session. Client logs reps + difficulty.
- Step 7 / 8
Phase advancement
Stage 11 · breadth-gatedWhen ALL 14 muscles hit their weekly_min, Stage 11 advances Base → Build → Peak → Deload automatically.
- Step 8 / 8
Next cycle
month-over-monthPhase progression resets at Deload completion; per-muscle volume budget recalibrates for the next 28-day arc.
How the coaching + methodology loops work
Two lanes: the daily per-client loop, and the methodology-evolution loop that keeps the spec moving forward.
Per-client coaching
What Ben does between intake and the next intake. The engine doesn't replace coaching — it operationalizes Ben's decisions so every client gets the same standard of care.
- Step 1 / 4
Review intake
Read the 21-field profile + the free-text notes before the Zoom. Build mental model of the client.
- Step 2 / 4
Set admin exclusions
D62 Domain 2Decisions from the Zoom converted into structured exercise-ID exclusions. Stored per-client in Supabase.
- Step 3 / 4
Monitor sessions
session historyWatch how the prescribed sessions are landing. Effective sets per muscle, phase progress, difficulty trend.
- Step 4 / 4
Adjust per-client
Coach OverridesIf a client needs deviation from the engine default, push a Coach Override (slot-level exercise swap, variant E).
Methodology evolution
When Ben surfaces a new architectural decision (a D-number), it goes through methodology before it ever touches engine code. Two repos, one direction of flow.
- Step 1 / 6
Ben raises a question
Coaching observation or methodology gap. Logged for the next Ben↔Josh sync.
- Step 2 / 6
Josh writes the spec
audit-trail.mdNew D-decision authored in built-by-ben/methodology. Reasoning + resolution + downstream cascade.
- Step 3 / 6
Methodology PR
revision:PR merges into methodology main. semantic-release tags it (v0.18.0 → v0.18.1 / v0.19.0).
- Step 4 / 6
Auto-sync to platform
git subtreerepository_dispatch fires platform's methodology-sync workflow. Squashed subtree PR opens automatically.
- Step 5 / 6
Engine adapts
METHODOLOGY_VERSIONEngine code change (if any) lands in a follow-up PR against the synced spec. METHODOLOGY_VERSION pin advances.
- Step 6 / 6
Tests pin the contract
998 testsPer-stage snapshots + D-decision tests pin the new behavior against canonical fixtures. CI enforces.
See the full monthly cycle for any client.
The cycle validator iterates Stage 8b across 28 days and runs the full pipeline for every train day. Click into any session to see the rendered card + derived profile + coach internals.