Skip to content

feat(lp): web3-growth-audit v3 — proof-led rebuild + /lp prerender fix - #33

Open
gogrowth-co wants to merge 3 commits into
mainfrom
feat/growth-audit-v3
Open

feat(lp): web3-growth-audit v3 — proof-led rebuild + /lp prerender fix#33
gogrowth-co wants to merge 3 commits into
mainfrom
feat/growth-audit-v3

Conversation

@gogrowth-co

Copy link
Copy Markdown
Owner

Acts on the Wynter Message Grader run of the v2 page. 15 personas: clarity 15/15, relevance 15/15, differentiation 8/15, value 11/15. The page wins recognition and loses the purchase argument — a proof problem, not a targeting problem.

New page at /lp/web3-growth-audit-v3. v2 is untouched, so the two can be split-tested.

Copy and structure

Change Why
EigenLayer ($EIGEN) board shipped as hero visual + its own section Four personas: "no named client, no before/after, no third-party proof." The capture was owner-approved 2026-08-10 in the rebuild campaign's proof-assets.md and had never shipped
Real Notion report replaces the placeholder Same. Cropped to drop a sidebar that leaked internal doc names, one of them a client's
Six-surface section now leads with the handoff argument Nothing on v2 said what only this audit does
Credibility bar → operator block; disclaimer deleted, Olympian dropped, logos reframed as provenance Seven personas rejected the logo row; the "they do not represent an endorsement" line was quoted back as the reason to distrust it
Solo-operator model stated as the pitch Four personas independently detected "one guy dressed as an agency." Saying it first removes the discovery
"Can't Dune already tell me this?" section before pricing + new FAQ entry Two personas priced the audit against free dashboards and stopped
Worked finding + real board moved above the biography The worked example is the only element personas cited as a reason to choose this
Audience line gains a traffic floor Three personas asked for a threshold, not a category
Two placeholder alt strings replaced alt="Drop the Miro six-surface board screenshot" was live and read by the grader

Worker + prerender

