summer-engine 3.3.0 → 3.4.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (293) hide show
  1. package/.claude-plugin/marketplace.json +2 -2
  2. package/.claude-plugin/plugin.json +4 -2
  3. package/.codex-plugin/plugin.json +5 -3
  4. package/.cursor-plugin/plugin.json +4 -2
  5. package/.factory-plugin/plugin.json +4 -2
  6. package/.opencode/INSTALL.md +8 -8
  7. package/.opencode/plugins/summer.js +2 -2
  8. package/AGENTS.md +7 -7
  9. package/CHANGELOG.md +50 -0
  10. package/GEMINI.md +1 -1
  11. package/NOTICE +1 -1
  12. package/README.md +32 -35
  13. package/assets/api-docs.json.gz +0 -0
  14. package/assets/autopilot/run.sh +2 -2
  15. package/assets/navigation/web-routes.json +1 -1
  16. package/commands/gameskill.md +2 -2
  17. package/commands/summer.md +25 -25
  18. package/dist/cli/commands/install.d.ts +10 -0
  19. package/dist/cli/commands/install.js +55 -10
  20. package/dist/cli/commands/open.d.ts +1 -1
  21. package/dist/cli/commands/run.d.ts +1 -1
  22. package/dist/cli/commands/run.js +1 -1
  23. package/dist/cli/commands/skills.js +2 -2
  24. package/dist/cli/commands/tool.d.ts +7 -0
  25. package/dist/cli/commands/tool.js +36 -1
  26. package/dist/core/api-client.d.ts +5 -6
  27. package/dist/core/api-client.js +12 -15
  28. package/dist/core/auth.js +2 -2
  29. package/dist/core/capabilities/asset-import.d.ts +0 -1
  30. package/dist/core/capabilities/camera-view.d.ts +1 -1
  31. package/dist/core/capabilities/camera-view.js +2 -2
  32. package/dist/core/capabilities/capture-gameplay.d.ts +69 -0
  33. package/dist/core/capabilities/capture-gameplay.js +283 -0
  34. package/dist/core/capabilities/connect-signal.d.ts +1 -2
  35. package/dist/core/capabilities/connect-signal.js +1 -2
  36. package/dist/core/capabilities/console-read.d.ts +2 -2
  37. package/dist/core/capabilities/console-read.js +2 -2
  38. package/dist/core/capabilities/creator.js +1 -1
  39. package/dist/core/capabilities/doctor.d.ts +9 -1
  40. package/dist/core/capabilities/doctor.js +47 -4
  41. package/dist/core/capabilities/engine-receipt.d.ts +5 -7
  42. package/dist/core/capabilities/engine-receipt.js +7 -9
  43. package/dist/core/capabilities/engine-run.d.ts +4 -0
  44. package/dist/core/capabilities/engine-run.js +33 -5
  45. package/dist/core/capabilities/export-engine-version.d.ts +15 -0
  46. package/dist/core/capabilities/export-engine-version.js +24 -0
  47. package/dist/core/capabilities/export-game.d.ts +9 -1
  48. package/dist/core/capabilities/export-game.js +115 -39
  49. package/dist/core/capabilities/export-presets.d.ts +1 -1
  50. package/dist/core/capabilities/export-presets.js +1 -1
  51. package/dist/core/capabilities/fabricate-mesh.d.ts +2 -3
  52. package/dist/core/capabilities/fabricate-mesh.js +2 -3
  53. package/dist/core/capabilities/frame-quality.d.ts +4 -4
  54. package/dist/core/capabilities/frame-quality.js +4 -4
  55. package/dist/core/capabilities/grep.d.ts +1 -1
  56. package/dist/core/capabilities/grep.js +1 -1
  57. package/dist/core/capabilities/image-generation.d.ts +9 -0
  58. package/dist/core/capabilities/image-generation.js +19 -1
  59. package/dist/core/capabilities/navigation/open.d.ts +1 -1
  60. package/dist/core/capabilities/navigation/open.js +1 -1
  61. package/dist/core/capabilities/navigation/render-product-map.js +1 -1
  62. package/dist/core/capabilities/navigation/targets.js +2 -2
  63. package/dist/core/capabilities/placement-batch.d.ts +1 -1
  64. package/dist/core/capabilities/placement-batch.js +2 -2
  65. package/dist/core/capabilities/play-determinism.d.ts +1 -1
  66. package/dist/core/capabilities/play-determinism.js +1 -1
  67. package/dist/core/capabilities/publish-build.d.ts +15 -2
  68. package/dist/core/capabilities/publish-build.js +78 -28
  69. package/dist/core/capabilities/publish-download.d.ts +1 -2
  70. package/dist/core/capabilities/publish-download.js +2 -3
  71. package/dist/core/capabilities/replace-node.d.ts +1 -3
  72. package/dist/core/capabilities/replace-node.js +1 -3
  73. package/dist/core/capabilities/runtime-control.d.ts +5 -7
  74. package/dist/core/capabilities/runtime-control.js +7 -9
  75. package/dist/core/capabilities/scene-batch.d.ts +1 -1
  76. package/dist/core/capabilities/scene-batch.js +1 -1
  77. package/dist/core/capabilities/scene-kind.js +1 -1
  78. package/dist/core/capabilities/scene-readback.d.ts +3 -4
  79. package/dist/core/capabilities/scene-readback.js +3 -4
  80. package/dist/core/capabilities/scene-script.d.ts +2 -2
  81. package/dist/core/capabilities/scene-script.js +2 -2
  82. package/dist/core/capabilities/seeing/shot-store.d.ts +1 -1
  83. package/dist/core/capabilities/seeing/shot-store.js +1 -1
  84. package/dist/core/capabilities/summer-bundle.d.ts +2 -3
  85. package/dist/core/capabilities/summer-bundle.js +2 -3
  86. package/dist/core/capabilities/surface-snap.d.ts +1 -1
  87. package/dist/core/capabilities/surface-snap.js +1 -1
  88. package/dist/core/capabilities/tool-dispatch.js +11 -1
  89. package/dist/core/capabilities/ui-control.d.ts +1 -2
  90. package/dist/core/capabilities/ui-control.js +1 -2
  91. package/dist/core/capabilities/world-snapshot.d.ts +1 -1
  92. package/dist/core/capabilities/world-snapshot.js +1 -1
  93. package/dist/core/capability-skew.d.ts +2 -3
  94. package/dist/core/capability-skew.js +4 -5
  95. package/dist/core/config.js +2 -2
  96. package/dist/core/engine-install.d.ts +16 -0
  97. package/dist/core/engine-install.js +32 -2
  98. package/dist/core/feedback/client.js +1 -1
  99. package/dist/core/hosted-mcp.d.ts +115 -0
  100. package/dist/core/hosted-mcp.js +164 -0
  101. package/dist/core/launch-posture.d.ts +6 -3
  102. package/dist/core/launch-posture.js +18 -5
  103. package/dist/core/library-read.js +1 -2
  104. package/dist/core/templates.d.ts +1 -2
  105. package/dist/core/templates.js +1 -2
  106. package/dist/mcp/hosted-mount.d.ts +13 -59
  107. package/dist/mcp/hosted-mount.js +24 -30
  108. package/dist/mcp/server.d.ts +2 -2
  109. package/dist/mcp/server.js +5 -4
  110. package/dist/mcp/tools/creator-tools.js +14 -4
  111. package/dist/mcp/tools/debug-tools.js +1 -1
  112. package/dist/mcp/tools/generate-tools.js +19 -9
  113. package/dist/mcp/tools/navigation-tools.d.ts +1 -1
  114. package/dist/mcp/tools/navigation-tools.js +1 -1
  115. package/dist/mcp/tools/spatial-tools.js +1 -1
  116. package/dist/mcp/tools/visual-tools.js +2 -2
  117. package/dist/mcp/tools/with-engine.d.ts +1 -2
  118. package/dist/mcp/tools/with-engine.js +1 -2
  119. package/gemini-extension.json +3 -1
  120. package/hooks/session-start.sh +2 -2
  121. package/integrations/README.md +70 -76
  122. package/integrations/claude/README.md +0 -3
  123. package/integrations/codex/README.md +1 -2
  124. package/integrations/copilot-jetbrains/README.md +1 -1
  125. package/integrations/cursor/README.md +1 -2
  126. package/integrations/factory/README.md +15 -11
  127. package/integrations/mistral-vibe/README.md +1 -1
  128. package/integrations/opencode/README.md +1 -1
  129. package/integrations/roo-code/README.md +1 -1
  130. package/integrations/rovo-dev/README.md +1 -1
  131. package/integrations/trae/README.md +1 -1
  132. package/integrations/windsurf/README.md +3 -3
  133. package/library/references/collaborative-protocol/collaborative-protocol.md +5 -5
  134. package/library/references/gd-style/gd-style.md +4 -6
  135. package/library/references/godot-version/godot-version.md +3 -3
  136. package/library/references/headless-routing/headless-routing.md +2 -2
  137. package/library/references/mcp-fresh-chat-playbook/mcp-fresh-chat-playbook.md +2 -2
  138. package/library/references/mcp-tools-reference/mcp-tools-reference.md +18 -16
  139. package/library/references/product-map/product-map.md +1 -1
  140. package/library/references/public-surface-language/public-surface-language.md +1 -1
  141. package/library/references/summer-folder/summer-folder.md +1 -1
  142. package/library/skills/3d-lighting/SKILL.md +4 -4
  143. package/library/skills/README.md +11 -9
  144. package/library/skills/adaptive-music/SKILL.md +7 -7
  145. package/library/skills/ai-characters-in-games/SKILL.md +1 -1
  146. package/library/skills/ambient-bed/SKILL.md +12 -14
  147. package/library/skills/animated-loop/SKILL.md +42 -42
  148. package/library/skills/animation-tree/SKILL.md +6 -6
  149. package/library/skills/art-direction/SKILL.md +8 -11
  150. package/library/skills/asset-strategy/SKILL.md +3 -3
  151. package/library/skills/audio-direction/SKILL.md +8 -10
  152. package/library/skills/auto-fire-targeting/SKILL.md +4 -3
  153. package/library/skills/bounded-engine-runs/SKILL.md +95 -0
  154. package/library/skills/bounded-engine-runs/resource.yaml +29 -0
  155. package/library/skills/brainstorm-game/SKILL.md +5 -5
  156. package/library/skills/brainstorming/SKILL.md +9 -15
  157. package/library/skills/celeste-momentum-platforming/SKILL.md +8 -13
  158. package/library/skills/celeste-momentum-platforming/resource.yaml +1 -1
  159. package/library/skills/character-animation-wiring/SKILL.md +2 -2
  160. package/library/skills/character-model/SKILL.md +15 -26
  161. package/library/skills/character-movement/SKILL.md +1 -1
  162. package/library/skills/character-movement/references/movement-3d.md +1 -1
  163. package/library/skills/character-portrait/SKILL.md +4 -4
  164. package/library/skills/cinematic-cutscene/SKILL.md +38 -38
  165. package/library/skills/combat-basics/SKILL.md +1 -1
  166. package/library/skills/compatibility-renderer-traps/SKILL.md +78 -0
  167. package/library/skills/compatibility-renderer-traps/resource.yaml +28 -0
  168. package/library/skills/concept-art/SKILL.md +4 -4
  169. package/library/skills/create-asset-sheet/SKILL.md +12 -31
  170. package/library/skills/debug/SKILL.md +5 -4
  171. package/library/skills/debugging-game-feel/SKILL.md +1 -4
  172. package/library/skills/debugging-game-feel/resource.yaml +1 -1
  173. package/library/skills/design-level/SKILL.md +5 -5
  174. package/library/skills/design-mechanic/SKILL.md +6 -6
  175. package/library/skills/design-npc/SKILL.md +8 -15
  176. package/library/skills/diagnosing-perf-regressions/SKILL.md +5 -10
  177. package/library/skills/dispatching-parallel-agents/SKILL.md +1 -19
  178. package/library/skills/environment-kit/SKILL.md +5 -5
  179. package/library/skills/export-and-ship/SKILL.md +25 -24
  180. package/library/skills/fabricating-assets/SKILL.md +1 -1
  181. package/library/skills/facial-and-lipsync/SKILL.md +5 -5
  182. package/library/skills/fps-controller/SKILL.md +17 -16
  183. package/library/skills/fps-controller/resource.yaml +0 -2
  184. package/library/skills/game-feel/SKILL.md +6 -7
  185. package/library/skills/gameskill/SKILL.md +3 -3
  186. package/library/skills/gdscript-patterns/SKILL.md +3 -3
  187. package/library/skills/generate-motion/SKILL.md +5 -22
  188. package/library/skills/godogen-visual-proof-game-generation/SKILL.md +72 -90
  189. package/library/skills/godogen-visual-proof-game-generation/resource.yaml +0 -1
  190. package/library/skills/headless-scripting/SKILL.md +8 -8
  191. package/library/skills/headless-scripting/resource.yaml +1 -0
  192. package/library/skills/in-game-purchases/SKILL.md +123 -118
  193. package/library/skills/in-game-purchases/resource.yaml +2 -2
  194. package/library/skills/instantiate-asset-pack/SKILL.md +7 -3
  195. package/library/skills/investigating-bugs/SKILL.md +3 -11
  196. package/library/skills/investigating-bugs/condition-based-waiting.md +0 -10
  197. package/library/skills/investigating-bugs/root-cause-tracing.md +0 -8
  198. package/library/skills/lumera-single-image-scene-reconstruction/SKILL.md +15 -15
  199. package/library/skills/lumera-single-image-scene-reconstruction/resource.yaml +0 -1
  200. package/library/skills/make-game/SKILL.md +3 -5
  201. package/library/skills/make-game/references/2d-platformer.md +1 -1
  202. package/library/skills/multiplayer-project/SKILL.md +1 -1
  203. package/library/skills/multiplayer-testing/SKILL.md +4 -4
  204. package/library/skills/music-track/SKILL.md +40 -38
  205. package/library/skills/new-project/SKILL.md +4 -6
  206. package/library/skills/organic-model/SKILL.md +9 -9
  207. package/library/skills/pixel-art/SKILL.md +6 -6
  208. package/library/skills/play/SKILL.md +3 -4
  209. package/library/skills/playtesting-a-feature/SKILL.md +4 -6
  210. package/library/skills/procedural-animation/SKILL.md +10 -11
  211. package/library/skills/prop-model/SKILL.md +4 -4
  212. package/library/skills/psx-retro-rendering/SKILL.md +20 -20
  213. package/library/skills/psx-retro-rendering/resource.yaml +2 -3
  214. package/library/skills/realtime-wet-surfaces/SKILL.md +15 -15
  215. package/library/skills/realtime-wet-surfaces/resource.yaml +1 -2
  216. package/library/skills/remote-deploy/SKILL.md +20 -21
  217. package/library/skills/retarget/SKILL.md +19 -23
  218. package/library/skills/running-in-the-cloud/SKILL.md +5 -5
  219. package/library/skills/scene-composition/SKILL.md +5 -5
  220. package/library/skills/scene-hierarchy-design/SKILL.md +3 -3
  221. package/library/skills/scene-hierarchy-design/resource.yaml +0 -1
  222. package/library/skills/scene-scripting/SKILL.md +3 -3
  223. package/library/skills/scene-to-level/SKILL.md +28 -31
  224. package/library/skills/skill-create/SKILL.md +1 -1
  225. package/library/skills/skill-improve/SKILL.md +9 -9
  226. package/library/skills/skill-test/SKILL.md +10 -10
  227. package/library/skills/skintokens-auto-rigging/SKILL.md +18 -18
  228. package/library/skills/skintokens-auto-rigging/resource.yaml +3 -3
  229. package/library/skills/skybox-panorama/SKILL.md +8 -9
  230. package/library/skills/sound-effect/SKILL.md +19 -19
  231. package/library/skills/spatial-placement/SKILL.md +2 -2
  232. package/library/skills/spatial-placement/references/kit-placement-tools.md +12 -22
  233. package/library/skills/sprite-sheet/SKILL.md +10 -10
  234. package/library/skills/summer-analytics/SKILL.md +3 -3
  235. package/library/skills/summer-friends/SKILL.md +10 -10
  236. package/library/skills/summer-leaderboards/SKILL.md +6 -6
  237. package/library/skills/summer-match-results/SKILL.md +13 -13
  238. package/library/skills/summer-matchmaking/SKILL.md +11 -11
  239. package/library/skills/summer-parties/SKILL.md +9 -9
  240. package/library/skills/summer-player-data/SKILL.md +12 -12
  241. package/library/skills/summer-store/SKILL.md +6 -6
  242. package/library/skills/summer-world-chat/SKILL.md +9 -9
  243. package/library/skills/summer-world-saves/SKILL.md +7 -7
  244. package/library/skills/text-to-motion/rigging-for-text-motion.md +1 -1
  245. package/library/skills/tileable-texture/SKILL.md +1 -1
  246. package/library/skills/trailer-shot/SKILL.md +36 -36
  247. package/library/skills/tune-performance/SKILL.md +13 -13
  248. package/library/skills/tune-performance/resource.yaml +1 -1
  249. package/library/skills/ui-graphics/SKILL.md +7 -7
  250. package/library/skills/use-widget-asset/SKILL.md +7 -7
  251. package/library/skills/using-summer/SKILL.md +5 -7
  252. package/library/skills/vehicle-model/SKILL.md +6 -7
  253. package/library/skills/vehicle-model/resource.yaml +2 -2
  254. package/library/skills/verification-before-completion/SKILL.md +5 -6
  255. package/library/skills/vfx-dissolve/SKILL.md +4 -4
  256. package/library/skills/vfx-fire/SKILL.md +6 -6
  257. package/library/skills/vfx-fire/_building-blocks/additive-billboard-particles.md +3 -3
  258. package/library/skills/vfx-hit-spark/SKILL.md +4 -4
  259. package/library/skills/vfx-hit-spark/_building-blocks/additive-billboard-particles.md +3 -3
  260. package/library/skills/vfx-lightning/SKILL.md +5 -5
  261. package/library/skills/vfx-lightning/_building-blocks/additive-billboard-particles.md +3 -3
  262. package/library/skills/vfx-lightning/_building-blocks/trauma-shake-snippet.md +9 -3
  263. package/library/skills/vfx-magic-glow/SKILL.md +4 -4
  264. package/library/skills/vfx-magic-glow/_building-blocks/additive-billboard-particles.md +3 -3
  265. package/library/skills/vfx-muzzle-flash/SKILL.md +5 -5
  266. package/library/skills/vfx-muzzle-flash/_building-blocks/additive-billboard-particles.md +3 -3
  267. package/library/skills/vfx-muzzle-flash/_building-blocks/trauma-shake-snippet.md +9 -3
  268. package/library/skills/vfx-smoke/SKILL.md +5 -5
  269. package/library/skills/vfx-water-ripple/SKILL.md +2 -2
  270. package/library/skills/vfx-water-ripple/_building-blocks/additive-billboard-particles.md +3 -3
  271. package/library/skills/voice-line/SKILL.md +9 -9
  272. package/library/skills/web-compatibility-look/resource.yaml +1 -0
  273. package/library/skills/world-building-3d/references/spatial-tools.md +2 -2
  274. package/library/skills/writing-plans/SKILL.md +4 -4
  275. package/library/skills/writing-skills/SKILL.md +8 -8
  276. package/library/tools/capture-gameplay/resource.yaml +73 -0
  277. package/library/tools/creator-publish/resource.yaml +4 -4
  278. package/library/tools/creator-releases/resource.yaml +5 -5
  279. package/library/tools/generate-image/resource.yaml +15 -1
  280. package/library/tools/publish-build/resource.yaml +6 -2
  281. package/package.json +1 -1
  282. package/registry/generated/aliases.json +1 -0
  283. package/registry/generated/counts.json +3 -3
  284. package/registry/generated/gemini-extension.json +3 -1
  285. package/registry/generated/index.json +248 -135
  286. package/registry/generated/marketplace.claude.json +2 -2
  287. package/registry/generated/plugin.claude.json +4 -2
  288. package/registry/generated/plugin.codex.json +5 -3
  289. package/registry/generated/plugin.cursor.json +4 -2
  290. package/registry/generated/plugin.factory.json +4 -2
  291. package/registry/generated/skills-index.md +11 -9
  292. package/registry/generated/skills-registry.json +33 -6
  293. package/registry/schemas/domains.json +1 -1
