# Spectrea Brand Guide

> The complete brand system for Spectrea — a composable intelligence platform that turns scattered information into compounding intelligence.

![Spectrea gradient lockup](/brand-assets/logo-lockup-gradient.svg)

**Tagline:** We connect the dots.
**Category:** Composable intelligence platform.
**Pronunciation:** /spek-TREE-uh/ (a coinage from *spectrum* — Latin, from *specere*, "to look"; the full range — with a second reading: *revealing*).
<!-- generated:version-header -->
**Version:** 2.15.0 (2026-08-18). Canonical data: `src/data/brand.ts` — this guide is a hybrid mirror: prose is hand-written; fenced data blocks are generated from canon (`npm run generate:guide`).
**Canonical copy:** https://branding.spectrea.com/brand-guide.md. Reading a vendored snapshot? It is stale when https://branding.spectrea.com/brand-contract.json reports a higher `version` — re-vendor the whole set rather than editing this file. Machine formats and the vendoring rules: https://branding.spectrea.com/llms.txt.
<!-- /generated:version-header -->

**Strategic claim:** Spectrea is the spectrum of clarity. Everything you know, in one living view — alive with possibility, yours to keep. See it whole. Trust what you see. Build on what you find.

---

## 1. Brand Foundation

### Why we exist
We live in an information age that's paradoxically making us less informed — more data, less truth; more tools, fewer insights; more noise, less action. Spectrea exists to close the gap between having information, truly understanding it, and being able to build on it.

### Mission
To make knowledge trustworthy, connected, and actionable — empowering people to build on what came before, so that every insight becomes the foundation for what comes next.

### Vision
A world where anyone can see the full spectrum of what's known, trust what they see, and build on it — where understanding compounds across every boundary that used to contain it.

### Positioning
- **For:** Anyone who works with knowledge.
- **Category:** Composable intelligence platform.
- **Promise:** Turns scattered information into compounding intelligence.
- **Tactical:** For anyone who works with knowledge, Spectrea is the composable intelligence platform that turns scattered information into compounding intelligence — unlike fragmented point solutions that silo your knowledge and hide their reasoning.

### Messaging hierarchy
Primary theme is **Connection** — the headline "We connect the dots" and the idea that scattered knowledge becomes one living view. Three supporting themes:
1. **Trustworthy Intelligence** — "Intelligence you can trust." Everything you see is transparent; every action is reviewable.
2. **Compounding Intelligence** — "It gets smarter with every interaction." Your second year is sharper than your first — more context retained, more decisions traceable, more outcomes feeding the next cycle. *Guardrail:* use "compounding intelligence" only with its defensible mechanism named — provenance, per-viewer access, and the closed loop that feeds outcomes back in. The phrase is contested in-market (noted 2026-07-03); the mechanism, not the slogan, carries the claim.
3. **Composability** — "Build exactly what you need." Simple, combinable parts assembled into any solution.

### Archetypes — three facets, one motion
Spectrea is **one character**, not three. The traditional archetypes — Magician, Sage, Creator — operate as inseparable facets of a single gesture: **reveal → ground → equip**. Every brand moment (marketing hero, error screen, editor interaction) carries all three; the emphasis shifts with context, the character doesn't.

| Facet | Movement | What it does |
|---|---|---|
| **Reveal** (Magician) | Brings the hidden pattern into view | The moment of seeing what was always there but never noticed — the insight surfacing, the connection clicking. Without reveal, copy is flat; nothing feels discovered. |
| **Ground** (Sage) | Shows the evidence | The calm of being able to see exactly how something is true — sources, confidence, traceable logic. Without ground, reveal is hype. |
| **Equip** (Creator) | Hands you the tools | Gives the user agency, stays out of the way. The joy of making something that's yours. Without equip, the brand informs but never empowers. |

**Rule of three.** If any of the three is missing, the copy doesn't sound like Spectrea. Reveal-without-ground is hype. Ground-without-equip is stuffy. Equip-without-reveal is tools without a reason.

The through-line is already encoded in the brand:
- **Tagline** — *We connect the dots* = see them (reveal) · trust them (ground) · build on them (equip).
- **Strategic claim** — *"See it whole. Trust what you see. Build on what you find."* (literally reveal → ground → equip).
- **Voice formula** (§2) — its texture carries the triad: *plain words, real specifics* = ground; *checkable* = equip; *room to breathe* is the attention discipline that keeps the reveal legible. The reveal movement itself lives in the hero-open gesture (§2).

### Personality (four traits with guardrails)
- **Warm** — respects the person behind every interaction. *Guardrail: not soft — trust users to be capable.*
- **Perceptive** — sees patterns others miss; surfaces connections, then steps back. *Guardrail: not presumptuous — suggests, never dictates.*
- **Grounded** — powerful but never pretentious; substance over style. *Guardrail: not boring — substance needs spark.*
- **Adaptive** — meets you where you are; same system, different depths. *Guardrail: not shapeless — Spectrea has a point of view.*

The brand's *consistency and discipline* — fixed primitives, fixed palette, fixed motion language — is enforced structurally by the system rules in the sections below, not claimed as a personality trait.

### Emotional core
**Empowerment + Clarity.** Feeling more capable because Spectrea helped you see clearly and choose wisely. Like putting on glasses — everything that was blurry snaps into focus.

### Visual metaphor
**Prism + Living Network — explicitly co-primary (ratified 2026-08-06).** Two metaphors with distinct roles; neither is secondary. The **Prism** carries identity and reveal — raw information enters, organised insight exits; hidden structure made visible (the etymology echo: the name comes from it). The **Living Network** carries product and growth — a web of connections that grows denser and more intelligent with every interaction (the promise: it grows with you). When a surface needs a single lead, role decides: identity/reveal surfaces lead with the Prism, product/growth surfaces lead with the Living Network.

### Aesthetic direction
**Warm + Intelligent.** Like a brilliant mentor — approachable yet deep. Rich colours, inviting spacing, feels human. References: Stripe, Linear (clarity through restraint). Tradeoff: **power over polish** — capability is sacred; elegance is valued but never at the cost of depth.

### Values
1. **Human-First** — Spectrea serves people, not the other way around. AI assists understanding; it never replaces judgment. Your data is sovereign: full-fidelity export — structure, data, and provenance — with no lock-in. You can always leave with everything.
2. **Trustworthy Intelligence** — everything you see is transparent; every action is reviewable; every connection can be followed back. Truth is per-viewer: what you see is synthesized from exactly the claims you can access — coexisting perspectives stay attributed, and nothing leaks from views you can't see.
3. **Compounding Intelligence** — the more you use it, the more it gives back.
4. **Composable by Nature** — build solutions that fit your world; don't reshape your world to fit a tool.
5. **Accessible Power** — deep capability that meets you where you are. The floor is high, and the ceiling rises with you.

### Anti-values (what Spectrea never does)
- Never replaces human judgment.
- Never leaves anyone behind.
- Never complex or bloated — if it needs a consultant, we failed.
- Never a black box — you can always ask "why?" and get an answer.

### Audiences
Five personas — the solo tier is first-class, not a trial. Mirrored from `brand.audiences`:

| Persona | Who | Need | Message |
|---|---|---|---|
| **Solo Knowledge Workers** | Independent researchers, writers, consultants, students — anyone building a personal knowledge practice | A system that compounds from day one, alone — free and full-featured, no team required. | *"Start free, alone, with the full system. Your knowledge starts compounding with the first document — and when you're ready, invite a few collaborators without switching tools."* |
| **Business Leaders** | CEOs, COOs, Managing Directors | Strategic clarity. See what the organization actually knows — and what it's missing. | *"In a world drowning in data, Spectrea surfaces the intelligence that matters — connected, verified, and compounding with every interaction."* |
| **Knowledge Workers** | Analysts, researchers, consultants | Find trusted connections across sources. Build on what exists instead of reinventing. | *"Stop hunting through 12 tools for information you can't verify. Spectrea connects your knowledge into one living, trustworthy graph."* |
| **Technology Leaders** | CTOs, IT Directors, architects | A composable, inspectable, extensible knowledge substrate. | *"Composable. Transparent. Built on primitives, not opinions. A platform that earns the trust of an engineering culture that asks 'why' before adopting anything."* |
| **Growing Teams** | Startup founders, team leads | Preserve institutional knowledge. Turn tribal knowledge into collective intelligence. | *"Every conversation, every document, every decision — captured in a graph that compounds. When someone leaves, their insights stay."* |

**Breadth:** The individual tier is first-class, not a trial — free is full-featured, and value arrives before payment. Paying is about scale, never a crippled core. (The packaging mechanics behind that promise are internal-tier; see `internalCanon`.)

### Differentiators
Anchored to the moat: per-viewer truth, graph-resident decisions with provenance, outcomes feeding the next cycle, one substrate from solo to institution.

| Spectrea | Traditional tools |
|---|---|
| Per-viewer truth — coexisting, attributed perspectives; each viewer sees a synthesis of exactly what they can access | One forced record — or per-user silos that never combine |
| Decisions live in the graph — choices, doctrines, and commitments carry provenance and stay queryable | Decisions evaporate into chat scroll and meeting notes |
| Outcomes feed back — what happened sharpens what the system knows next | Static — same value on day 1 and day 1000 |
| One substrate, solo to institution — the same system grows from one person to an organization | A personal tool you outgrow, or an enterprise platform too heavy to start small |
| Transparent and verifiable — everything you see is shown, and every connection can be followed back | Black box — data goes in, answers come out |
| Composable — build exactly what you need from simple parts | Fixed — use what you're given |
| Sovereign by default — private, and fully exportable with structure and provenance | Open by default, hard to leave — data leaks in, value locks in |

**Guardrail:** the competitive-positioning guardrail for this table is internal-tier (`internalCanon`) — request it through the internal brand hand-off.

---

## 2. Voice & Tone

### Voice formula
<!-- generated:voice-formula -->
**Plain words, real specifics, room to breathe. Tech earns its place by being checkable — shown once, where the reader looks for it.**

**Attention rule.** Show the work once, where the reader looks for it. "Earn the jargon" governs what may enter the copy — not how often it repeats. One claim, one proof per surface: the mechanism lives one step from the claim (the next sentence, a subhead, an expandable) — never welded to every sentence. If two sentences in a row prove the same claim, cut one. The claim—dash—mechanism shape is a tool, not a rhythm.
<!-- /generated:voice-formula -->

### One voice — three facets in every moment
The character's gesture is triadic — reveal → ground → equip (§1) — and every piece of Spectrea copy, regardless of surface, carries all three facets together; the formula above states the texture the movements are written in. What shifts with context is which facet leads:

- On marketing, **reveal** leads — it is the register of the canonical hero-open rule (§2, Voice & Tone): the open lands on the outcome, written as the moment of new sight, *then* grounds it with specifics, *then* invites the reader to try it.
- On trust surfaces (errors, docs, settings, security), **ground** leads. The message starts with what is true, *reveals* the underlying cause, and *equips* the reader with the next step.
- On product, **equip** leads. The copy hands the user the tool, makes the result *visible* (reveal), and surfaces the reasoning when asked (ground).

The facet that leads changes; the other two are always present. A marketing page that only reveals is hype. A doc page that only grounds is stuffy. A product screen that only equips is a toolbar. Spectrea reads as Spectrea when all three are in every moment.

### Tone registers (one taxonomy, ratified 2026-08-08)
Six content classes, each with a tone label and the right (left) and wrong (right) version. Read each pair together — the contrast is what the rule looks like in practice. Two structures, two jobs: these registers say how a content class *sounds*; the surface patterns below say what a product surface *says* (a surface inherits its register from the nearest content class — system notifications from Error Message, release notes from Feature Announcement).

