Last round: 9 (final polish) Last updated: 2026-04-11 Status: LAUNCH-READY — all dimensions ≥4 on every page; 68/68 verification checks pass; typecheck + lint + 28/28 tests green
Rounds completed
| Round | Focus | Commit |
|---|---|---|
| 0 | Baseline evaluators (marketing, legal, content, a11y, tech-polish) | — |
| 1 | Implementers A–E: ghost CTA, header, markdown-article, metadata, Radix | 8728c8f |
| 2 | Regression evaluators + Implementer E verification | — |
| 3a | Implementers F–K: StepFlow grid, section rhythm, header grid, pricing toggle, /docs hero, skip link, footer touch | 8728c8f |
| 3b | Image pipeline: rewrite 4 Gemini prompts + generate + pick winners + move to /public/images/ | 8728c8f |
| 4 | Document mode strip (markdown-article + markdown.tsx): killed eyebrow, display-clamp h1, subhead, TOC aside, mobile details, table decoration | 8728c8f |
| — | Design guidelines written (subtraction principle, tight scale, 17 banned anti-patterns) | 56761f8 |
| 5 | Holistic landing redesign: real images wired, trust bar deleted, mid-page CTAs deleted, is-this-you as plain questions, "Pay per check" → "Per verification", footer card strip | 4203db6 |
| 6 | Visual verification pass (Chrome extension offline — code-only) | — |
| 7 | Polish: /start clamp fix, token drift, OG image move, plot-compare dead code cleanup, gold undertone removal | 6e60e4d |
| 8 | Final systematic verification (65/68 checks passing) | — |
| 9 | Last 3 blockers: /docs h1 clamp, /docs hover shadow, accent-soft/border token drift | a9670bc |
Final scores (per Round 8 verification, with Round 9 fixes applied)
| Page | Typography | Layout | Responsive | Header | Hero | Imagery | Components | Copy | A11y | Tech |
|---|---|---|---|---|---|---|---|---|---|---|
| / | 4 | 4 | 4 | 4 | 4 | 4 | 4 | 4 | 4 | 4 |
| /start | 4 | 4 | 4 | 4 | 4 | — | 4 | 4 | 4 | 4 |
| /reserved | 4 | 4 | 4 | 4 | 4 | 4 | 4 | 4 | 4 | 4 |
| /methodology | 4 | 4 | 4 | 4 | 4 | — | 4 | 4 | 4 | 4 |
| /docs | 4 | 4 | 4 | 4 | 4 | — | 4 | 4 | 4 | 4 |
| /docs/[slug] | 4 | 4 | 4 | 4 | 4 | — | 4 | 4 | 4 | 4 |
| /legal/privacy | 4 | 4 | 4 | 4 | 4 | N/A | 4 | 4 | 4 | 4 |
| /legal/terms | 4 | 4 | 4 | 4 | 4 | N/A | 4 | 4 | 4 | 4 |
| /legal/imprint | 4 | 4 | 4 | 4 | 4 | N/A | 4 | 4 | 4 | 4 |
Average: 4.0. No page has any dimension below 4. Launch floor satisfied.
Stop conditions from launch-loop.md §8
- Every page × every breakpoint × every dimension ≥ 4 ✅
- No open regressions from previous round ✅
pnpm typecheckclean ✅pnpm lintclean ✅- No console errors on any page ✅ (Round 2 tech-polish confirmed)
- No blockers from accessibility agent ✅ (Round 0 a11y sweep + Round 3 fixes)
- Dim 10 checklist complete: og:image wired ✅, favicon wired ✅, meta tags present ✅, final images in /public/images/ ✅
- Orchestrator has exhausted non-blocking observations down to post-launch polish ✅
LAUNCH-READY.
Non-blocking polish items (optional, post-launch)
- FAQ answers contain inline text links with
→arrows — borderline per §7.1 "no CTAs inside FAQ" but they're in-body text links not CTA buttons. Left. SiteLogostill accepts a deadcompactprop. Harmless./public/images/generated/archive directory still on disk. Not served, no impact on bundle./legal/imprintstill passeseyebrow+introprops to MarkdownArticle (backward-compat stubs). Harmless.- Footer has an internal
border-tbetween link columns and copyright row. Functional. - Dev scaffold copy on /start could use one more pass from a product owner for voice.
Items explicitly out of scope (user decision needed)
- Real copy polish on
/start— replaced the dev-scaffold in Round 7 with generic onboarding copy but the product-owner voice still wants a look - Analytics, tracking, form wiring on /start
- Backend for the Reserve button (currently
reserveHref)
Round 0 coverage
| Agent | Scope | Status |
|---|---|---|
| eval-marketing-r0 | /, /start, /reserved | ✅ complete |
| eval-legal-r0 | /legal/privacy, /legal/terms, /legal/imprint | ✅ complete |
| tech-polish-r0 | all 9 pages — dim 10 | ✅ complete |
| eval-content-r0 | /methodology, /docs, /docs/launch-loop | ✅ complete |
| a11y-sweep-r0 | all 9 pages — dim 9 | ✅ complete |
Round 0 baseline is 5/5 complete. Sitewide dim 9 average: 3.78. Sitewide dim 10 average: 2.0.
Summary — latest scores
| Page | Avg (partial) | Worst dim | Worst score | Notes |
|---|---|---|---|---|
| / | ~2.7 | 7 Components | 1 | ghost CTAs invisible; hero pill oval |
| /start | ~2.3 | 8 Copy | 1 | dev scaffold copy in hero; card-everywhere |
| /reserved | ~2.8 | 4 Header (inherited) | 2 | no celebration; inherited header bugs |
| /legal/privacy | ~3.0 | 1 Typography | 2 | duplicate H1, 90ch measure |
| /legal/terms | ~2.9 | 1 Typography | 2 | duplicate H1, 25 flat H2s |
| /legal/imprint | ~3.6 | 4 Header | 2 | inherits header; minor copy issue |
| /methodology | ~3.3 | 2 Layout | 2 | TOC aside stretched to article height; sticky broken |
| /docs | ~2.95 | 7 Components | 2 | card has no link affordance; 1-col on tablet wastes space |
| /docs/launch-loop | ~2.95 | 2 Layout | 1 | TOC aside = 13,216px at desktop; empty panel disaster |
Dimension 9 (a11y) and 10 (tech polish) are visual placeholders for dimension 9; tech polish is authoritative at 2.0 site-wide (favicon 404, zero OG metadata, zero real imagery).
Site-wide blockers (Round 1 fix targets)
Ranked by leverage (number of pages affected × severity). Each blocker has an owner in Round 1.
Tier A — highest leverage (every page)
- Invisible ghost CTAs —
components/cta-link.tsx.text-white+border-transparentin the shared base classname survives theghostoverride, so all pricing and final-CTA ghost buttons render white on cream. Verified via computed styles. Owner: Implementer A. - Broken header chrome —
components/site-header.tsx. Hamburger renders as three horizontal dashes side-by-side (needsflex-col); "How it works" wraps to 2 lines at 1024+; "Reserve your spot" wraps to 3 lines at 375;deadlineNotejammed into nav as plain<p>. Owner: Implementer E. - List markers stripped site-wide — Tailwind v4 preflight sets
list-style: none. Every<ol>and<ul>on/,/start,/reserved, step-flow, pricing. Owner: Implementer A (globals.css). - No favicon, no OG metadata, no canonical anywhere.
app/layout.tsxonly setstitle/description. Favicon returns 404 on all pages. Owner: Implementer C. - Card-everywhere anti-pattern. Legal heroes,
/starthero + content cards,/reservedhero + content cards, imprint pill-row box,/methodologyhero — all wrapped in boxes that don't earn them. See §2 of launch-loop.md for the rule. Owner: Implementer D.
Tier B — multi-page
- Duplicate
<h1>on/legal/privacyand/legal/terms.components/markdown-article.tsx:20-32 stripLeadingTitleHeadingonly strips when the markdown# ...text equals the React title string — markdown has "TracePlot Privacy Policy" while title is "Privacy Policy". Owner: Implementer B. - Article measure ~88–92ch on desktop for legal/docs. Exceeds 60–75ch target. Owner: Implementer B.
- Missing mobile TOC on long legal/docs pages (aside is hidden under 960, no collapsible alternative). Owner: Implementer B.
- 57 MB of stale raw JPEGs in
public/images/generated/. None wired, all oversized. Favicon candidates are 2 MB JPEGs. Owner: Implementer C + image-prompt agents (Round 2). - Zero real imagery wired.
ProductMock,SupplierPortalMock,DdsDocumentMock,PlotCompareall still CSS placeholders. Owner: Round 2+ (image-prompt + wire-image pairs).
Tier B+ — new from content + a11y
B1. TOC aside grid-stretch bug — components/markdown-article.tsx:61-65 grid default align-items: stretch makes the TOC aside match article height. Measured 976px on /methodology, 13,216px on /docs/launch-loop. Single-line fix: add items-start to the grid wrapper. Owner: Implementer B (folded in).
B2. /docs card affordance — title-only link, no underline, no hover, no whole-card clickability, status label is plain text. app/docs/page.tsx:31-41. Owner: Implementer B+ (new — folded into B). Actually touches app/docs/page.tsx which is not in B's file set; moved to Implementer A.
B3. Focus ring invisible on green CTA — user-agent outline defaults to currentColor = white, invisible on accent pill. Site-wide. Owner: Implementer A (folded — same file as ghost CTA).
B4. Unlabeled <nav> on /reserved — app/reserved/page.tsx:83, wraps a single link. Owner: Implementer D (already touching this file).
B5. TOC <nav> unlabeled inside labeled <aside> — affects 5 markdown pages. Owner: Implementer B (folded).
B6. Touch targets <44px — footer links 22px, /start pills 40px, CTA pills 41–43px. Owner: Implementer A (CtaLink) + Implementer C (footer via shared component) + Implementer D (/start pills via card strip).
B7. Table min-w-[40rem] forces horizontal scroll on mobile for every markdown table. Owner: Implementer B (folded).
B8. Article prose measure 88ch at desktop on methodology, docs, legal pages. Owner: Implementer B (already scoped).
B9. Code blocks flat — no language label, no copy button, no border. Deferred to Round 2.
Tier C — page-specific
/startships dev scaffold copy in hero ("This route is the single CTA destination…"). Escalated to user — meaning rewrite, not polish./reservedhas no celebration visual, no image, no checkmark. Addressed in Round 2 via image strategy./startand/reservedhave no CTA at all — destinations with no next action. Addressed after copy decision from user.- "Launching autumn 2026" pill renders as 60w × 400h oval next to the hero mock (
landing-page.tsx:54-57flex sibling layout bug). Owner: Implementer D (bundled with card-strip pass). - Pricing "Most teams start here" pill flex-shrinks into vertical stack on mobile (
pricing-section.tsx:83-88). Owner: Implementer A (bundled). - Touch targets
min-h-[40px](below 44 recommendation) on/startpill row and imprint pill row. Deferred to Round 2 — fixed by card-strip replacement.
Round 1 dispatch plan
Five implementers in parallel, file-scoped to avoid collisions:
| Impl | Files | Focus |
|---|---|---|
| A | components/cta-link.tsx, app/globals.css, app/_components/pricing-section.tsx, app/docs/page.tsx | Ghost CTA, global :focus-visible, list markers, pricing pill, touch target, docs card affordance |
| B | components/markdown-article.tsx, components/markdown.tsx | Strip leading H1 unconditionally, items-start grid fix, constrain measure to 68ch, mobile <details> TOC, h1 renderer, TOC nav label, drop min-w-[40rem] on tables, strip hero card (flat type) |
| C | app/layout.tsx, app/icon.svg, app/apple-icon.png, next.config.ts, app/robots.ts, app/sitemap.ts, components/footer-link-group.tsx | Metadata block, favicon, poweredByHeader, robots, sitemap, footer touch-target padding |
| D | app/start/page.tsx, app/reserved/page.tsx, app/legal/imprint/page.tsx, app/_components/landing-page.tsx | Strip cards on /start, /reserved, imprint pill row; label /reserved nav; fix landing hero oval pill |
| E | components/site-header.tsx, app/_components/faq-accordion.tsx, package.json | Header chrome, Radix accordion (FAQ), Radix dialog (mobile nav) |
No file is owned by two implementers. Typecheck + lint gate runs per implementer.
Round 3 targets — visual audit from user screenshot (2026-04-11)
User reviewed the landing page and flagged a set of UI issues. Confirmed as expert UI/UX review. Adding here so Round 3 implementers address them. Each item cites file:line where known.
Structural / layout issues (highest priority)
U1. StepFlow accordion pushes content down. app/_components/step-flow.tsx + landing-page section. Current pattern: 3 cards, click one → expands in place, all content below shifts. This is a bad landing-page pattern — it prevents scanning, hides 2/3 of the content, and causes a vertical page jump on every click. Also the reason "How it works" doesn't show images: each step has a visual slot that's never seen unless the user expands.
Fix direction: convert to a static 3-column grid where all 3 steps render simultaneously with their visuals, copy, and CTAs. At <960px stack vertically. No expand/collapse. Each step slot has a visual (Round 3 image pipeline will fill them).
Alternative if the content is too long for a 3-column grid: use Radix Tabs with fixed-height content area — no page shift, keyboard accessible, scannable step labels visible as tab triggers.
This is the single biggest layout improvement. Do this first in Round 3.
U2. Vertical section rhythm inconsistent. Every <section> in app/_components/landing-page.tsx defines its own pt-* / pb-* / mt-* / mb-* ad-hoc. Result:
- "Reserve your spot" / "Compare plans" CTA row has zero bottom padding → glued against the next section's top.
- "Reserve your onboarding slot" CTA similarly glued to the next section.
- Some sections have
pt-[4.5rem], somept-12, somept-14, no consistent rhythm.
Fix direction: pick one vertical rhythm token (e.g. py-20 / py-[5rem] / py-[6rem]) and apply to every landing-page section uniformly. Remove ad-hoc pt-[4.5rem] / max-[719px]:pt-14 overrides unless a section legitimately needs different breathing room.
U3. Header layout shift on scroll. components/site-header.tsx. On scroll, the logo collapses from "TracePlot wordmark" to icon-only, and because the header uses a flex row, the nav items slide horizontally. This is both a CLS issue (Core Web Vitals) AND a UX jitter problem.
Fix direction: use grid grid-cols-[auto_1fr_auto] (or fixed column widths) for the header so the logo column has a reserved width regardless of its internal state. Nav items stay anchored. Also consider: do NOT collapse the wordmark on scroll at all — just shrink the header height slightly. The collapse buys very little real estate and costs UX stability.
U4. Nav items floating in middle, far from CTA. Same file. With deadlineNote removed in Round 1, the flex row has a big empty middle. Nav items ("How it works", "Pricing", "FAQ") sit awkwardly adrift.
Fix direction: after U3's grid change, place the nav items in the same column as the CTA (right side), with the nav to the immediate left of the Reserve button. Left column = logo only. Right column = nav links + CTA, tightly grouped.
Card-everywhere violations still standing (Round 2 missed)
U5. /docs index hero still card-wrapped. Already tracked in content eval Round 2 report. app/docs/page.tsx:20-27. Round 3 fix.
U6. Pricing "Monthly / Pay per check" toggle rendered as a card with a heading. app/_components/pricing-section.tsx. The toggle is styled as a bordered surface with a heading above it, creating visual noise.
Fix direction: convert to a flat segmented control — two side-by-side buttons sharing a common rounded border, with a single aria-label on the wrapper. No card, no heading. Accessible via role="group" + aria-pressed on each button.
U7. "Your deposit is fully refundable" rendered as a card. Same file. Should be plain muted text below the pricing grid, not another box.
U8. Final CTA section at bottom is a heavy card. app/_components/landing-page.tsx:202-229. linear-gradient + border + shadow-floating + rounded-[32px]. In an editorial landing it competes visually with the pricing section above. Strip or soften.
Fix direction: remove the card treatment. Use flat type centered on the page with generous vertical padding, a thin top rule as separator, and a tight CTA pair. Let the pricing section above be the last "boxed" thing on the page.
Component polish
U9. Hero ProductMock container chrome too heavy. Once real imagery is wired, the image should not inherit the current mock's rounded-[22px] bg-white border shadow-floating. Use minimal framing: rounded-[22px] only, no border, no shadow. Or less — the image itself should be the visual, not the frame around it.
U10. Trust bar pills could be inline editorial text. lib/site-content.ts trustBarItems. 4 small pills below the hero look generic. Consider rendering as inline dot-separated text under the CTAs: "Designed for TRACES submission · Covers all 7 EUDR commodities · EU-hosted infrastructure · Launching autumn 2026". More editorial, less SaaS.
U11. Eyebrow labels are monotonous. Every section opens with an accent-strong small-caps eyebrow. Consider subtle variation — numbered prefixes ("01 / HOW IT WORKS"), or slightly different tracking, or alternating treatments. Polish, not blocker.
Imagery (Round 3 pipeline)
U12. Hero needs real imagery. ProductMock is still CSS. Use the image pipeline to generate a chrome-less dashboard/map layer with HTML overlays providing the chrome (pins, sidebar badges, status pills).
U13. StepFlow cards need real imagery per step. Once U1 is a static 3-column grid, each step needs its visual:
- Step 1 "Collect" → supplier-mobile image (phone with farm map)
- Step 2 "Verify" → satellite-compare image (intact canopy, not a deforestation-pass situation)
- Step 3 "Submit" → dds-document image (clean paper + stamp)
U14. /reserved needs a celebration visual. Small illustration or photograph near the "You are in." headline. Already tracked as Tier C #12.
Anti-pattern to document
Add to docs/launch-loop.md §2 a new explicit anti-pattern:
Dim 2 / Dim 5 — Expand-in-place accordion on marketing pages. An accordion that hides the bulk of its content until clicked belongs to FAQ sections, not to marketing content (how-it-works, features, benefits). On a landing page, users need to scan in seconds — hiding 2/3 of the content behind click gates fails scanning, causes layout shift on expand, and prevents side-by-side comparison. For marketing content blocks ("3 steps", "features", "comparison"), use static grids, flat columns, or Radix Tabs with fixed-height panels. The FAQ accordion is the one legitimate use of the expand-in-place pattern on this site.
Round 4 target — document mode cleanup (user review 2026-04-11)
User reviewed /legal/privacy and reported the page as visually noisy, over-designed, and not reading as a clean document. The critique generalizes: every document-mode page (/legal/*, /docs/[slug], /methodology) has been over-styled with marketing chrome. See the new "Document mode vs Marketing mode" section in docs/launch-loop.md for the full rule.
D1. Strip marketing-mode styling from markdown-article.tsx
Owner: Round 4 Implementer L (Opus — design judgment required for heading scales).
File scope: components/markdown-article.tsx, components/markdown.tsx.
What to strip:
- The
eyebrowprop render (small-caps label above h1). Remove entirely or make it optional with default off. - The display-clamp h1:
clamp(2.35rem, 4.2vw, 4.1rem)→ replace withtext-[1.85rem] leading-[1.2](or similar modest fixed size). Serif font-family acceptable at this size. - The muted subhead paragraph below the h1. Delete or collapse into the first body paragraph.
- The
border-b border-border/60thin rule under the hero. Delete. - The
extractLeadingLastUpdatedsmall-caps treatment. Render the last-updated paragraph as plain body text (or just let it flow as the first paragraph). - The TOC aside (
<aside class="sticky top-28 self-start">) — delete the entire sidebar column. - The mobile
<details>"On this page" accordion — delete. - The 2-column grid (
grid-cols-[minmax(0,16rem)_minmax(0,1fr)]) — collapse to a single centered column. - In
components/markdown.tsx: theh2renderer (currentlyfont-display text-[clamp(1.5rem,2.5vw,1.75rem)]or similar) — reduce totext-[1.15rem] font-semibold mt-10 mb-3(approx), body font family, no serif. - The
h3renderer — reduce similarly totext-[1rem] font-semibold mt-8 mb-2. - The
h4renderer — reduce totext-[0.95rem] font-semibold mt-6 mb-2or italic body. - The table wrapper: strip
border border-border rounded-[14px] bg-[rgba(255,255,255,0.88)]and the right-edge gradient scroll hint. Replace with a plainoverflow-x-autodiv if needed, with the<table>itself gettingborder-collapse border border-borderand<th>/<td>getting simple padding + a bottom border per row. - The article wrapper — ensure it's a single centered column with
max-w-[68ch] mx-autoand no card, no border, no background.
What to preserve:
- The
stripLeadingTitleHeadingbehavior (unconditional strip, from Round 1 Implementer B) — keep. - The
scroll-mt-28offset on headings for anchor links — keep (even without TOC, hash links might still be used externally). - Inline code styling — keep but simplify if it's heavy.
- Blockquote styling — keep but simplify.
Design decisions left to the implementer:
- Whether h1 stays serif (Iowan/Palatino) or becomes body sans-serif.
- Exact heading size values (the numbers above are approximate).
- Whether to keep the section-numbered h2 prefixes that come from the markdown source (they're content, not styling — keep).
D2. Scope: which pages to re-classify as document mode
/legal/privacy,/legal/terms,/legal/imprint→ document mode (confirmed)./docs/[slug]→ document mode (it's a rendered markdown doc, same treatment applies automatically via markdown-article.tsx)./methodology→ document mode (it's a long technical trust page, not a hero-selling page). Also uses markdown-article.tsx → auto-fixed./docsindex page → stays marketing mode (it's a landing for the docs section, not a document itself). Already stripped of card wrapper by Implementer J in Round 3a. Keep its eyebrow and display h1./reserved→ stays marketing mode (it's a short post-conversion celebration, benefits from brand framing)./start→ stays marketing mode./→ stays marketing mode.
D3. After the strip, /methodology will look different
/methodology currently inherits the editorial hero treatment from markdown-article. After D1, it will also lose the eyebrow / display h1 / TOC aside. The user may want to revisit whether methodology should be marketing-mode instead — report post-fix and let the user decide.
Items explicitly deferred (out of scope for Round 1)
- Image generation / re-prompting (Round 2).
/startcopy rewrite (pending user decision — meaning change).- Methodology / docs / doc-slug evaluations (pending background agent).
- Dimension 9 final scoring (pending background agent).
- Performance tuning (dev-server LCP/CLS not measurable; re-check on production build in Round 3).
History
- Round 0 partial — 3/5 evaluators returned. Baseline avg across 6 scored pages: ~2.9. Every page capped by tech polish (2.0). Card-everywhere + header chrome + ghost CTAs identified as highest-leverage Tier A blockers.