@@ -13,13 +13,13 @@ tags:
13
13
  confidence: extracted
14
14
  ---
15
15
 
16
- # Single-Image → Editable Scene Reconstruction (Lumera-style) in SummerEngine
16
+ # Single-Image → Editable Scene Reconstruction (Lumera-style) in Summer Engine
17
17
 
18
18
  ## Outcome
19
19
 
20
- Turn one reference image into an **editable, engine-native scene** in SummerEngine: individual `MeshInstance3D` objects with transforms, countable parametric light nodes, and an HDR environment probe — not a fused point cloud, Gaussian splat, or baked texture. This is the adaptation of the Lumera pipeline (arXiv:2607.20889, Tsinghua AIRSUN lab) from UE5 to SummerEngine.
20
+ Turn one reference image into an **editable, engine-native scene** in Summer Engine: individual `MeshInstance3D` objects with transforms, countable parametric light nodes, and an HDR environment probe — not a fused point cloud, Gaussian splat, or baked texture. This adapts the Lumera pipeline (arXiv:2607.20889, Tsinghua AIRSUN lab), which was built on another engine, to Summer Engine.
21
21
 
22
- **Honesty caveat:** Lumera itself is UE5-only with no public code as of retrieval (2026-08-30); the paper explicitly lists Godot/engine-portable extraction as future work. This skill documents the architecture and the parts an agent can build in SummerEngine today (assembly, scene representation, refinement loop, evaluation), and flags the parts that require external model components (VLM box/light parsers, per-object mesh generator, HDR estimator).
22
+ **Caveat:** Lumera has no public code, and the paper lists engine-portable extraction as future work. This skill documents the architecture and the parts an agent can build in Summer Engine today (assembly, scene representation, refinement loop, evaluation), and flags the parts that require external model components (VLM box/light parsers, per-object mesh generator, HDR estimator).
23
23
 
