← ToonkitCONTENT HISTORY

Update to Toonkit

Snapshot Oct 26, 2026 · 06:08 UTC · version 0.3.0

Collection source: downloaded plugin package.

WHAT CHANGED

Payment or plan references changed

Skill instructions — Now says: hooks: PreToolUse: - matcher:...

Observed in published text. Live prices and checkout terms have not been verified by this change.

Save Toonkit and check future changes in Following.

Up to 10 plugins free · no card required.

All fields and original values.

Skill instructions

Before

Oct 24, 2026 · 13:32 UTC

1. Write one compact `3dref-production-v2` spec from the user's references. Plan actors/camera first, then shot-relevant proxies and real support faces. Actor count is bounded by live capacity, not fixed at two. 2. Compile in a fresh run...

After

Oct 26, 2026 · 06:08 UTC

hooks: PreToolUse: - matcher: "mcp__.*toonkit.*__toonkit_(create_canvas|get_canvas|get_canvas_mutation|canvas_group_nodes|canvas_reference3d_(catalog|create|edit|get_scene))" hooks: - type: command timeout: ...

Supporting files

Before

Oct 24, 2026 · 13:32 UTC

[{"relative_path":"agents/openai.yaml","size_in_bytes":293},{"relative_path":"references/body-motion.md","size_in_bytes":4551},{"relative_path":"references/direct.md","size_in_bytes":5114},{"relative_path":"references/direction.md","size...

After

Oct 26, 2026 · 06:08 UTC

[{"relative_path":"agents/openai.yaml","size_in_bytes":293},{"relative_path":"references/body-motion.md","size_in_bytes":4551},{"relative_path":"references/conventions.md","size_in_bytes":8079},{"relative_path":"references/direct.md","si...

Compare saved observations

Download comparison JSON

SKILL.md text changes

− removed · + added

--- before
+++ after
@@ -3,6 +3,37 @@
 description: Create or edit ToonKit 3D camera/action previz when explicitly requested or selected for a production stage. Uses live MCP features and visible browser Export; deterministic and credit-free.
 metadata:
   short-description: Camera/action previz with efficient staging and export
+hooks:
+  PreToolUse:
+    - matcher: "mcp__.*toonkit.*__toonkit_(create_canvas|get_canvas|get_canvas_mutation|canvas_group_nodes|canvas_reference3d_(catalog|create|edit|get_scene))"
+      hooks:
+        - type: command
+          timeout: 30
+          command: >-
+            i=$(cat); d="${TOONKIT_3DREF_SPOOL:-$HOME/.cache/toonkit-3dref/spool}";
+            case "$i" in *'"3dref-spool:'*) ;; *) set -- "$d"/*.pending; [ -e "$1" ] || exit 0;; esac;
+            for p in python3 python; do if "$p" -c 'import sys; sys.exit(sys.version_info < (3, 8))' >/dev/null 2>&1; then
+            printf '%s' "$i" | "$p" "${CLAUDE_PLUGIN_ROOT}/skills/3dref/scripts/spool_hook.py"; exit 0; fi; done; exit 0
+  PostToolUse:
+    - matcher: "mcp__.*toonkit.*__toonkit_(create_canvas|get_canvas|get_canvas_mutation|canvas_group_nodes|canvas_reference3d_(catalog|create|edit|get_scene))"
+      hooks:
+        - type: command
+          timeout: 30
+          command: >-
+            i=$(cat); d="${TOONKIT_3DREF_SPOOL:-$HOME/.cache/toonkit-3dref/spool}";
+            case "$i" in *'"3dref-spool:'*) ;; *) set -- "$d"/*.pending; [ -e "$1" ] || exit 0;; esac;
+            for p in python3 python; do if "$p" -c 'import sys; sys.exit(sys.version_info < (3, 8))' >/dev/null 2>&1; then
+            printf '%s' "$i" | "$p" "${CLAUDE_PLUGIN_ROOT}/skills/3dref/scripts/spool_hook.py"; exit 0; fi; done; exit 0
+  PostToolUseFailure:
+    - matcher: "mcp__.*toonkit.*__toonkit_(create_canvas|get_canvas|get_canvas_mutation|canvas_group_nodes|canvas_reference3d_(catalog|create|edit|get_scene))"
+      hooks:
+        - type: command
+          timeout: 30
+          command: >-
+            i=$(cat); d="${TOONKIT_3DREF_SPOOL:-$HOME/.cache/toonkit-3dref/spool}";
+            case "$i" in *'"3dref-spool:'*) ;; *) set -- "$d"/*.pending; [ -e "$1" ] || exit 0;; esac;
+            for p in python3 python; do if "$p" -c 'import sys; sys.exit(sys.version_info < (3, 8))' >/dev/null 2>&1; then
+            printf '%s' "$i" | "$p" "${CLAUDE_PLUGIN_ROOT}/skills/3dref/scripts/spool_hook.py"; exit 0; fi; done; exit 0
 ---
 
 # 3D reference previz
@@ -17,9 +48,9 @@
 
 ## Compiled route
 
-1. Write one compact `3dref-production-v2` spec from the user's references. Plan actors/camera first, then shot-relevant proxies and real support faces. Actor count is bounded by live capacity, not fixed at two.
-2. Compile in a fresh run directory. The package converts center/size to actual primitive pivots, bakes each distinct motion once, solves the wall-floor roll sign, culls irrelevant geometry, reduces keys and checks emitted interpolation. Fix concrete planning failures locally before writing. Default hold observations are advisory; explicit requested limits are enforced.
-3. Use the packaged runtime or [portable relay](references/direct.md), both over the same bridge. Keep the exact editor visible. Apply all base keys before pose overlays; wait for accepted pending work before new revisions.
+1. Read [conventions](references/conventions.md) and `references/examples/` first; do not study `scripts/` source (loading the launcher as [execution](references/execution.md) describes is expected). Write one compact `3dref-production-v2` spec from the user's references. Plan actors/camera first, then shot-relevant proxies and real support faces. Actor count is bounded by live capacity, not fixed at two.
+2. Compile in a fresh run directory. The package converts center/size to actual primitive pivots, bakes each distinct motion once, solves the wall-floor roll sign, culls irrelevant geometry, reduces keys and checks emitted interpolation. Fix concrete planning failures locally before writing: read only `<run>/diagnostic.json`, edit the spec, recompile (seconds). Default hold observations are advisory; explicit requested limits are enforced.
+3. Use the packaged runtime or [portable relay](references/direct.md), both over the same bridge. On Claude Code the relay parks MCP payloads through this skill's hook (`--spool`); never retype requests or responses. Skill hooks apply only to the main conversation, so run the relay there, not in a subagent. Keep the exact editor visible. Apply all base keys before pose overlays; wait for accepted pending work before new revisions.
 4. Compare exposed saved fields with the bundle. Check timing in the visible editor when safe readback omits it. Verify a fresh scene before Export. Never Save stale initial UI data over verified work.
 5. Export through the visible editor. Record whether a click actually occurred; readiness failure with confirmed no click may resume. Uncertain clicks must be reconciled with existing output before another attempt. Confirm the new source edge, exact output node and decoded duration/dimensions.
 
Full technical diff · 2 changed fields

changed /included_files

BEFORE
[
  {
    "relative_path": "agents/openai.yaml",
    "size_in_bytes": 293
  },
  {
    "relative_path": "references/body-motion.md",
    "size_in_bytes": 4551
  },
  {
    "relative_path": "references/direct.md",
    "size_in_bytes": 5114
  },
  {
    "relative_path": "references/direction.md",
    "size_in_bytes": 1467
  },
  {
    "relative_path": "references/execution.md",
    "size_in_bytes": 8975
  },
  {
    "relative_path": "references/mcp-contract.md",
    "size_in_bytes": 7042
  },
  {
    "relative_path": "references/native.md",
    "size_in_bytes": 4593
  },
  {
    "relative_path": "references/preflight.md",
    "size_in_bytes": 3398
  },
  {
    "relative_path": "references/production-input.md",
    "size_in_bytes": 7674
  },
  {
    "relative_path": "scripts/bridge.js",
    "size_in_bytes": 23742
  },
  {
    "relative_path": "scripts/browser-export.js",
    "size_in_bytes": 3606
  },
  {
    "relative_path": "scripts/compiler.py",
    "size_in_bytes": 4015
  },
  {
    "relative_path": "scripts/direct.py",
    "size_in_bytes": 2322
  },
  {
    "relative_path": "scripts/engine-profile.json",
    "size_in_bytes": 2374
  },
  {
    "relative_path": "scripts/engine_v1.py",
    "size_in_bytes": 3426
  },
  {
    "relative_path": "scripts/geometry.py",
    "size_in_bytes": 3339
  },
  {
    "relative_path": "scripts/intent.py",
    "size_in_bytes": 3658
  },
  {
    "relative_path": "scripts/interactions.py",
    "size_in_bytes": 2941
  },
  {
    "relative_path": "scripts/journal.py",
    "size_in_bytes": 4269
  },
  {
    "relative_path": "scripts/locomotion.py",
    "size_in_bytes": 2197
  },
  {
    "relative_path": "scripts/mcp_plan.py",
    "size_in_bytes": 860
  },
  {
    "relative_path": "scripts/motion_bake.mjs",
    "size_in_bytes": 14636
  },
  {
    "relative_path": "scripts/plan.py",
    "size_in_bytes": 4838
  },
  {
    "relative_path": "scripts/preflight.py",
    "size_in_bytes": 21457
  },
  {
    "relative_path": "scripts/relay.mjs",
    "size_in_bytes": 1829
  },
  {
    "relative_path": "scripts/runtime.js",
    "size_in_bytes": 7639
  },
  {
    "relative_path": "scripts/scene_compiler.py",
    "size_in_bytes": 16519
  },
  {
    "relative_path": "scripts/spatial.py",
    "size_in_bytes": 3482
  },
  {
    "relative_path": "scripts/support.py",
    "size_in_bytes": 4400
  },
  {
    "relative_path": "scripts/timewarp.mjs",
    "size_in_bytes": 1067
  },
  {
    "relative_path": "scripts/timewarp.py",
    "size_in_bytes": 1569
  }
]
AFTER
[
  {
    "relative_path": "agents/openai.yaml",
    "size_in_bytes": 293
  },
  {
    "relative_path": "references/body-motion.md",
    "size_in_bytes": 4551
  },
  {
    "relative_path": "references/conventions.md",
    "size_in_bytes": 8079
  },
  {
    "relative_path": "references/direct.md",
    "size_in_bytes": 7593
  },
  {
    "relative_path": "references/direction.md",
    "size_in_bytes": 1467
  },
  {
    "relative_path": "references/examples/example-jump-slowmo.json",
    "size_in_bytes": 3869
  },
  {
    "relative_path": "references/examples/example-run-follow.json",
    "size_in_bytes": 2106
  },
  {
    "relative_path": "references/execution.md",
    "size_in_bytes": 9320
  },
  {
    "relative_path": "references/mcp-contract.md",
    "size_in_bytes": 7042
  },
  {
    "relative_path": "references/native.md",
    "size_in_bytes": 4593
  },
  {
    "relative_path": "references/preflight.md",
    "size_in_bytes": 3398
  },
  {
    "relative_path": "references/production-input.md",
    "size_in_bytes": 7789
  },
  {
    "relative_path": "scripts/bridge.js",
    "size_in_bytes": 23742
  },
  {
    "relative_path": "scripts/browser-export.js",
    "size_in_bytes": 3606
  },
  {
    "relative_path": "scripts/compiler.py",
    "size_in_bytes": 4015
  },
  {
    "relative_path": "scripts/direct.py",
    "size_in_bytes": 5316
  },
  {
    "relative_path": "scripts/engine-profile.json",
    "size_in_bytes": 2374
  },
  {
    "relative_path": "scripts/engine_v1.py",
    "size_in_bytes": 3426
  },
  {
    "relative_path": "scripts/geometry.py",
    "size_in_bytes": 3339
  },
  {
    "relative_path": "scripts/intent.py",
    "size_in_bytes": 3658
  },
  {
    "relative_path": "scripts/interactions.py",
    "size_in_bytes": 3060
  },
  {
    "relative_path": "scripts/journal.py",
    "size_in_bytes": 4269
  },
  {
    "relative_path": "scripts/locomotion.py",
    "size_in_bytes": 2197
  },
  {
    "relative_path": "scripts/mcp_plan.py",
    "size_in_bytes": 860
  },
  {
    "relative_path": "scripts/motion_bake.mjs",
    "size_in_bytes": 14636
  },
  {
    "relative_path": "scripts/plan.py",
    "size_in_bytes": 4838
  },
  {
    "relative_path": "scripts/preflight.py",
    "size_in_bytes": 21540
  },
  {
    "relative_path": "scripts/relay.mjs",
    "size_in_bytes": 1829
  },
  {
    "relative_path": "scripts/runtime.js",
    "size_in_bytes": 7639
  },
  {
    "relative_path": "scripts/scene_compiler.py",
    "size_in_bytes": 16730
  },
  {
    "relative_path": "scripts/spatial.py",
    "size_in_bytes": 3482
  },
  {
    "relative_path": "scripts/spool_hook.py",
    "size_in_bytes": 9361
  },
  {
    "relative_path": "scripts/support.py",
    "size_in_bytes": 4610
  },
  {
    "relative_path": "scripts/timewarp.mjs",
    "size_in_bytes": 1067
  },
  {
    "relative_path": "scripts/timewarp.py",
    "size_in_bytes": 1898
  }
]

changed /skill_md_contents

BEFORE
"---\nname: 3dref\ndescription: Create or edit ToonKit 3D camera/action previz when explicitly requested or selected for a production stage. Uses live MCP features and visible browser Export; deterministic and credit-free.\nmetadata:\n  short-description: Camera/action previz with efficient staging and export\n---\n\n# 3D reference previz\n\nDeliver an editable ToonKit scene and its playable source-linked video. Preserve requested duration, FPS, actors and camera intent. A location sheet supplies spatial relationships: build only surfaces, silhouettes and obstacles needed by the shot, using simple proxies. Do not recreate panorama detail.\n\n## Choose the smallest suitable route\n\n- **Native MCP:** simple continuous presets, a few root/camera keys, existing-scene edits, other catalog geometry/animals or existing uploaded assets. Read [native execution](references/native.md). No Node/three/FBX setup for this route. The live catalog defines available ToonKit features; the compiler's limits do not disable them.\n- **Compiled choreography:** multi-actor trajectories with measured contact, wall-as-floor roll, composed body motion or shared root/body slow motion. Read [production input](references/production-input.md) and [execution](references/execution.md). Read [source motion](references/body-motion.md) only for composed/retimed actions. Python/Node calculate the frames, binds and checks; do not handwrite dense arrays or replace a failed measured constraint with fabricated evidence.\n- No AI catalogs, balance, quotes or generation SSOT for either deterministic route. Generation remains a separately authorized stage.\n\n## Compiled route\n\n1. Write one compact `3dref-production-v2` spec from the user's references. Plan actors/camera first, then shot-relevant proxies and real support faces. Actor count is bounded by live capacity, not fixed at two.\n2. Compile in a fresh run directory. The package converts center/size to actual primitive pivots, bakes each distinct motion once, solves the wall-floor roll sign, culls irrelevant geometry, reduces keys and checks emitted interpolation. Fix concrete planning failures locally before writing. Default hold observations are advisory; explicit requested limits are enforced.\n3. Use the packaged runtime or [portable relay](references/direct.md), both over the same bridge. Keep the exact editor visible. Apply all base keys before pose overlays; wait for accepted pending work before new revisions.\n4. Compare exposed saved fields with the bundle. Check timing in the visible editor when safe readback omits it. Verify a fresh scene before Export. Never Save stale initial UI data over verified work.\n5. Export through the visible editor. Record whether a click actually occurred; readiness failure with confirmed no click may resume. Uncertain clicks must be reconciled with existing output before another attempt. Confirm the new source edge, exact output node and decoded duration/dimensions.\n\n## Scope and invariants\n\nThe compiler currently calibrates boxes, fresh unit-scale stock humans, one camera and the documented source motions. Other live MCP features use the native route with appropriately scoped checks; do not silently substitute the compiler's subset for the user's request. Existing compiled runs use their original matching runtime.\n\n`engine-profile.json` records calibrated geometry/interpolation and maintenance evidence. Web JS filenames are not execution requirements: ordinary frontend rebuilds or lazy loading must not stop production. Live catalog/scene incompatibility or a changed source FBX needed for baking requires concrete inspection of that operation. Do not reverse-engineer the website on every request.\n\nAll compiled actor frames need real finite support, a declared transfer, or bounded intended flight. Root/body share a time map for slow motion; root height is applied once. Walls-as-floor require projected outward normal screen-up. Bone markers and stride comparisons are approximations, not skin/sole IK or artistic certification.\n\nScene/canvas edits use MCP; browser work is editor/navigation, readiness, Save/Export and resulting media. No hidden app stores/private endpoints or substitute renderer. Preserve existing user work. Do not lower FPS, shorten or split the shot, spend generation credits, or waive a failed measured constraint just to reach Export.\n\nNo prior project, local test log or conversation is required. Compiled runs retain `spec.json`, `compiled.json`, `journal.jsonl`; failed plans retain diagnostics. Load helpers once and emit summaries, not arrays. Native runs retain only the plan/receipts needed for recovery. Development tests run at release time, not on user requests.\n\nKeep the result visible and group this run's source/output once. Return the canvas link, actual duration/dimensions, scene FPS and concise verified/unverified scope. Export success does not establish visual acceptance or R2V compatibility. No routine screenshot/contact-sheet or repeated playback loops.\n\nFor underspecified staging read [direction](references/direction.md); for a failed constraint or release maintenance read [verification](references/preflight.md). Read the [MCP contract](references/mcp-contract.md) for operations outside the compiler or changed connected declarations.\n"
AFTER
"---\nname: 3dref\ndescription: Create or edit ToonKit 3D camera/action previz when explicitly requested or selected for a production stage. Uses live MCP features and visible browser Export; deterministic and credit-free.\nmetadata:\n  short-description: Camera/action previz with efficient staging and export\nhooks:\n  PreToolUse:\n    - matcher: \"mcp__.*toonkit.*__toonkit_(create_canvas|get_canvas|get_canvas_mutation|canvas_group_nodes|canvas_reference3d_(catalog|create|edit|get_scene))\"\n      hooks:\n        - type: command\n          timeout: 30\n          command: >-\n            i=$(cat); d=\"${TOONKIT_3DREF_SPOOL:-$HOME/.cache/toonkit-3dref/spool}\";\n            case \"$i\" in *'\"3dref-spool:'*) ;; *) set -- \"$d\"/*.pending; [ -e \"$1\" ] || exit 0;; esac;\n            for p in python3 python; do if \"$p\" -c 'import sys; sys.exit(sys.version_info < (3, 8))' >/dev/null 2>&1; then\n            printf '%s' \"$i\" | \"$p\" \"${CLAUDE_PLUGIN_ROOT}/skills/3dref/scripts/spool_hook.py\"; exit 0; fi; done; exit 0\n  PostToolUse:\n    - matcher: \"mcp__.*toonkit.*__toonkit_(create_canvas|get_canvas|get_canvas_mutation|canvas_group_nodes|canvas_reference3d_(catalog|create|edit|get_scene))\"\n      hooks:\n        - type: command\n          timeout: 30\n          command: >-\n            i=$(cat); d=\"${TOONKIT_3DREF_SPOOL:-$HOME/.cache/toonkit-3dref/spool}\";\n            case \"$i\" in *'\"3dref-spool:'*) ;; *) set -- \"$d\"/*.pending; [ -e \"$1\" ] || exit 0;; esac;\n            for p in python3 python; do if \"$p\" -c 'import sys; sys.exit(sys.version_info < (3, 8))' >/dev/null 2>&1; then\n            printf '%s' \"$i\" | \"$p\" \"${CLAUDE_PLUGIN_ROOT}/skills/3dref/scripts/spool_hook.py\"; exit 0; fi; done; exit 0\n  PostToolUseFailure:\n    - matcher: \"mcp__.*toonkit.*__toonkit_(create_canvas|get_canvas|get_canvas_mutation|canvas_group_nodes|canvas_reference3d_(catalog|create|edit|get_scene))\"\n      hooks:\n        - type: command\n          timeout: 30\n          command: >-\n            i=$(cat); d=\"${TOONKIT_3DREF_SPOOL:-$HOME/.cache/toonkit-3dref/spool}\";\n            case \"$i\" in *'\"3dref-spool:'*) ;; *) set -- \"$d\"/*.pending; [ -e \"$1\" ] || exit 0;; esac;\n            for p in python3 python; do if \"$p\" -c 'import sys; sys.exit(sys.version_info < (3, 8))' >/dev/null 2>&1; then\n            printf '%s' \"$i\" | \"$p\" \"${CLAUDE_PLUGIN_ROOT}/skills/3dref/scripts/spool_hook.py\"; exit 0; fi; done; exit 0\n---\n\n# 3D reference previz\n\nDeliver an editable ToonKit scene and its playable source-linked video. Preserve requested duration, FPS, actors and camera intent. A location sheet supplies spatial relationships: build only surfaces, silhouettes and obstacles needed by the shot, using simple proxies. Do not recreate panorama detail.\n\n## Choose the smallest suitable route\n\n- **Native MCP:** simple continuous presets, a few root/camera keys, existing-scene edits, other catalog geometry/animals or existing uploaded assets. Read [native execution](references/native.md). No Node/three/FBX setup for this route. The live catalog defines available ToonKit features; the compiler's limits do not disable them.\n- **Compiled choreography:** multi-actor trajectories with measured contact, wall-as-floor roll, composed body motion or shared root/body slow motion. Read [production input](references/production-input.md) and [execution](references/execution.md). Read [source motion](references/body-motion.md) only for composed/retimed actions. Python/Node calculate the frames, binds and checks; do not handwrite dense arrays or replace a failed measured constraint with fabricated evidence.\n- No AI catalogs, balance, quotes or generation SSOT for either deterministic route. Generation remains a separately authorized stage.\n\n## Compiled route\n\n1. Read [conventions](references/conventions.md) and `references/examples/` first; do not study `scripts/` source (loading the launcher as [execution](references/execution.md) describes is expected). Write one compact `3dref-production-v2` spec from the user's references. Plan actors/camera first, then shot-relevant proxies and real support faces. Actor count is bounded by live capacity, not fixed at two.\n2. Compile in a fresh run directory. The package converts center/size to actual primitive pivots, bakes each distinct motion once, solves the wall-floor roll sign, culls irrelevant geometry, reduces keys and checks emitted interpolation. Fix concrete planning failures locally before writing: read only `<run>/diagnostic.json`, edit the spec, recompile (seconds). Default hold observations are advisory; explicit requested limits are enforced.\n3. Use the packaged runtime or [portable relay](references/direct.md), both over the same bridge. On Claude Code the relay parks MCP payloads through this skill's hook (`--spool`); never retype requests or responses. Skill hooks apply only to the main conversation, so run the relay there, not in a subagent. Keep the exact editor visible. Apply all base keys before pose overlays; wait for accepted pending work before new revisions.\n4. Compare exposed saved fields with the bundle. Check timing in the visible editor when safe readback omits it. Verify a fresh scene before Export. Never Save stale initial UI data over verified work.\n5. Export through the visible editor. Record whether a click actually occurred; readiness failure with confirmed no click may resume. Uncertain clicks must be reconciled with existing output before another attempt. Confirm the new source edge, exact output node and decoded duration/dimensions.\n\n## Scope and invariants\n\nThe compiler currently calibrates boxes, fresh unit-scale stock humans, one camera and the documented source motions. Other live MCP features use the native route with appropriately scoped checks; do not silently substitute the compiler's subset for the user's request. Existing compiled runs use their original matching runtime.\n\n`engine-profile.json` records calibrated geometry/interpolation and maintenance evidence. Web JS filenames are not execution requirements: ordinary frontend rebuilds or lazy loading must not stop production. Live catalog/scene incompatibility or a changed source FBX needed for baking requires concrete inspection of that operation. Do not reverse-engineer the website on every request.\n\nAll compiled actor frames need real finite support, a declared transfer, or bounded intended flight. Root/body share a time map for slow motion; root height is applied once. Walls-as-floor require projected outward normal screen-up. Bone markers and stride comparisons are approximations, not skin/sole IK or artistic certification.\n\nScene/canvas edits use MCP; browser work is editor/navigation, readiness, Save/Export and resulting media. No hidden app stores/private endpoints or substitute renderer. Preserve existing user work. Do not lower FPS, shorten or split the shot, spend generation credits, or waive a failed measured constraint just to reach Export.\n\nNo prior project, local test log or conversation is required. Compiled runs retain `spec.json`, `compiled.json`, `journal.jsonl`; failed plans retain diagnostics. Load helpers once and emit summaries, not arrays. Native runs retain only the plan/receipts needed for recovery. Development tests run at release time, not on user requests.\n\nKeep the result visible and group this run's source/output once. Return the canvas link, actual duration/dimensions, scene FPS and concise verified/unverified scope. Export success does not establish visual acceptance or R2V compatibility. No routine screenshot/contact-sheet or repeated playback loops.\n\nFor underspecified staging read [direction](references/direction.md); for a failed constraint or release maintenance read [verification](references/preflight.md). Read the [MCP contract](references/mcp-contract.md) for operations outside the compiler or changed connected declarations.\n"
Full snapshot data
{
  "description": "Create or edit ToonKit 3D camera/action previz when explicitly requested or selected for a production stage. Uses live MCP features and visible browser Export; deterministic and credit-free.",
  "included_files": [
    {
      "relative_path": "agents/openai.yaml",
      "size_in_bytes": 293
    },
    {
      "relative_path": "references/body-motion.md",
      "size_in_bytes": 4551
    },
    {
      "relative_path": "references/conventions.md",
      "size_in_bytes": 8079
    },
    {
      "relative_path": "references/direct.md",
      "size_in_bytes": 7593
    },
    {
      "relative_path": "references/direction.md",
      "size_in_bytes": 1467
    },
    {
      "relative_path": "references/examples/example-jump-slowmo.json",
      "size_in_bytes": 3869
    },
    {
      "relative_path": "references/examples/example-run-follow.json",
      "size_in_bytes": 2106
    },
    {
      "relative_path": "references/execution.md",
      "size_in_bytes": 9320
    },
    {
      "relative_path": "references/mcp-contract.md",
      "size_in_bytes": 7042
    },
    {
      "relative_path": "references/native.md",
      "size_in_bytes": 4593
    },
    {
      "relative_path": "references/preflight.md",
      "size_in_bytes": 3398
    },
    {
      "relative_path": "references/production-input.md",
      "size_in_bytes": 7789
    },
    {
      "relative_path": "scripts/bridge.js",
      "size_in_bytes": 23742
    },
    {
      "relative_path": "scripts/browser-export.js",
      "size_in_bytes": 3606
    },
    {
      "relative_path": "scripts/compiler.py",
      "size_in_bytes": 4015
    },
    {
      "relative_path": "scripts/direct.py",
      "size_in_bytes": 5316
    },
    {
      "relative_path": "scripts/engine-profile.json",
      "size_in_bytes": 2374
    },
    {
      "relative_path": "scripts/engine_v1.py",
      "size_in_bytes": 3426
    },
    {
      "relative_path": "scripts/geometry.py",
      "size_in_bytes": 3339
    },
    {
      "relative_path": "scripts/intent.py",
      "size_in_bytes": 3658
    },
    {
      "relative_path": "scripts/interactions.py",
      "size_in_bytes": 3060
    },
    {
      "relative_path": "scripts/journal.py",
      "size_in_bytes": 4269
    },
    {
      "relative_path": "scripts/locomotion.py",
      "size_in_bytes": 2197
    },
    {
      "relative_path": "scripts/mcp_plan.py",
      "size_in_bytes": 860
    },
    {
      "relative_path": "scripts/motion_bake.mjs",
      "size_in_bytes": 14636
    },
    {
      "relative_path": "scripts/plan.py",
      "size_in_bytes": 4838
    },
    {
      "relative_path": "scripts/preflight.py",
      "size_in_bytes": 21540
    },
    {
      "relative_path": "scripts/relay.mjs",
      "size_in_bytes": 1829
    },
    {
      "relative_path": "scripts/runtime.js",
      "size_in_bytes": 7639
    },
    {
      "relative_path": "scripts/scene_compiler.py",
      "size_in_bytes": 16730
    },
    {
      "relative_path": "scripts/spatial.py",
      "size_in_bytes": 3482
    },
    {
      "relative_path": "scripts/spool_hook.py",
      "size_in_bytes": 9361
    },
    {
      "relative_path": "scripts/support.py",
      "size_in_bytes": 4610
    },
    {
      "relative_path": "scripts/timewarp.mjs",
      "size_in_bytes": 1067
    },
    {
      "relative_path": "scripts/timewarp.py",
      "size_in_bytes": 1898
    }
  ],
  "name": "3dref",
  "skill_md_contents": "---\nname: 3dref\ndescription: Create or edit ToonKit 3D camera/action previz when explicitly requested or selected for a production stage. Uses live MCP features and visible browser Export; deterministic and credit-free.\nmetadata:\n  short-description: Camera/action previz with efficient staging and export\nhooks:\n  PreToolUse:\n    - matcher: \"mcp__.*toonkit.*__toonkit_(create_canvas|get_canvas|get_canvas_mutation|canvas_group_nodes|canvas_reference3d_(catalog|create|edit|get_scene))\"\n      hooks:\n        - type: command\n          timeout: 30\n          command: >-\n            i=$(cat); d=\"${TOONKIT_3DREF_SPOOL:-$HOME/.cache/toonkit-3dref/spool}\";\n            case \"$i\" in *'\"3dref-spool:'*) ;; *) set -- \"$d\"/*.pending; [ -e \"$1\" ] || exit 0;; esac;\n            for p in python3 python; do if \"$p\" -c 'import sys; sys.exit(sys.version_info < (3, 8))' >/dev/null 2>&1; then\n            printf '%s' \"$i\" | \"$p\" \"${CLAUDE_PLUGIN_ROOT}/skills/3dref/scripts/spool_hook.py\"; exit 0; fi; done; exit 0\n  PostToolUse:\n    - matcher: \"mcp__.*toonkit.*__toonkit_(create_canvas|get_canvas|get_canvas_mutation|canvas_group_nodes|canvas_reference3d_(catalog|create|edit|get_scene))\"\n      hooks:\n        - type: command\n          timeout: 30\n          command: >-\n            i=$(cat); d=\"${TOONKIT_3DREF_SPOOL:-$HOME/.cache/toonkit-3dref/spool}\";\n            case \"$i\" in *'\"3dref-spool:'*) ;; *) set -- \"$d\"/*.pending; [ -e \"$1\" ] || exit 0;; esac;\n            for p in python3 python; do if \"$p\" -c 'import sys; sys.exit(sys.version_info < (3, 8))' >/dev/null 2>&1; then\n            printf '%s' \"$i\" | \"$p\" \"${CLAUDE_PLUGIN_ROOT}/skills/3dref/scripts/spool_hook.py\"; exit 0; fi; done; exit 0\n  PostToolUseFailure:\n    - matcher: \"mcp__.*toonkit.*__toonkit_(create_canvas|get_canvas|get_canvas_mutation|canvas_group_nodes|canvas_reference3d_(catalog|create|edit|get_scene))\"\n      hooks:\n        - type: command\n          timeout: 30\n          command: >-\n            i=$(cat); d=\"${TOONKIT_3DREF_SPOOL:-$HOME/.cache/toonkit-3dref/spool}\";\n            case \"$i\" in *'\"3dref-spool:'*) ;; *) set -- \"$d\"/*.pending; [ -e \"$1\" ] || exit 0;; esac;\n            for p in python3 python; do if \"$p\" -c 'import sys; sys.exit(sys.version_info < (3, 8))' >/dev/null 2>&1; then\n            printf '%s' \"$i\" | \"$p\" \"${CLAUDE_PLUGIN_ROOT}/skills/3dref/scripts/spool_hook.py\"; exit 0; fi; done; exit 0\n---\n\n# 3D reference previz\n\nDeliver an editable ToonKit scene and its playable source-linked video. Preserve requested duration, FPS, actors and camera intent. A location sheet supplies spatial relationships: build only surfaces, silhouettes and obstacles needed by the shot, using simple proxies. Do not recreate panorama detail.\n\n## Choose the smallest suitable route\n\n- **Native MCP:** simple continuous presets, a few root/camera keys, existing-scene edits, other catalog geometry/animals or existing uploaded assets. Read [native execution](references/native.md). No Node/three/FBX setup for this route. The live catalog defines available ToonKit features; the compiler's limits do not disable them.\n- **Compiled choreography:** multi-actor trajectories with measured contact, wall-as-floor roll, composed body motion or shared root/body slow motion. Read [production input](references/production-input.md) and [execution](references/execution.md). Read [source motion](references/body-motion.md) only for composed/retimed actions. Python/Node calculate the frames, binds and checks; do not handwrite dense arrays or replace a failed measured constraint with fabricated evidence.\n- No AI catalogs, balance, quotes or generation SSOT for either deterministic route. Generation remains a separately authorized stage.\n\n## Compiled route\n\n1. Read [conventions](references/conventions.md) and `references/examples/` first; do not study `scripts/` source (loading the launcher as [execution](references/execution.md) describes is expected). Write one compact `3dref-production-v2` spec from the user's references. Plan actors/camera first, then shot-relevant proxies and real support faces. Actor count is bounded by live capacity, not fixed at two.\n2. Compile in a fresh run directory. The package converts center/size to actual primitive pivots, bakes each distinct motion once, solves the wall-floor roll sign, culls irrelevant geometry, reduces keys and checks emitted interpolation. Fix concrete planning failures locally before writing: read only `<run>/diagnostic.json`, edit the spec, recompile (seconds). Default hold observations are advisory; explicit requested limits are enforced.\n3. Use the packaged runtime or [portable relay](references/direct.md), both over the same bridge. On Claude Code the relay parks MCP payloads through this skill's hook (`--spool`); never retype requests or responses. Skill hooks apply only to the main conversation, so run the relay there, not in a subagent. Keep the exact editor visible. Apply all base keys before pose overlays; wait for accepted pending work before new revisions.\n4. Compare exposed saved fields with the bundle. Check timing in the visible editor when safe readback omits it. Verify a fresh scene before Export. Never Save stale initial UI data over verified work.\n5. Export through the visible editor. Record whether a click actually occurred; readiness failure with confirmed no click may resume. Uncertain clicks must be reconciled with existing output before another attempt. Confirm the new source edge, exact output node and decoded duration/dimensions.\n\n## Scope and invariants\n\nThe compiler currently calibrates boxes, fresh unit-scale stock humans, one camera and the documented source motions. Other live MCP features use the native route with appropriately scoped checks; do not silently substitute the compiler's subset for the user's request. Existing compiled runs use their original matching runtime.\n\n`engine-profile.json` records calibrated geometry/interpolation and maintenance evidence. Web JS filenames are not execution requirements: ordinary frontend rebuilds or lazy loading must not stop production. Live catalog/scene incompatibility or a changed source FBX needed for baking requires concrete inspection of that operation. Do not reverse-engineer the website on every request.\n\nAll compiled actor frames need real finite support, a declared transfer, or bounded intended flight. Root/body share a time map for slow motion; root height is applied once. Walls-as-floor require projected outward normal screen-up. Bone markers and stride comparisons are approximations, not skin/sole IK or artistic certification.\n\nScene/canvas edits use MCP; browser work is editor/navigation, readiness, Save/Export and resulting media. No hidden app stores/private endpoints or substitute renderer. Preserve existing user work. Do not lower FPS, shorten or split the shot, spend generation credits, or waive a failed measured constraint just to reach Export.\n\nNo prior project, local test log or conversation is required. Compiled runs retain `spec.json`, `compiled.json`, `journal.jsonl`; failed plans retain diagnostics. Load helpers once and emit summaries, not arrays. Native runs retain only the plan/receipts needed for recovery. Development tests run at release time, not on user requests.\n\nKeep the result visible and group this run's source/output once. Return the canvas link, actual duration/dimensions, scene FPS and concise verified/unverified scope. Export success does not establish visual acceptance or R2V compatibility. No routine screenshot/contact-sheet or repeated playback loops.\n\nFor underspecified staging read [direction](references/direction.md); for a failed constraint or release maintenance read [verification](references/preflight.md). Read the [MCP contract](references/mcp-contract.md) for operations outside the compiler or changed connected declarations.\n"
}

SHA-256 of public snapshot: e0894fe73459ec9af02bb1f07d3d08f272d1cc9bfe9b63db5ffc1cfb135160ee