<!-- generated:tone-registers -->
| Context · Tone | Right | Wrong |
|---|---|---|
| **Marketing / Landing Page** · Bold + Direct | *"See everything your organization knows in one connected view. Spectrea builds a living graph from your documents — the more you use it, the sharper it gets."* | *"Transform how your team works. Unlock the power of connected knowledge — insights, intelligence, impact."* |
| **Error Message** · Direct + Informative | *"Save failed: connection timeout. Your draft is cached locally. Retrying…"* | *"Oops! Something went wrong. Please try again later or contact support if the problem persists."* |
| **Feature Announcement** · Concrete + Confident | *"Connections you never noticed start surfacing. Your second month is better than your first."* | *"We're excited to share our latest update — it includes improvements that will help you be more productive."* |
| **Documentation** · Precise + Helpful | *"To add a new item, open the relevant view and choose 'Add'. Pick a type from the list, or create one if you need it. The item appears in place immediately."* | *"Ready to add something? Just head over to the right view and hit that '+ Add' button! Pick a type that fits — or make a new one if nothing works. Easy!"* |
| **Social Media** · Thoughtful + Engaging | *"What if every document you uploaded made your whole system smarter? That's not a hypothetical — it's how Spectrea works."* | *"Team productivity has never been easier. Learn how Spectrea can transform your workflow."* |
| **Beginner Documentation** · Plain + Welcoming | *"Think of Spectrea as a web of everything your team knows. Add a document and Spectrea weaves what it learns into the web."* | *"Documents are processed through a 6-phase pipeline: parse, chunk, embed, score, review, and integrate."* |
<!-- /generated:tone-registers -->

