Sphere Partners
← Dev Skills

Sphere Design

Design-system guardrail — tokens, reusable components, page recipes, conversion funnel, and no-hallucination content rules for Sphere Partners web.

v1.3.1schema v3betaproject: Sphere Partnersgenerated: 2026-05-23from sha: 9630b6e
manifest.jsonfull design system (cached 1h)version.jsontiny version blob (cached 5m)changelog.mdraw markdown changelog

Online sync

On every session start that activates this skill, fetch version.json. If remote.version > local.version, fetch full manifest.json and changelog.md, surface the diff to the user, and replace local manifest on user OK. Cache-Control: short (5min) on version.json, long (immutable per version) on /v/<version>/manifest.json.

Offline: If version_check_endpoint is unreachable (no network, dev wifi down), continue with local manifest and warn 'sphere-design: offline — using cached vX.Y.Z'.

Color tokens

brand blue
#1677ff

primary brand color — CTAs, link emphasis, accent strokes, primary buttons

brand blue hover
#2893ff

hover state for brand-blue surfaces (matches header CTA)

brand blue soft
#eaf2ff

soft background band for tiles-on-band pattern, light-themed Differentiators sections

brand cyan
#16e3ff

secondary brand accent; Differentiators dark-tile border default

purple accent
#7d6ff7

SERVICES_NAV accent for AI/engineering tiles only

lavender accent
#7f71fb

advisory/talent service accents

dark
#1f2025

headings on light bg, default dark text, dark surface band background

white
#ffffff
off white
#f4f6fb

alternate page background for sections that want subtle separation

slate 400
#94A3B8

subtitle/muted text on dark surfaces

slate 500
#64748B

secondary text on dark surfaces

blue light 300
#93C5FD

lighter-blue italic accent on dark surfaces only (CEO quote, hero highlight on dark video bg)

Forbidden colors

  • #3B82F6Tailwind blue-500 — close to brand but NOT brand; substitute #1677ff
  • #185FA5navy-ish mockup blue — substitute brand_blue or brand_blue_hover
  • #0A1628navy mockup token — substitute `dark` (#1f2025) or use video-bg pattern
  • #7ab3ffad-hoc lighter blue used in one session — substitute blue_light_300 (#93C5FD)
  • #FF0000YouTube red — never substitute brand video buttons with raw red

Font tokens

sans
DM Sans
--font-dm-sans

everything except italic accents

serif
Lora
--font-lora

italic-only accents for highlight text in headings, CEO pull-quotes, italic emphasis

_mono_note

Forbidden: Playfair Display · DM Serif Display · Inter · Roboto · Open Sans

Conversion funnel

Every Sphere page follows a 7-step trajectory: Hook → Trust → Value → Proof → Process → Social → Conversion. Skip steps at your peril — readers fall out at each gap.

  1. 1Hook

    value prop in <12 words + primary CTA

    components: SolutionHero, ServiceHero, IndustryHero, SphereIQHero, SphereHero

    headline that describes WHO YOU ARE instead of WHAT THE READER GETS

  2. 2Trust

    social proof via real client logos

    components: TrustedBy

    no logo strip, OR generic stock imagery instead of real clients

  3. 3Value

    3-6 concrete value propositions

    components: ValueProposition, Differentiators, BenefitsList, WhatWeDeliver

    9+ value props in one grid (decision paralysis); features instead of benefits

  4. 4Proof

    real outcomes with real numbers and named clients

    components: CaseStudiesGrid, ScrollCases, ImpactMetrics, NumbersSection

    stock-photo case studies; vanity metrics with no context; 'enterprise client' instead of named brand

  5. 5Process

    how engagement works — removes fear-of-unknown

    components: ProcessSteps, StepsTimeline

    skipping this — readers stall when they don't know what happens after they click CTA

  6. 6Social

    named-person testimonials with role + company

    components: TestimonialsCarousel, VideoTestimonials

    first-name-only quotes; no company; no role; star ratings without source

  7. 7Conversion

    single low-friction CTA matching hero CTA

    components: ContactForm, HubspotForm, GetStartedBanner

    multiple competing CTAs; long form fields above ask; CTA href that doesn't match hero

