@funpixel/tools 0.1.0 → 0.1.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 (784) hide show
  1. package/bench/handlers/bake_emissive.py +2 -2
  2. package/bench/handlers/decimate.py +2 -2
  3. package/bench/handlers/fracture.py +1 -1
  4. package/bench/handlers/normalize_transform.py +3 -3
  5. package/bench/handlers/render_views.py +2 -2
  6. package/bench/handlers/views.py +6 -6
  7. package/dist/cli.js +8 -9
  8. package/dist/commands/feedback.js +5 -5
  9. package/dist/commands/init.js +1 -1
  10. package/dist/direct/read.js +1 -1
  11. package/dist/doctor/unity-checks.js +5 -5
  12. package/dist/doctor/unity-history.js +17 -33
  13. package/dist/feedback/ab.js +0 -40
  14. package/dist/gen/unity.js +3 -3
  15. package/dist/mcp/server.js +2 -1
  16. package/dist/pipeline/pipeline.js +6 -6
  17. package/dist/playtest/moments.js +1 -1
  18. package/dist/playtest/report.js +1 -1
  19. package/dist/production/mirror.js +2 -2
  20. package/dist/sim/curve.js +3 -3
  21. package/dist/spec/scaffold.js +1 -1
  22. package/dist/studio/pitch.js +1 -1
  23. package/dist/unity/probe/install.js +1 -1
  24. package/dist/vendor/verify/src/page/actors.js +2 -2
  25. package/dist/vendor/verify/src/page/capture_view.js +2 -2
  26. package/dist/vendor/verify/src/page/dressing.js +1 -1
  27. package/dist/vendor/verify/src/page/frame_honesty.js +1 -1
  28. package/dist/vendor/verify/src/page/front_door.js +2 -2
  29. package/dist/vendor/verify/src/page/grounding.js +3 -3
  30. package/dist/vendor/verify/src/page/hud.js +3 -3
  31. package/dist/vendor/verify/src/page/layout.js +5 -5
  32. package/dist/vendor/verify/src/page/life_anim.js +6 -6
  33. package/dist/vendor/verify/src/page/mechanic_check.js +1 -1
  34. package/dist/vendor/verify/src/page/phone_check.js +2 -2
  35. package/dist/vendor/verify/src/page/recorder.js +2 -2
  36. package/dist/vendor/verify/src/page/surfaces.js +2 -2
  37. package/dist/vendor/verify/src/page/world_actors.js +3 -3
  38. package/package.json +2 -2
  39. package/plugins/README.md +16 -0
  40. package/plugins/claude/README.md +2 -3
  41. package/plugins/claude/agents/art-director.md +2 -2
  42. package/plugins/claude/commands/playtest.md +2 -2
  43. package/plugins/claude/hooks/brief.md +1 -1
  44. package/plugins/claude/hooks/guidance.json +1 -1
  45. package/plugins/claude/hooks/vendor/pipeline/pipeline.mjs +6 -6
  46. package/plugins/claude/hooks/vendor/studio/pitch.mjs +1 -1
  47. package/plugins/claude/skills/3d/references/bake-off.md +3 -3
  48. package/plugins/claude/skills/3d/references/characters.md +1 -1
  49. package/plugins/claude/skills/3d/references/hero-route.md +5 -5
  50. package/plugins/claude/skills/3d/references/level-spec.md +1 -1
  51. package/plugins/claude/skills/3d/references/levels.md +3 -3
  52. package/plugins/claude/skills/3d/references/light-and-places.md +3 -3
  53. package/plugins/claude/skills/3d/references/painted-target.md +7 -7
  54. package/plugins/claude/skills/3d/references/three-loading.md +4 -4
  55. package/plugins/claude/skills/3d/references/unity.md +13 -13
  56. package/plugins/claude/skills/art/references/animation.md +1 -1
  57. package/plugins/claude/skills/art/references/cast.md +3 -3
  58. package/plugins/claude/skills/art/references/effects.md +2 -2
  59. package/plugins/claude/skills/art/references/frames.md +6 -6
  60. package/plugins/claude/skills/art/references/judging-frames.md +8 -8
  61. package/plugins/claude/skills/art/references/look.md +4 -4
  62. package/plugins/claude/skills/art/references/pipeline.md +2 -2
  63. package/plugins/claude/skills/art/references/prompts.md +4 -4
  64. package/plugins/claude/skills/art/references/ui.md +15 -15
  65. package/plugins/claude/skills/art/references/unity.md +14 -14
  66. package/plugins/claude/skills/audio/references/adaptive-music.md +4 -4
  67. package/plugins/claude/skills/audio/references/engine.md +2 -2
  68. package/plugins/claude/skills/audio/references/measure.md +1 -1
  69. package/plugins/claude/skills/audio/references/unity.md +20 -19
  70. package/plugins/claude/skills/game-feel/SKILL.md +4 -4
  71. package/plugins/claude/skills/game-feel/references/contact.md +6 -6
  72. package/plugins/claude/skills/game-feel/references/unity.md +18 -23
  73. package/plugins/claude/skills/game-logic/SKILL.md +3 -3
  74. package/plugins/claude/skills/game-logic/references/balance.md +2 -2
  75. package/plugins/claude/skills/game-logic/references/depth.md +2 -2
  76. package/plugins/claude/skills/game-logic/references/escalation.md +5 -5
  77. package/plugins/claude/skills/game-logic/references/probes.md +10 -10
  78. package/plugins/claude/skills/game-logic/references/unity.md +28 -28
  79. package/plugins/claude/skills/game-spine/SKILL.md +1 -1
  80. package/plugins/claude/skills/game-spine/references/performance.md +2 -2
  81. package/plugins/claude/skills/game-spine/references/replay.md +11 -11
  82. package/plugins/claude/skills/game-spine/references/room-api.md +1 -1
  83. package/plugins/claude/skills/game-spine/references/sdk.md +1 -1
  84. package/plugins/claude/skills/gdd/SKILL.md +2 -2
  85. package/plugins/claude/skills/gdd/references/as-built.md +2 -2
  86. package/plugins/claude/skills/gdd/references/design-measures.md +2 -2
  87. package/plugins/claude/skills/gdd/references/design-note.md +1 -1
  88. package/plugins/claude/skills/gdd/references/first-look.md +1 -1
  89. package/plugins/claude/skills/gdd/references/floors.md +2 -2
  90. package/plugins/claude/skills/gdd/references/gameplay-contract.md +1 -1
  91. package/plugins/claude/skills/gdd/references/genre-puzzle.md +4 -4
  92. package/plugins/claude/skills/gdd/references/genre-racing.md +2 -2
  93. package/plugins/claude/skills/gdd/references/genre-rpg.md +2 -2
  94. package/plugins/claude/skills/gdd/references/genre-shooter.md +2 -2
  95. package/plugins/claude/skills/gdd/references/genre-survival.md +2 -2
  96. package/plugins/claude/skills/gdd/references/invent-first.md +3 -3
  97. package/plugins/claude/skills/gdd/references/level-and-fun.md +11 -11
  98. package/plugins/claude/skills/gdd/references/pages.md +2 -5
  99. package/plugins/claude/skills/gdd/references/plan-at-size.md +5 -5
  100. package/plugins/claude/skills/gdd/references/production-tiers.md +11 -11
  101. package/plugins/claude/skills/gdd/references/sections.md +7 -7
  102. package/plugins/claude/skills/gdd/references/spec-folder.md +3 -3
  103. package/plugins/claude/skills/gdd/references/the-path.md +3 -4
  104. package/plugins/claude/skills/gdd/references/world-and-identity.md +4 -4
  105. package/plugins/claude/skills/gdd/references/worth.md +4 -4
  106. package/plugins/claude/skills/mobile-ui/SKILL.md +3 -3
  107. package/plugins/claude/skills/mobile-ui/references/hud-and-title.md +3 -3
  108. package/plugins/claude/skills/mobile-ui/references/phone-check.md +1 -1
  109. package/plugins/claude/skills/mobile-ui/references/recipes.md +1 -1
  110. package/plugins/claude/skills/mobile-ui/references/restyle-ui.md +11 -11
  111. package/plugins/claude/skills/mobile-ui/references/unity.md +23 -23
  112. package/plugins/claude/skills/publishing/references/compose.md +1 -1
  113. package/plugins/claude/skills/publishing/references/server-build.md +1 -1
  114. package/plugins/claude/skills/store/SKILL.md +3 -3
  115. package/plugins/claude/skills/store/references/app-store.md +1 -1
  116. package/plugins/claude/skills/store/references/google-play.md +2 -2
  117. package/plugins/claude/skills/store/references/ios-release.md +19 -20
  118. package/plugins/claude/skills/store/references/money.md +2 -2
  119. package/plugins/claude/skills/store/references/purchases-and-review.md +18 -18
  120. package/plugins/claude/skills/store/references/readiness-page.md +1 -1
  121. package/plugins/claude/skills/store/references/readiness.md +3 -3
  122. package/plugins/claude/skills/store/references/unity-store.md +9 -12
  123. package/plugins/claude/skills/unity-game/SKILL.md +28 -35
  124. package/plugins/claude/skills/unity-game/references/agent-ops.md +9 -9
  125. package/plugins/claude/skills/unity-game/references/fixes.md +21 -21
  126. package/plugins/claude/skills/unity-game/references/from-a-web-game.md +17 -17
  127. package/plugins/claude/skills/unity-game/references/handing-off.md +4 -4
  128. package/plugins/claude/skills/unity-game/references/performance.md +10 -14
  129. package/plugins/claude/skills/unity-game/references/probe.md +4 -4
  130. package/plugins/claude/skills/unity-game/references/shared-mac.md +1 -1
  131. package/plugins/claude/skills/unity-game/references/traps.md +13 -14
  132. package/plugins/claude/skills/verifying/references/bar.md +1 -1
  133. package/plugins/claude/skills/verifying/references/fidelity.md +11 -11
  134. package/plugins/claude/skills/verifying/references/mobile-qa.md +10 -10
  135. package/plugins/claude/skills/verifying/references/playtest.md +14 -14
  136. package/plugins/claude/skills/verifying/references/unity.md +11 -11
  137. package/plugins/claude/skills/world-and-story/SKILL.md +1 -1
  138. package/plugins/claude/skills/world-and-story/references/atmosphere.md +4 -4
  139. package/plugins/claude/skills/world-and-story/references/living-world.md +2 -2
  140. package/plugins/claude/skills/world-and-story/references/opening-and-chapters.md +1 -1
  141. package/plugins/claude/skills/world-and-story/references/story-at-size.md +2 -2
  142. package/plugins/claude/skills/world-and-story/references/voice.md +1 -1
  143. package/plugins/codex/AGENTS.md +1 -1
  144. package/plugins/codex/README.md +1 -1
  145. package/plugins/codex/hooks/brief.md +1 -1
  146. package/plugins/codex/hooks/guidance.json +1 -1
  147. package/plugins/codex/hooks/host.md +1 -1
  148. package/plugins/codex/hooks/vendor/pipeline/pipeline.mjs +6 -6
  149. package/plugins/codex/hooks/vendor/studio/pitch.mjs +1 -1
  150. package/plugins/codex/skills/fp-art-director/SKILL.md +2 -2
  151. package/plugins/codex/skills/fp-art-director/references/codex.md +1 -1
  152. package/plugins/codex/skills/fp-audio-director/references/codex.md +1 -1
  153. package/plugins/codex/skills/fp-critic/references/codex.md +1 -1
  154. package/plugins/codex/skills/fp-lane/references/codex.md +1 -1
  155. package/plugins/codex/skills/fp-level-designer/references/codex.md +1 -1
  156. package/plugins/codex/skills/fp-mobile-qa-seat/references/codex.md +1 -1
  157. package/plugins/codex/skills/fp-player/references/codex.md +1 -1
  158. package/plugins/codex/skills/fp-playtest/SKILL.md +2 -2
  159. package/plugins/codex/skills/fp-qa-lead/references/codex.md +1 -1
  160. package/plugins/codex/skills/fp-studio/SKILL.md +1 -1
  161. package/plugins/codex/skills/funpixel-3d/references/bake-off.md +3 -3
  162. package/plugins/codex/skills/funpixel-3d/references/characters.md +1 -1
  163. package/plugins/codex/skills/funpixel-3d/references/hero-route.md +5 -5
  164. package/plugins/codex/skills/funpixel-3d/references/level-spec.md +1 -1
  165. package/plugins/codex/skills/funpixel-3d/references/levels.md +3 -3
  166. package/plugins/codex/skills/funpixel-3d/references/light-and-places.md +3 -3
  167. package/plugins/codex/skills/funpixel-3d/references/painted-target.md +7 -7
  168. package/plugins/codex/skills/funpixel-3d/references/three-loading.md +4 -4
  169. package/plugins/codex/skills/funpixel-3d/references/unity.md +13 -13
  170. package/plugins/codex/skills/funpixel-art/references/animation.md +1 -1
  171. package/plugins/codex/skills/funpixel-art/references/cast.md +3 -3
  172. package/plugins/codex/skills/funpixel-art/references/effects.md +2 -2
  173. package/plugins/codex/skills/funpixel-art/references/frames.md +6 -6
  174. package/plugins/codex/skills/funpixel-art/references/judging-frames.md +8 -8
  175. package/plugins/codex/skills/funpixel-art/references/look.md +4 -4
  176. package/plugins/codex/skills/funpixel-art/references/pipeline.md +2 -2
  177. package/plugins/codex/skills/funpixel-art/references/prompts.md +4 -4
  178. package/plugins/codex/skills/funpixel-art/references/ui.md +15 -15
  179. package/plugins/codex/skills/funpixel-art/references/unity.md +14 -14
  180. package/plugins/codex/skills/funpixel-audio/references/adaptive-music.md +4 -4
  181. package/plugins/codex/skills/funpixel-audio/references/engine.md +2 -2
  182. package/plugins/codex/skills/funpixel-audio/references/measure.md +1 -1
  183. package/plugins/codex/skills/funpixel-audio/references/unity.md +20 -19
  184. package/plugins/codex/skills/funpixel-game-feel/SKILL.md +4 -4
  185. package/plugins/codex/skills/funpixel-game-feel/references/contact.md +6 -6
  186. package/plugins/codex/skills/funpixel-game-feel/references/unity.md +18 -23
  187. package/plugins/codex/skills/funpixel-game-logic/SKILL.md +3 -3
  188. package/plugins/codex/skills/funpixel-game-logic/references/balance.md +2 -2
  189. package/plugins/codex/skills/funpixel-game-logic/references/depth.md +2 -2
  190. package/plugins/codex/skills/funpixel-game-logic/references/escalation.md +5 -5
  191. package/plugins/codex/skills/funpixel-game-logic/references/probes.md +10 -10
  192. package/plugins/codex/skills/funpixel-game-logic/references/unity.md +28 -28
  193. package/plugins/codex/skills/funpixel-game-spine/SKILL.md +1 -1
  194. package/plugins/codex/skills/funpixel-game-spine/references/performance.md +2 -2
  195. package/plugins/codex/skills/funpixel-game-spine/references/replay.md +11 -11
  196. package/plugins/codex/skills/funpixel-game-spine/references/room-api.md +1 -1
  197. package/plugins/codex/skills/funpixel-game-spine/references/sdk.md +1 -1
  198. package/plugins/codex/skills/funpixel-gdd/SKILL.md +2 -2
  199. package/plugins/codex/skills/funpixel-gdd/references/as-built.md +2 -2
  200. package/plugins/codex/skills/funpixel-gdd/references/design-measures.md +2 -2
  201. package/plugins/codex/skills/funpixel-gdd/references/design-note.md +1 -1
  202. package/plugins/codex/skills/funpixel-gdd/references/first-look.md +1 -1
  203. package/plugins/codex/skills/funpixel-gdd/references/floors.md +2 -2
  204. package/plugins/codex/skills/funpixel-gdd/references/gameplay-contract.md +1 -1
  205. package/plugins/codex/skills/funpixel-gdd/references/genre-puzzle.md +4 -4
  206. package/plugins/codex/skills/funpixel-gdd/references/genre-racing.md +2 -2
  207. package/plugins/codex/skills/funpixel-gdd/references/genre-rpg.md +2 -2
  208. package/plugins/codex/skills/funpixel-gdd/references/genre-shooter.md +2 -2
  209. package/plugins/codex/skills/funpixel-gdd/references/genre-survival.md +2 -2
  210. package/plugins/codex/skills/funpixel-gdd/references/invent-first.md +3 -3
  211. package/plugins/codex/skills/funpixel-gdd/references/level-and-fun.md +11 -11
  212. package/plugins/codex/skills/funpixel-gdd/references/pages.md +2 -5
  213. package/plugins/codex/skills/funpixel-gdd/references/plan-at-size.md +5 -5
  214. package/plugins/codex/skills/funpixel-gdd/references/production-tiers.md +11 -11
  215. package/plugins/codex/skills/funpixel-gdd/references/sections.md +7 -7
  216. package/plugins/codex/skills/funpixel-gdd/references/spec-folder.md +3 -3
  217. package/plugins/codex/skills/funpixel-gdd/references/the-path.md +3 -4
  218. package/plugins/codex/skills/funpixel-gdd/references/world-and-identity.md +4 -4
  219. package/plugins/codex/skills/funpixel-gdd/references/worth.md +4 -4
  220. package/plugins/codex/skills/funpixel-mobile-ui/SKILL.md +3 -3
  221. package/plugins/codex/skills/funpixel-mobile-ui/references/hud-and-title.md +3 -3
  222. package/plugins/codex/skills/funpixel-mobile-ui/references/phone-check.md +1 -1
  223. package/plugins/codex/skills/funpixel-mobile-ui/references/recipes.md +1 -1
  224. package/plugins/codex/skills/funpixel-mobile-ui/references/restyle-ui.md +11 -11
  225. package/plugins/codex/skills/funpixel-mobile-ui/references/unity.md +23 -23
  226. package/plugins/codex/skills/funpixel-publish/references/compose.md +1 -1
  227. package/plugins/codex/skills/funpixel-publish/references/server-build.md +1 -1
  228. package/plugins/codex/skills/funpixel-store/SKILL.md +3 -3
  229. package/plugins/codex/skills/funpixel-store/references/app-store.md +1 -1
  230. package/plugins/codex/skills/funpixel-store/references/google-play.md +2 -2
  231. package/plugins/codex/skills/funpixel-store/references/ios-release.md +19 -20
  232. package/plugins/codex/skills/funpixel-store/references/money.md +2 -2
  233. package/plugins/codex/skills/funpixel-store/references/purchases-and-review.md +18 -18
  234. package/plugins/codex/skills/funpixel-store/references/readiness-page.md +1 -1
  235. package/plugins/codex/skills/funpixel-store/references/readiness.md +3 -3
  236. package/plugins/codex/skills/funpixel-store/references/unity-store.md +9 -12
  237. package/plugins/codex/skills/funpixel-unity-game/SKILL.md +28 -35
  238. package/plugins/codex/skills/funpixel-unity-game/references/agent-ops.md +9 -9
  239. package/plugins/codex/skills/funpixel-unity-game/references/fixes.md +21 -21
  240. package/plugins/codex/skills/funpixel-unity-game/references/from-a-web-game.md +17 -17
  241. package/plugins/codex/skills/funpixel-unity-game/references/handing-off.md +4 -4
  242. package/plugins/codex/skills/funpixel-unity-game/references/performance.md +10 -14
  243. package/plugins/codex/skills/funpixel-unity-game/references/probe.md +4 -4
  244. package/plugins/codex/skills/funpixel-unity-game/references/shared-mac.md +1 -1
  245. package/plugins/codex/skills/funpixel-unity-game/references/traps.md +13 -14
  246. package/plugins/codex/skills/funpixel-verify/references/bar.md +1 -1
  247. package/plugins/codex/skills/funpixel-verify/references/fidelity.md +11 -11
  248. package/plugins/codex/skills/funpixel-verify/references/mobile-qa.md +10 -10
  249. package/plugins/codex/skills/funpixel-verify/references/playtest.md +14 -14
  250. package/plugins/codex/skills/funpixel-verify/references/unity.md +11 -11
  251. package/plugins/codex/skills/funpixel-world-and-story/SKILL.md +1 -1
  252. package/plugins/codex/skills/funpixel-world-and-story/references/atmosphere.md +4 -4
  253. package/plugins/codex/skills/funpixel-world-and-story/references/living-world.md +2 -2
  254. package/plugins/codex/skills/funpixel-world-and-story/references/opening-and-chapters.md +1 -1
  255. package/plugins/codex/skills/funpixel-world-and-story/references/story-at-size.md +2 -2
  256. package/plugins/codex/skills/funpixel-world-and-story/references/voice.md +1 -1
  257. package/plugins/cursor/README.md +1 -1
  258. package/plugins/cursor/agents/art-director.md +2 -2
  259. package/plugins/cursor/commands/playtest.md +2 -2
  260. package/plugins/cursor/hooks/brief.md +1 -1
  261. package/plugins/cursor/hooks/guidance.json +1 -1
  262. package/plugins/cursor/hooks/vendor/pipeline/pipeline.mjs +6 -6
  263. package/plugins/cursor/hooks/vendor/studio/pitch.mjs +1 -1
  264. package/plugins/cursor/rules/funpixel-brief.mdc +1 -1
  265. package/plugins/cursor/skills/funpixel-3d/references/bake-off.md +3 -3
  266. package/plugins/cursor/skills/funpixel-3d/references/characters.md +1 -1
  267. package/plugins/cursor/skills/funpixel-3d/references/hero-route.md +5 -5
  268. package/plugins/cursor/skills/funpixel-3d/references/level-spec.md +1 -1
  269. package/plugins/cursor/skills/funpixel-3d/references/levels.md +3 -3
  270. package/plugins/cursor/skills/funpixel-3d/references/light-and-places.md +3 -3
  271. package/plugins/cursor/skills/funpixel-3d/references/painted-target.md +7 -7
  272. package/plugins/cursor/skills/funpixel-3d/references/three-loading.md +4 -4
  273. package/plugins/cursor/skills/funpixel-3d/references/unity.md +13 -13
  274. package/plugins/cursor/skills/funpixel-art/references/animation.md +1 -1
  275. package/plugins/cursor/skills/funpixel-art/references/cast.md +3 -3
  276. package/plugins/cursor/skills/funpixel-art/references/effects.md +2 -2
  277. package/plugins/cursor/skills/funpixel-art/references/frames.md +6 -6
  278. package/plugins/cursor/skills/funpixel-art/references/judging-frames.md +8 -8
  279. package/plugins/cursor/skills/funpixel-art/references/look.md +4 -4
  280. package/plugins/cursor/skills/funpixel-art/references/pipeline.md +2 -2
  281. package/plugins/cursor/skills/funpixel-art/references/prompts.md +4 -4
  282. package/plugins/cursor/skills/funpixel-art/references/ui.md +15 -15
  283. package/plugins/cursor/skills/funpixel-art/references/unity.md +14 -14
  284. package/plugins/cursor/skills/funpixel-audio/references/adaptive-music.md +4 -4
  285. package/plugins/cursor/skills/funpixel-audio/references/engine.md +2 -2
  286. package/plugins/cursor/skills/funpixel-audio/references/measure.md +1 -1
  287. package/plugins/cursor/skills/funpixel-audio/references/unity.md +20 -19
  288. package/plugins/cursor/skills/funpixel-game-feel/SKILL.md +4 -4
  289. package/plugins/cursor/skills/funpixel-game-feel/references/contact.md +6 -6
  290. package/plugins/cursor/skills/funpixel-game-feel/references/unity.md +18 -23
  291. package/plugins/cursor/skills/funpixel-game-logic/SKILL.md +3 -3
  292. package/plugins/cursor/skills/funpixel-game-logic/references/balance.md +2 -2
  293. package/plugins/cursor/skills/funpixel-game-logic/references/depth.md +2 -2
  294. package/plugins/cursor/skills/funpixel-game-logic/references/escalation.md +5 -5
  295. package/plugins/cursor/skills/funpixel-game-logic/references/probes.md +10 -10
  296. package/plugins/cursor/skills/funpixel-game-logic/references/unity.md +28 -28
  297. package/plugins/cursor/skills/funpixel-game-spine/SKILL.md +1 -1
  298. package/plugins/cursor/skills/funpixel-game-spine/references/performance.md +2 -2
  299. package/plugins/cursor/skills/funpixel-game-spine/references/replay.md +11 -11
  300. package/plugins/cursor/skills/funpixel-game-spine/references/room-api.md +1 -1
  301. package/plugins/cursor/skills/funpixel-game-spine/references/sdk.md +1 -1
  302. package/plugins/cursor/skills/funpixel-gdd/SKILL.md +2 -2
  303. package/plugins/cursor/skills/funpixel-gdd/references/as-built.md +2 -2
  304. package/plugins/cursor/skills/funpixel-gdd/references/design-measures.md +2 -2
  305. package/plugins/cursor/skills/funpixel-gdd/references/design-note.md +1 -1
  306. package/plugins/cursor/skills/funpixel-gdd/references/first-look.md +1 -1
  307. package/plugins/cursor/skills/funpixel-gdd/references/floors.md +2 -2
  308. package/plugins/cursor/skills/funpixel-gdd/references/gameplay-contract.md +1 -1
  309. package/plugins/cursor/skills/funpixel-gdd/references/genre-puzzle.md +4 -4
  310. package/plugins/cursor/skills/funpixel-gdd/references/genre-racing.md +2 -2
  311. package/plugins/cursor/skills/funpixel-gdd/references/genre-rpg.md +2 -2
  312. package/plugins/cursor/skills/funpixel-gdd/references/genre-shooter.md +2 -2
  313. package/plugins/cursor/skills/funpixel-gdd/references/genre-survival.md +2 -2
  314. package/plugins/cursor/skills/funpixel-gdd/references/invent-first.md +3 -3
  315. package/plugins/cursor/skills/funpixel-gdd/references/level-and-fun.md +11 -11
  316. package/plugins/cursor/skills/funpixel-gdd/references/pages.md +2 -5
  317. package/plugins/cursor/skills/funpixel-gdd/references/plan-at-size.md +5 -5
  318. package/plugins/cursor/skills/funpixel-gdd/references/production-tiers.md +11 -11
  319. package/plugins/cursor/skills/funpixel-gdd/references/sections.md +7 -7
  320. package/plugins/cursor/skills/funpixel-gdd/references/spec-folder.md +3 -3
  321. package/plugins/cursor/skills/funpixel-gdd/references/the-path.md +3 -4
  322. package/plugins/cursor/skills/funpixel-gdd/references/world-and-identity.md +4 -4
  323. package/plugins/cursor/skills/funpixel-gdd/references/worth.md +4 -4
  324. package/plugins/cursor/skills/funpixel-mobile-ui/SKILL.md +3 -3
  325. package/plugins/cursor/skills/funpixel-mobile-ui/references/hud-and-title.md +3 -3
  326. package/plugins/cursor/skills/funpixel-mobile-ui/references/phone-check.md +1 -1
  327. package/plugins/cursor/skills/funpixel-mobile-ui/references/recipes.md +1 -1
  328. package/plugins/cursor/skills/funpixel-mobile-ui/references/restyle-ui.md +11 -11
  329. package/plugins/cursor/skills/funpixel-mobile-ui/references/unity.md +23 -23
  330. package/plugins/cursor/skills/funpixel-publish/references/compose.md +1 -1
  331. package/plugins/cursor/skills/funpixel-publish/references/server-build.md +1 -1
  332. package/plugins/cursor/skills/funpixel-store/SKILL.md +3 -3
  333. package/plugins/cursor/skills/funpixel-store/references/app-store.md +1 -1
  334. package/plugins/cursor/skills/funpixel-store/references/google-play.md +2 -2
  335. package/plugins/cursor/skills/funpixel-store/references/ios-release.md +19 -20
  336. package/plugins/cursor/skills/funpixel-store/references/money.md +2 -2
  337. package/plugins/cursor/skills/funpixel-store/references/purchases-and-review.md +18 -18
  338. package/plugins/cursor/skills/funpixel-store/references/readiness-page.md +1 -1
  339. package/plugins/cursor/skills/funpixel-store/references/readiness.md +3 -3
  340. package/plugins/cursor/skills/funpixel-store/references/unity-store.md +9 -12
  341. package/plugins/cursor/skills/funpixel-unity-game/SKILL.md +28 -35
  342. package/plugins/cursor/skills/funpixel-unity-game/references/agent-ops.md +9 -9
  343. package/plugins/cursor/skills/funpixel-unity-game/references/fixes.md +21 -21
  344. package/plugins/cursor/skills/funpixel-unity-game/references/from-a-web-game.md +17 -17
  345. package/plugins/cursor/skills/funpixel-unity-game/references/handing-off.md +4 -4
  346. package/plugins/cursor/skills/funpixel-unity-game/references/performance.md +10 -14
  347. package/plugins/cursor/skills/funpixel-unity-game/references/probe.md +4 -4
  348. package/plugins/cursor/skills/funpixel-unity-game/references/shared-mac.md +1 -1
  349. package/plugins/cursor/skills/funpixel-unity-game/references/traps.md +13 -14
  350. package/plugins/cursor/skills/funpixel-verify/references/bar.md +1 -1
  351. package/plugins/cursor/skills/funpixel-verify/references/fidelity.md +11 -11
  352. package/plugins/cursor/skills/funpixel-verify/references/mobile-qa.md +10 -10
  353. package/plugins/cursor/skills/funpixel-verify/references/playtest.md +14 -14
  354. package/plugins/cursor/skills/funpixel-verify/references/unity.md +11 -11
  355. package/plugins/cursor/skills/funpixel-world-and-story/SKILL.md +1 -1
  356. package/plugins/cursor/skills/funpixel-world-and-story/references/atmosphere.md +4 -4
  357. package/plugins/cursor/skills/funpixel-world-and-story/references/living-world.md +2 -2
  358. package/plugins/cursor/skills/funpixel-world-and-story/references/opening-and-chapters.md +1 -1
  359. package/plugins/cursor/skills/funpixel-world-and-story/references/story-at-size.md +2 -2
  360. package/plugins/cursor/skills/funpixel-world-and-story/references/voice.md +1 -1
  361. package/plugins/kiro/AGENTS.md +1 -1
  362. package/plugins/kiro/README.md +1 -1
  363. package/plugins/kiro/hooks/brief.md +1 -1
  364. package/plugins/kiro/hooks/guidance.json +1 -1
  365. package/plugins/kiro/hooks/vendor/pipeline/pipeline.mjs +6 -6
  366. package/plugins/kiro/hooks/vendor/studio/pitch.mjs +1 -1
  367. package/plugins/kiro/skills/fp-art-director/SKILL.md +2 -2
  368. package/plugins/kiro/skills/fp-playtest/SKILL.md +2 -2
  369. package/plugins/kiro/skills/funpixel-3d/references/bake-off.md +3 -3
  370. package/plugins/kiro/skills/funpixel-3d/references/characters.md +1 -1
  371. package/plugins/kiro/skills/funpixel-3d/references/hero-route.md +5 -5
  372. package/plugins/kiro/skills/funpixel-3d/references/level-spec.md +1 -1
  373. package/plugins/kiro/skills/funpixel-3d/references/levels.md +3 -3
  374. package/plugins/kiro/skills/funpixel-3d/references/light-and-places.md +3 -3
  375. package/plugins/kiro/skills/funpixel-3d/references/painted-target.md +7 -7
  376. package/plugins/kiro/skills/funpixel-3d/references/three-loading.md +4 -4
  377. package/plugins/kiro/skills/funpixel-3d/references/unity.md +13 -13
  378. package/plugins/kiro/skills/funpixel-art/references/animation.md +1 -1
  379. package/plugins/kiro/skills/funpixel-art/references/cast.md +3 -3
  380. package/plugins/kiro/skills/funpixel-art/references/effects.md +2 -2
  381. package/plugins/kiro/skills/funpixel-art/references/frames.md +6 -6
  382. package/plugins/kiro/skills/funpixel-art/references/judging-frames.md +8 -8
  383. package/plugins/kiro/skills/funpixel-art/references/look.md +4 -4
  384. package/plugins/kiro/skills/funpixel-art/references/pipeline.md +2 -2
  385. package/plugins/kiro/skills/funpixel-art/references/prompts.md +4 -4
  386. package/plugins/kiro/skills/funpixel-art/references/ui.md +15 -15
  387. package/plugins/kiro/skills/funpixel-art/references/unity.md +14 -14
  388. package/plugins/kiro/skills/funpixel-audio/references/adaptive-music.md +4 -4
  389. package/plugins/kiro/skills/funpixel-audio/references/engine.md +2 -2
  390. package/plugins/kiro/skills/funpixel-audio/references/measure.md +1 -1
  391. package/plugins/kiro/skills/funpixel-audio/references/unity.md +20 -19
  392. package/plugins/kiro/skills/funpixel-game-feel/SKILL.md +4 -4
  393. package/plugins/kiro/skills/funpixel-game-feel/references/contact.md +6 -6
  394. package/plugins/kiro/skills/funpixel-game-feel/references/unity.md +18 -23
  395. package/plugins/kiro/skills/funpixel-game-logic/SKILL.md +3 -3
  396. package/plugins/kiro/skills/funpixel-game-logic/references/balance.md +2 -2
  397. package/plugins/kiro/skills/funpixel-game-logic/references/depth.md +2 -2
  398. package/plugins/kiro/skills/funpixel-game-logic/references/escalation.md +5 -5
  399. package/plugins/kiro/skills/funpixel-game-logic/references/probes.md +10 -10
  400. package/plugins/kiro/skills/funpixel-game-logic/references/unity.md +28 -28
  401. package/plugins/kiro/skills/funpixel-game-spine/SKILL.md +1 -1
  402. package/plugins/kiro/skills/funpixel-game-spine/references/performance.md +2 -2
  403. package/plugins/kiro/skills/funpixel-game-spine/references/replay.md +11 -11
  404. package/plugins/kiro/skills/funpixel-game-spine/references/room-api.md +1 -1
  405. package/plugins/kiro/skills/funpixel-game-spine/references/sdk.md +1 -1
  406. package/plugins/kiro/skills/funpixel-gdd/SKILL.md +2 -2
  407. package/plugins/kiro/skills/funpixel-gdd/references/as-built.md +2 -2
  408. package/plugins/kiro/skills/funpixel-gdd/references/design-measures.md +2 -2
  409. package/plugins/kiro/skills/funpixel-gdd/references/design-note.md +1 -1
  410. package/plugins/kiro/skills/funpixel-gdd/references/first-look.md +1 -1
  411. package/plugins/kiro/skills/funpixel-gdd/references/floors.md +2 -2
  412. package/plugins/kiro/skills/funpixel-gdd/references/gameplay-contract.md +1 -1
  413. package/plugins/kiro/skills/funpixel-gdd/references/genre-puzzle.md +4 -4
  414. package/plugins/kiro/skills/funpixel-gdd/references/genre-racing.md +2 -2
  415. package/plugins/kiro/skills/funpixel-gdd/references/genre-rpg.md +2 -2
  416. package/plugins/kiro/skills/funpixel-gdd/references/genre-shooter.md +2 -2
  417. package/plugins/kiro/skills/funpixel-gdd/references/genre-survival.md +2 -2
  418. package/plugins/kiro/skills/funpixel-gdd/references/invent-first.md +3 -3
  419. package/plugins/kiro/skills/funpixel-gdd/references/level-and-fun.md +11 -11
  420. package/plugins/kiro/skills/funpixel-gdd/references/pages.md +2 -5
  421. package/plugins/kiro/skills/funpixel-gdd/references/plan-at-size.md +5 -5
  422. package/plugins/kiro/skills/funpixel-gdd/references/production-tiers.md +11 -11
  423. package/plugins/kiro/skills/funpixel-gdd/references/sections.md +7 -7
  424. package/plugins/kiro/skills/funpixel-gdd/references/spec-folder.md +3 -3
  425. package/plugins/kiro/skills/funpixel-gdd/references/the-path.md +3 -4
  426. package/plugins/kiro/skills/funpixel-gdd/references/world-and-identity.md +4 -4
  427. package/plugins/kiro/skills/funpixel-gdd/references/worth.md +4 -4
  428. package/plugins/kiro/skills/funpixel-mobile-ui/SKILL.md +3 -3
  429. package/plugins/kiro/skills/funpixel-mobile-ui/references/hud-and-title.md +3 -3
  430. package/plugins/kiro/skills/funpixel-mobile-ui/references/phone-check.md +1 -1
  431. package/plugins/kiro/skills/funpixel-mobile-ui/references/recipes.md +1 -1
  432. package/plugins/kiro/skills/funpixel-mobile-ui/references/restyle-ui.md +11 -11
  433. package/plugins/kiro/skills/funpixel-mobile-ui/references/unity.md +23 -23
  434. package/plugins/kiro/skills/funpixel-publish/references/compose.md +1 -1
  435. package/plugins/kiro/skills/funpixel-publish/references/server-build.md +1 -1
  436. package/plugins/kiro/skills/funpixel-store/SKILL.md +3 -3
  437. package/plugins/kiro/skills/funpixel-store/references/app-store.md +1 -1
  438. package/plugins/kiro/skills/funpixel-store/references/google-play.md +2 -2
  439. package/plugins/kiro/skills/funpixel-store/references/ios-release.md +19 -20
  440. package/plugins/kiro/skills/funpixel-store/references/money.md +2 -2
  441. package/plugins/kiro/skills/funpixel-store/references/purchases-and-review.md +18 -18
  442. package/plugins/kiro/skills/funpixel-store/references/readiness-page.md +1 -1
  443. package/plugins/kiro/skills/funpixel-store/references/readiness.md +3 -3
  444. package/plugins/kiro/skills/funpixel-store/references/unity-store.md +9 -12
  445. package/plugins/kiro/skills/funpixel-unity-game/SKILL.md +28 -35
  446. package/plugins/kiro/skills/funpixel-unity-game/references/agent-ops.md +9 -9
  447. package/plugins/kiro/skills/funpixel-unity-game/references/fixes.md +21 -21
  448. package/plugins/kiro/skills/funpixel-unity-game/references/from-a-web-game.md +17 -17
  449. package/plugins/kiro/skills/funpixel-unity-game/references/handing-off.md +4 -4
  450. package/plugins/kiro/skills/funpixel-unity-game/references/performance.md +10 -14
  451. package/plugins/kiro/skills/funpixel-unity-game/references/probe.md +4 -4
  452. package/plugins/kiro/skills/funpixel-unity-game/references/shared-mac.md +1 -1
  453. package/plugins/kiro/skills/funpixel-unity-game/references/traps.md +13 -14
  454. package/plugins/kiro/skills/funpixel-verify/references/bar.md +1 -1
  455. package/plugins/kiro/skills/funpixel-verify/references/fidelity.md +11 -11
  456. package/plugins/kiro/skills/funpixel-verify/references/mobile-qa.md +10 -10
  457. package/plugins/kiro/skills/funpixel-verify/references/playtest.md +14 -14
  458. package/plugins/kiro/skills/funpixel-verify/references/unity.md +11 -11
  459. package/plugins/kiro/skills/funpixel-world-and-story/SKILL.md +1 -1
  460. package/plugins/kiro/skills/funpixel-world-and-story/references/atmosphere.md +4 -4
  461. package/plugins/kiro/skills/funpixel-world-and-story/references/living-world.md +2 -2
  462. package/plugins/kiro/skills/funpixel-world-and-story/references/opening-and-chapters.md +1 -1
  463. package/plugins/kiro/skills/funpixel-world-and-story/references/story-at-size.md +2 -2
  464. package/plugins/kiro/skills/funpixel-world-and-story/references/voice.md +1 -1
  465. package/plugins/robin/README.md +1 -1
  466. package/plugins/robin/claude/README.md +2 -3
  467. package/plugins/robin/claude/agents/art-director.md +2 -2
  468. package/plugins/robin/claude/commands/playtest.md +2 -2
  469. package/plugins/robin/claude/hooks/brief.md +1 -1
  470. package/plugins/robin/claude/hooks/guidance.json +1 -1
  471. package/plugins/robin/claude/hooks/vendor/pipeline/pipeline.mjs +6 -6
  472. package/plugins/robin/claude/hooks/vendor/studio/pitch.mjs +1 -1
  473. package/plugins/robin/claude/skills/3d/references/bake-off.md +3 -3
  474. package/plugins/robin/claude/skills/3d/references/characters.md +1 -1
  475. package/plugins/robin/claude/skills/3d/references/hero-route.md +5 -5
  476. package/plugins/robin/claude/skills/3d/references/level-spec.md +1 -1
  477. package/plugins/robin/claude/skills/3d/references/levels.md +3 -3
  478. package/plugins/robin/claude/skills/3d/references/light-and-places.md +3 -3
  479. package/plugins/robin/claude/skills/3d/references/painted-target.md +7 -7
  480. package/plugins/robin/claude/skills/3d/references/three-loading.md +4 -4
  481. package/plugins/robin/claude/skills/3d/references/unity.md +13 -13
  482. package/plugins/robin/claude/skills/art/references/animation.md +1 -1
  483. package/plugins/robin/claude/skills/art/references/cast.md +3 -3
  484. package/plugins/robin/claude/skills/art/references/effects.md +2 -2
  485. package/plugins/robin/claude/skills/art/references/frames.md +6 -6
  486. package/plugins/robin/claude/skills/art/references/judging-frames.md +8 -8
  487. package/plugins/robin/claude/skills/art/references/look.md +4 -4
  488. package/plugins/robin/claude/skills/art/references/pipeline.md +2 -2
  489. package/plugins/robin/claude/skills/art/references/prompts.md +4 -4
  490. package/plugins/robin/claude/skills/art/references/ui.md +15 -15
  491. package/plugins/robin/claude/skills/art/references/unity.md +14 -14
  492. package/plugins/robin/claude/skills/audio/references/adaptive-music.md +4 -4
  493. package/plugins/robin/claude/skills/audio/references/engine.md +2 -2
  494. package/plugins/robin/claude/skills/audio/references/measure.md +1 -1
  495. package/plugins/robin/claude/skills/audio/references/unity.md +20 -19
  496. package/plugins/robin/claude/skills/game-feel/SKILL.md +4 -4
  497. package/plugins/robin/claude/skills/game-feel/references/contact.md +6 -6
  498. package/plugins/robin/claude/skills/game-feel/references/unity.md +18 -23
  499. package/plugins/robin/claude/skills/game-logic/SKILL.md +3 -3
  500. package/plugins/robin/claude/skills/game-logic/references/balance.md +2 -2
  501. package/plugins/robin/claude/skills/game-logic/references/depth.md +2 -2
  502. package/plugins/robin/claude/skills/game-logic/references/escalation.md +5 -5
  503. package/plugins/robin/claude/skills/game-logic/references/probes.md +10 -10
  504. package/plugins/robin/claude/skills/game-logic/references/unity.md +28 -28
  505. package/plugins/robin/claude/skills/game-spine/SKILL.md +1 -1
  506. package/plugins/robin/claude/skills/game-spine/references/performance.md +2 -2
  507. package/plugins/robin/claude/skills/game-spine/references/replay.md +11 -11
  508. package/plugins/robin/claude/skills/game-spine/references/room-api.md +1 -1
  509. package/plugins/robin/claude/skills/game-spine/references/sdk.md +1 -1
  510. package/plugins/robin/claude/skills/gdd/SKILL.md +2 -2
  511. package/plugins/robin/claude/skills/gdd/references/as-built.md +2 -2
  512. package/plugins/robin/claude/skills/gdd/references/design-measures.md +2 -2
  513. package/plugins/robin/claude/skills/gdd/references/design-note.md +1 -1
  514. package/plugins/robin/claude/skills/gdd/references/first-look.md +1 -1
  515. package/plugins/robin/claude/skills/gdd/references/floors.md +2 -2
  516. package/plugins/robin/claude/skills/gdd/references/gameplay-contract.md +1 -1
  517. package/plugins/robin/claude/skills/gdd/references/genre-puzzle.md +4 -4
  518. package/plugins/robin/claude/skills/gdd/references/genre-racing.md +2 -2
  519. package/plugins/robin/claude/skills/gdd/references/genre-rpg.md +2 -2
  520. package/plugins/robin/claude/skills/gdd/references/genre-shooter.md +2 -2
  521. package/plugins/robin/claude/skills/gdd/references/genre-survival.md +2 -2
  522. package/plugins/robin/claude/skills/gdd/references/invent-first.md +3 -3
  523. package/plugins/robin/claude/skills/gdd/references/level-and-fun.md +11 -11
  524. package/plugins/robin/claude/skills/gdd/references/pages.md +2 -5
  525. package/plugins/robin/claude/skills/gdd/references/plan-at-size.md +5 -5
  526. package/plugins/robin/claude/skills/gdd/references/production-tiers.md +11 -11
  527. package/plugins/robin/claude/skills/gdd/references/sections.md +7 -7
  528. package/plugins/robin/claude/skills/gdd/references/spec-folder.md +3 -3
  529. package/plugins/robin/claude/skills/gdd/references/the-path.md +3 -4
  530. package/plugins/robin/claude/skills/gdd/references/world-and-identity.md +4 -4
  531. package/plugins/robin/claude/skills/gdd/references/worth.md +4 -4
  532. package/plugins/robin/claude/skills/mobile-ui/SKILL.md +3 -3
  533. package/plugins/robin/claude/skills/mobile-ui/references/hud-and-title.md +3 -3
  534. package/plugins/robin/claude/skills/mobile-ui/references/phone-check.md +1 -1
  535. package/plugins/robin/claude/skills/mobile-ui/references/recipes.md +1 -1
  536. package/plugins/robin/claude/skills/mobile-ui/references/restyle-ui.md +11 -11
  537. package/plugins/robin/claude/skills/mobile-ui/references/unity.md +23 -23
  538. package/plugins/robin/claude/skills/publishing/references/compose.md +1 -1
  539. package/plugins/robin/claude/skills/publishing/references/server-build.md +1 -1
  540. package/plugins/robin/claude/skills/store/SKILL.md +3 -3
  541. package/plugins/robin/claude/skills/store/references/app-store.md +1 -1
  542. package/plugins/robin/claude/skills/store/references/google-play.md +2 -2
  543. package/plugins/robin/claude/skills/store/references/ios-release.md +19 -20
  544. package/plugins/robin/claude/skills/store/references/money.md +2 -2
  545. package/plugins/robin/claude/skills/store/references/purchases-and-review.md +18 -18
  546. package/plugins/robin/claude/skills/store/references/readiness-page.md +1 -1
  547. package/plugins/robin/claude/skills/store/references/readiness.md +3 -3
  548. package/plugins/robin/claude/skills/store/references/unity-store.md +9 -12
  549. package/plugins/robin/claude/skills/unity-game/SKILL.md +28 -35
  550. package/plugins/robin/claude/skills/unity-game/references/agent-ops.md +9 -9
  551. package/plugins/robin/claude/skills/unity-game/references/fixes.md +21 -21
  552. package/plugins/robin/claude/skills/unity-game/references/from-a-web-game.md +17 -17
  553. package/plugins/robin/claude/skills/unity-game/references/handing-off.md +4 -4
  554. package/plugins/robin/claude/skills/unity-game/references/performance.md +10 -14
  555. package/plugins/robin/claude/skills/unity-game/references/probe.md +4 -4
  556. package/plugins/robin/claude/skills/unity-game/references/shared-mac.md +1 -1
  557. package/plugins/robin/claude/skills/unity-game/references/traps.md +13 -14
  558. package/plugins/robin/claude/skills/verifying/references/bar.md +1 -1
  559. package/plugins/robin/claude/skills/verifying/references/fidelity.md +11 -11
  560. package/plugins/robin/claude/skills/verifying/references/mobile-qa.md +10 -10
  561. package/plugins/robin/claude/skills/verifying/references/playtest.md +14 -14
  562. package/plugins/robin/claude/skills/verifying/references/unity.md +11 -11
  563. package/plugins/robin/claude/skills/world-and-story/SKILL.md +1 -1
  564. package/plugins/robin/claude/skills/world-and-story/references/atmosphere.md +4 -4
  565. package/plugins/robin/claude/skills/world-and-story/references/living-world.md +2 -2
  566. package/plugins/robin/claude/skills/world-and-story/references/opening-and-chapters.md +1 -1
  567. package/plugins/robin/claude/skills/world-and-story/references/story-at-size.md +2 -2
  568. package/plugins/robin/claude/skills/world-and-story/references/voice.md +1 -1
  569. package/plugins/robin/skills/fp-playtest/SKILL.md +2 -2
  570. package/plugins/robin/skills/funpixel-3d/references/bake-off.md +3 -3
  571. package/plugins/robin/skills/funpixel-3d/references/characters.md +1 -1
  572. package/plugins/robin/skills/funpixel-3d/references/hero-route.md +5 -5
  573. package/plugins/robin/skills/funpixel-3d/references/level-spec.md +1 -1
  574. package/plugins/robin/skills/funpixel-3d/references/levels.md +3 -3
  575. package/plugins/robin/skills/funpixel-3d/references/light-and-places.md +3 -3
  576. package/plugins/robin/skills/funpixel-3d/references/painted-target.md +7 -7
  577. package/plugins/robin/skills/funpixel-3d/references/three-loading.md +4 -4
  578. package/plugins/robin/skills/funpixel-3d/references/unity.md +13 -13
  579. package/plugins/robin/skills/funpixel-art/references/animation.md +1 -1
  580. package/plugins/robin/skills/funpixel-art/references/cast.md +3 -3
  581. package/plugins/robin/skills/funpixel-art/references/effects.md +2 -2
  582. package/plugins/robin/skills/funpixel-art/references/frames.md +6 -6
  583. package/plugins/robin/skills/funpixel-art/references/judging-frames.md +8 -8
  584. package/plugins/robin/skills/funpixel-art/references/look.md +4 -4
  585. package/plugins/robin/skills/funpixel-art/references/pipeline.md +2 -2
  586. package/plugins/robin/skills/funpixel-art/references/prompts.md +4 -4
  587. package/plugins/robin/skills/funpixel-art/references/ui.md +15 -15
  588. package/plugins/robin/skills/funpixel-art/references/unity.md +14 -14
  589. package/plugins/robin/skills/funpixel-audio/references/adaptive-music.md +4 -4
  590. package/plugins/robin/skills/funpixel-audio/references/engine.md +2 -2
  591. package/plugins/robin/skills/funpixel-audio/references/measure.md +1 -1
  592. package/plugins/robin/skills/funpixel-audio/references/unity.md +20 -19
  593. package/plugins/robin/skills/funpixel-brief/SKILL.md +1 -1
  594. package/plugins/robin/skills/funpixel-game-feel/SKILL.md +4 -4
  595. package/plugins/robin/skills/funpixel-game-feel/references/contact.md +6 -6
  596. package/plugins/robin/skills/funpixel-game-feel/references/unity.md +18 -23
  597. package/plugins/robin/skills/funpixel-game-logic/SKILL.md +3 -3
  598. package/plugins/robin/skills/funpixel-game-logic/references/balance.md +2 -2
  599. package/plugins/robin/skills/funpixel-game-logic/references/depth.md +2 -2
  600. package/plugins/robin/skills/funpixel-game-logic/references/escalation.md +5 -5
  601. package/plugins/robin/skills/funpixel-game-logic/references/probes.md +10 -10
  602. package/plugins/robin/skills/funpixel-game-logic/references/unity.md +28 -28
  603. package/plugins/robin/skills/funpixel-game-spine/SKILL.md +1 -1
  604. package/plugins/robin/skills/funpixel-game-spine/references/performance.md +2 -2
  605. package/plugins/robin/skills/funpixel-game-spine/references/replay.md +11 -11
  606. package/plugins/robin/skills/funpixel-game-spine/references/room-api.md +1 -1
  607. package/plugins/robin/skills/funpixel-game-spine/references/sdk.md +1 -1
  608. package/plugins/robin/skills/funpixel-gdd/SKILL.md +2 -2
  609. package/plugins/robin/skills/funpixel-gdd/references/as-built.md +2 -2
  610. package/plugins/robin/skills/funpixel-gdd/references/design-measures.md +2 -2
  611. package/plugins/robin/skills/funpixel-gdd/references/design-note.md +1 -1
  612. package/plugins/robin/skills/funpixel-gdd/references/first-look.md +1 -1
  613. package/plugins/robin/skills/funpixel-gdd/references/floors.md +2 -2
  614. package/plugins/robin/skills/funpixel-gdd/references/gameplay-contract.md +1 -1
  615. package/plugins/robin/skills/funpixel-gdd/references/genre-puzzle.md +4 -4
  616. package/plugins/robin/skills/funpixel-gdd/references/genre-racing.md +2 -2
  617. package/plugins/robin/skills/funpixel-gdd/references/genre-rpg.md +2 -2
  618. package/plugins/robin/skills/funpixel-gdd/references/genre-shooter.md +2 -2
  619. package/plugins/robin/skills/funpixel-gdd/references/genre-survival.md +2 -2
  620. package/plugins/robin/skills/funpixel-gdd/references/invent-first.md +3 -3
  621. package/plugins/robin/skills/funpixel-gdd/references/level-and-fun.md +11 -11
  622. package/plugins/robin/skills/funpixel-gdd/references/pages.md +2 -5
  623. package/plugins/robin/skills/funpixel-gdd/references/plan-at-size.md +5 -5
  624. package/plugins/robin/skills/funpixel-gdd/references/production-tiers.md +11 -11
  625. package/plugins/robin/skills/funpixel-gdd/references/sections.md +7 -7
  626. package/plugins/robin/skills/funpixel-gdd/references/spec-folder.md +3 -3
  627. package/plugins/robin/skills/funpixel-gdd/references/the-path.md +3 -4
  628. package/plugins/robin/skills/funpixel-gdd/references/world-and-identity.md +4 -4
  629. package/plugins/robin/skills/funpixel-gdd/references/worth.md +4 -4
  630. package/plugins/robin/skills/funpixel-mobile-ui/SKILL.md +3 -3
  631. package/plugins/robin/skills/funpixel-mobile-ui/references/hud-and-title.md +3 -3
  632. package/plugins/robin/skills/funpixel-mobile-ui/references/phone-check.md +1 -1
  633. package/plugins/robin/skills/funpixel-mobile-ui/references/recipes.md +1 -1
  634. package/plugins/robin/skills/funpixel-mobile-ui/references/restyle-ui.md +11 -11
  635. package/plugins/robin/skills/funpixel-mobile-ui/references/unity.md +23 -23
  636. package/plugins/robin/skills/funpixel-publish/references/compose.md +1 -1
  637. package/plugins/robin/skills/funpixel-publish/references/server-build.md +1 -1
  638. package/plugins/robin/skills/funpixel-store/SKILL.md +3 -3
  639. package/plugins/robin/skills/funpixel-store/references/app-store.md +1 -1
  640. package/plugins/robin/skills/funpixel-store/references/google-play.md +2 -2
  641. package/plugins/robin/skills/funpixel-store/references/ios-release.md +19 -20
  642. package/plugins/robin/skills/funpixel-store/references/money.md +2 -2
  643. package/plugins/robin/skills/funpixel-store/references/purchases-and-review.md +18 -18
  644. package/plugins/robin/skills/funpixel-store/references/readiness-page.md +1 -1
  645. package/plugins/robin/skills/funpixel-store/references/readiness.md +3 -3
  646. package/plugins/robin/skills/funpixel-store/references/unity-store.md +9 -12
  647. package/plugins/robin/skills/funpixel-unity-game/SKILL.md +28 -35
  648. package/plugins/robin/skills/funpixel-unity-game/references/agent-ops.md +9 -9
  649. package/plugins/robin/skills/funpixel-unity-game/references/fixes.md +21 -21
  650. package/plugins/robin/skills/funpixel-unity-game/references/from-a-web-game.md +17 -17
  651. package/plugins/robin/skills/funpixel-unity-game/references/handing-off.md +4 -4
  652. package/plugins/robin/skills/funpixel-unity-game/references/performance.md +10 -14
  653. package/plugins/robin/skills/funpixel-unity-game/references/probe.md +4 -4
  654. package/plugins/robin/skills/funpixel-unity-game/references/shared-mac.md +1 -1
  655. package/plugins/robin/skills/funpixel-unity-game/references/traps.md +13 -14
  656. package/plugins/robin/skills/funpixel-verify/references/bar.md +1 -1
  657. package/plugins/robin/skills/funpixel-verify/references/fidelity.md +11 -11
  658. package/plugins/robin/skills/funpixel-verify/references/mobile-qa.md +10 -10
  659. package/plugins/robin/skills/funpixel-verify/references/playtest.md +14 -14
  660. package/plugins/robin/skills/funpixel-verify/references/unity.md +11 -11
  661. package/plugins/robin/skills/funpixel-world-and-story/SKILL.md +1 -1
  662. package/plugins/robin/skills/funpixel-world-and-story/references/atmosphere.md +4 -4
  663. package/plugins/robin/skills/funpixel-world-and-story/references/living-world.md +2 -2
  664. package/plugins/robin/skills/funpixel-world-and-story/references/opening-and-chapters.md +1 -1
  665. package/plugins/robin/skills/funpixel-world-and-story/references/story-at-size.md +2 -2
  666. package/plugins/robin/skills/funpixel-world-and-story/references/voice.md +1 -1
  667. package/templates/common/.agents/skills/funpixel-3d/references/bake-off.md +3 -3
  668. package/templates/common/.agents/skills/funpixel-3d/references/characters.md +1 -1
  669. package/templates/common/.agents/skills/funpixel-3d/references/hero-route.md +5 -5
  670. package/templates/common/.agents/skills/funpixel-3d/references/level-spec.md +1 -1
  671. package/templates/common/.agents/skills/funpixel-3d/references/levels.md +3 -3
  672. package/templates/common/.agents/skills/funpixel-3d/references/light-and-places.md +3 -3
  673. package/templates/common/.agents/skills/funpixel-3d/references/painted-target.md +7 -7
  674. package/templates/common/.agents/skills/funpixel-3d/references/three-loading.md +4 -4
  675. package/templates/common/.agents/skills/funpixel-3d/references/unity.md +13 -13
  676. package/templates/common/.agents/skills/funpixel-art/references/animation.md +1 -1
  677. package/templates/common/.agents/skills/funpixel-art/references/cast.md +3 -3
  678. package/templates/common/.agents/skills/funpixel-art/references/effects.md +2 -2
  679. package/templates/common/.agents/skills/funpixel-art/references/frames.md +6 -6
  680. package/templates/common/.agents/skills/funpixel-art/references/judging-frames.md +8 -8
  681. package/templates/common/.agents/skills/funpixel-art/references/look.md +4 -4
  682. package/templates/common/.agents/skills/funpixel-art/references/pipeline.md +2 -2
  683. package/templates/common/.agents/skills/funpixel-art/references/prompts.md +4 -4
  684. package/templates/common/.agents/skills/funpixel-art/references/ui.md +15 -15
  685. package/templates/common/.agents/skills/funpixel-art/references/unity.md +14 -14
  686. package/templates/common/.agents/skills/funpixel-audio/references/adaptive-music.md +4 -4
  687. package/templates/common/.agents/skills/funpixel-audio/references/engine.md +2 -2
  688. package/templates/common/.agents/skills/funpixel-audio/references/measure.md +1 -1
  689. package/templates/common/.agents/skills/funpixel-audio/references/unity.md +20 -19
  690. package/templates/common/.agents/skills/funpixel-game-feel/SKILL.md +4 -4
  691. package/templates/common/.agents/skills/funpixel-game-feel/references/contact.md +6 -6
  692. package/templates/common/.agents/skills/funpixel-game-feel/references/unity.md +18 -23
  693. package/templates/common/.agents/skills/funpixel-game-logic/SKILL.md +3 -3
  694. package/templates/common/.agents/skills/funpixel-game-logic/references/balance.md +2 -2
  695. package/templates/common/.agents/skills/funpixel-game-logic/references/depth.md +2 -2
  696. package/templates/common/.agents/skills/funpixel-game-logic/references/escalation.md +5 -5
  697. package/templates/common/.agents/skills/funpixel-game-logic/references/probes.md +10 -10
  698. package/templates/common/.agents/skills/funpixel-game-logic/references/unity.md +28 -28
  699. package/templates/common/.agents/skills/funpixel-game-spine/SKILL.md +1 -1
  700. package/templates/common/.agents/skills/funpixel-game-spine/references/performance.md +2 -2
  701. package/templates/common/.agents/skills/funpixel-game-spine/references/replay.md +11 -11
  702. package/templates/common/.agents/skills/funpixel-game-spine/references/room-api.md +1 -1
  703. package/templates/common/.agents/skills/funpixel-game-spine/references/sdk.md +1 -1
  704. package/templates/common/.agents/skills/funpixel-gdd/SKILL.md +2 -2
  705. package/templates/common/.agents/skills/funpixel-gdd/references/as-built.md +2 -2
  706. package/templates/common/.agents/skills/funpixel-gdd/references/design-measures.md +2 -2
  707. package/templates/common/.agents/skills/funpixel-gdd/references/design-note.md +1 -1
  708. package/templates/common/.agents/skills/funpixel-gdd/references/first-look.md +1 -1
  709. package/templates/common/.agents/skills/funpixel-gdd/references/floors.md +2 -2
  710. package/templates/common/.agents/skills/funpixel-gdd/references/gameplay-contract.md +1 -1
  711. package/templates/common/.agents/skills/funpixel-gdd/references/genre-puzzle.md +4 -4
  712. package/templates/common/.agents/skills/funpixel-gdd/references/genre-racing.md +2 -2
  713. package/templates/common/.agents/skills/funpixel-gdd/references/genre-rpg.md +2 -2
  714. package/templates/common/.agents/skills/funpixel-gdd/references/genre-shooter.md +2 -2
  715. package/templates/common/.agents/skills/funpixel-gdd/references/genre-survival.md +2 -2
  716. package/templates/common/.agents/skills/funpixel-gdd/references/invent-first.md +3 -3
  717. package/templates/common/.agents/skills/funpixel-gdd/references/level-and-fun.md +11 -11
  718. package/templates/common/.agents/skills/funpixel-gdd/references/pages.md +2 -5
  719. package/templates/common/.agents/skills/funpixel-gdd/references/plan-at-size.md +5 -5
  720. package/templates/common/.agents/skills/funpixel-gdd/references/production-tiers.md +11 -11
  721. package/templates/common/.agents/skills/funpixel-gdd/references/sections.md +7 -7
  722. package/templates/common/.agents/skills/funpixel-gdd/references/spec-folder.md +3 -3
  723. package/templates/common/.agents/skills/funpixel-gdd/references/the-path.md +3 -4
  724. package/templates/common/.agents/skills/funpixel-gdd/references/world-and-identity.md +4 -4
  725. package/templates/common/.agents/skills/funpixel-gdd/references/worth.md +4 -4
  726. package/templates/common/.agents/skills/funpixel-mobile-ui/SKILL.md +3 -3
  727. package/templates/common/.agents/skills/funpixel-mobile-ui/references/hud-and-title.md +3 -3
  728. package/templates/common/.agents/skills/funpixel-mobile-ui/references/phone-check.md +1 -1
  729. package/templates/common/.agents/skills/funpixel-mobile-ui/references/recipes.md +1 -1
  730. package/templates/common/.agents/skills/funpixel-mobile-ui/references/restyle-ui.md +11 -11
  731. package/templates/common/.agents/skills/funpixel-mobile-ui/references/unity.md +23 -23
  732. package/templates/common/.agents/skills/funpixel-publish/references/compose.md +1 -1
  733. package/templates/common/.agents/skills/funpixel-publish/references/server-build.md +1 -1
  734. package/templates/common/.agents/skills/funpixel-store/SKILL.md +3 -3
  735. package/templates/common/.agents/skills/funpixel-store/references/app-store.md +1 -1
  736. package/templates/common/.agents/skills/funpixel-store/references/google-play.md +2 -2
  737. package/templates/common/.agents/skills/funpixel-store/references/ios-release.md +19 -20
  738. package/templates/common/.agents/skills/funpixel-store/references/money.md +2 -2
  739. package/templates/common/.agents/skills/funpixel-store/references/purchases-and-review.md +18 -18
  740. package/templates/common/.agents/skills/funpixel-store/references/readiness-page.md +1 -1
  741. package/templates/common/.agents/skills/funpixel-store/references/readiness.md +3 -3
  742. package/templates/common/.agents/skills/funpixel-store/references/unity-store.md +9 -12
  743. package/templates/common/.agents/skills/funpixel-unity-game/SKILL.md +28 -35
  744. package/templates/common/.agents/skills/funpixel-unity-game/references/agent-ops.md +9 -9
  745. package/templates/common/.agents/skills/funpixel-unity-game/references/fixes.md +21 -21
  746. package/templates/common/.agents/skills/funpixel-unity-game/references/from-a-web-game.md +17 -17
  747. package/templates/common/.agents/skills/funpixel-unity-game/references/handing-off.md +4 -4
  748. package/templates/common/.agents/skills/funpixel-unity-game/references/performance.md +10 -14
  749. package/templates/common/.agents/skills/funpixel-unity-game/references/probe.md +4 -4
  750. package/templates/common/.agents/skills/funpixel-unity-game/references/shared-mac.md +1 -1
  751. package/templates/common/.agents/skills/funpixel-unity-game/references/traps.md +13 -14
  752. package/templates/common/.agents/skills/funpixel-verify/references/bar.md +1 -1
  753. package/templates/common/.agents/skills/funpixel-verify/references/fidelity.md +11 -11
  754. package/templates/common/.agents/skills/funpixel-verify/references/mobile-qa.md +10 -10
  755. package/templates/common/.agents/skills/funpixel-verify/references/playtest.md +14 -14
  756. package/templates/common/.agents/skills/funpixel-verify/references/unity.md +11 -11
  757. package/templates/common/.agents/skills/funpixel-world-and-story/SKILL.md +1 -1
  758. package/templates/common/.agents/skills/funpixel-world-and-story/references/atmosphere.md +4 -4
  759. package/templates/common/.agents/skills/funpixel-world-and-story/references/living-world.md +2 -2
  760. package/templates/common/.agents/skills/funpixel-world-and-story/references/opening-and-chapters.md +1 -1
  761. package/templates/common/.agents/skills/funpixel-world-and-story/references/story-at-size.md +2 -2
  762. package/templates/common/.agents/skills/funpixel-world-and-story/references/voice.md +1 -1
  763. package/templates/common/AGENTS.md +1 -1
  764. package/templates/common/src/platform.ts +1 -1
  765. package/templates/common/src/probe-human.ts +3 -3
  766. package/templates/common/src/save.ts +1 -1
  767. package/templates/common/test/platform.test.ts +1 -1
  768. package/templates/three-world/src/budget.ts +1 -1
  769. package/templates/three-world/src/cutouts.ts +2 -2
  770. package/templates/three-world/src/game.ts +1 -1
  771. package/templates/three-world/src/models.ts +1 -1
  772. package/unity/com.funpixel.probe/Runtime/Player/Args.cs +1 -1
  773. package/unity/com.funpixel.probe/Runtime/Player/Bridge.cs +2 -2
  774. package/unity/com.funpixel.probe/Runtime/Player/Capture.cs +2 -2
  775. package/unity/com.funpixel.probe/Runtime/Player/Inject.cs +1 -2
  776. package/unity/com.funpixel.probe/Runtime/Player/Probe.cs +2 -2
  777. package/unity/com.funpixel.probe/Runtime/Player/UiTargets.cs +1 -1
  778. package/plugins/claude/skills/unity-game/references/studio-packages.md +0 -127
  779. package/plugins/codex/skills/funpixel-unity-game/references/studio-packages.md +0 -127
  780. package/plugins/cursor/skills/funpixel-unity-game/references/studio-packages.md +0 -127
  781. package/plugins/kiro/skills/funpixel-unity-game/references/studio-packages.md +0 -127
  782. package/plugins/robin/claude/skills/unity-game/references/studio-packages.md +0 -127
  783. package/plugins/robin/skills/funpixel-unity-game/references/studio-packages.md +0 -127
  784. package/templates/common/.agents/skills/funpixel-unity-game/references/studio-packages.md +0 -127
@@ -1,16 +1,15 @@
1
1
  # iOS release for a Unity game
2
2
 
3
- A Unity iOS build can upload "successfully" and still be broken, because most release failures are silent. Across nine games, four reached TestFlight with no sound, Firebase never started in release builds (3 broken uploads), one upload drew ITMS-90208 by email afterwards, and Pocket Crew was pulled from review twice. This skill orders the checks so each failure shows on the Mac first.
3
+ A Unity iOS build can upload "successfully" and still be broken, because most release failures are silent. Across nine games, four reached TestFlight with no sound, Firebase never started in release builds (3 broken uploads), one upload drew ITMS-90208 by email afterwards, and one game was pulled from review twice. This skill orders the checks so each failure shows on the Mac first.
4
4
 
5
5
  ## Tools
6
6
 
7
- - The studio's `com.joydle.core` (`funpixel-unity-game`, `references/studio-packages.md`):
8
- `funtools unity run -- -nographics -buildTarget iOS -executeMethod Joydle.Core.Editor.BuildTools.TestFlight`
7
+ - The game's own build method,
8
+ `funtools unity run -- -nographics -buildTarget iOS -executeMethod Setup.BuildTestFlight`: it
9
9
  applies the size settings, signing and a unique build number, and refuses to build without
10
- `Assets/_Game/Art/Icon/app_icon.png`; `Device`, `Simulator` and `SimulatorMuted` beside it. Its
11
- `IosPostprocess` stamps every framework's minimum OS and the encryption key. `com.joydle.firebase`
12
- hands the linker what High stripping would remove. Without the package, the game's own method
13
- (Knockout Lap's `Build.IosDevice`).
10
+ `Assets/_Game/Art/Icon/app_icon.png`; a device and a Simulator build beside it. A post-process
11
+ step stamps every framework's minimum OS and the encryption key, and the linker is handed what
12
+ High stripping would remove.
14
13
  - Xcode: `xcodebuild archive` (automatic signing), then `xcodebuild -exportArchive` (manual signing;
15
14
  `destination: upload` uploads it): 15–25 minutes.
16
15
  - App Store Connect (ASC), on the web or its API: bundle ids, profiles, processing, listings.
@@ -35,30 +34,30 @@ No script changes the signing identity, team, bundle id or `ITSAppUsesNonExemptE
35
34
 
36
35
  ## Procedure
37
36
 
38
- 1. Build only when HEAD equals origin/main and the tree is clean. TestFlight builds came from an unmerged branch (Dead Letter's icon was missing on main), and two review builds (Dead Letter, Scrap Riot) from uncommitted reimports (190 `.wav.meta` files, 4 TMP font assets), so main was not what Apple reviewed. Until `build_from_main` exists, compare by hand.
39
- 2. Keep the Simulator's churn out of commits. Simulator builds rewrite `iPhoneSdkVersion` to 988 and dirty AudioManager, TMP font assets and URP global settings; `git commit -a` swept them in on Dawg Ball.
40
- 3. Confirm the build settings: IL2CPP, managed stripping High, strip engine code, code generation OptimizeSize, iOS 16.0, iPhone only (`ProjectConfig.ApplyIOS` and `BuildTools` set them), LZ4HC when `ProjectSettings/JoydleLz4hc.txt` exists. Signing: `BuildTools.TestFlight` sets team KBAT76634X and automatic signing; archive with `-allowProvisioningUpdates` and the ASC key, export manually with the Apple Distribution certificate and the bundle's App Store profile (`asc_profiles.py`). Never cloud-managed signing: it needs an Admin API key.
41
- 4. Preserve what High stripping removes. Anything reached only at runtime (collider types for `CreatePrimitive`, the game's own assemblies) needs the game's `link.xml`; Unity ignores a package's own, so `com.joydle.firebase` hands its file to the linker itself. Pass for `il2cpp_preserve`: every assembly with `RuntimeInitializeOnLoadMethod` is present in il2cppOutput. Pass for `tmp_variants`: TMP `OUTLINE_ON` and `UNDERLAY_ON` kept, no `shader_feature` in runtime materials.
37
+ 1. Build only when HEAD equals origin/main and the tree is clean. TestFlight builds came from an unmerged branch (one game's icon was missing on main), and two review builds from uncommitted reimports (190 `.wav.meta` files, 4 TMP font assets), so main was not what Apple reviewed. Until `build_from_main` exists, compare by hand.
38
+ 2. Keep the Simulator's churn out of commits. Simulator builds rewrite `iPhoneSdkVersion` to 988 and dirty AudioManager, TMP font assets and URP global settings; `git commit -a` swept them in on one game.
39
+ 3. Confirm the build settings: IL2CPP, managed stripping High, strip engine code, code generation OptimizeSize, iOS 16.0, iPhone only (the build method sets them), LZ4HC. Signing: the build method sets the team and automatic signing; archive with `-allowProvisioningUpdates` and the ASC key, export manually with the Apple Distribution certificate and the bundle's App Store profile (`asc_profiles.py`). Never cloud-managed signing: it needs an Admin API key.
40
+ 4. Preserve what High stripping removes. Anything reached only at runtime (collider types for `CreatePrimitive`, the game's own assemblies) needs the game's `link.xml`; Unity ignores a package's own, so an Editor step hands that file to the linker. Pass for `il2cpp_preserve`: every assembly with `RuntimeInitializeOnLoadMethod` is present in il2cppOutput. Pass for `tmp_variants`: TMP `OUTLINE_ON` and `UNDERLAY_ON` kept, no `shader_feature` in runtime materials.
42
41
  5. Empty `Resources/` of test files (`resources_hygiene`: 0 bytes). The Unity test runner drops `PerformanceTestRun*.json` into `Assets/Resources`, which ships.
43
42
  6. Close any Editor on the project, run `funtools doctor`, then build, export and archive. Read the whole output: `| tail` hid a failing compile check.
44
43
  7. Read the export log before archiving (`export_log`: 0 errors, Burst timeouts included). Burst can time out under heavy host load; that export does not ship.
45
- 8. Pre-flight the archive (`ios_preflight`): framework plist minimum OS equals the binary's, app icon present, audio on. Before the first TestFlight of a release, a fresh read-only agent does a publisher and story-consistency review: 6 blockers in Dead Letter, 30 issues in Scrap Riot.
44
+ 8. Pre-flight the archive (`ios_preflight`): framework plist minimum OS equals the binary's, app icon present, audio on. Before the first TestFlight of a release, a fresh read-only agent does a publisher and story-consistency review: 6 blockers in one game, 30 issues in another.
46
45
  9. Check what the archive holds (`archive_contents`): a known string per level in `.app/Data`, the plist, a new CFBundleVersion. One archive on disk held Letter 1 only.
47
- 10. Measure the unpacked `.app` from the archive (`size_budget`), not Unity's "Complete build size". Proposed budget: 2D ≤ 80 MB, 3D ≤ 100 MB, engine ≤ 45 MB, unexplained change ≤ 2 MiB per build; Dead Letter, a 2D game, is over it at 133 MB. `texture_audit` passes at 0 unwhitelisted RGBA32 or non-power-of-two mipmapped textures and RGBA32 under 1 MB in total.
46
+ 10. Measure the unpacked `.app` from the archive (`size_budget`), not Unity's "Complete build size". Proposed budget: 2D ≤ 80 MB, 3D ≤ 100 MB, engine ≤ 45 MB, unexplained change ≤ 2 MiB per build; one 2D game is over it at 133 MB. `texture_audit` passes at 0 unwhitelisted RGBA32 or non-power-of-two mipmapped textures and RGBA32 under 1 MB in total.
48
47
  11. Upload with approval, then watch processing in App Store Connect. An upload that reports success can still fail by email (ITMS-90208).
49
48
  12. Submit in two hands. The API builds the draft; a person ticks the first IAP on the version page and presses Submit. The Game Center drafts the API leaves: not in the report.
50
49
  13. After a metadata-only rejection, new screenshots uploaded through the API do not clear it: a person edits and saves the version, then resubmits.
51
- 14. A server-side minimum version compares the build number, not `CFBundleShortVersionString`: that is 1.0.0 on every TestFlight build, so Dawg Ball's kill switch could not tell them apart.
50
+ 14. A server-side minimum version compares the build number, not `CFBundleShortVersionString`: that is 1.0.0 on every TestFlight build, so one game's kill switch could not tell them apart.
52
51
 
53
52
  ## Worked example
54
53
 
55
- Koi Out, first upload, 25 Sep. The upload succeeded, then Apple emailed ITMS-90208: Unity 6000.6's `UnityRuntime.framework` says iOS 15.0 in its plist and 16.0 in its binary. The fix went into the shared package (a post-build step stamps every framework) and the upload script's pre-flight. Porcelain Panic's TestFlight build then carried Unity's default icon and its next upload was refused, so the build method now refuses without `app_icon.png`. The same pre-flight later refused `m_DisableAudio: 1`, a setting Dead Letter inherited from a cloned project.
54
+ A puzzle game's first upload, 25 Sep. The upload succeeded, then Apple emailed ITMS-90208: Unity 6000.6's `UnityRuntime.framework` says iOS 15.0 in its plist and 16.0 in its binary. The fix went into the shared package (a post-build step stamps every framework) and the upload script's pre-flight. Another game's TestFlight build then carried Unity's default icon and its next upload was refused, so the build method now refuses without `app_icon.png`. The same pre-flight later refused `m_DisableAudio: 1`, a setting a third game inherited from a cloned project.
56
55
 
57
56
  ## Common mistakes
58
57
 
59
- - No AudioListener on a code-made camera: four games reached TestFlight silent, and Simulator captures hide it (`funtools doctor` warns; `Sfx.EnsureListener()`).
58
+ - No AudioListener on a code-made camera: four games reached TestFlight silent, and Simulator captures hide it (`funtools doctor` warns).
60
59
  - Firebase reached only through `RuntimeInitializeOnLoadMethod` was stripped from release in every game: 3 broken uploads.
61
- - Submitting through the API alone: it dropped Pocket Crew's first IAP and left Game Center drafts, and the game was pulled from review twice.
62
- - Trusting "Complete build size": The Hot Gates' "1.08 GB" was the Xcode project; the archive was 123 MB.
63
- - Stripped TMP variants: outlined numbers drew as cream blobs in The Hot Gates player build.
64
- - Firebase C++ 13.17 has no arm64 Simulator slice, so every Firebase game failed to link for the Simulator; each game links null stubs (304 in The Hot Gates), detected by `SIMULATOR_UDID`, because a Simulator reports a real device model.
60
+ - Submitting through the API alone: it dropped one game's first IAP and left Game Center drafts, and the game was pulled from review twice.
61
+ - Trusting "Complete build size": One game's "1.08 GB" was the Xcode project; the archive was 123 MB.
62
+ - Stripped TMP variants: outlined numbers drew as cream blobs in one game's player build.
63
+ - Firebase C++ 13.17 has no arm64 Simulator slice, so every Firebase game failed to link for the Simulator; each game links null stubs (304 in one game), detected by `SIMULATOR_UDID`, because a Simulator reports a real device model.
@@ -4,7 +4,7 @@ A decision guide, not a market report: which way a game makes money, what the ev
4
4
  fits a platform and a feel. The model and every price are the owner's decision (step 0 of the work); this page
5
5
  gives them the numbers to decide with, and the GDD records the choice in its Scope (skill `funpixel-gdd`).
6
6
 
7
- Numbers as of Oct 2026, from Particle Rush's study (design/research/monetisation.md in that game's repository,
7
+ Numbers as of Oct 2026, from one racer's study (design/research/monetisation.md in that game's repository,
8
8
  researched 9 Oct 2026). Each figure keeps its source and date; **(snippet)** means it was seen only in a
9
9
  search-result summary, not on the page itself. Revenue from AppMagic, Sensor Tower and Steam trackers is a
10
10
  third-party estimate, not a company report. Read a source again before a price or a forecast is final.
@@ -55,7 +55,7 @@ shocks and things taken away, and too little free game.
55
55
 
56
56
  ## Worked example: a racer that sells no power
57
57
 
58
- Particle Rush (Unity, iOS and Android first; modules unlock by play, never bought) chose, on 9 Oct 2026:
58
+ A racer (Unity, iOS and Android first; modules unlock by play, never bought) chose, on 9 Oct 2026:
59
59
  - **Mobile launch:** free with rewarded ads first; interstitials capped, never on a retry and removed by any
60
60
  purchase; remove-ads at $2.99–3.99 bundled with a starter trail so the buyer sees something; cosmetics at
61
61
  $0.99–2.99.
@@ -6,11 +6,11 @@ sell by in the first place: [readiness](readiness.md), `references/money.md`.
6
6
 
7
7
  ## If review rejects anyway
8
8
 
9
- | Guideline | Game | Cause | Fix |
10
- |---|---|---|---|
11
- | 2.1(b) | Dead Letter, Scrap Riot | Purchase behind gameplay; reviewer on iPad could not find it | Step 2 |
12
- | 2.3.3 | Noodle Nights | Screenshots hid the real HUD and controls | Step 9 |
13
- | 2.3.7 | Koi Out | "free" in the subtitle | Step 11 |
9
+ | Guideline | Cause | Fix |
10
+ |---|---|---|
11
+ | 2.1(b) | Purchase behind gameplay; reviewer on iPad could not find it | Step 2 |
12
+ | 2.3.3 | Screenshots hid the real HUD and controls | Step 9 |
13
+ | 2.3.7 | "free" in the subtitle | Step 11 |
14
14
 
15
15
  After a metadata-only rejection, new screenshots uploaded through the API do not clear it; a person
16
16
  edits and saves the version, then resubmits. Messages to App Review stay short.
@@ -19,20 +19,20 @@ edits and saves the version, then resubmits. Messages to App Review stay short.
19
19
 
20
20
  | Kind | Sells | Examples |
21
21
  |---|---|---|
22
- | Casual | Coins, hints, boosters | Koi Out, Stitch Pop, Porcelain Panic, Noodle Nights |
23
- | Premium | Free first chapter and one non-consumable, Family Sharing on | Dead Letter $4.99 Full Route, Scrap Riot $2.99 Full Shift, Pocket Crew $4.99 Full Crew |
22
+ | Casual | Coins, hints, boosters | four games |
23
+ | Premium | Free first chapter and one non-consumable, Family Sharing on | three games, at $2.99 and $4.99 |
24
24
 
25
- Unity IAP 5.4.3 (StoreKit 2) through the studio's `IapService`, one-off products only, no server
25
+ Unity IAP 5.4.3 (StoreKit 2) through one shared purchase service, one-off products only, no server
26
26
  receipt validation, no ads in premium games. Restore runs only from a tap (a launch-time restore shows
27
27
  an Apple sign-in prompt); prices come only from the store's localised string; failure text is plain
28
28
  and a cancel says nothing.
29
29
 
30
30
  ## What the starter wires, switched off
31
31
 
32
- `IAdService` with no release implementation (`Ads.CreateDefault` gives test ads in development builds
33
- only) and the pacing rules; `IapService` with Restore in Settings and the purchase screen from the
32
+ `IAdService` with no release implementation (test ads in development builds
33
+ only) and the pacing rules; the purchase service with Restore in Settings and the purchase screen from the
34
34
  first launch; a `.storekit` file for Xcode runs; one purchase gate at the first line of `StartLevel`;
35
- telemetry muted by every dev flag; a store interface even when 1.0 sells nothing (The Hot Gates).
35
+ telemetry muted by every dev flag; a store interface even when 1.0 sells nothing.
36
36
 
37
37
  ## Ads
38
38
 
@@ -47,9 +47,9 @@ Pacing, coded and off:
47
47
 
48
48
  | Kind | Interstitial | Rewarded |
49
49
  |---|---|---|
50
- | Puzzle | from level 15, every third level (`Ads.ShouldShowInterstitial`) | +3 balls (Porcelain Panic) |
51
- | Idle | only after big unlocks, never in the first 5 minutes, at most one per 3 minutes | 2× cash and offline 2× (Noodle Nights) |
52
- | Versus | every third match after day one | double chest, timer skip with a daily cap (Dawg Ball) |
50
+ | Puzzle | from level 15, every third level | +3 balls |
51
+ | Idle | only after big unlocks, never in the first 5 minutes, at most one per 3 minutes | 2× cash and offline 2× |
52
+ | Versus | every third match after day one | double chest, timer skip with a daily cap |
53
53
 
54
54
  Never ads in a premium game, and never a No Ads purchase while no network ships. The only retention
55
55
  evidence is a teardown of Head Ball 2 from the owner's recording: ads took 44% of a session against
@@ -57,10 +57,10 @@ evidence is a teardown of Head Ball 2 from the owner's recording: ads took 44% o
57
57
 
58
58
  ## Privacy and analytics
59
59
 
60
- Firebase Analytics and Crashlytics in every game through `Telemetry`; events `level_start`,
60
+ Firebase Analytics and Crashlytics in every game through one telemetry boundary; events `level_start`,
61
61
  `level_end`, `tutorial_complete`, `shop_open`, `unlock_card_view`, `unlock_tap`, plus each game's own.
62
- No advertising identifier, no tracking prompt, ad personalisation pinned off (`com.joydle.firebase`
63
- does all three). App Privacy (website only) declares Device ID, Purchase History, Coarse Location,
62
+ No advertising identifier, no tracking prompt, ad personalisation pinned off (the shared Firebase
63
+ setup does all three). App Privacy (website only) declares Device ID, Purchase History, Coarse Location,
64
64
  Product Interaction and Crash Data: not linked, no tracking; Purchase History only where there is a
65
65
  purchase. The docs said "Data Not Collected" until Firebase shipped, and one draft missed Purchase
66
66
  History. No age gate and no Kids category; the ratings came out 9+ and 12+ (fantasy violence). No
@@ -70,5 +70,5 @@ dashboard review is recorded in any session.
70
70
 
71
71
  What the first week watched was App Review's state: three games sat in "Waiting for Review" for over a
72
72
  week after a resubmit. No content ships without a store release (no remote bundles or remote config;
73
- Gallery Heist's Addressables are built into the app, with no remote catalog), and a server's minimum-version check must compare the build number: the version string
73
+ one game's Addressables are built into the app, with no remote catalog), and a server's minimum-version check must compare the build number: the version string
74
74
  is 1.0.0 on every TestFlight build.
@@ -1,7 +1,7 @@
1
1
  # The readiness page
2
2
 
3
3
  One page per store, in the game's own look (or the studio's, for several games), written to
4
- `design/pages/<store>-readiness.html`. The shape that worked (Joydle's Google Play readiness):
4
+ `design/pages/<store>-readiness.html`. The shape that worked (a Google Play readiness page for four games):
5
5
 
6
6
  1. **Header:** the studio, the store, the date checked; the games by name; one line of what the page
7
7
  is based on (the repository at a named commit, the toolchain, the store's pages read that day, a
@@ -1,7 +1,7 @@
1
1
  # Store readiness
2
2
 
3
- "Can it go on the store?" is answered by an audit, not a guess. The model that worked (Joydle's
4
- Google Play readiness, 8 Oct 2026, four games) reads the repository and the toolchain, reads the
3
+ "Can it go on the store?" is answered by an audit, not a guess. The model that worked (a
4
+ Google Play readiness audit, 8 Oct 2026, four games) reads the repository and the toolchain, reads the
5
5
  store's current policy pages, and writes one page: a verdict in a sentence, each game at a glance,
6
6
  a matrix of every area by game, the store's rules that apply now, the work in order with who does
7
7
  each part, the effort, the risks and the questions only the owner can answer.
@@ -86,7 +86,7 @@ they carry; before the page is final, read each store's current page and correct
86
86
 
87
87
  ## Worked example
88
88
 
89
- Four Unity games for Google Play (Joydle, 8 Oct 2026): no Android build ever made, Unity IAP already
89
+ Four Unity games for Google Play (8 Oct 2026): no Android build ever made, Unity IAP already
90
90
  on Play Billing 9 (Play requires 8+), analytics in all four while two listings said "no analytics".
91
91
  Verdict: none can upload today, none is blocked. A shared Android foundation first (an AAB pinned to
92
92
  API 36, one upload key, the AD_ID permission removed, one back handler), then 2–8 days per game; the
@@ -4,9 +4,6 @@ Four of eight first submissions were rejected (guideline 2.1(b) twice, 2.3.3, 2.
4
4
 
5
5
  ## Tools
6
6
 
7
- - The studio's `com.joydle.core` (`funpixel-unity-game`, `references/studio-packages.md`):
8
- `IapService(catalog, grant)` with `Init()`, `Buy(id)`, `Restore(done)` and `Price(id)`;
9
- `Ads.CreateDefault(font)` and `Ads.Available`; `Telemetry` with `com.joydle.firebase` as its sink.
10
7
  - `npx @funpixel/tools store init --store ios` writes `store/answers.json` (listing, products, the
11
8
  SDK list, review notes); `npx @funpixel/tools store lint --store ios` checks lengths, price words and
12
9
  the privacy answers against the SDKs. App Store Connect (web or API) takes the listing.
@@ -31,13 +28,13 @@ Four of eight first submissions were rejected (guideline 2.1(b) twice, 2.3.3, 2.
31
28
 
32
29
  ## Procedure
33
30
 
34
- 1. Sell only what the binary holds (`iap_truth`). Every IAP id needs an App Store Connect product and an entry point, and copy names nothing unbuilt. Store copy promised modes that existed only as data, and a Supporter IAP had nothing to buy (guideline 3.1.1). No ad network is live, so hide No Ads (four such IAPs had to be held): while `Ads.Available` is false, every ad button is hidden. Put one purchase gate at the first line of `StartLevel`, and a store interface even when 1.0 sells nothing (report §12).
31
+ 1. Sell only what the binary holds (`iap_truth`). Every IAP id needs an App Store Connect product and an entry point, and copy names nothing unbuilt. Store copy promised modes that existed only as data, and a Supporter IAP had nothing to buy (guideline 3.1.1). No ad network is live, so hide No Ads (four such IAPs had to be held): while no ad network is available, every ad button is hidden. Put one purchase gate at the first line of `StartLevel`, and a store interface even when 1.0 sells nothing (report §12).
35
32
  2. Put Buy within two taps of the title on a fresh install (`iap_reach`): an Unlock row in Settings next to Restore, plus a title-screen entry. Name the path in the review notes.
36
- 3. Make Restore real (`restore_real`). It calls `RestoreTransactions` only from a tap, because a launch-time restore shows an Apple sign-in prompt, and it ends in "restored" or "nothing to restore". App Review always taps Restore; Scrap Riot's only fetched purchases and spun for 45 s.
37
- 4. Show prices only from `Price(id)`, the store's localised string. Failure text is plain; a cancel says nothing.
38
- 5. Grant a pending order exactly once (`iap_pending_once`). Unity IAP 5 routes pending orders to `OnPurchasePending`; the shared `IapService` granted them again from the fetch too, until the fix of 7 Oct (it now grants once per transaction). A game built before it needs a new build.
33
+ 3. Make Restore real (`restore_real`). It calls `RestoreTransactions` only from a tap, because a launch-time restore shows an Apple sign-in prompt, and it ends in "restored" or "nothing to restore". App Review always taps Restore; one game's only fetched purchases and spun for 45 s.
34
+ 4. Show prices only from the store's localised string. Failure text is plain; a cancel says nothing.
35
+ 5. Grant a pending order exactly once (`iap_pending_once`). Unity IAP 5 routes pending orders to `OnPurchasePending`; a shared purchase service granted them again from the fetch too, until the fix of 7 Oct (it now grants once per transaction). A game built before it needs a new build.
39
36
  6. Buy end to end before review. Products never load on the Simulator without a StoreKit configuration, and no game bought an IAP end to end before submitting; a person checks IAP and Restore on a device.
40
- 7. Derive App Privacy from the SDKs linked (`store lint`: declared ⊇ collected). With `com.joydle.firebase` the games declare Device ID, Coarse Location, Product Interaction and Crash Data, plus Purchase History where there is an IAP: not linked, no tracking, no tracking prompt (the package turns off the advertising identifier). A person enters them.
37
+ 7. Derive App Privacy from the SDKs linked (`store lint`: declared ⊇ collected). With Firebase Analytics and Crashlytics the games declare Device ID, Coarse Location, Product Interaction and Crash Data, plus Purchase History where there is an IAP: not linked, no tracking, no tracking prompt (with the advertising identifier turned off). A person enters them.
41
38
  8. Pick the icon small. 1024×1024 RGB, no alpha (check with `sips`); one big idea, judged at 60 and 40 px against competitors. Make candidates with `npx @funpixel/tools gen image "<the idea>" --size 1024x1024 --out design/icons/` (metered, after `npx @funpixel/tools login`; a generator's default may be 9:16); the pick goes to `Assets/_Game/Art/Icon/app_icon.png`.
42
39
  9. Compose 5–8 screenshots at 6.9": 1320×2868 portrait or 2868×1320 landscape, from real captures taken at game-state markers in the log. `store_shots` passes when sizes are exact, the real HUD is visible, no tutorial UI shows and each caption is true of its frame. How capture bursts are taken: not in the report.
43
40
  10. Validate any video before it is shared or uploaded. `recording_check`: 0 frame gaps over 34 ms, audio ≥ 44.1 kHz. `preview_validate`: 15–30 s, ≤ 30 fps, bt709 tags, square pixels, AAC ≤ 256 kb/s; after upload, `previewImage.width > 0`.
@@ -47,12 +44,12 @@ Rejections by guideline, what 1.0 sold and the ad plan: `purchases-and-review.md
47
44
 
48
45
  ## Worked example
49
46
 
50
- Pocket Crew's App Preview: 25 s, 1920×886, cuts about every 1.5 s. App Store Connect showed a red "!" on it twice. The causes were an sRGB colour tag where bt709 is required, non-square pixels, and audio at 263 kb/s against the 256 cap. Setting the poster time through the API then made the preview image 0×0. What held: validate with `ffprobe`, upload, read back `previewImage.width > 0`, leave the poster frame alone.
47
+ One game's App Preview: 25 s, 1920×886, cuts about every 1.5 s. App Store Connect showed a red "!" on it twice. The causes were an sRGB colour tag where bt709 is required, non-square pixels, and audio at 263 kb/s against the 256 cap. Setting the poster time through the API then made the preview image 0×0. What held: validate with `ffprobe`, upload, read back `previewImage.width > 0`, leave the poster frame alone.
51
48
 
52
49
  ## Common mistakes
53
50
 
54
- - Resubmitting fast instead of linting first: Dead Letter, Scrap Riot and Noodle Nights each went back to "Waiting for Review" for over a week.
55
- - Icons by prompt alone: Dawg Ball spent $21.46 over 7 rounds before a pick, round one at 720×1280 from the 9:16 default, no competitor benchmark until round 4. The Hot Gates' bake-off cost $5.95.
51
+ - Resubmitting fast instead of linting first: three games each went back to "Waiting for Review" for over a week.
52
+ - Icons by prompt alone: one game spent $21.46 over 7 rounds before a pick, round one at 720×1280 from the 9:16 default, no competitor benchmark until round 4. Another's bake-off cost $5.95.
56
53
  - A Restore label whose hit area covers the shop card: taps on products showed "Restoring purchases" in four games.
57
54
  - "Data Not Collected" left in the docs after Firebase shipped in all games.
58
- - A Simulator recording shown before it was measured: The Hot Gates' `simctl recordVideo` clip had 19 gaps up to 0.85 s and 24 kHz audio.
55
+ - A Simulator recording shown before it was measured: one game's `simctl recordVideo` clip had 19 gaps up to 0.85 s and 24 kHz audio.
@@ -1,20 +1,17 @@
1
1
  ---
2
2
  name: funpixel-unity-game
3
- description: Use when making a game in Unity (new from the starter, a port of a web game, a clone of a sibling), measuring or improving its frame time, memory, battery, load time or size, or running several agents on Unity projects on one Mac. Covers the studio's packages, rules in C# tested outside the Editor, settings by script, launch flags, parity, player-side probes and Simulator leases.
3
+ description: Use when making a game in Unity (new from the starter, a port of a web game, a clone of a sibling), measuring or improving its frame time, memory, battery, load time or size, or running several agents on Unity projects on one Mac. Covers rules in C# tested outside the Editor, settings by script, launch flags, parity, player-side probes and Simulator leases.
4
4
  ---
5
5
 
6
6
  # Making a game in Unity
7
7
 
8
8
  Games rebuilt from web builds played end to end 2 hours after kickoff. What goes wrong is silent:
9
9
  all four first games reached TestFlight with no sound, cloned projects inherited a sibling's
10
- settings, and Simulator timings measured the host. This skill starts a game on the studio's
11
- packages when it uses them, makes the rest a failed check at scaffold, and routes the measuring and
12
- the shared Mac to their references.
10
+ settings, and Simulator timings measured the host. This skill makes each of these a failed check
11
+ at scaffold, and routes the measuring and the shared Mac to their references.
13
12
 
14
13
  ## Tools
15
14
 
16
- - The studio's packages, `com.joydle.core` and `com.joydle.firebase`, are optional (Floe Jam uses
17
- neither): adding them and what each settles, `references/studio-packages.md`.
18
15
  - `funtools gen <kind> "…" --unity .` (after `funtools login`): pictures, sounds, music and models