24
24
  ## When to Use
25
25
 
@@ -44,11 +44,11 @@ Lumera's stages (from paper abstract + appendices):
44
44
  3. **Per-object mesh reconstruction** — a mesh per parsed box.
45
45
  4. **HDR environment estimation** — environment probe (IntrinsicHDR partially compensates for SkyLight/unseen near-camera lights).
46
46
  5. **Bounded agentic refinement loop** — dual-agent (geometry stage, then light stage) edits + verifies against the reference image.
47
- 6. **Assembly** — emit engine-native scene (Blender/UE5 in the paper; `.tscn` in SummerEngine).
47
+ 6. **Assembly** — emit an engine-native scene (`.tscn` in Summer Engine).
48
48
 
49
- Dataset backing it: Lumera-2K, 2,513 UE5 projects → 3.73M components, 63M object instances, 102.6K parametric lights, 95.1K camera views.
49
+ Dataset backing it: Lumera-2K, 2,513 game-engine projects → 3.73M components, 63M object instances, 102.6K parametric lights, 95.1K camera views.
50
50
 
51
- ## Scene / Node Shape (SummerEngine target)
51
+ ## Scene / Node Shape (Summer Engine target)
52
52
 
53
53
  The assembly stage should emit this node tree so output stays inspectable/editable:
54
54
 
@@ -65,10 +65,10 @@ ReconstructedScene (Node3D)
65
65
  ├── OmniLight3D / SpotLight3D / DirectionalLight3D × M
66
66
  │ # position/rotation from (x,y,z); color from (r,g,b);
67
67
  │ # light_energy from I (mind log-scale calibration, see Tunables)
