{
  "version": 2,
  "title": "Digital twin — emotion image map",
  "description": "Maps each named emotion to a visible PNG and optional motion JSON. Index for the digital twin POC: crossfade today, wire skeleton + image wrap and landscape placement next.",
  "created": "2026-07-29",
  "updated": "2026-07-30",
  "author": "Mark Walhimer",
  "documentation": "catalog/digital-twin/README.md",
  "hub": "sketches/digital-twin/index.html",
  "note": "Session JSON holds geometry only — no photos inside. PNGs and future video clips are the visible skin.",
  "pages": {
    "hub": "sketches/digital-twin/index.html",
    "capture": "sketches/digital-twin/face-signal-study.html",
    "portraitReplay": "sketches/digital-twin/face-signal-portrait-replay.html",
    "wireReplay": "sketches/digital-twin/face-signal-replay.html",
    "thoughtReplay": "sketches/digital-twin/face-signal-thought-replay.html",
    "landscapeTest": "sketches/invisible-layer/invisible-layer-july-13-2026-landscape.html"
  },
  "stack": {
    "markdown": "catalog/digital-twin/README.md",
    "json": "sketches/digital-twin/sessions/*.json, emotion-map.json, mood-anchors.json",
    "html": "Self-contained pages under sketches/digital-twin/ (p5 + ml5 vendored locally)",
    "javascript": "p5.js · Three.js (landscape test)",
    "ml": "ml5.js — face mesh + selfie segmentation (MediaPipe via ml5)",
    "cursor": "Cursor IDE — build and iteration environment",
    "runtime": "Browser + http.server — camera requires http(s)"
  },
  "pipeline": {
    "done": [
      "Capture face geometry + mood labels (study)",
      "Five straight-ahead mood PNGs per person",
      "Portrait crossfade replay (keys 1–5)",
      "Wire-head JSON replay (skeleton proof, no photo wrap)",
      "Thought replay — mood crossfade + thought-map / thoughts/*.json"
    ],
    "next": [
      "Place inhabitant in walkable landscape (billboard test)",
      "Walking video loop (body in motion)",
      "Sidewalk / third-person video (environment witness)"
    ],
    "future": [
      "Wire skeleton from ml5 landmarks (face, then pose)",
      "Wrap / skin mood images onto skeleton (rigging)",
      "Visitor webcam drives skeleton → inhabitant reacts in landscape"
    ]
  },
  "replayModes": {
    "current": "crossfade",
    "future": "skeleton-wrap"
  },
  "emotions": {
    "neutral": {
      "key": 1,
      "label": "neutral",
      "image": "neutral.png",
      "session": "neutral.json",
      "anchor_ms": 12359
    },
    "happy": {
      "key": 2,
      "label": "happy",
      "image": "happy.png",
      "session": "happy.json",
      "anchor_ms": 8351
    },
    "sad": {
      "key": 3,
      "label": "sad",
      "image": "sad.png",
      "session": "sad.json",
      "anchor_ms": 21344
    },
    "think": {
      "key": 4,
      "label": "think",
      "image": "think.png",
      "session": "think.json",
      "anchor_ms": 536
    },
    "surprise": {
      "key": 5,
      "label": "surprise",
      "image": "surprise.png",
      "session": "surprise.json",
      "anchor_ms": 5863
    }
  },
  "signals": ["smile", "mouth", "brow", "tilt", "yaw"],
  "futureAssets": {
    "walkLoop": "walk-loop.mp4",
    "sidewalk": "sidewalk.mp4",
    "note": "Optional body / context video clips — not yet captured"
  }
}
