Skip to content

Marketing site quality pass + multi-model visual audit tool#15

Merged
drewstone merged 10 commits into
masterfrom
feat/x402-production-runway-posts
May 13, 2026
Merged

Marketing site quality pass + multi-model visual audit tool#15
drewstone merged 10 commits into
masterfrom
feat/x402-production-runway-posts

Conversation

@drewstone

Copy link
Copy Markdown
Contributor

Summary

End-to-end quality pass on every marketing page, plus a new pnpm audit:visual script that screenshots every route and runs a vision-model ensemble against an Ogilvy-style design rubric. The audit caught real issues both models converged on; this PR fixes them.

What changed

Content / copy

  • Killed StatsStrip on every non-home page (was filler — feature lists dressed as metrics). Component stays in src/components/ui/ if anyone wants to revive it with real numbers.
  • Fixed /stake hero: dropped "COMING SOON" badge (page links to live dApp), flipped primary CTA from "View Docs" to "Open the dApp", rewrote H1 from product label ("Tangle Staking") to mechanic ("Back the operators. Take a cut of every fee.").
  • Fixed /overview H1: was "Staked operators pay you per call" — operators don't pay, customers do. Per ~/code/docs/pages/network/incentives-overview.mdx, the protocol splits each fee 20% developer / 40% operators / 20% stakers / 20% treasury. Rewrote to "Ship a Blueprint. Customers pay per call." with the exact split named in the subhead so the claim is checkable.
  • Rewrote weak / generic H1s across /operators, /developers, /ecosystem, /services/blueprint-agent, /services/sandbox, and BuildsOnLogos.astro under the Ogilvy lens (promise a benefit, simple words, no clever-clever, tell the truth but make truth fascinating).
  • Spot-check post-edit caught /operators and /developers H1s wrapping to 4-5 lines in the two-column hero (512px text column squeezed by the CodeWindow slot). Shortened to parallel "X. Earn per call." / "X. Earn forever." structures that fit on 2 lines.

Theme bugs

  • .dev-partner-tile had a border but no background — 12 partner logos disappeared into the vault-white surface until hover. Added the missing tile background.
  • Added defensive vault-cascade rules for .op-card-title / .op-card-body so the operator feature cards don't go white-on-white the day someone moves them inside a vault section.

Sandbox page completeness

  • Factory + Forge harness chips were rendering as letter-circle placeholders (logo: null, logoSrc: null). Pulled official marks: factory.svg from factory.ai favicon, forge.svg from forgecode.dev. All 8 cli-bridge backends now show real brand identity.
  • TEE / hardware-enclave row expanded from 4 to 9 providers — was missing the most relevant one for an AI-agent sandbox page: NVIDIA Confidential Computing (H100/H200 GPU attestation). Also added Intel TDX, AMD SEV-SNP, OCI Confidential VM, and Marlin Oyster.

Tooling

  • scripts/visual-audit.mjs (~600 lines): Playwright screenshots every public route at desktop + mobile, runs a 4-model ensemble (Claude Opus 4.5 / GPT-5 / Gemini 2.5 Pro / GLM-4.5V) against a structured design rubric, scores findings by inter-model agreement (3+ models = HIGH consensus, 2 = MODERATE, 1 = LOW/subjective), emits per-page markdown + a top-level SUMMARY.md ranking pages by HIGH-consensus count. Output gitignored under audit-results/<timestamp>/. pnpm audit:visual runs the full pass; flags for partial runs.
  • Side-fix: @tangle-network/brand spec in package.json pointed at file:../brand (the monorepo root, package name @tangle-network/design-system-monorepo). Build was working on a stale lockfile resolution; first clean pnpm install would break tokens.css imports. Spec now points at the actual subpackage at ../brand/packages/brand.

Test plan

  • pnpm build clean after every commit
  • Spot-checked every touched route at desktop 1440×900 — see commit ba9e382 for the wrap-bug that the spot-check caught
  • pnpm audit:visual smoke run on 2 pages × 2 models verified the pipeline
  • Full 4-model ensemble re-run after merge to re-baseline scores (next session; needs Gemini structured-output patch + GLM endpoint fix from Z.ai Coding Plan side)
  • Eyeball preview deploy (Cloudflare per-branch) before merging — confirm the 9-logo TEE row wraps cleanly at narrower viewports and the new H1s feel right in motion

