Skip to content

feat(www): reposition public site around governed AI adoption#286

Merged
ericodom merged 8 commits into
mainfrom
feat/www-governance-positioning
Apr 20, 2026
Merged

feat(www): reposition public site around governed AI adoption#286
ericodom merged 8 commits into
mainfrom
feat/www-governance-positioning

Conversation

@ericodom
Copy link
Copy Markdown
Contributor

Summary

Reframe the apps/www public site from "AI infrastructure in your AWS" (architecture-first) to "the control plane for governed AI adoption" (CTO-first). Built for enterprise CTOs the sales lead is meeting at the conference this week — the same audience being pushed toward either banning AI or adopting it naively.

Every capability claim maps to a feature that already ships in apps/admin. The plan this implements, with the full codebase audit and prior-art research, is at docs/plans/2026-04-20-001-feat-www-governance-positioning-refresh-plan.md.

What changed

New narrative arc (top to bottom):

  • Hero — new headline: "The control plane for governed AI adoption."
  • ProofStrip — five governance proof points (replaces the four open-source/self-host bullets)
  • AdoptionProblem (new) — the "ban-or-adopt is a false choice" framing
  • FiveControls (new) — five pillar cards; replaces WhyThinkWork
  • AgentTemplates / CostControl / Evals (new) — one showcase per control with admin screenshot + proof bullets
  • SystemModel, MemoryWedge, FinalCTA — reframed voice
  • MobileApp, QuickStart — largely intact (benefit + dev entry path)

Shared infrastructure:

  • src/lib/copy.ts — single source of truth for all homepage copy so future edits don't drift across sections
  • src/components/ScreenshotFrame.astro — consistent bezel + caption wrapper; renders a styled SVG mockup until real admin captures drop in
  • src/components/BrainMark.astro untouched; brand color untouched; no new deps

Respecting the explicit scope boundaries:

  • No CTA change — still Read the docs / View on GitHub / admin Login
  • No compliance badges (SOC2/HIPAA/ISO are unearned; listing them would contradict the bar)
  • No new routes, blog, pricing, or contact form
  • No industry name-drops — framing is industry-agnostic per product decision

Screenshots follow-up

The three capability showcases currently render stylized SVG mockups so the site ships polished. Real captures go in:

  • apps/www/public/images/admin/agent-templates.png
  • apps/www/public/images/admin/cost-analytics.png
  • apps/www/public/images/admin/evals-run.png

Once the PNGs are dropped in, flip pending to false on each ScreenshotFrame. Capture checklist at apps/www/public/images/admin/CAPTURE.md.

Test plan

  • pnpm --filter @thinkwork/www build completes without warnings (verified locally)
  • Header nav anchors jump to the right sections: Controls, System, Memory, Quick start
  • Hero, ProofStrip, AdoptionProblem, FiveControls render cleanly at 375px / 768px / 1280px
  • Three capability showcases alternate background tone correctly and stack on mobile
  • SystemModel + MemoryWedge still reference existing admin screenshots with accurate alt text
  • Meta description + title in <head> reflect the new positioning
  • No stray references to WhyThinkWork remain (deleted)
  • Social card unfurl (Slack / Twitter validator) renders the new title + description

Plan reference

  • docs/plans/2026-04-20-001-feat-www-governance-positioning-refresh-plan.md

🤖 Generated with Claude Code

ericodom and others added 8 commits April 20, 2026 06:31
Reframe apps/www from "AI infrastructure in your AWS" (architecture-first)
to "the control plane for governed AI adoption" (CTO-first). The same
five controls were already shipped in admin — they just weren't marketed.