19
16
  into `Assets/_Game/Generated/` with import settings, metered; never a provider call with a `.env` key.
20
17
  - `funtools unity run -- -nographics -executeMethod Setup.Configure`: your editor script, queued
@@ -43,41 +40,38 @@ the shared Mac to their references.
43
40
  landscape), devices (a phone game: iPhone only for 1.0, oldest iPhone 11 at a locked
44
41
  60 fps), the business model (skill `funpixel-store`, `references/money.md`), a content
45
42
  minimum, which visual elements carry rules, and the name on the App Store. Targets: iOS
46
- first, Android (`BuildTools.Android`); WebGL without Firebase, whose C++ SDK has no web build
47
- (Floe Jam: `unity/build.sh webgl`); Mac and Windows by the game's own build methods (Knockout Lap).
48
- 3. Add what the game uses: the studio packages if any, Input System 1.20.0, uGUI 2.6.0, URP 17.6.0
49
- unless it stays built-in (Floe Jam), glTFast 6.20.0 for 3D ("latest" was an
43
+ first, Android; WebGL without Firebase, whose C++ SDK has no web build; Mac and Windows by the
44
+ game's own build methods.
45
+ 3. Add what the game uses: Input System 1.20.0, uGUI 2.6.0, URP 17.6.0
46
+ unless it stays built-in, glTFast 6.20.0 for 3D ("latest" was an
50
47
  experimental 7.0). Remove collab-proxy, learn and visual scripting. Import TMP Essential
51
48
  Resources.
52
49
  4. Lay out `Assets/_Game/` as `Scripts/Core`, `Scripts/Game`, `Editor`, `Tests/Editor` (or
53
50
  `Tests/EditMode`), `Art`, `Fonts`, `Scenes`, plus `design/`, `store/` and a README. The rules go
54
51
  in `Scripts/Core`, an asmdef with `noEngineReferences: true`; the rest stays in Assembly-CSharp
55
- (the monorepo games) or splits into Game, View and World asmdefs (Knockout Lap). Add `CoreTests~`
52
+ (the monorepo games) or splits into Game, View and World asmdefs. Add `CoreTests~`
56
53
  for `dotnet test` and un-ignore its project (`!**/CoreTests~/*.csproj`): the root `.gitignore`
57
- drops every `*.csproj`. Play Mode tests get an asmdef of their own (Floe Jam's `Tests/Play`).
54
+ drops every `*.csproj`. Play Mode tests get an asmdef of their own (`Tests/Play`).
58
55
  5. Generate the one scene from code: a camera and one `GameDriver` (input, sim, each event to every
59
- presenter once, render), so agents rebuild it headless and never conflict on a scene. `Sfx.Create(music)`
60
- adds the AudioListener a code-made camera lacks; hold `audio_runtime`: 1
56
+ presenter once, render), so agents rebuild it headless and never conflict on a scene. Add the
57
+ AudioListener a code-made camera lacks; hold `audio_runtime`: 1
61
58
  listener, 48 kHz, music within 3 s (of the splash's end, if one plays).
62
- 6. Set every setting in `Setup.Configure`: `ProjectConfig.ApplyIOS(name, bundleId, "1.0.0",
63
- landscape)` and `ApplyAndroid(bundleId)` with the package (else set what they set), then colour
59
+ 6. Set every setting in `Setup.Configure`: company name, bundle id, version, IL2CPP, a fixed
60
+ orientation, Unity splash off, the Android API levels and ARM64, then colour
64
61
  space, 48 kHz audio, render scale 1, ProMotion, accelerometer off, physics auto-simulation off with
65
- your own sim, and `ProjectSettings/JoydleLz4hc.txt` for LZ4HC. Build through it. Keep a per-game manifest
62
+ your own sim, and LZ4HC compression. Build through it. Keep a per-game manifest
66
63
  (orientation, bundle id, colour space, a unique productGUID, audio on, render scale) to diff against.
67
64
  7. Register the bundle id, the profile and (with Firebase) one Firebase project per game at scaffold; agents may,
68
65
  with approval (who does what: funpixel-store).
69
66
  8. Add dev-only launch flags for every screen and state, `-tour`, `-smoke` (plays to an ending, writes
70
- `smoke.txt`) and the probe (`unity probe install`), read through one wrapper over `LaunchArgs.Get()` that returns nothing
71
- unless `Debug.isDebugBuild` (on iOS the package does not gate them), with `Telemetry.Muted` set
67
+ `smoke.txt`) and the probe (`unity probe install`), read through one wrapper that returns nothing
68
+ unless `Debug.isDebugBuild`, with analytics muted
72
69
  while a flag is on. Keep flag names apart from save keys: `-coins` shadows the PlayerPrefs key
73
70
  `coins`. Judged frames: `references/traps.md`.
74
- 9. With the package, wire its pieces switched off: `IapService` with the catalog (Buy and Restore in
75
- Settings from the first build), `Ads.CreateDefault` (none in release), a `.storekit` file for Xcode runs.
76
- 10. Never make a splash or a "Funpixel presents" card. With a studio splash package (today Joydle
77
- Core's `JoydleSplash`), wire it on day one: the opt-in asset `Assets/_Game/Resources/JoydleSplashOn.txt`;
78
- it plays before the first scene holding the game's audio, skipped in the Editor and on any `-flag`
79
- (`-splash` forces it); title music waits on `JoydleSplash.Playing`; credits name that studio.
80
- 11. Plug content in through a registry, so parallel agents add files: Pocket Crew's branches
71
+ 9. Wire purchases and ads switched off: the catalog with Buy and Restore in
72
+ Settings from the first build, no ads in release, a `.storekit` file for Xcode runs.
73
+ 10. Never make a splash or a "Funpixel presents" card.
74
+ 11. Plug content in through a registry, so parallel agents add files: one game's branches
81
75
  without one cost 43 hand-resolved merge hunks.
82
76
  12. Give each agent its own worktree and Simulator; one Editor per project, closed by its
83
77
  opener (`references/agent-ops.md`).
@@ -94,17 +88,16 @@ Other day-one rules:
94
88
 
95
89
  ## Worked example
96
90
 
97
- Koi Out, a new 2D puzzle game (URP 2D, Linear, portrait):
91
+ A new 2D puzzle game (URP 2D, Linear, portrait):
98
92
  Playable on the Simulator in about 1.5 hours; 600 levels by reverse removal, solvable by
99
- construction, 29 tests. The first TestFlight on day 1 was silent (no AudioListener, fixed once in
100
- `Sfx`), and its `-setcoins` flag worked in release builds (no dev gate, step 8).
93
+ construction, 29 tests. The first TestFlight on day 1 was silent (no AudioListener), and its `-setcoins` flag worked in release builds (no dev gate, step 8).
101
94
 
102
95
  ## Common mistakes
103
96
 
104
- - Cloning a sibling: Dawg Ball and Pocket Crew launched in portrait, Dead Letter inherited
105
- `m_DisableAudio: 1`, and Particle Rush still carries The Hot Gates' `.gitattributes` paths.
106
- - URP `m_RenderScale: 0.8`: Dawg Ball drew soft.
107
- - Writing again what the packages give, or patching one game's copy.
108
- - Ungated debug flags: `-lgr-unlocked` granted paid floors in Scrap Riot's release build.
109
- - Rebuilding a web game from its design doc instead of its shipped code: Scrap Riot's improvised
97
+ - Cloning a sibling: two games launched in portrait, one inherited
98
+ `m_DisableAudio: 1`, and one still carries a sibling's `.gitattributes` paths.
99
+ - URP `m_RenderScale: 0.8`: one game drew soft.
100
+ - Patching one game's copy of shared code instead of the shared package.
101
+ - Ungated debug flags: an unlock flag granted paid floors in one game's release build.
102
+ - Rebuilding a web game from its design doc instead of its shipped code: one port's improvised
110
103
  fixes were torn out (`references/from-a-web-game.md`).
@@ -1,6 +1,6 @@
1
1
  # Several agents on one Mac
2
2
 
3
- Unity allows one Editor per project and every game here was built on one Mac with no CI, so parallel agents share a lock, the Simulators and the host's load. When they also shared a Simulator or scratch folder, runs were invalidated. When liveness meant "the process exists", a performance agent on The Hot Gates sat idle about 8 hours overnight. This skill gives each agent its own resources and makes progress measurable.
3
+ Unity allows one Editor per project and every game here was built on one Mac with no CI, so parallel agents share a lock, the Simulators and the host's load. When they also shared a Simulator or scratch folder, runs were invalidated. When liveness meant "the process exists", a performance agent on one game sat idle about 8 hours overnight. This skill gives each agent its own resources and makes progress measurable.
4
4
 
5
5
  ## Tools
6
6
 
@@ -26,29 +26,29 @@ build: `handing-off.md`.
26
26
 
27
27
  1. Claim four things before the first build: a worktree, a leased Simulator, a remote-play port and a scratch folder. `sim_isolation` passes when the Simulator id, port and folder are unique per agent.
28
28
  2. Send every batch run through `funtools unity run`, and run the engine-free tests between them. One batch run (1–2 min) per project serialised parallel agents, and a half-written file broke other agents' compiles until each had its own build folder.
29
- 3. One Editor per project, opened by the agent that needs it (`--open`, with the bridge) and closed by it (`funtools unity editor close`), never by another. With none open, batch through the queue. MCP for Unity got 0 calls in 29 sessions under a no-Editor rule: no `.mcp.json`, `settings.local.json` disables it, only Koi Out lists `com.coplaydev.unity-mcp` (unpinned, `#main`).
29
+ 3. One Editor per project, opened by the agent that needs it (`--open`, with the bridge) and closed by it (`funtools unity editor close`), never by another. With none open, batch through the queue. MCP for Unity got 0 calls in 29 sessions under a no-Editor rule: no `.mcp.json`, `settings.local.json` disables it, only one game lists `com.coplaydev.unity-mcp` (unpinned, `#main`).
30
30
  4. Run anything over a minute in the background. Background agents stalled on the 600 s stream watchdog during foreground Unity and Xcode steps. Read the whole output; `| tail` hid a failing compile check and a commit went through.
31
31
  5. Judge a running agent by progress (`agent_liveness`): files under the game changed in the last 30 minutes, or a Unity or `xcodebuild` process at work.
32
32
  6. Expect host load to change results. Parallel sessions caused a Burst timeout in one export and slowed another session's 363-test suite from 10–15 to about 27 minutes, so read export logs before trusting a build made under load.
33
33
  7. Stage by path. A broad commit glob staged another session's 18 files. Keep `git stash pop` and pattern `pkill` out of agent scripts; both hit work that was not the agent's (see Common mistakes).
34
34
  8. Commit and push as work lands, and keep nothing in scratch or /tmp. `lfs_audit` passes at 0 tracked binaries over 500 KB outside LFS, 0 untracked paid art and 0 unpushed LFS objects; about 840 MB of paid generations lived on one Mac.
35
35
  9. Publish status at milestones, merged, with the session id on every entry: a network drop killed three sessions and nobody knew which was which. The owner asked "where we are? what's left? how long?" every 20–60 minutes in long sessions; answer from a tracker updated by tools (step, status, who, clock time), not memory.
36
- 10. Sync before saying it is synced. The owner asked "did you sync to remote?" on Dawg Ball, The Hot Gates and Scrap Riot. Push after green checks, rewrite status sections from repo state, and run a docs-freshness check at the end of each task.
36
+ 10. Sync before saying it is synced. The owner asked "did you sync to remote?" on three games. Push after green checks, rewrite status sections from repo state, and run a docs-freshness check at the end of each task.
37
37
  11. Show nothing unverified: `ffprobe` gaps = 0 before sharing a video, and read a published page back. After a change, show the real draw path with the real HUD at full resolution, the player log's exception count, before and after numbers, and the all-screens sheet for UI work; never the Scene view.
38
- 12. After each change, sweep for leftovers: a workaround, a dead flag, a comment that says `(was …`, a date or "the owner". The owner on Dawg Ball: "no workarounds, remove all leftovers". Never delete an "unused" asset unasked: an agent deleted 20 files the game loads by name.
39
- 13. End a report with at most 3 numbered decisions, each with options, a default, and a picture when it is visual. The owner on Dawg Ball: "What actually you're asking me now?"
38
+ 12. After each change, sweep for leftovers: a workaround, a dead flag, a comment that says `(was …`, a date or "the owner". The owner: "no workarounds, remove all leftovers". Never delete an "unused" asset unasked: an agent deleted 20 files the game loads by name.
39
+ 13. End a report with at most 3 numbered decisions, each with options, a default, and a picture when it is visual. The owner: "What actually you're asking me now?"
40
40
  14. At hand-back, stop what you started (`agent_hygiene`): `funtools sim release` each lease, then your Unity batch processes, child processes and monitors, and only your own. Never quit Simulator.app or run `xcrun simctl shutdown all`.
41
41
 
42
42
  ## Worked example
43
43
 
44
- The Hot Gates performance pass, overnight. The agent stalled twice on the stream watchdog and then sat about 8 hours idle; its login had expired. The heartbeat only checked that the agent existed. The probe that would have caught it is `find -mmin -30` under the game folder plus `pgrep Unity|xcodebuild`: no changed file and no build process for 30 minutes means stalled.
44
+ One game's performance pass, overnight. The agent stalled twice on the stream watchdog and then sat about 8 hours idle; its login had expired. The heartbeat only checked that the agent existed. The probe that would have caught it is `find -mmin -30` under the game folder plus `pgrep Unity|xcodebuild`: no changed file and no build process for 30 minutes means stalled.
45
45
 
46
46
  ## Common mistakes
47
47
 
48
- - Sharing a Simulator or scratch folder (Scrap Riot, Pocket Crew): invalidated runs, a tap in another agent's app, an install that killed the coordinator's remote-play session; quitting Simulator.app or `shutdown all` killed other agents' runs three times (Knockout Lap).
48
+ - Sharing a Simulator or scratch folder: invalidated runs, a tap in another agent's app, an install that killed the coordinator's remote-play session; quitting Simulator.app or `shutdown all` killed other agents' runs three times.
49
49
  - A repo-wide status Stop hook (studio-wide): it forced a publish on every turn, fired on other sessions' files, hit the 200/day publish cap; the agent could not edit its own settings.
50
- - `git stash pop` in a script (Dead Letter seam fix, 30 Sep): an unquoted zsh `$FILES` stashed nothing, and the pop applied and dropped a stash that was not the agent's.
50
+ - `git stash pop` in a script (a seam fix, 30 Sep): an unquoted zsh `$FILES` stashed nothing, and the pop applied and dropped a stash that was not the agent's.
51
51
  - `pkill -f` by pattern (Atlas session, 4 Oct): it killed other agents' runs.
52
- - Uncommitted work: The Hot Gates port lived 11+ hours uncommitted, and 79 files of a size pass were nearly lost.
52
+ - Uncommitted work: one port lived 11+ hours uncommitted, and 79 files of a size pass were nearly lost.
53
53
  - Infrastructure in /tmp: a restart wiped a Caddy config and build 22 shipped pointing at a dead tunnel.
54
54
  - Simulators left running: 5 at about 200% CPU, and a stale app ran 8.8 hours.
@@ -5,36 +5,36 @@ From the Unity field report, sections 3 (lighting and materials), 6 (post-proces
5
5
 
6
6
  ## Fixes, before and after
7
7
 
8
- | Fix | Before → after | Game |
9
- |---|---|---|
10
- | Split GLBs, ASTC for model textures | data 315 → 61 MB (app 386 → 106 MB with the size settings) | Noodle Nights |
11
- | Size settings (stripping High, engine stripping, IL2CPP OptimizeSize) | engine 66–69 → 40–42 MB | all |
12
- | LZ4HC player data (about 25 minutes of work) | 126 → 94 MB installed | The Hot Gates |
13
- | Shaders, pipeline states and the Vase grab warmed on the first frames | worst frame of the tide 249 → 18.6 ms | The Hot Gates |
14
- | A throwaway run prewarmed behind the title | Play tap 87 → 1.9 ms | The Hot Gates |
15
- | Glyph warm-up | 183–266 ms (Dawg Ball), 50–270 ms (Pocket Crew) → 17–20 ms first use | Dawg Ball, Pocket Crew |
16
- | No world drawn behind opaque menus; menus at 30 fps | 759 M → 0 3D px/s; CPU 94 → 32 ms/s; GC 52 → 2.4 KB/s | Dawg Ball |
17
- | A blur that stopped re-rendering the world (it did 20 times a second) | about a third of all draws gone | Pocket Crew |
18
- | Instanced sets culled, cheap shadow proxies, far LODs | World 1 376–448k → 116–224k triangles | Pocket Crew |
19
- | The next level built while a menu is up; every level warmed | 82–99 ms (and 398 ms) → under 34 ms | Pocket Crew |
20
- | A quality governor that judges the median of 90 frames, not the mean | one hitch no longer drops a resolution rung | The Hot Gates |
8
+ | Fix | Before → after |
9
+ |---|---|
10
+ | Split GLBs, ASTC for model textures | data 315 → 61 MB (app 386 → 106 MB with the size settings) |
11
+ | Size settings (stripping High, engine stripping, IL2CPP OptimizeSize, every game) | engine 66–69 → 40–42 MB |
12
+ | LZ4HC player data (about 25 minutes of work) | 126 → 94 MB installed |
13
+ | Shaders, pipeline states and the Vase grab warmed on the first frames | worst frame of the tide 249 → 18.6 ms |
14
+ | A throwaway run prewarmed behind the title | Play tap 87 → 1.9 ms |
15
+ | Glyph warm-up | 183–266 ms (one game), 50–270 ms (another) → 17–20 ms first use |
16
+ | No world drawn behind opaque menus; menus at 30 fps | 759 M → 0 3D px/s; CPU 94 → 32 ms/s; GC 52 → 2.4 KB/s |
17
+ | A blur that stopped re-rendering the world (it did 20 times a second) | about a third of all draws gone |
18
+ | Instanced sets culled, cheap shadow proxies, far LODs | World 1 376–448k → 116–224k triangles |
19
+ | The next level built while a menu is up; every level warmed | 82–99 ms (and 398 ms) → under 34 ms |
20
+ | A quality governor that judges the median of 90 frames, not the mean | one hitch no longer drops a resolution rung |
21
21
 
22
22
  ## The phone pipeline the games used
23
23
 
24
24
  - No light probes or lightmaps in any game; mostly unlit or emissive materials.
25
- - The Hot Gates' phone pipeline: no realtime shadows, MSAA 4×, HDR off, SRP Batcher on.
26
- Post-processing is off on The Hot Gates and Dawg Ball.
27
- - Noodle Nights keeps bloom and ACES tone mapping in a night volume: an emissive strength of 3.5 blew
25
+ - One game's phone pipeline: no realtime shadows, MSAA 4×, HDR off, SRP Batcher on.
26
+ Post-processing is off on it and on another.
27
+ - One game keeps bloom and ACES tone mapping in a night volume: an emissive strength of 3.5 blew
28
28
  the bloom out (down to 2.2), and the HDR glow washed out the price text.
29
- - Scrap Riot's URP bloom and depth-of-field shaders were found stripped from its builds: check a
29
+ - One game's URP bloom and depth-of-field shaders were found stripped from its builds: check a
30
30
  post effect in the player build, not the Editor.
31
- - Pocket Crew carries three.js's physical shading over in HLSL with quality tiers that drop shadows and
31
+ - One port carries three.js's physical shading over in HLSL with quality tiers that drop shadows and
32
32
  render scale on a hot or Low Power phone. Shed load through render scale, never MSAA (step 7).
33
33
  - No millisecond cost of any post effect was measured on a device.
34
34
 
35
35
  ## Load
36
36
 
37
- Boot to title 0.32 s (The Hot Gates); title interactive in 0.22 s and floor 1 playable 3.0 s after
38
- launch (Scrap Riot). About 14 MB of textures still load synchronously at boot in Scrap Riot, which
39
- uses no Addressables (Gallery Heist's views branch loads each room through them). A lobby frame of 50 ms went once each screen's textures were preloaded
37
+ Boot to title 0.32 s (one game); title interactive in 0.22 s and floor 1 playable 3.0 s after
38
+ launch (another). About 14 MB of textures still load synchronously at boot in the second, which
39
+ uses no Addressables (a third game's views branch loads each room through them). A lobby frame of 50 ms went once each screen's textures were preloaded
40
40
  while loading. Memory measured 117–174 MB in use; there is no memory budget yet.
@@ -1,9 +1,9 @@
1
1
  # A Unity game from a web game
2
2
 
3
3
  Five of the nine Unity games started as Funpixel web games (Pixi or three.js) and were rebuilt in
4
- Unity. That rebuild is hours of work when it has a fixed contract. The Hot Gates and Pocket Crew
4
+ Unity. That rebuild is hours of work when it has a fixed contract. Two of them
5
5
  each had a bit-exact C# core checked against golden traces recorded from the web sim, and both
6
- played end to end on the Simulator about 2 hours after kickoff. Scrap Riot had a moving spec: it
6
+ played end to end on the Simulator about 2 hours after kickoff. A third had a moving spec: it
7
7
  logged 85 entries in its iOS phase, agents built seven fixes from one-line descriptions, and their
8
8
  versions were torn out when the web game's author shipped different code. This page keeps the
9
9
  rebuild on the contract: shipped web code, goldens and `parity.md`. Field report sections 0, 1, 2
@@ -35,13 +35,13 @@ and 10, and its dead ends.
35
35
  the web sim under node, and capture reference frames of the web game at phone sizes. The
36
36
  project adds `design/web-ref` and `parity.md`.
37
37
  2. Fix the content minimum before the rebuild. The owner asked for "at least 5 different levels":
38
- Dead Letter grew from 1 letter to 5 in about 7 hours, Pocket Crew from 4 levels to 26.
38
+ one game grew from 1 letter to 5 in about 7 hours, another from 4 levels to 26.
39
39
  3. Fix colour space on day one to match the source renderer. Pixi and three.js without a linear
40
- composer blend in gamma: Dead Letter, Scrap Riot, Hot Gates and Dawg Ball are Gamma. Pocket
41
- Crew, whose web build used a linear composer, stays Linear.
40
+ composer blend in gamma: four of the ports are Gamma. The one whose web build used a linear
41
+ composer stays Linear.
42
42
  4. Rebuild the Core first, in an asmdef with `noEngineReferences: true`. Copy web numbers verbatim
43
- into `Scripts/Core/Config.cs`, carry every web test over 1:1 to NUnit (Scrap Riot 98 of 98
44
- cases), and load the web's level JSON from `Resources/Data`. Dead Letter's core had 229 tests
43
+ into `Scripts/Core/Config.cs`, carry every web test over 1:1 to NUnit (one port: 98 of 98
44
+ cases), and load the web's level JSON from `Resources/Data`. One port's core had 229 tests
45
45
  about 50 minutes after kickoff.
46
46
  5. Apply the determinism kit while writing it, because C# and V8 disagree silently:
47
47
 
@@ -58,7 +58,7 @@ and 10, and its dead ends.
58
58
  `DateTime.Now` outside the shims; until it exists, search for them.
59
59
  6. Replay the goldens. Pass is 0 diffs at zero tolerance, and the same hash under IL2CPP. Where the
60
60
  web's own math is not reproducible, bit-exact is not the rule: V8's libm (fdlibm `sin`, `log10`) is
61
- compiled with fused multiply-adds on arm64, which C# cannot match bit for bit. Particle Rush (Oct 2026)
61
+ compiled with fused multiply-adds on arm64, which C# cannot match bit for bit. One port (Oct 2026)
62
62
  compares at a relative tolerance of 1e-9 with identical events, frames and results (80 runs), and
63
63
  records it as a `parity.md` row.
64
64
  7. Record every deviation as a `parity.md` row and a default-off `Rules` flag, then check that
@@ -68,10 +68,10 @@ and 10, and its dead ends.
68
68
 
69
69
  | Reuse | What |
70
70
  |---|---|
71
- | As it is | sim rules, tests, tuning, level JSON (Pocket Crew: 1,515 numbers bit-identical), save formats (33 Scrap Riot fixtures loaded byte-identical), sprite art, audio clips, key art |
71
+ | As it is | sim rules, tests, tuning, level JSON (one port: 1,515 numbers bit-identical), save formats (33 fixtures of one port loaded byte-identical), sprite art, audio clips, key art |
72
72
  | After conversion | WebP to PNG; WOFF2 to TTF with full fonts; meshopt and WebP GLBs decoded; loops rebuilt as OGG at exact sample counts; Web Audio synths re-rendered offline in C# |
73
73
  | Redo | every view, HUD and menu (UGUI in code), input, haptics, app lifecycle, shaders, store art, icon, the IAP and economy layer |
74
- | No path yet | online play: the kit's relay client is the JavaScript SDK (`funpixel-game-spine`), with no C# client. The one online Unity game, Dawg Ball (branch `dawg-ball/online`), vendors LiteNetLib with its own `Server~` and `Api~` matchmaker |
74
+ | No path yet | online play: the kit's relay client is the JavaScript SDK (`funpixel-game-spine`), with no C# client. The one online Unity game vendors LiteNetLib with its own `Server~` and `Api~` matchmaker |
75
75
 
76
76
  9. Build the views in parallel behind the written APIs. One frame owner, `GameDriver`, runs
77
77
  input, `sim.Update(dt)`, each `SimEvent` to every presenter, then `Render(alpha)`, so every
@@ -82,7 +82,7 @@ and 10, and its dead ends.
82
82
 
83
83
  ## Worked example
84
84
 
85
- The Hot Gates, from three.js (about 20,000 lines) to URP 3D, Gamma, portrait:
85
+ A port from three.js (about 20,000 lines) to URP 3D, Gamma, portrait:
86
86
  1. A bit-exact core checked against goldens: seed 1 ended on the web's hash 1936916133.
87
87
  2. 358 core tests run with `dotnet test`.
88
88
  3. The web's 41 procedural audio cues were re-rendered offline in C#, correlation 0.999998
@@ -92,17 +92,17 @@ The Hot Gates, from three.js (about 20,000 lines) to URP 3D, Gamma, portrait:
92
92
 
93
93
  ## Common mistakes
94
94
 
95
- - Improvising fixes: Scrap Riot's agents built 8 props, a chain shockwave, a countdown, a
95
+ - Improvising fixes: one port's agents built 8 props, a chain shockwave, a countdown, a
96
96
  recolour and a 4 s PA delay that were torn out, and 3 of 6 earlier fixes were never re-audited
97
97
  and still differed from the web.
98
98
  - `Math.Round` in the Core: banker's rounding drew 2 sparks where the web drew 3 (game not in the
99
99
  report).
100
- - Tidying art that encodes a rule: an agent "cleaned up" Dawg Ball's goal sill, which held the
100
+ - Tidying art that encodes a rule: an agent "cleaned up" one game's goal sill, which held the
101
101
  balance up.
102
- - Linear colour space on a Pixi game: overlays about 2× too strong in Dead Letter until it
102
+ - Linear colour space on a Pixi game: overlays about 2× too strong in one game until it
103
103
  switched to Gamma.
104
104
  - Web MP3s as loops: they ran 1,245–1,997 samples long.
105
- - Importing a web GLB undecoded: glTFast imports it as nothing with no error; Dawg Ball's 12
105
+ - Importing a web GLB undecoded: glTFast imports it as nothing with no error; one game's 12
106
106
  heads "did not import at all".
107
- - A UI with its own catch-up loop: Dead Letter's seal pick never reached audio or FX.
108
- - An ignored `.csproj`: Dead Letter's tests could not run from a fresh clone.
107
+ - A UI with its own catch-up loop: One game's seal pick never reached audio or FX.
108
+ - An ignored `.csproj`: One game's tests could not run from a fresh clone.