Archetype spec · Enterprise / Product

Sentinel

An enterprise-grade design system for monitoring tools, dashboards, and data-dense products. Clear, helpful, respectful of expertise.

Version 1.0 Date 2026-04-27 Mode Light-first + dark WCAG target AA (AAA on primary body) Typeface Inter · Fixed px · 14px base Density Compact · 4px base

§1.1

Color system

Two-layer architecture: Layer 1 primitive ramps + Layer 2 semantic aliases. Components reference only Layer 2.

Layer 1 — Primitive ramps

Primary navy (anchor 700 = #1B2A4A)

50
100
200
300
400
500
600
700
800
900

Accent orange — CTA anchor 500 = #FF9900 — bg-only, never text on light surface

50
100
300
500
700
900

Success

50
100
300
500
700
900

Warning

50
100
300
500
700
900

Error

50
100
300
500
700
900

Neutral warm gray (workhorse)

50
100
200
300
400
500
600
700
800
900

Layer 2 — Semantic aliases

Text tokens

--text-primary
--text-secondary
--text-tertiary
--text-disabled
--text-link

Surface tokens

--surface-page
--surface-card
--surface-sunken
--surface-sidebar
--surface-header

Border + focus tokens

--border-subtle
--border-default
--border-strong
--border-focus
--color-focus-ring

Accent-CTA rule

The Accent-CTA Rule — Sentinel keystone

--color-accent-500 (#FF9900) is a background color only. Never use it as text color on light surfaces. Primary CTA = orange bg + dark text (#1C1917). Ratio: 7.0:1 AAA.

Run critique (7.0:1 AAA)
White on orange FAIL 2.30:1

WCAG accessibility verification

Swatch Foreground Background Ratio Status Use case
neutral-900surface-page16.75:1AAABody text on page
neutral-900surface-card18.10:1AAABody text on card
neutral-700surface-page9.73:1AAASecondary text
neutral-500surface-page4.58:1AATertiary / helper text
link-500surface-card5.74:1AALink text
neutral-900accent-5007.00:1AAACTA label — dark text on orange
#FFFFFF whiteaccent-500 #FF99002.30:1FAILBANNED — white-on-orange forbidden
#FFFFFFerror-5004.56:1AADestructive button label
neutral-50surface-header19.50:1AAAHeader / sidebar text
success-700success-1005.92:1AASuccess badge
error-700error-1008.14:1AAAError badge
warning-700warning-1005.53:1AAWarning badge

§1.2

Typography

Fixed px modular scale (ratio 1.125). Inter only — no serif, no fluid clamp(). Base 14px. Tabular numerals required on all data columns.

Type scale — 12 steps

TokenpxWeightLeadingUseSample
--text-h1347001.20Page title (max in Sentinel)Dashboard
--text-h2307001.20Major section, entity page titleIssues
--text-h3266001.30Subsection headingCritical alerts
--text-h4226001.30Card title, dialog titleConfirm deletion
--text-h5206001.30Sidebar headersSettings
--text-h6185001.50Inline group headersNotification preferences
--text-body-lg164001.60Hero paragraphsConfigure your workspace
--text-body144001.50DEFAULT — UI, forms, tablesStatus: active · Updated 2h ago
--text-body-sm134001.50Dense UI, table cellsAPI endpoint · v2.1.0
--text-caption124001.50Metadata, timestamps3 minutes ago · 128 KB
--text-overline127001.50Section labels (small caps + tracking)Foundation
--text-code134001.50Monospace codeGET /api/v2/issues

Tabular numerals demo

Required on every numeric column

Apply font-feature-settings: "tnum" 1, "lnum" 1. Digits align vertically regardless of value width — critical for scanning tables with 50+ rows.

MetricProportionalTabular (required)
Requests / s1,111.001,111.00
Errors / s999.11999.11
Latency p95 (ms)1,024.501,024.50
Uptime (%)99.9799.97

§1.3

Spacing

Compact density. 4px base, 12-step scale. Section padding 24px standard. Page horizontal padding 32px.

TokenpxVisualUse case
--space-252
Tight icon-text gap
--space-504
Inline gap, badge padding
--space-756
Badge inner padding
--space-1008
DEFAULT gap
--space-15012
Form field internal, table cell v-padding
--space-20016
Card padding, between fields
--space-30024
Section padding (standard)
--space-40032
Page horizontal padding
--space-50040
Page top spacing
--space-60048
Major breakpoint (rare)
--space-80064
Header/sidebar offset
--space-100080
Full-page hero (rare in product UI)

§1.4

Elevation

Flat with hairline borders by default. Cold rgba shadows for floating elements only. Warm oklch shadows are banned (that is Harbor).

TokenValueUse caseDemo
--shadow-0 none + 1px border Card default — flat surface
--shadow-1 0 1px 2px rgba(0,0,0,0.05) Card:hover, card raised (above sunken bg)
--shadow-2 0 2px 4px rgba(0,0,0,0.08) Dropdown popover
--shadow-4 0 4px 8px rgba(0,0,0,0.10) Tooltip, menu popover
--shadow-8 0 8px 16px rgba(0,0,0,0.12) Dialog, modal, command palette
--shadow-16 0 16px 32px rgba(0,0,0,0.16) Drag preview, drawer

Cold rgba only

Sentinel uses rgba(0,0,0,*) shadows. Warm oklch or colored shadows are a Harbor trait. A shadow in Sentinel always means "this element floats above the page." Default surfaces use borders, not shadows.

§1.5

Shape & borders

8-step radius scale. Default --radius-sm (4px) for cards, alerts, inputs. Pill shape for chips and filters. Circle for avatars and annotation pins.

TokenValueUse caseDemo
--radius-none0Table cells, sticky headers
--radius-xs2pxBadges, severity pills (small)
--radius-sm4pxDEFAULT — cards, alerts, inputs
--radius-md6pxButtons, switches
--radius-lg8pxPrimary buttons (Amazon-style CTA)
--radius-xl12pxDialogs, drawers, command palette
--radius-pill9999pxChips, removable filters
--radius-circle50%Avatars, annotation pins

Banned radius patterns

Super-rounded cards (>16px) feel playful, not enterprise. Pill-rounded buttons belong to Current (consumer/mobile). Every surface has a specific radius — do not override with arbitrary values.

§1.6

Motion

Functional motion only — state, position, visibility changes. Never decorative. prefers-reduced-motion: remove transforms, keep instantaneous opacity only.

Durations

TokenmsUse
--duration-shortest100Hover color, icon swap
--duration-short150DEFAULT — buttons, dropdowns, toggles
--duration-standard200Dialog open/close, drawer slide
--duration-long300Page transitions, major state changes

Easings

TokenCurveUse
--easing-standard0.4, 0, 0.2, 1Default all transitions
--easing-enter0, 0, 0.2, 1Elements entering (decelerate)
--easing-exit0.4, 0, 1, 1Elements exiting (accelerate)

Banned motion patterns

Bouncing / overshoot easing on UI, decorative flourishes on data updates, parallax, scroll-jacking, animated gradient backgrounds, marquee, rotating headlines. The principle: 150ms says "the system responded." Anything longer says "the system thinks slowly."

§1.7

Iconography

Family: Lucide — the modern enterprise / SaaS convention. Tailwind, Vercel, Linear, Notion, Supabase and modern dashboards converge on it. Neutral, functional, instantly recognizable. 2px stroke matches Sentinel's compact density. Substitute Material Symbols (Google enterprise default) if Lucide is unavailable. Never Phosphor (too editorial) or Tabler (too monospace-tool — that is Lattice).

PropertyValueRationale
FamilyLucideEnterprise/SaaS standard — Vercel, Linear, Notion, Tailwind UI
Grid24px standard · 16px dense table/inline · 20px buttonsConsistent optical weight across UI densities
Stroke2px at 24px · 1.5px at 16px · rounded caps + joinsNever mix stroke widths in one icon group
ColorcurrentColor — inherit from parentNever hardcode hex in SVG attributes
StyleLine icons default · Filled for severity / status onlyFill encodes meaning (critical = filled triangle, info = filled circle)
Decorativearia-hidden="true"Screen readers skip decorative icons
Meaningfulrole="img" + <title>Standalone icons need accessible name

Sample icon grid — 16 Lucide icons at 24px, line style

home
search
menu
x (close)
check
arrow-down
chevron-right
info
alert-triangle
x-circle
file-text
upload
shield
user
settings
grid

Filled severity variants (fill encodes meaning)

critical
high
medium
low / pass
info

§2

Voice & content

Three pillars: clear, helpful, respectful of expertise. Sentence case everywhere. Verb-first CTAs. No marketing fluff in product UI. No exclamation marks.

Do / Don't pairs

Do

"Upload a screenshot to get started."

Direct, action-oriented, no drama.

Don't

"Let's embark on your design journey!"

Marketing fluff in product UI. User is doing work, not being sold to.

Do

"Contrast ratio 3.1:1 — fails WCAG AA for body text."

Respects reader's expertise. Specific, actionable.

Don't

"Your colors might not be accessible (that's bad!)"

Condescending, vague, and uses an exclamation mark.

Do

"Upload failed. The file is over 10 MB. Try compressing it."

What / Why / How — gives recovery, not just failure notification.

Don't

"Error: Invalid file."

No context, no recovery path. User doesn't know what to do next.

Do

"Save changes" / "Delete report" / "Run critique"

Verb + object. Specific. Sentence case.

Don't

"Submit" / "Apply" / "OK" / "Click here"

Zero specificity. Sentence case "Submit" is still vague.

Do

Email address (required)

Parenthetical "(required)" is screen-reader friendly and clear.

Don't

Email address *

Asterisk-only required indicator fails a11y without extra aria markup. Also never floating-label it.

Do

"Saved." / "Deleted 3 reports."

Declarative. Calm. Respectful of the user's focus.

Don't

"Saved!" / "Great choice!" / "Awesome!"

Exclamation marks are banned in Sentinel product UI. Tonal mismatch.

Error message formula

What / Why / How — universal formula

Every error follows this structure: What happened (plain language) → Why it failed (the cause) → How to recover (concrete, doable action). Banned: stack traces in user-facing copy, generic "Oops!", error codes without explanation.

§3.F

Foundation components

Layer 1 primitives: Button, Icon button, Field, Selection controls, Tag/Badge, Chip, Avatar. All generated in this priority order.

Button — 4 variants × 3 sizes × all states

Size variants — primary (orange bg + dark text — accent-CTA rule)

All variants — md size

States

Icon button — sm / md / lg — ghost + tooltip

Refresh — R
Filter
Settings — ⌘,

Field — text / with icon / error / disabled / select

Used for notifications and login.

Password must be at least 8 characters. Add 5 more characters.

Contact admin to rotate this key.

Selection controls — checkbox / radio / switch

Checkboxes

Radios

Switches

Email notifications
Slack alerts
SMS (disabled)

Tag / Badge — variants + sizes

Neutral Active Pending Failed Info New 99+
sm neutral sm active sm failed 12

Chips — static / removable / selected / icon-leading

Design Critical Accessibility Assignee: Sarah WCAG AA

Avatars — sm / md / lg / xl + photo / initials

IS
sm 24px
SK
md 32px
AR
lg 48px
JD
xl 96px
icon fallback

§3.C

Composite components

Layer 2: Card variants, Alert, Toast, Tooltip, Dialog, Drawer, Tabs, Loading, Dropdown, Date picker mock, Command palette, Code block.

Card — 4 variants

Flat (default)

Response time

142 ms

p95 · last 1h

Raised

Error rate

0.02%

Interactive (hover)

API endpoints

24

View all →

Selected (left-border accent)

Active alerts

7

Alert — info / success / warning / error

Scheduled maintenance

The API will be unavailable on 2026-05-01 from 02:00–04:00 UTC. Plan accordingly.

Deployment succeeded.

Version 2.4.1 is live. 0 errors in the last 5 minutes.

Toast notifications

Report saved.
Export failed — connection timed out.

Tabs — line style with badge counts

Tab panel content renders here. Use ArrowLeft / ArrowRight to cycle tabs, Home / End for first / last.

Loading states — spinner / progress bar / skeleton

Spinner 24px
Analyzing screenshot… 68%

Skeleton (matches content shape)

Command palette (⌘K)

Refresh dashboard R
New report N
Open settings ,
Switch workspace W

Code block — default / dark variant

Default (surface-sunken bg)

contrast.ts
function contrastRatio(l1: number, l2: number): number {
  const lighter = Math.max(l1, l2);
  const darker  = Math.min(l1, l2);
  return (lighter + 0.05) / (darker + 0.05);
}

Dark variant (dev paste into Slack/docs)

sentinel.tokens.css
--text-primary: var(--color-neutral-900);
--surface-card: #FFFFFF;
--border-focus: var(--color-accent-500);

§3.D

Domain layer components

Product-specific composites: Severity badge, Annotation pin, Critique card, Dropzone, Charts. Each composes Layer 1–3 with Sentinel rules.

Severity badges — all 5 levels (color + icon + text)

Critical High Medium Low Info

Annotation pins

1
2
3
4

Screenshot canvas

1 Critical — Missing alt text
2 High — Low contrast 2.1:1
3 Medium — Missing focus ring
4 Low — Touch target 32px

Critique card

Critical WCAG 1.4.3 Color contrast #C-0042

Button label fails contrast at 2.30:1

The primary CTA uses white text (#FFFFFF) on the orange accent (#FF9900). This combination produces a contrast ratio of 2.30:1, which fails WCAG 2.1 SC 1.4.3 AA (requires 4.5:1 for normal text).

Suggested fix

Replace color: #FFFFFF with color: #1C1917 on the orange button. Dark text on orange achieves 7.0:1 AAA. This is the Sentinel accent-CTA rule.

Dropzone

Drop a screenshot here

PNG, JPG, WebP · Max 10 MB · or

Charts mock (categorical palette)

Bar chart — issues by severity (with legend)

Crit
High
Med
Low
Info
Critical (8)
High (5)
Medium (7)
Low (4)
Info (2)

§3.L

Application layouts

Every product page is one of these six layouts. The system assembles into a layout, never invents new chrome.

L1 — Page shell (app frame)

Header (navy #0A1428) — brand + nav + actions
Sidebar
(#1B2A4A)
Main content
(scrolls independently)

L2 — List + Detail

Header
Nav
List
320–400px
Detail pane

L3 — Full-width dashboard

Header
Nav

L4 — Split panel (60/40)

Header
Primary (60%)
Secondary (40%)

L5 — Focus mode / Wizard

Step header (progress)

L6 — Empty app state

Header
Nav

§3.K — NEW

Keyboard-first interaction

Sentinel users spend hours per day in the product. Keyboard fluency is a productivity multiplier. Less aggressive than Lattice's terminal-grade doctrine, but more rigorous than Harbor / Current / Meridian. Mouse remains first-class.

Standard shortcut map

KeyActionContextSentinel rule
⌘K / Ctrl+K Open command palette Global (any screen) Must include every UI-reachable action — not a separate feature set
⌘/ / Ctrl+/ Keyboard shortcut help overlay Global Required — users need discoverability of all shortcuts
⌘F / Ctrl+F Focus search input Pages with search Intercept before browser default; restore on Esc
⌘↵ / Ctrl+Enter Submit / commit action Dialogs, forms, inline editors Submits from any focused field — Tab order must not break this
Esc Close dialog / drawer / popover; clear focus Floating elements Returns focus to the trigger element
Tab / Shift+Tab Navigate forward / back through focusable elements All Tab order matches DOM / visual order — no tabindex tricks
Navigate within tabs, radio groups, menus, data-table rows, dropdowns Composite widgets Roving tabindex pattern — only one item in tab sequence at a time
Home / End First / last item in lists, table cells Lists, tables, menus Required — prevents repeated arrow-key pressing in long lists
Space Activate buttons, toggle switches, select list item Buttons, switches, checkboxes Space selects in dropdowns; Enter activates
Enter Activate links, primary action in dialogs Links, dialogs, table rows Enter opens detail row in data table
Shift+↑↓ Extend row selection in data table Data table with multi-select Contiguous range select from anchor row
⌘A / Ctrl+A Select all rows Data table Triggers bulk action bar; shows count + actions
⌘C / Ctrl+C Copy selected row data Data table TSV format to clipboard for spreadsheet paste

Focus ring — visual specification

Required focus ring (all keyboard-reachable elements)

Focused link

Focus ring spec

3px solid --color-focus-ring = rgba(255,153,0,0.4), outline-offset: 2px. Applied via :focus-visible (not :focus). Pointer interactions do NOT show the ring — only keyboard navigation does.

Sentinel-specific keyboard rules

Command palette (⌘K)

  • Focus trap while open
  • Esc closes, returns focus
  • ↑↓ navigate results
  • Enter executes action
  • Includes ALL UI actions

Data table navigation

  • ↑↓ move between rows
  • Enter opens row detail
  • Space selects row
  • Shift+↑↓ extends range
  • ⌘A selects all visible

Form Tab order

  • Tab advances field to field
  • Shift+Tab goes back
  • ⌘↵ submits from any field
  • Tab order = DOM order
  • No tabindex="2+" tricks

Banned keyboard-breaking patterns

Banned patternWhy it breaks keyboard-firstRequired alternative
Custom focus styling that hides focus ringKeyboard users lose position context — they cannot tell where they are3px --color-focus-ring on all :focus-visible elements
Click-only interactions (drag without keyboard alt)Users who cannot use a mouse are excluded from the feature entirelyKeyboard alternative for all drag-and-drop (button + position input or ↑↓ reorder)
Modal triggers that don't accept keyboard activationThe action exists visually but is unreachable without a mouse<button> elements activate on Enter + Space natively
Hover-only menus:hover fires on mouse; :focus-visible fires on keyboard — both must open the menuMenu opens on both hover and focus+Enter; never :hover-only

§4.1

Data table

The iconic Sentinel component. Sticky header, hoverable rows, sortable columns, tabular numerals on all numeric columns, bulk action bar. 50 rows rendered below.

Tabular numerals on all numeric columns

Every column with numbers uses font-feature-settings: "tnum" 1 and text-align: end. Column headers for numeric columns are right-aligned to match. Zebra striping is banned — use hover state + row dividers instead.

ID Title Severity Status Assignee Score Created

§4.2

Form layout

Single-column. Labels above inputs. 16px between fields, 24px between groups. "(required)" parenthetical — never asterisk-only. Inline validation on blur.

Create API key

Keys grant programmatic access. Store securely — they are shown once.

Use a descriptive name to identify this key later.

Keys with no expiration must be rotated manually.

§4.3

Empty state

Every empty state offers an action (CTA). Helpful, not apologetic. 64px circle icon (surface-sunken bg), h4 heading, 1–2 sentence body, primary CTA. Never a dead end.

No critiques yet

Upload a screenshot to start an accessibility and design review. Results appear here within 30 seconds.

§4.4

Search + filter pattern

Search input (icon-leading) + removable filter chips + sort dropdown — all in one row above data. ⌘F focuses search. Applied filters always visible as chips.

Severity: Critical Status: Open Assignee: IS

Showing 12 of 50 issues · 3 filters applied · Clear all

§4.5

Wizard / Stepper

Top progress with numbered steps and connectors. One step at a time. Sticky footer with Back (left) and Next / primary action (right). Max 5 steps.

Team
2
Configure
3
Integrations
4
Review

Configure severity thresholds

§4.6

Detail header

Entity page header: breadcrumb + title (--text-h2) + status badge + metadata row + right-aligned actions. Page title is always h2 — h1 is reserved for the page shell.

Contrast ratio 2.30:1 on primary CTA

Critical Open
ID C-0002 Score 95 Created 2026-04-02 Assignee SK

§5

Accessibility

WCAG 2.1 AA minimum; AAA target for primary body text. Screen-reader tested on VoiceOver + NVDA. Keyboard navigable throughout. Color + icon + text for all status indicators.

WCAG conformance target

Body text

AAA

≥ 7:1 for primary body

UI text / labels

AA

≥ 4.5:1 minimum

Non-text UI

AA

≥ 3:1 icons, focus rings, charts

Screen-reader requirements

RequirementImplementationTest platform
Icon-only buttonsaria-label required on every icon buttonVoiceOver / Safari macOS
Form fieldslabel[for] above — never placeholder-as-labelNVDA / Firefox Windows
Toast / async resultsaria-live="polite" default; "assertive" for blocking errors onlyVoiceOver / Safari macOS
Decorative SVGsaria-hidden="true"All screen readers
Meaningful SVGsrole="img" + <title>VoiceOver
Status indicatorsColor + icon + text label — never color aloneTalkBack / Chrome Android
Data tablesscope="col" on headers; aria-label on the tableNVDA / Firefox Windows

Keyboard navigation map (summary)

Full shortcut map in §3.K Keyboard-first

The complete keyboard shortcut specification lives at §3.K. This section summarizes the universal gates inherited from governance.spec.

  • Every interactive element reachable via Tab in DOM order
  • Focus indicator visible: 3px --color-focus-ring, offset 2px, via :focus-visible
  • Standard key bindings honored: Enter/Space, Esc, Arrows, Home/End, Tab/Shift+Tab
  • Focus trap inside modals, drawers, command palette — Esc returns to trigger
  • Skip-to-content link at top of page
  • Roving tabindex on tab panels, radio groups, menu bars

Performance budgets (Sentinel tier)

MetricTargetNotes
First Contentful Paint (FCP)< 1.5s4G mobile
Largest Contentful Paint (LCP)< 2.5s4G mobile
Cumulative Layout Shift (CLS)< 0.10Universal
Time to Interactive (TTI)< 3.5s4G mobile
Initial JS bundle (gzipped)< 100 KBSentinel floor
CSS bundle (gzipped)< 30 KBUniversal
Web font payload< 100 KBInter subset + woff2

§6

Versioning & changelog

SemVer (MAJOR.MINOR.PATCH). Deprecated tokens/components ship for 2 MINOR versions before removal. Deprecation warnings logged at build time.

SemVer policy

BumpTriggerExamples
MAJORBreaking token rename, removed component, breaking API changeRenaming --color-accent to --color-cta
MINORNew component, new variant, new token, deprecation noticeAdding keyboard shortcut overlay component
PATCHBug fix, doc update, non-visual refactorFixing focus ring offset in Safari

Changelog

v1.0.0 Current 2026-04-27
  • Initial release — full spec including two-layer token architecture
  • Added KEYBOARD-FIRST INTERACTION section (§3.K) with full shortcut map
  • Added BYOC required color roles — 7 ramps × 9 steps specification
  • Added WHEN TO PICK with sample adjectives and real-world examples
  • Added FAILURE MODES — 5 scenarios with cross-archetype cross-references
  • Iconography rationale strengthened — Lucide retained with explicit rationale
v0.9.0 2026-03-15
  • Domain layer components: Severity badge, Annotation pin, Critique card, Dropzone, Charts
  • Composite components: Command palette, Date picker, Code block
  • Layout system: L1–L6 vocabulary locked

Quality-gate checklist (PR / release blocking)

  • Contrast ratios verified (AA minimum, AAA for primary body)
  • Keyboard navigable — Tab / Space / Enter / Esc / Arrows all honored
  • Screen-reader tested (VoiceOver + NVDA minimum)
  • prefers-reduced-motion honored — transforms removed, not just shortened
  • Both light and dark mode tokens defined for every Layer 2 semantic token
  • No raw hex in component CSS — all colors through var(--token)
  • No emoji in UI — SVG icons only
  • Component implements default / hover / focus-visible / active / disabled
  • Error messages follow What / Why / How formula
  • Tabular numerals on all numeric columns
  • Accent-CTA rule passes — no white-text-on-orange-500
  • Components reference only Layer 2 semantic tokens
  • Typography uses fixed px — no clamp()
  • Changelog entry filed under correct semver bump

Governance overrides

Sentinel governance overrides

Inherits governance.spec in full. Sentinel additionally enforces these 10 rules on top of the universal gates.

#RuleEnforcement
1Two-layer token architecture — any component referencing Layer 1 primitive directly fails lintCSS lint rule: no var(--color-*) in component files, only var(--text-*), var(--surface-*), etc.
2Accent-CTA rule — white-text-on-accent-500 pairing fails CI contrast checkAutomated contrast scan on build; flags any #FFFFFF on #FF9900
3Tabular numerals required on all numeric columnsfont-feature-settings: "tnum" 1 enforced via CSS class lint
4Typography is fixed px modular — any --text-* declared with clamp() fails lintRegex lint: no clamp( in typography token declarations
5Sans-serif only — any --font-serif declaration fails lintDesign token audit: zero serif families in the token file
6Cold rgba shadows enforced — any oklch or warm shadow fails lintCSS lint: shadow values must match rgba(0,0,0,*) pattern
7Dark mode tokens defined for every Layer 2 semantic tokenToken completeness check: every :root token has a [data-theme="dark"] override
8WCAG verification table required in spec page outputPrompt 49 must enumerate every text/background pairing with ratio
9Color-only encoding banned — every severity/status indicator combines color + icon + text labelDesign review checklist; automated alt-text scan
10"(required)" parenthetical enforced — asterisk-only fails form lintForm audit: no field with required attribute that lacks the parenthetical in its label text

BYOC — required color roles

Bring Your Own Colors

If you use a custom palette instead of Sentinel's canonical navy + orange, your supplied palette must cover these 7 ramps at minimum. 7 ramps × ~9 steps = ~63 required colors. Layer 2 semantic aliases are then auto-derived.

Required Layer 1 ramps

1 · Primary

50/100/200/300/400/500/600/700/800/900 — anchor at 700
50
100
200
300
400
500
600
700★
800
900

2 · Accent (CTA)

500 = bg-only. Accent-CTA rule: dark text on 500 ≥ 4.5:1
50
100
300
500★
700
900

3 · Link

500 minimum — distinct from primary. Never reuse navy for links.
50
100
300
500★
700
900

4 · Success

50/100/300/500/700 minimum
50
100
300
500
700
900

5 · Warning

50/100/300/500/700 minimum
50
100
300
500
700
900

6 · Error

50/100/300/500/700 minimum
50
100
300
500
700
900

7 · Neutral (warm gray workhorse)

50/100/200/300/400/500/600/700/800/900 — full 10-step
50
100
200
300
400
500
600
700
800
900

Required Layer 2 aliases (auto-derived)

CategoryRequired aliasesDerived from
Text--text-primary / secondary / tertiary / disabled / inverse / linkNeutral 900/700/500/300/50; Link-500
Surface--surface-page / card / sunken / sidebar / header / subheaderNeutral 50/white/100; Primary 700/900/500
Border--border-subtle / default / strong / focusNeutral 100/300/500; Accent-500
Focus--color-focus-ringAccent-500 at 40% opacity

BYOC validation rules

Rejected palettes (Prompt 1b will fail)

Single-hue strategy (that is Harbor), indigo / purple in any ramp (cliched "AI startup" signal — Sentinel anti-pattern), pastel-only palettes (insufficient contrast for status differentiation).

  • Each ramp has minimum 6 steps (50/100/300/500/700/900)
  • Accent-CTA rule passes: dark-text on accent-500 ≥ 4.5:1 contrast
  • White-text on accent-500 explicitly rejected unless annotated "dark surfaces only"
  • Components reference ONLY Layer 2 aliases — never primitives directly

When to pick

When to pick Sentinel

Use this section to route to the correct archetype. If three or more of your brand adjectives appear in the list below, Sentinel is likely your archetype.

Pick Sentinel if…

Use case signals

  • Internal tool, B2B SaaS, dashboard, admin, monitoring, analytics
  • User session is hours, not minutes
  • Information density beats whitespace
  • Multiple status / state combinations (workflows, approvals, severities)
  • Keyboard navigation must be first-class
  • Charts, tables, or domain-specific data viz required
  • User base has expertise; efficiency over hand-holding

Sample adjectives — 3+ routes to Sentinel

precise confident calm professional structured auditable enterprise functional governed tested neutral WCAG-strict keyboard-first status-driven

Real-world examples — calibrate against these

ProductSentinel principle exemplified
Linear.app (the product, not the marketing site)Light surfaces, hairline borders, accent CTA, dense data, keyboard-first
Notion.so (the product)Sentence-case throughout, flat elevation, multi-state badges
Figma's app interfaceNeutral chrome, color reserved for data and selection only
Vercel dashboardOrange accent CTA on light surfaces — exact Sentinel pattern
Asana / Jira / GitHub IssuesWorkflow + status badges, multi-ramp semantic palette
Salesforce LightningMulti-ramp semantic palette, governed, enterprise density
Atlassian Confluence / TrelloFlat with hairlines, compact density
AWS Console (newer surfaces)Sentinel-aligned; older surfaces are pre-Sentinel anti-pattern catalog

Do not pick Sentinel if…

Use caseRight archetype
Marketing site or brand-forward portfolioHarbor — editorial rhythm, warm shadows, generous space
Mobile-first consumer app with bold, atmospheric feelCurrent — 44px targets, bottom nav, sheets-not-modals
Read-focused docs with body text as heroMeridian — 17–19px body, 1.75 leading, 68ch reading-width
Trading desk / observability with 5,000+ rows of dense dataLattice — terminal-grade keyboard-first, virtualized grids
Editorial content where structure should be felt, not seenHarbor — atmospheric, serif display, flowing layout

Failure modes — NEW

Failure modes

When teams force Sentinel onto the wrong use case, predictable failures appear in this order. Knowing the failure pattern helps route to the correct archetype before shipping.

1

Atmospheric flattening

Trigger: using Sentinel on a marketing site

Symptom Marketing site reads as "yet another B2B product page" — flat, dense, no editorial rhythm. Bounce rate climbs.
Root cause Sentinel's compact density + sans-only + flat elevation strip the atmosphere brand sites need to convert visitors.
Switch to Harbor — editorial rhythm, warm oklch shadows, generous whitespace, optional serif display. Harbor is the archetype for marketing surfaces.
2

Mobile thumb-misses

Trigger: scaling Sentinel down to mobile via responsive CSS

Symptom Buttons feel cramped, sub-44px touch targets, modal dialogs hard to dismiss one-handed, hover-only tooltips invisible on touch.
Root cause Sentinel's compact density (4px base) doesn't translate to mobile thumb ergonomics. "Responsive" cannot fix an archetype mismatch.
Switch to Current for the mobile shell. Keep Sentinel for desktop. Share brand color primitives but ship separate token and component layers.
3

Reading fatigue

Trigger: using Sentinel for long-form documentation

Symptom 14px body at 1.5 leading is fine for table rows — exhausting for sustained reading. Eye strain after 3 pages of prose.
Root cause Sentinel optimizes for scan, not sustained read. The type scale and density are calibrated for data tables, not paragraphs.
Switch to Meridian — 17–19px body, 1.75 leading, 68ch reading-width, print stylesheet included.
4

Operator key-shortcut frustration

Trigger: using Sentinel on a terminal / observability product

Symptom Power users complain the product is "slow" — everything doable in 2 clicks, but they want 1 keypress. Sentinel covers keyboard navigation; it does not mandate shortcuts on every action.
Root cause Sentinel is keyboard-friendly. Lattice is keyboard-PRIMARY — every single action has a documented shortcut and the UI reflects this at all times.
Switch to Lattice for terminal-grade keyboard-first products (trading desks, observability consoles, data exploration tools).
5

Indigo-purple drift

Trigger: Sentinel without color discipline enforcement

Symptom Designers reach for indigo / purple / gradient accents to "make it feel modern." The product starts looking like every other AI startup — generic, indistinct.
Root cause Sentinel's neutrality + extensible ramps make it easy to drift without guardrails. The indigo/purple ban is easy to overlook when it is not enforced at lint time.
This is NOT an archetype switch — it is a discipline fix within Sentinel. Enforce the indigo/purple ban as a CSS lint rule and add it to the PR checklist. Token audit: grep for #6366F1, #7C3AED, indigo, purple, violet.