New narrative arc:
- Hero + ProofStrip lead with governance, not self-hosting.
- AdoptionProblem frames the ban-or-adopt false choice.
- FiveControls enumerates the five governance pillars (replaces
  WhyThinkWork's three generic pillars).
- AgentTemplates / CostControl / Evals showcase each control with a
  caption-matched screenshot frame (styled SVG mockups now; real admin
  captures follow via apps/www/public/images/admin/CAPTURE.md).
- SystemModel, MemoryWedge, FinalCTA reframed to match the new voice;
  MemoryWedge moves after the control story as a durable benefit.
- All copy moves to a single apps/www/src/lib/copy.ts source so future
  edits don't drift across sections.

Meta + OG description updated. No new dependencies. No CTA changes
(docs/GitHub/login only). No new routes. No compliance badges (unearned).
Header nav anchors relock to the new section IDs.

Also includes the plan this implements:
docs/plans/2026-04-20-001-feat-www-governance-positioning-refresh-plan.md

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
One-hand design pass across the whole homepage. The legacy sections
(Hero, ProofStrip, SystemModel, MemoryWedge, MobileApp, QuickStart,
FinalCTA) and the new enterprise-positioning sections (AdoptionProblem,
FiveControls, AgentTemplates, CostControl, Evals) now share one visual
vocabulary.

Shared primitives:
- SectionShell — one section wrapper with default/raised/sunken tone
  and none/top/center/cascade glow presets
- SectionHeader — one eyebrow + H2 + lede lockup with optional step marker
- CapabilityShowcase — single partial used by AgentTemplates, CostControl,
  Evals so the three showcases can never drift
- ScreenshotFrame — window-chromed frame (3 dots + route label) used for
  every product shot on the page, with styled SVG fallback while
  `pending={true}`

Adjustments:
- Hero: tighten pill eyebrow, text-balance + text-pretty on headline and lede
- ProofStrip: cardless, dot-led list with top brand hairline (no more divider grid)
- AdoptionProblem: numbered cards match FiveControls rhythm
- FiveControls: card hover states, numeric "01" marker in top-right
- SystemModel: keep the "Control wraps the system" frame, restyle to match
- MemoryWedge: replace gradient cards with unified card vocabulary
- MobileApp: single padded stage for both phones, swap Tasks → Wiki
- QuickStart: terminal chrome aligned with ScreenshotFrame chrome
- FinalCTA: echo the hero pill eyebrow to close the loop

Real product screenshots added — 9 captures committed under
apps/www/public/images/ with CAPTURE.md inventory:
- admin: dashboard, agent-templates (capabilities list), cost-analytics,
  memories-graph (all-agents view), plus memories-graph-filtered
  and thread-detail held as reserve assets
- mobile: threads-list, wiki-graph (now paired with threads in MobileApp),
  wiki-list held as reserve asset

Evals still renders its SVG mock (no capture yet) — flip `pending={false}`
in Evals.astro when a real evals-run.png lands.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Evals was the last section still rendering the SVG placeholder. Pull
the dedicated showcase from the homepage until a real /evaluations/$runId
capture lands. Evals still appears as pillar #5 in FiveControls and as
a proof point in ProofStrip — the narrative claim is preserved; only
the fake-screenshot section goes away.

While here:
- Strip the `pending` fallback + SVG variants from ScreenshotFrame.
  Every active screenshot on the page is now a real PNG; the component
  is a pure window-chrome wrapper.
- Remove the pending/variant props from CapabilityShowcase and callers.
- Realign the two phones in MobileApp: drop the decorative
  translate-y offsets, switch from flex items-end to grid items-start
  so both phones anchor to the same top and their labels sit on the
  same baseline.

CAPTURE.md documents how to re-add the Evals section once a real
screenshot is captured.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Drop the floating bullet list next to the screenshot. Each showcase now:
- Centers the eyebrow + headline + lede above the fold of the section
- Puts the product screenshot front and center at full section width
- Promotes each proof point to a numbered feature card in a 4-up grid
  below the screenshot — each card has a pill-style mono number, a
  strong title, and a supporting sentence

Copy migrated from flat `bullets: string[]` to `features: { title, desc }[]`
in lib/copy.ts for AgentTemplates and CostControl so the grid has real
titles to render.

Dropped the `figureFirst` prop — the new layout is top-to-bottom by
construction, so left/right ordering is irrelevant.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Work the thread-detail screenshot into the page as a dedicated Audit
section. The narrative arc through the governance block now reads:
  Templates  -> control what agents CAN do
  Audit      -> record what they DID
  Cost       -> measure what it COST

Audit uses the same elevated CapabilityShowcase pattern (centered
header -> full-width screenshot -> 4-up numbered feature grid).
Features: Step-by-step execution, Token + cost per turn, Status +
attribution, Ready for evals (bridges back to the evals pillar
without needing a dedicated evals screenshot).

Flipped CostControl tone back to default so the three showcases
alternate cleanly (default -> raised -> default).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Adversarial + CTO reviewers flagged overclaims, voice-guardrail
violations, and dead code. This commit addresses the must-fix list:

Overclaim corrections (schema vs copy):
- "Tool allow-lists" -> "Tool block-lists" (copy.ts). The schema is
  blocked_tools (deny-list); the previous framing promised a permit-
  by-default model the runtime doesn't enforce. Security sign-off can
  no longer rest on a false premise.
- "Automated gates on every template change" -> "Evaluation harness
  for every template" (proofStrip + controls items + evals lede).
  Nothing in packages/api gates a template write on eval results;
  "gate" was load-bearing language without an enforcing code path.
- "Pipe the raw cost event stream into your own FinOps system" ->
  "Cost events live in the Postgres you deployed" (costControl
  features[3]). No export surface ships; the FinOps-system framing
  implied a customer contract that doesn't exist.
- "Ready for a compliance review" -> "Inspectable per thread, per
  agent, per tenant" (audit lede). Violated the file's own "no
  unearned compliance" guardrail.

Voice-guardrail compliance (top-of-file rules finally enforced):
- FiveControls headline "The guardrails your adoption review already
  requires" -> "Governance primitives, not bolted-on guardrails"
- FiveControls lede "Every control a skeptical CTO expects" ->
  "Five first-class controls a governed rollout actually requires"
- CostControl headline "No surprise invoices from a runaway agent" ->
  "Cost attributed where it happens"
- CostControl features[2] "turns into a receivable" -> "compounds into a bill"
- SystemModel lede "explain to a board" -> "hold in your head"
  (restores the original, sharper phrasing)
- AdoptionProblem bullet "Not a pilot that can't scale" -> "One system
  at every scale. The runtime a developer spins up in five commands
  is the runtime production runs on." (drop "harness" jargon too)
- MobileApp "No pull-to-refresh dance" -> removed
- FinalCTA "The harness stays yours" -> "The runtime stays yours"
  (harness is insider jargon, never defined on the page)

Hero lede split:
- One 29-word comma pile -> two sentences. Easier for a hurried scan.

Evals as a sub-feature, not a placeholder section:
- Strengthened Audit features[3] ("Evals run on the same trace") to
  carry the AgentCore + custom-assertion story in one card. The
  evals export in copy.ts is kept for when a real /evaluations/$runId
  capture arrives and the dedicated showcase can be re-added
  (instructions in CAPTURE.md).

Dead code + orphan asset cleanup:
- Moved unused reserve captures out of public/ into apps/www/assets/
  so they stay versioned but stop shipping: memories-graph-filtered.png,
  mobile/wiki-list.png, mobile/tasks-list.png.
- Updated CAPTURE.md: removed references to the long-deleted `pending`
  prop and SVG fallbacks; documented how to re-add the Evals showcase.

OG image:
- Replaced the stale og-image.png (pre-positioning) with a fresh
  1200x630 export matching the new hero. Rendered via Chrome headless
  from scripts/og-source.html (kept in-tree so the asset is
  regeneratable).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
The Templates screenshot is the Capabilities/Skills list, which is
the weakest visual of the four product shots. Leading with it killed
momentum right after the five-controls overview.

New showcase order: Audit -> Cost -> Templates -> SystemModel.

Narrative reads: "See what your agents actually did (Audit) ->
See and cap what they spent (Cost) -> Define the boundary for what
they can do (Templates) -> One admin surface for all of it (System)."

Rebalanced section tones so they still alternate cleanly:
FiveControls raised -> Audit default -> Cost raised -> Templates
default -> System raised.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Cut the "Keep the runtime. Keep the memory. Keep the work record."
triplet — it repeats without adding meaning. Replace with a tighter
two-sentence close that commits to the concrete security posture.

Headline changes from the abstract "The runtime stays yours." to the
action pair "Adopt AI. Keep control." — which directly answers the
"ban vs adopt" framing the AdoptionProblem section opened with.

Eyebrow moves from "Deploy on your terms" to "Your AWS · Your rules"
(pulled into copy.ts so FinalCTA.astro reads from one source).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@ericodom ericodom merged commit 7d44765 into main Apr 20, 2026
3 checks passed
@ericodom ericodom deleted the feat/www-governance-positioning branch April 21, 2026 22:14
ericodom added a commit that referenced this pull request May 5, 2026
* feat(www): reposition public site around governed AI adoption

Reframe apps/www from "AI infrastructure in your AWS" (architecture-first)
to "the control plane for governed AI adoption" (CTO-first). The same
five controls were already shipped in admin — they just weren't marketed.

New narrative arc:
- Hero + ProofStrip lead with governance, not self-hosting.
- AdoptionProblem frames the ban-or-adopt false choice.
- FiveControls enumerates the five governance pillars (replaces
  WhyThinkWork's three generic pillars).
- AgentTemplates / CostControl / Evals showcase each control with a
  caption-matched screenshot frame (styled SVG mockups now; real admin
  captures follow via apps/www/public/images/admin/CAPTURE.md).
- SystemModel, MemoryWedge, FinalCTA reframed to match the new voice;
  MemoryWedge moves after the control story as a durable benefit.
- All copy moves to a single apps/www/src/lib/copy.ts source so future
  edits don't drift across sections.

Meta + OG description updated. No new dependencies. No CTA changes
(docs/GitHub/login only). No new routes. No compliance badges (unearned).
Header nav anchors relock to the new section IDs.

Also includes the plan this implements:
docs/plans/2026-04-20-001-feat-www-governance-positioning-refresh-plan.md

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* feat(www): unify design system + ship real admin/mobile captures

One-hand design pass across the whole homepage. The legacy sections
(Hero, ProofStrip, SystemModel, MemoryWedge, MobileApp, QuickStart,
FinalCTA) and the new enterprise-positioning sections (AdoptionProblem,
FiveControls, AgentTemplates, CostControl, Evals) now share one visual
vocabulary.

Shared primitives:
- SectionShell — one section wrapper with default/raised/sunken tone
  and none/top/center/cascade glow presets
- SectionHeader — one eyebrow + H2 + lede lockup with optional step marker
- CapabilityShowcase — single partial used by AgentTemplates, CostControl,
  Evals so the three showcases can never drift
- ScreenshotFrame — window-chromed frame (3 dots + route label) used for
  every product shot on the page, with styled SVG fallback while
  `pending={true}`

Adjustments:
- Hero: tighten pill eyebrow, text-balance + text-pretty on headline and lede
- ProofStrip: cardless, dot-led list with top brand hairline (no more divider grid)
- AdoptionProblem: numbered cards match FiveControls rhythm
- FiveControls: card hover states, numeric "01" marker in top-right
- SystemModel: keep the "Control wraps the system" frame, restyle to match
- MemoryWedge: replace gradient cards with unified card vocabulary
- MobileApp: single padded stage for both phones, swap Tasks → Wiki
- QuickStart: terminal chrome aligned with ScreenshotFrame chrome
- FinalCTA: echo the hero pill eyebrow to close the loop

Real product screenshots added — 9 captures committed under
apps/www/public/images/ with CAPTURE.md inventory:
- admin: dashboard, agent-templates (capabilities list), cost-analytics,
  memories-graph (all-agents view), plus memories-graph-filtered
  and thread-detail held as reserve assets
- mobile: threads-list, wiki-graph (now paired with threads in MobileApp),
  wiki-list held as reserve asset

Evals still renders its SVG mock (no capture yet) — flip `pending={false}`
in Evals.astro when a real evals-run.png lands.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* fix(www): drop Evals placeholder section + realign mobile phones

Evals was the last section still rendering the SVG placeholder. Pull
the dedicated showcase from the homepage until a real /evaluations/$runId
capture lands. Evals still appears as pillar #5 in FiveControls and as
a proof point in ProofStrip — the narrative claim is preserved; only
the fake-screenshot section goes away.

While here:
- Strip the `pending` fallback + SVG variants from ScreenshotFrame.
  Every active screenshot on the page is now a real PNG; the component
  is a pure window-chrome wrapper.
- Remove the pending/variant props from CapabilityShowcase and callers.
- Realign the two phones in MobileApp: drop the decorative
  translate-y offsets, switch from flex items-end to grid items-start
  so both phones anchor to the same top and their labels sit on the
  same baseline.

CAPTURE.md documents how to re-add the Evals section once a real
screenshot is captured.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* feat(www): elevate capability showcases from bullets to feature grid

Drop the floating bullet list next to the screenshot. Each showcase now:
- Centers the eyebrow + headline + lede above the fold of the section
- Puts the product screenshot front and center at full section width
- Promotes each proof point to a numbered feature card in a 4-up grid
  below the screenshot — each card has a pill-style mono number, a
  strong title, and a supporting sentence

Copy migrated from flat `bullets: string[]` to `features: { title, desc }[]`
in lib/copy.ts for AgentTemplates and CostControl so the grid has real
titles to render.

Dropped the `figureFirst` prop — the new layout is top-to-bottom by
construction, so left/right ordering is irrelevant.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* feat(www): add Audit showcase between Templates and Cost

Work the thread-detail screenshot into the page as a dedicated Audit
section. The narrative arc through the governance block now reads:
  Templates  -> control what agents CAN do
  Audit      -> record what they DID
  Cost       -> measure what it COST

Audit uses the same elevated CapabilityShowcase pattern (centered
header -> full-width screenshot -> 4-up numbered feature grid).
Features: Step-by-step execution, Token + cost per turn, Status +
attribution, Ready for evals (bridges back to the evals pillar
without needing a dedicated evals screenshot).

Flipped CostControl tone back to default so the three showcases
alternate cleanly (default -> raised -> default).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* fix(www): act on reviewer feedback — must-fix copy + OG + dead code

Adversarial + CTO reviewers flagged overclaims, voice-guardrail
violations, and dead code. This commit addresses the must-fix list:

Overclaim corrections (schema vs copy):
- "Tool allow-lists" -> "Tool block-lists" (copy.ts). The schema is
  blocked_tools (deny-list); the previous framing promised a permit-
  by-default model the runtime doesn't enforce. Security sign-off can
  no longer rest on a false premise.
- "Automated gates on every template change" -> "Evaluation harness
  for every template" (proofStrip + controls items + evals lede).
  Nothing in packages/api gates a template write on eval results;
  "gate" was load-bearing language without an enforcing code path.
- "Pipe the raw cost event stream into your own FinOps system" ->
  "Cost events live in the Postgres you deployed" (costControl
  features[3]). No export surface ships; the FinOps-system framing
  implied a customer contract that doesn't exist.
- "Ready for a compliance review" -> "Inspectable per thread, per
  agent, per tenant" (audit lede). Violated the file's own "no
  unearned compliance" guardrail.

Voice-guardrail compliance (top-of-file rules finally enforced):
- FiveControls headline "The guardrails your adoption review already
  requires" -> "Governance primitives, not bolted-on guardrails"
- FiveControls lede "Every control a skeptical CTO expects" ->
  "Five first-class controls a governed rollout actually requires"
- CostControl headline "No surprise invoices from a runaway agent" ->
  "Cost attributed where it happens"
- CostControl features[2] "turns into a receivable" -> "compounds into a bill"
- SystemModel lede "explain to a board" -> "hold in your head"
  (restores the original, sharper phrasing)
- AdoptionProblem bullet "Not a pilot that can't scale" -> "One system
  at every scale. The runtime a developer spins up in five commands
  is the runtime production runs on." (drop "harness" jargon too)
- MobileApp "No pull-to-refresh dance" -> removed
- FinalCTA "The harness stays yours" -> "The runtime stays yours"
  (harness is insider jargon, never defined on the page)

Hero lede split:
- One 29-word comma pile -> two sentences. Easier for a hurried scan.

Evals as a sub-feature, not a placeholder section:
- Strengthened Audit features[3] ("Evals run on the same trace") to
  carry the AgentCore + custom-assertion story in one card. The
  evals export in copy.ts is kept for when a real /evaluations/$runId
  capture arrives and the dedicated showcase can be re-added
  (instructions in CAPTURE.md).

Dead code + orphan asset cleanup:
- Moved unused reserve captures out of public/ into apps/www/assets/
  so they stay versioned but stop shipping: memories-graph-filtered.png,
  mobile/wiki-list.png, mobile/tasks-list.png.
- Updated CAPTURE.md: removed references to the long-deleted `pending`
  prop and SVG fallbacks; documented how to re-add the Evals showcase.

OG image:
- Replaced the stale og-image.png (pre-positioning) with a fresh
  1200x630 export matching the new hero. Rendered via Chrome headless
  from scripts/og-source.html (kept in-tree so the asset is
  regeneratable).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* fix(www): reorder showcases so Audit leads, Templates lands last

The Templates screenshot is the Capabilities/Skills list, which is
the weakest visual of the four product shots. Leading with it killed
momentum right after the five-controls overview.

New showcase order: Audit -> Cost -> Templates -> SystemModel.

Narrative reads: "See what your agents actually did (Audit) ->
See and cap what they spent (Cost) -> Define the boundary for what
they can do (Templates) -> One admin surface for all of it (System)."

Rebalanced section tones so they still alternate cleanly:
FiveControls raised -> Audit default -> Cost raised -> Templates
default -> System raised.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* fix(www): sharpen the FinalCTA close

Cut the "Keep the runtime. Keep the memory. Keep the work record."
triplet — it repeats without adding meaning. Replace with a tighter
two-sentence close that commits to the concrete security posture.

Headline changes from the abstract "The runtime stays yours." to the
action pair "Adopt AI. Keep control." — which directly answers the
"ban vs adopt" framing the AdoptionProblem section opened with.

Eyebrow moves from "Deploy on your terms" to "Your AWS · Your rules"
(pulled into copy.ts so FinalCTA.astro reads from one source).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
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