/lp/* was in neither ORIGIN_PRERENDERED_ROUTES nor SNAPSHOT_ROUTES, so bot requests fell through to dist/index.html.

curl -A "Googlebot/2.1" https://mangabeira.net/lp/web3-growth-audit-v2
  -> <title>Gabriel Mangabeira | Olympian & Growth Marketing Strategist</title>
  -> 0 occurrences of "72 hours"

Same for GPTBot. These pages ship noindex, so search was never the loss — the loss is that every LinkedIn, X, Slack and Discord unfurl of a paid landing page rendered the homepage card. Both /lp routes now prerender, with a new noindex flag on RouteSpec so the generated file stays out of search while carrying correct title/description/OG.

Verified

  • npm run build emits dist/lp/web3-growth-audit-v{2,3}/index.html with the right <title> and robots: noindex, nofollow
  • Renders with zero console errors; no horizontal scroll at 320/360/390/414/768/1024/1280/1440/1920
  • No placeholder tokens or placeholder alt text survive into the output (generator asserts on both)

Not done

  • Zaros Growth Sprint capture withheld. The existing crop cuts off the five stage headers, leaves third-party names legible, and shows collaborator avatars. It would undercut the proof section rather than strengthen it. Needs a re-capture before the Pro tier gets its own named proof.
  • OG image is still the generic site OG. A dedicated card for this page would help the unfurl now that the unfurl works.
  • v3 has no analytics split yet. LP_ID is web3-growth-audit-v3, so GA4 can separate them, but no traffic is routed here.

🤖 Generated with Claude Code

Acts on the Wynter Message Grader run of the v2 page (15 personas): the
page scored 15/15 on clarity and relevance but 8/15 on differentiation
and 11/15 on value. It wins recognition and loses the purchase argument,
which is a proof problem rather than a targeting problem.

New page at /lp/web3-growth-audit-v3, forked from v2:

- Ships the real client proof. The EigenLayer ($EIGEN) six-frame audit
  board (owner-approved 2026-08-10 per the rebuild campaign's
  proof-assets.md, never actually shipped) replaces the generic Miro
  mockup in the hero and gets its own section. The real Notion operating
  report replaces the placeholder in the deliverables grid, cropped to
  drop a sidebar that leaked internal doc names including a client's.
- Leads the six-surface section with the reason instead of the method:
  the leak is in the handoff between two surfaces, which is the thing a
  single-surface audit structurally cannot see.
- Rebuilds the credibility bar as an operator block. Drops the
  "they do not represent an endorsement of this service" disclaimer that
  personas quoted back as their reason to distrust the logo row, drops
  the Olympian credential, and reframes the logos as where the pattern
  recognition came from. Owns the solo-operator model as the pitch.
- Answers the "Dune already shows me this" objection immediately before
  pricing, and again in a new FAQ entry.
- Reorders so the worked finding and the real board come before the
  biography.
- Qualifies the audience with a traffic floor instead of a category.
- Replaces two placeholder alt strings ("Drop the Miro six-surface board
  screenshot") that were live on v2 and read by the grader.

Worker + prerender:

/lp/* was in neither ORIGIN_PRERENDERED_ROUTES nor SNAPSHOT_ROUTES, so
bot requests fell through to dist/index.html. Verified 2026-08-25:
Googlebot and GPTBot both received the HOMEPAGE title on
/lp/web3-growth-audit-v2, with zero occurrences of "72 hours". These
pages ship noindex so search was never the loss; the loss is that every
LinkedIn, X, Slack and Discord unfurl of a paid landing page rendered
the homepage card. Both /lp routes now prerender, with a new
`noindex` flag on RouteSpec so the generated file keeps them out of
search while still carrying correct title, description and OG tags.

Verified: build emits dist/lp/web3-growth-audit-v{2,3}/index.html with
the right title and robots tag; page renders with no console errors and
no horizontal scroll at 320-1920.
@netlify

netlify Bot commented Aug 26, 2026

Copy link
Copy Markdown

Deploy Preview for mangabeira ready!

Name Link
🔨 Latest commit bc8cee5
🔍 Latest deploy log https://app.netlify.com/projects/mangabeira/deploys/6a8e5ceb3512c70008355553
😎 Deploy Preview https://deploy-preview-33--mangabeira.netlify.app
📱 Preview on mobile
Toggle QR Code...

QR Code

Use your smartphone camera to open QR code link.
🤖 Make changes Run an agent on this branch

To edit notification comments on pull requests, go to your Netlify project configuration.

@coderabbitai

coderabbitai Bot commented Aug 26, 2026

Copy link
Copy Markdown

Important

  • 🔍 Trigger review

This repository does not receive automatic reviews because it has fewer than 10 stars.

⚙️ Run configuration

Configuration used: Repository: gogrowth-co/coderabbit/.coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro Plus

Run ID: 7f2064a8-c799-4fc0-84c2-99a9ef2da80b


Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

Visual QA on the "You launched" -> "Why six, and not one" region. The
measured checks were all clean (no section gaps, no horizontal scroll at
320-1920, no body text under 14px), but the section read as incomplete
for a reason no metric catches: it stated its argument three times in
three consecutive blocks and demonstrated it zero times, then rendered a
relational claim as a 3x2 grid of six disconnected cards. The visual
grammar contradicted the headline.

- Adds a handoff strip between the section intro and the card grid: the
  six surfaces as a chain, the five joins between them drawn as dashed
  gaps and labelled. "Six surfaces. Five handoffs." is a countable hook
  rather than a fourth restatement, and it sets up the worked example
  further down the page.
- Rewrites the closing dark band to describe the mechanism (each surface
  gets a blind pass, then a second pass reads only the seams) instead of
  repeating the claim. Pull quote follows.
- Rewrites the opening paragraph so it stops pre-empting the heading
  directly beneath it.

Mobile bug caught in the same pass: with justifyContent center on a flex
row wider than its scroller, the row overflows to the LEFT, which
overflow-x auto cannot scroll back to in LTR. At 375px the strip opened
mid-chain with "01 Website" clipped and unreachable while the desktop
render looked correct. Replaced with width max-content plus margin 0
auto, which centres when the chain fits and left-aligns when it does not.

Verified after rebuild: artifact contains the change (grepped dist, not
just build exit code), strip scroller starts at 01 at 375px and 768px,
no horizontal page scroll at nine widths.
@cloudflare-workers-and-pages

cloudflare-workers-and-pages Bot commented Aug 26, 2026

Copy link
Copy Markdown

Deploying mangabeira with  Cloudflare Pages  Cloudflare Pages

Latest commit: bc8cee5
Status:🚫  Build failed.

View logs

…t above the section heading

Design direction from the designer agent ("The Seam Line"), implemented
to spec. A hairline rail runs under the six surfaces with a small navy
dot on each. At every handoff the rail stops entirely, and two offset
orange stubs sit in the empty space. The shape carries the argument:
solid where a surface's own audit already covers it, broken exactly
where nothing owns the seam.

What this fixes about the previous strip:

- Visual weight sat on the nodes (heavy 44px navy blocks) while the
  argument is about the gaps. Weight now sits on the empty space.
- "GAP 1".."GAP 5" was filler labelling. Removed; the break itself is
  the signal.
- It read as a generic stepper, which implies a linear journey that
  completes rather than a chain with weak joints. Zero radii throughout
  now, which also stops it echoing the rounded card grid beneath it.
- It needed horizontal scrolling below 768px. It now reorients to a
  vertical rail instead, so there is no scroll container at all.

Moved above the "Why six, and not one" eyebrow, so the diagram poses the
question the H2 then answers.

Layout lives in the scoped stylesheet rather than inline styles, because
the orientation swap needs media queries. Breakpoint 768px: horizontal
rail above, vertical rail below. Tablet 768-1023px tightens tracking to
0.4px so "Search & AEO" holds one line.

Accessibility: figure/figcaption so the caption is the accessible
summary, both mark SVGs aria-hidden, and a visually hidden span between
each pair ("Handoff: Website to dApp") so the five-handoff structure
reaches screen readers. Static, no motion.

Contrast: the designer flagged brand orange for the marks and was right.
#FF7A3D measures 2.59:1 on white, under WCAG 1.4.11's 3:1 for graphical
objects. Marks use #E8672A (3.28:1) instead, leaving the shared brand
token unchanged. Labels 7.08:1, nodes 15.54:1.

Verified at 320/360/375/390/414/430/768/834/1024/1280/1440/1920: no page
horizontal scroll, no overflow inside the component, six surfaces and
five joints present, correct mark orientation per breakpoint.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants