Freeze the status contract before choosing colors
Start with the decision the token must carry. Your product may need success, information, warning, danger, emergency, pending, or another local concept. No vendor taxonomy can decide which of those belongs in your product. Carbon and the NYS Design System document different, system-specific structures. Their catalogs are useful examples, not a universal vocabulary.
For each proposed status, record its governing source and version, plain-language meaning, permitted uses, exclusions, supported modes, required channels, named consumers, protected surfaces, owner, and evidence state. Exclusions matter. A danger role may describe a destructive product outcome while remaining excluded from ordinary hover styling, focus indicators, and chart series.
Representation is not policy
The captured Design Tokens Color Module describes color representation, but it identifies itself as a preview draft and says not to implement or cite it as authoritative guidance. It does not choose your status vocabulary, component behavior, or acceptance policy.
Route each candidate to the layer that owns it
Don't ask only whether a case uses color. Ask what decision would change it and which consumers should change with it. A case outside the status taxonomy does not automatically belong to a component. It may be another shared semantic role. The matrix is a routing method, not a mandatory naming scheme.
| Decision class | Routing outcome | Reason | |
|---|---|---|---|
| Raw green swatch | Reusable color value | Primitive | It has no product meaning and should sit beneath semantic or component contracts. |
| Order completed | Product status | Shared status role | The same meaning may appear in banners, badges, timelines, and icons. |
| Button hover | Named interaction state | Component token | This is a button state. It is component-scoped only if the button contract owns the behavior. |
| Pressed button | Named interaction state | Component token | This control state belongs to the button contract rather than a success or danger role. |
| Selected navigation item | Named selection state | Component token | This navigation consumer communicates selection or location, not product status. |
| Disabled submit button | Named availability state | Component token | This submit control communicates availability through its component contract. |
| Generic focus indicator | Non-status semantic candidate | Unresolved rule | Focus may be a shared semantic role. Use a component token only when a named component contract has independent change authority. |
| Invalid email field | Validation decision | Unresolved rule | The project must decide whether validation maps to a shared danger role, a form semantic role, or an input-owned token. |
| Revenue chart series 2 | Data-series decision | Unresolved rule | A chart role may be shared across visualizations. Use component scope only when a named chart contract owns an independent decision. |
| Regulated emergency banner override | Bounded requirement | Approved local exception | Record its approval, scope, owner, and review trigger. |
| New attention state with no agreed meaning | Undefined product meaning | Unresolved rule | Don't let an available color define a status the product has not defined. |
Carbon's observed catalog separates support colors from hover, active, selected, focus, and component responsibilities. The NYS guide documents shared semantic status and focus roles. Identity Forge's general semantic-color guide also separates state, form and focus, and reusable chart roles. Together, these references support keeping the concerns separate. The local product still decides ownership.
Semantic does not mean status
Status, focus, and chart roles can all be semantic because they name reusable intent. They remain separate families because they communicate different things.
Map modes and channels for one named consumer
Don't create foreground, surface, border, and icon aliases for every status by default. Start with one named consumer and add only the channels its contract needs. The example below is limited to an account-settings save-confirmation banner. It is a planning matrix, not an executed implementation.
| Channel or state | Light mode mapping | Dark mode mapping | Record state | |
|---|---|---|---|---|
| Default surface | Status surface | <success-surface-light> | <success-surface-dark> | Proposed; source identifiers, project aliases, and mode relationships are unresolved. |
| Message foreground | Text on the status surface | <success-foreground-light> | <success-foreground-dark> | Proposed as a separate channel; no mapping has been recorded. |
| Success icon | Icon channel | <success-icon-light> | <success-icon-dark> | Conditional and unresolved until the banner contract requires an icon channel. |
| Border | Boundary channel | <success-border-light> or not applicable | <success-border-dark> or not applicable | Conditional and unresolved until the component contract decides. |
| Hover | Interaction state | Not applicable | Not applicable | The banner container is not an interactive control. |
| Active | Interaction state | Not applicable | Not applicable | No pressed state exists for this consumer. |
| Selected | Selection state | Not applicable | Not applicable | The banner does not represent selection. |
| Disabled | Availability state | Not applicable | Not applicable | The displayed message is not an operable control. |
| Focus | Focus state | Not applicable to the banner container | Not applicable to the banner container | Any dismiss control needs its own focus contract and evidence. |
| Observed result | Rendered evidence | Unresolved | Unresolved | No render, inspection, or accessibility evidence is claimed. |
The surface and foreground are proposed as separate channels, but neither is mapped yet. A mapped claim requires the source identifier, project alias, and light and dark relationship to be recorded. The banner carries a product status. A dismiss button inside it carries interaction and focus states under another contract.
Inspect an upstream semantic color system
Use a public kit to inspect roles, mode values, and delivery formats. Keep your project's vocabulary, mappings, consumers, and evidence in a separate record.
Treat Ambient Sage v1 as bounded upstream intake
Ambient Sage v1 is useful as a source record because its public page exposes a real semantic system rather than a hypothetical palette. The page lists 28 semantic tokens in light and dark modes. For this status-specific scope, the relevant public upstream roles are success, warning, and destructive.
Token specimen · real values
Ambient Sage
Live renderAmbient Sage's actual tokens — the same values its exports use.
| Intake category | Recorded value | State | |
|---|---|---|---|
| Governing source and version | Source identity | Ambient Sage v1 public kit page | Required and available upstream |
| Available status roles | Upstream role inventory | Success, warning, destructive | Required and available upstream |
| Supported modes | Mode coverage | Light and dark | Required and available upstream |
| Delivery formats | Artifact inventory | CSS variables, DESIGN.md, shadcn registry, Tailwind, and DTCG | Available upstream; delivery does not prove local adoption |
| Local status vocabulary | Project policy | Unresolved | Project-owned |
| Project mapping | Application mapping | Unresolved | Project-owned |
| Named consumers | Adoption scope | Unresolved | Project-owned |
| Protected surfaces | Unaffected scope | Unresolved | Project-owned |
| Exclusions | Out-of-scope meanings or states | Unresolved | Project-owned |
| Exceptions | Approved deviations | Unresolved | Project-owned |
| Accessibility evidence | Evaluation record | Unresolved | Project-owned evaluation |
| Runtime observations | Rendered evidence | Unresolved | Project-owned evidence |
| Approval | Acceptance decision | Unresolved | Project-owned decision |
The ownership boundary
Identity Forge supplies upstream semantic inputs and export artifacts. The consuming project owns its status policy, vocabulary, mappings, adoption, component contracts, exclusions, exceptions, accessibility evaluation, runtime evidence, and approval.
Trace one illustrative mapping without inventing a result
This fixture is deliberately unexecuted. It shows what the record needs without attributing placeholder values to Ambient Sage or claiming that anyone rendered, inspected, or tested a component.
| Record category | Proposed record | Evidence state | |
|---|---|---|---|
| Source role | Upstream semantic input | success | Illustrative; source selection not approved |
| Light source value | Mode-specific source value | <source-light-success> | Unresolved placeholder |
| Dark source value | Mode-specific source value | <source-dark-success> | Unresolved placeholder |
| Emitted artifact | Delivered representation | <artifact path, format, version, and emitted identifier> | Unresolved; no artifact inspected |
| Project mapping | Local alias | --app-status-success-surface -> <emitted identifier> | Illustrative and unexecuted |
| Component contract | Channel adoption | SaveConfirmationBanner proposes surface, foreground, and optional icon channels | Illustrative; contract not approved |
| Named consumer | Acceptance scope | Account settings: save-confirmation banner | Scope selected; adoption unverified |
| Expected observation | Falsifiable expectation | In light and dark modes, the banner uses the recorded success channels while protected warning and destructive consumers remain unchanged. | Expectation only |
| Actual observation | Rendered result | Pending | No render or inspection performed |
| Exception status | Exception-register check | Check the exception register before acceptance | Unresolved |
| Owner | Correction authority | <named person or accountable project role> | Required and unresolved |
| Evidence state | Acceptance evidence | Unobserved | Cannot support acceptance |
Make the expected observation falsifiable. "Looks correct" can't reveal whether the failure belongs to the status policy, mode value, project alias, component contract, or a local override.
Copy the acceptance record before testing
Write the record before you inspect the preferred render. Required means acceptance depends on the field. Conditional means the scoped consumer determines whether it applies. Unresolved marks a missing decision or observation. Not applicable needs a reason.
| Record category | What to record | Initial state | |
|---|---|---|---|
| Governing source and version | Authority | Source name, immutable or dated version, and authority boundary | Required |
| Semantic meaning | Policy | Plain-language product meaning and permitted use | Required |
| Supported modes | Scope | Every mode covered by the acceptance scope | Required |
| Required channels | Component needs | Foreground, surface, border, and icon only where the named consumer needs them | Required or conditional |
| Named consumers | Adoption scope | Exact component, variant, and product surface | Required |
| Protected surfaces | Change boundary | Consumers that must remain unchanged during the controlled check | Required |
| Exclusions | Policy boundary | Interaction, focus, validation, data-series, or other cases excluded from this status contract | Required |
| Exceptions | Approved deviation | Exception identifier, scope, owner, reason, and review trigger | Conditional; unresolved until checked |
| Owner | Accountability | Named person or accountable project role for the decision and correction | Required |
| Expectation | Acceptance criterion | Mode, channel, consumer, and protected-surface result that can be inspected | Required |
| Observation | Executed evidence | Actual result plus environment, artifact version, and inspection context | Unresolved until executed |
| Evidence state | Proof boundary | Defined, delivered, mapped, observed, or another documented local model | Required |
| Disposition | Decision | Accept, revise, or block, with the unresolved fields that determine the choice | Unresolved until review |
Accept only when all evidence required by the declared scope supports the expectation. Choose revise when the policy is sound but a correctable mapping, artifact, component contract, or record remains incomplete. Block when a required policy decision has no owner, a required observation is missing, or the result contradicts the approved contract.
Find the first divergent layer
When the consumer does not match the expectation, inspect the chain in ownership order. Stop at the first divergence instead of correcting whichever file is easiest to edit.
- 1
Check the source policy
Confirm that the status meaning, permitted uses, exclusions, modes, channels, consumers, and owner are explicit and current.
- 2
Check the emitted artifact
Confirm that the expected source version produced the required identifiers and mode values in the artifact the project received.
- 3
Check the project mapping
Confirm that local aliases point to the intended emitted roles in each supported mode and that no stale value replaced them.
- 4
Check the component contract
Confirm that the named component and variant consume the project mapping for every required channel and do not substitute a literal or unrelated role.
- 5
Check the approved exception
Determine whether a documented exception intentionally changes this consumer. Verify its scope and owner before treating the difference as a defect.
- 6
Check the rendered consumer
Inspect the named consumer under the recorded modes, content, and state. Record the observation without making claims about untested consumers.
Fix the owning layer
If the artifact is correct but the project alias points elsewhere, correct the project mapping. If an approved exception explains the difference, update the evidence record instead of erasing the exception. A downstream patch can hide an upstream divergence.
Keep status meaning separate from nearby states
Product status describes something the product needs to communicate, such as a completed operation or a condition requiring attention. Hover, active, selected, and disabled describe interaction or control state. Focus can be a shared semantic role. Input validation needs a local decision: does it reuse danger, use a form semantic role, or belong to a component contract? Chart colors may also be reusable semantic roles. Being close on screen doesn't give these cases shared meaning.
The general Identity Forge semantic-color guide covers the broader role system, including paired foreground roles, state colors, form and focus roles, and chart colors. This guide focuses on status policy, adoption, and evidence. Add a component-token layer only when a named component property has independent change authority and bounded consumers.
Verify one reused role before expanding the taxonomy
Choose the status role reused by the most important current consumers. Select one precise consumer, complete the acceptance record, map only its required channels, inspect both supported modes, and record the first divergence. Add another status name only after the first role has an owner, a traceable mapping, and an actual observation.
Sources
- Design Tokens Color Module 2025.10: The captured report describes the technical representation of color token values and opacity. It identifies itself as a preview draft that must not be implemented or cited as authoritative guidance.
- Color Tokens - Carbon Design System: Carbon documents system-specific core and component color tokens, including separate support, focus, hover, active, and selected responsibilities.
- Design Tokens - NYS Design System: The NYS Design System separates primitive, semantic, and theme layers and documents shared semantic roles for status and focus.
- Ambient Sage Design Kit: Ambient Sage v1 is a public free kit with 28 semantic tokens in light and dark modes, including success, warning, and destructive roles, plus implementation artifacts.
- Semantic color tokens explained: Identity Forge's general semantic-color guide documents role-based colors, paired foreground roles, light and dark values, and separate state, form, focus, and chart responsibilities.
- Component tokens vs semantic tokens: when to add a component layer: A component token is warranted when a named component property needs independent change authority and a bounded set of consumers.
- Design token handoff checklist: prove the path from source to consumer: A token handoff requires traceability from its governing source through the delivered artifact and project mapping to named consumers and observed results.