68
- └── (SkyLight-equivalent is carried by WorldEnvironment in Godot)
68
+ └── (the sky-light equivalent is carried by WorldEnvironment)
69
69
  ```
70
70
 
71
- Keep objects and lights as **separate siblings under named containers** — this mirrors UE5's component structure and is what makes the scene "editable" rather than "looks 3D".
71
+ Keep objects and lights as **separate siblings under named containers**. That separation is what makes the scene editable rather than just looking 3D.
72
72
 
73
73
  ## Implementation Steps
74
74
 
@@ -97,15 +97,15 @@ Add a **repair layer** on ingest: drop/fix invalid labels, non-positive sizes, d
97
97
 
98
98
  ### 2. Box + light parsing (external VLM components)
99
99
 
100
- Lumera-Box/Lumera-Light are VLMs SFT'd on Lumera-2K; there is no public checkpoint. Options: use a hosted VLM prompted to emit the JSON tuples above, or fine-tune an open VLM on your own engine-exported scenes (Godot scenes are text `.tscn` and trivially exportable — this is the "build Lumera-2K for your engine" step the paper identifies as missing for non-UE5 engines).
100
+ Lumera-Box/Lumera-Light are VLMs SFT'd on Lumera-2K; there is no public checkpoint. Options: use a hosted VLM prompted to emit the JSON tuples above, or fine-tune an open VLM on your own engine-exported scenes (`.tscn` scenes are text and easy to export; this is the "build Lumera-2K for your engine" step the paper identifies as missing for other engines).
101
101
 
102
102
  ### 3. Per-object mesh generation + HDR environment estimation
103
103
 
104
- Also external model components in Lumera (per-object mesh reconstruction; IntrinsicHDR-style environment estimation). For a SummerEngine blockout you can substitute: box mesh (`BoxMesh` sized to the parsed box) per object and a generated/estimated panorama `Sky`. Swap in real reconstructed meshes later without changing the schema.
104
+ Also external model components in Lumera (per-object mesh reconstruction; IntrinsicHDR-style environment estimation). For a Summer Engine blockout you can substitute: box mesh (`BoxMesh` sized to the parsed box) per object and a generated/estimated panorama `Sky`. Swap in real reconstructed meshes later without changing the schema.
105
105
 
106
106
  ### 4. Assembly: write a `.tscn`
107
107
 
108
- Deterministic GDScript/tool script: instantiate the node shape above from the repaired records. Godot's `.tscn` is text — generating it directly keeps the output diffable and versionable. Save with `PackedScene.pack()` / `ResourceSaver.save()` from an editor tool.
108
+ Deterministic GDScript/tool script: instantiate the node shape above from the repaired records. A `.tscn` is text, so generating it directly keeps the output diffable and versionable. Save with `PackedScene.pack()` / `ResourceSaver.save()` from an editor tool.
109
109
 
110
110
  ### 5. Bounded dual-agent refinement loop
111
111
 
@@ -148,17 +148,17 @@ Reproduce the paper's metrics on held-out scenes so improvements are measurable:
148
148
  - **Per-light localization is weak** (F1 0.209 @ 0.5 m) while scene-level light *count* recall is strong (0.998). Frame the output as "right number of lights, roughly right places."
149
149
  - **SkyLight / near-camera lights whose source is off-screen** are not supervised; the environment probe (IntrinsicHDR) only partially compensates.
150
150
  - **Large outdoor scenes drift geometrically** (~17 m Chamfer-L2); consider joint camera+geometry calibration if you need metric outdoor consistency.
151
- - **Engine conventions don't transfer for free** — the dataset and light conventions are UE5's; Godot's light units/probes differ, so recalibrate intensity and validate the representation on Godot-native scenes.
151
+ - **Engine conventions don't transfer for free.** The dataset's light conventions come from another engine; Summer Engine's light units and probes differ, so recalibrate intensity and validate the representation on Summer-native scenes.
152
152
 
153
153
  ## Verification
154
154
 
155
- Not summerengine-verified. To validate an implementation in SummerEngine:
155
+ Not yet verified in Summer Engine. To validate an implementation:
156
156
 
157
157
  1. Assemble a scene from a test image; confirm the `.tscn` contains separate, selectable `MeshInstance3D`s and light nodes (editability check).
158
158
  2. Move/replace one mesh and re-tune one light in the editor without breaking the scene.
159
- 3. Run the evaluation harness (§6) against a held-out set of known Godot scenes and compare to the reference numbers above.
159
+ 3. Run the evaluation harness (§6) against a held-out set of known scenes and compare to the reference numbers above.
160
160
  4. Confirm the refinement loop terminates within `T_g`/`T_l` and the history window never exceeds the VLM context budget.
161
161
 
162
162
  ## Confidence
163
163
 
164
- `extracted` — Architecture, metrics, refinement-loop design, and limitations are drawn directly from the arXiv paper (abstract, intro, appendices H.7–I as retrieved; middle method sections were truncated and are not documented here) and the author's announcement post. The SummerEngine node mapping and GDScript schema are adaptations, not from the sources; no public Lumera code exists to reference.
164
+ `extracted` — Architecture, metrics, refinement-loop design, and limitations are drawn directly from the arXiv paper (abstract, intro, appendices H.7–I as retrieved; middle method sections were truncated and are not documented here) and the author's announcement post. The Summer Engine node mapping and GDScript schema are adaptations, not from the sources; no public Lumera code exists to reference.
@@ -10,7 +10,6 @@ use_when:
10
10
  do_not_use_when:
11
11
  - "you only need a visual backdrop (a splat or depth-mesh bake is cheaper), large unbounded outdoor scenes, or exact light positions and intensities"
12
12
  - "Lumera itself has no public code; the VLM box/light parsers, per-object mesh generator, and HDR estimator are external components you must supply"
13
- - "intake from the gamedev-knowledge pipeline (source-cited, pipeline-validated, not yet exercised in-engine by the Summer team) — verify results in the engine as you would any technique"
14
13
  facets:
15
14
  lifecycle:
16
15
  - build
@@ -40,9 +40,9 @@ Distilled blueprints for common genres live in this skill's `references/` folder
40
40
  | Third-person action / 3D platformer | `references/3d-third-person.md` | `references/3d-third-person-systems.md` | Node3D / CharacterBody3D / SpringArm3D |
41
41
  | First-person horror | `references/3d-horror.md` | `references/3d-horror-systems.md` | Node3D / CharacterBody3D / Camera3D on Head |
42
42
 
43
- No playbook (racing, sandbox, sim): build fresh through the phases below. The playbooks lean on these system skills — load one when its mechanic comes up: `character-movement`, `camera-rigs`, `combat-basics`, `save-load`, `ui-basics`, `setup-multiplayer`.
43
+ No playbook (racing, sandbox, sim): build fresh through the phases below. The playbooks lean on these system skills — load one when its mechanic comes up: `character-movement`, `camera-rigs`, `combat-basics`, `save-load`, `ui-basics`, `multiplayer-project`.
44
44
 
45
- Two rules from the playbooks apply to every genre:
45
+ These rules from the playbooks apply to every genre:
46
46
 
47
47
  - **2D scales to the viewport.** Set `display/window/stretch/mode = canvas_items` and `stretch/aspect = expand`; UI uses Control anchors; code-positioned nodes compute from `get_viewport_rect().size`. Never hardcode 1920x1080.
48
48
  - **Playable slice, not tech demo.** Name the core loop in one sentence; every input gets feedback (tween, sound, particle, flash, shake); progression is visible; a restart exists. The bar is "feels good for 30 seconds".
@@ -198,7 +198,7 @@ Repeat until every mechanic in the plan is implemented OR the user calls cut.
198
198
  Skill: art-direction
199
199
  ```
200
200
 
201
- That writes `.summer/art-bible.md` if it doesn't exist, then guides the lighting / material / palette pass. Use `3d-lighting` for the actual scene work. If the game plays in the browser or is exported for the web, it runs the Compatibility renderer only: follow `web-compatibility-look` instead of Forward+-only features (SDFGI, SSAO, SSR, volumetric fog), and keep `rendering/renderer/rendering_method` on `gl_compatibility`.
201
+ That writes `.summer/art-bible.md` if it doesn't exist, then guides the lighting / material / palette pass. Use `3d-lighting` for the actual scene work. For the web, check the target first. A summer.games web build (`summer_export_game` with `targets:["web"]`) runs on Summer's WebGPU template, which needs the Forward+ or Mobile renderer. A WebGL 2 target runs the Compatibility renderer only: follow `web-compatibility-look` there, avoid Forward+-only features (SDFGI, SSAO, SSR, volumetric fog), and keep `rendering/renderer/rendering_method` on `gl_compatibility`.
202
202
 
203
203
  ```
204
204
  Skill: audio-direction
@@ -277,8 +277,6 @@ By the end of a successful run, the user has:
277
277
  - `summer_get_diagnostics` returns clean
278
278
  - `summer_play` runs end-to-end and the win condition is reachable
279
279
 
280
- That's a real game. Not a half-finished prototype.
281
-
282
280
  ## Closing line
283
281
 
284
282
  When all phases are done:
@@ -56,7 +56,7 @@ separate Area under the player masking only the Enemies layer.
56
56
 
57
57
  ## Building the level with a TileMap
58
58
 
59
- Use a `TileMapLayer` (Godot 4.3+) for the solid world. Create a `TileSet`, paint
59
+ Use a `TileMapLayer` for the solid world. Create a `TileSet`, paint
60
60
  the collision polygon on the solid tiles, put the layer on the World collision
61
61
  layer. The player collides with it for free - no per-tile StaticBody.
62
62
 
@@ -476,7 +476,7 @@ Import once so new scripts register, then start two players.
476
476
  With the Summer MCP tools:
477
477
 
478
478
  ```
479
- summer_project_setting name="summer/local_play/players" value=2
479
+ summer_project_setting key="summer/local_play/players" value=2
480
480
  summer_play
481
481
  summer_get_diagnostics
482
482
  summer_stop
@@ -26,7 +26,7 @@ Pick whichever the session has.
26
26
  **Summer MCP tools** (they set project settings, then play):
27
27
 
28
28
  ```
29
- summer_project_setting name="summer/local_play/players" value=2
29
+ summer_project_setting key="summer/local_play/players" value=2
30
30
  summer_play
31
31
  summer_get_diagnostics
32
32
  summer_stop
@@ -59,9 +59,9 @@ Loopback has no latency, so it hides every timing bug. Always run once with
59
59
  these settings; they apply to every client:
60
60
 
61
61
  ```
62
- summer_project_setting name="summer/local_play/network/round_trip_msec" value=100
63
- summer_project_setting name="summer/local_play/network/jitter_msec" value=10
64
- summer_project_setting name="summer/local_play/network/loss_percent" value=1
62
+ summer_project_setting key="summer/local_play/network/round_trip_msec" value=100
63
+ summer_project_setting key="summer/local_play/network/jitter_msec" value=10
64
+ summer_project_setting key="summer/local_play/network/loss_percent" value=1
65
65
  ```
66
66
 
67
67
  Or put them in `project.godot` while testing:
@@ -13,7 +13,7 @@ paths: ["audio/music/**", "scripts/**", "**/*.tscn"]
13
13
 
14
14
  ## Overview
15
15
 
16
- ElevenLabs Music renders a track from a prompt. Summer clamps the requested length to **3–600 seconds** before sending it, so anything outside that range is silently pulled to the nearest bound. The output quality depends entirely on prompt specificity: tempo (BPM), key, instrumentation, mood, structural cue. "Epic orchestral" returns generic stock music. "85 BPM, D minor, solo cello and detuned upright piano, sparse, melancholic, no drums, 4/4" returns a usable score for a melancholic exploration scene.
16
+ ElevenLabs Music renders a track from a prompt. Summer clamps the requested length to **3–600 seconds** before sending it, so anything outside that range is silently pulled to the nearest bound. Quality depends on prompt specificity: tempo (BPM), key, instrumentation, mood, structural cue. "Epic orchestral" returns generic stock music. "85 BPM, D minor, solo cello and detuned upright piano, sparse, melancholic, no drums, 4/4" returns a usable score for a melancholic exploration scene.
17
17
 
18
18
  This skill produces one track aligned with the audio bible's music style and dynamic music plan, then wires it as an `AudioStreamPlayer` on the `Music` bus with a marked loop point if it's a loop, or as a linear cinematic stream if it's a one-shot.
19
19
 
@@ -25,9 +25,9 @@ This skill produces one track aligned with the audio bible's music style and dyn
25
25
 
26
26
  ## When NOT to use
27
27
 
28
- - Short stings / event punctuation (<5s) → use `audio/sound-effect` with class `Stinger`.
29
- - Adaptive layered stems with state-driven crossfades → `audio/adaptive-music`.
30
- - Ambient bed with no melody → `audio/ambient-bed`.
28
+ - Short stings / event punctuation (<5s) → use `sound-effect` with class `Stinger`.
29
+ - Adaptive layered stems with state-driven crossfades → `adaptive-music`.
30
+ - Ambient bed with no melody → `ambient-bed`.
31
31
 
32
32
  ## Steps
33
33
 
@@ -116,7 +116,7 @@ Prompts that DON'T work (and why):
116
116
 
117
117
  For loops: generate **≥30s, prefer 45–60s**. Shorter loops are recognized as repetition within 90s of play and become annoying. The bible's "no state stays >90s without variation" rule means even a 60s loop should contain internal variation (instrument swap on alternating cycles).
118
118
 
119
- For linear: generate **≥60s for cutscenes, up to 300s for endings**. The model handles long arcs better than people expect; ask for one rendered piece rather than splicing.
119
+ For linear: generate **≥60s for cutscenes, up to 300s for endings**. Ask for one rendered piece rather than splicing; the model handles long arcs.
120
120
 
121
121
  ### 6. Confirm and call
122
122
 
@@ -124,7 +124,7 @@ Show the prompt:
124
124
 
125
125
  > Prompt:
126
126
  > `85 BPM, D minor, 4/4, solo cello and detuned upright piano, sparse, melancholic exploration loop, no drums, gentle reverb, 60s loop`
127
- > Duration 60s. Cost: ~12 credits. Generate?
127
+ > Duration 60s. This uses credits. Generate?
128
128
 
129
129
  The `music` capability reads the description from **`prompt`**, not `text` — the mirror image of `sound_effects`. Passing `text` here is a 400 `prompt_required`.
130
130
 
@@ -155,9 +155,9 @@ loop = true
155
155
  loop_offset = 0.0
156
156
  ```
157
157
 
158
- If the start has a fade-in but the body is loopable, set `loop_offset = 4.0` (4 seconds of intro skipped on loop, plays full track first time). `bpm` + `beat_count` + `bar_beats` are what you set if you want beat-synced transitions later — see `audio/adaptive-music`.
158
+ If the start has a fade-in but the body is loopable, set `loop_offset = 4.0` (4 seconds of intro skipped on loop, plays full track first time). `bpm` + `beat_count` + `bar_beats` are what you set if you want beat-synced transitions later — see `adaptive-music`.
159
159
 
160
- For seamless looping, the cleaner option is to ask the model to generate a cell (one bar / one phrase) and concatenate; or generate at 60s and trust the model's structural cue. Crossfade looping in code is the practical fallback (see step 9).
160
+ For seamless looping, the cleaner option is to ask the model to generate a cell (one bar / one phrase) and concatenate; or generate at 60s and trust the model's structural cue. Crossfade looping in code is the practical fallback (step 9).
161
161
 
162
162
  ### 8. Wire it as `AudioStreamPlayer` on the `Music` bus
163
163
 
@@ -175,40 +175,42 @@ Music is `AudioStreamPlayer` (not 2D / 3D) — non-positional. The bible's `Musi
175
175
 
176
176
  ### 9. Crossfade-loop pattern (no marked loop point)
177
177
 
178
- If the loop click bothers the user, use a two-player crossfade:
178
+ If the loop click bothers the user, crossfade two players. Set `loop = false` in the import file first, so each player stops at the end.
179
179
 
180
180
  ```gdscript
181
181
  # scripts/audio/MusicLoopCrossfade.gd
182
182
  extends Node
183
183
  @export var stream: AudioStream
184
- @export var fade: float = 1.0
185
- var _a: AudioStreamPlayer
186
- var _b: AudioStreamPlayer
187
- var _active: AudioStreamPlayer
184
+ @export var fade := 1.0
185
+ @export var volume_db := -8.0
186
+ var _players: Array[AudioStreamPlayer] = []
187
+ var _current := 0
188
188
 
189
189
  func _ready() -> void:
190
- _a = _make_player()
191
- _b = _make_player()
192
- _active = _a
193
- _active.play()
194
- _active.finished.connect(_on_finished)
195
-
196
- func _make_player() -> AudioStreamPlayer:
197
- var p := AudioStreamPlayer.new()
198
- p.stream = stream
199
- p.bus = "Music"
200
- p.volume_db = -8.0
201
- add_child(p)
202
- return p
203
-
204
- func _on_finished() -> void:
205
- var next := _b if _active == _a else _a
206
- next.play()
207
- next.finished.connect(_on_finished, CONNECT_ONE_SHOT)
208
- _active = next
190
+ for i in 2:
191
+ var p := AudioStreamPlayer.new()
192
+ p.stream = stream
193
+ p.bus = "Music"
194
+ p.volume_db = volume_db
195
+ add_child(p)
196
+ _players.append(p)
197
+ _players[0].play()
198
+
199
+ func _process(_delta: float) -> void:
200
+ var a := _players[_current]
201
+ if not a.playing or a.get_playback_position() < stream.get_length() - fade:
202
+ return
203
+ _current = 1 - _current
204
+ var b := _players[_current]
205
+ b.volume_db = -80.0
206
+ b.play()
207
+ var t := create_tween().set_parallel()
208
+ t.tween_property(a, "volume_db", -80.0, fade)
209
+ t.tween_property(b, "volume_db", volume_db, fade)
210
+ t.chain().tween_callback(a.stop)
209
211
  ```
210
212
 
211
- The next instance starts at 0:00 the moment the previous finishes — gapless.
213
+ The next player starts `fade` seconds before the current one ends and the two cross over, so the seam is never heard.
212
214
 
213
215
  ## Reference card — prompts by slot
214
216
 
@@ -249,7 +251,7 @@ Cutscene (cinematic): varies tempo, D minor, 4/4, solo piano opens,
249
251
 
250
252
  ## Edge cases
251
253
 
252
- - **Clip is 50s but you wanted 60s.** Either regenerate (cheaper than you think) or extend by overlap-crossfading the last 5s onto the start in an audio editor.
254
+ - **Clip is 50s but you wanted 60s.** Either regenerate or extend by overlap-crossfading the last 5s onto the start in an audio editor.
253
255
  - **Loop click on every cycle.** Use the crossfade pattern in step 9.
254
256
  - **Clip is too long.** Trim the tail in the import dock with `loop_offset`, or in an audio editor.
255
257
  - **Track sounds nothing like the references.** Re-read the bible; the prompt may be missing the anchor instrument. Add it explicitly.
@@ -268,7 +270,7 @@ Print the prompt and instruct the user to run via the Summer dashboard, then `su
268
270
 
269
271
  ## See also
270
272
 
271
- - `audio/audio-direction` — defines style, tempo, key, model
272
- - `audio/adaptive-music` — wiring stems to game state
273
- - `audio/sound-effect` — short stings
274
- - `audio/ambient-bed` — non-melodic location bed
273
+ - `audio-direction` — defines style, tempo, key, model
274
+ - `adaptive-music` — wiring stems to game state
275
+ - `sound-effect` — short stings
276
+ - `ambient-bed` — non-melodic location bed
@@ -11,7 +11,7 @@ paths: ["**/project.godot"]
11
11
 
12
12
  # /new-project — Scaffold a fresh empty project
13
13
 
14
- When the user wants to start from a blank canvas — not a community template, not a built-in starter scene — this is the path.
14
+ Use this when the user wants a blank project instead of a template.
15
15
 
16
16
  ## When to use this skill
17
17
 
@@ -42,7 +42,7 @@ Default: `my-game`. If they say "anything is fine" or similar, use `my-game` and
42
42
  Two built-in options:
43
43
 
44
44
  - `empty` — root `Node3D` only. Pure blank canvas. Best for: experimentation, when the user knows exactly what they want to build.
45
- - `3d-basic` — root `Node3D` with `Camera3D`, `DirectionalLight3D`, a floor `MeshInstance3D`, and a `WorldEnvironment`. Best for: first-time users, when "just give me something I can press play on" is the vibe.
45
+ - `3d-basic` — root `Node3D` with `Camera3D`, `DirectionalLight3D`, a floor `MeshInstance3D`, and a `WorldEnvironment`. Best for: first-time users who want something they can press Play on.
46
46
 
47
47
  If you're not sure which fits, ask:
48
48
 
@@ -62,7 +62,7 @@ or
62
62
  summer create 3d-basic my-game
63
63
  ```