🤖 Generated with Claude Code

drewstone added 10 commits May 3, 2026 03:10
Developers hero was a near-paste of overview's hero ("No infra, no SLA,
no on-call" landed verbatim on both, "Operators run instances. You earn
per execution" repeated twice within 50 lines on the same page, and the
H1 "Build decentralized services" said nothing the homepage hadn't).
Rewrite to lead with the builder economic — Blueprint ships once,
royalties land per operator-instance — without reusing overview's
operational-relief tagline.

Same pass on /overview "Monetize Blueprints" card body: "Instance-able
service templates. Earn while operators run them." was jargon-stew;
rewritten to name the mechanic ("Define the service spec. Every operator
running it pays you per call.").

Theme: .dev-partner-tile only declared a border, so 12 partner logos
disappeared into the vault-white background until you hovered. Add a
white tile bg so the grid reads at rest. Add defensive vault-cascade
rules for .op-card-title / .op-card-body in global.css so the operators
feature cards don't go white-on-white the day someone moves them into a
vault section.
scripts/visual-audit.mjs screenshots every public marketing page at
desktop (1440x900) and mobile (390x844) full-page, then runs a four-model
ensemble (Claude Opus 4.5, GPT-5, Gemini 2.5 Pro, GLM-4.5V) against a
sharp design-director rubric. Findings are bucketed by (category, location)
and ranked by how many models converged on the same issue — 3+ models =
HIGH consensus (definitely fix), 2 = MODERATE (look at it), 1 = LOW
(subjective, model-specific opinion). Per-page markdown plus top-level
SUMMARY.md ranking pages by HIGH-consensus count and surfacing systemic
issues that recur across the site.

Smoke run on /operators + /developers with two models converged on real
bugs the human review missed: stats-strip text fails AA contrast on the
dark surface, and the hero H1 says "Run a Tangle node" while every other
section says "operator" — terminology drift that confuses first-time
readers. That's exactly the signal we wanted: ensemble surfaces things
one reviewer wouldn't.

Usage: pnpm audit:visual (full run, ~$2-5 in vision API calls), or
pass --pages /foo,/bar --models claude,gpt for partial runs. Spawns
astro dev on :4321 if not already up, kills it on exit. Outputs to
audit-results/<timestamp>/ (gitignored).

Side-fix: pnpm-lock churn surfaced a real bug — package.json declared
@tangle-network/brand as file:../brand, but ../brand is the brand
*monorepo* root (package name @tangle-network/design-system-monorepo).
The actual brand subpackage lives at ../brand/packages/brand. Build was
working only on a stale lockfile resolution; the first pnpm install
ever to touch this would break tokens.css imports. Point the spec at
the subpackage so resolution is deterministic.
User: "all these little banners of like metrics and things IMO are
stupid af". Killed the StatsStrip on every non-home page — every
instance was either a feature list disguised as a stat ("Rust SDK +
TypeScript bindings", "any Docker image · SSH access") or a number
that doesn't earn its place above the fold. The component itself
survives in src/components/ui/ in case someone wants to bring it back
with real numbers later. Removed from: /overview, /operators,
/developers, /stake, /services/sandbox, /services/browser-agent,
plus the unused import in /services/blueprint-agent.

/stake hero — three independent flags from the audit:
  - eyebrow="COMING SOON" amber chip contradicted the page's own
    "Operators run revenue-generating services" claim AND the working
    "Open the dApp" link. Flipped to "SEASON 1 · LIVE".
  - title "Tangle Staking" was a product label, not a value prop.
    Now: "Stake to operators. Earn what they earn." — names the
    parity mechanic.
  - Primary CTA was "View Docs" on a conversion page. Swapped to
    "Open the dApp" → ai.tangle.tools; "Read the docs" demoted to
    secondary.

H1 rewrites across 5 pages — audit caught all of them being product
labels or category-generic where a mechanic-led headline belongs:
  /operators           "Run a Tangle node. Earn per execution."
                     → "One binary. Every Blueprint. Paid per call."
  /overview            "One Blueprint. Many operator instances."
                     → "Ship one Blueprint. Staked operators pay you per call."
  /ecosystem           "The networks Tangle plugs into."
                     → "Build a Blueprint against any of these."
  /services/blueprint-agent
                       "Blueprint Agent."
                     → "Prompt to deployed Blueprint."
  /services/sandbox    "Sandboxes for AI agents."
                     → "Containers that survive restarts."
  BuildsOnLogos h2     "Production-grade scaffolding for every stack"
                     → "Generated code against the stack you actually
                        ship with."

Plus a couple of operators-page tweaks: tightened the third "What
operators serve" card so the three cards have matching density, and
defined x402 inline ("x402 — HTTP-native payments") so the term
stops being undefined jargon for first-time readers. Replaced an
unexplained "MPP" abbreviation (probably a typo) with the explicit
x402 reference.

Build clean. /services/browser-agent.astro shows up in the diff only
because its StatsStrip + import were removed; the hero copy ("Your QA
team is an AI.") is staying — it's the only service-page H1 the audit
liked.

Drops the "x99p" hallucination from GPT-5 — grep confirms no instance
of "x99" exists in source. Source says x402 in all three call sites.
…andbox H1

User caught a real howler in the /overview hero: "Staked operators pay
you per call" inverts the actual economic flow. Per docs/pages/network/
incentives-overview.mdx, customers pay for Blueprint services in any
ERC-20 or native token, and the protocol splits each fee on chain —
default 20% developer / 40% operators / 20% stakers / 20% treasury.
Operators are *paid*, they don't pay.

Rewrites under the Ogilvy lens (headline carries 80% of the value;
promise a benefit; be specific; simple words; no clever-clever; tell
the truth, but make truth fascinating):

  /overview hero
    BEFORE  "Ship one Blueprint. Staked operators pay you per call."
            (wrong + jargon-stew "staked operators")
    AFTER   "Ship a Blueprint. Customers pay per call."
            Subhead names the exact 20/40/20/20 split so the claim
            is checkable, not vibey.

  /services/sandbox hero
    BEFORE  "Containers that survive restarts."
            (clever, abstract, overthinking)
    AFTER   "AI-native sandboxes."
            Per user — simple is cleaner. The mechanic (0.6s cold
            start, snapshot/restore) goes in the subhead where it
            earns its place.

  /stake hero
    BEFORE  "Stake to operators. Earn what they earn."
            (true but ambiguous — staker earns from what operator
            collects from customers; "they earn" reads circular)
    AFTER   "Back the operators. Take a cut of every fee."
            Subhead names the exact 20% staker share. Lede names
            the routing path (customer → operator → on-chain split).

  /developers subtitle + lede
    Sharpened the attribution: customers pay; you collect 20% on
    chain. Was vague-positive ("you collect on every call") with no
    named payer.

Ogilvy: "Tell the truth, but make truth fascinating." The truth here
is more interesting than the marketing-speak: every Blueprint call is
a real customer paying real money in their preferred asset, split on
chain by a smart contract. Lean into the mechanic, not abstractions.
Both harnesses were listed but rendering as plain letter-circle
placeholders because logo and logoSrc were null. Pulled the official
marks from each vendor:
  factory.svg  — factory.ai/favicon.svg (508×508, black bg, geometric mark)
  forge.svg    — forgecode.dev favicon (32×32, minimal mark)

All 8 pre-installed harnesses now render with real brand identity.
…DX + AMD SEV-SNP + OCI + Marlin

User flagged the isolation/TEE section as incomplete. Old list had 4
providers (AWS, GCP, Azure, Phala) which under-represents the actual
hardware-enclave universe — and notably missed NVIDIA Confidential
Computing, which is the most relevant enclave for an AI-agent sandbox
page (H100/H200 with GPU-attested execution).

Added 5, ordered by relevance to the page's audience:
  + OCI Confidential VM    — completes the major-cloud row
  + NVIDIA Confidential    — GPU attestation, the AI-workload TEE
  + Intel TDX              — hardware foundation under most cloud CVMs
  + AMD SEV-SNP            — the other CPU-level confidential primitive
  + Marlin Oyster          — decentralized TEE network (crypto-native,
                             text fallback like Phala — not in simple-icons)

Labels lengthened from terse codenames ("Azure CVM") to full product
names ("Azure Confidential VM") so the tooltip is checkable; the visible
logo row stays as marks only. flex-wrap on .sb-iso-tier-providers handles
the new row count without layout work.
…5 lines

Spot-check caught what build couldn't: my previous H1 rewrites looked
clean in the diff but blew out the two-column hero layout. Hero text
column is 512px wide when the right slot has a CodeWindow (which both
/operators and /developers use). At the H1's clamped 5.25rem (~84px)
bold display weight, lines like "Every Blueprint." and "Write the spec."
overflow into:

  /operators:  "One binary."           (line 1)
               "Every"                 (line 2)
               "Blueprint."            (line 3)
               "Paid per call."        (line 4 — gradient)

  /developers: "Write the"             (line 1)
               "spec."                 (line 2)
               "Earn from"             (line 3)
               "every"                 (line 4)
               "instance."             (line 5 — gradient)

Wider caps (B, E, W) ate the column the old "Run a Tangle node. / Earn
per execution." budget allowed for. Shortened to parallel 2-line
Ogilvy-rhythm headlines that fit the 512px column at 84px:

  /operators:   "One binary. / Earn per call."
  /developers:  "Write it once. / Earn forever."

Verified via screenshot at 1440×900: both now render as 2 lines, 176px
tall, with the gradient on the second clause (the promise of compound
returns). H1 box width measured at 498px — sits inside the column with
breathing room.

Saved a feedback memory: always spot-check renders before declaring
visual work done. Green build ≠ correct UI.
…h image

CI on PR #15 hit two failures plus a real content issue the user spotted:

1. check:models — scripts/visual-audit.mjs hardcodes gpt-5 (and references
   it 4 times in comments + model config). OpenAI's live deprecation list
   now marks gpt-5 as deprecated. The audit script intentionally pins
   model identifiers for routing — same shape as scripts/check-models.mjs
   itself. Allowlist via .deprecated-models.allow.json files entry.

2. check:links — dead URL in the x402-operator-economics blog post:
   tnt-core/src/exposure/ExposureCalculator.sol returns 404. Per
   tnt-core's CHANGELOG ("Deleted unused src/exposure/ module"), the
   ExposureManager + ExposureCalculator libraries were removed; the
   equivalent live logic is in src/core/PaymentsEffectiveExposure.sol.
   Updated the source link with a sentence acknowledging the inline.

3. Hallucinated AI mockup image — user flagged that the workbench
   screenshot on /services/blueprint-agent has unreadable, AI-generated
   chat + code that doesn't render legibly at hero scale and contains
   nonsense CLI commands ("pn install", "pep create..."). Swapped to
   blueprint-agent-app.png — the real ai.tangle.tools landing UI with
   readable text ("Describe it. Ship it.", real input field, template
   icons). Updated 3 references (BaseLayout og-image, hero <a href>,
   hero <img src>).

Side-fix: Forge harness link was 'antinomyhq/forge' which now 301s to
'tailcallhq/forgecode' (the repo was renamed/moved). Lychee accepted
the redirect but quality bar says point at the current URL.

.deprecated-models.cache.json regenerated (156 model ids, was 144) —
that file is tracked in git per existing convention.

Known follow-up: form.typeform.com/to/IE4hT9jW (used in 3 places —
BuildsOnLogos integration form, /overview Start Building CTA, /sandbox
Book intake call) now redirects to typeform.com/explore?...typeform-
incorrectURL — the form is dead. Not blocking CI (redirect resolves
to 200) but every "request integration" CTA on the site is broken.
Flag for next session.
form.typeform.com/to/IE4hT9jW was redirecting to
typeform.com/explore?...typeform-incorrectURL — the underlying form
is deleted. Every "request integration / start building / book intake
call" CTA on the site was bouncing visitors to a generic Typeform
landing page.

Replaced all 3 references with `mailto:` links to hello@tangle.tools
(the existing pattern, already used for the "New harness request" CTA
on the sandbox page), each with a contextual subject so the receiving
inbox can tell which surface the click came from:

  BuildsOnLogos.astro       → Integration request
  /overview Start Building  → Start building on Tangle
  /sandbox Book intake call → Sandbox intake call

mailto links don't need target=_blank (the OS picks the mail client)
so removed it on the sandbox link to match BuildsOnLogos pattern.
@drewstone drewstone merged commit 5952f4c into master May 13, 2026
3 checks passed
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.

1 participant