/marketing-master — The Marketing Mastery Doctrine Orchestrator
The top of the marketing doctrine stack. It runs all 12 Parts of Marketing Mastery on a
real project as one gap-checked, self-correcting pass: load the live assets → audit each Part's
alignment against the doctrine → correct the landing + strategy → adversarially verify → loop until
dry → ship a 90-day plan. Doctrine routes, tactical skills execute. It runs one Workflow at the
top level and applies the 12 mm-* doctrines as lenses — an agent reads each mm-XX SKILL.md
as its rubric — because a Workflow sub-agent cannot nest another Workflow.
When to use
EN: "marketing master", "run the marketing doctrine", "full marketing audit", "marketing
gap-check", "align my marketing", "90-day marketing plan", "audit my go-to-market".
FR: "audit marketing complet", "aligner mon marketing", "gap-check marketing", "doctrine
marketing", "plan marketing 90 jours", "audite mon go-to-market".
Use it for a full-project marketing audit + alignment + 90-day plan — when you want the whole
go-to-market measured against the doctrine in one pass, not a single tactic. Run it AFTER
/omg-brand-identity (the visual + brand direction exists) and /product-marketing-context (the
positioning / ICP / messaging dossier .agents/product-marketing.md exists). It is the apex of the
go-to-market layer in R-MARKETING.
Do NOT use it for a single tactic. Need ad copy → /ads-copy; a price → /mk-pricing-strategy; a
funnel → /ads-funnel; one Part's doctrine → the matching /mm-XX. marketing-master is the
orchestrator that runs all twelve — point single-tactic work at its home skill.
The 12-Part chain (book order = the sequence law)
You run the Parts in order because each depends on the one before — the sequence law the whole
doctrine obeys:
Positionnement → Message → Un canal → Conversion → Mesure → Scaling.
| # |
Doctrine skill |
Role in the chain |
| 1 |
mm-01-foundations-2026 |
The 2026-2027 map: what changed (channel) vs what never changes (the buying mechanism); the 6-block system. |
| 2 |
mm-02-positioning-category |
Positioning & category (Dunford's 5 components); the bet that contaminates everything downstream. |
| 3 |
mm-03-why-people-buy |
Jobs-to-be-Done, the 4 forces of progress, Schwartz awareness levels, Cialdini. |
| 4 |
mm-04-messaging-copy-offer |
Value prop, copy frameworks (PAS/BAB/AIDA), Hormozi offer, the landing section-by-section. |
| 5 |
mm-05-funnel-channels |
TOFU/MOFU/BOFU, AARRR, owned/earned/paid, product-channel fit, the Bullseye. |
| 6 |
mm-06-content-seo-geo |
Content engine, topical authority, SEO intent, GEO (be cited by the AIs), distribution > production. |
| 7 |
mm-07-paid-ads |
Paid as multiplier; CAC/LTV; creative-is-targeting; systematic creative testing; cold→retargeting. |
| 8 |
mm-08-pricing-monetization |
Value-based pricing, packaging/tiering, price psychology, NRR; price = positioning. |
| 9 |
mm-09-partnerships-network-effects |
The 7 partnership forms, referral loops & viral k, borrowed audience, community as moat. |
| 10 |
mm-10-selling |
Sales-led vs PLG, founder-led sales, the 5-step B2B process, objections, follow-up. |
| 11 |
mm-11-measure-loops-retention |
Retention > monetization > acquisition, the North Star, growth loops, cohorts, the composing system. |
| 12 |
mm-12-novice-to-expert |
The sequence law, the 90-day plan, the weekly routine, judgment & taste. Owns the plan this skill ships. |
Each Part is a prerequisite of the next: positioning precedes message (the message is the verbal
translation of the position), message precedes channel (a channel only amplifies), channel precedes
conversion (you can't optimize a rate on traffic that doesn't exist), conversion precedes serious
measurement, measurement precedes scaling. Auditing out of order produces aligned tactics on a broken
spine — so the gap-check walks Part 1 → 12.
Inputs it loads (REAL project assets — L1: runtime is truth)
- Prod URL → Playwright CLI sweep via Bash (R-TEST + R-BROWSER: scripted Playwright through the
Bash CLI, NEVER an MCP browser tool). Capture the landing hero, sections, body copy, CTAs, and
proof elements — the page as it actually renders is the artifact every Part is measured against.
.agents/product-marketing.md — positioning / ICP / audience / messaging, produced by
/product-marketing-context. If missing, stop and tell the user to run
/product-marketing-context first — the doctrine has nothing to align against without it.
- The marketing dossier / strategy docs present in the repo — any
docs/ go-to-market notes,
pricing pages, existing ADS-*.md / MARKET-*.md outputs. Loaded as the current strategy of record.
The audit grades the real, rendered project, never an idealized description of it (L1). Code and
docs state intent; the running landing and the live dossier are the truth the gap-check scores.
The protocol — load → gap-check (12 Parts) → correct → adversarially verify → loop → report
- Load. Playwright-sweep the prod URL (hero/sections/copy/CTAs/proof) and Read
.agents/product-marketing.md + the repo dossier into one project context. Guard: no
product-marketing.md → abort with the instruction to run /product-marketing-context.
- Gap-check (12 Parts). Each Part is gap-checked by an agent that READS the matching
mm-XX SKILL.md as its rubric and scores the project's real alignment on that Part's
dimensions — returning a strict schema of { part, aligned, score, gaps[], corrections[] } with
concrete gaps (cite the hero line, the missing proof, the absent price anchor) and proposed
corrections. The agent reads the doctrine, it never nests a Workflow.
- Correct. For each gap that carries a correction, an agent applies or proposes the fix to the
landing + strategy — writing a single corrections artifact. It only edits live files when in
scope (R-SCOPE: one writer per file); otherwise it proposes the diff for the operator.
- Adversarially verify. Each correction is checked by ≥2-of-3 skeptics (R-VERIFY): is the fix
faithful to the doctrine and real against the rendered page (Popper — actively try to falsify
it)? A correction the skeptics can't ratify is dropped back to a residual gap.
- Loop until dry. Re-run the gap-check (bounded, K=2) until no new gaps surface or a hard
blocker (missing secret, out-of-scope file) is hit — the self-correcting pass.
- Report. Render a branded PDF via the OmegaOS pdfgen (R-PDF): per-Part alignment, gaps,
corrections-verified, residual gaps, and the mm-12 90-day plan.
Runnable Workflow script (copy-pasteable)
Run this with the Workflow tool. It is the whole pass: Load → GapCheck → Correct → Verify →
Report. One Workflow at the top level; the 12 mm-* doctrines are applied as lenses — each
audit agent Reads skills/marketing-mastery/<skill>/SKILL.md as its rubric. Honor no nested
Workflow: never launch a Workflow from inside an agent(). Keep it deterministic — no Date.now(),
no Math.random(), no shuffling; the Part order is the static PARTS array.
Set PROD_URL and PROJECT_DIR to the real project (or read them from $ARGUMENTS).
// marketing-master — run all 12 Marketing Mastery Parts on a REAL project as one
// gap-checked, self-correcting pass. ONE Workflow at top level; mm-* are LENSES
// (an agent READS each mm-XX SKILL.md as its rubric — never a nested Workflow).
export const meta = {
name: "marketing-master",
description: "Full Marketing Mastery doctrine gap-check + self-correct + 90-day plan over a real project.",
phases: [
{ title: "Load" },
{ title: "GapCheck" },
{ title: "Correct" },
{ title: "Verify" },
{ title: "Loop" },
{ title: "Report" },
],
};
const PROD_URL = `<<<PASTE THE PROJECT'S PROD URL>>>`;
const PROJECT_DIR = `<<<PASTE THE ABSOLUTE PROJECT DIR>>>`;
const SKILLS_DIR = `${PROJECT_DIR}/skills/marketing-mastery`; // mm-* live here
const ART_DIR = `${PROJECT_DIR}/agentic/reports`; // artifacts go here (R-ENV)
// The 12 Parts in BOOK ORDER = the sequence law. Order is the law; do not reorder.
const PARTS = [
{ n: 1, skill: "mm-01-foundations-2026", lens: "fondations / carte du système / GEO" },
{ n: 2, skill: "mm-02-positioning-category", lens: "positionnement & catégorie (Dunford)" },
{ n: 3, skill: "mm-03-why-people-buy", lens: "JTBD / 4 forces / Schwartz / Cialdini" },
{ n: 4, skill: "mm-04-messaging-copy-offer", lens: "message / copy / offre / landing" },
{ n: 5, skill: "mm-05-funnel-channels", lens: "funnel TOFU/MOFU/BOFU / AARRR / canaux" },
{ n: 6, skill: "mm-06-content-seo-geo", lens: "content engine / SEO / GEO" },
{ n: 7, skill: "mm-07-paid-ads", lens: "paid / CAC-LTV / créatif testing" },
{ n: 8, skill: "mm-08-pricing-monetization", lens: "pricing / packaging / NRR" },
{ n: 9, skill: "mm-09-partnerships-network-effects", lens: "partenariats / referral loops / moat" },
{ n: 10, skill: "mm-10-selling", lens: "selling / PLG vs sales-led / closing" },
{ n: 11, skill: "mm-11-measure-loops-retention", lens: "mesure / growth loops / rétention" },
{ n: 12, skill: "mm-12-novice-to-expert", lens: "séquence / plan 90 jours / jugement" },
];
// ---- Phase 1: LOAD — the REAL project (L1: runtime is truth) ----------------
// Filesystem + Playwright + shell run INSIDE an agent() (a sub-agent owns Bash/Read/Write).
// The top-level script only orchestrates the declared primitives (agent/parallel/pipeline/meta) —
// it never calls a bare bash()/read()/write() global. The agent does the scripted Playwright sweep
// through the Bash CLI (R-TEST + R-BROWSER) — NEVER an MCP browser tool — and returns the context.
const projectContext = (await agent(
`You are the LOADER for a Marketing Mastery audit. Assemble the REAL project context. Do EXACTLY:
1. GUARD FIRST — if ${PROJECT_DIR}/.agents/product-marketing.md does NOT exist, return ONLY this one line:
BLOCKED: .agents/product-marketing.md is missing. Run /product-marketing-context first.
2. Playwright-sweep the prod URL through the Bash CLI (R-TEST + R-BROWSER — scripted Playwright via Bash,
NEVER an MCP browser tool). Run via your Bash tool:
cd ${PROJECT_DIR} && ( bun run scripts/pw-capture.ts ${PROD_URL} || ( npx --yes playwright screenshot --full-page ${PROD_URL} ${ART_DIR}/landing.png && npx --yes playwright pdf ${PROD_URL} ${ART_DIR}/landing.pdf ) )
Capture the rendered hero, sections, body copy, CTAs and proof elements.
3. Read ${PROJECT_DIR}/.agents/product-marketing.md (positioning / ICP / messaging) IN FULL.
4. Read the marketing dossier of record via Bash:
cd ${PROJECT_DIR} && cat docs/*market*.md docs/*gtm*.md ADS-*.md 2>/dev/null | head -c 40000
Return ONE assembled block, verbatim section contents, NOTHING else:
# PROJECT CONTEXT (real, runtime)
## Prod URL
${PROD_URL}
## Landing (Playwright sweep — hero / sections / copy / CTAs / proof)
<what the page actually renders>
## Positioning / ICP / messaging (.agents/product-marketing.md)
<file contents>
## Marketing dossier / strategy of record
<dossier contents>`,
{ model: "opus" }
)).trim();
// Guard: the dossier MUST exist (produced by /product-marketing-context) — abort cleanly otherwise.
if (projectContext.startsWith("BLOCKED")) {
return projectContext;
}
// ---- Phase 2: GAPCHECK — 12 Parts, each mm-XX SKILL.md READ as the rubric ----
// pipeline: per Part, an audit agent reads the doctrine and scores the REAL project.
const auditPart = (part) => `You are the Marketing Mastery auditor for PARTIE ${part.n} (${part.lens}).
STEP 1 — Read the doctrine as your rubric: read the file ${SKILLS_DIR}/${part.skill}/SKILL.md IN FULL.
That file's dimensions ARE your scoring rubric — you do NOT invent criteria.
STEP 2 — Audit the REAL project below against that rubric ONLY for this Part's scope. Cite concrete
evidence (the exact hero line, a missing proof block, an absent price anchor, the CTA text).
STEP 3 — Return STRICT JSON, nothing else:
{ "part": ${part.n}, "skill": "${part.skill}", "aligned": <bool>, "score": <0-100>,
"gaps": [ { "what": "...", "evidence": "<cited from the project>", "severity": "high|med|low" } ],
"corrections": [ { "target": "landing|strategy", "change": "<concrete, applyable edit>" } ] }
Do NOT nest a Workflow. Read the doctrine; judge the project; return JSON.
PROJECT CONTEXT:
${projectContext}`;
const rawAudits = await pipeline(
PARTS,
(part) => agent(auditPart(part), { model: "opus" })
);
const audits = rawAudits.map((r, i) => {
try { return JSON.parse(r.slice(r.indexOf("{"), r.lastIndexOf("}") + 1)); }
catch { return { part: PARTS[i].n, skill: PARTS[i].skill, aligned: false, score: 0,
gaps: [{ what: "audit JSON unparseable", evidence: r.slice(0, 280), severity: "high" }],
corrections: [] }; }
});
// ---- Phase 3: CORRECT — apply/propose each fix to landing + strategy ---------
const openGaps = audits.flatMap((a) =>
(a.corrections || []).map((c) => ({ part: a.part, skill: a.skill, ...c }))
);
const correctionArtifacts = await parallel(
openGaps.map((g) => agent(
`You correct the marketing for PARTIE ${g.part} (${g.skill}). Apply this doctrine-faithful fix to
the ${g.target}: "${g.change}". If the target file is IN YOUR SCOPE, edit it (R-SCOPE: one writer per
file) and report the diff. Otherwise PROPOSE the exact diff/copy for the operator. Be concrete and
faithful to the doctrine rubric — no invented proof, no fake scarcity (honesty gate).
PROJECT CONTEXT:
${projectContext}`,
{ model: "opus" }
))
);
const correctionsDoc = openGaps
.map((g, i) => `## Partie ${g.part} — ${g.skill}\n**Fix:** ${g.change}\n\n${correctionArtifacts[i]}`)
.join("\n\n");
await agent(
`Persist the corrections artifact. Via your Bash + Write tools: run \`mkdir -p ${ART_DIR}\`, then write
the CONTENT below VERBATIM to ${ART_DIR}/marketing-master-corrections.md, then reply DONE.
CONTENT:
${correctionsDoc}`,
{ model: "claude-haiku-4-5" }
);
// ---- Phase 4: VERIFY — ≥2-of-3 skeptics per correction (R-VERIFY, Popper) ----
const verifyOne = (g, body) => (reviewer) => agent(
`You are skeptic #${reviewer} verifying a marketing correction. Try to FALSIFY it (Popper): is it
FAITHFUL to the PARTIE ${g.part} doctrine AND REAL against the rendered landing? Answer strict JSON
{ "ratified": <bool>, "reason": "<one line>" }.
CORRECTION:
${body}
PROJECT CONTEXT:
${projectContext}`,
{ model: reviewer === 1 ? "opus" : reviewer === 2 ? "claude-sonnet-4-6" : "claude-haiku-4-5" }
);
const verdicts = await parallel(openGaps.map(async (g, i) => {
const panel = await parallel([1, 2, 3].map(verifyOne(g, correctionArtifacts[i])));
const yes = panel.filter((p) => /"ratified"\s*:\s*true/.test(p)).length;
return { part: g.part, change: g.change, ratified: yes >= 2, votes: `${yes}/3` };
}));
// ---- Phase 5: LOOP — re-run gapcheck until dry (bounded K=2) -----------------
const K = 2;
let residual = audits.flatMap((a) => (a.gaps || []).map((x) => ({ part: a.part, ...x })));
for (let k = 0; k < K; k++) {
// Re-audit only the parts that were not aligned. NOTE: corrections are PROPOSED to an artifact
// (not necessarily applied to the live page), so the re-audit reflects the proposed end-state.
const reAuditParts = PARTS.filter((p) => audits.find((a) => a.part === p.n && !a.aligned));
const reAudit = await pipeline(
reAuditParts,
(part) => agent(auditPart(part) + `\n\nNOTE: corrections were applied/proposed; re-score and list ONLY the residual gaps that REMAIN open for this Part.`, { model: "opus" })
.then((raw) => ({ part: part.n, raw }))
);
const fresh = reAudit.flatMap(({ part, raw }) => {
try { return (JSON.parse(raw.slice(raw.indexOf("{"), raw.lastIndexOf("}") + 1)).gaps || []).map((g) => ({ part, ...g })); }
catch { return [{ part, what: "re-audit JSON unparseable", evidence: raw.slice(0, 200), severity: "high" }]; }
});
// Replace ONLY the re-audited parts' residual gaps; keep gaps from parts not re-audited (L4: never silently drop).
const reAuditedPartNums = new Set(reAuditParts.map((p) => p.n));
residual = residual.filter((g) => !reAuditedPartNums.has(g.part)).concat(fresh);
if (fresh.length === 0) break; // dry
}
// ---- Phase 6: REPORT — branded PDF via the OmegaOS pdfgen (R-PDF) ------------
const plan90 = await agent(
`Read ${SKILLS_DIR}/mm-12-novice-to-expert/SKILL.md as your rubric and write the project's concrete
90-DAY PLAN (Mois 1 Fondations / Mois 2 Un canal + conversion / Mois 3 Mesure + premier scaling),
grounded in the audit findings below. Return tight markdown.
AUDITS: ${JSON.stringify(audits)}`,
{ model: "opus" }
);
// --template=doc expects a single markdown `body` string (DocData), NOT a sections[] array.
const reportBody = [
`## Per-Part alignment\n\n` + audits.map((a) =>
`- Partie ${a.part} — ${a.skill}: ${a.aligned ? "ALIGNED" : "GAP"} (${a.score}/100)`).join("\n"),
`## Gaps found\n\n` + (audits.flatMap((a) =>
(a.gaps || []).map((g) => `- P${a.part} [${g.severity}] ${g.what} — ${g.evidence}`)).join("\n") || "Aucun."),
`## Corrections verified\n\n` + (verdicts.map((v) =>
`- P${v.part} ${v.ratified ? "RATIFIED" : "REJECTED"} (${v.votes}) — ${v.change}`).join("\n") || "Aucune."),
`## Residual gaps\n\n` + (residual.map((r) => `- P${r.part} — ${r.what}`).join("\n") || "Aucun."),
`## 90-day plan (mm-12)\n\n` + plan90,
].join("\n\n");
const reportData = {
template: "doc",
title: "Marketing Mastery — Alignment Report",
subtitle: PROD_URL,
body: reportBody,
};
const dataPath = `${ART_DIR}/marketing-master-report.json`;
const outPath = `${ART_DIR}/marketing-master-report.pdf`;
await agent(
`Render the alignment report PDF. Via your Bash + Write tools, do EXACTLY:
1. \`mkdir -p ${ART_DIR}\` (Bash).
2. Write the REPORT JSON below VERBATIM to ${dataPath} (Write tool).
3. Render via the OmegaOS pdfgen (R-PDF — NEVER hand-roll a generator) with Bash:
\`omega pdf --template=doc --data=${dataPath} --out=${outPath}\`
4. Reply with: RENDERED ${outPath}
REPORT JSON:
${JSON.stringify(reportData, null, 2)}`,
{ model: "claude-haiku-4-5" }
);
return `Marketing Mastery alignment complete. PDF: ${outPath}\n` +
audits.map((a) => `P${a.part} ${a.aligned ? "✅" : "⚠️"} ${a.score}/100`).join(" ");
Notes for the running agent
agent(), parallel(), pipeline(), meta() are the Workflow primitives — in-process sub-agents on
the current session. One Workflow at the top level; never nest one inside an agent() — the
doctrine is applied by Read-ing each mm-XX SKILL.md, not by spawning a Workflow per Part.
- Filesystem / shell / Playwright /
omega pdf run INSIDE an agent() — a sub-agent owns the
Bash / Read / Write tools. The top-level script orchestrates only the four primitives above; it
never calls a bare bash() / read() / write() global (those are not Workflow primitives).
- The Playwright sweep goes through the Bash CLI (R-TEST + R-BROWSER) — never an MCP browser tool.
- Every PDF goes through
omega pdf (R-PDF) — never a hand-rolled generator.
- Keep it deterministic: no
Date.now(), no Math.random(), no shuffle. The PARTS order is the law.
- Respect R-SCOPE: only edit a file when it's in your scope; otherwise propose the diff.
Output — the alignment report (omega pdf --template=doc)
The rendered PDF (R-PDF, --template=doc) contains:
- Per-Part alignment verdict + score — Partie 1 → 12, each
ALIGNED / GAP with a 0-100 score.
- Gaps found — every concrete, evidence-cited gap (the hero line, the missing proof, the absent
price anchor), tagged by severity.
- Corrections applied + adversarially verified — each fix with its ≥2-of-3 skeptic verdict
(
RATIFIED / REJECTED, vote count).
- Residual gaps — what the loop-until-dry pass could not close (or a hard blocker), recorded
explicitly (L4: never silently dropped).
- The mm-12 90-day plan — Mois 1 Fondations → Mois 2 Un canal + conversion → Mois 3 Mesure +
premier scaling, grounded in the audit findings.
Notes
- Doctrine routes, tactics produce. This orchestrator never re-implements a tactical skill — it
reads the 12
mm-* doctrines as lenses and routes corrections to their executing homes
(mk-*, ads-*, ag-seo-*, market-*, …) per the alignment matrix.
- SSOT:
docs/marketing-mastery-alignment.md is the single source of truth for doctrine↔execution
mapping and the book-order chain; keep this skill's Part list in sync with it.
- Shape: mirrors
/llm-council's embedded-Workflow pattern — frontmatter with Workflow in
allowed-tools, a runnable top-level Workflow script, and the no-nested-Workflow constraint made
explicit (lenses via Read, not nested engines).
- Placement (R-MARKETING): the apex of the go-to-market layer, run after
/omg-brand-identity
and /product-marketing-context. It is the keystone that runs the entire doctrine in one pass.
--- Resume: /marketing-master orchestre les 12 Parties de Marketing Mastery sur un projet réel en
une passe gap-check auto-corrigée — un seul Workflow au niveau racine, les mm-* lus comme grilles
(jamais de Workflow imbriqué), et un rapport PDF avec le plan 90 jours.
1---2name: marketing-master3description: Run the full Marketing Mastery doctrine on a real project — a 12-Part gap-check that audits positioning, message, funnel, content, paid, pricing, partnerships, selling, retention against the doctrine and corrects the landing + strategy, then ships a 90-day plan. Also fires on EN: 'marketing master', 'run the marketing doctrine', 'full marketing audit', 'marketing gap-check', 'align my marketing', 'marketing mastery', '90-day marketing plan', 'audit my go-to-market'; and FR: 'marketing master', 'audit marketing complet', 'aligner mon marketing', 'gap-check marketing', 'doctrine marketing', 'plan marketing 90 jours', 'audite mon go-to-market'. Use to run all 12 mm-* doctrine skills as one orchestrated, self-correcting pass over a project.4---56# /marketing-master — The Marketing Mastery Doctrine Orchestrator78The **top of the marketing doctrine stack**. It runs all **12 Parts** of *Marketing Mastery* on a9**real project** as one gap-checked, self-correcting pass: load the live assets → audit each Part's10alignment against the doctrine → correct the landing + strategy → adversarially verify → loop until11dry → ship a 90-day plan. **Doctrine routes, tactical skills execute.** It runs **one Workflow at the12top level** and applies the 12 `mm-*` doctrines as **lenses** — an agent *reads* each `mm-XX SKILL.md`13as its rubric — because a Workflow sub-agent **cannot nest another Workflow**.1415## When to use1617**EN:** "marketing master", "run the marketing doctrine", "full marketing audit", "marketing18gap-check", "align my marketing", "90-day marketing plan", "audit my go-to-market".19**FR:** "audit marketing complet", "aligner mon marketing", "gap-check marketing", "doctrine20marketing", "plan marketing 90 jours", "audite mon go-to-market".2122Use it for a **full-project** marketing audit + alignment + 90-day plan — when you want the whole23go-to-market measured against the doctrine in one pass, not a single tactic. Run it **AFTER**24`/omg-brand-identity` (the visual + brand direction exists) and `/product-marketing-context` (the25positioning / ICP / messaging dossier `.agents/product-marketing.md` exists). It is the **apex of the26go-to-market layer** in R-MARKETING.2728**Do NOT use it for a single tactic.** Need ad copy → `/ads-copy`; a price → `/mk-pricing-strategy`; a29funnel → `/ads-funnel`; one Part's doctrine → the matching `/mm-XX`. `marketing-master` is the30orchestrator that runs *all twelve* — point single-tactic work at its home skill.3132## The 12-Part chain (book order = the sequence law)3334You run the Parts **in order** because each depends on the one before — the **sequence law** the whole35doctrine obeys:3637> **Positionnement → Message → Un canal → Conversion → Mesure → Scaling.**3839| # | Doctrine skill | Role in the chain |40|---|---|---|41| 1 | `mm-01-foundations-2026` | The 2026-2027 map: what changed (channel) vs what never changes (the buying mechanism); the 6-block system. |42| 2 | `mm-02-positioning-category` | Positioning & category (Dunford's 5 components); the bet that contaminates everything downstream. |43| 3 | `mm-03-why-people-buy` | Jobs-to-be-Done, the 4 forces of progress, Schwartz awareness levels, Cialdini. |44| 4 | `mm-04-messaging-copy-offer` | Value prop, copy frameworks (PAS/BAB/AIDA), Hormozi offer, the landing section-by-section. |45| 5 | `mm-05-funnel-channels` | TOFU/MOFU/BOFU, AARRR, owned/earned/paid, product-channel fit, the Bullseye. |46| 6 | `mm-06-content-seo-geo` | Content engine, topical authority, SEO intent, GEO (be cited by the AIs), distribution > production. |47| 7 | `mm-07-paid-ads` | Paid as multiplier; CAC/LTV; creative-is-targeting; systematic creative testing; cold→retargeting. |48| 8 | `mm-08-pricing-monetization` | Value-based pricing, packaging/tiering, price psychology, NRR; price = positioning. |49| 9 | `mm-09-partnerships-network-effects` | The 7 partnership forms, referral loops & viral k, borrowed audience, community as moat. |50| 10 | `mm-10-selling` | Sales-led vs PLG, founder-led sales, the 5-step B2B process, objections, follow-up. |51| 11 | `mm-11-measure-loops-retention` | Retention > monetization > acquisition, the North Star, growth loops, cohorts, the composing system. |52| 12 | `mm-12-novice-to-expert` | The sequence law, the **90-day plan**, the weekly routine, judgment & taste. Owns the plan this skill ships. |5354Each Part is a **prerequisite of the next**: positioning precedes message (the message is the verbal55translation of the position), message precedes channel (a channel only amplifies), channel precedes56conversion (you can't optimize a rate on traffic that doesn't exist), conversion precedes serious57measurement, measurement precedes scaling. Auditing out of order produces aligned tactics on a broken58spine — so the gap-check walks Part 1 → 12.5960## Inputs it loads (REAL project assets — L1: runtime is truth)6162- **Prod URL → Playwright CLI sweep via Bash** (R-TEST + R-BROWSER: scripted Playwright through the63 Bash CLI, **NEVER** an MCP browser tool). Capture the landing **hero, sections, body copy, CTAs, and64 proof elements** — the page as it actually renders is the artifact every Part is measured against.65- **`.agents/product-marketing.md`** — positioning / ICP / audience / messaging, produced by66 `/product-marketing-context`. **If missing, stop and tell the user to run67 `/product-marketing-context` first** — the doctrine has nothing to align against without it.68- **The marketing dossier / strategy docs present in the repo** — any `docs/` go-to-market notes,69 pricing pages, existing `ADS-*.md` / `MARKET-*.md` outputs. Loaded as the current strategy of record.7071The audit grades the **real, rendered project**, never an idealized description of it (L1). Code and72docs state intent; the running landing and the live dossier are the truth the gap-check scores.7374## The protocol — load → gap-check (12 Parts) → correct → adversarially verify → loop → report75761. **Load.** Playwright-sweep the prod URL (hero/sections/copy/CTAs/proof) and Read77 `.agents/product-marketing.md` + the repo dossier into one project context. Guard: no78 `product-marketing.md` → abort with the instruction to run `/product-marketing-context`.792. **Gap-check (12 Parts).** Each Part is gap-checked by an agent that **READS the matching80 `mm-XX SKILL.md` as its rubric** and scores the project's **real** alignment on that Part's81 dimensions — returning a strict schema of `{ part, aligned, score, gaps[], corrections[] }` with82 **concrete** gaps (cite the hero line, the missing proof, the absent price anchor) and proposed83 corrections. The agent **reads the doctrine, it never nests a Workflow.**843. **Correct.** For each gap that carries a correction, an agent **applies or proposes** the fix to the85 landing + strategy — writing a single corrections artifact. It only edits **live files when in86 scope** (R-SCOPE: one writer per file); otherwise it proposes the diff for the operator.874. **Adversarially verify.** Each correction is checked by **≥2-of-3 skeptics** (R-VERIFY): is the fix88 *faithful* to the doctrine and *real* against the rendered page (Popper — actively try to falsify89 it)? A correction the skeptics can't ratify is dropped back to a residual gap.905. **Loop until dry.** Re-run the gap-check (bounded, K=2) until **no new gaps** surface or a hard91 blocker (missing secret, out-of-scope file) is hit — the self-correcting pass.926. **Report.** Render a branded PDF via the OmegaOS pdfgen (**R-PDF**): per-Part alignment, gaps,93 corrections-verified, residual gaps, and the **mm-12 90-day plan**.9495## Runnable Workflow script (copy-pasteable)9697Run this with the **Workflow tool**. It is the whole pass: Load → GapCheck → Correct → Verify →98Report. **One Workflow at the top level**; the 12 `mm-*` doctrines are applied as **lenses** — each99audit agent `Read`s `skills/marketing-mastery/<skill>/SKILL.md` as its rubric. Honor *no nested100Workflow*: never launch a Workflow from inside an `agent()`. Keep it deterministic — no `Date.now()`,101no `Math.random()`, no shuffling; the Part order is the static `PARTS` array.102103Set `PROD_URL` and `PROJECT_DIR` to the real project (or read them from `$ARGUMENTS`).104105```javascript106// marketing-master — run all 12 Marketing Mastery Parts on a REAL project as one107// gap-checked, self-correcting pass. ONE Workflow at top level; mm-* are LENSES108// (an agent READS each mm-XX SKILL.md as its rubric — never a nested Workflow).109110export const meta = {111 name: "marketing-master",112 description: "Full Marketing Mastery doctrine gap-check + self-correct + 90-day plan over a real project.",113 phases: [114 { title: "Load" },115 { title: "GapCheck" },116 { title: "Correct" },117 { title: "Verify" },118 { title: "Loop" },119 { title: "Report" },120 ],121};122123const PROD_URL = `<<<PASTE THE PROJECT'S PROD URL>>>`;124const PROJECT_DIR = `<<<PASTE THE ABSOLUTE PROJECT DIR>>>`;125const SKILLS_DIR = `${PROJECT_DIR}/skills/marketing-mastery`; // mm-* live here126const ART_DIR = `${PROJECT_DIR}/agentic/reports`; // artifacts go here (R-ENV)127128// The 12 Parts in BOOK ORDER = the sequence law. Order is the law; do not reorder.129const PARTS = [130 { n: 1, skill: "mm-01-foundations-2026", lens: "fondations / carte du système / GEO" },131 { n: 2, skill: "mm-02-positioning-category", lens: "positionnement & catégorie (Dunford)" },132 { n: 3, skill: "mm-03-why-people-buy", lens: "JTBD / 4 forces / Schwartz / Cialdini" },133 { n: 4, skill: "mm-04-messaging-copy-offer", lens: "message / copy / offre / landing" },134 { n: 5, skill: "mm-05-funnel-channels", lens: "funnel TOFU/MOFU/BOFU / AARRR / canaux" },135 { n: 6, skill: "mm-06-content-seo-geo", lens: "content engine / SEO / GEO" },136 { n: 7, skill: "mm-07-paid-ads", lens: "paid / CAC-LTV / créatif testing" },137 { n: 8, skill: "mm-08-pricing-monetization", lens: "pricing / packaging / NRR" },138 { n: 9, skill: "mm-09-partnerships-network-effects", lens: "partenariats / referral loops / moat" },139 { n: 10, skill: "mm-10-selling", lens: "selling / PLG vs sales-led / closing" },140 { n: 11, skill: "mm-11-measure-loops-retention", lens: "mesure / growth loops / rétention" },141 { n: 12, skill: "mm-12-novice-to-expert", lens: "séquence / plan 90 jours / jugement" },142];143144// ---- Phase 1: LOAD — the REAL project (L1: runtime is truth) ----------------145// Filesystem + Playwright + shell run INSIDE an agent() (a sub-agent owns Bash/Read/Write).146// The top-level script only orchestrates the declared primitives (agent/parallel/pipeline/meta) —147// it never calls a bare bash()/read()/write() global. The agent does the scripted Playwright sweep148// through the Bash CLI (R-TEST + R-BROWSER) — NEVER an MCP browser tool — and returns the context.149const projectContext = (await agent(150 `You are the LOADER for a Marketing Mastery audit. Assemble the REAL project context. Do EXACTLY:1511. GUARD FIRST — if ${PROJECT_DIR}/.agents/product-marketing.md does NOT exist, return ONLY this one line:152 BLOCKED: .agents/product-marketing.md is missing. Run /product-marketing-context first.1532. Playwright-sweep the prod URL through the Bash CLI (R-TEST + R-BROWSER — scripted Playwright via Bash,154 NEVER an MCP browser tool). Run via your Bash tool:155 cd ${PROJECT_DIR} && ( bun run scripts/pw-capture.ts ${PROD_URL} || ( npx --yes playwright screenshot --full-page ${PROD_URL} ${ART_DIR}/landing.png && npx --yes playwright pdf ${PROD_URL} ${ART_DIR}/landing.pdf ) )156 Capture the rendered hero, sections, body copy, CTAs and proof elements.1573. Read ${PROJECT_DIR}/.agents/product-marketing.md (positioning / ICP / messaging) IN FULL.1584. Read the marketing dossier of record via Bash:159 cd ${PROJECT_DIR} && cat docs/*market*.md docs/*gtm*.md ADS-*.md 2>/dev/null | head -c 40000160Return ONE assembled block, verbatim section contents, NOTHING else:161# PROJECT CONTEXT (real, runtime)162## Prod URL163${PROD_URL}164## Landing (Playwright sweep — hero / sections / copy / CTAs / proof)165<what the page actually renders>166## Positioning / ICP / messaging (.agents/product-marketing.md)167<file contents>168## Marketing dossier / strategy of record169<dossier contents>`,170 { model: "opus" }171)).trim();172173// Guard: the dossier MUST exist (produced by /product-marketing-context) — abort cleanly otherwise.174if (projectContext.startsWith("BLOCKED")) {175 return projectContext;176}177178// ---- Phase 2: GAPCHECK — 12 Parts, each mm-XX SKILL.md READ as the rubric ----179// pipeline: per Part, an audit agent reads the doctrine and scores the REAL project.180const auditPart = (part) => `You are the Marketing Mastery auditor for PARTIE ${part.n} (${part.lens}).181STEP 1 — Read the doctrine as your rubric: read the file ${SKILLS_DIR}/${part.skill}/SKILL.md IN FULL.182That file's dimensions ARE your scoring rubric — you do NOT invent criteria.183STEP 2 — Audit the REAL project below against that rubric ONLY for this Part's scope. Cite concrete184evidence (the exact hero line, a missing proof block, an absent price anchor, the CTA text).185STEP 3 — Return STRICT JSON, nothing else:186{ "part": ${part.n}, "skill": "${part.skill}", "aligned": <bool>, "score": <0-100>,187 "gaps": [ { "what": "...", "evidence": "<cited from the project>", "severity": "high|med|low" } ],188 "corrections": [ { "target": "landing|strategy", "change": "<concrete, applyable edit>" } ] }189Do NOT nest a Workflow. Read the doctrine; judge the project; return JSON.190191PROJECT CONTEXT:192${projectContext}`;193194const rawAudits = await pipeline(195 PARTS,196 (part) => agent(auditPart(part), { model: "opus" })197);198const audits = rawAudits.map((r, i) => {199 try { return JSON.parse(r.slice(r.indexOf("{"), r.lastIndexOf("}") + 1)); }200 catch { return { part: PARTS[i].n, skill: PARTS[i].skill, aligned: false, score: 0,201 gaps: [{ what: "audit JSON unparseable", evidence: r.slice(0, 280), severity: "high" }],202 corrections: [] }; }203});204205// ---- Phase 3: CORRECT — apply/propose each fix to landing + strategy ---------206const openGaps = audits.flatMap((a) =>207 (a.corrections || []).map((c) => ({ part: a.part, skill: a.skill, ...c }))208);209const correctionArtifacts = await parallel(210 openGaps.map((g) => agent(211 `You correct the marketing for PARTIE ${g.part} (${g.skill}). Apply this doctrine-faithful fix to212the ${g.target}: "${g.change}". If the target file is IN YOUR SCOPE, edit it (R-SCOPE: one writer per213file) and report the diff. Otherwise PROPOSE the exact diff/copy for the operator. Be concrete and214faithful to the doctrine rubric — no invented proof, no fake scarcity (honesty gate).215216PROJECT CONTEXT:217${projectContext}`,218 { model: "opus" }219 ))220);221const correctionsDoc = openGaps222 .map((g, i) => `## Partie ${g.part} — ${g.skill}\n**Fix:** ${g.change}\n\n${correctionArtifacts[i]}`)223 .join("\n\n");224await agent(225 `Persist the corrections artifact. Via your Bash + Write tools: run \`mkdir -p ${ART_DIR}\`, then write226the CONTENT below VERBATIM to ${ART_DIR}/marketing-master-corrections.md, then reply DONE.227228CONTENT:229${correctionsDoc}`,230 { model: "claude-haiku-4-5" }231);232233// ---- Phase 4: VERIFY — ≥2-of-3 skeptics per correction (R-VERIFY, Popper) ----234const verifyOne = (g, body) => (reviewer) => agent(235 `You are skeptic #${reviewer} verifying a marketing correction. Try to FALSIFY it (Popper): is it236FAITHFUL to the PARTIE ${g.part} doctrine AND REAL against the rendered landing? Answer strict JSON237{ "ratified": <bool>, "reason": "<one line>" }.238239CORRECTION:240${body}241242PROJECT CONTEXT:243${projectContext}`,244 { model: reviewer === 1 ? "opus" : reviewer === 2 ? "claude-sonnet-4-6" : "claude-haiku-4-5" }245);246const verdicts = await parallel(openGaps.map(async (g, i) => {247 const panel = await parallel([1, 2, 3].map(verifyOne(g, correctionArtifacts[i])));248 const yes = panel.filter((p) => /"ratified"\s*:\s*true/.test(p)).length;249 return { part: g.part, change: g.change, ratified: yes >= 2, votes: `${yes}/3` };250}));251252// ---- Phase 5: LOOP — re-run gapcheck until dry (bounded K=2) -----------------253const K = 2;254let residual = audits.flatMap((a) => (a.gaps || []).map((x) => ({ part: a.part, ...x })));255for (let k = 0; k < K; k++) {256 // Re-audit only the parts that were not aligned. NOTE: corrections are PROPOSED to an artifact257 // (not necessarily applied to the live page), so the re-audit reflects the proposed end-state.258 const reAuditParts = PARTS.filter((p) => audits.find((a) => a.part === p.n && !a.aligned));259 const reAudit = await pipeline(260 reAuditParts,261 (part) => agent(auditPart(part) + `\n\nNOTE: corrections were applied/proposed; re-score and list ONLY the residual gaps that REMAIN open for this Part.`, { model: "opus" })262 .then((raw) => ({ part: part.n, raw }))263 );264 const fresh = reAudit.flatMap(({ part, raw }) => {265 try { return (JSON.parse(raw.slice(raw.indexOf("{"), raw.lastIndexOf("}") + 1)).gaps || []).map((g) => ({ part, ...g })); }266 catch { return [{ part, what: "re-audit JSON unparseable", evidence: raw.slice(0, 200), severity: "high" }]; }267 });268 // Replace ONLY the re-audited parts' residual gaps; keep gaps from parts not re-audited (L4: never silently drop).269 const reAuditedPartNums = new Set(reAuditParts.map((p) => p.n));270 residual = residual.filter((g) => !reAuditedPartNums.has(g.part)).concat(fresh);271 if (fresh.length === 0) break; // dry272}273274// ---- Phase 6: REPORT — branded PDF via the OmegaOS pdfgen (R-PDF) ------------275const plan90 = await agent(276 `Read ${SKILLS_DIR}/mm-12-novice-to-expert/SKILL.md as your rubric and write the project's concrete27790-DAY PLAN (Mois 1 Fondations / Mois 2 Un canal + conversion / Mois 3 Mesure + premier scaling),278grounded in the audit findings below. Return tight markdown.279280AUDITS: ${JSON.stringify(audits)}`,281 { model: "opus" }282);283284// --template=doc expects a single markdown `body` string (DocData), NOT a sections[] array.285const reportBody = [286 `## Per-Part alignment\n\n` + audits.map((a) =>287 `- Partie ${a.part} — ${a.skill}: ${a.aligned ? "ALIGNED" : "GAP"} (${a.score}/100)`).join("\n"),288 `## Gaps found\n\n` + (audits.flatMap((a) =>289 (a.gaps || []).map((g) => `- P${a.part} [${g.severity}] ${g.what} — ${g.evidence}`)).join("\n") || "Aucun."),290 `## Corrections verified\n\n` + (verdicts.map((v) =>291 `- P${v.part} ${v.ratified ? "RATIFIED" : "REJECTED"} (${v.votes}) — ${v.change}`).join("\n") || "Aucune."),292 `## Residual gaps\n\n` + (residual.map((r) => `- P${r.part} — ${r.what}`).join("\n") || "Aucun."),293 `## 90-day plan (mm-12)\n\n` + plan90,294].join("\n\n");295const reportData = {296 template: "doc",297 title: "Marketing Mastery — Alignment Report",298 subtitle: PROD_URL,299 body: reportBody,300};301const dataPath = `${ART_DIR}/marketing-master-report.json`;302const outPath = `${ART_DIR}/marketing-master-report.pdf`;303await agent(304 `Render the alignment report PDF. Via your Bash + Write tools, do EXACTLY:3051. \`mkdir -p ${ART_DIR}\` (Bash).3062. Write the REPORT JSON below VERBATIM to ${dataPath} (Write tool).3073. Render via the OmegaOS pdfgen (R-PDF — NEVER hand-roll a generator) with Bash:308 \`omega pdf --template=doc --data=${dataPath} --out=${outPath}\`3094. Reply with: RENDERED ${outPath}310311REPORT JSON:312${JSON.stringify(reportData, null, 2)}`,313 { model: "claude-haiku-4-5" }314);315316return `Marketing Mastery alignment complete. PDF: ${outPath}\n` +317 audits.map((a) => `P${a.part} ${a.aligned ? "✅" : "⚠️"} ${a.score}/100`).join(" ");318```319320**Notes for the running agent**321- `agent()`, `parallel()`, `pipeline()`, `meta()` are the Workflow primitives — in-process sub-agents on322 the current session. **One Workflow at the top level; never nest one inside an `agent()`** — the323 doctrine is applied by `Read`-ing each `mm-XX SKILL.md`, not by spawning a Workflow per Part.324- **Filesystem / shell / Playwright / `omega pdf` run INSIDE an `agent()`** — a sub-agent owns the325 `Bash` / `Read` / `Write` tools. The top-level script orchestrates only the four primitives above; it326 never calls a bare `bash()` / `read()` / `write()` global (those are not Workflow primitives).327- The Playwright sweep goes **through the Bash CLI** (R-TEST + R-BROWSER) — never an MCP browser tool.328- Every PDF goes through **`omega pdf`** (R-PDF) — never a hand-rolled generator.329- Keep it deterministic: no `Date.now()`, no `Math.random()`, no shuffle. The `PARTS` order is the law.330- Respect **R-SCOPE**: only edit a file when it's in your scope; otherwise propose the diff.331332## Output — the alignment report (omega pdf --template=doc)333334The rendered PDF (R-PDF, `--template=doc`) contains:335336- **Per-Part alignment verdict + score** — Partie 1 → 12, each `ALIGNED` / `GAP` with a 0-100 score.337- **Gaps found** — every concrete, evidence-cited gap (the hero line, the missing proof, the absent338 price anchor), tagged by severity.339- **Corrections applied + adversarially verified** — each fix with its **≥2-of-3** skeptic verdict340 (`RATIFIED` / `REJECTED`, vote count).341- **Residual gaps** — what the loop-until-dry pass could not close (or a hard blocker), recorded342 explicitly (L4: never silently dropped).343- **The mm-12 90-day plan** — Mois 1 Fondations → Mois 2 Un canal + conversion → Mois 3 Mesure +344 premier scaling, grounded in the audit findings.345346## Notes347348- **Doctrine routes, tactics produce.** This orchestrator **never re-implements a tactical skill** — it349 reads the 12 `mm-*` doctrines as lenses and routes corrections to their executing homes350 (`mk-*`, `ads-*`, `ag-seo-*`, `market-*`, …) per the alignment matrix.351- **SSOT:** `docs/marketing-mastery-alignment.md` is the single source of truth for doctrine↔execution352 mapping and the book-order chain; keep this skill's Part list in sync with it.353- **Shape:** mirrors `/llm-council`'s embedded-Workflow pattern — frontmatter with `Workflow` in354 `allowed-tools`, a runnable top-level Workflow script, and the *no-nested-Workflow* constraint made355 explicit (lenses via `Read`, not nested engines).356- **Placement (R-MARKETING):** the **apex of the go-to-market layer**, run after `/omg-brand-identity`357 and `/product-marketing-context`. It is the keystone that runs the entire doctrine in one pass.358359--- **Resume:** `/marketing-master` orchestre les 12 Parties de Marketing Mastery sur un projet réel en360une passe gap-check auto-corrigée — un seul Workflow au niveau racine, les `mm-*` lus comme grilles361(jamais de Workflow imbriqué), et un rapport PDF avec le plan 90 jours.