64
64
 
65
- The command writes `project.godot` and the chosen `main.tscn`. No network call, fast, deterministic.
65
+ The command writes `project.godot` and the chosen `main.tscn`. It makes no network call.
66
66
 
67
67
  ### 4. Open it
68
68
 
@@ -96,11 +96,9 @@ Ask: "Project is open. What do you want to build?"
96
96
  ## Edge cases
97
97
 
98
98
  - **Engine not running** → that's fine. `summer create` doesn't need the engine. After scaffolding, `summer run <name>` will start it.
99
- - **User wants 2D but `empty` is the only 2D-friendly built-in** → use `empty`, then in the next breath set up a 2D scene root via `summer_replace_node` (Node3D → Node2D). Mention this — don't surprise the user.
99
+ - **User wants 2D but `empty` is the only 2D-friendly built-in** → use `empty`, then set up a 2D scene root via `summer_replace_node` (Node3D → Node2D). Mention this — don't surprise the user.
100
100
  - **Directory exists** → the CLI errors out. Ask for a different name; don't try to overwrite.
101
101
 
102
102
  ## Closing
103
103
 
104
104
  End with: "Project `<name>` is created and open. What do you want to build first?"
105
-
106
- That's the handoff to whatever skill comes next.
@@ -13,9 +13,9 @@ paths: ["assets/organic/**", "assets/models/**", "**/*.tscn", "**/*.gd"]
13
13
 
14
14
  Organic shapes (trees, rocks, mushrooms, coral, alien flora, crystals, vines, bones) are **the most forgiving category for AI 3D generation**. Lumps look natural. Asymmetry looks natural. Smoothing-group artifacts read as bark texture. The "melted" look that ruins vehicles and characters is fine on a mossy boulder.
15
15
 
16
- This is the cheapest, fastest way to fill out a scene. Use it liberally — it's the recommended go-to when the user says "this scene feels empty". Each generation is ~$0.30–0.50, and the failure rate is the lowest of any 3D-asset family.
16
+ This is the cheapest, fastest way to fill out a scene, and the first choice when the user says "this scene feels empty". The failure rate is the lowest of any 3D-asset family.
17
17
 
18
- Backing tool: `summer_generate_3d`. Default `hunyuan` is great here, but `trellis` is faster and quality difference is mostly invisible on organic shapes — `trellis` is the recommended pick when generating many at once.
18
+ Backing tool: `summer_generate_3d`. Default `hunyuan` works well here, but `trellis` is faster and the quality difference is hard to see on organic shapes. Pick `trellis` when generating many at once.
19
19
 
20
20
  ## When to use
21
21
 
@@ -25,7 +25,7 @@ Backing tool: `summer_generate_3d`. Default `hunyuan` is great here, but `trelli
25
25
  - "Fill this forest scene with foliage."
26
26
  - "Alien plants for the planet surface."
27
27
  - "Coral for the underwater level."
28
- - The user wants visual density without spending a lot of money or time.
28
+ - The user wants visual density quickly and cheaply.
29
29
 
30
30
  ## When NOT to use
31
31
 
@@ -84,11 +84,11 @@ Organic prompts that DON'T work:
84
84
 
85
85
  ### 3. Confirm and call
86
86
 
87
- > About to generate `pine_tree_01` via `trellis`, target ~2k tris. ~$0.30, ~30s. OK?
87
+ > About to generate `pine_tree_01` via `trellis`, target ~2k tris, ~30s. This uses credits. OK?
88
88
 
89
89
  For batch generation, batch the confirmation:
90
90
 
91
- > About to generate 3 trees + 3 rocks + 5 mushrooms (11 generations, ~$3.50, ~5 min). All low-poly via `trellis`. OK?
91
+ > About to generate 3 trees + 3 rocks + 5 mushrooms (11 generations, ~5 min). All low-poly via `trellis`. OK?
92
92
 
93
93
  ```