The right-hand versions are bold, direct, concrete — they show what the user experiences. The wrong-hand versions fail in different ways: platitude-marketing (*transform, unlock, impact*), bland agentless announcement (*we're excited to share*), vague apology, forced chirp, clickbait, or engineer-internal jargon in a beginner context. In every case, the brand stays plain, specific, and checkable rather than claiming magic or reaching for the nearest SaaS cliché.

Two context shifts live within this same voice. **On buyer surfaces** (hero, case studies, pricing), the open lands on the outcome (hero-open rule below); proof carries the grounding — a named customer, a concrete outcome, or a peer-testable claim. Brand vocabulary decorates; it doesn't carry the opening. **Inside the product**, warm up one notch. Warmth comes from specificity, not exclamation points — *"Read. 12 entities, 18 connections added."* beats *"Upload complete! 🎉"* because the first shows the system paid attention.

**The hero-open (one canonical rule, ratified 2026-08-07).** Open on the outcome, written as a reveal — the moment of new sight. Never open with the mechanism, the pain alone, or a platitude. Ground it next with a specific the reader can check; close by equipping the next step. The gesture adapts to any surface — a problem may set up the reveal, proof may carry the grounding — but the open always lands on the outcome. Exception: graph-native jobs (exploration, visualisation), where the graph is the star and may lead.

**On-ramp posture (decided by Darren 2026-07-03; amended 2026-07-19).** Outcome-first hero per the canonical hero-open rule above: the hero leads with the entry job and its outcome, written as a reveal. One coined whole-product frame is sanctioned (ratified 2026-07-19): **"the operating system for collective intelligence"** — distinct from generic "AI OS", always paired with plain language that carries the meaning. The sanctioned hero example: *"Drop in your docs — get answers that show their sources, and a system that gets sharper every week."* Adopt the market's words where they exist: *permission-aware* · *cited answers* · *grounded answers* · *knowledge graph* (exploration surfaces only — the graph stays supporting-cast). Avoid-list terms — *Work AI* · *organizational memory* · *AI workspace* · *AI OS* · *second brain* · *ambient agents* · *bitemporal* · *ontology* · *enterprise graph* — follow the **balance doctrine** (ratified 2026-07-19): industry terms are not blacklisted or censored; an avoid-list term may label a segment-matched surface when a plain-language claim carries the meaning in place (e.g. "second brain" on the individuals page). Do not expect the term to carry weight with unfamiliar audiences; balance it, and never lead a cross-segment hero with it. Coin language ONLY for the differentiators no market term names: **per-viewer truth**, **decisions in the graph**, and the whole-product frame **"the operating system for collective intelligence"** (pair it with plain language — it must not carry the claim alone). Everywhere else, use the market's word where one exists (adopt list) or plain outcome language.

<!-- generated:os-frame-example -->
**The coined frame, applied** (worked example, ratified 2026-08-09):

| Right | Wrong |
|---|---|
| *"See everything your organization knows in one connected view — Spectrea is the operating system for collective intelligence: the place where what your team knows connects, compounds, and answers back."* | *"Spectrea: the operating system for collective intelligence."* |

The right version opens on the outcome and pairs the frame with plain language that carries the meaning in the same breath. The wrong version asks the frame to carry the claim alone — forbidden by the coinRule — and leads with it, against the on-ramp's outcome-first posture.
<!-- /generated:os-frame-example -->

### Surface patterns
Voice patterns for product and operational surfaces the register taxonomy doesn't cover — what each surface *says*, inheriting its register from the nearest content class above. Release notes follow the Feature Announcement register.

<!-- generated:surface-patterns -->
| Surface | Rule | Right | Wrong |
|---|---|---|---|
| **Onboarding** | Orient by doing, not touring. First screens name the one action that creates value and get out of the way. No feature carousels, no "welcome to the future". | *"Add your first document. Spectrea reads it and starts connecting it to what you add next."* | *"Welcome to Spectrea! 🎉 Let's take a quick tour of all the powerful features that will transform how you work."* |
| **Empty states** | An empty state is an invitation with a promise, not an apology. Name what will appear here and the single step that starts it. | *"No connections yet. Add a second document and related ideas start linking up here."* | *"Nothing to see here yet!"* |
| **Confirmation dialogs** | State the consequence plainly, in the user's terms — what happens, what's reversible, what isn't. The confirm button names the action, never "OK". | *"Delete this source? Its 14 extracted claims stay in the graph but lose their citation. This can't be undone."* | *"Are you sure you want to proceed? This action may have consequences. [OK] [Cancel]"* |
| **System notifications** | Specificity is the warmth. Report what the system actually did, with numbers where they exist. No celebration, no vagueness. | *"Read. 12 entities, 18 connections added."* | *"Upload complete! 🎉 Your document has been processed successfully."* |
| **Settings & security** | Ground leads. Say exactly what a setting does and what changes when it's toggled — especially for privacy and access. Plain sentences, no marketing. | *"Workspace visibility: private. Only people you invite can see this workspace. The assistant sees only what each viewer can see."* | *"Take control of your data with our industry-leading privacy options!"* |
| **Legal & compliance** | Same voice, zero warmth-decoration: precise, complete sentences that a lawyer and a reader both accept. State facts and obligations; never soften a limitation into a benefit. | *"You can export your full workspace — structure, data, and provenance — at any time. Deleting your account removes your data from live systems within the period stated in our retention policy."* | *"Don't worry — your data is always safe with us, and leaving is a breeze!"* |
| **Support replies** | Ground, then equip: confirm what happened (own it plainly if it's our fault), state what's true now, give the exact next step. Never open with an apology template. | *"You're right — sync failed for files added between 09:10 and 09:40 UTC. They're queued and will finish within the hour; nothing was lost. I'll reply here when they're through."* | *"We sincerely apologize for any inconvenience this may have caused. Your satisfaction is our top priority."* |
<!-- /generated:surface-patterns -->

### Vocabulary — twelve privileged words
The twelve brand-evocative words that should appear disproportionately often in copy. Each builds the *feeling* of Spectrea — clarity, aliveness, ownership, the act of seeing — without requiring the reader to know what the product does.

**Privileged words:** spectrum, clarity, whole, see, reveal, illuminate, surface, connect, compose, compound, alive, transparent.

Generic B2B SaaS words (insights, intelligence, transform, empower, unlock, enable, build, evolve, grow, deepen, expand) are still allowed but not privileged — they don't make Spectrea sound like Spectrea. Product-specific words (provenance, traceable, auditable, attributed, sourced) are also allowed and useful when describing what the product actually does — they just don't do brand voice work.

**Words we never use:** AI-powered (overused), next-gen, state-of-the-art, world-class, breakthrough, unprecedented, game-changer, revolutionary, seamless, cutting-edge, synergy, leverage (as a verb), agentic, AI-first, copilot (as a generic noun), 10x, supercharge, effortless, magical.

**Density.** Max two privileged words per paragraph, one *"living"* / *"alive"* per page. If a paragraph survives losing every privileged word, the prose is doing its job — if it collapses without them, rewrite.

---

## 3. Naming

- **Spelling:** Spectrea (capital S, no space).
- **Pronunciation:** /spek-TREE-uh/ — emphasis on the second syllable.
- **Etymology — dual reading:** a coinage from *spectrum* (Latin, from *specere*, "to look"; plural *spectra* — the full range). The name does double duty:
  - **Reading 1 — Spectrum:** the full range. The complete view. The whole picture, all in one place.
  - **Reading 2 — Revealing:** bringing what was hidden into clear view. The shift from blur to focus.
  - Together: *the spectrum of clarity* — and the action behind the tagline "We connect the dots."
- **Never:** "SpectreAI" · "Spectre" / "Spectra" (different words) · "spectra" (missing the e) · "Spectrea AI" as the lead name (AI is not the brand) · "SPECTREA" (all-caps) · lowercase "spectrea" in headings or prose (lowercase belongs to the logo wordmark treatment only) · "The Spectrea" (no article) · random internal caps ("SpecTrea").

### Feature naming convention
Apple-style: Title-case Proper Nouns without brand prefix. Each first-class feature stands on its own; the platform context (Spectrea) is implicit. The convention applies to whatever Spectrea ships, today or in the future.

| Pattern | Form |
|---|---|
| Generic noun (in prose) | lowercase ("the assistant", "the editor") |
| First-class feature (canonical) | Title-Case Proper Noun ("Assistant", "Editor") |
| Multi-word feature | Each significant word capitalised ("Spectrum View") |
| Distinct branded surface | "Spectrea X" — only after deliberate review |

**Three rules:**
1. **Default:** Title-case Proper Noun for first-class features. The capital signals "this is a named thing in Spectrea."
2. **Brand-prefix:** reserved for distinct branded surfaces — separately-paid tiers, developer surfaces, installable companions. Only after deliberate review (a hypothetical *Spectrea Studio* would qualify).
3. **In running prose:** lowercase generic nouns are acceptable when natural ("the assistant suggested"). Canonical name in marketing headers, documentation cross-references, and product UI labels.

### Naming the AI
Three registers (ratified 2026-07-19). **(1) Homepage/hero narrative:** "your AI" is sanctioned to match the hero register. **(2) Product and trust surfaces:** the AI is **"the assistant"** — lowercase, generic; as a first-class feature name it is **"Assistant"** (Title-Case, per the feature-naming convention). **(3) Technical and architecture writing:** "agent" is the umbrella term for an accountable AI actor (delegate or standing agent), per the vision taxonomy — the assistant is the delegate shape's product realization. Never "copilot" (generic or name), never "Spectrea AI" as a name.

The assistant suggests, surfaces, and drafts — it never silently "handles it for you" or "takes over". Automations act within guardrails the user sets: the user decides what runs on its own and what checks with you first (per the vision's governed-autonomy model). Never describe autonomy without naming its guardrail; never use approval-begging framings ("waiting for your yes").

**Allowed verbs:** suggests · surfaces · drafts. **Forbidden verbs:** handles it for you · takes over.

### Company vs product
**Matchwise Pte. Ltd.** is the legal entity — it appears only where a legal entity is required: contracts, invoices, terms, privacy notices ("Spectrea is a product of Matchwise Pte. Ltd."). **Spectrea** is the product and brand name on every public surface. Never brand a surface "Matchwise"; never combine the two into one name. Earlier material using the company name as a product or brand name is superseded.

---

## 4. Logo System

![Primary Spectrea mark — Cool Duet stroke over ten grey dots](/brand-assets/logo-mark-cool.svg)

### Anatomy
The logo has three parts:
1. **Mark** — the "connecting the dots" S-curve. 10 dots along a cubic Bézier path, with the final two visually trailing. Spectrum-gradient stroke connecting the first eight. The mark also reads as the leading `S` glyph in the lockup.
2. **Wordmark** — Albert Sans Semibold 600, 0.02em letter-spacing. Inside the canonical `Logotype` / `LogotypeGradient` components, the S mark replaces the leading `S` and only the tail `pectrea` is typeset in lowercase — a stylistic treatment, not the typed name. In every other context (manual lockups like the sidebar, descriptor variants, prose, headings, URLs-excepted), use the sentence-case `Spectrea` — the mark sits beside it as a companion glyph rather than a letter substitute.
3. **Lockup** — S mark + lowercase wordmark.

### Construction (K3′ geometry + "B" lockup constants, ratified 2026-08-06)
<!-- generated:logo-construction -->
- **Spine:** 3 G1-continuous cubics fitted to the Albert Sans 600 S medial axis, with a deliberate shallow storytelling tail. Authoritative coordinates: `brand.ts` `logo.markGeometry` (record: docs/brand-review-2026-08).
- **Dots:** 10 dots at i/9 arc fractions of the spine, radius 3.961 (native units; dot diameter : stroke width stays 7:8). Grey (`#A3A3A3`) in the primary treatment.
- **Stroke:** width 9.053 (native units), round linecap. Cool Duet (Cobalt `#4271DF` → Teal `#00B6A0`) in the static mark and in the gradient lockup's mark. In the lockup the rendered stroke equals the wordmark's stem: **0.113em**.
- **Trailing dots:** the last 2 dots are left visually unconnected — the "about to connect" moment.
- **Lockup metrics (on ink, never bounding boxes):** mark ink height 0.714em (= the real S glyph's ink), mark→text ink gap 0.131em (= S right side bearing + 0.02em tracking + p left side bearing), mark ink bottom at baseline + 0.007em (the S's baseline overshoot). Wordmark: Albert Sans **600** at every size, 0.02em tracking.
- **Container:** 64×64 construction viewBox. Circle when contained — never a squircle.
- **Small sizes:** No micro-construction (ratified 2026-08-06, decision 11): the standard mark scales down unchanged at every size. Below ~24px the trailing dots read as part of the stroke; that plain-S reading is accepted.
<!-- /generated:logo-construction -->

### The two-forms rule (lockup)
The lockup has **exactly two forms** — no third:
1. **Gradient lockup** — `LogotypeGradient` component. S mark carries the two-tone Cool Duet (Cobalt `#4271DF` → Teal `#00B6A0`) on the stroke only; all dots stay grey. The wordmark is monotone — Ink on light, White on dark — following the `colorMode` prop.
2. **Mono lockup** — `Logotype` component. Everything renders in a single `ink` / `white` / `grey` colour.

![Gradient lockup — LogotypeGradient](/brand-assets/logo-lockup-gradient.svg)
![Gradient lockup, dark-surface rendering — white wordmark](/brand-assets/logo-lockup-gradient-white.svg)
![Ink mono lockup](/brand-assets/logo-lockup-ink.svg)
![White mono lockup on ink](/brand-assets/logo-lockup-white.svg)

The dark-surface file (`logo-lockup-gradient-white.svg`) is not a third form — it is form 1's "White on dark" wordmark rendering, shipped as its own asset for dark and photographic surfaces. (Resolved 2026-07-03: an earlier draft shipped this asset under the misnomer "spectrum-white"; Darren ratified re-scoping it to the gradient family — no full-spectrum lockup exists.)

The gradient lives in the mark only. No gradient-filled wordmark, no full-spectrum lockup — the wordmark is always solid so it stays legible at every size. Duets (Balanced / Warm) belong to the static mark only; they are not lockup options.

### Mark colour modes
- `'color'` — full spectrum (Cobalt → Teal → Amber). Default for `AnimatedLogo`. Used for hero moments.
- `'cool'` — Cool Duet (Cobalt → Teal). Default for `StaticLogo`. Primary static mark for everyday use.
- `'balanced'` — Balanced Duet (Teal → Amber through the intermediate bridge — stops in §6). For product/ecosystem moments.
- `'warm'` — Warm Duet (Amber → Rose). For marketing attention.
- `'grey'` — Pewter. Watermarks only.
- `'white'` — Canvas `#FDFDFB`. Dark backgrounds.
- `'ink'` — Ink `#18181C`. Formal, co-branding, single-colour print.

### Dot-colour rule
- **Mono mode** (`ink`/`white`/`grey`) → dots match the mark — not grey.
- **Gradient/duet mode** → dots are grey (`#A3A3A3`). This is the primary brand treatment.
- **Exception:** the intentional "Ink + Grey Dots" variant labelled *Quiet authority* — connection formed, spectrum dormant.

### Variants (11 approved)
**On light backgrounds:**
1. Primary mark (Cool Duet, grey dots)
2. Primary lockup
3. Ink mark
4. Ink lockup
5. Grey mark (watermark only)

**On dark backgrounds:**
6. Primary on dark (Cool Duet + grey dots)
7. Primary lockup on dark
8. White mark
9. White lockup

**Contained (below 48px):**
10. Ink circle (white mark on ink fill)
11. White circle (ink mark on white fill)

### Lockup arrangements (three)
1. **Gradient logotype** — `LogotypeGradient`. Preferred for brand/marketing.
2. **Horizontal with descriptor** — `StaticLogo` + sentence-case `Spectrea` wordmark + descriptor below. For nav, product headers, sub-brands. Descriptor styling: `gap-3` between mark and wordmark column, `text-xs`, uppercase, tracking-widest, Pewter (`#97979E`). Because this is a manual composition (not the canonical `Logotype` component), the mark sits beside the wordmark as a companion glyph — the S is not dropped, and the word is typed `Spectrea` exactly as in running prose.
3. **Stacked** — mark above wordmark. For title slides, centered compositions. Wordmark width ≤ mark width.

### When to use which variant
| Context | Variant | Why |
|---|---|---|
| Website header (light) | Logotype | Preferred horizontal treatment |
| Website header (dark) | Logotype (white) | White logotype on dark |
| Product sidebar / nav | #1 + descriptor | Primary mark with descriptor |
| Favicon (16–32px) | #10 | Ink circle — high contrast small |
| App icon | #10 | Bold, distinctive in app grids |
| Social avatar | #10 | Circular crop on most platforms |
| Social cover image | #2 or #7 | Full lockup, match cover background |
| Marketing hero | Logotype or stacked | Logotype inline; stacked centered |
| Co-branding | #3 or #4 | Ink prevents colour competition; match the partner mark by optical height — scale so perceived heights are equal, not bounding boxes — and align on the marks' vertical centres |
| Legal / formal | #4 | Ink lockup — authoritative, max contrast |
| Watermark | #5 at ≤20% opacity | Grey mark, subtle |
| Emboss / foil stamp | #3 | Single-tone production |

**Co-branding (canonical rule):** Use the ink variants (#3 mark / #4 lockup). Match the partner mark by optical height — scale so perceived heights are equal, not bounding boxes — and align on the marks' vertical centres.

### Clear space
<!-- generated:clear-space -->
Minimum clear space around the lockup: 0.5× the mark height on all sides. No other graphic element (text, border, background image) enters the clear-space box.
<!-- /generated:clear-space -->

### Misuse
Never: stretch or distort · change colours (spectrum gradient is Cobalt → Teal → Amber; never substitute) · rotate · add drop shadows, glows, bevels · use only the stroke path without dots · use on low-contrast backgrounds (< 2.5:1) · change dot count (always exactly 10) · swap mark and wordmark positions · violate clear space · use a squircle container (always round) · colour the dots in the primary treatment · substitute the wordmark typeface.

---

## 5. Colour System

![Spectrum accents — Cobalt, Teal, Amber, Rose](/brand-assets/swatches-spectrum.svg)

![Warm Blend neutrals — Canvas, Cloud, Pewter, Graphite, Ink](/brand-assets/swatches-neutrals.svg)

![Bridge tier — tinted washes for semantic surfaces](/brand-assets/swatches-bridge.svg)

### Spectrum is the brand signature
The four-colour spectrum (Cobalt + Teal + Amber + Rose) is the brand's central visual claim — comparable to how Google's four colours signal Google or Microsoft's four squares signal Microsoft. In **marketing surfaces**, the spectrum is used confidently as the brand's identity: hero gradients, full-spectrum illustration moments, spectrum lockups, the lockup gradient as the signature mark treatment.

In **product UI**, the same four colours stay strictly *semantic* (Tier 3 framework below): Cobalt for action, Teal for success, Amber for attention, Rose for urgency. The discipline doesn't change; only the airtime does. Marketing spends budget on spectrum hero moments; product reserves it for meaning.

### Warm Blend neutrals (applied system-wide)
<!-- generated:neutral-ladder -->
A subtle warm tint layered under the spectrum — closes the gap between cold Tailwind grays and the warm accents. Seven tokens, perceptually-uniform in OKLCH L-space from surface to primary text.

| Role | Name | Hex | OKLCH L | Contrast on Canvas | CSS var |
|---|---|---|---|---|---|
| Background | Canvas | `#FDFDFB` | 0.993 | 1:1 | `--color-canvas` |
| Elevated surface | Cloud | `#F4F4F1` | 0.966 | 1.08:1 | `--color-cloud` |
| Whisper muted | Pewter | `#97979E` | 0.679 | 2.85:1 | `--color-pewter` |
| Body secondary | Slate | `#6D6D72` | 0.536 | 5.05:1 | `--color-slate` |
| Emphasized body | Iron | `#46464B` | 0.396 | 9.21:1 | `--color-iron` |
| Dark UI surface | Graphite | `#212226` | 0.253 | 15.6:1 | `--color-graphite` |
| Primary text / dark bg | Ink | `#18181C` | 0.211 | 17.4:1 | `--color-ink` |

The seven tokens form an OKLCH-even ladder (ΔL ≈ 0.14 through the body range, with tighter pairs at each end: Canvas↔Cloud and Graphite↔Ink). Slate and Iron exist because the body-text hierarchy needs three working tiers (quiet / body / emphasized) and the old five-token palette had a single ~0.43-wide L gap between Pewter and Graphite with nothing in between.
<!-- /generated:neutral-ladder -->

### Spectrum accents (the four spectrum colours)
<!-- generated:accent-meanings -->
| Role | Name | Hex | Meaning |
|---|---|---|---|
| Hero / primary | Cobalt | `#4271DF` | Intelligence, trust, focus. One primary action per section. |
| Positive / growth | Teal | `#00B6A0` | Success, growth, connected status. |
| Attention | Amber | `#E19000` | Warnings, pending, confidence. |
| Urgency / action | Rose | `#F24260` | Errors, destructive actions, critical alerts. |
<!-- /generated:accent-meanings -->

<!-- generated:accent-states -->
Hover/active states for each accent (light surfaces — darken on interaction):
- Cobalt: base `#4271DF`, hover `#3A63C4`, active `#3255A7`.
- Teal: base `#00B6A0`, hover `#009E8A`, active `#008775`.
- Amber: base `#E19000`, hover `#C58200`, active `#A86E00`.
- Rose: base `#F24260`, hover `#D63B55`, active `#BA3249`.

Dark surfaces (resolved 2026-07-04) — same bases, states lighten instead: Cobalt hover `#6E93EC` / active `#8FACF0` · Teal hover `#20C8B2` / active `#40D4C3` · Amber hover `#ECA41E` / active `#F2B63C` · Rose hover `#F56579` / active `#F78892`. On dark surfaces the button lifts toward the light: hover and active fills lighten, and the label flips from White to Ink #18181C while the fill is lightened. Base states keep white text. Ink-on-lightened-fill contrast, verified 2026-07-04 (cobalt re-lightened 2026-08-08, D40 — the old hover #5C87E5 read APCA Lc 40.5, below the 45 spot line; the new ladder puts every dark transient state at APCA parity): cobalt hover 5.94 / active 7.86, rose hover 5.92 / active 7.50, teal hover 8.40 / active 9.63, amber hover 8.34 / active 9.72 — all ≥ 4.5:1 (AA, normal text). Dark secondary: bg `#2E2F35`, hover `#3A3A40`, text Cloud `#F4F4F1`.
<!-- /generated:accent-states -->

### Bridge tier (tinted washes)
Tiered between the neutral canvas and the vivid accents — 5–10% saturation versions of each spectrum colour. Always carry semantic meaning; never decorative.

<!-- generated:washes-light -->
| Name | Hex | Paired accent | Use |
|---|---|---|---|
| Cobalt Wash | `#EDF0F8` | Cobalt | Info alert background, selected row (text on wash: `#1E3A8A`) |
| Teal Mist | `#E6F5F3` | Teal | Success toast, positive trend card (text on wash: `#0D5E56`) |
| Amber Stone | `#F5F0E6` | Amber | Warning alert, highlighted callout (text on wash: `#7C4D04`) |
| Rose Blush | `#FDF0F2` | Rose | Error message, destructive confirmation (text on wash: `#9F1239`) |

Text on a dark wash is Cloud #F4F4F1; text on a light wash uses that wash's textOn value (or Ink) — never the raw accent.
<!-- /generated:washes-light -->

### Text hierarchy — which token for which tier
<!-- generated:text-hierarchy -->
The dark-on-light text tiers map to the Warm Blend's readable tokens:

| Tier | Token | Contrast | Use for |
|---|---|---|---|
| Primary | Ink `#18181C` | 17.4:1 (AAA) | Headings, stat values, body emphasis, logo wordmark |
| Emphasized body | Iron `#46464B` | 9.21:1 (AAA) | Table headers, field labels, key body sentences |
| Body secondary | Slate `#6D6D72` | 5.05:1 (AA) | Descriptions, helper text, card sub-labels, secondary prose |
| Whisper muted | Pewter `#97979E` | 2.85:1 | Supplementary labels only — governed by the Pewter matrix (accessibility.pewterMatrix) |

**Pewter is a whisper, not a readable tier.** Pewter (#97979E, 2.85:1) is a whisper, not a readable tier. Anything that must be read on its own steps up to Slate or Iron. As a matrix — **allowed:** Overlines · Timestamps · Meta chips · Placeholder text · Captions whose adjacent context already makes the content obvious. **Denied:** Any informational text — body copy, labels carrying meaning, values, errors, anything a reader must be able to read on its own.
<!-- /generated:text-hierarchy -->

### Tailwind → Warm Blend mapping
<!-- generated:tailwind-mapping -->
The app uses Tailwind utility classes; the Warm Blend tokens are exported into the @theme so the brand names are first-class utilities.

| Tailwind stone class | Brand token | Notes |
|---|---|---|
| `text-stone-900, text-stone-800` | `text-ink` | primary |
| `text-stone-700, text-stone-600` | `text-iron` | emphasized body |
| `text-stone-500` | `text-slate` | body secondary |
| `text-stone-400, text-stone-300` | `text-pewter` | whisper — never for informational text |
| `bg-stone-50, bg-stone-100` | `bg-cloud` | elevated surface |
| `bg-stone-800` | `bg-ink` | active dark fill (Tier 2 Structural) |
| `border-stone-*` | **keep as-is** | Tailwind stones are the sanctioned border family |
| `bg-stone-200, bg-stone-300` | **keep as-is** | hover / active / press backgrounds, skeleton placeholders |
<!-- /generated:tailwind-mapping -->

### Colour ratio (the 60/20/10/10 rule)
<!-- generated:colour-ratio -->
- **60%** Canvas (page background)
- **20%** Cloud (elevated surfaces: cards, sidebars, dropdowns)
- **10%** Ink + Pewter (text and UI)
- **10%** Spectrum accents (semantic moments only)
<!-- /generated:colour-ratio -->

![Usage ratio bar — 60% Canvas, 20% Cloud, 10% text, 10% spectrum](/brand-assets/ratio-bar.svg)

### Tiered colour framework
<!-- generated:colour-tiers -->
Every colour in Spectrea lives in one of three tiers:

1. **Tier 1 — Responsive (Cobalt).** Action-oriented elements — things that trigger an operation. Temporary and reactive: present during hover, press, then settles. Primary buttons, links, CTAs, hovered icons. Focus indication is not a Cobalt job — the dedicated focus ring (brandTokens.focusRing) is accessibility chrome outside the tiers.
2. **Tier 2 — Structural (Ink).** Persistent state and navigation. Active nav item, selected tab, toggled-on icon, current breadcrumb. Ink keeps the canvas calm while Cobalt stays reserved for action.
3. **Tier 3 — Semantic (spectrum + Pewter).** The system communicating status. Info (Cobalt), success (Teal), warning (Amber), error (Rose). Never decorative — every appearance carries meaning.
<!-- /generated:colour-tiers -->

### Default mode: light
<!-- generated:light-default -->
Spectrea defaults to light. Canvas is the 60% page ground because the Warm Blend system exists to make the spectrum feel inhabited against a warm-tinted white — not to produce a dark-first interface. Marketing, product, and PDF surfaces all ship light-default. Dark is a parallel mode, not the primary register.
<!-- /generated:light-default -->

### Dark surfaces (parallel mode)
<!-- generated:dark-roles -->
On dark surfaces the role mapping inverts — existing tokens carry more of the weight, with two additions for hierarchy.

| Role | Light | Dark | CSS var |
|---|---|---|---|
| Page background | Canvas `#FDFDFB` | Ink `#18181C` | `--dark-canvas` |
| Elevated surface | Cloud `#F4F4F1` | Graphite `#212226` | `--dark-cloud` |
| Primary text | Ink `#18181C` | Cloud `#F4F4F1` | `--dark-ink` |
| Muted text | Pewter `#97979E` | Mist `#B0B0B6` *(new)* | `--dark-mist` |
| Border / divider | `stone-200` | Fog `#2E2F35` *(new)* | `--dark-fog` |

**Why two new tokens and not more.** Pewter passes for body text on Ink, but muted text needs to sit above the body hierarchy on dark — Mist is Pewter brightened so secondary still feels secondary without fighting primary text. Fog gives separation without a visible line — lighter than Ink, darker than Graphite, so cards feel edged rather than drawn. Computed on Ink: Pewter 6.10:1, Mist 8.20:1.
<!-- /generated:dark-roles -->

### Spectrum accents on dark
<!-- generated:dark-accents -->
Accents carry over unchanged — the brand should read as itself on either surface. Three of four accents pass WCAG AA for normal text on Ink; Cobalt is UI-only at this contrast — for coloured text on Ink use Cobalt Lift.

| Accent | On Ink contrast | Notes |
|---|---|---|
| Cobalt `#4271DF` | 3.93:1 | UI only (passes 3:1 for non-text UI). **For coloured text on Ink use Cobalt Lift `#7A9AEF`.** |
| Teal `#00B6A0` | 6.91:1 | AA normal text. |
| Amber `#E19000` | 6.90:1 | AA normal text. |
| Rose `#F24260` | 4.82:1 | AA normal text. |
<!-- /generated:dark-accents -->

**Optional brightened variants** — only for long-form *coloured* text on dark (rare in practice). Use sparingly; default behaviour is "same hex, lighter surface."

<!-- generated:lifts -->
| Accent | Dark-lift | When |
|---|---|---|
| Cobalt Lift | `#7A9AEF` | Inline links inside dark long-form text blocks. |
| Teal Lift | `#3DD3BF` | Coloured body copy on dark surfaces. |
| Amber Lift | `#F2AE40` | Coloured body copy on dark surfaces. |
| Rose Lift | `#F97587` | Coloured body copy on dark surfaces. |
<!-- /generated:lifts -->

### Dark bridge washes
Tinted dark surfaces — the semantic bridge tier rebuilt for dark mode. ~8–12% saturation on a dark base. Pair with the saturated accent the same way light washes do; the surface carries context, the dot/icon carries the colour.

<!-- generated:washes-dark -->
| Name | Hex | Paired accent | Use |
|---|---|---|---|
| Cobalt Deep | `#1B2440` | Cobalt | Info alert background, selected row (dark) |
| Teal Deep | `#0E2E2A` | Teal | Success toast, positive trend card (dark) |
| Amber Deep | `#2E2410` | Amber | Warning alert, highlighted callout (dark) |
| Rose Deep | `#2E1218` | Rose | Error message, destructive confirmation (dark) |
<!-- /generated:washes-dark -->

### Dark ratio
<!-- generated:dark-ratio -->
Same 60/20/10/10 discipline, inverted: 60% Ink · 20% Graphite · 10% Cloud + Mist · 10% spectrum (semantic only). The canvas still dominates; colour still earns its place.
<!-- /generated:dark-ratio -->

### When to use dark
- **Product UI** — follow the user's OS/app preference. Both modes are first-class.
- **Marketing** — light by default. Use Ink backgrounds for single-panel emphasis (quote card, stat card, section divider), not whole pages.
- **Presentations** — Canvas default; Ink for dividers and closing CTA (≤20% of deck). See §12.
- **PDF and print** — always light. Dark-mode PDFs waste ink and hurt readability.
- **Email** — transactional on Canvas; marketing headers may use Ink as a branded band, but the email body stays on Canvas.

### Graph visualization colour semantics (foundation)
Graph surfaces follow the tiered framework — colour is reserved for meaning:
<!-- generated:graph-viz -->
- **Node default:** Neutral — structure is quiet (Slate/Pewter strokes, Canvas/Cloud fills on light; inverted on dark). Colour is reserved for meaning.
- **Node hover:** Cobalt — Tier 1 responsive: present during hover, then settles.
- **Node focus:** Canonical focus ring (brandTokens.focusRing) — the same ring every focusable carries; not a Cobalt state.
- **Node selected:** Ink — Tier 2 structural: persistent selection state (Cloud on dark).
- **Edges:** Neutral (Pewter). A newly formed connection may animate with the Formation motion primitive — spectrum gradient along the stroke, settling to resting neutral.
- **Confidence:** Amber carries confidence/attention. Confidence values render in JetBrains Mono and are never conveyed by colour alone.
- **Status:** Tier 3 semantic: success/connected = Teal · warning/pending = Amber · error/conflict = Rose · info = Cobalt.
- **Stale/dormant:** Pewter whisper plus a non-colour cue (icon or label) — never colour alone.

Foundation only. The operational graph-rendering spec is a product design deliverable, not a brand-guide deliverable.
<!-- /generated:graph-viz -->

---

## 6. Gradients

**Three gradients — don't conflate them.**

### Primary brand gradient (the default)
<!-- generated:gradient-primary -->
**Cobalt → Teal → Amber** at 135°, interpolated in **OKLCH** on modern browsers with a clean sRGB fallback. The everyday brand gradient — hero sections, accent bars, marketing headers, dividers, progress indicators.
<!-- /generated:gradient-primary -->

![Brand gradient](/brand-assets/gradient-brand.svg)

#### Cross-browser CSS recipe
<!-- generated:gradient-recipe -->
```css
.brand-gradient {
  background: linear-gradient(135deg, #4271DF, #00B6A0, #E19000);
}
@supports (background: linear-gradient(in oklch, red, blue)) {
  .brand-gradient {
    background: linear-gradient(135deg in oklch, #4271DF, #00B6A0, #E19000);
  }
}
```

Interpolation: OKLCH on modern browsers (Chrome 111+ / Safari 16.2+ / Firefox 117+) with the sRGB fallback on older ones — the OKLCH path keeps chroma high through the middle and avoids the muddy olive zone. Browsers that don't understand OKLCH silently ignore the `@supports` block and keep the sRGB base.
<!-- /generated:gradient-recipe -->

### Lockup mark gradient (inside `LogotypeGradient` only)
<!-- generated:gradient-lockup -->
Two-tone Cool Duet — the same gradient as the primary static mark. The wordmark stays monotone (Ink / White); only the mark carries colour.
```
0% #4271DF  →  100% #00B6A0
```
Implemented in SVG (`<linearGradient>`). **Never used as a general-purpose decorative gradient.**
<!-- /generated:gradient-lockup -->

![Lockup mark gradient — Cool Duet](/brand-assets/gradient-lockup.svg)

### Full spectrum with Rose (sparingly)
<!-- generated:gradient-full-rose -->
`Cobalt → Teal → Amber → Rose` at 135°. All four spectrum colours — peak brand expression only (landing-page heroes, launch moments). Use sparingly; reserving it keeps its impact.
<!-- /generated:gradient-full-rose -->

![Full spectrum with Rose](/brand-assets/gradient-full-rose.svg)

### Two-colour duets (adjacent pairs only)
<!-- generated:gradient-duets -->
Two-colour gradients (duets) use ADJACENT spectrum pairs only. Skip pairs (Cobalt→Amber direct, Teal→Rose, Cobalt→Rose) break the continuous-spectrum metaphor and are off-brand.
- **Cool Duet** — Cobalt → Teal. Intelligence + growth. The resting-state duet — data, technical contexts, and the static S mark. Also the lockup mark's gradient (LogotypeGradient, mark stroke only; the wordmark stays monotone) — never a general-purpose decorative gradient there.
- **Balanced Duet** — Teal → `#6FB884` at 65% → Amber. *Must include the #6FB884 intermediate at 65% — without it, teal and amber desaturate into muddy olive.* Product/ecosystem moments.
- **Warm Duet** — Amber → Rose. Energy + urgency. Marketing, launches, attention moments.
<!-- /generated:gradient-duets -->

![Cool Duet](/brand-assets/gradient-cool-duet.svg)
![Balanced Duet — with the #6FB884 intermediate bridge](/brand-assets/gradient-balanced-duet.svg)
![Warm Duet](/brand-assets/gradient-warm-duet.svg)

### Gradient rules
<!-- generated:gradient-rules -->
**Use for:**
- Logo mark background
- Hero section accent bars
- Marketing page headers
- Loading progress bars
- Slide deck title dividers
- Social media profile accents

**Never for:**
- Buttons (use solid Cobalt)
- Text colour (unreadable)
- Body backgrounds (overwhelming)
- Borders or outlines (too busy)
- Small icons or badges
- Repeated elements (it stops being special)
<!-- /generated:gradient-rules -->

---

## 7. Typography

![Typography samples — Albert Sans headings, Lexend body, JetBrains Mono code](/brand-assets/type-samples.svg)

### Type system (three typefaces)
<!-- generated:type-system -->
| Role | Family | Weights | Use |
|---|---|---|---|
| Headings | Albert Sans | 600 (Semibold — incl. the logo wordmark at every size), 700 (Bold — hero headlines only) | Page titles, section headings, card titles, stat values |
| Body | Lexend | 300, 400, 500, 600 | Body text, descriptions, form labels, nav items; 600 for overlines and small section labels (uppercase/tracked) |
| Code / metadata | JetBrains Mono | 400 | Inline code, data values, entity types, provenance |
<!-- /generated:type-system -->

<!-- generated:min-sizes -->
**Minimum sizes.** Body and prose: 16 px preferred, 14 px minimum. Captions and secondary labels: 12 px minimum. 10 px is permitted only for uppercase-tracked overlines, numeric badges, and metadata chips where the letter-spacing and weight restore legibility. Below 10 px is specimen-only (mini-preview UI illustrating another system at small scale) and must never appear in shipped production surfaces.
<!-- /generated:min-sizes -->

### Type scale

![Type scale ladder — Display through Code](/brand-assets/type-scale.svg)

<!-- generated:type-scale -->
| Size | Value | Line height | Weight | Use |
|---|---|---|---|---|
| Display | 48 px | 1.1 | 600 | Hero headlines, landing-page titles |
| H1 | 36 px | 1.2 | 600 | Page titles |
| H2 | 30 px | 1.25 | 600 | Major section headings |
| H3 | 24 px | 1.3 | 600 | Sub-section headings, card titles |
| H4 | 20 px | 1.4 | 600 | Minor headings, dialog titles |
| H5 | 18 px | 1.4 | 600 | Sidebar section titles |
| Body LG | 18 px | 1.6 | 400 | Lead paragraphs |
| Body | 16 px | 1.6 | 400 | Default body text |
| Body SM | 14 px | 1.5 | 400 | Secondary text, table cells, form inputs |
| Caption | 12 px | 1.5 | 500 | Labels, timestamps, helper text |
| Overline | 12 px | 1.5 | 600 | Section labels (uppercase + 0.05em tracking) |
| Code | 14 px | 1.5 | 400 | Inline code, data values, type labels (JetBrains Mono) |
| Code SM | 12 px | 1.5 | 400 | Trace details, technical metadata (JetBrains Mono) |
<!-- /generated:type-scale -->

### Responsive scale
<!-- generated:responsive-scale -->
Desktop (1024+) / Tablet (640–1023) / Mobile (<640):
- Display: 48 / 36 / 30
- H1: 36 / 30 / 24
- H2: 30 / 24 / 20
- H3: 24 / 20 / 18
- Body / Body SM: unchanged across breakpoints.
<!-- /generated:responsive-scale -->

### Accessibility
<!-- generated:accessibility -->
The floor is **WCAG 2.2 AA** on every shipped surface, except the deliberate, ratified departures in the exception registry below.
- Body text minimum 16 px; never lower for primary content.
- Contrast ratio minimum: 4.5:1 for normal text, 3:1 for large/UI. On Canvas (computed): Ink 17.4:1 (AAA) · Iron 9.21:1 (AAA) · Slate 5.05:1 (AA) · Pewter 2.85:1 (supplementary only) — see the Pewter allow/deny matrix in §5.
- WCAG 2.2 specifics: Focus appearance: a visible focus indicator on every interactive element — the Amber focus ring (2 px solid, 2 px offset; Amber active #A86E00 on light surfaces, alpha-tinted Amber on dark) is the standard treatment · Target size: interactive targets at least 24×24 px, or the equivalent spacing exception · Dragging alternatives: any drag interaction (graph manipulation included) has a single-pointer, non-dragging alternative.
- Never rely on colour alone — pair colour coding with icons, patterns, or labels.
- Layout must not break at 200% browser text-zoom.
- **Measurement doctrine (adopted 2026-08-07):** Conformance floor: WCAG 2.x relative-luminance ratios (4.5:1 normal text; 3:1 large text and UI) — the metric automated checkers enforce and the level the brand publicly claims. Perceptual adjudicator: APCA-W3 Lc (the WCAG 3 draft model; ≥45 spot text, ≥60 fluent, ≥75 body) — consulted whenever the 2.x formula and trained eyes disagree, because 2.x under-credits light text on saturated mid-tone fills and over-credits dark-on-vivid. Exception grants record both metrics. OKLab/OKLCH lightness deltas may inform design exploration but are not conformance measures.
- **Exception registry** — deliberate, ratified departures from the floors; a sub-floor usage not listed here is a defect, not a style. One entry:
  - `semantic-button-labels-white` (ratified 2026-08-07): White #FFFFFF labels on semantic button base fills sit below the WCAG 2.x AA text floor on Rose, Teal, and Amber. **Measured — WCAG 2.x:** White on Cobalt 4.51:1 (AA), Rose 3.67:1, Teal 2.56:1, Amber 2.56:1; light-mode hover/active improve to 3.20–7.02:1; dark transient states flip to Ink and pass 5.92–9.72:1. **APCA:** White Lc on Cobalt 76.4, Rose 68.4, Teal 54.6, Amber 54.9 (hover/active 64.2–88.9) vs Ink Lc 31.7/39.6/53.0/52.7 — white beats or ties Ink on every fill, and every white pairing clears the APCA spot-text minimum (45) at base state. **Rationale:** The WCAG 2.x formula under-credits light text on saturated mid-tone fills and over-credits dark-on-vivid: the nominally compliant Ink-on-Rose swap (4.82:1) would measure APCA Lc 39.6 — perceptually worse than the white it replaced (68.4). White labels are perceptually equal-or-better everywhere and keep one consistent label rule across the semantic set. **Bounds:** Semantic action buttons only: short labels, ≥14px Lexend Medium (500), reinforced by action context per the colour-alone rule. Covers light- and dark-surface base states (dark transient states still flip to Ink). Never body text, links, or long-form copy.
<!-- /generated:accessibility -->

---

## 8. Iconography

**Library:** Tabler Icons (`react-icons/tb` — outline + filled from one library).

**Specs:**
- Style: outline by default; filled only for active/selected states.
- Stroke width: 2 px (Tabler default, consistent across all icons).
- Stroke caps/joins: round (matches the brand's warm personality).
- Grid: 24×24 px.
- Padding: 2 px inset — content stays within a 20 px live area.

**Colour system (tiered):**
- **Ink** (`#18181C`) — primary: nav, headings, actions.
- **Pewter** (`#97979E`) — secondary: helpers, disabled, muted.
- **Cobalt** (`#4271DF`) — active state, selected, links (hover responsive).
- **Cloud** (`#F4F4F1`) — on dark backgrounds.

**Rule:** never use spectrum accents (Teal, Amber, Rose) for decorative icons. Those colours are reserved for semantic meaning.

---

## 9. Illustration

<!-- generated:illustration-system -->
One invariant DNA block plus one register sentence per job. The DNA is the identity and never varies; the register is the context dial, chosen per job and never enforced across jobs. Measurements report, they never gate — a scorer rewards crude flat images, so a person looks at every render before it is claimed or shipped.

The full generation reference — DNA block, registers, and the reporting checklist — is published at [/illustration-prompt.md](/illustration-prompt.md), generated from the same canon.

### The DNA block

```text
Generate this image directly.

[SUBJECT]
[REGISTER]

Flat editorial illustration in the style of Linear.app and Stripe brand art, slightly warmed.
Filled shapes only. No outlines, no strokes, no line art.

Colours: cobalt blue #4271DF, teal #00B6A0, amber #E19000, rose #F24260, warm off-white background #FAF8F2. One colour dominates; the others support as pale tints. Never all four at full strength.

Warmth comes from palette and light, not from crowding. No grey filler shapes.
Mix soft rounded forms with clean geometric ones.
If people appear, their faces are blank or one dot per eye.

[TEXT]
No isometric view, no 3D, no photorealism, no houseplants.

[ASPECT].
```

- `[SUBJECT]` — One sentence naming the scene. A subject that must contain no people says so — figures are not part of the DNA.
- `[REGISTER]` — One sentence from registers below, or one derived per registerDerivation.
- `[TEXT]` — Marketing and editorial subjects: "No text." Product subjects: "Render the interface accurately, with the text it genuinely needs. Never lorem, never gibberish."
- `[ASPECT]` — The aspect ratio, e.g. "16:9", "1:1", "1200x630".

**Why it is short.** Length is load-bearing. The ~2,900-character predecessor lost generator attention; compacting to ~750 characters was the single change that moved every measured metric. Adding rules to this block costs attention on the rules already in it — a new constraint belongs in a register sentence, not here.

### Registers

| Register | Job | Sentence |
|---|---|---|
| **hero** | Draws attention; rewards a look | *"A detailed, balanced scene with warm light — rich enough to reward a second look, composed enough to breathe."* |
| **spot** | Sits beside content; must not compete with it | *"Simple and direct: a few large deliberate shapes and one large calm empty area."* |
| **docs** | Explains; carries order and motion | *"A clear single idea in motion — order emerging, mid density, nothing decorative."* |
| **product** | Shows the actual software | *"Render the product accurately; named source documents sit beside the answer."* |
| **social** | Reads at thumbnail size | *"Bold and immediate at small size; two equal subjects may share the lead colour."* |

These five are named presets, not a closed list. A register is one sentence positioning a job on five axes: density, composition, light, text, and subjects. A context with no register gets a sentence composed on those axes; if the context recurs, name the sentence, make its best render the exemplar, and add it here. The DNA never moves — only the sentence does.

### Ranges — what varies, and how far

| Axis | Range | Default | Out of range | Judged by |
|---|---|---|---|---|
| **Temperature** | Cool-leaning (Cobalt-led and spare on the warm ground) to golden-hour (warm light over a dense warm scene). The ground is ALWAYS warm off-white — temperature varies in the shapes and the light, never the ground. | Gentle warmth: warm light present, not golden. | A cool white or grey ground; blue-grey washes; heat with no cool counterweight. | eye |
| **Density** | Largest open area from ~12% (richest) to ~76% (sparest). | Set by register — a hero carries detail, a spot carries few large shapes. An unregistered job sits mid. | Below ~12%: nothing breathes. The retired anchor sat at 5%. | eye |
| **Abstraction** | Accurate product scenes to pure geometric abstraction. | Simplified representational — a real scene built from flat shapes. | Photorealism at one end; literal banned metaphors (networks, nodes, prisms) and decoration with no job at the other. | eye |
| **Depth** | Vector has no range: strictly flat. Raster runs from pure flat through layered flat (overlap occlusion) to believable perspective where the subject itself needs it. | Layered flat, at most one darker tonal step. | Isometric projection as a style; slab-edge stacks; gloss; rendered 3D. | eye |
| **Saturation** | One primary at full strength leads; a second may reach full strength in small accents; three only where shapes themselves are the subject. | Exactly one primary at full strength. | Four primaries at full strength — the retired anchor. | reported |
| **Figures** | None, one, or two equals (social register only). | Zero or one. Faces are always blank or one dot per eye. | Crowds, detailed facial features, mascots. | eye |

**Temperature.** No ratio scores this axis: warm-share-of-colour is blind to quantity and ranked a spare image above a dense golden one. Perceived warmth is warm coverage combined with light and density.

**Density.** Density is FELT in shape count and detail, and open-ground percentage tracks it only loosely. In the shipped exemplars the hero measures MORE open ground than the spot (34.7% against 25.1%) while looking plainly denser — a detailed desk with a lamp, books and a poster against a few large shapes and a quiet half-frame. Two samples are not a range; they are enough to show the number cannot define the register. Read it as a drift signal.

### Raster or vector

- **Raster.** Owns warmth, light and human presence. It cannot hit an exact brand hex — across every raster measured, the closest Cobalt landed at colour distance 33 — so its palette rule is a stated tolerance, never an exactness claim. Depth is permitted while it stays illustration.
- **Vector.** Owns exact palette, strict flatness and product accuracy: the author types the hex. Tints are lighter SOLID hexes, never fill-opacity — a translucent fill over a coloured ground composites to a colour in no palette (Amber at 60% over Teal reads olive, and a hue-family checker passes it).
- **Choosing.** Warmth, mood, human presence, marketing scenes → raster. Exact brand colour, schematic product, in-guide primitives, anything that must be edited later → vector.

### Reference images

A reference image is a CONTENT channel, not a style channel: its pull scales with how compatible its content is with the prompt. The prompt sets the level; the reference narrows variance toward itself.

- **none** — A new composition — the default. The register sentence alone sets the level, and nothing bleeds in.
- **cross-subject** — A batch that must feel like one campaign. Style steadies and variance narrows; expect motifs from the reference to echo, which inside one campaign reads as cohesion.
- **same-subject** — A variant of an image that already exists. The render collapses onto the reference — three of three draws reproduced it object-for-object. Cloning is the feature here and a defect everywhere else.

### Checklist — Report, never gate.

Reported for every render: largest open ground area · neutral grey filler share · primaries at full saturation · hero lead ratio · top colours by area, named.

A crude flat image scores perfectly while being incoherent, and a render that broke the warm-ground rule scored best of its round. Numbers describe an image so drift is visible over time; they never decide whether it ships. Every render is opened and looked at before any claim is made about it.

### Never

- **Mascots or character cartoons** — Spectrea is a mentor, not a pet.
- **Stock photography** — Warmth comes from the palette and the light in generated scenes, not from stock imagery.
- **Outlines or line art** — Every shape is filled. A stroke that survives a trace is a defect, not a style.
- **Off-palette gradients and neon** — The palette is the identity; a colour outside it is a different brand.
- **Bauhaus limb-figures** — The retired SpectreaFigure illustrated the opposite of the product's composability promise.
<!-- /generated:illustration-system -->

---

## 10. Motion

### Philosophy
<!-- generated:motion-philosophy -->
Purposeful, subtle, natural — and alive. Every animation answers "what does this help the user understand?" — if the answer is "nothing," remove it. Most interactive motion stays restrained (150–300ms hovers, focus, state changes). Three signature primitives below carry the brand's "alive, growing, compounding" claim — used purposefully, not decoratively.
<!-- /generated:motion-philosophy -->

### Durations
<!-- generated:motion-durations -->
- 100 ms — micro (hover tints, colour shifts)
- 150 ms — standard (UI transitions, dropdowns)
- 200 ms — comfortable (modals, slide-overs)
- 300 ms — deliberate (page transitions, choreographed sequences)
- 400 ms — arrival (the Arrival signature primitive)
- 300 ms — formation (the Formation signature primitive)
- 600 ms — spectrumSweep (the Spectrum sweep signature primitive)
<!-- /generated:motion-durations -->

### Easing
<!-- generated:motion-easing -->
- `ease-out` (`cubic-bezier(0, 0, 0.2, 1)`) — default for things entering or settling.
- `ease-in-out` (`cubic-bezier(0.4, 0, 0.2, 1)`) — for back-and-forth movements, continuous animations.
- `elastic-settle` (`cubic-bezier(0.34, 1.56, 0.64, 1)`) — the Arrival primitive — scale-in with soft elastic settle.
- Never use linear (feels mechanical) or ease-in alone (feels like something is wrong).
<!-- /generated:motion-easing -->

### Signature motion primitives (three)
Three brand-distinctive motion patterns. Reusable across any Spectrea surface — used at meaningful moments, not decoratively. Each carries one part of the *alive, growing, compounding* brand claim.

<!-- generated:signature-primitives -->
**1. Arrival (400ms).** When something important enters the frame — a new card, a fresh result, an inserted item. Spec: scale from 0 with soft elastic settle (`cubic-bezier(0.34, 1.56, 0.64, 1)`), then a brief radial pulse in a brand spectrum colour. Reads as "something just arrived and is alive."

**2. Formation (300ms).** When two things visibly connect — a line, a link, a relationship being shown. Spec: a curved stroke draws between two points with the spectrum gradient running along the line (`stroke-dashoffset` animation on an SVG path with a linear gradient stroke), then settles to its resting colour. Echoes the Bézier curve in the brand mark.

**3. Spectrum sweep (600ms).** The brand's signature moment — used sparingly when something meaningful happens that deserves the brand's full voice. Spec: a thin gradient strip (4px tall, ~75% width of its container) traverses Cobalt → Teal → Amber → Rose with `background-position` animation across a 4× wide gradient, fading in at 15% and out at 85%. Spectrea's most distinctive motion. Reserve for moments that genuinely matter — overuse dilutes it.
<!-- /generated:signature-primitives -->

### Animated mark
<!-- generated:logo-animation -->
The connecting-dots loop is the logo's OWN canonical spec (`logo.animation`) — deliberately outside the UI motion tokens:
- Loop: 3 s, infinite. Phases of the timeline: draw to 0.57, hold to 0.6, dissolve to 0.97, then an empty beat until restart. The dissolving edge fades over 15% of the path length.
- Easing: Quadratic phase ease — the draw eases out, the dissolve eases in. The logo's own spec, not one of the UI easing tokens.
- Reduced motion: Under prefers-reduced-motion the loop does not run: the completed mark holds as a static frame.
- Use: Loading states, hero moments, splash. Never inline UI — too prominent.
<!-- /generated:logo-animation -->
Always uses the **full spectrum** (Cobalt → Teal → Amber) — the "reveal" moment.

---

## 11. Components

### Buttons
<!-- generated:buttons-types -->
- **Primary (Cobalt)** — The hero action. One per section. `#4271DF`, White text; hover `#3A63C4` light / `#6E93EC` dark; active `#3255A7` light / `#8FACF0` dark.
- **Secondary** — Supporting actions. Cloud-family fill, Ink-family text (light); Graphite-tint fill, Cloud text (dark). Fills `#F4F4F1` light / `#2E2F35` dark (dark hover `#3A3A40`); text `#18181C` light / `#F4F4F1` dark.
- **Ghost** — Tertiary actions. 2 px stone-300 border, transparent fill; label Slate (light) / stone-300 (dark).
- **Destructive (Rose)** — Irreversible actions. `#F24260`, White text; hover `#D63B55` light / `#F56579` dark; active `#BA3249` light / `#F78892` dark.
- **Confirm (Teal)** — Verify, approve, connect. `#00B6A0`, White text; hover `#009E8A` light / `#20C8B2` dark; active `#008775` light / `#40D4C3` dark.
- **Caution (Amber)** — Override, merge, proceed. `#E19000`, White text; hover `#C58200` light / `#ECA41E` dark; active `#A86E00` light / `#F2B63C` dark.

One Primary button per section maximum. Confirm and Caution are reserved for specific semantic contexts — never as general-purpose actions. White labels at base state ride the ratified exception `semantic-button-labels-white` (ratified 2026-08-07 — see the accessibility exception registry).
<!-- /generated:buttons-types -->

<!-- generated:buttons-spec -->
Common specs: font Lexend Medium 500; default padding `px-4 py-2`, radius 8 px (`rounded-lg`), font-size 14 px; disabled opacity-40, cursor-not-allowed.

Sizes: Compact 32 px (`px-3 py-1.5`, 12 px, `rounded-md`) — Toolbars, tables, dense UI · Default 36 px (`px-4 py-2`, 14 px, `rounded-lg`) — Most contexts · Large 48 px (`px-6 py-3`, 16 px, `rounded-lg`) — Standalone CTAs.

Hover and active darken along the hand-picked ladder — buttons recede into the surface on press. On dark surfaces the button lifts toward the light: hover and active fills lighten, and the label flips from White to Ink #18181C while the fill is lightened. Base states keep white text. Ink-on-lightened-fill contrast, verified 2026-07-04 (cobalt re-lightened 2026-08-08, D40 — the old hover #5C87E5 read APCA Lc 40.5, below the 45 spot line; the new ladder puts every dark transient state at APCA parity): cobalt hover 5.94 / active 7.86, rose hover 5.92 / active 7.50, teal hover 8.40 / active 9.63, amber hover 8.34 / active 9.72 — all ≥ 4.5:1 (AA, normal text).
<!-- /generated:buttons-spec -->

<!-- generated:focus-ring -->
Focus ring: 2px solid, 2px offset (`.btn-focus:focus-visible`) — `#A86E00` light / `rgba(225, 144, 0, 0.7)` dark. Amber "attention" ring. Light surfaces: Amber active #A86E00 (4.21:1 on Canvas, 3.89:1 on Cloud). Dark surfaces: alpha-tinted Amber #E19000 (4.00:1 blended on Ink). Every pairing clears the 3:1 UI floor.

One ring for every focusable — buttons, links, inputs, selects, textareas, and custom controls (.btn-focus / .btn-focus-dark, chosen by rendered surface). The ring is dedicated accessibility chrome — an ephemeral attention-is-here signal outside the colour tiers, never a validation status or decorative accent. Borders never change on focus; validation borders stay visible beneath the ring.
<!-- /generated:focus-ring -->

### Forms
<!-- generated:forms-spec -->
| Property | Value |
|---|---|
| Height | 36 px default, 32 px compact |
| Border | 1 px solid stone-200 (`#E7E5E4`) |
| Radius | 8 px (`rounded-lg`) |
| Padding | `px-3 py-2` |
| Font | Lexend Regular 400, 14 px |
| Placeholder | Pewter `#97979E` |
| Focus | Canonical focus ring (brandTokens.focusRing) — 2 px Amber ring at 2 px offset, outside the border. The border itself never changes on focus; validation borders stay visible beneath the ring. |
| Error | Rose border (`#F24260`) |
| Disabled | Cloud background (`#F4F4F1`) |
<!-- /generated:forms-spec -->

### Cards
<!-- generated:cards-spec -->
Container: 1 px solid stone-200 (`#E7E5E4`), 12 px radius (`rounded-xl`), 20 px padding (`p-5`), Canvas background (`#FDFDFB`). Hover border stone-300 (`#D6D3D1`). Elevated variant: shadow-md — floating elements only; hover may lift to shadow-lg. Grid gap 16 px. Titles: Albert Sans 600 (the heading font).

Cards sit on the Cloud surface — the Canvas-vs-Cloud contrast gives them "home."
<!-- /generated:cards-spec -->

### Layout
<!-- generated:layout-spec -->
- **Sidebar:** 256 px. Fixed width; collapsible on mobile.
- **Top bar:** 40–48 px height. Search + user menu.
- **Content area:** Fluid, scrollable; Cloud (`#F4F4F1`) background.
- **Breakpoints:** Mobile `<640 px` (1 column), Tablet `640–1023 px` (2 columns), Desktop `1024–1279 px` (3 columns), Wide `1280 px+` (4 columns). Grid gap 16 px.
- **Content widths:** Max content width 768 px (max-w-3xl) — Reading-focused pages: docs, settings, forms · Max dashboard width Full width — Dashboards and data views use all available space · Max prose width 65ch (max-w-prose) — Long-form text blocks within any page.
- **Base spacing unit:** 4 px. Every spacing value is a multiple of 4 px. Fine inline elements (badges, compact controls) may use 2 px increments (6 px, 10 px); never arbitrary values like 5 px, 7 px, or 15 px.
- **Elevation:** Z-index values increment by 10 to leave room for intermediate layers. Never use arbitrary z-index values outside this scale. Full ladder in §14.

**Responsive behaviour:**
- **Sidebar collapses to overlay on mobile.** Below 1024 px, the sidebar becomes a slide-over panel triggered by the menu button.
- **Grids collapse to single column.** Below 640 px, all multi-column grids stack vertically. Cards go full-width.
- **Tables scroll horizontally.** Don't hide columns. Wrap the table in a horizontal scroll container with a fade edge.
- **Touch targets: 44 px minimum.** Buttons, links, and interactive elements must be at least 44x44 px on touch devices.
- **Modals become full-screen on mobile.** Below 640 px, modals take the full viewport. No side margins, full-height content.
- **Heading sizes scale down at breakpoints.** Body text stays at 16 px minimum. Headings reduce proportionally — see Typography for the full responsive scaling table.
<!-- /generated:layout-spec -->

---

## 12. Communications

### Voice in action
Every piece of written output — product copy, email, social, presentation slides — follows the same voice formula: clear, specific, warm. Technical language is welcomed when it earns its place ("graph architecture" is fine; "leveraging our graph-based RAG pipeline for vector embeddings" is not).

### Email
- **Signature:** `Logotype` at `fontSize=11`, `colorMode="ink"`, `color="#212226"`, followed by "| We connect the dots."
- **Transactional header:** `LogotypeGradient` at `fontSize=13` on Canvas.
- **Marketing header (dark):** `LogotypeGradient` at `fontSize=13` on Ink. No `wordmarkColor` override.
- **Body typography:** Lexend 400, `16 px`, Ink on Canvas.

### Social media
- **Avatar:** gradient mark at 400×400 px (square, no crop).
- **Cover images:** brand gradient bar + tagline on Ink background (LinkedIn); gradient bar at bottom with tagline centered (Twitter/X).
- **Bio template:** "We connect the dots. Composable intelligence platform."
- **Quote card:** Ink background, Cloud text, Mist (`#B0B0B6`) attribution, `h-1` brand gradient accent strip at bottom.
- **Stat card:** Ink background, 3 xl Cloud number, Mist (`#B0B0B6`) supporting text, gradient accent strip at bottom.

### Presentations
Your deck lives on Canvas. The warmth is deliberate — it's what keeps a Spectrea talk from feeling like a system briefing. Ink slides earn their place as punctuation: a number that lands, a section break worth pausing on, the closing ask. Think four-fifths Canvas, one-fifth Ink.

- **Default slide background:** Canvas (`#FDFDFB`). Carries the everyday — opening, agenda, content, data, close — roughly 80%+ of any deck. Add a soft corner wisp of the brand gradient at ~8% opacity so the page breathes rather than sits flat.
- **Ink slide background:** Ink (`#18181C`). Reserved for section dividers, single-stat emphasis, closing CTA. Keep to ≤20% of the deck; contrast works because it's earned, not because it's the default.
- **On Ink slides:** text is Cloud `#F4F4F1`; muted is Mist `#B0B0B6`; accents stay themselves. The wisp lifts to ~14% so the warmth still reads against the dark.
- **Title typography:** Albert Sans 600, 48 px.
- **Body typography:** Lexend 400, 24 px.
- **Accent strip:** brand gradient, 2–4 px tall, at the bottom of title, stat, and divider slides (Canvas or Ink). Leave it off content slides so it keeps its meaning.
- **Logotype, not just the mark, wherever the slide has room.** Centered `LogotypeGradient` on title and closing-CTA slides (the brand's signature hero treatment). Small `Logotype` footer at `fontSize=9`, bottom-left, on content, stat, and divider slides (`colorMode="ink"` on Canvas with `color="#97979E"`; `colorMode="white"` on Ink with `color="#B0B0B6"`). The bare mark is for favicons and tight spaces — not deck hero moments.

### Trust & disclosures
Trust, security, and compliance masters are **internal-tier** (canon `internalCanon`, ratified 2026-08-13): they are brand-voice drafts pending a counsel read, not approved external copy, so they are not published here. Request them through the internal brand hand-off; never author them freehand.

### Executive voice
Founder and executive surfaces — bylines, talks, investor letters, interviews, personal social — use the same voice formula in the first person. Speak as a practitioner who builds and uses the product: concrete observations, shown work, named trade-offs. No corporate we-speak, no vision without evidence.

| Right | Wrong |
|---|---|
| *"I kept watching decisions we'd already settled get re-argued three months later, because nobody could find why we'd decided. That's the problem Spectrea started from."* | *"We're thrilled to announce the next chapter in our journey to revolutionize how the world works with knowledge."* |

The right version is a practitioner's observation — first person, specific, checkable. The wrong version is corporate we-speak built on a neverUse word. The brand's origin stance is **decided (Darren, 2026-07-03): codified silence** — the brand stays silent on origin — no origin claims, no locality framing ("engineered in Singapore" or similar), on any surface. Do not originate origin copy.

---

## 13. Governance

### The simple test
If you need to ask "is this OK?" — it probably isn't. The logo should always look exactly like the approved versions on the Variations page. When in doubt, use the primary treatment (grey dots, Cool-Duet stroke) on Canvas — that's always correct.

### Change process
<!-- generated:change-process -->
1. **Propose** (Proposer) — Document the change, the reason, and the impact — with visual mockups where applicable.
2. **Review** (Lead) — The relevant lead (Design or Content) reviews and may request revisions; the Brand Lead joins for brand-level changes.
3. **Test** (Design) — Apply the change in a staging build and verify it across contexts: light/dark, mobile/desktop, print/digital.
4. **Ratify & version** (Brand Lead) — Brand Lead approves. The change lands in src/data/brand.ts with a meta.version bump; brand decisions also get a ratificationLedger entry.
5. **Regenerate & communicate** (Design + Dev) — Run npm run generate:all so the guide, contract, agent rules, assets, and PDF follow, then announce in #brand. The durable changelog is the git history of the spectrea-branding repo.

One canonical process (`meta.changeProcess`, merged 2026-08-09) — the Governance page of the live guide renders these same five steps. Change severity sets each step's depth and approval weight, never which steps happen.
<!-- /generated:change-process -->

### Owner
<!-- generated:source-of-truth -->
Brand lead owns the brand system. "brand.ts is the canonical brand data. The app renders it; the guide (brand-guide.md), llms.txt, the PDF, and generated assets are derived mirrors. On any conflict, brand.ts wins. Capability claims are anchored to the ratified product vision; every buyer-facing capability claim is checked against the product roadmap before it ships. Execution status is tracked there, never here — this file is the brand, not the release note." (`meta.sourceOfTruth`, quoted verbatim.)
<!-- /generated:source-of-truth -->

Brand decisions live in the **ratification ledger** (`ratificationLedger` in `brand.ts`): a decision recorded only in a consumer repo's AGENTS.md is not canon until it lands in the ledger. The ledger itself is internal-tier (see below) — it is the reasoning behind the brand rather than the brand — so the record renders to the internal artefacts, while the decisions stay traceable in the branding repo's commit history.

### Internal tier

<!-- generated:internal-tier -->
Fields listed here render only to internal/ artefacts. Adding a field is a ledger decision; generators must consult this registry, and a public artefact carrying an internal field is a build defect.

Registered fields: `trustCopy` · `brand.positioning.fullShapeClaim` · `brand.differentiatorGuardrail` · `brand.antiBrands` · `brand.audienceMechanics` · `ratificationLedger`.

The internal-tier fields named with this rule are absent from every public artefact by design, not by omission. If you are working from a vendored snapshot, do not reconstruct them from an older snapshot, a cached copy, or memory, and never author replacements freehand — trust, security, and compliance wording is counsel-gated. When a surface genuinely needs one, request the internal brand hand-off (the internal/ artefacts, delivered locally) instead of inventing it.
<!-- /generated:internal-tier -->

---

## 14. Resources

### CSS tokens
<!-- generated:css-tokens -->
The complete generated token sheet — the same file served at [`/spectrea-tokens.css`](/spectrea-tokens.css) and on the Downloads page:

```css
/* Spectrea design tokens — GENERATED from src/data/brand.ts v2.15.0 (2026-08-18) — do not hand-edit; regenerate with npm run generate:assets. */
:root {
  /* Spectrum — first accent in canon order is the brand colour */
  --color-brand: #4271DF;
  --color-brand-teal: #00B6A0;
  --color-brand-amber: #E19000;
  --color-brand-rose: #F24260;

  /* Warm Blend neutrals — every non-accent palette entry, canon order */
  --color-graphite: #212226;
  --color-canvas: #FDFDFB;
  --color-cloud: #F4F4F1;
  --color-ink: #18181C;
  --color-iron: #46464B;
  --color-slate: #6D6D72;
  --color-pewter: #97979E;

  /* Bridge washes (light) — text on a wash uses its textOn value, never the raw accent */
  --wash-cobalt: #EDF0F8;  --wash-cobalt-text: #1E3A8A;
  --wash-teal: #E6F5F3;  --wash-teal-text: #0D5E56;
  --wash-amber: #F5F0E6;  --wash-amber-text: #7C4D04;
  --wash-rose: #FDF0F2;  --wash-rose-text: #9F1239;

  /* Dark surfaces (parallel mode — role-inverted; names + roles from colorSystem.darkRoles) */
  --dark-canvas: #18181C;   /* Ink — Page background on dark */
  --dark-cloud: #212226;   /* Graphite — Elevated surface on dark */
  --dark-ink: #F4F4F1;   /* Cloud — Primary text on dark */
  --dark-mist: #B0B0B6;   /* Mist — Muted text on dark */
  --dark-fog: #2E2F35;   /* Fog — Border / divider on dark */

  /* Dark bridge washes */
  --dark-wash-cobalt: #1B2440;
  --dark-wash-teal: #0E2E2A;
  --dark-wash-amber: #2E2410;
  --dark-wash-rose: #2E1218;

  /* Accent dark-lifts (long-form coloured text on dark only) */
  --cobalt-lift: #7A9AEF;
  --teal-lift: #3DD3BF;
  --amber-lift: #F2AE40;
  --rose-lift: #F97587;

  /* Accent text tones (coloured text on LIGHT surfaces — raw accents fail the 4.5:1 text floor) */
  --teal-text: #007D6E;
  --rose-text: #BA3249;

  /* Button states — light surfaces */
  --btn-cobalt: #4271DF;  --btn-cobalt-hover: #3A63C4;  --btn-cobalt-active: #3255A7;
  --btn-rose: #F24260;  --btn-rose-hover: #D63B55;  --btn-rose-active: #BA3249;
  --btn-teal: #00B6A0;  --btn-teal-hover: #009E8A;  --btn-teal-active: #008775;
  --btn-amber: #E19000;  --btn-amber-hover: #C58200;  --btn-amber-active: #A86E00;
  --btn-secondary-bg: #F4F4F1;  --btn-secondary-text: #18181C;

  /* Button states — dark surfaces (transient fills lighten; their label flips to the transient text colour) */
  --btn-dark-cobalt: #4271DF;  --btn-dark-cobalt-hover: #6E93EC;  --btn-dark-cobalt-active: #8FACF0;
  --btn-dark-rose: #F24260;  --btn-dark-rose-hover: #F56579;  --btn-dark-rose-active: #F78892;
  --btn-dark-teal: #00B6A0;  --btn-dark-teal-hover: #20C8B2;  --btn-dark-teal-active: #40D4C3;
  --btn-dark-amber: #E19000;  --btn-dark-amber-hover: #ECA41E;  --btn-dark-amber-active: #F2B63C;
  --btn-dark-secondary-bg: #2E2F35;  --btn-dark-secondary-hover: #3A3A40;  --btn-dark-secondary-text: #F4F4F1;
  --btn-dark-transient-text: #18181C;

  /* Focus ring — Amber "attention" ring */
  --focus-ring-light: #A86E00;
  --focus-ring-dark: rgba(225, 144, 0, 0.7);
  --focus-ring-width: 2px;
  --focus-ring-offset: 2px;

  /* Typography */
  --font-heading: 'Albert Sans', sans-serif;
  --font-body:    'Lexend', 'Inter', sans-serif;
  --font-mono:    'JetBrains Mono', monospace;

  /* Type scale — size, line-height, and weight per step */
  --text-display: 48px;  --text-display-lh: 1.1;  --text-display-weight: 600;  /* Hero headlines, landing-page titles */
  --text-h1: 36px;  --text-h1-lh: 1.2;  --text-h1-weight: 600;  /* Page titles */
  --text-h2: 30px;  --text-h2-lh: 1.25;  --text-h2-weight: 600;  /* Major section headings */
  --text-h3: 24px;  --text-h3-lh: 1.3;  --text-h3-weight: 600;  /* Sub-section headings, card titles */
  --text-h4: 20px;  --text-h4-lh: 1.4;  --text-h4-weight: 600;  /* Minor headings, dialog titles */
  --text-h5: 18px;  --text-h5-lh: 1.4;  --text-h5-weight: 600;  /* Sidebar section titles */
  --text-body-lg: 18px;  --text-body-lg-lh: 1.6;  --text-body-lg-weight: 400;  /* Lead paragraphs */
  --text-body: 16px;  --text-body-lh: 1.6;  --text-body-weight: 400;  /* Default body text */
  --text-body-sm: 14px;  --text-body-sm-lh: 1.5;  --text-body-sm-weight: 400;  /* Secondary text, table cells, form inputs */
  --text-caption: 12px;  --text-caption-lh: 1.5;  --text-caption-weight: 500;  /* Labels, timestamps, helper text */
  --text-overline: 12px;  --text-overline-lh: 1.5;  --text-overline-weight: 600;  /* Section labels (uppercase + 0.05em tracking) */
  --text-code: 14px;  --text-code-lh: 1.5;  --text-code-weight: 400;  /* Inline code, data values, type labels (JetBrains Mono) */
  --text-code-sm: 12px;  --text-code-sm-lh: 1.5;  --text-code-sm-weight: 400;  /* Trace details, technical metadata (JetBrains Mono) */

  /* Radii */
  --radius-sm: 4px;  /* Tags, badges, inline code */
  --radius-md: 6px;  /* Compact buttons, small controls */
  --radius-lg: 8px;  /* Buttons, inputs, dropdowns */
  --radius-xl: 12px;  /* Cards, panels, modals (default container) */
  --radius-2xl: 16px;  /* Hero sections, large feature cards */
  --radius-full: 9999px;  /* Avatars, spectrum tags, toggles */

  /* Spacing — 4 px base unit */
  --space-2xs: 4px;  /* p-1 — Tight inline, icon gaps */
  --space-xs: 8px;  /* p-2 — Input / badge padding, compact gaps */
  --space-sm: 12px;  /* p-3 — Compact card padding, list-item gaps */
  --space-md: 16px;  /* p-4 — Default content gap, section padding */
  --space-lg: 20px;  /* p-5 — Default card padding, modal padding */
  --space-xl: 24px;  /* p-6 — Section spacing, form-field gaps */
  --space-2xl: 32px;  /* p-8 — Major section breaks */
  --space-3xl: 48px;  /* p-12 — Page top padding, hero spacing */
}

/* Elevation — z-index steps; shadows are Tailwind classes.
   Base 0 (none) ·
   Raised 10 (shadow-sm) ·
   Dropdown 20 (shadow-md) ·
   Modal 30 (shadow-lg) ·
   Overlay 40 (shadow-xl) ·
   Toast 50 (shadow-lg) */

/* Brand gradient — OKLCH with sRGB fallback for cross-browser safety. */
.brand-gradient {
  background: linear-gradient(135deg, #4271DF, #00B6A0, #E19000);
}
@supports (background: linear-gradient(in oklch, red, blue)) {
  .brand-gradient {
    background: linear-gradient(135deg in oklch, #4271DF, #00B6A0, #E19000);
  }
}
```
<!-- /generated:css-tokens -->

### Radii
Six tokens. Container `xl` (12 px) is the default; buttons and inputs land on `lg` (8 px); everything else pegs to this scale.

<!-- generated:radii -->
| Token | Value | Tailwind | Use |
| --- | --- | --- | --- |
| sm | 4 px | `rounded` | Tags, badges, inline code |
| md | 6 px | `rounded-md` | Compact buttons, small controls |
| lg | 8 px | `rounded-lg` | Buttons, inputs, dropdowns |
| xl | 12 px | `rounded-xl` | Cards, panels, modals (default container) |
| 2xl | 16 px | `rounded-2xl` | Hero sections, large feature cards |
| full | 9999 px | `rounded-full` | Avatars, spectrum tags, toggles |
<!-- /generated:radii -->

### Spacing
<!-- generated:spacing -->
4 px base unit. Every spacing value is a multiple of 4 px. Fine inline elements (badges, compact controls) may use 2 px increments (6 px, 10 px); never arbitrary values like 5 px, 7 px, or 15 px.

| Token | Value | Tailwind | Use |
| --- | --- | --- | --- |
| 2xs | 4 px | `p-1` | Tight inline, icon gaps |
| xs | 8 px | `p-2` | Input / badge padding, compact gaps |
| sm | 12 px | `p-3` | Compact card padding, list-item gaps |
| md | 16 px | `p-4` | Default content gap, section padding |
| lg | 20 px | `p-5` | Default card padding, modal padding |
| xl | 24 px | `p-6` | Section spacing, form-field gaps |
| 2xl | 32 px | `p-8` | Major section breaks |
| 3xl | 48 px | `p-12` | Page top padding, hero spacing |
<!-- /generated:spacing -->

### Elevation
Six levels. Z-index increments by 10 to leave room for intermediate layers.

<!-- generated:elevation -->
| Level | z-index | Shadow | Use |
| --- | --- | --- | --- |
| Base | 0 | — | Page content, cards, sections |
| Raised | 10 | `shadow-sm` | Sticky headers, toolbars |
| Dropdown | 20 | `shadow-md` | Dropdowns, popovers, tooltips |
| Modal | 30 | `shadow-lg` | Modals, dialogs, slide-overs |
| Overlay | 40 | `shadow-xl` | Modal backdrops, full-screen overlays |
| Toast | 50 | `shadow-lg` | Notifications, toasts |

Z-index values increment by 10 to leave room for intermediate layers. Never use arbitrary z-index values outside this scale.
<!-- /generated:elevation -->

### Icon library
Tabler Icons via `react-icons/tb` — outline and filled from one library. 2 px stroke, round caps/joins, 24×24 grid.

### Fonts
Three faces, all SIL Open Font License 1.1 — originally from Google Fonts, and **self-hosted** by this guide and by any Spectrea surface: serve the woff2 files yourself rather than linking a font CDN, so rendering type costs a visitor nothing in third-party requests. The files this site serves are in `/fonts`, with their licence at [`/fonts/OFL.txt`](/fonts/OFL.txt).

- [Albert Sans](https://fonts.google.com/specimen/Albert+Sans) (weights 600, 700)
- [Lexend](https://fonts.google.com/specimen/Lexend) (weights 300, 400, 500, 600)
- [JetBrains Mono](https://fonts.google.com/specimen/JetBrains+Mono) (weight 400)

---

<!-- generated:version-footer -->
*`src/data/brand.ts` is the canonical brand data (v2.15.0, 2026-08-18). The live app at [branding.spectrea.com](https://branding.spectrea.com/#/) renders it; this document, llms.txt, the PDF, and the generated assets are derived mirrors for offline and LLM-readable use. If surfaces ever disagree, brand.ts wins.*
<!-- /generated:version-footer -->
