{
  "schema_version": 1,
  "revision": "contact-tension-v2",
  "canonical_base": "https://brand.nikuniku.ai/assets/rebrand-kit-v0.1/",
  "selection": "Read catalog.json, select exact artwork.* ID via selector.py with explicit candidate opt-in. Never replace source/LICENSE/runtime strings globally.",
  "editable": [
    "SVG text nodes: adapt brand copy to verified target-model display name; remeasure text before export",
    "Blender material/mesh/camera: recreate original brand sculpture via source scene/script; regenerate static + motion together"
  ],
  "preserve": [
    "Embedded fixed identity-v0.5 logo paths, aspect ratio and clear space",
    "Runtime model IDs, API schemas, license/NOTICE, third-party attribution and output provenance"
  ],
  "motion": {
    "duration_seconds": 4,
    "fps": 30,
    "intro": "Geometry tension / hold / release; identity and titles settle together by 0.6s",
    "outro": "Reverse tension; stable last 1.2s",
    "sound": "silent",
    "reduced_motion": "use corresponding PNG",
    "trigger": "user playback only"
  },
  "acceptance": [
    "Check text and logo safe area at native dimensions",
    "Inspect all aspect ratios, crops and target-language glyphs",
    "Verify PNG/SVG/MP4/GIF decoding and updated hashes",
    "Read target engine before/after, perform runtime smoke test separately"
  ],
  "missing_inputs": "pending-model-outputs.json",
  "source_index": "artwork-sources.json",
  "automatic_external_writes": false,
  "interactive_web": {
    "manifest": "interactive-artwork.json",
    "entry": "artwork/interactive/demo.html",
    "instructions": "artwork/interactive/README.md",
    "dependency_set": "all files in interactive-artwork.json plus fallback_path",
    "preserve_static_and_video_exports": true,
    "computed_examples": {
      "entry": "computed-motion.html",
      "surface": "GPU evaluated original contact-study.py parametric equations; .035 shell; no exact Blender bevel/Cycles parity",
      "source": "artwork/interactive/parametric.mjs",
      "tension_range": [
        0,
        1
      ],
      "timeline_range_seconds": [
        0,
        4
      ],
      "timeline_default": "paused; seek samples one state; play runs once; replay restarts",
      "runtime_video": "brand packaging only; never replaces actual footage or model evidence",
      "exports": "Existing MP4s use prior Blender motion. New computed sequence has not been exported as a matching MP4."
    }
  }
}