94
94
  summer_generate_3d(
@@ -144,11 +144,11 @@ Every scene-mutating tool takes an explicit `scenePath`; node paths are relative
144
144
  For dense forests, the cheapest fix beyond MultiMesh is the billboard imposter:
145
145
 
146
146
  1. Generate the tree mesh once at high polycount.
147
- 2. Render it from one angle to a transparent PNG (Godot's `EditorScript` can capture a viewport).
147
+ 2. Render it from one angle to a transparent PNG (an `EditorScript` can capture a viewport).
148
148
  3. Use that PNG as a `Sprite3D` with `billboard = enabled`.
149
- 4. Swap from `MeshInstance3D` to `Sprite3D` at ~50m camera distance via Godot's `VisibleOnScreenNotifier3D` or a custom LOD script.
149
+ 4. Swap from `MeshInstance3D` to `Sprite3D` at ~50m camera distance with `visibility_range_end` on the mesh and `visibility_range_begin` on the sprite (both on `GeometryInstance3D`), or a custom LOD script.
150
150
 
151
- For a 200-tree forest, ~10 close trees are real meshes, 190 are billboards. Frame budget saved: ~80%.
151
+ In a 200-tree forest, only the ~10 closest trees need to be real meshes; the other 190 can be billboards.
152
152
 
153
153
  ## Anti-patterns
154
154
 
@@ -166,7 +166,7 @@ For a 200-tree forest, ~10 close trees are real meshes, 190 are billboards. Fram
166
166
  - **Branching meshes (vines, roots) come back too thick.** Specify `thin tendril, fine branches`, or accept and scale Y down in the editor.
167
167
  - **Snow / ice / frozen variant.** Add `covered in snow, frosted, ice crystals` to the prompt — works well on trees and rocks. For temperature variants of the same scene, generate the variant rather than retexturing.
168
168
  - **Crystal/glass organic.** Mesh comes back opaque. Generate the geometry, then assign a `StandardMaterial3D` with `transparency = ALPHA` and emissive in the editor.
169
- - **Bones, skulls, dead trees.** All work great — organic forgives them more than props would. Add `weathered, sun-bleached` for desert / tundra feel.
169
+ - **Bones, skulls, dead trees.** All work; organic forgives them more than props would. Add `weathered, sun-bleached` for desert / tundra feel.
170
170
 
171
171
  ## Fallback (no MCP)
172
172
 
@@ -11,13 +11,13 @@ paths: ["assets/**", "art/pixel/**", "sprites/**"]
11
11
 
12
12
  # pixel-art — Pixel-Perfect Sprites and Tiles
13
13
 
14
- This skill generates pixel-art assets — sprites, items, tiles, icons, portraits — at a target resolution (32×32, 64×64, 128×128, etc.). Pixel art has hard constraints (grid alignment, limited palette, no anti-aliased edges) that diffusion models violate by default. This skill encodes the prompt patterns and post-processing discipline that makes the output actually look like pixel art and not "blurry small image."
14
+ This skill generates pixel-art sprites, items, tiles, icons and portraits at a target resolution (32×32, 64×64, 128×128). Pixel art has hard constraints (grid alignment, limited palette, no anti-aliased edges) that diffusion models break by default. The prompt patterns and post-processing below make the output read as pixel art instead of a blurry small image.
15
15
 
16
16
  **Backing tool:** `summer_generate_image` with an explicit pixel-art prompt.
17
17
 
18
18
  Two things about that tool you have to know before writing a call, because both silently do nothing:
19
19
 
20
- - **There is no `"pixel"` style preset.** `style` accepts exactly `realistic`, `cartoon`, `anime`, `none`; anything else is coerced to `none`. Only `cartoon` and `anime` do anything at all (they append a short suffix); `realistic` and `none` append nothing. So `style: "pixel"` is identical to `style: "none"` — the pixel look has to come entirely from the prompt. Use `style: "none"` and say so honestly.
20
+ - **There is no `"pixel"` style preset.** `style` accepts exactly `realistic`, `cartoon`, `anime`, `none`; anything else is coerced to `none`. Only `cartoon` and `anime` do anything at all (they append a short suffix); `realistic` and `none` append nothing. So `style: "pixel"` is identical to `style: "none"` — the pixel look has to come entirely from the prompt. Use `style: "none"`.
21
21
  - **`options` is not a general passthrough.** The MCP tool forwards `options` to the server, which only recognizes Nano Banana provider keys: `seed`, `outputFormat`, `safetyTolerance`, `syncMode`, `systemPrompt`, `limitGenerations`, `thinkingLevel`. `image_size` and `negative_prompt` are not among them and are dropped without an error. There is no size or aspect-ratio argument on this tool at all — MCP images come back at the server's 1:1 default. Put framing and exclusions in the prompt text instead.
22
22
 
23
23
  Pixel-perfect output is enforced in Summer Engine with Nearest texture filtering
@@ -82,14 +82,14 @@ summer_generate_image(
82
82
  prompt="pixel art slime monster, 32x32 sprite, PICO-8 palette, hard 1px outline in palette's darkest color, 3-tone shading, no anti-aliasing, no blur, sharp pixel edges, front-facing. Not blurry, no smooth gradients, no soft edges, not photorealistic, no 3D render.",
83
83
  model="nano-banana-2",
84
84
  style="none",
85
- options={ removeBackground: true }
85
+ removeBackground=true
86
86
  )
87
87
  ```
88
88
 
89
89
  Two deliberate choices there:
90
90
 
91
91
  - **The negations live in the prompt.** There is no `negative_prompt` argument — putting one in `options` is dropped silently. Diffusion models honor in-prompt negations less reliably than a real negative-prompt field, so state them as plain sentences at the end and expect to regenerate more often than you would on a provider UI that exposes the field.
92
- - **`options.removeBackground: true` is real** and is the only `options` key in this skill that does anything: it runs a real background-removal pass after generation and returns a PNG with true alpha. Prefer it over asking for "transparent background" in the prompt, which is what makes models paint a literal checkerboard.
92
+ - **`removeBackground: true` is a top-level argument**, not an `options` key. It runs a background-removal pass after generation and returns a PNG with true alpha. Prefer it over asking for "transparent background" in the prompt, which makes models paint a literal checkerboard.
93
93
 
94
94
  ### 5. Downscale to target resolution
95
95
 
@@ -158,7 +158,7 @@ Confirm `Filter: Nearest` is set in the import dock OR project-wide.
158
158
  - **User wants the entire game in pixel art.** Set `Project Settings → Rendering → Textures → Default Texture Filter: Nearest` once. Saves you from re-setting it on every import.
159
159
  - **User wants a high-res "pixel art" portrait that's not actually pixelated** (faux-pixel-aesthetic at full resolution). That's `character-portrait` with a "pixel art aesthetic" prompt — not this skill.
160
160
  - **User specifies a palette like "Sweetie-16" or "Endesga-32" and the model ignores it.** Name the hex codes explicitly. Palette names alone are unreliable below the top 5-10 famous ones.
161
- - **Tilesets need to tile cleanly.** Pixel-art tile-edge cleanliness from raw generation is poor. Generate the tile grid, then manually fix edge seams in Aseprite. The AI gets you 80% there.
161
+ - **Tilesets need to tile cleanly.** Pixel-art tile-edge cleanliness from raw generation is poor. Generate the tile grid, then fix edge seams by hand in Aseprite.
162
162
 
163
163
  ## Fallback (no MCP)
164
164
 
@@ -169,7 +169,7 @@ summer_generate_image(
169
169
  prompt="<pixel art prompt with full anchor>. Not blurry, no smooth gradients, no anti-aliasing.",
170
170
  model="nano-banana-2",
171
171
  style="none",
172
- options={ removeBackground: true }
172
+ removeBackground=true
173
173
  )
174
174
  ```
175
175
 
@@ -104,11 +104,10 @@ Leave the game running. The user wants to play it. Stop only on explicit ask.
104
104
 
105
105
  This skill mutates engine state (clearing console, starting play). It's a read-side workflow with one safe write (`summer_play`). No "May I" needed — this is what the user asked for. Do confirm before stopping a running game.
106
106
 
107
- ## Want a working starter?
107
+ ## Requirements
108
108
 
109
- No template. Works against any Summer project that has a main scene set in the
110
- technical `project.godot` file.
109
+ Any Summer project with a main scene set in `project.godot`.
111
110
 
112
111
  ## See also
113
112
 
114
- - `debugging/debug/SKILL.md` — what to do when /play surfaces an error
113
+ - `debug` — what to do when /play surfaces an error
@@ -31,7 +31,7 @@ NO "FEATURE SHIPPED" CLAIM WITHOUT A PLAYED WALKTHROUGH
31
31
 
32
32
  If you have not, in this session, driven the feature and read back what happened, you cannot claim it works.
33
33
 
34
- **You walk the feature. Not the user.** A `RunVerification` probe presses your game's real inputs, reads state back across frames, and saves real rendered frames. Handing the walkthrough to the user is a last resort for things a probe genuinely cannot judge — see [What only a human can answer](#what-only-a-human-can-answer) — not the default.
34
+ **You walk the feature. Not the user.** A `RunVerification` probe presses your game's real inputs, reads state back across frames, and saves real rendered frames. Handing the walkthrough to the user is a last resort for things a probe cannot judge — see [What only a human can answer](#what-only-a-human-can-answer) — not the default.
35
35
 
36
36
  On an engine build with the runtime-control ops (`summer_game_probe`, `summer_game_input`, `summer_game_control`, `summer_runtime_*`), drive the LIVE game instead of a hidden probe: deterministic launch, frame-stamped probe before and after every action, exact frame steps. That doctrine is the `agent-playtesting` skill; this skill's probe loop below is the path when those tools answer `engine_lacks_op`.
37
37
 
@@ -130,13 +130,13 @@ If anything is non-zero or unexpected, the feature is not done. Go to `debug`.
130
130
 
131
131
  ### What only a human can answer
132
132
 
133
- A probe reports facts. It cannot hold an opinion. Ask the user only when the question is genuinely experiential:
133
+ A probe reports facts. It cannot hold an opinion. Ask the user only when the question is experiential:
134
134
 
135
135
  - **Does it feel right?** Floaty jumps, sluggish input, mushy hit feedback — see `debugging-game-feel`.
136
136
  - **Does it look good?** Composition, colour, readability. A probe can prove a light exists and prove the frame is not black; it cannot tell you the scene is ugly.
137
137
  - **Is this fun?** Not a measurable property.
138
138
 
139
- "I cannot simulate input" is not on that list, and has not been true since `RunVerification` shipped. If you catch yourself asking the user to press a key, write the probe instead.
139
+ "I cannot simulate input" is not on that list: `RunVerification` presses real inputs. If you catch yourself asking the user to press a key, write the probe instead.
140
140
 
141
141
  ### 4. Probe the edges
142
142
 
@@ -210,7 +210,7 @@ Don't ask reflexively. A saved frame sequence answers most "did it visually work
210
210
  | "It would take too long to play" | Playtest takes 60 seconds. Shipping a broken feature costs hours. |
211
211
  | "The unit test passes" | Unit tests cover code paths, not gameplay sequences. |
212
212
  | "I already played it in a previous session" | State changed. Verify in this session. |
213
- | "I'll let the user catch any issues" | That is the user's job description for a non-AI engineer. Yours is to ship working features. |
213
+ | "I'll let the user catch any issues" | Catching them is your job. Ship working features. |
214
214
  | Skipping `summer_clear_console` before `summer_play` | You will chase last session's errors. |
215
215
  | Sleeping a fixed delay after `summer_play` | Boot time varies. Wait for `play.started` with `summer_wait_for_event`, or confirm with `summer_is_running`. |
216
216
  | Skipping `summer_get_console` because diagnostics looked fine | Silent warnings and signal misfires hide there. |
@@ -254,8 +254,6 @@ So if `summer_play` returns "Summer Engine is not running":
254
254
 
255
255
  ## The Bottom Line
256
256
 
257
- A game feature is a promise to the player. Verifying it means seeing the promise kept on screen, not seeing the code that would, in theory, keep it.
258
-
259
257
  Press play. Walk the path. Probe the edges. Read the diagnostics. Then claim done.
260
258
 
261
259
  **Related skills:**
@@ -11,9 +11,9 @@ paths: ["**/*.gd", "**/*.tscn", "**/*.tres"]
11
11
 
12
12
  # Procedural Animation — Bones Driven by Code
13
13
 
14
- Generated clips give you 80% of a character. The remaining 20% — the eye contact when an NPC speaks, feet that plant on slopes, hands that wrap a sword grip, the lean into a sprint, the recoil from a hit on the left shoulder — is procedural. In Summer Engine this is done via the `SkeletonModifier3D` family attached to the `Skeleton3D`, plus tween-driven additive blend layers on the `AnimationTree`. None of it is generative; this skill is a recipe set.
14
+ Generated clips cover most of a character's motion. The rest — the eye contact when an NPC speaks, feet that plant on slopes, hands that wrap a sword grip, the lean into a sprint, the recoil from a hit on the left shoulder — is procedural. In Summer Engine this is done via the `SkeletonModifier3D` family attached to the `Skeleton3D`, plus additive blend layers on the `AnimationTree`. None of it is generative; this skill is a set of recipes.
15
15
 
16
- Honest limit: Summer Engine's current IK is good enough for look-at, foot-snap,
16
+ Limit: Summer Engine's current IK is good enough for look-at, foot-snap,
17
17
  and simple two-bone arm/leg chains. It is not a full-body IK system with weight
18
18
  redistribution. For combat-grappling or contact-heavy interactions, hand-author
19
19
  the contact frame and accept some clipping.
@@ -40,7 +40,7 @@ Almost every procedural request maps to one of these three. Pick the right one b
40
40
 
41
41
  ### Pattern A — SkeletonModifier3D (post-clip bone overrides)
42
42
 
43
- Attached as a child of `Skeleton3D`. Runs after the AnimationTree writes the pose, modifies specific bones in-place. Includes `LookAtModifier3D`, `SkeletonIK3D` (legacy, still supported), and the new (4.4+) `LookAtModifier3D` chain. Cheap, deterministic, no animation graph dependency.
43
+ Attached as a child of `Skeleton3D`. Runs after the AnimationTree writes the pose, modifies specific bones in-place. Includes `LookAtModifier3D` and `SkeletonIK3D`. Cheap, deterministic, no animation graph dependency.
44
44
 
45
45
  ### Pattern B — Additive AnimationNodeAdd2 layer in the tree
46
46
 
@@ -54,7 +54,7 @@ The skeleton hands off to physics on death. Bones become `PhysicalBone3D` rigid
54
54
 
55
55
  ### A1 — Head look-at the player
56
56
 
57
- The bread-and-butter NPC liveliness fix.
57
+ The most common NPC liveliness fix.
58
58
 
59
59
  **ctx lane (animation-tier engines):** one `summer_run_script` call creates the owned modifier and sets the props — prefer it over the 10-call CRUD chain below:
60
60
 
@@ -109,7 +109,7 @@ func _process(_delta: float) -> void:
109
109
  head_look.influence = clamp(1.0 - (dist - 6.0) / 2.0, 0.0, 1.0) # fade out 6→8m
110
110
  ```
111
111
 
112
- `use_angle_limitation` is the production trick, and it defaults to **false** — a stock `LookAtModifier3D` does not clamp at all, so the head can rotate 180° and the model looks possessed. Turn it on and set `primary_limit_angle` to ~80° (1.4 rad), which matches a human's neck-only range; for a "whole-body turn" use it with the spine chain (next recipe). `primary_limit_angle` defaults to 2π, i.e. unlimited.
112
+ `use_angle_limitation` is the key setting, and it defaults to **false** — a stock `LookAtModifier3D` does not clamp at all, so the head can rotate 180° and the model looks possessed. Turn it on and set `primary_limit_angle` to ~80° (1.4 rad), which matches a human's neck-only range; for a "whole-body turn" use it with the spine chain (next recipe). `primary_limit_angle` defaults to 2π, i.e. unlimited.
113
113
 
114
114
  ### A2 — Spine + head chain (look-at with body turn)
115
115
 
@@ -118,8 +118,7 @@ Multiple `LookAtModifier3D` nodes on the same chain — one for `Spine1` (`prima
118
118
  ### A3 — Foot IK (slopes & uneven terrain)
119
119
 
120
120
  The clip has the foot at Y=0; on a slope the ground is at Y=0.15. Without IK,
121
- the foot floats. `SkeletonIK3D` remains available for two-bone chains in the
122
- current Summer technical base; prefer the newer chain modifier for production:
121
+ the foot floats. Use `SkeletonIK3D` on each two-bone leg chain:
123
122
 
124
123
  ```gdscript
125
124
  @onready var skel: Skeleton3D = $Skeleton3D
@@ -149,7 +148,7 @@ func _solve_foot(ik: SkeletonIK3D, bone_name: String) -> void:
149
148
  ik.stop()
150
149
  ```
151
150
 
152
- The 0.5m up-offset on the ray prevents self-occlusion. The "only lift, never drop" rule is the production fix — letting IK push feet into the ground breaks knee bends.
151
+ The 0.5m up-offset on the ray prevents self-occlusion. The "only lift, never drop" rule matters: letting IK push feet into the ground breaks knee bends.
153
152
 
154
153
  Limits: this works for stairs and gentle slopes. On 45°+ slopes, use a pelvis lowering pass first (drop the root by `min(left_offset, right_offset)`) so the body squats and the legs don't over-extend.
155
154
 
@@ -168,7 +167,7 @@ In the AnimationTree, wrap Locomotion in an `AnimationNodeAdd2`:
168
167
  add: AnimationNodeAnimation # an additive clip — must be authored as delta
169
168
  ```
170
169
 
171
- Drive `parameters/Locomotion/Add/blend_amount` (0..1) from script. Use cases: turn-lean (lean amount = clamp(turn_rate, -1, 1)), aim offset (lean while aiming up/down), breathing-while-idle. The "lean" clip must be exported with `track_type = additive` from Blender, or you'll see a 2x-pose stacked on the base.
170
+ Drive `parameters/Locomotion/Add/blend_amount` (0..1) from script. Use cases: turn-lean (lean amount = clamp(turn_rate, -1, 1)), aim offset (lean while aiming up/down), breathing-while-idle. The lean clip must be authored as a delta from the base pose, or the pose is applied twice.
172
171
 
173
172
  ## Pattern C — Ragdoll on death
174
173
 
@@ -220,7 +219,7 @@ You need PhysicalBone3D children matching every major bone (set up once via the
220
219
  - **LookAt rotates wildly / no clamp at all.** `use_angle_limitation` is false by default and `primary_limit_angle` defaults to 2π. Set both. ~80° (1.4 rad) for a head-only modifier; ~25° (0.4 rad) for a single spine bone.
221
220
  - **IK pops on the first frame.** Solver hasn't been initialized. Call `ik.start()` after the AnimationTree's first tick, not in `_ready()` — the bone pose is identity until the tree runs.
222
221
  - **Foot IK pushes the body up on stairs but the camera doesn't follow.** Camera is parented to the root, not the head. Either parent the camera to a chest bone via `BoneAttachment3D`, or accept that the camera doesn't bob with foot IK.
223
- - **Additive layer doubles the clip.** The "additive" clip wasn't authored as a delta. Re-export from Blender with `Pose Mode → bake additive`.
222
+ - **Additive layer doubles the clip.** The "additive" clip wasn't authored as a delta from the base pose. Re-author it as a delta.
224
223
  - **Ragdoll just collapses, no spread.** Missing per-bone impulse + missing collision shapes on hands/feet PhysicalBone3D children. Auto-generate via Skeleton3D inspector → "Create Physical Skeleton" with the "Add collisions" option.
225
224
  - **Modifiers run before the AnimationTree, not after.** Modifier order is set by tree-position in the scene. SkeletonModifier3D nodes must be CHILDREN of Skeleton3D and appear AFTER any nodes that drive the pose. AnimationTree itself doesn't sit under Skeleton3D — it sits at the character root and writes into Skeleton3D's pose every frame.
226
225
  - **Look-at influence flickers at fade boundary.** Use `lerp(current_influence, target, 5 * delta)` instead of an instant assignment. Avoids the sub-pixel oscillation when the player walks the threshold.
@@ -233,7 +232,7 @@ You need PhysicalBone3D children matching every major bone (set up once via the
233
232
 
234
233
  ## Anti-patterns
235
234
 
236
- - Writing `skel.set_bone_pose_position(...)` in `_process`. Bypasses the AnimationTree, fights it next frame, results in jitter. Use modifiers instead — they integrate with the pipeline. (Edit-time STILL poses — a corpse, a statue — are the exception: no tree is running, so `ctx.bone_pose(skel, bone, {position/rotation/scale})` on animation-tier engines, or `set_bone_pose_*` in a one-off `summer_run_script`, is exactly right. See `character-animation-wiring`.)
235
+ - Writing `skel.set_bone_pose_position(...)` in `_process`. Bypasses the AnimationTree, fights it next frame, results in jitter. Use modifiers instead; they run after the tree. (Edit-time STILL poses — a corpse, a statue — are the exception: no tree is running, so `ctx.bone_pose(skel, bone, {position/rotation/scale})` on animation-tier engines, or `set_bone_pose_*` in a one-off `summer_run_script`, is exactly right. See `character-animation-wiring`.)
237
236
  - Putting IK targets in worldspace and forgetting they don't follow the character. Parent IK targets under the character root or bone — IK target is in the modifier's local space.
238
237
  - Procedural look-at without a fade-out at distance. Distant NPCs all snap to player every frame, looks like a hivemind.
239
238
  - Foot IK on flying / floating characters. Disable when `is_on_floor() == false`.