Objective
A sourced diagnosis of where the awareness-to-lead flow breaks, in two layers — awareness (do the collected hooks, messaging, and proof earn attention?) and lead capture (do the collected opt-ins convert that attention into leads?) — ending in a provenance-linted, prioritized fix list where each fix is routed to the skill that owns it. Every finding traces to a collected artifact. A surface with no collected artifact is out of scope, not audited from memory.
Scope boundary vs /kai-cro: /kai-cro runs the 5-layer conversion stack (technical, traffic, offer, design, copy) on ONE page or flow, in depth. This skill audits the FULL awareness-to-lead path across surfaces — ads, organic posts, entry pages, opt-ins, lead magnets, phone path — and finds where the flow breaks between them. When a single page needs deep conversion work, flag it and hand off to /kai-cro; never re-run the 5-layer stack here. /kai-audit and /kai-seo-audit are wider still; hand off there when the problem is not the funnel.
Done when
Work type audit-report — floor E3/C4/O1 (harness/eco-floors.yaml, also_covers: funnel-audit).
- E3 — a named human approved the exact delivered folder, and every quantitative claim resolves to a row in
_data-sources.md backed by an artifact in workspace/funnel-audit/data/.
- C4 — the Kai Data Provenance Rule holds end to end: mode declared, collector run before writing, every number cited, gaps written to
_data-gaps.md. audit_provenance_lint.py passes, and the copy-bearing outputs pass Four U's and banned words.
- O1 — every P0 fix names the metric it targets and the mechanism it moves. No invented uplift percentages.
Constraints
MARKETING.md first. Read it from the project root before asking discovery questions. If it does not exist, build it from the codebase (CLAUDE.md, README.md, PROJECT.md, package.json, landing pages, email/ad/analytics config) using the template carried in /kai-email-system, and confirm the draft. Do not ask the user what the product is.
- Provenance is blocking. Load
harness/references/audit-data-provenance.md before any finding is written. Declare a mode — sales_external (public data only; default when no private access is confirmed), onboarding_connected (client granted GSC/GA4/ad/CRM/call-tracking access), or internal_demo (labeled sample data only) — in _executive-summary.md and every deliverable header. Run the collector before writing:
python -m scripts.audit.collect --url <url> --mode <mode> --workflow funnel-audit --out workspace/funnel-audit/data
Add opt-in collectors per the provenance doc when credentials exist (--pagespeed, --gsc, --ga4, --calls, ...). Read metrics from data/kai-data.json (audit-data.json is the identical alias for the lint). A metric absent from collector output or a user-provided artifact is unavailable — it goes in _data-gaps.md, never into a finding.
- Collected artifacts only.
funnel-map.md holds one row per surface — awareness layer (ads with Ads Library URLs, organic posts, blog/SEO entries, homepage) and capture layer (opt-in forms, lead magnets, booking flows, phone path) — with entry→capture edges. A surface with no crawl, archive, user-provided export, or screenshot is OUT OF SCOPE: list it in _data-gaps.md with what would be needed. Never audit from memory of what pages "usually" look like.
- Ledgers.
_data-sources.md carries source, tier, retrieved-at, used-for, and artifact path per the provenance doc's table. Every downstream finding cites a row in it.
- Hooks are scored, not replaced here. Score with the
/kai-hook-bench rubric — clarity, specificity, curiosity, proof-backing, 0-2 each, total /8 — without restating its definitions. Run every hook against the anti-patterns in memory/what-doesnt-work.md and the voice-pattern regexes carried in /kai-gate; a hook matching a known loser pattern is an automatic finding. Replacement hooks route to /kai-hook-bench.
- Unverifiable proof on the client's own page is a P0 finding, not something to keep quietly — it is a compliance risk per
harness/references/advertising-compliance.md. Proof must be attributable, plausible, and non-contradicting (page review count vs Places data from the collector). Missing proof assets hand off to /kai-proof-builder or /kai-case-study.
- No invented uplift. "Expected mechanism" names the variable a fix moves — a Value Equation variable, a Hook–Retain–Reward stage, or a scent/leak repair. Never a predicted lift percentage or unsourced benchmark. A fix worth testing is written as an A/B hypothesis using the template in
knowledge/playbooks/funnel-hack-offer-architecture.md: primary metric plus guardrail metric, no predicted lift.
- The Value Equation table is an internal scoring rubric. Label it as such; it never ships as a quantitative claim.
- Friction numbers are sourced or gapped. Field counts, steps, load times, mobile behavior, and post-submit delivery delay come from crawl artifacts, PageSpeed runs, or GA4/form analytics under
onboarding_connected. No assumed field counts, no "typically 3 steps".
- Phone Capture Fit Rule applies exactly as
AGENTS.md defines it. Phone-led evidence comes from collected data only (prominent phone numbers or call CTAs in crawled pages, call extensions in observed ads, local/service vertical, phone-handled booking). If phone-led, evaluating phone-based lead capture is REQUIRED. Fit signals — missed-call pain, after-hours gaps, slow speed-to-lead, no qualification/routing, no call logging — come from public observation or a logged public call test in sales_external, or CallRail/CRM/phone logs via the collector in onboarding_connected. No signal data is a data gap, not an assumed problem. Recommending a phone answering service or AI receptionist requires real cited fit signals, no vendor named by default (disclose any ownership relationship if one is named), and comparison of at least two alternatives (human answering service, callback widget, native call tracking/routing). It is never the primary recommendation when phone demand is low, call recording/consent compliance is unresolved, the workflow is self-serve by design, or source data is missing. The older Layer-6 wording in /kai-cro predates the Fit Rule — the AGENTS.md rule wins.
- Gates before handoff. On copy-bearing outputs (
magnet-rewrite.md, and any before/after copy inside awareness-fixes.md):
python scripts/quality_gates/four_us_score.py --file workspace/funnel-audit/magnet-rewrite.md # 10/16 — hook/offer-asset threshold
python scripts/quality_gates/banned_word_check.py --file workspace/funnel-audit/magnet-rewrite.md
Max 2 retry cycles, fixing only the named failing dimension rather than rewriting the file (see memory/lessons.md). After 2 failures, escalate to a human with the diagnosis and log it via python scripts/self_improvement/lesson_capture.py add. Then the blocking provenance gate:
python scripts/quality_gates/audit_provenance_lint.py workspace/funnel-audit --audit-dir
A failure means an unsourced number or a missing ledger file — fix the citation or move the claim to _data-gaps.md. Never delete the ledger requirement.
- Approval doctrine. This audit is a recommendation package. Nothing here publishes, edits a live page, changes an ad, or dials a phone system. Every implementation goes through the owning skill's human-approval gate.
Context
| Need | Load |
|---|
| Value Equation, Core Four, Lead Magnet Framework, Give-Away-Everything | knowledge/people/alex-hormozi-knowledge.md — sections "The Value Equation", "$100M Leads: The Lead Generation System", "Content Strategy: Give Away Everything" |
| Conversion diagnosis | knowledge/playbooks/conversion-rate-optimization.md |
| Source-evidence standard, mechanics-vs-taste split, A/B hypothesis template | knowledge/playbooks/funnel-hack-offer-architecture.md |
| Per-element conversion checks (reuse, do not restate) | knowledge/checklists/cro-audit-checklist.md |
| Provenance modes, source tiers, gap handling | harness/references/audit-data-provenance.md |
| Persona match on entry pages | knowledge/personas/_persona-index.md (or the client's own) |
| Proof-claim compliance risk | harness/references/advertising-compliance.md |
| Known loser patterns and voice regexes | memory/what-doesnt-work.md + the regex table in /kai-gate |
What each layer checks. Awareness: does the headline state the Dream Outcome rather than the feature; does ad→page scent hold (same promise, persona, offer); is the persona obvious in one viewport; does the asset reward the click (a hook opening a question the page never closes is a finding); is proof above the fold in the collected viewport; are there competing CTAs, nav links exiting before first capture, ad traffic on a generic homepage, dead ends, or slow entry pages. An awareness layer that only pitches is itself a finding — Give-Give-Give-Ask. Capture: what each opt-in offers, what it asks (fields, steps), where it sits, its Value Index (Dream Outcome × Perceived Likelihood) ÷ (Time Delay × Effort & Sacrifice) scored 1-10 per variable, and whether each magnet is narrow and specific, a painkiller rather than a vitamin, one of the three types (problem diagnosis / sample-trial / symptom revelation), named per [Number] + [Adjective] + [Target Audience] + [Desired Outcome] + [Timeframe], and good enough to charge for.
The weakest magnet gets rewritten through the four Value Equation application questions: make the outcome vivid, raise belief it works for them (attaching only proof already inventoried), collapse Time Delay toward an immediate first win, strip Effort & Sacrifice (fewer fields, instant delivery, done-for-you over course format), and rename it with the naming formula. This is a spec plus copy draft, not a shipped asset. If the underlying offer is the problem rather than the packaging, stop and hand off to /kai-offer-builder.
Output — workspace/funnel-audit/: _data-sources.md (source, tier, retrieved-at, used-for, artifact — required by lint) · _data-gaps.md (out-of-scope surfaces, missing metrics, absent call data — required by lint) · data/ (collector output: kai-data.json + audit-data.json, raw/) · funnel-map.md (surfaces + edges, collected artifacts only) · awareness-scores.md (per-asset hook rubric scores with one-phrase justifications) · awareness-fixes.md (P0/P1/P2 rows — Fix | Evidence (artifact path/URL + retrieved-at) | Effort Low/Med/High | Expected mechanism) · lead-capture-scores.md (Value Equation table + lead-magnet checks) · friction-findings.md (fields/steps/load per capture point, sourced or gapped) · magnet-rewrite.md (weakest magnet before/after spec + re-score) · phone-path.md (phone-led verdict, fit signals with sources, disclosed recommendation) · _gate-report.md (gate results + retries) · _executive-summary.md (mode label on top, funnel map recap, top 5 fixes, limiting gaps, routing table).
Routing — append to _executive-summary.md:
| Finding class | Route to |
|---|
| Single page needs deep conversion work (5-layer stack) | /kai-cro |
| Page or magnet delivery needs a rewrite/rebuild | /kai-landing-page |
| Offer itself is weak (Value Index low even after packaging fixes) | /kai-offer-builder |
| Hooks scored ≤4/8 need replacements | /kai-hook-bench |
| Proof missing or unverifiable | /kai-proof-builder or /kai-case-study |
| Single finished pieces (emails, posts, ads) from the fixes | /kai-brief then /kai-write |
| Independent re-gate of rewritten copy | /kai-gate |
| Funnel problem sits upstream in traffic/SEO/brand | /kai-seo-audit or /kai-audit |
30-day follow-up on shipped fixes runs through the standard content pipeline; underperformers get diagnosed via /kai-retro.
Escalate when
- No surface has a collected artifact — there is no audit to run, only a data-access request.
- The client asks for findings on surfaces that could not be collected, or wants a number the collector did not return.
- Phone-led signals exist but call data access does not, and the user wants a phone recommendation anyway.
- Proof on a live client page appears unverifiable or contradicts collected data — that is a compliance call, not an editorial one.
- Two gate retries failed on the same dimension.
- The diagnosis points outside the funnel (traffic, brand, product, pricing) and the wider skill has not been authorized.