{
  "schema": "prodyn-motion-registry",
  "version": "1.0.0",
  "dsm_version": "2.2",
  "decision_date": "2026-09-05",
  "authority": "Canonical with the reviewed DSM v2.2 repository integration; project adapters do not amend this registry.",
  "extends": {"first": "M1", "last": "M14", "unchanged": true},
  "legacy_registry": "../registry/motion.html",
  "heavy_option_gate": "M13 continues to require explicit per-page approval, lazy loading, containment and a static fallback. Library availability never overrides this gate.",
  "default_atmosphere": "M8",
  "default_footer": "M1",
  "reading_surface_exception": "Omit ambient loops from comparisons and dense reading when they compete with the essential task. The motion field guide intentionally stays still until input.",
  "primitive_vs_engine": "A primitive defines approved visual behavior; an engine implements it. New visual behaviors still need a reviewed registry entry and tested specimen. Not every documented engine is bundled or required.",
  "primitives": [
    {
      "id": "M15", "name": "Signal acquisition", "status": "canonical",
      "purpose": "Make a finite acquisition or connection legible without delaying the underlying action.",
      "specimen": "index.html#m15", "implementation": "motion.js",
      "owner": "One component owns the scalar and SVG stroke presentation; original HTML status remains semantic authority.",
      "clock": "WAAPI milliseconds; resolve --t-slow and --ease-enter from tokens.css. Geometry is normalized component data, not a new design scale.",
      "input": "Explicit activation; bounded normalized progress 0..1. Reset invalidates the prior completion.",
      "settled": "Complete path and stable acquired state; no retained running animation.",
      "reduced": "Apply the same stable semantic and visual result immediately; changing preference midflight settles intentionally.",
      "cancel": "Cancel owned animations, invalidate stale promises and explicitly render the reset state.",
      "fallback": "Without WAAPI use the immediate state update; without JavaScript show original explanation with enhancement controls disabled.",
      "limits": "Demonstration progress is illustrative, not a real loading metric. Production progress must reflect actual data or be labeled indeterminate."
    },
    {
      "id": "M16", "name": "Spatial continuity", "status": "canonical",
      "purpose": "Retain object identity across an intentional semantic reorder or layout transition.",
      "specimen": "index.html#m16", "implementation": "motion.js",
      "owner": "Stable keyed DOM nodes; one FLIP owner per transform. DOM reading order changes before the visual transition.",
      "clock": "WAAPI milliseconds; resolve --t-med and --ease-enter from tokens.css.",
      "input": "Explicit reorder of a bounded set; preserve focused node identity.",
      "settled": "Final DOM order with no inverse transforms or outgoing ghost nodes.",
      "reduced": "Reorder immediately, retaining focus and the same semantic result.",
      "cancel": "Cancel old transforms before measuring a new layout; reset returns original order without stale completion.",
      "fallback": "Normal DOM reordering without WAAPI; readable original list without JavaScript.",
      "limits": "The specimen demonstrates a small stable collection, not virtualization, cross-route choreography or drag-and-drop accessibility."
    },
    {
      "id": "M17", "name": "Kinetic typography", "status": "canonical",
      "purpose": "Give a short meaningful line an authored emphasis while retaining selectable, accessible text.",
      "specimen": "index.html#m17", "implementation": "motion.js",
      "owner": "One typography component owns any temporary visual copy; original semantic text must not be duplicated to assistive technology.",
      "clock": "WAAPI milliseconds; --t-slow and --ease-enter. Oxanium's available axis is wght 200..800.",
      "input": "Explicit replay or changed content; use grapheme-aware segmentation if splitting text.",
      "settled": "Ordinary complete text, stable layout and no stale transient wrappers.",
      "reduced": "Show complete text at its final weight immediately; no mandatory text-travel effect.",
      "cancel": "Invalidate pending visual completion, remove transient copies, preserve current source text and focus.",
      "fallback": "Ordinary text is always present; unavailable animation never hides content.",
      "limits": "Short copy only. Body text, legal copy and long reading do not become kinetic by default. No invented font axes or license-gated PPNM."
    },
    {
      "id": "M18", "name": "Aperture transit", "status": "canonical",
      "purpose": "Show a bounded reveal and a related transit marker as one causal state, rather than independent decoration.",
      "specimen": "index.html#m18", "implementation": "motion.js",
      "owner": "One normalized scalar owns aperture geometry and marker position; a semantic output exposes the same value.",
      "clock": "Direct input mapping has no autonomous loop. Explicit Replay makes one finite native transit using --t-slow and --ease-enter; new input cancels it.",
      "input": "Native range input 0..1 mapped to normalized geometry with finite clamping.",
      "settled": "Current input value and visual geometry agree with no background work.",
      "reduced": "Direct static geometry, no decorative filter or secondary travel animation.",
      "cancel": "Reset explicitly restores the initial scalar and geometry; no deferred writes remain.",
      "fallback": "Static illustration and explanation without enhancement; exact direct SVG attributes are the reference fallback for unsupported CSS paths.",
      "limits": "An authored diagram/material recipe, not live telemetry or a universal complex-path morph implementation."
    }
  ]
}
