Build a self-contained interactive course that takes someone with no marketing background to writing ads that actually sell, and get its first module into her hands tonight because a real apartment has to be listed by tomorrow morning.
The course is built from primary source, not summaries. Desktop\Mozi edu\hormozi-playbooks\ already holds ~2.3 MB of Hormozi material — $100M Offers, $100M Money Models, and eleven playbooks including Goated Ads, Hooks, Marketing Machine, Branding, Pricing and Lead Nurture. Frameworks get taught in his exact terminology with a line-range citation recorded for each one.
node verify_course.mjs prints ALL CHECKS PASSED before every deploy, with no browser opened.Three screens carry the whole product: the module list, the rep screen where the four-tier loop actually happens, and the export that hands her work to a grader. Everything else is a variation on the rep screen.
One message, seven formats. Condition · Label · Question · Command · Statement · List · Story.
Every later rep pulls from this. Fill it once.
A single loop is the wrong shape here. Three different jobs need three different latencies, and each one has a different grader — so they nest rather than compete. The fast loop builds accuracy, the slow loop builds transfer, and the outer loop is the only one that pays.
Tier 2 could be a "check your answer" button. It isn't, because reacting to a good example is recognition — she already has that. Committing a predicted grade first is what converts the rep from watching into producing, and it also gives the coach tier something to correct beyond the copy itself: whether she can tell good work from bad. The verifier fails the build if any reveal is reachable without its selfgrade.
Every module also opens with copywork — hand-copying a proven piece, from the 121-hook swipe file in the Hooks playbook or a top-performing real listing. It is the drill the profession has actually used for a century, and it is the one place she types someone else's words rather than her own.
Minutes are computed from screen contents, never declared in a header. A previous course in this house drifted 90 minutes low on declared numbers, so the verifier now owns the arithmetic.
| # | Module | Hours | When | Primary source | Ends with |
|---|---|---|---|---|---|
| 00 | Fundamentals | ~1.5 | Tonight | Branding · Hooks · Goated Ads · Offers | The Larry King rewrite: ego-copy → buyer-copy |
| 01 | The resale listing | ~4 | Tonight + AM | Hooks · Goated Ads · Lead Nurture + web | Apartment posted, 3 platforms, AR + EN |
| 02 | Offers & value | ~8 | Day 2 | 100M Offers · Pricing · Money Models | A named, priced inclusion stack for the flat |
| 03 | Hooks & headlines | ~8 | Day 3 | Hooks · Goated Ads | 50 hooks × 3 products; listing rewritten on 48h data |
| 04 | Short-form organic | ~8 | Day 4 | Marketing Machine · Goated Ads + web | 5 scripts written, 2 filmed |
| 05 | Landing & sales pages | ~8 | Day 5 | Offers · Pricing · Fast Cash | One full sales page, AR + EN |
| 06 | Outreach, warm & cold | ~8 | Day 6 | Lead Nurture · Fast Cash + web | 100 reachouts written, 30 sent |
| 07 | Paid ads & media buying | ~8 | Day 7 | Web-sourced + Branding's ad math | Dashboard diagnosis drills + one small live campaign |
| 08 | Bonus — money models | ~6 | optional | Money Models · LTV · Retention | Scoped, not built (see Open Questions) |
An extraction pass across the playbooks established exactly where the material runs out. This is the part most likely to go wrong quietly, so it is settled before authoring starts.
An apartment is a one-time sale of a single physical asset. Money models, continuity offers, LTV and churn math, refund guarantees and most pricing plays assume a customer who buys again — they do not apply, and a beginner who tries to bolt a subscription onto a flat has been taught badly. Module 01 uses only the transferable set; the recurring machinery is taught later, explicitly labelled as such, in modules 02 and 08.
Twelve screens, roughly four hours, split across tonight and tomorrow morning. It is ordered so that the ad exists before the polish does.
The one he wants for himself as much as for her, and the one with no source material on disk. The money math comes first and is drilled on generated dashboards: CPM, CTR, CPC, CVR, CPA, AOV, ROAS, breakeven, LTV:CAC. Then Ads Manager structure, objectives, CBO vs ABO, audiences, placements, pixel and CAPI, attribution windows; creative testing at Hormozi volume using his CTA A/B/C protocol; kill criteria and minimum spend per creative; frequency and fatigue; scaling rules. Worked examples run in two tracks — the apartment for her, StudyFix for him.
One dashboard in this module shows an obvious winner that isn't one — too small a sample, a misleading attribution window, or a seasonality artifact — and she has to catch it. Media buying is where confident wrong numbers cost real money, and reading a dashboard correctly is a separate skill from writing the ad. The verifier asserts this drill exists.
One self-contained page, no dependencies, no build step. Content is split one file per module — which is what makes the modules authorable in parallel without merge conflicts, and what keeps the engine stable while content churns.
app/
index.html engine only — CSS, hash router, widget engine, export + print views
data/
course.js module manifest; minutes computed from contents, never declared
m0.js … m7.js one file per module — the split that allows parallel authoring
fonts/ self-hosted variable fonts, including an Arabic face
manifest.webmanifest, icons
GRADING.md the loop protocol + a rubric per rep — the grading contract
SOURCES.md playbook + line range for every framework, and every web citation
verify_course.mjs the gate — must print ALL CHECKS PASSED before any deploy
STATUS.md live state, one screen
plans/ads-course/ this plan
Two courses in this house already run this engine — workspace\victor\course\index.html and Desktop\Sites\sf-design\. The second generation is the better one and is what gets carried over:
renderX() → HTML string, no DOM access) plus the mount guard that leaves document and window undefined — together these are what make headless node verification possible at all.esc() + mini-markdown pair from sf-design, not the first generation's const esc = s => s no-op.onclick, so widget state survives a re-render.| Widget | Job |
|---|---|
| dealsheet | The apartment form. Feeds every later rep, and makes the course reusable for the next thing she sells |
| write | Timed textarea rep, saved. dir="auto" so Arabic renders right-to-left correctly |
| pair | Side-by-side AR + EN — a rep is not complete until both are filled |
| selfgrade | Rubric checklist plus a committed predicted grade. Gates the reveal |
| check | Instant objective scoring — tier 1 |
| reveal | The A-grade worked example. Unreachable before a prediction |
| copywork | Proven original above, her retype below |
| metrics | Views / saves / messages at 24h, 48h, 7d |
| coachnotes | Where graded feedback gets pasted, pinned to that exact rep |
| dashboard | Realistic ad dashboards for module 07, including the false-green one |
| export | One button → the formatted block for WhatsApp |
Cheat sheets are a #/print route with print CSS, one A4 page per module with wide margins for annotation. Living inside the app means they cannot drift out of sync with the content the way separate PDFs would.
Key mozi.v1 — deliberately not sfc2 or sfdesign.v1, which belong to the two existing courses and would collide.
{
deal: { district, price, size, floor, papers, negatives, buyer },
answers: { "m1.r4.ar": "…", "m1.r4.en": "…" },
grades: { "m1.r4": { self: 3, predicted: 3, coach: 4 } },
checks: { "m1.r4": [1,1,0,0,1] },
metrics: { "dubizzle": { h24: {views,saves,msgs}, h48: {…} } },
notes: { "m1.r4": "coach feedback text" },
done: { "m1.r4": 1755400000000 },
step: { "m1": 4 }
}
Nothing leaves her browser. The deal sheet is never uploaded anywhere, and the published page makes no network requests.
The constraint that shapes everything: a listing has to be live tomorrow morning. So the engine and day one ship before a single line of the rest of the week is written, and the deadline stops being at risk while there is still most of a session left to spend on the other six days.
index.html, all eleven widgets, m0.js, m1.js, the print route. She can start the moment this lands.data/mN.js and nothing else.GRADING.mdPhase C is a multi-agent fan-out — roughly nine to eleven agents running concurrently, which is materially more expensive than building the modules one after another. It is how the whole week gets built in one session without me losing the thread between modules, which is what you asked for. Approving this plan is the go-ahead for that fan-out. If you'd rather I build the modules serially, say so and I'll drop Phase C to a sequential loop.
Aug 22 (tonight) Aug 23 24 25 26 27 28
|------------------------|-------------|-------|-------|-------|-------|-------|
BUILD schema → engine fan-out lands (all seven days of content already built)
→ m0 + m1 → DEPLOY → audit
→ fan out m2–m7 → redeploy
SHE m0 + m1 block A m1 block B M02 M03 M04 M05 M06/07
~3h tonight ►► AD LIVE ~8h/day — she is free all week
by midday
CONSTRAINT listing live tomorrow AM — Phase B ships before anything else is written
ADJACENT his own tracks (StudyFix, the 120h course) are untouched; separate folder
node verify_course.mjs from Mozi edu\ must print ALL CHECKS PASSED before every deploy. It evaluates the engine headlessly with a shimmed localStorage and document/window left undefined; renderers return strings, so every assertion is a string check. No browser is ever opened on his screen.
${ template leaks anywhere.GRADING.md. A rep with no rubric fails the build.pair rep has both AR and EN slots, and Arabic strings render RTL-safe.selfgrade gates its reveal — the prediction cannot be skipped.localStorage round-trip: write the full shape, reload, read it back identical. The key is mozi.v1 and appears nowhere else.SOURCES.md names a real file and line range.Then deploy and confirm it is actually live:
node verify_course.mjs
npx wrangler pages deploy app --project-name mozi-edu --branch main --commit-dirty=true
# then fetch the deployed URL and assert HTTP 200 + the expected <title>
She opens the URL on her phone, fills the deal sheet, works modules 00 and 01, posts the listing, and hits Export. He pastes the block into a chat and gets back a marked rubric that lands on the right rep. If that round trip completes once, everything else is detail.
workspace\ is touched. This lives entirely in Desktop\Mozi edu\.Leila_Hormozi_Unfiltered_Advice.md is 62 pages on company culture and scaling, not advertising. It is not a source for this course.hormozi files to learn from\ is a byte-identical duplicate of hormozi-playbooks\. Only the latter is read; the duplicate is left alone, not deleted.Four decisions that would change the build. Everything else is settled above.
SOURCES.md, flagged as secondary rather than primary source. No delay.$100M Leads into hormozi-playbooks\, modules 04, 06 and 07 get built from primary source at the same standard as the rest. Tell me when it's there.