Skip to content

Release History

Changelog

RSS FEED

Every release documented — new components, token additions, A2UI templates, and documentation changes.

v1.22.2: Fix dark-mode contrast failure on outcome -fg tokens (DANA-2051)

TokensComponents
  • --ds-color-outcome-positive-fg / -caution-fg / -negative-fg were pinned to white unconditionally by the dark-mode token deriver's generic fg-on-color rule ("keep as-is"). That rule assumes the paired accent stays dark enough for white text — it doesn't for these three: their OKLCH-derived dark-mode values (#75b975 / #ff7f4e / #ff796e) are pastel-light, so white text measured ~2.4-2.6:1 contrast, failing WCAG 1.4.3 outright.
  • scripts/build-tokens.ts: added a MANUAL_DARK override for all three tokens to #18181B in dark mode — matches the existing --ds-color-validation-fg precedent (dark text on a light accent). Light mode is untouched (white still passes 5:1+ there). Dark-mode contrast now ~6.9-7.6:1 across all three tiers.
  • Two real consumers inherited the bug and are now fixed for free: the ledger /reporting urgency chip (which was also referencing a phantom --ds-color-text-on-accent token that doesn't exist anywhere in the DS — fixed in apps/ledger, tracked under DANA-2051) and components/ui/APIKeyDisplay.tsx's copied-state text color.
  • Surfaced during a DANA-2031 dieter re-review of the ledger /reporting route.

v1.22.1: Fix dist/cli.mjs Dynamic require crash (DANA-2145)

Tokens
  • dist/cli.mjs threw Dynamic require of "events" is not supported from commander/lib/command.js on load — the bundled CJS dep's internal require('events') hit esbuild's ESM-output require shim, which throws for anything it can't statically resolve. bin/nodus-ds's import(...).catch(() => tsx fallback) masked this since publication; the compiled bundle had never actually run.
  • tsup.cli.config.ts: added a banner that sets globalThis.require = createRequire(import.meta.url) so the shim's typeof require !== "undefined" check delegates to a real require instead of throwing. (A local const require was tried first — esbuild renamed it to avoid an internal name collision, which defeated the check; globalThis.require isn't a local binding esbuild can rename.)
  • tsup.cli.config.ts: added explicit target: "node22" — tsconfig's ES2017 target was leaking into esbuild and silently emptying import.meta.url (needed by both scripts/cli.ts and the new banner).
  • bin/nodus-ds: now spawns node dist/cli.mjs as a child process instead of import()-ing it in-process. Importing made bin/nodus-ds the file in process.argv[1], which fails cli.ts's direct-invocation guard (import.meta.url === pathToFileURL(process.argv[1]).href, added to keep the CLI side-effect-free when imported by tests) and silently no-op'd instead of running.
  • Verified with the ticket's repro command (node dist/cli.mjs add --list) plus bin/nodus-ds add --list (compiled path) and a bundle-removed run of bin/nodus-ds tokens --dry (tsx fallback still works).

v1.22.0: Evaluator page + IA nav overhaul + homepage truth repairs (DANA-2168)

TemplatesTokensDocs
  • New page /why-nodus — 8-section evaluator journey: positioning header with opening argument, agent-ops evidence grid (Sovereignty/Protocol/Provenance/Generative-UI), stats bar sourced from ds-stats constants, build/buy economics table with semantic left-border accents and [AI ESTIMATE] footer, honest-scope disqualifier grid (3 cells), semantic color law swatch grid (text-labeled, token-referenced), three living-proof template cards linking to verified routes, and early-access CTA terminal block on --ds-surface-inverse.
  • { title: "Why Nodus", href: "/why-nodus" } added to Getting Started sidebar after Overview.
  • Top nav (SiteShell.tsx NAV_LINKS): added "Agentic" → /foundation/agentic-design-language at slot 3; removed "Charts" (/charts) and "Changelog" (/changelog). Net: 8 → 7 items.
  • Homepage (app/(site)/page.tsx): Executive door href changed from /awards → /why-nodus; Executive door description rewritten to "The case for adoption — what Nodus DS is, what it is not, and how to get access."; Developer door description rewritten to set accurate install-step expectations.
  • Homepage DIFFERENTIATORS const: added href field to all 3 entries (/foundation/agentic-design-language, /foundation/tokens, /finance); JSX render now shows "See the evidence →" arrowLink per entry.

v1.21.0: ComponentPageTemplate five-tier spacing hierarchy overhaul (DANA-1837)

TemplatesTokensComponents
  • Outer container: space-y-10 (40px uniform) removed; replaced with flex flex-col and explicit marginTop per section. The uniform 40px gap between every section child erased all information hierarchy — Header-to-Import had the same gap as Props-to-Metadata. The spacing itself now encodes tier.
  • Spacing map: three rhythm zones — 16px (--ds-space-stack-sm, same-tier adjacency), 32px (--ds-space-stack-md, tier transition), and 0px (fused sub-sections within a tier).
  • Props section: marginTop: var(--ds-space-stack-md) (32px — the largest gap on the page, creating gravitational pull into the Tier 1 apex); padding 20px → var(--ds-space-inset-md) (token compliance).
  • Accessibility section: marginTop: 0 explicit (border-top handles the internal division); padding 20px → var(--ds-space-inset-md). Props and Accessibility now fuse into one Tier 1 "implementation contract" block — isolated A11y notes read as optional; fused they read as mandatory.
  • Metadata strip: marginTop: var(--ds-fin-gap-xl) (16px — annotation-close to the content above); Metadata overline label removed (tautological — the three pill visual treatments already carry category encoding); paddingBottom 20px → var(--ds-space-inset-md).

v1.20.1: Live demos for the 8 finance components registered in v1.20.0 (DANA-2164)

ComponentsDocs
  • The 8 finance components registered in v1.20.0 (BarChart, ClearingNetworkIndicator, ForecastRow, HeatmapChart, OrderBookRow, PaymentQueueTable, PaymentStatusBadge, ScatterChart) had registry entries and Storybook stories but no lib/demo-registry.tsx entries, so their site component pages fell back to "Demo coming soon". Each now has a live demo, following the existing inline finance-demo convention (finance demos live directly in demo-registry.tsx; the lib/demos/ modules cover dataviz/sovereignty/interaction/protocol batches only).
  • Demo data mirrors each component's stories/finance/*.stories.tsx scenarios but is hydration-safe and mock-only: fixed values in place of the stories' Math.random() (the HeatmapChart FX correlation matrix is a fixed symmetric 5×5), fixed value dates, and demo entities (Meridian Bank, Northwind Capital, Eastern Corp, Atlas Bank, Kaito Securities, Harbor Global) in place of the stories' real bank names.
  • ForecastRow and OrderBookRow render as <tr> sub-components, so their demos wrap them in the same <table> chrome their Storybook decorators use — valid markup on the site page.

v1.20.0: 8 orphan finance components registered + Storybook docs-gap policies (DANA-2144/DANA-2124)

TemplatesComponentsDocs
  • Registry entries for the 8 previously-orphaned finance components (BarChart, ClearingNetworkIndicator, ForecastRow, HeatmapChart, OrderBookRow, PaymentQueueTable, PaymentStatusBadge, ScatterChart) — category ui / subcategory finance, status stable, with props transcribed from the actual prop types, accessibility notes from real ARIA behavior, variants/sizes where real, and MOBILE_USAGE classifications. The catalog count moves 368 → 376 (finance 172 → 180, stable 354 → 362); this is why the release is a feature/minor bump despite shipping no new component source. SYNC_PENDING_REGISTRATION in registry-extended.test.ts is now empty and the "allowlists stay honest" test enforces it stays that way — every future component file needs a registry entry at birth (DANA-2144).
  • Dedicated stories/patterns/ChartTooltip.stories.tsx — renamed from ChartInteractionLayer.stories.tsx (which only held ChartTooltip stories) so the file basename is the authoritative lib/storybook-ids.json key, matching its ChartAnnotation/ChartComparisonBar siblings. Adds StaleAgentAnalysis (validation-gold stale warning via staleAnalysisAge) and NegativeDelta (outcome-negative delta + primary field emphasis) to the existing user/agent states (DANA-2124).
  • docs/storybook-conventions.md — story file/title layout, mock-data rule, the all-states convention (REQUIRED for state-driven components — badges/status/indicators — optional elsewhere; the export must be named AllStates because generate-storybook-ids prefers the "All States" story as the preferred story ID), and the hooks exclusion policy (DANA-2124).
  • Hooks get API docs, not Storybook: useAgentStream, usePositionFeed, useAgentHeartbeat are deliberately excluded via a documented HOOK_EXCLUSIONS list in scripts/generate-storybook-ids.ts (also enforced — excluded hooks can never acquire a stray mapping), and ComponentPageTemplate now renders "API reference — no visual stories" for kind: "hook" entries instead of the misleading "Storybook (coming soon)" link. The typed props table + JSDoc'd source on the page are the reference (DANA-2124).
  • PaymentStatusBadge AllVariants and ClearingNetworkIndicator AllNetworks stories renamed to AllStates per the all-states convention — both are state-driven, and the name is load-bearing for the preferred-story ID.

Storybook stories + docs for the 8 S28/generative-UI components (DANA-2163)

ComponentsDocs
  • One autodocs-tagged story file per component shipped in v1.15.0–v1.18.0, in stories/patterns/: TaskStateBadge (Default, All States, per-lifecycle-group rows), RunLifecycleRail (in-flight, finished, interrupt terminal, nested child run with error terminal), HumanInputRequest (open with custom options, open with default APPROVE/DENY, answered, expired), StateDeltaInspector (default, snapshot toggle, history scrub, malformed-patch warnings), A2ATaskPanel (completed with history/artifact/metadata, input-required, working-empty, failed), ArtifactViewer (text/data/file part routing, streaming appending, unknown part kind, empty), ProvenanceFrame (default, chips + warnings, inProgress skeleton), UnknownComponentFallback. Story scenarios mirror lib/demos/protocol-demos.tsx mock data (demo-vendor, run_demo_*, fixed ISO timestamps) so site demos and Storybook stay consistent.
  • Each component's JSDoc header extended with a concise Usage section (when to use / when not to, key props) alongside the existing protocol-concept citations — JSDoc headers + Storybook autodocs pages are the component docs convention (no per-component guides in docs/).
  • Storybook rebuilt; lib/storybook-ids.json regenerated so all eight components resolve real docs/story IDs and their /patterns/<slug> pages replace the "Storybook (coming soon)" fallback (DANA-2123 mechanism).
  • Docs hub (monorepo, separate commit surface): the 8 components appended to NODUS_COMPONENTS in apps/nodus-agent-api/app/api/routes/docs/components.py per the nodus-apps contribution rule.

v1.19.2: Live demos for the 8 S28/generative-UI components (DANA-2159)

Components
  • The eight components shipped today in v1.15.0–v1.18.0 (TaskStateBadge, RunLifecycleRail, HumanInputRequest, StateDeltaInspector, A2ATaskPanel, ArtifactViewer, ProvenanceFrame, UnknownComponentFallback) had registry-extended.ts entries but no demo-registry entries, so their /patterns/<slug> pages rendered the "Demo coming soon" placeholder. New lib/demos/protocol-demos.tsx (sovereignty-demos module conventions — fixed ISO timestamps, mock-only data: demo-vendor, run_demo_*, task_demo_*) adds one live demo per component: full TaskStateBadge state row across the lifecycle groups, RunLifecycleRail with a nested child run and error terminal, HumanInputRequest open (3 options, live response ack) + answered pair, StateDeltaInspector with add/replace/remove patches and the BEFORE/AFTER snapshot toggle, a complete A2ATaskPanel (status, history, artifact, metadata), ArtifactViewer with text/data/file parts plus a streaming appending instance, ProvenanceFrame wrapping a StateBadge with a [SOURCE:] chip and a dropped-prop warning, and UnknownComponentFallback. Wired into lib/demo-registry.tsx via ...protocolDemos.

v1.19.1: Header version badge derived from package.json (DANA-2159)

Components
  • SITE_VERSION was hand-maintained and sat at 1.4.1 through fifteen releases while the nav badge displayed it; lib/site-meta.ts now derives it from package.json at build time — drift is impossible.

Generative UI Phase 3: public package exports via ./generative-ui subpath + docs (DANA-2161) — v1.19.0

TokensComponentsDocs
  • @nodus/design-system/generative-ui subpath export (src/generative-ui.ts, new tsup entry) — the public generative-UI surface: useNodusGenerativeUI, renderNodusComponentInline, renderA2UILayoutInline, RENDER_ACTION_NAME, LAYOUT_ACTION_NAME, validateProps + ValidatePropsResult, plus re-exports of ProvenanceFrame, UnknownComponentFallback, and the layout validator. Shipped as a subpath (the tokens/*.css precedent) rather than from the root barrel so @copilotkit/react-core and the 358-entry lazy render registry never load for consumers who don't use generative UI.
  • Root barrel (src/index.ts) now exports the dependency-light pieces: ProvenanceFrame (+ ProvenanceFrameProps), UnknownComponentFallback (+ UnknownComponentFallbackProps), validateLayoutSpec, A2UI_SPEC_TYPES, and ValidateLayoutSpecResult.
  • @copilotkit/react-core added as an OPTIONAL peer dependency (>=1.56, peerDependenciesMeta.optional: true) and to the tsup external list — required only when importing ./generative-ui.
  • Foundation docs: /foundation/a2ui-architecture gains a "Generative UI" section documenting the render-action model (renderNodusComponent / renderA2UILayout), the data-props-only safety property (JSON parsed once, never-throw validation), ProvenanceFrame semantics (generated output is always visibly framed), and /a2ui/generate as the living demo.
  • /a2ui/generate chat panel gains a two-sentence "what am I looking at" explainer strip above the chat: components render live from the approved catalog, the LLM supplies data only, provenance chrome marks generated output. Keeps the public demo self-explanatory for the DANA-2162 demand probe. GENERATOR_CATALOG untouched.

S28 protocol operations: StateDeltaInspector, A2ATaskPanel, ArtifactViewer + Nodus A2UI Profile naming (DANA-2163) — v1.18.0

ComponentsDocs
  • StateDeltaInspector (components/patterns/StateDeltaInspector.tsx) — AG-UI StateSnapshot/StateDelta inspector: renders shared agent state as a collapsible tree with RFC 6902 JSON Patch ops (add/replace/remove, RFC 6901 pointers) highlighted in place — temporal tint on patched values, agency accent on agent-written path labels, strikethrough ghost rows for removed keys (IterationDiff deletion treatment). Optional snapshotToggle (BEFORE/AFTER) and historyScrub (PREV/NEXT stepper indexing into the patches array). Never-throw: malformed patch entries (unknown op, invalid pointer, missing value, unresolvable path) render as caution warning rows.
  • A2ATaskPanel (components/patterns/A2ATaskPanel.tsx) — single A2A Task detail surface mirroring the spec's Task object ({id, contextId, status, history, artifacts, metadata}): identity header with the TaskStateBadge sibling, role-turned message history (user/agent) in ChatMessage border conventions, artifact list delegating each artifact to ArtifactViewer, and a mono key/value metadata block. Temporal spine.
  • ArtifactViewer (components/patterns/ArtifactViewer.tsx) — Part-type-aware renderer for the A2A Artifact model ({artifactId, name?, parts: Part[]}, Part = {kind: "text"|"data"|"file", ...}): text parts as a typographic block, data parts as DataList-convention key/value rows, file parts as a mediaType + uri chip (reference only, never fetched), unknown kinds as a warning row. appending: boolean shows the StreamingDot tail while streaming artifact-update appends arrive. Validation-gold accent — an artifact is enriched output.
  • All three registered in registry-extended.ts (status stable, full props) and exported from the patterns barrel. 10 new vitest render tests in components/__tests__/protocol-operations.test.tsx (patches applied/malformed/toggle/scrub, part-type routing, task header/history/artifacts). The A2UI GENERATOR_CATALOG is deliberately untouched.
  • app/(site)/foundation/a2ui-architecture/page.tsx — the page now introduces the protocol as "A2UI — the Nodus A2UI Profile" and adds a short naming note: Google's A2UI (a2ui.org) is an open protocol in the same agent-to-UI space with different payload semantics; the Nodus dialect is called the Nodus A2UI Profile to disambiguate. Descriptive naming only — no compatibility or endorsement claims.

S28 protocol operations: TaskStateBadge, RunLifecycleRail, HumanInputRequest (DANA-2163) — v1.17.0

TokensComponents
  • TaskStateBadge (components/patterns/TaskStateBadge.tsx) — badge for all nine A2A protocol TaskStates (submitted, working, input-required, auth-required, completed, failed, canceled, rejected, unknown) on the existing StateBadge anatomy. Colors follow the research doc's protocol lifecycle grouping: active=temporal, interrupted=validation, failed/canceled/rejected=agency, completed=outcome-positive, unknown=muted. Exports a taskStateGroup() helper so consumers can branch on active / interrupted / terminal.
  • RunLifecycleRail (components/patterns/RunLifecycleRail.tsx) — vertical rail rendering one AG-UI run as lifecycle phases: RunStarted, StepStarted/StepFinished segments, and a terminal cap (finished=outcome-positive / interrupt=validation / error=agency). Supports one level of nested child runs (AG-UI parentRunId concept), rendered indented. Composes the AgentTimeline track/dot visual language with TaskStateBadge-consistent segment colors.
  • HumanInputRequest (components/patterns/HumanInputRequest.tsx) — the canonical "agent needs a human" surface unifying the AG-UI interrupt model and the A2A input-required TaskState behind a source adapter prop ("ag-ui" | "a2a"). Validation-gold frame treatment consistent with ReviewRequestCard (S27 sovereignty styling); response buttons meet the 44px touch-target floor (--ds-touch-target-min-h); answered/expired statuses collapse to a resolution row.
  • All three registered in registry-extended.ts (status stable, full props) and exported from the patterns barrel. 9 vitest render tests in components/__tests__/protocol-operations.test.tsx. The A2UI GENERATOR_CATALOG is deliberately untouched — catalog inclusion is a separate curation decision.

Generative UI Phase 2: composite layouts + full render registry (DANA-2160) — v1.16.0

Components
  • renderA2UILayout CopilotKit frontend action (lib/use-nodus-generative-ui.tsx): the generator chat can now render composite multi-component A2UI layouts live through the existing A2UISurface renderer, wrapped in ProvenanceFrame. The spec travels as a JSON string (specJson) parsed once on completion — the same deterministic pattern Phase 1 chose for props.
  • lib/a2ui-layout-validate.ts — never-throw minimal validation of layout specs against the 19 nodus:* spec types A2UISurface can render (7 unit tests in lib/__tests__/a2ui-layout-validate.test.ts). Unknown spec types, non-objects, and invalid JSON degrade to visible warnings in the frame; a recognized-but-malformed spec is caught by an error boundary — the chat never crashes.
  • The gated "Live Component Rendering" system-prompt section now covers both tools and explains the choice: one catalog component → renderNodusComponent; a composed flow of nodus:* spec types → renderA2UILayout. Inline chat rendering wired for both action names in generator-client.tsx, still behind ENABLE_RENDER_ACTIONS.
  • scripts/generate-render-registry.ts now sources public/registry.json (path field) instead of the GENERATOR_CATALOG: the render registry expands 123 → 358 components. Unresolvable entries (non-.tsx paths, duplicate names, missing files, statically unresolvable exports) are skipped with a logged codegen warning — one bad entry never breaks the registry — and catalog coverage is hard-asserted (all 123 catalog names must be renderable). Intentional distinction: the catalog stays the LLM's allowed set in the system prompt; the registry is a superset so renderA2UILayout specs may reference any registered component.
  • lib/a2ui-prop-validate.ts enum-checks pure string-literal union types (e.g. "primary" | "secondary", 120 of 1,727 registry props) — invalid variant/size strings are now dropped with a warning instead of reaching React (3 new unit tests). Phase 2 spike verdict recorded in the module header: registry props are a curated data-prop subset of the real TS types (acceptable — unknown keys warn and pass through); a full ts-morph/react-docgen JSON-schema pass is documented and deferred.

Generative UI Phase 1: live DS components inline in chat (DANA-2158) — v1.15.0

Components
  • The /a2ui/generate chat now renders approved catalog components LIVE inline via a CopilotKit renderNodusComponent frontend action (lib/use-nodus-generative-ui.tsx), in addition to — not instead of — the generated code panel. Props travel as a JSON string parsed once on completion; streaming tool calls show a Skeleton + StreamingDot frame.
  • scripts/generate-render-registry.ts (npm run generate:render-registry, chained into prebuild after generate-registry-json) codegens lib/a2ui-render-registry.generated.tsx — a React.lazy registry over all 123 GENERATOR_CATALOG components, resolving both named and default exports (m[Name] ?? m.default).
  • lib/a2ui-prop-validate.ts — never-throw prop validation against the registry.json prop schemas: lossless primitive coercion, function/undefined stripping, unknown-key and missing-required warnings surfaced in the UI (6 unit tests in lib/__tests__/a2ui-prop-validate.test.ts).
  • New trust-provenance patterns (registered): ProvenanceFrame — provenance chip rail (default "ILLUSTRATIVE — generated output, no live data", [SOURCE:] chips in agency, [AI ESTIMATE]/confidence chips in validation), intentional 3px agency-red left agent-output marker, warnings list — and UnknownComponentFallback for non-catalog names.
  • System prompt gains a gated "Live Component Rendering" section instructing one renderNodusComponent call per component before the code block. Single toggle point: ENABLE_RENDER_ACTIONS in lib/a2ui-flags.ts (gates client action registration, inline message rendering, and the prompt section).

Vibe-tests: A2UI eval harness (DANA-2118)

ComponentsDocs
  • eval/ harness that measures whether the constrained A2UI generator produces correct, compliant UI vs baselines. Four arms (a2ui / registry-only / tailwind-baseline / plain-html), a hybrid grader (pure deterministic hard gates — scaffold, no-hex-in-JSX, catalog fidelity, must_use — plus a separate blind LLM-judge soft score), a runner with per-arm aggregation and the a2ui-vs-baseline delta, and an 8-task domain battery.
  • Live path uses the claude -p CLI (no API key); EVAL_MOCK=1 runs the whole pipeline offline. Pure grading logic unit-tested (7 cases). npm run eval:vibe / eval:vibe:mock.
  • Full live run, multi-turn degradation curve, and CI regression gating vs a committed baseline (see docs/spec-vibe-tests-eval-harness.md).

Figma Code Connect preflight: one-command unblock (DANA-2125)

TokensDocs
  • scripts/figma-preflight.ts (npm run figma:preflight) distinguishes missing vs expired/403 vs valid FIGMA_ACCESS_TOKEN against the live Figma API, and computes Code Connect mapping readiness live (14 ready / 55 pending of 69) instead of a hand-maintained table. docs/figma-code-connect.md documents the one-command unblock flow.
  • The 403 itself is resolved only by rotating the Figma credential (a manual step); the preflight makes that fix one command and self-verifying, but the valid-token success path is not exercised here.

nodus-ds upgrade: versioned codemods (DANA-2121)

TokensComponentsDocs
  • nodus-ds upgrade [--apply] [--from <version>] [--dir <path>] runs frozen, version-pinned codemods to migrate consumer code off deprecated APIs. Dry by default; value-preserving replacements are auto-applied, ambiguous sites are flagged for manual review.
  • First codemod — v1.3.0 bh-to-ds-tokens: 38 value-preserving --bh-* → --ds-* replacements (each --ds-* is defined as an exact alias of the primitive, so output is identical) plus 32 ambiguous primitives flagged for intent-based migration. Upgrades the warn-only deprecation-check CI into an autofixer.
  • scripts/codemods/ registry + Codemod interface; pure transform with 6 unit tests; docs/cli-upgrade.md.

nodus-ds swizzle: eject a component to own it (DANA-2122)

ComponentsDocs
  • nodus-ds swizzle <component> ejects a component you already consume into your own source tree with a loud ownership warning (it no longer tracks upstream). --rewrite-imports scans your project and repoints just that named import from @nodus/design-system to the local copy, preserving aliases and other named imports.
  • repointBarrelImport() — a pure, unit-tested import transform (6 cases). The CLI now guards program.parse() behind an is-main check so it can be imported by tests.
  • docs/cli-swizzle.md documents usage and the add vs swizzle distinction.

Framework-agnostic tokenVar() escape hatch (DANA-2120)

TokensDocs
  • tokenVar(name, fallback?) and a frozen tokenVars map, re-exported from the package entry, let non-Tailwind consumers (Panda, Emotion, MUI, vanilla-extract, inline styles) bind --ds-* tokens with a typed helper instead of hand-writing var() strings.
  • scripts/generate-token-names.ts (wired into prebuild) derives the typed DsTokenName union of 476 tokens from semantic.css/dataviz.css/responsive.css, so the typed surface can never drift from the CSS. Output: lib/token-names.ts.
  • docs/token-var.md documents usage; lib/token-var.test.ts guards behavior and generation freshness.

SYNC contract: registry <-> component source drift fails CI (DANA-2119)

Components
  • Three integrity cases in registry-extended.test.ts (existing Vitest CI job): every registry path/source exists on disk; no unregistered component source files; allowlists self-clean.
  • Surfaced 8 finance components missing a registry entry (tracked in DANA-2144), temporarily allowlisted rather than silently ignored.

ds-stats.ts enforced as the single count SSOT (DANA-2126)

TemplatesComponentsDocs
  • Prose counts had drifted from the derived lib/ds-stats.ts values (README 357, GUIDE 335 vs 360 components; 166/168 vs 167 templates). Corrected and annotated 16 live claims.
  • scripts/check-count-sync.ts validates counts tagged with an opt-in <!-- ds-count:STAT --> marker against ds-stats, ignoring untagged/historical numbers, and cross-checks registry.json totalComponents. Wired into the CI type-check job (check:counts).

v1.14.0: Storybook autodocs enabled + real ID map ends broken site links (DANA-2123)

TemplatesComponentsDocs
  • Every "Storybook" docs link on the site was broken — two root causes. (1) The deployed Storybook contained zero docs pages: docs: false in .storybook/main.ts and @storybook/addon-docs was never installed, though all 368 story files already carried tags: ["autodocs"]. (2) ComponentPageTemplate reconstructed story IDs from registry category (ui|patterns only) while real IDs derive from story titles across 11 groups — 232 of 360 component pages linked to non-existent IDs (e.g. ui-benchmarkcomparisonchart--docs instead of finance-charts-benchmarkcomparisonchart--docs).
  • stories/foundation/Introduction.mdx now loads (import updated to @storybook/addon-docs/blocks; the MDX glob was previously excluded entirely).
  • @storybook/addon-docs enabled — the built Storybook now ships 369 autodocs pages (1,842 index entries total).
  • scripts/generate-storybook-ids.ts — runs via poststorybook:build (locally and on Vercel) and emits lib/storybook-ids.json mapping component name → real docs/story IDs from the built index.json. Templates look IDs up instead of guessing; 357/360 registry components resolve to live docs pages.
  • Components without a Storybook entry (useAgentStream, usePositionFeed, useAgentHeartbeat — tracked in DANA-2124) fall back to the Storybook root labeled "Storybook (coming soon)". The interactive preview iframe is gated on a resolved story ID.

Foundation token-hygiene sweep: 33 pages moved onto `--ds-*` tokens (DANA-2106)

TemplatesTokensDocs
  • Every hardcoded color/px/font literal across the 37 foundation pages is now a var(--ds-*) token or carries a line-level audit-exempt marker with a reason category. Real page chrome (headings, labels, cards, frame spacing) converted to --ds-type-*, --ds-space-*, and --ds-* color tokens — 4,354 token references now live across foundation pages.
  • 1,951 audit-exempt markers document deliberate literals by reason: code examples, reference/spec values, demo entity colors, layout geometry, fluid clamps, off-scale spacing, compound padding, optical tracking. Demo integrity preserved throughout.
  • Left bare by convention: @media breakpoints inside CSS template strings, JSX prose, and code-snippet interiors, where a marker would alter rendered output.

v1.13.4: Declare @types for directly-imported d3/geojson/storybook packages (DANA-2106)

Docs
  • Cold builds failed type-check (550 cascading errors) — the app imports 9 d3-* subpackages, geojson, and @storybook/react directly, but their type packages were never declared; resolution worked only through pnpm's private hoist into .pnpm/node_modules, which app source cannot see. A node_modules relink broke that leakage, and warm builds kept passing on stale incremental type-check state, masking it.
  • Added 11 devDependencies — @types/d3-{array,chord,contour,force,geo,hierarchy,interpolate,scale,shape}, @types/geojson, @storybook/react@^10.3.6. tsc --noEmit: 550 errors → 0. No code changes.

v1.13.3: Apple-grade text rendering + Turbopack JSX-space fix (DANA-2106)

Docs
  • font-synthesis: none globally — the browser can never render synthesized (blurry) bold/italic; every weight/style in use ships as a real font file (Inter variable with the opsz axis, JetBrains Mono 400–700, DM Serif 400 + italic). This is the single biggest crispness lever after the v1.13.2 font foundation.
  • text-wrap: balance on headings and text-wrap: pretty on paragraphs — Apple-quality rag, no one-word orphans (progressive enhancement).
  • Turbopack drops the implicit space after a JSX expression — the hero subhead rendered "93pre-built" on dev *and* production despite a correct source space. All 31 {expression} text sites across the homepage, roadmap, getting-started, and gallery now use explicit {" "} string spaces (captured as learning-042).

v1.13.2: Sovereignty Console promoted to stable — harness 167/167 (DANA-2106)

Components
  • Production render-verify harness: 167/167 clean (light + dark, zero errors). sovereignty-console promoted beta → stable per the QA gate. Gallery: 167 stable / 0 beta.

v1.13.2: High-resolution pass — 100% token compliance + crisp type rendering (DS-RESOLUTION)

TokensComponents
  • Token compliance 98% → 100% — audit:tokens now reports 360/360 passing (was 342), 0 warning, 0 failing. The last 19 sub-90 components were hardened: ConfirmDialog 5 → 100, plus KeyboardShortcutsPanel, MCPToolCall, NumberInput, ProgressiveDisclosure, ActionLedger, AuthorityScope, and 12 finance charts. Chart type was converted only inside <text> style objects (where var() resolves); genuine SVG geometry, sr-only blocks, and responsive wrappers were annotated audit-exempt rather than force-tokenized.
  • Synthetic faux-bold eliminated — JetBrains Mono now loads weights 600/700. ~252 components pair mono with --ds-type-label-weight (600) / --ds-type-hero-weight (700); without the real weight files the browser synthesized bold (blurry). Every mono label, timestamp, cost indicator, and button now paints crisp.
  • EmptyState self-contradiction — default error label "SOMETHING WENT WRONG" → "ACTION FAILED"; the old string is the exact generic copy the a2ui interaction-states guidance lists as a Don't. GlossaryTooltip's "Learn more" link gains aria-label="Learn more about {term}" (WCAG 2.4.4).
  • Type rendering fidelity (app/globals.css + app/layout.tsx): requested Inter's opsz axis + font-optical-sizing: auto (glyphs refine per size — sharper at the 10–11px data floor and at display sizes); font-variant-numeric: tabular-nums slashed-zero on mono (column-aligned digits for treasury data); text-size-adjust: 100% (stops mobile Safari inflating and breaking the tuned scale).
  • audit:tokens 100% (360/360) · build:verify passed (validates the new font axis + weights) · 2665 tests pass.

v1.13.1: Sovereignty Console — the agent-ops flagship template (DANA-2106)

Templates
  • /a2ui/templates/sovereignty-console — one operator supervising a four-agent fleet: the authority they granted (AuthorityScope, ReleaseBot's release-train grant with caps), the run log they can interrupt (ActionLedger — pause/stop/hand-back drives a FLEET PAUSED banner + header stat), and the reversal window on the last consequential action (ReversalWindow, "Released v1.13.0 to production"). The demo content is literally true — it renders the agent fleet that shipped v1.13.0. Domain: Agent Operations (first artifact of the agent-ops ontology exploration). Status: beta pending the production render-verify harness.

v1.13.0: S27 Sovereignty word-class ships — generator selects it 10/10 (DANA-2106)

TemplatesComponentsDocs
  • 3 sovereignty spec types — nodus:authority-grant, nodus:reversal-window, nodus:action-ledger (vocabulary now 22 types; the generator catalog gains a Sovereignty group with selection guidance).
  • 3 stable renderers in components/ai/: AuthorityScope (grant, permitted/denied, caps with usage, revoke), ReversalWindow (undo horizon, countdown, reverse-with-reason), ActionLedger (interruptible run log with Pause / Stop / Hand back). Stories + argTypes prop controls + storybookEmbed + live site demos. WCAG AA throughout (text status labels; AA-safe validation pairing instead of raw gold text; hydration-safe countdown per the S27 pattern).
  • 19 site demos via modular batches (lib/demos/): 12 dataviz charts, 3 sovereignty, 4 patterns — every storied component now has a live site demo (story-to-site gap: zero).
  • Selection experiment: 10/10 PASS in an isolated harness using the generator's exact system prompt — 8/8 positive scenarios (incl. keyword-free paraphrases) selected the correct sovereignty spec unprompted; 2/2 negative controls stayed clean. Kill signal (<6/10) not approached. Verdict recorded in the brin decision log.
  • SidebarNav duplicate-key error fixed at the root — the Templates nav group listed /a2ui/templates twice (Overview + a stale "View all 165+" link); duplicate removed. The long-standing console error (previously ignore-listed in the QA harness) is gone; console now clean.

v1.12.1: Roadmap re-aimed at the thesis — S27 Sovereignty leads (DANA-2106)

Components
  • The roadmap now LEADS with the category arc: Sprint 27 — The Agent Interface Language: Sovereignty plus the Widening the Language track (A2UI spec-type expansion, cross-surface render parity, multi-agent orchestration surfaces, A2UI schema publication). Header reframed from feature-parity language to the-language-growing-word-classes. Answers the strategist-lens critique that a category-defining roadmap should widen the moat, not ship a maturity ledger. (Entry restored — an earlier CRLF-anchored insert was a silent no-op.)

v1.12.0: Role-selector, gallery color-law, A2UI proof strip (Gradient pt 2) (DANA-2106)

TokensComponentsDocs
  • Homepage role-selector — five doors. A routing layer below the hero: Executive/Partner (→ /awards), Developer (→ /getting-started), Designer (→ /foundation/tokens), Strategist (→ /a2ui/generate), Adoption Lead (→ /community/contributing). Each door is a full-cell <Link> with a semantic accent left-border plus a text role label (identity never carried by color alone), ≥44px targets, hover lift + widened border, visible focus ring, <nav aria-label="Find your path">.
  • Gallery shows the three-color law at the scan layer. New GalleryCard (3px role accent border + a 32px color-expression strip + a text role tag) and TriadFilterBar (All 264 / Agency 36 / Temporal 194 / Validation 10 — real buttons with aria-pressed, counts, 44px targets). Dominant role derives tokens-first with the design-brief's subcategory fallback (lib/semantic-role-map.ts) — only 14/264 entries declare a triad token, so tokens-only would have rendered 95% of cards neutral. Live mini-previews intentionally skipped: the demo registry previously OOM'd SSG workers; the spec's color-expression fallback is pure CSS.
  • A2UI proof strip on the homepage. Two panels: what A2UI is (+ domain chips + CTA to the live generator) and a proof illustration — a frozen spec JSON → arrow → the real ApprovalGate component rendered from it, with an honest visible caption. The moat, witnessed instead of narrated. JSON uses --ds-color-temporal-subtle on the inverse surface (token-only, contrast-safe).
  • All three surfaces render-verified on dev (5 doors with correct routes/accents; 263 gallery cards with exact accent distribution matching filter counts; strip renders spec + live component, 0 page errors). 2656 tests pass; build:verify green.

Homepage re-hero + Recognition (Gradient direction, part 1) (DANA-2106)

Components
  • Hero leads with the claim, not a thesis. The abstract "Built to make AI action legible" → the category claim "No other design system / built for the agent era" (Gradient copy Option A — the inversion earns the assertion; red continuation). The subhead now leads with concrete, derived counts (93 patterns, 172 finance), and a semantic-color-law line explains red/blue/gold in plain text.
  • Proof bar is honest and leads with proof. Now 357 Components · 172 Finance · 93 AI Patterns · WCAG AA (verified) — leads with the total and ends on the one *verified* claim (gold), instead of the internal sub-breakdown.
  • CTAs match reality. "Start building" (a promise an invite-only site can't keep) → "Explore the system" (/components) + "See A2UI in action" (/a2ui). The version badge → "Private preview · Evaluation by request · WCAG AA · render-verified."
  • Awards → Recognition. The verified WCAG card now leads (gold VERIFIED tier); the two award entries are honestly labelled "Submitted · Mar 2026" (under review), and the heading is "One achievement. Two submissions in review." — separating earned proof from in-motion submissions (the highest-trust fix the critique surfaced).
  • Single coherent <h1> (the color on the continuation is decorative — the sentence reads correctly monochrome and to a screen reader, WCAG 1.4.1); real text status labels (VERIFIED / Submitted), not color alone; 11px label floor on status badges; descriptive link text.

Last stale stat row → derived counts (DANA-2106)

Components
  • The Gradient copy review caught a second homepage stat row still hardcoding 41 / 111 / 73 (a different inline array from the ARCHITECTURE one fixed in v1.11.11). Wired to PATTERN_COUNT / FINANCE_COUNT / CORE_UI_COUNT. The homepage now has zero hardcoded component counts — every number derives from lib/ds-stats.ts.

Fix concrete defects surfaced by the persona critique (DANA-2106)

TokensComponents
  • Onboarding taught broken imports. getting-started used @nodus/ui/tokens.css and @nodus/patterns — neither package exists. Now the real specifier @nodus/design-system (+ /tokens/index.css).
  • The CLI was broken three ways (npx nodus-ds exited 1):
  • tsup.cli.config.ts added a shebang banner on top of the source's shebang → an invalid double-shebang bundle (syntax error). Removed the banner.
  • The output is dist/cli.mjs, but bin/nodus-ds imported dist/cli.js. Pointed the bin at .mjs and added a npx tsx fallback so it works from source too.
  • loadManifest() cast the object-shaped registry.json to an array and crashed on .reduce. Now reads .components (supports both shapes). npx nodus-ds add --list and add <c> --dry work.

Timezone-pin the last 2 #418 date renderers (DANA-2106)

TemplatesComponents
  • The render-verify backstop after v1.11.12 caught 2 templates still failing #418 (morning-brief, payment-approval-workflow) — a root cause distinct from the Date/random freeze: toLocale*String without a timeZone formats in UTC on the SSR server but in the client's local zone on hydration → text mismatch. (quant-dashboard was fully fixed by the freeze.)
  • morning-brief: AS_OF.toLocaleDateString/toLocaleTimeString → added timeZone: "UTC".
  • components/finance/DualControlPanel: party.timestamp toLocaleString(undefined, …) → "en-US" + timeZone: "UTC" (fixes payment-approval-workflow and any future consumer).
  • Render-verify harness now reports 166/166 clean. This iteration is why the empirical backstop matters — freezing the *instant* to a deterministic value still left the timezone-dependent *formatting* axis, which only a real cross-timezone render exposes.

A2UI gallery 100% stable — hydration residuals frozen (DANA-2106)

TemplatesComponents
  • Ran verify-a2ui-templates.mjs against the live deploy after the component hydration hardening: 163/166 clean (the shared-component fix cleared 6 of the 9 originally-failing templates — portfolio-risk-overview, compliance-monitoring-center, money-market, swift-payments, cash-flow-forecasting, plus yield-curve via the SVG fix).
  • Fixed the 3 residual #418 templates (their own render-time volatility, not covered by component hardening):
  • morning-brief + quant-dashboard: Math.random() chart/surface data → seeded mulberry32 (deterministic; identical server + client).
  • payment-approval-workflow + morning-brief: render-time new Date() → fixed module-level AS_OF constant. Event-handler timestamps (post-hydration) left untouched.
  • verify-a2ui-templates.mjs now reads the extracted lib/a2ui-templates.ts registry (the template array moved out of the gallery page in v1.11.11).

Storybook + site alignment, hydration hardening, SVG fix (DANA-2106)

TemplatesComponentsDocs
  • yield-curve-analytics SVG polyline bug — points used percentage strings ("0%,8.18…") inside a 0 0 100 100 viewBox, which is invalid; now plain numeric user-unit coordinates. Template passes the render-verify gate and is promoted to stable (gallery: 158 stable / 8 beta).
  • SSG hydration (React #418) hardening — 11 shared relative-time components now carry suppressHydrationWarning on the 22 text elements whose first render derives from Date.now() / new Date() (RelativeTimestamp, Timestamp, AgentIdentityBadge, DeadlineCountdown, ConfidenceSpectrum, CitationCard, ActionProvenanceCard, ProvenanceChain, ThinkingState, CollaborationPresence, AmbientAgentStatus). Prevents server/client text mismatch when a statically-prerendered page hydrates later. 4 sibling components (DataFreshness, ReviewRequestCard, CeremonyGate, AuditTrail) were verified already-safe (volatile values computed only post-mount or from fixed props).
  • lib/ds-stats.ts — single source of truth for headline counts, derived from the component registry + the A2UI template registry. Marketing pages import the named constants so counts can never drift from reality again.
  • 18 Storybook stories closing the registry↔Storybook coverage gap — every storyable component now has a story: 4 AI-agent (StreamingArtifact, ContextWindowMeter, FunctionCallVisualizer, GenerativeFormFill), 2 reconciliation (AgedItemsList, ReconciliationSummary), 12 dataviz charts (Sunburst, Chord, ForceGraph, BoxViolin, ParallelCoordinates, Choropleth, CirclePacking, ContourDensity, Horizon, StreamGraph, Bump, RadialBar).
  • Extracted the A2UI template registry to lib/a2ui-templates.ts (was inline in the gallery page, 2,524→251 lines) so the gallery and the derived stats read from one source.

A2UI QA gate automated: 150 templates promoted to stable (DANA-2106)

Templates
  • scripts/verify-a2ui-templates.mjs — automated render-verify harness. Loads every /a2ui/templates/<slug> in light AND dark via Playwright, captures uncaught exceptions + console errors, checks rendered content, and emits the list of beta templates that render clean in both themes (promotion candidates). This makes the A2UI QA gate a runnable command instead of a manual per-template review.
  • 150 beta templates promoted to "stable" after passing the automated light+dark render-verify gate (166 total tested: 157 clean, 9 flagged). Gallery is now 157 stable / 9 beta.
  • morning-brief demoted stable to beta — it was marked stable but fails the gate (React #418 hydration mismatch). Honest gating: a template with a known render error is not stable.
  • 8x React error #418 (hydration text mismatch, likely time/locale-dependent SSR content): morning-brief, payment-approval-workflow, money-market, swift-payments, cash-flow-forecasting, portfolio-risk-overview, quant-dashboard, compliance-monitoring-center.
  • 1x SVG <polyline> bug (percentage strings in a numeric points attribute): yield-curve-analytics.

Dark-mode completeness: A2UI gallery chrome tokenized (DANA-2106)

TemplatesTokensComponents
  • Dark-mode audit result: the 360-component library is fully dark-safe (0 hardcoded colors; token-compliance enforced; 62 --ds-* dark overrides). This change closes the only real dark-mode gaps found — in the A2UI gallery chrome:
  • Template gallery: the 40 per-template accent colors (many very dark, e.g. #1A1A6E) were used as text/bar color and went near-invisible in dark mode. Now wrapped in color-mix(in srgb, <accent> 65%, var(--ds-text-primary)) — one adaptive pattern that stays readable in both themes while preserving hue.
  • Generator UI: #059669 success color → var(--ds-color-outcome-positive); dropdown boxShadow → var(--ds-shadow-md).

A2UI generator: primitives added to the catalog (DANA-2106)

ComponentsDocs
  • Expanded the A2UI generator catalog with 53 foundational primitives (Layout, Typography, Forms, Overlays, Navigation, Data, Feedback, Actions). Previously the generator's catalog was finance-only (72 entries) — it could not lay out a page, build a form, or add a dialog. It can now compose complete interfaces.
  • All import paths are registry-derived and verified (119 unique paths, 0 missing).
  • formatGeneratorCatalog() now groups UI/primitive components by subcategory in the system prompt (added optional group field).

Production-readiness: test suite green + token fixes + typecheck gate (DANA-2106)

TokensComponentsDocs
  • Test suite was RED (12 failing) → now green (2655 pass, 0 fail).
  • Real token-compliance violations fixed: ConfirmDialog boxShadow → var(--ds-shadow-lg); KeyboardShortcutsPanel gap → var(--ds-space-stack-2xs)
  • Corrected 10 stale tests to match current (correct) behavior: ScrollArea (6 — component refactored to .ds-scroll-area + scroll-area.css), Tag a11y (2 — renders a native <button>), CardLoading skeleton count selector (1), sidebar-nav Foundation now uses groups (1)
  • typecheck npm script (tsc --noEmit) — passes clean, closing the toolchain gap

Storybook stories: all primitives complete (DANA-2106)

Docs
  • Added Storybook stories for the remaining 30 primitives — typography (8), forms (10), overlays (4), data (3), feedback (2), navigation (3) — in stories/ui/, grouped by subcategory title
  • All 37 primitives now have both a live demo and a Storybook story — completes the primitive-surfacing effort (both goals of the spec)
  • Verified via storybook:build (exit 0, all story bundles built)

Storybook stories: layout primitives (DANA-2106)

Docs
  • Added Storybook stories for the 7 layout primitives — Box, Flex, Grid, Container, Section, Separator, ScrollArea (stories/ui/, titled Layout/*, CSF3 + autodocs + argType controls)
  • Reference batch of the primitive Storybook coverage pass (37 total); verified via storybook:build (exit 0, all 7 bundled)

Complete primitive demo surface: 7 more demos (DANA-2106)

Components
  • Added live demos for ProgressiveDisclosure, NumberInput, DatePicker, DateRangePicker, GlossaryTooltip, ConfirmDialog, and Command to lib/demo-registry.tsx
  • With the navigation reference set, all 70 ui primitives now render a live demo (was 60/70) — no remaining "Demo coming soon" across layout/typography/data-entry/data-display/overlays/feedback/navigation
  • Verified: build:verify passes; all 7 pages render live (dev server) with correct content, no demo-originated console errors

Surface navigation primitives + build-gate fix (DANA-2106)

ComponentsDocs
  • Added live demos for Breadcrumbs, Stepper, and KeyboardShortcutsPanel to lib/demo-registry.tsx — their /components/<slug> pages now render interactive previews (were "Demo coming soon")
  • Reference subcategory for the demos-only primitive-surfacing pass; spec at docs/superpowers/specs/2026-07-02-surface-primitives-demos-stories-design.md
  • Verified: build:verify passes; all three pages render live (dev server), no demo-originated console errors
  • scripts/verify-build.sh false-pass: the gate exited 0 when next was missing (fallthrough treated any unrecognized failure as the known SSG bug). Now a non-zero build is tolerated only with positive evidence — Compiled successfully present AND the failure is specifically the _global-error/_not-found prerender error; otherwise it exits 1. Three-case tested.

Security dependency scan + patch updates

DAN-782Docs
  • Ran npm audit across 2,645 installed packages (78 prod, 2,568 dev)
  • 0 critical, 0 high, 0 moderate vulnerabilities
  • 6 low severity vulnerabilities identified — all in devDependency chain only
  • Root: elliptic (GHSA-848j-6mx2-7j84, CVSS 5.6) via @storybook/nextjs → node-polyfill-webpack-plugin → crypto-browserify
  • Fix requires breaking Storybook major downgrade (v10→v7) — accepted risk (devDep, no prod exposure)

Storybook decoupled + 12 missing stories + doc fixes

DAN-751TemplatesComponentsDocs
  • build script now runs next build only — Storybook failures no longer block site deploy
  • Storybook build remains available via dedicated storybook:build script
  • ConfirmDialog — 5 stories: Destructive, Agency, Neutral, Loading, NoDescription
  • Command — 3 stories: Default palette, EmptyState, AgentCommands
  • KeyboardShortcutsPanel — 4 stories: Inline, ButtonTrigger, KbdTrigger, FilteredByGroup

A2UI template QA pipeline + 8 stable promotions

DAN-752TemplatesTokens
  • QA script — Added scripts/qa-a2ui-templates.ts: static analysis gate enforcing CLAUDE.md QA rules. Checks hardcoded hex, wrong theme default, font size floor, missing useEffect cleanup, and gallery listing. Run: npx tsx scripts/qa-a2ui-templates.ts [slug...]
  • approval-flow fix — const ACCENT changed from "#FF0000" to "var(--ds-color-agency)". Gallery card color synced.
  • agent-chat fix — useEffect init reveal refactored to collect timer IDs and return cleanup, preventing message duplication in React 18 strict mode.
  • agent-approval-gate fix — Approve button color: "#fff" replaced with "var(--ds-text-inverse)".
  • 8 stable promotions — Morning Brief, Agent Chat, Approval Flow, Observability, Cash Position Dashboard, FX Risk Monitor, Multi-Agent Orchestration, Agent Approval Gate promoted beta → stable after passing all QA gate checks.

Build pipeline, package.json, and CI validation fixes — DAN-750

TokensDocs
  • B1 — Removed NPM_TOKEN from semantic-release step env in release.yml; private: true is intentional (sub-packages publish independently) and the token was contradictory and unused at that step.
  • B2 — Moved @anthropic-ai/sdk, @copilotkit/*, @testing-library/dom, @vercel/analytics, @vercel/speed-insights from dependencies → devDependencies; all are doc-site-only and should not pollute consumer installs.
  • B3 — Added build:cli step to release.yml release job, ensuring the CLI binary is built before semantic-release runs.
  • B4 / C1 — Added build:lib validation step to ci.yml build job so dist/ is validated on every PR and push, not just at release time.
  • Dep dedup — Removed framer-motion, lucide-react, next, react, react-dom, recharts from dependencies (they were duplicating peerDependencies).

Token layer fixes: T3, T4, warnings

DAN-748TokensDocs
  • T3 — Added dark mode overrides for --ds-overlay-scrim/light/heavy in [data-theme="dark"]. Pins scrim/heavy to literal #000000 and light to literal #FFFFFF at low opacity. Eliminates the --bh-black/--bh-white inversion bug where these tokens rendered as white haze on dark surfaces.
  • T4 — Created docs/token-migration-v1-v2.md documenting the v1→v2 spacing migration strategy. Covers --ds-space-inset-sm semantic change (16px uniform → 4px 8px shorthand), migration detection steps, and when to use each variant.
  • Warning: --ds-color-info dark mode — Added --ds-color-info: var(--bh-blue-500) dark override (#6B8AFF, 5.67:1 on dark surfaces). Light mode --bh-blue-400 (#7080EC) is decorative-only contrast; dark surfaces needed a brighter step.
  • Warning: --ds-space-inset-2xl — Added to :root inset scale as var(--bh-space-8) (64px). Completes the inset size ladder from 2xs through 2xl.
  • Warning: responsive.css — Replaced @media (prefers-color-scheme: dark) with [data-theme="dark"] selector. Project theme is opt-in via DOM attribute, not OS preference.

Breaking dep upgrades (security follow-up) — DAN-426

Docs
  • semantic-release v24→v25 — Major version upgrade from ^24.2.3 to ^25.0.3. Eliminates bundled npm@10.9.8 which contained vulnerable picomatch@4.0.3 (high, ReDoS) and brace-expansion@2.0.2 (moderate, process hang) inside its isolated node_modules/ tree.
  • npm override ^11.13.0 — Forces @semantic-release/npm's transitive npm dependency to 11.13.0+, which ships patched picomatch@4.0.4 and brace-expansion@5.0.5. Resolves the remaining bundled-dep audit findings that overrides alone could not reach.
  • CopilotKit uuid — Already resolved by uuid>=14.0.0 override from DAN-673. Confirmed all @ag-ui/client, @copilotkit/*, and @langchain/* instances resolve to uuid@14.0.0. No additional action needed.
  • Vulnerability trajectory — 8 (DAN-673) → 6 (this scan). All remaining are elliptic (6 × low) in @storybook/nextjs → node-polyfill-webpack-plugin → crypto-browserify. Dev-only, no upstream fix, no production surface.
  • Storybook/elliptic — No fix available. elliptic@6.6.1 is latest and remains in advisory range. Storybook 10.x uses node-polyfill-webpack-plugin@2.0.1 which transitively pulls it. Downgrading to Storybook 7.x is not viable. Accepted as residual dev-only risk.

Security dependency scan — DAN-673

Docs
  • uuid override added — Added "uuid": ">=14.0.0" to package.json overrides. This closes GHSA-w5hq-g745-h8pq (missing buffer bounds check in uuid v3/v5/v6 when buf is provided) across all transitive consumers: @copilotkit/*, @ag-ui/*, @langchain/langgraph*, mermaid, and streamdown. 15 moderate vulnerabilities eliminated.
  • DevDep patch sweep — Updated 12 devDependencies to latest patch versions: @storybook/addon-a11y@10.3.6, @storybook/addon-themes@10.3.6, @storybook/nextjs@10.3.6, storybook@10.3.6, @axe-core/playwright@4.11.3, @playwright/test@1.59.1, @tailwindcss/postcss@4.2.4, tailwindcss@4.2.4, chromatic@16.6.3, @figma/code-connect@1.4.4, @next/bundle-analyzer@16.2.4, vitest@4.1.5.
  • Vulnerability trajectory — 27 (DAN-561) → 23 (DAN-561 patched) → 8 (this scan). Zero production-surface vulnerabilities remain.
  • Remaining (dev-only, unfixable at time of scan):
  • picomatch (high) + brace-expansion (moderate): bundled inside npm CLI's isolated tree. Resolved in DAN-426 via semantic-release v25 + npm override.

Component gaps + production hardening — DAN-661

TokensComponents
  • 5 new components — Breadcrumbs (navigation trail with overflow collapse), Stepper (multi-step progress indicator), NumberInput (finance-grade numeric input with Intl.NumberFormat currency/locale), DatePicker + DateRangePicker (native date inputs, zero deps), Command (cmdk wrapper with DS tokens).
  • All Tier A — Every new component uses forwardRef + cva + cn() + displayName. Semantic tokens only, no raw hex.
  • WCAG AA verified — Accessibility-lead reviewed all 5 components. Fixed: Stepper ARIA list structure + step count labels, NumberInput keyboard ArrowUp/ArrowDown increment.
  • Barrel exports wired — All new components exported from domain barrels (form/, navigation/, ui/), main src/index.ts, and components/ui/index.ts (Command).
  • Registry expanded — 357 components registered in registry-extended.ts / public/registry.json (up from 338 pre-DAN-661).

Token compliance audit — DAN-562

TemplatesTokensComponents
  • Scope — Full P1 audit across all 372 component files for: raw hex values, --bh-* primitive token usage, --ds-border-* as text color, and font size below 10px floor.
  • Result — Zero P1 violations found. All 367 component TSX files pass the token contract (no regression from DAN-311).
  • compliance-registry.json — Added 37 previously-unregistered components to the registry, bringing total from 335 → 372 at 100% token compliance.
  • New chart components: BarChart, BoxViolinPlot, BumpChart, ChordDiagram, ChoroplethMap, CirclePacking, ContourDensityChart, ForceGraph, HeatmapChart, HorizonChart, ParallelCoordinates, RadialBarChart, ScatterChart, StreamGraph, SunburstChart
  • New finance components: ClearingNetworkIndicator, ForecastRow, OrderBookRow, PaymentQueueTable, PaymentStatusBadge

Security dependency scan — DAN-561

Docs
  • package.json overrides — Added postcss: ^8.5.10 override to force Next.js 16's bundled PostCSS from 8.4.31 (XSS via unescaped </style> — GHSA-qx2v-qp2m-jg93) to 8.5.12. Verified all postcss resolutions now show overridden at 8.5.12.
  • npm audit fix — Applied non-breaking fixes; patched 4 vulnerabilities total (27 → 23).
  • Remaining (unfixable without breaking changes):
  • picomatch (high) + brace-expansion (moderate): bundled inside the npm CLI tool (node_modules/npm/node_modules/...). Not app runtime code; cannot be patched via overrides. Upstream npm must release a patched bundle.
  • elliptic chain (6 × low): transitive dev-only dependency via @storybook/nextjs. Fix requires downgrading to Storybook 7 — rejected. Not shipped to production.

Documentation freshness check — DAN-500

Docs
  • lib/sidebar-nav.ts — Added /foundation/a2ui-architecture to the System group under Foundation. This 825-line page (A2UI protocol design, spec type taxonomy) was present but unreachable through navigation.
  • lib/sidebar-nav.ts — Fixed i18n nav split: "Internationalization (i18n)" now correctly points to /foundation/i18n (the RTL/BiDi design spec, DAN-146) rather than the demo. Renamed /i18n link to "i18n Demo" and /i18n/demo to "i18n Interactive" for clarity.
  • lib/search-index.ts — Added /foundation/i18n (i18n design spec) and /foundation/a2ui-architecture (A2UI foundation spec) so both pages appear in site search. Previously unreachable via both nav and search.

Charts nav, /charts/[slug] routes, sidebar links — DAN-433

TemplatesComponentsDocs
  • app/(site)/layout.tsx — Added "Charts" to primary header nav between Patterns and Finance. Gives the Charts & Data Viz section equal standing with Components and Patterns.
  • app/(site)/charts/[slug]/page.tsx — New dynamic route. Serves all chart components (both ui/finance and pattern/dataviz registry entries) through ComponentPageTemplate with prop table, source code, and related components. Static params generated from both categories at build time.
  • app/(site)/charts/page.tsx — Gallery card links updated from /components/{slug} / /patterns/{slug} to /charts/{slug} for all chart types.
  • lib/sidebar-nav.ts — Charts & Data Viz sidebar rebuilt with buildChartGroups(): replaces anchor-only "By Type" links with individual component entries under "Finance Charts" and "Visualization Patterns" groups, all linking to /charts/{slug}.

D3 chart accessibility hardening — DAN-432

Components
  • components/finance/ChordDiagram.tsx — Enhanced ARIA: added role="img", aria-label with dynamic data summary, keyboard navigation between chords (Arrow keys), screen reader fallback <table> with flow amounts.
  • components/finance/ForceGraph.tsx — Enhanced ARIA: added role="img", aria-label, keyboard navigation between nodes (Tab + Arrow keys), focus ring on active node, screen reader fallback <table> with node connections and edge weights.
  • components/finance/SunburstChart.tsx — Enhanced ARIA: added aria-label with hierarchy summary, keyboard drill-down (Enter to expand, Escape to collapse), breadcrumb trail announced via aria-live.
  • components/__tests__/d3-charts-a11y.test.tsx — New comprehensive a11y test suite (572 lines) covering all D3 chart components: ARIA roles/labels, keyboard navigation, screen reader fallback tables, focus management, prefers-reduced-motion support, high-contrast mode.
  • All D3 charts now pass axe-core audit with zero violations.

Adopt D3.js + charts section + 3 initial D3 components — DAN-427

TokensComponentsDocs
  • Architecture decision: D3.js modules adopted as math/geometry layer. React keeps DOM ownership. D3 provides scales, shapes, layouts, interpolation. No d3.select() — fully declarative React rendering.
  • D3 modules installed: d3-scale, d3-shape, d3-hierarchy, d3-array, d3-format, d3-time, d3-time-format, d3-interpolate, d3-color, d3-scale-chromatic, d3-sankey, d3-force, d3-chord, d3-geo, d3-contour. Types: @types/d3, @types/d3-sankey.
  • Charts & Data Visualization section added to sidebar nav with gallery page at /charts. Organizes 30+ chart/viz components by type (Standard, Hierarchical, Network, Heatmaps, Financial, Micro, Infrastructure).
  • components/finance/SunburstChart.tsx — New D3-powered sunburst chart (d3-hierarchy.partition). Fund decomposition, portfolio allocation drill-down with arc transitions.
  • components/finance/ChordDiagram.tsx — New D3-powered chord diagram (d3-chord). Cross-entity treasury flows, intercompany transfers with gradient ribbons.

HorizonChart + StreamGraph + BumpChart + RadialBarChart — DAN-430

TokensComponentsDocs
  • components/finance/HorizonChart.tsx — Dense multi-series time-series using the horizon chart technique. Each series gets a compact lane; values fold into nBands overlapping opacity layers (band 0 = full, band 2 = lightest) using d3-area + curveMonotoneX with clipPath masking. Use case: monitoring 10+ FX rates or cash positions simultaneously.
  • components/finance/StreamGraph.tsx — Stacked area with stackOffsetWiggle + stackOrderInsideOut for organic S-flow baseline. Uses d3-shape stack + area + curveCatmullRom. Categorical token palette. Use case: AUM composition over time.
  • components/finance/BumpChart.tsx — Rank change chart connecting positions across time periods with curveBumpX (d3-shape 3.x). Dots at each rank with accessible aria-label per point. Right-side series labels at last rank position. Use case: fund performance rankings, counterparty ranking shifts.
  • components/finance/RadialBarChart.tsx — Circular comparative bars using scaleBand (angle positions) + scaleLinear (radial length) + d3Arc. Background track arcs show limit. Labels with cos/sin(midAngle - π/2) offset for 12-o'clock orientation. Use case: KPI comparison, limit utilization.
  • All 4 registered in registry-extended.ts with full prop definitions.

ChoroplethMap + CirclePacking + ContourDensityChart — DAN-429

TokensComponents
  • components/finance/ChoroplethMap.tsx — Geographic exposure visualization using d3-geo (geoNaturalEarth1 / geoMercator). Regions colored by sequential token scale. Accepts real GeoJSON features; default demo uses major world-region rectangles. Legend strip + pattern overlay ensure color is not the sole encoding. Screen-reader fallback table.
  • components/finance/CirclePacking.tsx — Hierarchical allocation chart using d3-hierarchy.pack(). Nested circles for portfolio → fund → position drill-down. Depth-based opacity conveys nesting hierarchy. Labels gated on radius ≥ 18px. Categorical token palette. Screen-reader fallback table with allocation %.
  • components/finance/ContourDensityChart.tsx — 2D kernel density estimation using d3-contour. Auto-derived KDE bandwidth. geoPath() (no projection) converts pixel-space MultiPolygons to SVG paths. Bimodal demo data showing two return clusters. Zero reference lines, scatter point overlay, density legend. Screen-reader data summary table.
  • All 3 registered in registry-extended.ts; added to charts catalog sections; mobile behaviors documented.

D3 chart math migration — DAN-428

TokensComponents
  • components/finance/Treemap.tsx — Replaced custom squarified layout algorithm with d3-hierarchy.treemap(). React rendering layer and all accessibility (ARIA, keyboard nav) preserved. Removed ~60 lines of manual layout code.
  • components/finance/SankeyDiagram.tsx — Replaced custom BFS column assignment + manual Bezier path generation with d3-sankey + sankeyLinkHorizontal(). Preserves token-based theming, gradient fills, and screen reader labels.
  • components/finance/LineChart.tsx — Scale logic migrated to d3-scale (scaleLinear); path generation migrated to d3-shape (line, area, curveLinear). Confidence band switched from <polygon> to d3Area with y0/y1 bounds. Zero visual diff.
  • components/finance/AreaChart.tsx — Same scale/shape migration as LineChart. Stacked area baselines computed identically; d3Area and d3Line replace manual M L Z path strings. Zero visual diff.
  • components/finance/shared/chart-tokens.ts — getSequentialColor and getDivergingColor now use d3-interpolate (interpolateRgb) for smooth continuous gradients; replaces discrete 5-step palette. HeatmapChart inherits the improvement automatically.

Statistical charts — DAN-431

ComponentsDocs
  • components/finance/BoxViolinPlot.tsx — New D3-powered box/violin plot for risk distribution visualization. Renders quartiles, median, whiskers, outliers, mean diamond. Optional violin KDE overlay with Gaussian kernel and Silverman bandwidth. Keyboard-focusable series with tooltip. Screen-reader fallback <table> with statistical summaries (min, Q1, median, mean, Q3, max, outlier count).
  • components/finance/ParallelCoordinates.tsx — New D3-powered parallel coordinates chart for multi-factor instrument analysis. Vertical axes with drag-to-brush range filtering. Rows that fall outside any brushed axis are hidden. Live row count and "Clear filters" control. Screen-reader fallback table with aria-hidden on filtered rows. Keyboard navigation on each axis (Tab + Escape to clear brush).
  • registry-extended.ts — Registered both components (box-violin-plot, parallel-coordinates) with full prop definitions and mobile usage notes.
  • app/(site)/charts/page.tsx — Added "Statistical & Analytical" section to the chart catalog.
  • lib/sidebar-nav.ts — Added "Statistical & Analytical" nav item with new badge.

Design review cycle — DAN-425

Components
  • components/patterns/AvatarStack.tsx — Initials and overflow count (+N) font sizes now clamp to Math.max(10, ...) at avatar sizes below 25px. At the default size (32px) this is a no-op; at small sizes (e.g. 24px) the old formula produced 9px (violation). CollaborationPresence already applied this pattern correctly.

Security dependency scan — DAN-423

ComponentsDocs
  • Next.js 16.2.1 → 16.2.4 — GHSA-q4gf-8mx6-v5v3 (Denial of Service via Server Components, CVSS 7.5, >=16.0.0-beta.0 <16.2.3)
  • Vite 8.0.1 → 8.0.10 — three high-severity CVEs: path traversal in optimized deps .map handling (GHSA-4w7w-66w2-5vf9), server.fs.deny bypass with queries (GHSA-v2wj-q39q-566r), arbitrary file read via WebSocket (GHSA-p9ff-h696-f583)

Token compliance audit — DAN-311

TemplatesTokensComponentsDocs
  • Font size floor (10px minimum): lib/site-styles.ts a2uiLabel raised from 9px → 10px (propagates to all 23+ A2UI templates). components/patterns/LiveChangeIndicator.tsx role label raised from 8px → 10px.
  • Border tokens used as text color (20 violations fixed): var(--ds-border-separator), var(--ds-border-structure), and var(--ds-border-default) were misused as CSS color values — these are 2–3:1 contrast, failing WCAG AA. All replaced with var(--ds-text-muted) (4.83:1).
  • components/ai/ModelSelector.tsx — separator |
  • components/site/ComponentPageTemplate.tsx — breadcrumb /
  • components/patterns/SpeechStateIndicator.tsx — idle + muted states

KeyboardShortcutsPanel + KeyboardBadge (H7 + H10) — DAN-132

TokensComponentsDocs
  • components/ui/KeyboardShortcutsPanel.tsx — New component with three trigger modes: inline (dedicated pages), button (sidebar toggle), kbd (global ? key activation).
  • KeyboardBadge — Exported sub-component rendering styled <kbd> elements using --ds-type-mono-font and --ds-surface-raised.
  • context prop — Context-aware filtering: pass a context key to show only relevant shortcuts for the current view.
  • Two-column grid layout: Action label | Key combination(s), grouped by category with group-filter tab strip.
  • Full token compliance: all colors, borders, and type use --ds-* semantic tokens. No raw hex.

GlossaryTooltip + term definition system — DAN-133

Components
  • components/ui/GlossaryTooltip.tsx — New <abbr>-anchored tooltip component using the temporal variant (blue = informational). Props: term, definition, learnMoreHref?.
  • lib/glossary.ts — GLOSSARY map with 15 entries: MCP, MCP Server, MCP Tool Call, A2A, A2A Handoff, Provenance, Epistemic State, Confidence Score, Grounding, Orchestrator, Handoff, Delegation, Vault, Guardrail, Model Selector.
  • components/patterns/MCPToolCall.tsx — tool and server labels wrapped with GlossaryTooltip.
  • components/patterns/MCPServerStatus.tsx — Section title wrapped with GlossaryTooltip.
  • components/patterns/ProvenanceChain.tsx — Chain title wrapped with GlossaryTooltip.

Token compliance audit — DAN-69

TemplatesTokensComponents
  • ChartInteractionLayer — Swap A/B button used --ds-border-structure as text color (2-3:1, fails WCAG). Corrected to --ds-text-muted (4.83:1).
  • PresenceAvatarStack — Separator · dot used --ds-border-structure as text color. Corrected to --ds-text-muted.
  • ComponentPageTemplate — Check icon badge had fontSize: "9px" below the 10px floor. Bumped to 10px.

Security dependency scan and patch — DAN-68

TemplatesDocs
  • lodash@4.18.1 — fixes GHSA-r5fr-rjxr-66jc (Code Injection via _.template, CVSS 8.1) and GHSA-f23m-r3pf-42rh (Prototype Pollution, CVSS 6.5)
  • lodash-es@4.18.1 — same CVEs as lodash
  • picomatch@4.0.3 (high) — bundled inside npm@11.12.1/tinyglobby — cannot be overridden; affects only npm CLI tooling, not runtime. Upstream fix required from npm team.
  • brace-expansion (moderate) — bundled inside npm@10.9.8 in semantic-release — same constraint.
  • elliptic and crypto-browserify chain (5 low) — in @storybook/nextjs@10.3.3; npm audit incorrectly suggests downgrade to 7.0.14. Dev-only, no runtime exposure.

Fix duplicate color TS errors in finance components — DAN-44

TokensComponentsDocs
  • Fixed: ConfirmationCard, CurrencyAmount, ExceptionQueue, HedgeBook, JournalEntry, PaymentQueue, PaymentTracker, RegulatoryReport, RiskDisclosure, RiskHeatmap, SanctionsCheck, ScreeningResultCard, SurveillanceQueue, TCAReport, ThresholdAlert, WaterfallChart
  • Storybook build: ✓ passing
  • Next.js build: ✓ passing (576 pages, TypeScript clean)

Site header redesign — DAN-35

Components
  • Version badge now sourced from lib/site-meta.ts — no more drift from package.json
  • Nav links gain active state via usePathname() — bold text + agency-red underline pip
  • Added Get Started and Changelog to top nav
  • Improved ARIA labels, aria-current="page", role="banner", tabIndex={-1} on main
  • Focus-visible outlines on all interactive header elements (temporal blue, 2px offset)

P2 inline-no-token violations cleared — DAN-24

TokensComponents
  • Added audit-exempt directive support to scripts/audit-tokens.ts for layout-only, dynamic-color, and geometric style blocks
  • Cleared P2 violations across ~80 pattern, UI, AI, form, overlay, and typography components
  • No semantic changes — all visual output unchanged; compliance metadata only

P1 hardcoded token violations cleared — DAN-22

TokensComponents
  • Added audit-ignore directive support to scripts/audit-tokens.ts for geometric/SVG/breakpoint exemptions
  • Replaced hardcoded values with DS spacing tokens (--ds-space-inset-*, --ds-fin-gap-*, --ds-icon-size-*)
  • Replaced one rgba(255,255,255,0.35) with color-mix(in oklch, var(--ds-text-inverse) 35%, transparent)
  • Coverage: 97% → 100%

Roadmap accuracy audit — DAN-221

TemplatesTokensComponents
  • S26: White-Label Theming System promoted inprogress → stable (RuntimeThemeProvider, theme builder, guide all shipped). Sprint phase → stable.
  • P2 Finance Ontology: Liquidity & Cash, Compliance & Regulatory, Reconciliation, Portfolio, Funding all promoted planned/inprogress → stable with component references.
  • P2 Finance Workflows: Daily Cash, FX Hedging, Payment Approval promoted planned → stable with A2UI template references.
  • P3 Data Visualization: All 8 chart types → stable. DS Token Bridge and Responsive Container → stable. Tooltip System and Chart Accessibility → beta. Phase → stable.
  • P4 Templates: All finance and AI interface templates → stable. Phase → stable.

Interaction State primitives extracted as reusable components — DAN-216

TokensComponents
  • StateBadge (components/patterns/state-badge.tsx) — color-coded uppercase badge
  • StateIndicator (components/patterns/state-indicator.tsx) — animated dot indicator.
  • ScenarioScript (components/patterns/scenario-script.tsx) — step-sequence renderer
  • globals.css — added four new keyframe + utility classes:
  • interaction-states page refactored to import StateBadge and ScenarioScript;

Token compliance Wave 5: 6 components reach 97–100% score — DAN-212

TokensComponents
  • MatchQueue 80→97% — 10 P2s fixed (layout props moved to Tailwind className)
  • ProgressivePermissionFlow 88→100% — 6 P2s fixed (flex/margin layout props → className)
  • ReconciliationDiff 90→100% — 2 P1s fixed (width: "140px" → var(--ds-fin-col-4xl))
  • BreakAnalysisTable 94→100% — 3 P2s fixed (overflow, table layout → className)
  • BreakAnalysisPanel 94→100% — 3 P2s fixed (overflow, table layout, list-style → className)

Token compliance Wave 3: 19 warning-band components promoted to passing — DAN-205

TokensComponents
  • IconButton 70→100, Dialog 70→100, DeadlineCountdown 70→100, ISINChip 70→100
  • Table 71→96, AgencyIndicator 71→98, FXRateTicker 71→98, CovenantDashboard 71→91, CurrencyAmount 71→96
  • TaskQueue 73→98, Watermark 73→98, CovenantGauge 73→98, RatioBar 73→93
  • CashPositionCard 74→98, WaterfallChart 74→94, SettlementTimeline 74→98
  • Skeleton 75→100, SegmentedControl 75→100, TableOfContents 75→100

Continuous documentation sync SOP — DAN-183

ComponentsDocs
  • Created lib/changelog-data.ts as the single machine-readable source of truth for release history
  • ChangelogEntry interface with date, version?, ticket, title, kind, summary, items[]
  • CURRENT_VERSION constant synced to package.json
  • Back-filled 10 entries from DAN-001 (v1.0.0) through DAN-190 (today)
  • Added RecentChanges component above the ProvenanceChain sprint narrative

Treasury Executive Summary dark mode fix + QA gate — DAN-180

TemplatesTokensDocs
  • Replaced A2UI_DARK as D with A2UI_LIGHT as C in app/(site)/a2ui/templates/treasury-executive-summary/page.tsx
  • Page now renders in light mode by default; CSS token vars in A2UI_LIGHT auto-adapt to dark mode
  • Updated footer note from "dark · fixed presentation" to "light default · dual-theme"
  • Added status?: "stable" | "beta" | "incomplete" field to the TEMPLATES data schema in the gallery index
  • Gallery cards now render a visible badge for "beta" and "incomplete" templates

Fix invisible FIXED tags on release notes page — DAN-178

TokensDocs
  • Added --ds-color-outcome-positive-subtle-fg — dark green on pale subtle bg (light), white on dark subtle bg
  • Added --ds-color-outcome-caution-subtle-fg — consistent coverage for caution subtle surfaces
  • Added --ds-color-outcome-negative-subtle-fg — consistent coverage for negative subtle surfaces
  • Extended data-fin-region="asia" override with matching -subtle-fg tokens
  • FIXED badge: color changed from --ds-color-outcome-positive-fg → --ds-color-outcome-positive-subtle-fg

Component API documentation — DAN-190

TemplatesTokensComponentsDocs
  • Added accessibilityNotes?: string[] field to ComponentEntry interface in registry-extended.ts
  • Authored accessibility notes for 6 core UI primitives: Button, IconButton, Input, Badge, Tag, Card
  • ComponentPageTemplate now renders an Accessibility section (between Props and Metadata strip) when notes are present
  • Notes cover: ARIA attributes, keyboard interaction, contrast compliance, dynamic update patterns
  • GET /api/components — full registry list with optional ?category, ?status, ?q filters

Experimental area: ∞ Canvas Grid + Spline 3D — DAN-169

TokensComponents
  • Infinite-depth pan/zoom canvas using retained-mode Canvas 2D rendering
  • 40×40 node grid with semantic status colors tied to --ds-color-* tokens
  • rAF draw loop outside React reconciler for 60fps performance
  • Mock mode (built-in random state churn) + Live WebSocket mode (JSON diff array)
  • Pan via drag, zoom via scroll, configurable update rate

Font floor sweep — DAN-171

TokensComponentsDocs
  • app/(site)/page.tsx — 11 badge/label instances
  • app/(site)/a2ui/components/page.tsx — 21 spec-type label instances
  • app/(site)/_components/component-showcase.tsx — 5 instances
  • app/(site)/_components/token-demo.tsx — 5 instances
  • app/(site)/foundation/heuristics/page.tsx — 5 instances (Tailwind)

v1.4.0 — Sprint 26 Release

DAN-159TemplatesTokensComponentsDocs
  • @nodus/design-system@1.4.0 — AI components, Reconciliation domain, White-Label Theme Builder, i18n + tokens v2 exports fixed
  • @nodus/design-system-native@1.4.0 — React Native adapters (synchronized version bump)
  • @nodus/tokens@1.4.0 — standalone CSS token package (CDN-ready via jsDelivr + unpkg)
  • Three-package publish pipeline with synchronized 1.4.0 versioning
  • Bundle size budgets updated for v1.4.0 scope: ESM 260 kB / CJS 270 kB (gzip) — PASS

Post-Release Fixes & Theme Builder Enhancement

TokensDocs
  • Triadic hue rotation (fromSeedColor()): pick any brand hex color and derive a full semantic palette. The seed becomes agency; temporal and validation are derived at +120° / +240° on the hue wheel — mirroring the near-triadic relationship of the Nodus default palette.
  • "Seed" UI strip in the Theme Builder top bar: native <input type="color"> + hex text input + Generate button. Pressing Generate applies the derived triadic palette and marks the theme as Custom.
  • hexToHsl, hslToHex, isLightColor helpers added as pure math utilities (no DOM reads, SSR-safe).
  • Subtle and fg variants auto-computed: subtle = S 20% / L 96%; fg = white or #18181B based on Y-luminance.
  • Search index: Added 7 missing entries — Agentic Design Language overview, Agent Identity, Trust & Provenance, LLM Latency States, Agentic Playground, White-Label Theming guide, and Theme Builder sandbox tool. These pages were all unreachable via search.

Sprint 26 — White-Label Theme Builder

DAN-154Tokens
  • /sandbox/theme-builder: 3-pane interactive token editor.
  • Left: grouped token editor — agency/temporal/validation colors (color pickers), surface palette, radius scale (slider), mono font toggle
  • Center: live preview — miniature finance dashboard renders in real-time as tokens change; dark/light mode toggle
  • Right: export panel — CSS custom property sheet, Tailwind config object, JSON token map, createTheme() call
  • Powered by lib/create-theme.ts themeToVars() and serializeThemeToCss() utilities

Sprint 26 — Reconciliation Domain

DAN-156Components
  • ReconciliationSummary — Dashboard header card: total items, matched %, open exceptions, oldest break age, last run time. MetricCard grid with match-rate progress bar. Optional refresh callback.
  • MatchQueue — Two-column match interface. Left: unmatched items with queue-depth badge. Right: ranked candidates with confidence scores (HIGH/MED/LOW). Match and Reject actions per candidate.
  • ExceptionManager — Full reconciliation exception table with type/status/age filters, batch-action toolbar (escalate, resolve, assign), and inline status update per row. Age-sorted by default.
  • BreakAnalysisPanel — Root-cause analysis for a single break. Metadata grid, field-level criteria diff view (internal vs counterparty), chronological history timeline, resolution notes editor.
  • AgedItemsList — Time-bucketed aged items: 0–30 / 31–60 / 61–90 / 90+ days. Color-coded signals (green → amber → red). Click-to-drill bucket headers. Sparkline trend per bucket.

Sprint 26 — Documentation v2

DAN-157TokensComponentsDocs
  • /foundation/component-graph: Interactive SVG dependency graph — 223 components, filter by category, hover highlights, click to navigate.
  • Row-layered layout: Patterns → AI & Agent → Finance → UI Primitives with 22 curated dependency edges.
  • /components/ai-agent: Full docs page for the AI & Agent component category.
  • Streaming state machine (IDLE → STREAMING → COMPLETE/ERROR)
  • When to use / When not to use guidance for all 5 components

Sprint 26 — Brand & Portfolio

DAN-160TemplatesTokensComponentsDocs
  • AI-Era Visual Narrative: Awards page now leads with "The only design system built for the agent era" — the 5 Sprint 26 AI-native components (StreamingArtifact, ContextWindowMeter, FunctionCallVisualizer, ModelSelector, GenerativeFormFill) are the flagship showcase with code snippet + architecture diagram.
  • Submission Package Updated: Description, tags, and version updated to v1.4.0 (Sprint 26). Technologies updated to include Anthropic SDK and WebGL.
  • CSS Design Awards Added: Second awards track added alongside Awwwards — AI-Native Component Showcase submission.
  • Recognition Track Expanded: 6 entries (was 4) — Claude API Integration and CSS Design Awards added.
  • Social Assets Spec: Twitter/X (1200×675), LinkedIn (1200×627), Product Hunt gallery, OG image — all documented with ready-to-publish copy.

Sprint 26 — AI-Native Templates

DAN-155TemplatesComponents
  • Multi-Agent Pipeline (/a2ui/templates/multi-agent-pipeline) — Visualize and manage multi-agent workflows: pipeline stage diagram with status pills, per-agent status cards with progress bars, task delegation tree, conflict detection and auto-resolution panel, full audit trail feed (HANDOFF/CONFLICT/INTERRUPT/COMPLETE events), and human interrupt/override controls.
  • Knowledge Base Search (/a2ui/templates/knowledge-search) — Semantic search and retrieval interface: query bar with suggested hints, vault boundary filter with access-level badges (RESTRICTED/CONFIDENTIAL/PUBLIC), result cards with confidence meters, highlighted excerpt rendering, collapsible source provenance chain (ingest → chunk → embed → index), and latency/model stats panel.

Sprint 26 — AI-Native Component Pack

DAN-153TokensComponents
  • StreamingArtifact — Renders streamed code/markdown/text output. Features: line-numbered code view, diff view (+/- rows with semantic colors), streaming cursor blink, auto-scroll to tail, copy button, error state. Props: content, kind, language, state, diff, showLineNumbers, showCopy, maxHeight.
  • ContextWindowMeter — Segmented token usage bar for conversation context. Segments: system (muted), user (temporal/blue), assistant (agency/red), tools (validation/gold). Warning state at 80%, critical overflow alert at 95%. Props: segments, limit, model, warnAt, criticalAt, showLegend, compact.
  • ModelSelector — Model picker for Claude model family (Haiku/Sonnet/Opus). Each option: context window size, capability chips (VISION, TOOLS, STREAM, THINK, BATCH, FILES, CUA), cost tier, latency tier. Dropdown and inline panel variants. Props: options, value, onChange, variant, label.
  • FunctionCallVisualizer — Tool call execution card. Line-numbered JSON input/output, status badge (PENDING/RUNNING/DONE/ERROR), semantic border color per state, duration display, call ID traceability, collapsible panel. Props: name, input, status, output, error, durationMs, callId, defaultCollapsed.
  • GenerativeFormFill — Form field with AI-assist. Ghost suggestion text, Tab-to-accept / Escape-to-reject keyboard shortcuts, provenance badge (model + confidence %), generating pulse animation, full ARIA labeling. Props: value, suggestion, model, generating, confidence, onAccept, onReject.

v1.3.0 — Sprint 25 Release

DAN-150TemplatesTokensComponents
  • @nodus/design-system@1.3.0 — web components + tokens v2 + WebGL charts + i18n
  • @nodus/design-system-native@1.3.0 — React Native adapters (renamed from @dana/nodus-ds-native)
  • @nodus/tokens@1.3.0 — standalone CSS token package (new; CDN-ready via jsDelivr + unpkg)
  • Three-package publish pipeline with synchronized versioning
  • Bundle size budgets via size-limit (250 kB ESM / 260 kB CJS)

Design Tokens v2 Implementation

DAN-149TokensComponents
  • lib/dark-mode-derive.ts — OKLCH-based dark-mode derivation algorithm. Converts hex → OKLCH color space (Björn Ottosson), transforms lightness by semantic role (surface/text/accent/subtle), reconverts to hex. Perceptually uniform — hue and chroma preserved across modes.
  • scripts/build-tokens.ts — Build step that generates public/tokens/semantic.v2.css. Combines OKLCH-derived dark values for accent colors with precision-hardcoded Bauhaus neutral scale for surfaces/text. Run via npm run build:tokens.
  • public/tokens/semantic.v2.css — Generated v2 token file served statically. Consumed by the Playwright token regression spec (DAN-151) for v1→v2 visual comparison runs.
  • lib/token-versions.ts — Token versioning and deprecation registry. TOKEN_VERSION = "2.0.0". Provides isDeprecated(), getDeprecationInfo(), warnIfDeprecated() for dev-mode console warnings on v1 token usage.
  • lib/create-theme.ts — Added v2 palette shorthand API: createTheme({ palette: { primary, accent, neutral } }). Derives agency/temporal colors from 3 brand colors. Backward-compatible with existing colors field API.

i18n Runtime

DAN-147Components
  • formatNumber(value, locale, options) — decimal, compact, scientific notation; NaN/Infinity guards; normalizes -0
  • formatCurrency(value, currency, locale, options) — symbol placement, accounting currencySign, compact notation, per-locale decimal precision
  • formatDate(value, locale, options) — accepts Date / timestamp / ISO string; short/medium/long/full dateStyle
  • formatRelativeTime(value, locale, now?) — "yesterday", "1 hour ago", "in 3 days"; 7-step resolution cascade
  • SUPPORTED_LOCALES — ["en-US", "en-GB", "de-DE", "fr-FR", "ja-JP", "ar-SA", "he-IL"]

WebGL Chart Primitives

DAN-144TokensComponents
  • Shared infrastructure context for all GL charts
  • CSS token bridge: tokenToRGBA(cssVar) resolves DS semantic tokens → WebGL RGBA float arrays via computed style; handles nested var() chains and oklch values
  • Shared requestAnimationFrame scheduler: single rAF loop, multiple chart callbacks
  • createWebGLContext: WebGL2 preferred, automatic fallback to WebGL1
  • compileProgram: vertex + fragment shader compilation with error logging

v1.3.0-alpha — Sprint 24 Release

DAN-141TokensComponentsDocs
  • React Native package scaffold: packages/nodus-ds-native/ (@dana/nodus-ds-native v1.3.0-alpha.0)
  • RN token bridge: semantic color, spacing, typography, and finance-density tokens ported to React Native StyleSheet values
  • RN CI pipeline: .github/workflows/rn-ci.yml (TypeScript check, Jest native tests, Expo bundle check, EAS Update)
  • EAS configuration: expo-eas.json — development, preview, and production build + update channels
  • Native README: README.native.md with live preview QR code placeholder and package split documentation

v1.2.0 — Sprint 23 Release

DAN-134TemplatesTokensComponentsDocs
  • FX & Derivatives: FXRateCard, VolatilitySurfaceChart, DerivativesPositionTable, SwapTicketCard, OptionChainTable, HedgeEffectivenessGauge (DAN-127)
  • Payments & Settlement: PaymentLifecycleTracker, DualControlPanel, SanctionsCheckBadge, SettlementNetCard (DAN-131)
  • Risk Analytics A2UI templates: VaR Dashboard, Stress Testing, Limit Management (DAN-128)
  • Developer CLI: npx nodus-ds add <component> scaffolding tool (DAN-129)
  • Storybook 8: 55 stories for Sprint 21-22 voice and collaboration components (DAN-130)

Sprint 23: Payments & Settlement component suite

DAN-131TemplatesTokensComponentsDocs

Sprint 23: Storybook 8 — Sprint 21-22 story coverage

DAN-130TemplatesComponentsDocs

Sprint 23: FX & Derivatives component suite

DAN-127TemplatesTokensComponentsDocs

Sprint 23: Developer CLI — `npx nodus-ds add <component>`

DAN-129TokensComponentsDocs
  • npx nodus-ds add <component> — copies component source with token hints and import snippet
  • npx nodus-ds add --list — lists all components by category from registry.json
  • npx nodus-ds init — detects framework, injects CSS token imports, checks Tailwind
  • npx nodus-ds tokens [--format ts|css] — exports tokens as CSS or TypeScript const

Sprint 22: Voice interface primitives

DAN-123Components
  • States: idle, listening (agency red), processing (temporal blue), done, error
  • 7-bar waveform animates to audio amplitude during listening (real or simulated)
  • Bars freeze and stagger-pulse during STT processing
  • Color rule: listening = agency red (user-initiated agentic action), processing = temporal blue (computation)
  • Full keyboard + screen reader support; aria-pressed for listening state

Sprint 22: Runtime ThemeProvider — CSS custom property theming system

DAN-119TemplatesTokensComponentsDocs
  • ThemeConfig interface — typed overrides for colors, typography, radius, and spacing
  • ResolvedTheme — fully-populated theme with all fields present (no optionals)
  • createTheme(config?) — factory that merges user overrides onto Nodus base defaults
  • themeToVars(theme) — maps a ResolvedTheme to a Record<string, string> of --ds-* CSS custom properties
  • serializeThemeToCss(theme, selector?) — SSR-safe serializer; outputs a CSS declaration block for injection into <style> tags

Sprint 22: Design system governance — RFC process, versioning, contribution model

DAN-125TemplatesTokensComponentsDocs

Sprint 22: Realtime collaboration UI patterns

DAN-122TokensComponentsDocs

Sprint 22: TypeDoc API documentation — TSDoc on top 20 components

DAN-121ComponentsDocs
  • Button — variant/size/loading prop descriptions + example
  • Badge — semantic color pillar descriptions per variant + example
  • Card — variant/label prop docs + example
  • Input — label/state/hint prop docs + accessible ID wiring note + example
  • Modal — composite usage example, ModalTrigger/ModalClose inline docs

Sprint 22: Performance & bundle audit — Lighthouse CI, route splitting, Web Vitals

DAN-124TemplatesTokensComponents
  • @next/bundle-analyzer — npm run analyze script (ANALYZE=true npm run build) opens interactive treemap for identifying bundle bloat
  • @vercel/analytics + @vercel/speed-insights — real-user Web Vitals reporting via Vercel's edge analytics pipeline
  • app/(site)/a2ui/templates/loading.tsx — route-level Suspense streaming boundary for all A2UI template pages; reduces TBT by deferring heavy client component hydration until after FCP
  • .github/workflows/lighthouse.yml — Lighthouse CI workflow running on every PR and main push; audits 4 key routes with desktop preset
  • lighthouserc.json — performance budget configuration: LCP ≤ 2500ms, TBT ≤ 200ms, performance score ≥ 0.8, accessibility score ≥ 0.9

Sprint 22: NPM package distribution — @nodus/design-system publishable build

DAN-118TokensComponents
  • src/index.ts — top-level library entry point re-exporting all UI, finance, and pattern components plus cn and useStagedReveal utilities
  • tsup.config.ts — dual ESM/CJS build with tree-shaking, source maps, and type declarations; all React/Next/Radix peers externalized
  • CONTRIBUTING.md — component authoring guide covering token architecture, design rules, WCAG requirements, Strict Mode safety, and library build
  • package.json — added main, module, types, exports, and files fields for proper NPM distribution; moved React, react-dom, next, framer-motion, lucide-react, and recharts to peerDependencies; added build:lib script and tsup ^8.4.0 devDependency; token CSS files exposed via exports subpaths

Sprint 21: Storybook links and version bump to v1.1.0

DAN-116TemplatesTokensComponentsDocs

Sprint 21: Claude Agent SDK × Nodus DS integration showcase templates

DAN-112TemplatesTokensDocs
  • Human-in-the-loop approval interface for Claude Agent SDK require_approval flows
  • Pending requests list with risk-level badges (critical/high/medium/low), expiry timers, and approve/deny actions
  • Expandable detail panels: description, risk assessment, full tool_use input block, agent context metadata
  • Fleet metrics: pending count, approved/denied today, avg response time
  • Mock data mirrors real SDK approval request shapes (batch payments, sanctions overrides, FX forwards)

Sprint 21: Brand identity refresh — design system site visual polish

DAN-115TokensComponentsDocs
  • Hero subtitle updated: "The design language for the autonomous era." (sharper value statement)
  • Body copy tightened: 233 components, 41 agent patterns, semantic color in one sentence
  • Removed local divider constant — now imported from lib/site-styles.ts
  • All inline font stacks replaced with MONO, DISPLAY, SERIF constants
  • sectionHeading, sectionHeadingSerif, arrowLink, indexNumber, tagPill applied throughout

Sprint 21: Changelog site — versioned release notes page

DAN-113TemplatesTokensComponentsDocs
  • Category filter tabs: All / Components / Tokens / Templates / Docs — live counts per category
  • SERIF italic release titles, MONO dates and ticket chips, DS-styled category pills
  • Agency red left accent for sprint-tagged major releases, temporal blue for minor
  • RSS feed link in page header, entry count in footer

Sprint 21: Global component search and filtering

DAN-114TemplatesComponentsDocs
  • Search page (/search): debounced input (300ms), instant results from the full index, keyboard navigation (↑↓ + Enter), clear button, result count
  • Category filters: All, UI Components, Finance, Patterns, A2UI Templates, Foundation — rendered in left sidebar (desktop) or collapsible panel (mobile)
  • Domain tag filters: Agentic, Treasury, Payments, Risk, Compliance, FX, Derivatives, Liquidity, Funding, Data Viz — multi-select checkboxes
  • Domain tags in search index: SearchEntry.domainTags field added; inferred from subcategory (e.g. finance → treasury/payments/risk/compliance/fx, agentic subcategories → agentic) and from A2UI template descriptions via keyword matching
  • Match highlighting: query terms highlighted in result name and description

Sprint 21: Vercel deployment pipeline with CI gate

DAN-109TokensDocs
  • CI gate for production: ci.yml now triggers on push to main (was dev-only). Added deploy job gated on needs: [typecheck, build, test, attestation] — production deployment to Vercel only fires after all CI checks pass.
  • README status badges: CI workflow badge, Chromatic badge, and Vercel deployment badge added.
  • Deployment pipeline confirmed: design.dana.xyz resolves to the production Next.js site. Each PR receives a unique Vercel preview URL via the Vercel GitHub integration. Chromatic visual tests run on Storybook stories for every push to main and PRs.
  • Required secrets: VERCEL_TOKEN, VERCEL_ORG_ID (team_pamm24pZnHtoePWFtJldYofV), VERCEL_PROJECT_ID (prj_CmSvgVn3weuFQ0NCyQnTXirKCPAW) must be set in GitHub repo secrets to activate the CI-gated deploy job.
  • Dashboard note: Disable Vercel's auto-deploy for the production branch (Project → Settings → Git) to prevent a double-deploy race with the GitHub Actions deploy job.

Sprint 20: Advanced agentic interaction templates

DAN-105TemplatesTokensComponents

Interactive token explorer: live preview + cross-reference

DAN-108TokensComponentsDocs

S20: Agent Process Portfolio Showcase

DAN-107TemplatesTokensComponentsDocs
  • Hero + System Metrics — 6-stat grid: 150+ templates, 325 components, 20 sprints, 153 commits, 216 docs, 8 agents
  • Agent Roster — Full 8-agent table: Chief Visionary, Component Engineer, UX Designer, Template Architect, Quality & Accessibility Lead, Documentation Architect, DevOps & Release Engineer, Brand & Portfolio Lead. Color-coded by tier (red/blue/gold/gray), each with domains and responsibility description.
  • S01–S20 Sprint Timeline — 20-cell grid showing focus area and deliverables per sprint. Color encodes phase: blue=infrastructure, gold=quality gates, red=expansion.
  • 6-Phase Agentic Workflow — Brief → Design → Validate → Document → Ship → Showcase. Each phase shows owning agent, action taken, and output artifact.
  • Quality Signal Table — 8 metrics: WCAG AA, TypeScript strict, visual regression, token compliance, font floor, touch targets, mobile responsiveness, component docs — all passing.

Storybook coverage: 26 missing UI component stories

DAN-106TokensComponentsDocs

Mobile-first component documentation for all 216 UI components

DAN-98TemplatesTokensComponentsDocs
  • Works As-Is → --ds-color-outcome-positive (green)
  • Touch Target → --ds-color-validation (gold)
  • Stacks / Scroll → --ds-color-temporal (blue)
  • Mobile Adapted → --ds-color-temporal (blue)
  • works-as-is: 57 components (display, typography, small indicators)

FX Hedging Workflow A2UI template

DAN-100TemplatesDocs

AdaptiveChartContainer: responsive chart/metric card pattern

DAN-101TokensComponents
  • Desktop (≥768px): renders the full chart passed as the chart prop (LineChart, BarChart, AreaChart, etc.)
  • Mobile (<768px): collapses to a compact 64px metric card showing key stat + period-over-period delta + optional sparkline trend
  • chart — any ReactNode (full chart component)
  • metricValue / metricLabel — primary KPI for mobile card
  • metricFormat — currency | rate | percent | bps | integer | decimal

Token Fix: A2UI_LIGHT categorical color tokens

DAN-30TemplatesTokens
  • blueBg → color-mix(in srgb, --ds-viz-cat-1 10%, transparent)
  • purple → var(--ds-viz-cat-4, #7B52CC) (violet — correct categorical color for tier differentiation)
  • purpleBg → color-mix(in srgb, --ds-viz-cat-4 10%, transparent)

Payment Approval Workflow Template

DAN-99TemplatesComponentsDocs
  • Payment Queue — 5 payment entries across SWIFT, SEPA, Fedwire rails with amount, beneficiary, status, and priority. Click-to-select panel detail view.
  • Sanctions Screening — AI screener panel showing OFAC SDN, EU Consolidated, UN Security Council, HM Treasury, and OFSI list results. Clear/review/match/pending states with confidence detail.
  • Dual-Control Authorization — Maker/Checker approval ceremony. Independent authorization steps with timestamp and name attribution. Sequential gate enforcement.
  • Release Gate — Pre-flight checklist (Sanctions, Maker Auth, Checker Auth, Value Date, Nostro Funds) before payment submission to network. Animated releasing state.
  • Settlement Tracking — UETR display, 5-step settlement timeline (Initiated → Authorized → Submitted → Acknowledged → Settled), completion timestamp.

S18: Mobile Responsiveness + Workflow Templates (DAN-95, DAN-96)

TemplatesTokensDocs
  • .ds-stat-grid — 4-column stat rows collapse to 2×2 on ≤600px (homepage, A2UI listing)
  • .ds-foundation-grid — 3-column foundation grids → 2-col at 900px, 1-col at 600px
  • .ds-a2ui-scroll-container — complex financial templates scroll horizontally on mobile with scroll indicators
  • a2uiWrapper padding now uses clamp() for fluid mobile-to-desktop scaling
  • app/(site)/page.tsx — stat row grid responsive

S17: A2UI Template Expansion — 142 Templates

DAN-90TemplatesTokensComponents
  • Agent Pipeline Dashboard: Multi-stage pipeline table with per-agent assignment, all-pipelines list, event log, 4 metrics cards.
  • Agent Coordination Center: 12-agent registry by tier (orchestrator/specialist/utility), dispatch queue with priority levels, activity log.
  • AI Model Comparison: Side-by-side opus/sonnet/haiku evaluation with quality scoring (faithfulness/groundedness/conciseness), cost/latency metrics, eval history.
  • Agent Performance Analytics: 7-agent leaderboard with task throughput, success %, token cost, escalations; daily volume chart; error log.
  • Prompt Engineering Workspace: Prompt library sidebar, variable injection panel, version history (v1–v4), A/B test runner results.

S16: Agentic AI Pattern Library — 16 New Components

DAN-88TokensComponents
  • AgentThinkingIndicator: Streaming token-by-token output visualization with cursor blink and temporal-blue pulse. Distinct from ThinkingState (reasoning trace) — renders raw stream.
  • AgentConfidenceBar: Horizontal confidence score bar with outcome-based color tiers (low/moderate/high). Role: meter, context label, numeric pct.
  • AgentSourceCitation: Structured provenance citation list — source type badges (DOC/DB/WEB/AGT/VLT/USR), relevance scores, excerpts, retrieval timestamps.
  • AgentDecisionTree: Recursive branching decision visualization — taken/skipped/pending nodes, terminal pass/fail outcomes, depth-indented rendering.
  • MultiAgentOrchestrationView: Horizontal pipeline view for multi-agent workflows — step nodes with status, connector lines, derived overall state.

S15: Capability Patterns

DAN-86ComponentsDocs
  • AgentCapabilityMatrix: Scannable grid of agents × capability dimensions (read/write/approve/transact/escalate). Blue=granted, gold=conditional, red=denied. Agent sigil + name + role in identity column. Click-to-focus row for drill-down. Legend bar.
  • CapabilityGrant: Single permission grant card with condition badges (time-bounded/value-bounded/approval-gated), status chip, meta row, collapsible audit trail (via ProvenanceChain), and revoke trigger.
  • CapabilityRevokeFlow: Two-step revocation ceremony. Step 1: impact preview (will-fail / may-degrade / unaffected tasks). Step 2: mandatory written reason — enforces non-repudiable audit trail.
  • Foundation page: /foundation/capability-patterns — color semantics table, live demos for all three components, prop tables, anti-patterns, and design rules.
  • Exported from components/patterns/index.ts, registered in registry-extended.ts, added to lib/sidebar-nav.ts.

S15: Post-deploy Smoke Test Script

DAN-84TemplatesComponents
  • Routes covered: all 215 UI components (/components/:slug), 47 patterns (/patterns/:slug), all A2UI templates (/a2ui/templates/:slug), plus ~35 static site routes — ~300+ routes total
  • SSG failure detection: checks for React null/render crashes, useContext missing provider crashes, and module resolution / chunk load failures
  • Output: console pass/fail summary + scripts/smoke-test-report.md (route table with status, duration, failure signals)
  • Timeout: 30s total (parallel fetch, 15s per-route limit)
  • Exit codes: 0 = all pass, 1 = failures found, 2 = global timeout or fatal error

S15: Theme Configuration Template

DAN-85TemplatesTokensComponents
  • 3 preset skins: Nodus Default (base), Enterprise Dark (dark surface trading floor), High-Contrast Accessible (WCAG AAA)
  • SkinProvider component: wraps any React subtree in data-skin attribute for scoped CSS custom property overrides
  • Live Preview panel: header bar, KPI row, status badges, and mini payment table rendered in the active skin
  • Token Overrides table: shows every --ds-* token that changes per skin with color swatch, base hex, and override hex
  • CSS Export panel: generates ready-to-drop [data-skin="..."] { } CSS block with copy-to-clipboard

S14: Real-time Hooks

DAN-80TokensComponentsDocs
  • Returns { chunks, status, latency, start, reset }
  • status: "idle" | "streaming" | "complete" | "error"
  • latency: time-to-first-token in ms (simulated)
  • Options: content, chunkInterval (ms), chunkSize (chars), ttft (ms)
  • React Strict Mode safe — all timers cleared on unmount

S13: Prop Stress-Tester

DAN-77Components
  • Test matrix per component: empty strings, 200+ char strings, unicode, special chars, all enum values, boundary numerics (0, 1, -1, out-of-range), null/undefined optional props, empty/large arrays
  • Components covered: AgentIdentityBadge, ProvenanceChain, StreamingResponse, ApprovalQueue, AgentConflictPanel, ChartTooltip, ChartAnnotation, ConfidenceMeter, ConsentFlow, EscalationBanner, ThinkingState
  • Report written to scripts/stress-test-report.md on each run

S13: Error State Pattern System

DAN-79TokensComponentsDocs
  • severity="fatal" → --ds-color-outcome-negative (red) — unrecoverable, no retry
  • severity="recoverable" → --ds-color-validation (gold) — human action resolves it
  • severity="transient" → --ds-color-temporal (blue) — auto-retry in progress

S12: Enhanced Component Search with Faceted Filtering

DAN-74TemplatesTokensComponentsDocs
  • components/site/CommandSearch.tsx — full rewrite
  • Filter bar with 3 facets: Category (All / UI / Patterns / A2UI / Foundation), Status (All / Stable / Experimental), Since (All Sprints / S9+ / S11+)
  • Match highlights: query text highlighted in gold (--ds-color-validation) in result names and descriptions
  • Rich result rows: name + status badge + sprint label + description + subcategory metadata inline
  • Active indicator bar (--ds-color-temporal) on selected result

S12: Debt Capital Markets Template

DAN-75TemplatesTokensDocs
  • app/(site)/a2ui/templates/debt-capital-markets/page.tsx — new template
  • Mandate: deal terms panel + mandate detail + ProvenanceChain
  • Structuring: AgentConflictPanel (Pricing Agent vs. Risk Agent on yield spread) + ProvenanceChain
  • Book-building: coverage ratio bar, investor order book (10 investors), EscalationBanner when coverage < 100%, ApprovalQueue for board sign-off
  • Settlement: deal summary, 6-item checklist, full 11-step ProvenanceChain

S11: Component Versioning System

DAN-71TemplatesComponentsDocs
  • registry-extended.ts — ComponentEntry interface extended with four new optional fields:
  • version?: string — semver string (e.g. "1.0.0")
  • since?: string — sprint label when component was introduced (e.g. "S1")
  • deprecated?: boolean — triggers DeprecationBanner on component pages when true
  • deprecationNote?: string — migration guidance shown in the banner

S10: v1.0 Release Notes Foundation Page

DAN-69TokensComponentsDocs
  • app/(site)/foundation/release-notes/page.tsx — new Foundation page with:
  • Stat strip: 9 sprints · 233+ components · 1,534 tests · 200+ tokens
  • ProvenanceChain visual metaphor — S1→S9 chain using source → transform → inference → output step types to map the system's evolution
  • Sprint timeline — S1–S9 grouped sections (newest first), collapsible per sprint, EXPAND ALL / COLLAPSE ALL controls
  • Status badges — NEW (blue) · UPDATED (gold) · FIXED (green) with WCAG AA contrast

S10: Intercompany Netting Template

DAN-70TemplatesTokensComponentsDocs
  • New A2UI template at /a2ui/templates/intercompany-netting
  • Replaced hardcoded hex colors with var(--ds-*) semantic tokens
  • Fixed setTimeout calls — cleanup-safe useFlowRunner hook with useRef + useEffect cleanup
  • Canonical footer: left spacer · center Templates link · right skill tags
  • Registered in lib/sidebar-nav.ts and lib/search-index.ts

S9: TypeScript Type Exports Barrel

DAN-65TemplatesTokensComponentsDocs
  • components/patterns/ProvenanceChain.tsx — exported ProvenanceStep, ProvenanceStepType, ProvenanceStepStatus, ProvenanceChainProps
  • components/patterns/ApprovalQueue.tsx — exported ApprovalItem, RiskLevel, ApprovalQueueProps
  • components/patterns/ConfidenceMeter.tsx — exported ConfidenceMeterProps, ConfidenceSingleAxis, ConfidenceDualAxis, ConfidenceThresholds
  • components/patterns/ConsentFlow.tsx — exported ConsentStep, ConsentPermission, ConsentFlowProps
  • components/patterns/index.ts — added ConflictLayout, ResolutionOutcome, AvatarUser, AvatarStackProps, SourceType, and all newly exported pattern types

S9: Iconography System

DAN-67TokensComponentsDocs

S8: Light Mode Parity Audit

DAN-64TokensComponents
  • AgentIdentityBadge — CapabilityChip (requiresApproval), PanelBadge approval notice
  • EscalationBanner — "ESCALATION — HUMAN REQUIRED" header text
  • StreamingResponse — "CONTINUE RESPONSE" button text (--ds-surface-ground on gold was 2.4:1)
  • AgentConflictPanel — validation button variant, SELECTED badges (×3), consequence warning text, mode header badge
  • EscalationBanner — suggested action body text

S8: Token Explorer Live CSS Reads

DAN-62TokensComponentsDocs
  • Token Explorer (/foundation/tokens) — all color swatches now read live values from the browser via getComputedStyle, replacing hardcoded hex fallbacks
  • Color tokens resolved by setting background-color: var(--token) on probe spans and reading computed RGB — correctly resolves var() chains
  • Light and dark values pre-loaded at mount by temporarily toggling data-theme on documentElement (synchronous, no visible flash)
  • Contrast ratios recompute from live hex values after hydration
  • darkPreview toggle picks from the pre-loaded dark map — no re-read required on toggle

S8: Motion Token Migration

DAN-61TemplatesTokensComponentsDocs
  • Hardcoded transitions eliminated — 39 files migrated from raw 0.15s/80ms/120ms/300ms values to --ds-motion-* semantic tokens
  • 80ms → var(--ds-motion-interaction) var(--ds-motion-easing-productive) (hover/click micro-feedback)
  • 120ms / 150ms / 0.15s → var(--ds-motion-duration-fast) var(--ds-motion-easing-productive) (state changes, badge hover)
  • 300ms → var(--ds-motion-deliberate) var(--ds-motion-easing-productive) (bar fills, major reveals)
  • 0.12s linear / 0.15s linear → var(--ds-motion-duration-fast) linear (progress bars)

S7: Token Explorer

DAN-58TokensComponentsDocs
  • Token Explorer (/foundation/tokens) — Rebuilt as a live, searchable three-layer reference:
  • Search — filters across all ~200 tokens (name + description) with layer badges (primitive / semantic / component)
  • Dark/Light preview toggle — swatch panels and live component previews update reactively
  • Contrast ratios — every color token shows ratio vs current surface with WCAG AA/AAA grade badge
  • WCAG note on --ds-color-validation — "dark mode only — 5.96:1 on dark surface" per DAN-57 audit

S7: Portfolio Risk Overview Template

DAN-59TemplatesTokensComponents
  • Portfolio Risk Overview (/a2ui/templates/portfolio-risk-overview) — Flagship morning risk dashboard showcasing all 10 agentic pattern components in a single-scroll 3-column layout.
  • AgentIdentityBadge × 3 — Risk Orchestrator (active), Credit Risk Agent (idle), Market Microstructure (pending) in card surface
  • ProvenanceChain — 8-step overnight analysis pipeline with 2 pending steps
  • StreamingResponse — Portfolio commentary arriving live with token-rate display
  • ThinkingState — Market Microstructure agent reasoning with partial trace

S6: Agentic Component Playground

DAN-55TokensComponentsDocs
  • Agentic Playground (/foundation/agentic-playground) — Interactive reference page for all 10 core agentic pattern components. No external Storybook dependency.
  • AgentIdentityBadge — role (5 tiers), surface (inline/card/panel), state (5 states), offline and timeout edge states
  • ProvenanceChain — fresh, stale (staleness threshold demo), and partial completion variants
  • StreamingResponse — live stream simulation, truncated output, token timeout silence detection
  • ApprovalQueue — 4 items at mixed risk levels, partial completion (pre-decided items) edge state

S6: Live FX Monitor Template

DAN-56TemplatesComponents
  • Live FX Monitor (/a2ui/templates/live-fx-monitor) — Real-time FX desk monitor template demonstrating the design system under rapid state changes.
  • Simulated live rate feeds for EUR/USD, GBP/USD, USD/JPY, USD/CHF via setInterval with strict mode safe cleanup
  • Interactive rate ticker cards — click to switch chart focus; threshold proximity warning in gold
  • Intraday sparkline chart with ChartAnnotation (threshold line + live dot observation)
  • AgentIdentityBadge (inline + card) for FX-Executor (EXECUTOR role) — state transitions: pending → active → idle

S5: Cascaded Conflict (3+ Agents) in AgentConflictPanel

DAN-51TokensComponents
  • AgentConflictPanel — Added conflictLayout?: 'parallel' | 'ranked' | 'auto' prop (default: 'auto'). Also added ConflictLayout type export.
  • auto: uses parallel for exactly 2 positions, ranked for 3+.
  • ranked: new RankedConflictView — positions sorted by confidence descending; each card is full-width with #N rank badge; expandable reasoning per card; radio-style selection; 5+ positions collapse to top 5 with SHOW ALL (N) POSITIONS control.
  • Post-resolution (ranked): all positions remain visible — winner highlighted with --ds-color-outcome-positive border + ACCEPTED badge; others rendered at 50% opacity with DEFERRED label.
  • Dynamic header: "{N}-WAY CONFLICT DETECTED" when N >= 3; "Agents disagree" for N=2.

S5: Agent Unavailable Edge States

DAN-50TokensComponents
  • AgentIdentityBadge — Added agentOnline?: boolean prop. When false: monogram renders at 50% opacity with --ds-color-outcome-negative border and static red corner dot; inline variant shows "(unavailable)" suffix and muted name; card variant adds an AGENT UNAVAILABLE banner strip with negative background; panel variant adds a full-width offline banner with last-seen timestamp. Role badge shifts to neutral gray. StatusDot hidden in panel variant (no live status to show).
  • EscalationBanner — Added targetAgentOnline?: boolean prop. When false: a TARGET AGENT OFFLINE — CANNOT ACCEPT ESCALATION notice strip renders above the gold escalation header (using --ds-color-outcome-negative); suggestedAction is overridden to "REASSIGN to an available agent"; the "SUGGESTED ACTION" label becomes "REQUIRED ACTION" in negative color. Gold banner structure unchanged.
  • ConsentFlow — Added agentOnline?: boolean prop. When false: a REQUESTING AGENT OFFLINE — GRANT UNAVAILABLE banner renders above the step indicator (negative color); GRANT button is disabled (muted, cursor: not-allowed, opacity: 0.5); DENY button label changes to DISMISS REQUEST at step 0.
  • ThinkingState — Added agentOnline?: boolean prop. When false: left border → --ds-color-outcome-negative (static, no pulse); label → AGENT OFFLINE — REASONING UNAVAILABLE; elapsed timer suppressed (reasoning never started); component renders even with no trace/thinking state.
  • Agent unavailable = --ds-color-outcome-negative throughout — offline is a system failure state, not a validation gate

S5: Partial Completion Edge States

DAN-49TokensComponents
  • ApprovalQueue — Added initialDecided?: Record<string, "approved" | "rejected"> prop for externally pre-decided items. Header text switches to N REMAINING · M DECIDED format in partial state. Remaining items get a gold left border (--ds-color-validation). Decided items render with outcome tint background (green/red 8% mix) and an APPROVED/REJECTED badge; non-interactive. Internal outcomes state tracks both directions.
  • StreamingResponse — Added isTruncated?: boolean and onContinue?: () => void props. When isTruncated=true and not in timeout state: left border shifts to --ds-color-validation, status label shows TRUNCATED, and a gold notice block renders below content: RESPONSE TRUNCATED — OUTPUT INCOMPLETE · REVIEW BEFORE ACTING with an optional CONTINUE RESPONSE button.
  • ThinkingState — Added isInterrupted?: boolean prop. When true: left border → --ds-color-validation, pulse animation stops, label → REASONING INTERRUPTED — PARTIAL TRACE, elapsed counter → gold, trace gets a gold truncation marker — REASONING INTERRUPTED — INCOMPLETE — appended, footer shows PARTIAL TRACE ONLY — CONCLUSION NOT REACHED · REVIEW BEFORE ACTING. Early-returns guard updated to permit render when isInterrupted=true even with no active isThinking.
  • ProvenanceChain — Added status?: "complete" | "pending" | "failed" | "skipped" per step (backward-compatible; default = "complete"). When a chain has any non-complete step: muted rendering (opacity 0.6, --ds-text-muted label, --ds-border-separator indicator dot with dashed outline, model/confidence/timestamp suppressed), a gold STOPPED HERE truncation divider before the first incomplete step, and a gold footer CHAIN INCOMPLETE — N OF M STEPS EXECUTED. failed steps additionally use --ds-color-outcome-negative for the status badge.
  • Partial completion = --ds-color-validation (gold) throughout — partial output is a validation gate, not a system failure

S5: Stale Provenance Edge States

DAN-48TokensComponents
  • ProvenanceChain — Added stalenessThresholdMs?: number (default 1h) prop and lastUpdatedAt?: string per step. Steps with source data older than the threshold show a gold dot indicator and append (stale · {age}) to the label in --ds-color-validation. When any step is stale, a gold warning header row renders: ⚠ DATA STALENESS — OLDEST SOURCE: {age} AGO. Stale data is never hidden — it requires human judgment.
  • ChartInteractionLayer / ChartTooltip — Added staleAnalysisAge?: string prop. When source="agent" and this prop is set, a gold stale warning row renders at the top of the tooltip: ⚠ STALE ANALYSIS — {age} OLD, above the standard agent highlight header.
  • ChartInteractionLayer / ChartAnnotation — Added lastAnalyzedAt?: string, stalenessThresholdMs?: number (default 1h), and staleAnalysisAge?: string (pre-formatted override) props. Stale annotations display a gold outline ring on the marker pin/label and prepend ⚠ STALE ANALYSIS — {age} OLD to the expanded detail panel.
  • ConfidenceMeter — Added staleEvidenceAge?: string to both single-axis and dual-axis modes. When set, a gold stale warning renders below the meter(s): ⚠ BASED ON STALE EVIDENCE — {age} OLD. The displayed confidence score is never degraded — the score is accurate for the evidence it had.
  • Stale provenance = --ds-color-validation (gold) throughout — signals quality degradation requiring human judgment, not system failure

S5: Timeout Edge States

DAN-47TokensComponents
  • AgentIdentityBadge — Added timeoutAt?: string and timeoutThresholdSecs?: number props. When timeoutAt is set: caution-colored border and status dot, inline variant appends (no response · Ns), card variant shows AGENT TIMEOUT — NO RESPONSE banner, panel variant shows full caution banner with descriptive copy. No pulse while timed out.
  • StreamingResponse — Added tokenTimeoutMs?: number (default 30s), onRetry?: () => void, onCancel?: () => void props. Detects token silence via useEffect with setTimeout cleanup (Strict Mode safe). On timeout: left border shifts to caution, streaming cursor removed, notice + RETRY REQUEST / DISCARD actions appear. Partial content is always preserved.
  • ThinkingState — Added timeoutSecs?: number (default 120), onTimeout?: () => void, onRetry?: () => void, onEscalate?: () => void props. When elapsed >= timeoutSecs: pulse stops, border → caution, label → "TIMEOUT — REASONING HALTED", elapsed counter freezes at threshold, trace footer appended, retry/escalate actions rendered. onTimeout fires exactly once via ref guard.
  • Timeout = --ds-color-outcome-caution (orange) throughout — degraded waiting state, not failure
  • No agency red (agent has not acted; it has failed to respond)

S5: Agent Simulation Lab Template

DAN-45TemplatesTokensComponentsDocs
  • Agent Simulation Lab (app/(site)/a2ui/templates/agent-simulation-lab/page.tsx) — Treasury decision backtesting sandbox. Tests AI agent recommendations against historical stress scenarios.
  • Scenario selector — entity dropdown, 4 stress presets (SVB Stress, Rate Shock, Yen Carry Unwind, Base Case) with date ranges
  • Agent Stream tab — StreamingResponse component showing live agent reasoning via useStagedReveal (React Strict Mode safe); dual-axis ConfidenceMeter on completion
  • Results tab — Decision comparison table (AI recommendation vs actual outcome), per-decision ConfidenceMeter scores, alpha/match-rate summary cards
  • Provenance tab — ProvenanceChain showing source → transform → inference → output decision chain with model attribution

Hotfix: Treasury Daily Brief SVG hour label font floor

DAN-44TemplatesDocs
  • Treasury Daily Brief — Changed SVG hour label fontSize from 9 to 10 (app/(site)/a2ui/templates/treasury-daily-brief/page.tsx:183). Enforces the 10px font floor required by CLAUDE.md.

S4: TypeScript Strict Pass + Visual Regression Coverage

DAN-41TemplatesTokensComponentsDocs
  • TypeScript strict pass — tsc --noEmit now exits clean across the entire codebase. Fixed 60+ type errors across Sprint 1–3 additions:
  • registry-extended.ts — Added missing TokenFamily values ("color", "viz", "fin") and Subcategory values ("coordination", "dataviz")
  • tsconfig.json — Added components/__tests__/ and figma/ to the exclude list (test files are type-checked by vitest; figma Code Connect files require @figma/code-connect which is a separate tool)
  • 6 A2UI templates — Fixed narrow status type causing unreachable comparisons in KPICard/MetricCard component functions (bank-fee-analysis, budget-vs-actuals, credit-rating-monitor, derivatives-reporting, green-bond-tracker, ma-treasury)
  • foundation/agent-identity/page.tsx — Changed state="running" → state="active" to match DotState type

Treasury Daily Brief: Flagship Agentic Template

DAN-42TemplatesComponents
  • Treasury Daily Brief (/a2ui/templates/treasury-daily-brief) — Flagship template exercising the full agentic component stack in a single production-ready layout. Composes all six S3 agentic components: AgentIdentityBadge (card surface, which agent produced the brief), ProvenanceChain (6-source data trail with confidence scores), StreamingResponse (LLM-generated treasury commentary), ApprovalQueue (4 risk-rated actions), AgentConflictPanel (conflict mode: FX Agent vs. Risk Agent on EUR hedge), and ChartInteractionLayer (annotated intraday liquidity chart with comparison bar and three agent annotations). Showpiece template demonstrating why the design system exists.

S3: Token Compliance Audit + Font Floor Fix (DAN-32/35/36)

TokensComponents
  • Font floor enforcement — Raised all SVG and inline fontSize values below 10px to 10px across 11 finance chart components (AreaChart, BacktestingChart, BenchmarkComparisonChart, DivergingBarChart, GroupedBarChart, HeatmapChart, LearningMultiplierGraph, LineChart, ScatterChart, ScatterPlot, YieldCurveViewer) and 3 agentic pattern components (AgentConflictPanel, AgentIdentityBadge, ChartInteractionLayer)
  • Token compliance — Replaced color: "#fff" in VaultBoundary.tsx with var(--ds-text-inverse)
  • chart-tokens.ts — tickTextProps.fontSize raised from 9 to 10

A2UI Finance Sprint HB5: +20 Templates → 121 total (DAN-4 HB5)

TemplatesComponents
  • Netting Engine (/a2ui/templates/netting-engine) — multilateral net position matrix, settlement instructions, cycle compression
  • Credit Line Management (/a2ui/templates/credit-line-management) — facility utilization bars, drawdown history, covenant compliance
  • Custody & Clearing (/a2ui/templates/custody-clearing) — settlement queue, CSD connectivity, fails management, custody positions
  • FX Overlay Manager (/a2ui/templates/fx-overlay-manager) — currency exposure vs hedge bars, return attribution waterfall, rebalancing triggers
  • Liquidity Coverage Ratio (/a2ui/templates/liquidity-coverage-ratio) — Basel III HQLA composition, NCO categories, LCR trend chart

Multi-agent Coordination + Data Viz Interaction Components (DAN-29/DAN-30)

TemplatesTokensComponents
  • Multi-agent conflict resolution panel covering three interaction modes: conflict, delegation, and override
  • Conflict mode: parallel position display with agent identity, confidence meter, and reasoning trail; human selects winner or forces deferral
  • Delegation mode: explicit agent assignment or orchestrator hand-off with routing legibility before commit
  • Override mode: surfaces original agent action verbatim; requires explicit acknowledgement before applying override
  • Composes AgentIdentityBadge, ProvenanceChain, and ConfidenceMeter

Agentic Component Library: Spec Compliance Pass (DAN-23/25/26/27/28)

TokensComponents
  • Removed banned fake streaming simulation (setInterval character-by-character reveal)
  • Now displays content immediately; isStreaming prop drives the cursor/border only
  • StreamingDot disappears instantly on completion — no border-color transition (DAN-18 spec)
  • Changed all colors from --ds-color-agency (red) to --ds-color-validation (gold)
  • "Waiting for human" is an epistemic state, not an authority state (DAN-18 taxonomy)

Gap Fill Sprint: Risk, Payments, Compliance, Reconciliation

DAN-22Components
  • ES (CVaR) at configurable confidence level with VaR comparison and ES/VaR multiplier
  • Optional limit utilization bar; absolute loss display when notional provided
  • Credit rating with agency label and tier color coding (IG=green, sub-IG=caution, distressed=agency red)
  • Badge and card variants; outlook/watch status display
  • Historical and hypothetical stress scenarios with impact bars and pass/warn/fail status

Portfolio Domain Gap Components

DAN-21Components
  • Portfolio vs. benchmark cumulative return comparison with excess return (alpha) badge
  • Dashed benchmark line vs. solid portfolio line; color-coded excess return display
  • Fixed-income duration and convexity metrics: modified, effective, Macaulay duration, convexity, DV01
  • Optional ±100bps rate sensitivity scenario using first/second-order approximation
  • Par, spot (zero), and forward yield curve on single SVG chart with tenor dots

Finance Sprint: +12 A2UI Templates (DAN-4 Heartbeat 3)

TemplatesTokensDocs
  • Business unit capital envelope allocation vs. deployed YTD, ROIC tracking with hurdle rate bars
  • Capital request pipeline with status tracking (approved/pending/rejected)
  • Per-entity ESG scores with E/S/G sub-score breakdown bars; framework disclosure coverage (GRI, SASB, TCFD, CDP, SFDR)
  • Emissions stacked bar chart by scope 1/2/3 with YoY trend
  • SANCTIONS/AML/PEP/FATF screening queue with risk tier badges and rule performance table

Funding & Capital Domain + Shared Finance Primitives (DAN-19 / DAN-20)

TokensComponents
  • Compact chip for ISIN, CUSIP, SEDOL, FIGI, and RIC instrument identifiers
  • Standard label + monospace value side-by-side with optional click-to-copy
  • Type-coded colors: ISIN/CUSIP → temporal, SEDOL/FIGI → validation, RIC → muted
  • Tenor label chip (ON, TN, 1W, 3M, 1Y, 5Y, 30Y and free-form)
  • Duration-band color coding: overnight → positive, short → temporal, medium → validation, long → muted

Sankey & Treemap Chart Enhancements

DAN-11TokensComponents
  • Added density prop ("default" | "compact") — compact reduces node padding and label sizes
  • Fixed font sizes to meet 10px floor: node labels 11px (compact: 10px), sublabels 10px, flow labels 10px
  • All colors already token-native — dark/light mode verified
  • Added density prop ("default" | "compact")
  • Fixed dynamic font sizes to enforce 10px minimum (Math.max(10, ...) replacing Math.max(8, ...))

Risk Analytics Domain Primitives

DAN-9Components
  • Semicircular gauge showing VaR limit utilization 0–100%
  • Four severity tiers: safe → positive | elevated → validation | warning → caution | critical → negative
  • Threshold tick marks at configurable breakpoints (default: 60% / 80% / 95%)
  • Shows current value, limit, confidence level, and horizon in footer
  • Multi-band horizontal bar for counterparty, sector, and concentration limits

FX & Derivatives Domain Primitives

DAN-8TokensComponents
  • Horizontally scrolling rate ticker for live FX rate display
  • Continuous loop animation, pause-on-hover, configurable speed
  • Severity-colored directional change indicators via outcome token system
  • Designed for top-of-screen or panel header placement
  • Two modes: predefined pairs list (trading desk) or free-select from full ISO 4217 currency list

A2UI Template Anatomy Standard + Heartbeat 2 Templates (DAN-13/14/15)

TemplatesTokens
  • 5-slot system: header · metric strip (conditional) · tabs · content · footer
  • Footer canonical structure (left: toggle / center: ← Templates / right: skill tags)
  • 3 layout patterns: table, grid, flow
  • Data contract shape — naming conventions, status unions, approved mock entities
  • Agent-context props: AgentRef shape, status semantics, trust chain, token budget display

Full CLAUDE.md Enforcement Pass + Token Alias Fix + Navigation Redesign

TemplatesTokensComponents
  • apps/nodus-design-system/CLAUDE.md — full design context, token rules, anti-patterns, quality checklist
  • .claude/rules/design-system.md — auto-loading rules for any file touch in the design system
  • lib/site-styles.ts — shared style registry (single source of truth for site page styles)
  • lib/use-staged-reveal.ts — React strict mode safe staged reveal hook
  • --ds-bg-default → var(--ds-surface-ground)

Finance DS Adoption + Spacing Token Migration + Package Exports

TokensComponents
  • shared/card-states.tsx — Hand-rolled shimmer keyframes + SkeletonBar replaced with Skeleton; custom error/empty states replaced with EmptyState + Button
  • StatusBadge.tsx — Standalone <span> badge converted to thin adapter over DS Badge with outcome color overrides via style prop
  • ThresholdAlert.tsx — Raw <button> action replaced with Button variant="outline"
  • PaymentTracker, PaymentQueue, ExceptionQueue, RegulatoryReport, ScreeningResultCard, RiskDisclosure — Inline badge <span> elements (8-10 style props each) replaced with Badge component
  • ConfirmationCard, SanctionsCheck, SurveillanceQueue (compliance) — status/severity/count badges

Test Coverage Expansion + Package Hardening

TokensComponents
  • DANA-1491: CashFlowTimeline, LiquidityGauge, SettlementLadder, TransactionFeed, CurrencyPair (32 tests)
  • DANA-1499: CardLoading, CardError, CardEmpty shared states, ThresholdAlert urgency levels, CashPositionCard data/empty/loading/error states, CounterpartyRiskCard score bands (33 tests)
  • DANA-1500: FXRateCard states + change display, PaymentStatusTracker pipeline/badges/maker-checker, RatioBar meter + threshold marker, TrendBadge direction icons + formatted values (30 tests)
  • DANA-1492: Table column sort toggle, MultiSelect tag add/remove/clear, MFAInput digit entry + paste, ConfirmModal confirm/cancel callbacks (26 tests)
  • DANA-1493: CheckboxGroup select/deselect/select-all, Select open/close/keyboard, SegmentedControl switch, Tabs panel switching (24 tests)

Auth & Identity Components + Responsive Infrastructure

TokensComponents
  • MFAInput — 6/8-digit OTP code entry with auto-advance, arrow key navigation, paste from any digit, countdown timer, shake-on-error animation
  • PasswordStrength — 4-segment visual meter with requirement checklist, role="meter" ARIA, transition on segment fill and checkmark scale
  • RoleBadge — Treasury persona badge (analyst, manager, director, controller, compliance_officer) with color-mix() token-derived backgrounds for theme safety
  • APIKeyDisplay — Masked API key with reveal toggle, copy-to-clipboard with success state, metadata row, revoke action
  • LoginCard — Full auth form with email/password, password visibility toggle, PasswordStrength integration, SSO provider slots, brand slot, error banner with slide-down animation
NODUS DESIGN SYSTEM · 172 ENTRIESSPRINT RELEASE NOTES →