# ProDyn DSM Mk.ii — blue foundation

**Status: approved color foundation; adoption is explicit.** Chris approved the blue Activity prototype and directed: “Let's make this color scheme adjustment the beginning of ProDyn DSM Mk.ii”. This addendum records that owner decision, not a new identity or approval of the prototype's other experiments.

## Authority and adoption

This is a normative palette addendum to [DSM 2.2](../prodyn-threadline-design-system.md). For an explicitly opted-in surface, the roles below supersede the base manual's cyan values and its single-token-file restriction. All other base rules still apply. The unchanged base manual and PDF describe the stable edition; this separately maintained addendum is the Mk.ii authority.

Import **`/dsm/mk-ii/tokens.css` after `/dsm/tokens.css`**, then mark the intended page or subtree:

```html
<html lang="en" data-pd-palette="mk-ii">
<!-- inside head, before component styles: -->
<link rel="stylesheet" href="/dsm/tokens.css">
<link rel="stylesheet" href="/dsm/mk-ii/tokens.css">
```

For a component-only adoption, put `data-pd-palette="mk-ii"` on its container instead of `html`. Tokens inherit into its descendants, not unmarked siblings. Loading the file without the attribute has no effect. Remove both the attribute and import to return a page to its stable tokens; component styles using the new roles also need their stable equivalents. This is not a complete drop-in recoloring of legacy components.

[CSS](tokens.css) is numeric authority for this palette; [JSON](tokens.json) is its exact tooling mirror. Keep values here, not copied into application styles. Base `tokens.css` and the numeric groups of `tokens.json` remain unchanged. Do not bulk-migrate stable consumers or infer adoption from the existence of this addendum.

## Approved roles

| Token | Exact value | Role |
|---|---|---|
| `--pd-signal` | `#75a4ff` | Sparse labels, selection, signal and focus |
| `--pd-cyan-deep` | `#284f87` | Blue depth and low-signal linework; legacy name retained |
| `--pd-trace` | `#c1d6ff` | Trace highlights and data values, not body-copy color |
| `--pd-spark` | `#a9c6ff` | Tiny active highlights |
| `--pd-panel` | `#080f17` | Dark instrument panel |
| `--pd-raised` | `#0d1722` | Raised surface within the dark field |
| `--pd-glass` | `rgba(117,164,255,.032)` | Barely tinted glass fill |
| `--pd-blue-soft` | `rgba(117,164,255,.09)` | Contained selection tint |
| `--pd-blue-line` | `rgba(117,164,255,.26)` | Quiet blue hairline; not a sole focus/essential-control indicator |
| `--pd-text-dim` | `#87949f` | Metadata and secondary labels |
| `--pd-text-muted` | `#a8b1b9` | Supporting copy |
| `--pd-silver` | `#c6ced6` | Neutral marks and secondary emphasis |
| `--pd-shadow-color` | `rgba(0,0,0,.4)` | Shadow color only; no new shadow geometry is prescribed |
| `--pd-signal-filter` | `drop-shadow(0 0 5px rgba(117,164,255,.32))` | Bounded `filter` on a small signal/trace, never page-wide bloom |

The first four retain existing DSM names. The other roles promote the Activity study's `--activity-panel`, `--activity-raised`, `--activity-glass`, `--activity-blue-soft`, `--activity-blue-line`, `--activity-text-dim`, `--activity-text-muted`, `--activity-silver`, `--activity-shadow` and `--activity-glow`, respectively. Only the names change; no new numeric palette is introduced.

## Binding limits

- Near-black `--pd-field` / `--pd-void`, ivory type mass, square geometry and existing spacing remain. Blue is localized signal, not a blue wash, gradient hero or neon frame around everything.
- Keep the original naked `/pd-logo.png` and approved document-header assets unchanged. Do not recolor their cyan pixels to match the interface.
- Keep Oxanium display/body fallback and Departure Mono HUD, self-hosted with their OFL notices. **PP Neue Machina stays private-retention-only** until commercial/web rights are confirmed; this approval grants no font or repository redistribution rights. See [licensing](../../licenses/README.md).
- Copper and ok/warn/alert remain unchanged exception colors at roughly 5% presence. Blue selection is not a substitute for semantic health, warning or error states.
- Use the new panel/ink roles explicitly; this layer does not alias every legacy surface or ivory-muted token. Existing hardcoded cyan glow recipes do not automatically become blue. Use `filter: var(--pd-signal-filter)` only for the bounded approved accent; do not reinterpret it as a `box-shadow` value or invent brighter/larger variants.
- M1–M18 contracts are unchanged. This adds no animation, contour primitive, atmosphere, hardware theme or dashboard behavior. An existing motion specimen needs its own scoped review before adaptation; palette approval does not silently recolor shared motion assets.
- Check actual text/control contrast on the composed surface. Deep blue, translucent hairlines and glass are material roles, not small-text colors. Keep status meaning in text or shape as well as color.

## Specimen and provenance

[Open the static specimen](index.html) at `/dsm/mk-ii/` from the repository-root loopback preview described in [README](../../README.md). It shows every approved role using the actual logo and local licensed fonts. It is a palette inspection surface, not live telemetry. It deliberately omits M8/M1 atmosphere so the color comparison remains still, with no JavaScript requirement.

Source study: private [design-library PR #10](https://github.com/cygnostik/design-library/pull/10), `archive/observation-aware-contours/demo/style.css`. That collection records the earlier experimental source; the owner approval above promotes only its blue palette here. The original study remains separate.

Focused checks from the repository root:

```sh
python3 -m unittest discover -s tests -p 'test_palette.py' -v
npm run test:palette
python3 scripts/validate.py
```

`test:palette` uses the repository's existing Playwright/axe development tools, checks scoped and root opt-in, stable-value isolation, rendered fonts, local assets, contrast, keyboard focus, no-JS and 390/700/1440 layouts. `CHROMIUM_PATH` may select an existing browser; `EVIDENCE_DIR` selects test output. No page runtime dependency is added. The normal repository validation and affected integration checks still apply.