Scannability

A Sphere page must be readable as a scrolled outline of headings + bolded key phrases + scannable tiles. A user who reads NOTHING but the H1, H2s, and tile titles must still understand the value prop and know how to convert.

  • Hero primary CTA + final CTA must agree (same destination — usually #contact-form). Never split user attention.
  • No competing CTAs within 1 viewport. Pick one primary action per scroll-screen.
  • Heading hierarchy must scan: 1 H1, 5-8 H2s, H3s only inside complex sections.
  • Every section must answer 'what does this give me?' in its H2.
  • If a page has no clear next step at the bottom, it's broken — add GetStartedBanner.
  • Tile/card grids: titles must be 2-6 words. If your tiles need 10-word titles, the tiles are wrong — use a list with sub-headings instead.
  • Body paragraphs: max 4 lines on desktop. If you need more, split into a list or sub-section.
  • Bold the noun-phrase that converts. One bold phrase per paragraph max.
  • Trust signals (TrustedBy, NumbersSection, Testimonials) should appear within first 2 scrolls — not buried at the bottom.

Component catalog

Top reusables grouped by role. Each entry documents adoption, suitable content, content-fit limits, and overflow strategy. Never stretch a component past its limits — pick a different component instead.

top used

Reveal

142 uses

role: animation wrapper

suitable for: any block that benefits from fade-in-up on scroll

scope: wrapper

overflow: don't wrap every paragraph — reserve for section-level reveal

ContactForm

138 uses

role: contact-form section

suitable for: default site contact band; renders with #contact-form anchor

scope: one per page

overflow: use HubspotForm directly for page-specific marketing routing

CtaBanner

120 uses

role: mid-page CTA strip

suitable for: secondary CTA placement between sections

scope: max 1 mid-page

overflow: if you need >1 mid-page CTA, the page is too long — split into 2 pages

TrustedBy

82 uses

role: client-logo marquee

suitable for: social proof via real client logos; appears 1× per page typically right after hero

logos_min: 8logos_max: 20ideal: 11

overflow: marquee scales to N logos — but >20 looks bloated; if you have more, switch to grid or categorize

NumbersSection

76 uses

role: canonical stats strip

suitable for: site-canonical stats only (21yr / 600+ / 28 / 300+)

stats_min: 4stats_max: 4ideal: 4

overflow: DO NOT statsOverride past 4 — use ImpactMetrics or Differentiators metric-tile pattern for 5-9 stats

FAQAccordion

76 uses

role: FAQ section

suitable for: Q&A patterns where each answer is 1-4 sentences

items_min: 4items_max: 12ideal: 8

overflow: if >12 FAQs, split into thematic groups OR move to a dedicated /faq page with category filter

GetStartedBanner

65 uses

role: end-of-page CTA strip

suitable for: final CTA before footer

scope: one per page, at the end

overflow: always last conversion section; never duplicate

TestimonialsCarousel

63 uses

role: infinite-loop testimonial carousel

suitable for: client testimonials WITH photos; single-quote-per-slide social proof

items_min: 3items_max: 9ideal: 5requires: photo per item

overflow: if >9 items, split into Featured (Differentiators with quote+author tile) + Written list (inline cards). If items have NO photo, use Differentiators or inline cards — NOT this component

WhatWeDeliver

61 uses

role: service-page deliverables grid

suitable for: list of concrete deliverables for a service engagement

items_min: 3items_max: 8ideal: 6

overflow: if >8 deliverables, you're probably describing multiple services — split the page

LatestInsights

59 uses

role: blog-teaser grid

suitable for: 3-card grid of latest blog posts (auto-pulled or override)

cards: 3

overflow: only ever 3 cards in this block — link to /blogs for more

heroes

SolutionHero

38 uses

role: CANONICAL hero

suitable for: default hero for solutions / services / accelerators / generic landings

headline_words: 4-10subtitle_chars: 80-200ctas: 1-2

overflow: if you need 3+ CTAs, you don't have a clear primary — pick one. If subtitle > 200 chars, move detail below fold

ServiceHero

30 uses

role: alternate hero — older service-page pattern

suitable for: migrated WP service pages; new pages should prefer SolutionHero

metrics: 0-4tiles: 0-3

overflow: supports rich right-column (metrics OR tiles OR rightLogo OR rightImage — mutually exclusive)

SphereIQHero

5 uses

role: SphereIQ-specific hero

suitable for: ONLY SphereIQ / AI / GenAI landings

tiles: 0-4

overflow: don't use on non-SphereIQ pages — visually mismatches site palette

SphereHero

4 uses

role: homepage hero

suitable for: homepage only

overflow: do not reuse elsewhere

IndustryHero

3 uses

role: industry/about/testimonials hero (post 2026-05-22 rebuild)

suitable for: industries/* AND /about-us AND /about-us/software-development-reviews

headline_words: 4-10subtitle_chars: 80-200ctas: 0-1

overflow: supports ONE CTA — if you need 2, use SolutionHero

props: backgroundVideoUrlcompactHeightinlineHeadingvariant: overlay|split

EventHero

1 uses

role: events-page hero

suitable for: events/* only

overflow: do not reuse outside events

grids

Differentiators

7 uses

role: icon+title+description tile grid

suitable for: value props / principles / highlights / outcome tiles

tiles_min: 3tiles_max: 6ideal: 6grid_options: 2-3title_words: 2-6description_chars: 80-220

overflow: for 7-9 items, split into 2 Differentiators blocks (3+3 or 3+6). For 10+, use WhatWeDeliver list or split across pages

ServicesGrid

4 uses

role: services index grid

suitable for: directory pages listing service offerings

cards_min: 6cards_max: 12ideal: 8

overflow: for >12, paginate or categorize

CaseStudiesGrid

26 uses

role: case studies grid

suitable for: filtered set of case studies (industry, service)

cards_min: 3cards_max: 9ideal: 6

overflow: for >9, use PortfolioBrowser with filters

IndustriesGrid

5 uses

role: industries index grid

cards: 8-16ideal: 12

TilesGrid

2 uses

role: generic content tile grid

tiles: 3-9

TilesCarousel

5 uses

role: horizontal-scroll tile carousel

suitable for: 5+ items where you want browse not all-at-once

tiles_min: 4tiles_max: 20ideal: 8

process

ProcessSteps

36 uses

role: numbered process steps (horizontal)

suitable for: 4-6 step engagement / workflow flows

steps_min: 3steps_max: 6ideal: 4

overflow: for 7+ steps, use StepsTimeline (vertical) — horizontal breaks visually past 6

StepsTimeline

role: vertical timeline

suitable for: 7+ step sequences, project lifecycles

steps_min: 5steps_max: 12ideal: 8

WorkflowStepsSection

1 uses

role: specific workflow steps for one use case

overflow: single-page usage — prefer ProcessSteps for reuse

proof metrics

ImpactMetrics

4 uses

role: outcome metric tiles (5-9 stats)

suitable for: 5-9 outcome stats that DON'T fit NumbersSection's 4-stat layout

metrics_min: 4metrics_max: 9ideal: 6

overflow: for stats >9, you're showing too much — pick the 6 strongest

IntroMetricsSection

2 uses

role: intro stats below hero

metrics: 3-4

forms cta

HubspotForm

36 uses

role: embedded HubSpot form

suitable for: page-specific marketing forms (different portalId/formId routing per page)

scope: one per CTA section

CtaQuote

4 uses

role: fixed CTA quote block (no props)

suitable for: specific marketing CTA — already content-locked

InlineCta

role: inline link-style CTA

suitable for: mid-paragraph CTAs in long-form content

video

VideoTestimonials

2 uses

role: YouTube-facade video testimonial grid

suitable for: client video testimonials with captions

videos_min: 3videos_max: 9ideal: 6requires: YouTube videoId per video

overflow: supports multi-row layouts (featured-with-list, split-with-list, grid) — match to count: 3 → single grid row, 6 → grid 3×2, 9+ → multi-row mix

VideoCta

role: video CTA section

suitable for: one focal video with adjacent CTA

meta blocks

Revealwrap any content for fade-in-up. Use sparingly — don't wrap every paragraph.
TableOfContentsauto-generated TOC for long content pages.
Breadcrumbsauto-rendered breadcrumb trail.
Linkwrapper around next/link with site conventions.
SafeImagefilters sphere.local URLs to null; use anywhere CMS data might leak dev hostnames.

_additional: 120+ more reusables exist (TwoColumns, UseCases, WhatWeDoTabs, RoiCalculator, EuAiActRiskGauge, ManagedServicesSection, ModernizeStacks, NumberedBenefitsSplit, OutcomeGoals, PodPackages, StrategySection, TechPartners, TechStackTable, ValueProposition, WebinarLeadSection, WhatWeDeliver, WhitepaperDownloadSection, ...). Before inlining anything, grep `src/components/` for matching shapes. Long-tail content-fit docs land in v1.2.

Page recipes

Canonical section compositions per page type. Each section in the order maps to a funnel step (see funnel_mapping).

service_landing

any /services/<slug> page
123354677
  1. SolutionHero (or ServiceHero for migrated WP pages)
  2. TrustedBy
  3. ValueProposition or Differentiators (3-6 tiles)
  4. ServicesGrid or WhatWeDeliver
  5. ProcessSteps
  6. CaseStudiesGrid (filter by service)
  7. TestimonialsCarousel
  8. FAQAccordion
  9. ContactForm
  10. GetStartedBanner

about

/about-us and variants
12333435677
  1. IndustryHero (theme=dark, compactHeight, backgroundVideoUrl=sphere-events.mp4) OR SolutionHero
  2. TrustedBy
  3. Mission narrative (inline 2-col: 'Our Mission' eyebrow + H2 with Lora accent + body paragraphs)
  4. Differentiators (3 mission-pillar tiles, soft-blue band)
  5. Differentiators (6 trust-highlight tiles, white band)
  6. NumbersSection variant='sphere'
  7. Differentiators (6 principles, COMPANY_VALUES, soft-blue band)
  8. ProcessSteps (engagement model)
  9. CEO quote band (inline blockquote on #1f2025, Lora italic)
  10. ContactForm
  11. GetStartedBanner

audit: v1.0 currently has 3 stacked Differentiators blocks (mission pillars + highlights + principles) — visually monotonous. v1.2 candidate: collapse highlights+principles into single 6-tile block, lift mission pillars into ValueProposition variant.

testimonials

/about-us/software-development-reviews
126667
  1. IndustryHero (theme=dark, compactHeight, inlineHeading, video bg) OR SolutionHero
  2. TrustedBy (heading='Clients include')
  3. Differentiators (4 featured outcomes, 2-col, soft-blue band) — quote-as-description with bold attribution
  4. VideoTestimonials (single grid row, 6 videos)
  5. Written reviews section (inline cards: Lora italic body, brand-blue accent border, eaf2ff/50 surface)
  6. Page-specific HubSpot CTA section with id='contact-form' (NOT global ContactForm — preserves marketing routing)

audit: Featured outcomes Differentiators currently uses long quote-as-description — tile titles are scannable but description text overflows the visual-density target. Candidate: shorter outcome summaries in tiles, full quotes only in the inline list below.

industry_page

/industries/<slug>
123456377
  1. IndustryHero (overlay or split variant, optional backgroundVideoUrl)
  2. TrustedBy theme='light'
  3. WhatWeDeliver or Differentiators
  4. CaseStudiesGrid (filter by industry)
  5. ProcessSteps
  6. TestimonialsCarousel
  7. FAQAccordion
  8. ContactForm
  9. GetStartedBanner

solution_landing

/solution/<slug> + /accelerators/<slug>
12334546377
  1. SolutionHero
  2. TrustedBy
  3. ValueProposition
  4. Differentiators or BenefitsList
  5. UseCases or ScrollCases
  6. ProcessSteps
  7. CaseStudiesGrid
  8. TestimonialsCarousel
  9. FAQAccordion
  10. ContactForm
  11. GetStartedBanner

blog_post

/blogs/<slug>
1367
  1. Article hero (slug-aware H1 + meta)
  2. TableOfContents
  3. Article body (RichText)
  4. Author byline
  5. RelatedCaseStudies or BlogPostsGrid (3 related)
  6. GetStartedBanner

Reality-check pass

Every section choice is reality-checked against (a) content fit, (b) scannability, (c) funnel role. If the content exceeds the component's design intent, the answer is a DIFFERENT component, not stretching the current one.

  • content-fitfor each section, count the items/words/chars in your content; cross-check against the component's content_limits; if you're over the ideal, list 2 alternative components that fit better and recommend the best.
  • scannabilityafter composing the page, list the H1 + all H2s + all tile titles. If that outline reads as gibberish or a non-sequitur, the page fails — redesign before shipping.
  • funnel-completenessmap every section to a funnel step (1-7). Steps missing from your page are bounce risks — confirm with user before omitting.
  • duplicate-purposeif two consecutive sections serve the same funnel step (e.g. two 'value' grids back-to-back), one is redundant — collapse.
  • CTA-coherencehero CTA destination MUST match final CTA destination. Mid-page CTAs (CtaBanner) MUST match too. Inconsistent CTAs split user intent.

Changelog

# sphere-design — changelog

## 1.3.1 — 2026-05-23

**Adds 5 more tripwires lifted from the same /platforms/acumatica session that shipped v1.3.0.** Twice in that session I shipped violations of rules I had JUST added to the manifest — `lora-highlight-no-stranded-article` on the 'An / alternate assessment' H2 (rule existed, ship still violated it), and `case-studies-default-scrollcases` on the ScrollCases call where I passed industry-icon PNGs as the per-story image (rule said "pass real case-study heroes, not industry icons"; I passed industry icons). The skill works only if rules are re-audited against the just-written code, not just dropped in the manifest. Hence the new meta-tripwire.

- **`re-audit-after-new-rule-shipped`** — META: when a new tripwire is added mid-session, the last ~100 lines of code/copy I wrote must be re-audited against the new rule BEFORE declaring done. Adding a rule + shipping a violation of it in the same session = the rule was theatre, not enforcement.
- **`whatwedeliver-blue-band-both-white`** — extends `dark-text-on-blue-default`. On default-blue `<WhatWeDeliver>`, pass `headingHighlightColor="#ffffff"`. The default highlight is brand-blue `#1677ff` — on a brand-blue band the italic accent is INVISIBLE. Both halves of the double-font heading must be explicitly white on blue.
- **`hero-tiles-frosted-glass`** — `SolutionHero` `tiles` render as frosted glass over the hero image. Canonical class set: `border border-white/10 bg-white/5 backdrop-blur-3xl shadow-2xl`. NOT `bg-black/40 backdrop-blur-md` (dark card, weak blur, no glass feel). Andrii flagged 'much stronger' twice — `3xl` = 64px is the canonical strength. Enforced at the SolutionHero component level since this release.
- **`case-studies-real-hero-via-payload-api`** — extends `case-studies-default-scrollcases`. ScrollCases `image` per story MUST come from each case study's actual `heroImage.url` in the Payload `case_studies` collection. Fetch with `curl 'http://localhost:3001/api/case-studies?where%5Bslug%5D%5Bequals%5D=<slug>&depth=2&limit=1'`. NEVER use industry-icon PNGs or guess the image filename from the slug.
- **`form-id-override-needs-explicit-ask`** — extends `contact-form-canonical`. Do NOT override `hubspotPortalId` / `hubspotFormId` on `<ContactForm>` unless the user EXPLICITLY asked. The component defaults (`5257433` / `26e96821-…`, the inline-HTML generic Sphere contact form) are the right CRM destination for most pages. Lifting per-page form IDs from WP migration is the wrong default.

**Schema bump:** none (additive — `nonsense_check.tripwires` array extended by 5 entries).

## 1.3.0 — 2026-05-23

**Adds 7 execution tripwires** lifted from the /platforms/acumatica rebuild session. Every rule traces to a specific repeat-failure Andrii flagged that day; each one is now a first-class entry in `nonsense_check.tripwires` so the next agent (or me, next session) catches them before shipping.

- **`hero-must-show-clients`** — first viewport must surface BOTH the hero message and client logos. Default pattern: `SolutionHero` with `compact: true` + `tiles` (3-4 credibility chips) immediately followed by `<TrustedBy/>`. A tall full-bleed SolutionHero with no logos visible above the first scroll = bounce risk.
- **`contrast-check`** — audit every (text color × surface color) pair before shipping. Specifically watch white-text components (e.g. `ValueProposition` default `text-white` headingPrefix) on light backgrounds: the heading goes invisible. Re-check after every `backgroundColor` override on a reusable component.
- **`no-png-icons-as-background`** — `WhatWeDeliver` with `image` renders the image as a FULL-BLEED tile background with a darkening gradient overlay. Built for photographic case-card imagery, NOT for icon PNGs. For icon tiles use `Differentiators` with `icon` as a design-system key.
- **`dark-text-on-blue-default`** — `WhatWeDeliver` defaults to `bg-blue-600`. Passing `textColor: '#1f2025'` (dark) without overriding `backgroundColor` produces black-on-blue heading. Correct pattern: no `textColor`, white double-font heading via `headingStart` + `headingHighlight` (Lora italic).
- **`case-studies-default-scrollcases`** — `ScrollCases` (May 2026) is the canonical case-studies component for new pages — categories filter, per-story imagery. `CaseStudiesGrid` is the legacy migrated-WP block; only use when preserving an exact 1:1 WP port.
- **`lora-highlight-no-stranded-article`** — Lora italic highlight must be a meaningful 2+ word phrase. Never leave articles ('An', 'The'), prepositions ('Of', 'With'), or conjunctions ('And') OUTSIDE the italic span. Either include them in the italic or restructure.
- **`contact-form-canonical`** — the reusable `<ContactForm>` component is the default site contact band. Custom inline HubSpot sections are forbidden as the page's main conversion unless the user explicitly asks for a one-off. ContactForm supports `sectionId` + `hubspotPortalId` + `hubspotFormId` overrides — keep the canonical design, change only what's needed.

**Schema bump:** none (additive — `nonsense_check.tripwires` array extended by 7 entries; everything else unchanged).

## 1.2.0 — 2026-05-22

**Adds:**

- **Nonsense-check pass.** New top-level `nonsense_check` with 14 tripwires that fire on copy that reads fine but says nothing — meaningless filler, unsourced stats, canonical-drift numbers, title/content mismatch, broken promises, audience-mismatched jargon, duplicate ideas, unsupported superlatives, vague verbs ("help / leverage / enable / empower / utilize"), undefined acronyms, headlines that talk about us instead of the reader, filler sentences, dead CTAs, trademark misuse. Runs after content provenance, before final preflight.
- **Typography best practices.** New top-level `typography_best_practices`: full weight hierarchy (300/400/500/600/700/900 with roles), line-heights per use, letter-spacing per scale, max line widths (12-20ch for H1, 65ch for body, 6 words for tile titles), responsive scale ratios, italic Lora rules ("one accent per heading, value-noun only"), 8 anti-patterns.
- **Font tokens with full install spec.** Each font now documents weights_used, styles_used, source URL, Next.js install snippet, HTML-mockup install snippet (Google Fonts `<link>` for offline drafts). DM Sans: weights 300/400/500/700/900. Lora: 400/600/700 with italic style (italic 600 + 700 are the only ones actually used in headings).
- **Geist Mono removed.** Not used anywhere in user-facing Sphere surfaces. Loaded in layout but unused; manifest now declares the design system as DM Sans + Lora only.
- **Preflight expanded.** Adds nonsense-check pass + typography spot-check (one Lora accent per heading, body ≥ 16px, bolded phrase ≤ 3 words).

**Schema bump:** `meta.schema_version` 2 → 3 (added `typography_best_practices`, `nonsense_check` top-level keys; expanded `tokens.fonts` with weights/styles/install fields; dropped `tokens.fonts.mono`).

## 1.1.0 — 2026-05-22

**Adds:**

- **Online manifest sync.** Manifest now hosted at `https://www.sphereinc.com/dev/skills/sphere-design/`. Every session activation checks `version.json`; if newer, fetches updated manifest + surfaces changelog before consumers continue. Falls back to cached manifest on network failure.
- **Per-component content-fit limits.** Each component in the catalog now documents `suitable_for`, `content_limits` (min/max/ideal item counts, character bounds, requires), and `overflow_strategy` (which alternative component to pick when content exceeds intent). Components stretched past their limits are forbidden; the skill recommends a better-fit alternative instead.
- **Scannability section.** Page-level rules ensuring H1 + H2s + tile titles read as a scannable outline. Includes F-pattern guidance, max paragraph length, single bold per paragraph, trust-signal placement.
- **7-step conversion funnel.** Every page maps to Hook → Trust → Value → Proof → Process → Social → Conversion. Section recipes now annotated with `funnel_mapping`. Missing steps surfaced as bounce risks.
- **Reality-check pass.** Five whole-page checks before JSX: content-fit, scannability, funnel-completeness, duplicate-purpose, CTA-coherence.
- **More component coverage.** Added `_proof_metrics`, `_video`, `_meta_blocks` groupings. Documented ImpactMetrics, IntroMetricsSection, VideoTestimonials, VideoCta, StepsTimeline content-fit.
- **`reality_check` top-level key.** Codifies the five checks and the principle "stretching a component past its design intent = pick a different component".
- **`scannability_audit`** notes on existing recipes (`about` and `testimonials`) — flags known visual-density issues from the 2026-05-22 rebuild as v1.2 candidates.

**Schema bump:** `meta.schema_version` 1 → 2 (added `online`, `scannability`, `conversion_funnel`, `reality_check` top-level keys; added per-component `suitable_for` / `content_limits` / `overflow_strategy`).

**Distribution change:** primary distribution flips from "manual cp -R" to "online sync from canonical URL". The Sphere Partners site is the source of truth for the manifest, version blob, and changelog.

## 1.0.0 — 2026-05-22

Initial release. Baked from `SphereSoftware/SPW` @ `6c09a68`.

**Scope:**

- Frozen token palette (brand-blue `#1677ff`, brand-cyan `#16e3ff`, dark `#1f2025`, brand-blue-soft `#eaf2ff`, slate scale).
- Frozen font stack (DM Sans / Lora / Geist Mono via `next/font`).
- Forbidden-color list (`#3B82F6`, `#185FA5`, `#0A1628`, `#7ab3ff` — common drift to brand-blue).
- Forbidden-font list (Playfair Display, DM Serif Display, Inter — common drift to Lora).
- Top-30 component catalog with adoption counts + role + use.
- Five canonical page recipes (`service_landing`, `about`, `testimonials`, `industry_page`, `solution_landing`, `blog_post`).
- `SPHERE_NUMBERS_STATS` canonical facts + observed mockup-extras with usage rule.
- Content rules (preserve verbatim, no invented quotes, monday voice, changelog required before push).
- Preflight checklist (tsc → curl-verify → restart-warning for `src/data/*` → consumer-audit for shared components).