@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,10 +1,10 @@
1
1
  # SPDX-License-Identifier: GPL-3.0-or-later
2
2
  """`bake_emissive` — make only the bright parts of a texture glow (plan b10).
3
3
 
4
- joydle's `prep_static.py` baked "an emissive mask from V or S·V smoothstep, so
4
+ One studio's prep script baked "an emissive mask from V or S·V smoothstep, so
5
5
  only neon, lanterns and windows glow" (research 12 §3 #13). A whole material
6
6
  set emissive glows everywhere, and a bloom pass then washes the model out —
7
- their night market also found that an emissive boost of 3.5 "blew out the
7
+ a night-market game also found that an emissive boost of 3.5 "blew out the
8
8
  bloom" (§2.1), which is why `strength` is capped on the Rust side.
9
9
 
10
10
  For each material whose base colour is an image: read the pixels, score each
@@ -2,7 +2,7 @@
2
2
  """`decimate` — bring a model down to a triangle budget (plan b10), or to a
3
3
  share of what it has (`ratio`, plan b8; `lod` chains it).
4
4
 
5
- WHY: what shipped on phones at joydle was 0.8–9K triangles per mesh (research
5
+ WHY: what shipped on phones in one studio's games was 0.8–9K triangles per mesh (research
6
6
  12 §2.3); fal's Hunyuan cannot go below 40K and a Pro mesh is often 300–450K
7
7
  (measured on the harness games' rigged characters). The budget is the
8
8
  caller's — this verb only meets it.
@@ -11,7 +11,7 @@ NEVER WELDS. The glTF importer splits a vertex wherever its UV changes, so a UV
11
11
  seam is an open boundary in Blender. Edge collapse cannot cross a boundary it
12
12
  is not connected to, so every UV island keeps its own UVs. Merging vertices
13
13
  first ("remove doubles") connects the islands, and the collapse then drags UVs
14
- across the seam: joydle lost about an hour to exactly that — the sign "RAMEN"
14
+ across the seam: one studio lost about an hour to exactly that — the sign "RAMEN"
15
15
  decimated to "RMEN" (research 12 §2.3.4; `funpixel-glb-optimize` refuses to
16
16
  weld for the same reason). `uv_split_vertices` is reported before and after so
17
17
  a caller can SEE that no seam was crossed: a vertex whose corners disagree on
@@ -1,7 +1,7 @@
1
1
  # SPDX-License-Identifier: GPL-3.0-or-later
2
2
  """`fracture` — pre-break a prop into Voronoi shards that keep their UVs (b10).
3
3
 
4
- joydle's Porcelain Panic smashed pre-fractured pieces, and `blender_prep.py`
4
+ One studio's smashing game broke pre-fractured pieces, and its prep script
5
5
  did it this way (research 12 §3 #12): seeds inside the bounds, one cell per
6
6
  seed, each cell cut out of the whole mesh by repeated `bisect_plane` against
7
7
  every other seed, the cut holes filled — "so every shard carries its piece of
@@ -7,9 +7,9 @@ generator's GLB arrives with a root node carrying a scale, a rotation or an
7
7
  offset, an FBX in centimetres carries 0.01 on every object, and the origin sits
8
8
  wherever the tool left it. Physics, snapping to the floor and instancing all
9
9
  read the root transform, so each of those becomes the game's problem.
10
- joydle's `blender_prep.py` did exactly this before shipping ("normalise to unit
11
- height with the origin at the base"), and `prep_static.py` "fits one dimension
12
- in metres".
10
+ One studio's prep scripts did exactly this before shipping ("normalise to unit
11
+ height with the origin at the base"; another "fits one dimension
12
+ in metres").
13
13
 
14
14
  AFTERWARDS: every mesh has an identity transform, the model's lowest point sits
15
15
  on y = 0 (glTF) with its footprint centred on the origin, and if `height_m` was
@@ -43,12 +43,12 @@ def prepare(args, before_arrays=None):
43
43
  return model, cams, located_by, all_slots, texels.slot_lookup(model, all_slots)
44
44
 
45
45
 
46
- # Workbench's object outline colour in the dont-die renders (FID_OUTLINE).
46
+ # Workbench's object outline colour in the owner's fidelity renders (FID_OUTLINE).
47
47
  INK = np.array([0.07, 0.06, 0.05], dtype=np.float32)
48
48
 
49
49
 
50
50
  def _ink(model, tri, zbuf, size, rgb, alpha):
51
- """The ink look (dont-die FID_OUTLINE, Workbench's object outline): a one-pixel line where
51
+ """The ink look (FID_OUTLINE, Workbench's object outline): a one-pixel line where
52
52
  one object meets another or nothing, drawn on the FARTHER side — outside the silhouette,
53
53
  and behind a nearer object."""
54
54
  owner = np.where(tri >= 0, model.owner[np.maximum(tri, 0)], -1).reshape(size, size)
@@ -23,10 +23,10 @@ VIEW_SETS = {
23
23
  }
24
24
  # `fidelity`: the model squared to its principal axes, from every side and three heights, in
25
25
  # both orientations about its long axis (glTF axis signs are ambiguous) — the renders a set of
26
- # reference views is scored against (funtools fidelity). Ported from the owner's dont-die tools
26
+ # reference views is scored against (funtools fidelity). Ported from the owner's fidelity tools
27
27
  # (tools/fidelity/render_views.py with FID_ALIGN and FID_FLIP, as called by score_round.py): orthographic, 8 yaws x 3 heights x 2 orientations = 48 views.
28
28
  FIDELITY_YAWS = (0, 45, 90, 135, 180, 225, 270, 315)
29
- # 89, not 90: straight down leaves "up" undefined; the dont-die renders used 89 too.
29
+ # 89, not 90: straight down leaves "up" undefined; the owner's renders used 89 too.
30
30
  FIDELITY_ELEVATIONS = (0, 25, 89)
31
31
  FIDELITY_ORIENTATIONS = ("n", "f") # as squared; rolled 180 degrees about the long axis
32
32
  FIDELITY_SIZE = 512
@@ -126,7 +126,7 @@ def _shape_points(model):
126
126
  def principal_axes(model, flip=False, roll=False):
127
127
  """Rows: the model's longest axis (new X, length), smallest (new Y, depth), middle (new Z,
128
128
  height), a right-handed frame; `flip` rolls it 180 degrees about the long axis, `roll` a
129
- further 90 (dont-die FID_ROLL: a model deeper than it is tall squares onto its side, because
129
+ further 90 (FID_ROLL: a model deeper than it is tall squares onto its side, because
130
130
  its middle axis is then not "up"). And the vertex centroid it turns about."""
131
131
  c = model.pos.mean(axis=0)
132
132
  _, v = np.linalg.eigh(np.cov((model.pos - c).T)) # ascending
@@ -142,11 +142,11 @@ def principal_axes(model, flip=False, roll=False):
142
142
 
143
143
 
144
144
  def fidelity_cameras(model, align=True, roll=False):
145
- """The `fidelity` set: each camera is placed round the SQUARED model exactly as the dont-die
145
+ """The `fidelity` set: each camera is placed round the SQUARED model exactly as the owner's
146
146
  renders were (yaw 0 looks along +Y of the squared frame, up is its +Z), then turned back into
147
147
  the model's own space, so the model itself is never moved.
148
148
 
149
- `align=False` (dont-die FID_ALIGN=0) keeps the model's own axes: for a model BUILT square to
149
+ `align=False` (FID_ALIGN=0) keeps the model's own axes: for a model BUILT square to
150
150
  them, which principal axes would tilt where its mass skews them (measured on the hand-built
151
151
  Corer, 10 Oct 2026). Its two orientations are the same picture, so it is 24 views, not 48."""
152
152
  out = []
@@ -158,7 +158,7 @@ def fidelity_cameras(model, align=True, roll=False):
158
158
  sq = (model.pos - c) @ r.T
159
159
  lo, hi = sq.min(axis=0), sq.max(axis=0)
160
160
  centre_sq = (lo + hi) / 2
161
- half = float(np.linalg.norm(hi - lo) / 2 * 1.1) # dont-die: ortho_scale = 2.2 x radius
161
+ half = float(np.linalg.norm(hi - lo) / 2 * 1.1) # as the owner's: ortho_scale = 2.2 x radius
162
162
  for elev in FIDELITY_ELEVATIONS:
163
163
  for yaw in FIDELITY_YAWS:
164
164
  ay, ae = np.radians(yaw), np.radians(elev)
package/dist/cli.js CHANGED
@@ -269,7 +269,7 @@ export const USAGE = `usage:
269
269
  | progress ask "<question>" --kind taste|spend|scope --options a,b [--default a] [--timeout 10m]
270
270
  | progress answer <Q> <option> ["words"] | progress wait [Q] [--for 15m] | progress report
271
271
  [--dir game] [--json]
272
- funtools feedback collect <folder…> [--out report.md] [--propose] [--html page.html] [--no-seed] [--json]
272
+ funtools feedback collect <folder…> [--out report.md] [--propose] [--html page.html] [--json]
273
273
  funtools feedback log "<what happened>" [--kind step|test|dead-end|lesson|decision|worked|didnt|owner]
274
274
  [--metric name --before n --after n --unit u] [--evidence path] [--film path] [--sha commit]
275
275
  [--test name] [--cost-usd n] [--minutes n] [--minutes-lost n] [--tool name] [--stage s]
@@ -413,10 +413,10 @@ export const USAGE = `usage:
413
413
  (one table: Shader.WarmupAllShaders on URP, UnityEngine.Input on the Input System
414
414
  only, -quit with -runTests…); a Shader.Find nothing references; GLBs glTFast cannot
415
415
  decode (meshopt, Basis, WebP); ProjectSettings drifted from the project's own setup
416
- method; the fixes the studio's history repeated (48 kHz, Unity audio switched off,
416
+ method; the fixes past builds repeated (48 kHz, Unity audio switched off,
417
417
  mipmapped NPOT and uncompressed textures with their MB, .meta files an import rule
418
418
  rewrites, a productGUID, metroPackageName or .gitattributes cloned from another project
419
- on this Mac, which branch and commit each file: studio package compiles, Firebase on the
419
+ on this Mac, which branch and commit each file: shared package compiles, Firebase on the
420
420
  Simulator, ungated launch flags, EditorApplication.Exit outside batch mode, the
421
421
  netstandard guard, IL2CPP numbers, Simulator UDIDs typed into scripts), each a warn or
422
422
  a note with its fix but a build that plays no sound; then this Mac: the Editor and the
@@ -1192,9 +1192,8 @@ export const USAGE = `usage:
1192
1192
  notes outrank any agent claim), what worked by its measured change (--before/--after, or
1193
1193
  "34 -> 25.5 ms" in the words; a lesson that says it fixed something counts), each entry's
1194
1194
  evidence checked to exist (a file, a commit, a test; else unverified), dead ends by the
1195
- hours they burned, cost and time per game, and A/B records (.funtools/ab.jsonl and the
1196
- kit's seed: Gallery Heist and Blue Freight, 1 Oct; --no-seed leaves them out) as "GDK lost
1197
- level design by 1.8 in 1 of 2". --propose drafts one kit edit per top recurring lesson;
1195
+ hours they burned, cost and time per game, and A/B records (.funtools/ab.jsonl) as "GDK
1196
+ lost level design by 1.8 in 1 of 2". --propose drafts one kit edit per top recurring lesson;
1198
1197
  --html writes one page with filters. \`ab\` records an A/B; \`merged\` writes the merge
1199
1198
  commit as a worked entry with the numbers the tools logged since its merge base (sim,
1200
1199
  play, hook, life, profile and playtest log theirs as measure lines on their own)
@@ -1452,7 +1451,7 @@ export const USAGE = `usage:
1452
1451
  and any name inside another (run / run_fast, idle / idle_long, walk / walkback),
1453
1452
  repeated or missing: a lookup by name can play the wrong clip
1454
1453
  exit 0 every name apart · 1 a collision · 2 no clips (not observed) · 3 error
1455
- fidelity how closely a 3D model matches its reference views, 0-100 each (the owner's dont-die
1454
+ fidelity how closely a 3D model matches its reference views, 0-100 each (the owner's
1456
1455
  scorer): silhouette 35%, palette 30% (ΔE), tonal structure 20%, ink lines 15%, each view
1457
1456
  against its best of the bench's 48 fixed cameras (8 yaws × 3 heights × both ways up),
1458
1457
  rendered on your own Blender 4.2+ (free) at the references' own size, or --renders <dir>.
@@ -1637,7 +1636,7 @@ export const SPECS = {
1637
1636
  feedback: {
1638
1637
  '--out': true, '--json': false, '--kind': true, '--cost-usd': true, '--minutes': true, '--evidence': true, '--dir': true,
1639
1638
  '--metric': true, '--before': true, '--after': true, '--unit': true, '--sha': true, '--film': true, '--test': true, '--minutes-lost': true,
1640
- '--tool': true, '--stage': true, '--verdict': true, '--screenshot': true, '--propose': false, '--html': true, '--no-seed': false,
1639
+ '--tool': true, '--stage': true, '--verdict': true, '--screenshot': true, '--propose': false, '--html': true,
1641
1640
  '--what': true, '--routes': true, '--overall': true, '--axes': true, '--winner': true, '--judges': true,
1642
1641
  },
1643
1642
  journal: { '--why': true, '--by': true, '--files': true, '--values': true, '--dir': true, '--json': false },
@@ -2377,7 +2376,7 @@ export async function main(argv, io = console) {
2377
2376
  metric: str(flags['--metric']), before: str(flags['--before']), after: str(flags['--after']), unit: str(flags['--unit']),
2378
2377
  sha: str(flags['--sha']), film: str(flags['--film']), test: str(flags['--test']), minutesLost: str(flags['--minutes-lost']),
2379
2378
  tool: str(flags['--tool']), stage: str(flags['--stage']), verdict: str(flags['--verdict']), screenshot: str(flags['--screenshot']),
2380
- propose: !!flags['--propose'], html: str(flags['--html']), seed: !flags['--no-seed'],
2379
+ propose: !!flags['--propose'], html: str(flags['--html']),
2381
2380
  what: str(flags['--what']), routes: str(flags['--routes']), overall: str(flags['--overall']), axes: str(flags['--axes']),
2382
2381
  winner: str(flags['--winner']), judges: str(flags['--judges']),
2383
2382
  }, io);
@@ -2,7 +2,7 @@ import { appendFileSync, existsSync, mkdirSync, readdirSync, readFileSync, statS
2
2
  import { basename, dirname, join, relative, resolve } from 'node:path';
3
3
  import { spawnSync } from 'node:child_process';
4
4
  import { EXIT } from "./verify.js";
5
- import { AB_SEED, parseAb } from "../feedback/ab.js";
5
+ import { parseAb } from "../feedback/ab.js";
6
6
  import { ledger, ledgerMarkdown, learnedOf, pipelineOwnerNotes, propose, proposalsMarkdown, rootOfLog } from "../feedback/learn.js";
7
7
  import { feedbackPage } from "../feedback/page.js";
8
8
  import { ui } from "../ui.js";
@@ -166,7 +166,7 @@ export function clauses(s) {
166
166
  const parts = s.text.split(/;\s*|\.\s+|,\s+|\s*\(|\)\s*/).map((t) => t.trim()).filter((t) => t.length > 2);
167
167
  return parts.length > 1 ? parts.map((text) => ({ ...s, text, quote: s.text })) : [s];
168
168
  }
169
- export function collect(dirs, opts = {}) {
169
+ export function collect(dirs) {
170
170
  const roots = dirs.map((d) => resolve(d));
171
171
  const files = [...new Set(roots.flatMap((d) => (statSync(d).isFile() ? [d] : findLogs(d))))].sort();
172
172
  const shown = (f) => {
@@ -179,7 +179,7 @@ export function collect(dirs, opts = {}) {
179
179
  const learned = [];
180
180
  const learnedSeen = new Set();
181
181
  const gameRoots = new Map();
182
- const ab = opts.seed === false ? [] : [...AB_SEED];
182
+ const ab = [];
183
183
  const evCache = new Map();
184
184
  for (const file of files) {
185
185
  const g = gameOf(file);
@@ -378,7 +378,7 @@ export async function feedbackAb(opts, io = console, now = () => new Date()) {
378
378
  const game = opts.text?.trim();
379
379
  const routes = (opts.routes ?? '').split(',').map((r) => r.trim()).filter(Boolean);
380
380
  if (!game || routes.length < 2) {
381
- u.error('an A/B names the game and two routes', 'funtools feedback ab "Gallery Heist" --routes gdk,non-gdk --overall 7.0,8.0 --axes "story=7.0/8.7,fun=7.4/7.7" --winner non-gdk --judges "3 blind seats"');
381
+ u.error('an A/B names the game and two routes', 'funtools feedback ab "My Game" --routes gdk,non-gdk --overall 7.0,8.0 --axes "story=7.0/8.7,fun=7.4/7.7" --winner non-gdk --judges "3 blind seats"');
382
382
  return EXIT.error;
383
383
  }
384
384
  const overall = (opts.overall ?? '').split(',').map((x) => (x.trim() ? Number(x) : null));
@@ -471,7 +471,7 @@ export async function feedback(opts, io = console) {
471
471
  u.error(`no such folder: ${missing.join(', ')}`, 'give the folders that hold the games');
472
472
  return EXIT.error;
473
473
  }
474
- const c = collect(dirs, { seed: opts.seed });
474
+ const c = collect(dirs);
475
475
  const proposals = opts.propose || opts.html ? propose(c.ledger) : [];
476
476
  if (opts.html) {
477
477
  writeFileSync(opts.html, feedbackPage(c.ledger, c.rows, proposals));
@@ -45,7 +45,7 @@ const CHECKS = {
45
45
  { mechanic: 'a flare or the clock ends the round lost', verb: 'loseRound', field: 'losses', expect: 'increases', times: 1 },
46
46
  ],
47
47
  };
48
- const SDK_VERSION = '0.6.0';
48
+ const SDK_VERSION = '0.7.0';
49
49
  const slug = (s) => s.toLowerCase().replace(/[^a-z0-9]+/g, '-').replace(/^-|-$/g, '') || 'game';
50
50
  export async function renderTree(from, vars, rel = '', out = {}) {
51
51
  for (const e of await readdir(join(from, rel), { withFileTypes: true })) {
@@ -17,7 +17,7 @@ export const READ_CAMERA_JS = `(() => { try {
17
17
  let room = null;
18
18
  try { const T3 = W.THREE; if (T3 && scene && d) { const rc = new T3.Raycaster(); const free = (dir) => { rc.set(p, dir); rc.far = 200; const hit = rc.intersectObjects(scene.children, true).find((h) => h.object && h.object.isMesh && h.object.visible); return hit ? hit.distance : null; };
19
19
  // Behind: the frustum's centre and its four edges cast backwards, each hit projected on the view axis (a wall with a
20
- // doorway on the axis still frames the shot, so the centre ray alone overstates the room; Gallery Heist's vestibule).
20
+ // doorway on the axis still frames the shot, so the centre ray alone overstates the room; one game's vestibule).
21
21
  const back = d.clone().negate(), up = new T3.Vector3(0, 1, 0), right = new T3.Vector3().crossVectors(d, up).normalize(), up2 = new T3.Vector3().crossVectors(right, d).normalize();
22
22
  const tv = Math.tan(cam.fov * Math.PI / 360), th = tv * (cam.aspect || 1.78);
23
23
  let behind = null;
@@ -14,7 +14,7 @@ export function checkInput(p) {
14
14
  return p.settings ? [['note', 'input: no activeInputHandler in ProjectSettings.asset (Unity writes it on the next save)']] : [];
15
15
  const mobile = ['ios', 'android'].filter((t) => p.targets.has(t)).map((t) => TARGET_NAME[t]);
16
16
  if (h === '0' && mobile.length) {
17
- return [['fail', `input: activeInputHandler is 0 (${INPUT_HANDLER['0']}) and the project builds for ${mobile.join(' and ')}: touch did not work in a player build (Knockout Lap) — set ${INPUT_FIX}`]];
17
+ return [['fail', `input: activeInputHandler is 0 (${INPUT_HANDLER['0']}) and the project builds for ${mobile.join(' and ')}: touch did not work in a player build — set ${INPUT_FIX}`]];
18
18
  }
19
19
  const out = [['pass', `input: ${INPUT_HANDLER[h] ?? `activeInputHandler ${h}`} (activeInputHandler ${h})`]];
20
20
  if ((h === '1' || h === '2') && !p.manifest['com.unity.inputsystem']) {
@@ -82,7 +82,7 @@ export function checkAudioListener(p) {
82
82
  }
83
83
  if (!sceneHears) {
84
84
  for (const f of codeCams)
85
- out.push(['warn', `AudioListener: ${f} makes a Camera in code and nothing adds an AudioListener — add one beside it (AddComponent<AudioListener>(), or Sfx.EnsureListener()); all four first Joydle games reached TestFlight silent`]);
85
+ out.push(['warn', `AudioListener: ${f} makes a Camera in code and nothing adds an AudioListener — add one beside it (AddComponent<AudioListener>(), or Sfx.EnsureListener()); four of the studio's first games reached TestFlight silent`]);
86
86
  }
87
87
  return out.length ? out : [['pass', 'AudioListener: a scene has one']];
88
88
  }
@@ -94,7 +94,7 @@ export const BANNED_APIS = [
94
94
  pattern: /\bShader\s*\.\s*WarmupAllShaders\s*\(/,
95
95
  scope: 'runtime',
96
96
  status: (p) => (usesUrp(p) ? 'fail' : 'warn'),
97
- why: 'it segfaults with URP keyword spaces (Unity 6, Floe Jam and Knockout Lap) and compiles every variant of every shader',
97
+ why: 'it segfaults with URP keyword spaces (Unity 6, two games) and compiles every variant of every shader',
98
98
  fix: 'warm a ShaderVariantCollection of the variants the game draws with (ShaderVariantCollection.WarmUp)',
99
99
  },
100
100
  {
@@ -114,7 +114,7 @@ export const BANNED_APIS = [
114
114
  scope: 'runtime',
115
115
  status: () => 'warn',
116
116
  why: 'the Input System is not up at AfterAssembliesLoaded on iOS: hooking it there throws, and every input read after it throws too',
117
- fix: 'hook input on first use or at BeforeSceneLoad (Joydle Core\'s BackButton hooks on first read)',
117
+ fix: 'hook input on first use or at BeforeSceneLoad (a back-button reader that hooks on first read)',
118
118
  },
119
119
  {
120
120
  id: 'bare-render-params',
@@ -371,7 +371,7 @@ export function checkSettingsDrift(p) {
371
371
  drift.push(`${setting} saved as ${now}, the script pins ${list[0].wants}`);
372
372
  }
373
373
  if (drift.length) {
374
- return [['warn', `settings drift: ProjectSettings.asset disagrees with ${main}${others}: ${drift.join('; ')} — run ${main} before every build (a build that skips it ships what the Editor last saved; Knockout Lap's iOS graphics APIs flipped back to automatic three times)`]];
374
+ return [['warn', `settings drift: ProjectSettings.asset disagrees with ${main}${others}: ${drift.join('; ')} — run ${main} before every build (a build that skips it ships what the Editor last saved; one game's iOS graphics APIs flipped back to automatic three times)`]];
375
375
  }
376
376
  return [['pass', `settings: ${main}${others} sets PlayerSettings${compared ? `, and the saved ones agree (${compared} compared)` : ''} — build through it every time`]];
377
377
  }
@@ -45,13 +45,13 @@ export function checkSampleRate(p, audio = audioSettings(p)) {
45
45
  if (reset)
46
46
  return [['pass', `audio: m_SampleRate is ${rate}, and ${reset.rel} sets 48000 through AudioSettings.Reset`]];
47
47
  const what = rate === '0' ? "0, the device's rate (24 kHz on the iOS Simulator)" : `${rate} Hz`;
48
- return [['warn', `audio: m_SampleRate is ${what}, not 48000: Hot Gates' cues came out dull at 24 kHz until it pinned 48000, and 8 of 13 studio games still follow the device — ${SAMPLE_RATE_FIX}`]];
48
+ return [['warn', `audio: m_SampleRate is ${what}, not 48000: one game's cues came out dull at 24 kHz until it pinned 48000, and 8 of 13 studio games still follow the device — ${SAMPLE_RATE_FIX}`]];
49
49
  }
50
50
  export function checkAudioDisabled(p, ix, audio = audioSettings(p)) {
51
51
  if (scalar(audio, 'm_DisableAudio') !== '1')
52
52
  return [];
53
53
  const plays = ix.audio.length > 0 || p.code.some((f) => runtime(f) && /\bAudio(?:Source|Clip)\b/.test(f.code));
54
- return [[plays ? 'fail' : 'warn', `audio: m_DisableAudio is 1, so the build plays no sound at all${plays ? `, and the game has ${ix.audio.length ? `${ix.audio.length} sound file(s)` : 'code that plays sound'}` : ''}: Dead Letter inherited it from a template and only the upload script caught it — set m_DisableAudio: 0 in ProjectSettings/AudioManager.asset (Project Settings > Audio > Disable Unity Audio, off)`]];
54
+ return [[plays ? 'fail' : 'warn', `audio: m_DisableAudio is 1, so the build plays no sound at all${plays ? `, and the game has ${ix.audio.length ? `${ix.audio.length} sound file(s)` : 'code that plays sound'}` : ''}: one game inherited it from a template and only the upload script caught it — set m_DisableAudio: 0 in ProjectSettings/AudioManager.asset (Project Settings > Audio > Disable Unity Audio, off)`]];
55
55
  }
56
56
  const biggest = (xs) => [...xs].sort((x, y) => y.bytes - x.bytes);
57
57
  const named = (xs, n = 3) => list(biggest(xs).map((x) => `${x.a.path} (${x.px.w}×${x.px.h}, ${fmtMb(x.bytes)})`), n);
@@ -81,7 +81,7 @@ export function checkNpotMips(p, ix, rules = []) {
81
81
  const writers = hits.map((h) => rulesWriting(rules, 'texture', h.a.path, (w) => (w.key === 'nPOTScale' && w.value === '0') || (w.key === 'enableMipMap' && w.value === '1')));
82
82
  const byRule = [...new Set(writers.flat())];
83
83
  const where = !byRule.length ? 'in each .meta' : `in the import rule that sets them (${list(byRule, 2)}), or the next import puts them back${writers.some((w) => !w.length) ? ', and in the other .meta files' : ''}`;
84
- return [['warn', `textures: ${hits.length} mipmapped texture(s) with a side that is not a power of two and Non-Power of 2 set to None: Unity leaves them uncompressed, RGBA32, without a word and even under an ASTC override (measured twice: the studio splash, 4568e839, and Pocket Crew's King screens, P6), about ${fmtMb(total(hits))}: ${named(hits)} — set Non-Power of 2 to ToNearest (nPOTScale: 1) or turn mipmaps off (enableMipMap: 0) ${where}; the splash alone cost 10.3 MB in every studio game`]];
84
+ return [['warn', `textures: ${hits.length} mipmapped texture(s) with a side that is not a power of two and Non-Power of 2 set to None: Unity leaves them uncompressed, RGBA32, without a word and even under an ASTC override (measured twice: a splash screen and one game's character screens), about ${fmtMb(total(hits))}: ${named(hits)} — set Non-Power of 2 to ToNearest (nPOTScale: 1) or turn mipmaps off (enableMipMap: 0) ${where}; the splash alone cost 10.3 MB in every game that shipped it`]];
85
85
  }
86
86
  const ICON = /(^|\/)(icons?|appicons?)(\/|$)/i;
87
87
  export function checkUncompressed(p, ix, rules = []) {
@@ -188,7 +188,7 @@ export function checkImportDrift(ix, rules) {
188
188
  const keys = [...new Set(ds.map((d) => d.key))];
189
189
  const eg = ds[0];
190
190
  const file = rules.find((r) => r.name === rule)?.file;
191
- out.push(['warn', `import rules: ${files.length} .meta file(s) disagree with ${rule}${file ? ` (${file})` : ''}, which rewrites them on the next import (${list(keys, 4)}): e.g. ${eg.asset.path}.meta has ${eg.key} ${shownValue(eg.key, eg.has)}, the rule writes ${eg.want.shown}${files.length > 1 ? `; also ${list(files.slice(1), 2)}` : ''} — reimport them (select the folder, Reimport; or AssetDatabase.ImportAsset(path, ImportAssetOptions.ForceUpdate)) and commit the .meta files: until then a build ships whatever that Mac's Library last imported, and a fresh clone's import dirties the tree (Dead Letter b67d5182)`]);
191
+ out.push(['warn', `import rules: ${files.length} .meta file(s) disagree with ${rule}${file ? ` (${file})` : ''}, which rewrites them on the next import (${list(keys, 4)}): e.g. ${eg.asset.path}.meta has ${eg.key} ${shownValue(eg.key, eg.has)}, the rule writes ${eg.want.shown}${files.length > 1 ? `; also ${list(files.slice(1), 2)}` : ''} — reimport them (select the folder, Reimport; or AssetDatabase.ImportAsset(path, ImportAssetOptions.ForceUpdate)) and commit the .meta files: until then a build ships whatever that Mac's Library last imported, and a fresh clone's import dirties the tree`]);
192
192
  }
193
193
  return out;
194
194
  }
@@ -205,7 +205,7 @@ export function checkTextureRoles(ix, rules) {
205
205
  }
206
206
  if (!coarse.length)
207
207
  return [];
208
- return [['warn', `textures: ${coarse.length} normal map(s) import as Default textures at ${coarse[0].fmt} (${list([...new Set(coarse.map((c) => c.rule))], 2)}): ${list(coarse.map((c) => c.a.path))} — a 6×6 block or coarser smears a normal map's detail; give __normal textures ASTC 4x4 or 5x5 in that rule (com.joydle.core's TextureBudget, JOYDLE_STUDY §8)`]];
208
+ return [['warn', `textures: ${coarse.length} normal map(s) import as Default textures at ${coarse[0].fmt} (${list([...new Set(coarse.map((c) => c.rule))], 2)}): ${list(coarse.map((c) => c.a.path))} — a 6×6 block or coarser smears a normal map's detail; give __normal textures ASTC 4x4 or 5x5 in that rule`]];
209
209
  }
210
210
  export function gitCommonDir(dir) {
211
211
  const root = gitRoot(dir);
@@ -281,7 +281,7 @@ export function checkClonedIdentity(p, others) {
281
281
  if (me.guid && /^[0-9a-f]{32}$/i.test(me.guid)) {
282
282
  const dupes = rest.filter((o) => o.guid === me.guid && !sameGame(me, o));
283
283
  if (dupes.length)
284
- out.push(['warn', `identity: productGUID ${me.guid} is also ${list(dupes.map(label), 2)}'s: one project was cloned from the other (Floe Jam carried Koi Out's), so Unity's services and caches take the two for one project — ${GUID_FIX}`]);
284
+ out.push(['warn', `identity: productGUID ${me.guid} is also ${list(dupes.map(label), 2)}'s: one project was cloned from the other (one game carried its sibling's), so Unity's services and caches take the two for one project — ${GUID_FIX}`]);
285
285
  else if (rest.length)
286
286
  out.push(['pass', `identity: productGUID is this project's own (${rest.length} other Unity project(s) on this Mac read)`]);
287
287
  }
@@ -317,15 +317,6 @@ export function checkClonedIdentity(p, others) {
317
317
  }
318
318
  return out;
319
319
  }
320
- export const KNOWN_FIXES = [
321
- {
322
- pkg: 'com.joydle.core',
323
- file: 'Runtime/IapService.cs',
324
- marker: /\bgranted\s*\.\s*Add\s*\(/,
325
- usedBy: /\bIapService\b/,
326
- what: "the 7 Oct IAP double-grant fix (f205a0c6: an interrupted or Ask-to-Buy purchase could be granted twice; it shipped in 14 Dawg Ball TestFlight builds before main had it)",
327
- },
328
- ];
329
320
  export function checkStudioPackages(p, run) {
330
321
  const out = [];
331
322
  const ownRepo = gitRoot(p.dir);
@@ -376,13 +367,6 @@ export function checkStudioPackages(p, run) {
376
367
  }
377
368
  else
378
369
  out.push(['note', says]);
379
- for (const fix of KNOWN_FIXES) {
380
- if (fix.pkg !== name || !p.code.some((f) => fix.usedBy.test(f.code)))
381
- continue;
382
- const code = read(join(abs, fix.file));
383
- if (code && !fix.marker.test(code))
384
- out.push(['warn', `studio package ${label} at ${at} predates ${fix.what} — bring that checkout to main (${home(root)}), then rebuild`]);
385
- }
386
370
  }
387
371
  return out;
388
372
  }
@@ -400,12 +384,12 @@ export function checkFirebaseSimulator(p) {
400
384
  const out = [];
401
385
  const names = list(firebase, 2);
402
386
  if (!stub)
403
- out.push(['warn', `Firebase on the Simulator: ${names} in an iOS game, and nothing stubs it for a Simulator build: Firebase's C++ libraries (libFirebaseCpp*.a) carry no arm64 Simulator slice and the iOS 26 Simulator runs arm64 only, so the link fails (Dawg Ball's finding) — add an IPostprocessBuildWithReport that, for SimulatorSDK builds only, drops them from UnityFramework and links stubs in their place (Dawg Ball's SimFirebase, as Pocket Crew and Hot Gates keep it in Assets/_Game/Editor/SimFirebase.cs)`]);
387
+ out.push(['warn', `Firebase on the Simulator: ${names} in an iOS game, and nothing stubs it for a Simulator build: Firebase's C++ libraries (libFirebaseCpp*.a) carry no arm64 Simulator slice and the iOS 26 Simulator runs arm64 only, so the link fails — add an IPostprocessBuildWithReport that, for SimulatorSDK builds only, drops them from UnityFramework and links stubs in their place (an Editor script such as Assets/_Game/Editor/SimFirebase.cs)`]);
404
388
  if (!guard)
405
- out.push(['warn', `Firebase on the Simulator: nothing reads SIMULATOR_UDID, so a Simulator run calls the stubbed SDK and throws TypeInitializationException (the Simulator reports a real model, iPhone18,1, so a model check never matches) — skip Firebase and mute telemetry when SIMULATOR_UDID is set${p.manifest['com.joydle.firebase'] ? ' (in com.joydle.firebase/Runtime/FirebaseTelemetry.cs Boot, as b51a7851 does on dawg-ball/*)' : ''}`]);
389
+ out.push(['warn', `Firebase on the Simulator: nothing reads SIMULATOR_UDID, so a Simulator run calls the stubbed SDK and throws TypeInitializationException (the Simulator reports a real model, iPhone18,1, so a model check never matches) — skip Firebase and mute telemetry when SIMULATOR_UDID is set`]);
406
390
  return out;
407
391
  }
408
- const GATE = /\bisDebugBuild\b|\bDEVELOPMENT_BUILD\b|\bJOYDLE_TEST_ARGS\b/;
392
+ const GATE = /\bisDebugBuild\b|\bDEVELOPMENT_BUILD\b|\b[A-Z][A-Z0-9]*_TEST_ARGS\b/;
409
393
  const READS_ARGS = /\bLaunchArgs\s*\.\s*Get\s*\(|\bGetCommandLineArgs\s*\(/g;
410
394
  const BUILD_SWITCH = /^\s*#\s*(?:el)?if\b(?![^\n]*\bUNITY_(?:IOS|ANDROID|STANDALONE\w*|WEBGL|TVOS|VISIONOS|WSA\w*|SWITCH|PS\d|GAMECORE\w*)\b[^\n]*$)[^\n]*\b[A-Z][A-Z0-9_]{2,}\b/m;
411
395
  export function gateNames(files) {
@@ -451,12 +435,12 @@ export function checkLaunchArgs(p) {
451
435
  const open = readers.filter((f) => !gated(f.code)).flatMap((f) => { const r = reads(f); return r.length ? [`${f.rel}:${lineOf(f.code, r[0].index)}`] : []; });
452
436
  if (!open.length)
453
437
  return [['pass', `launch flags: every reader is behind a development-build gate (${readers.length} file(s))`]];
454
- const fix = "read every flag through one gated reader, `if (!Debug.isDebugBuild && !Application.isEditor) return none;` (Pocket Crew's Loop/PcArgs.cs)";
455
- const what = `launch flags: ${open.length} player file(s) read the launch arguments with no development-build gate (isDebugBuild, DEVELOPMENT_BUILD, JOYDLE_TEST_ARGS, or a flag built on one): ${list(open)}`;
438
+ const fix = "read every flag through one gated reader, `if (!Debug.isDebugBuild && !Application.isEditor) return none;`";
439
+ const what = `launch flags: ${open.length} player file(s) read the launch arguments with no development-build gate (isDebugBuild, DEVELOPMENT_BUILD, a *_TEST_ARGS define, or a flag built on one): ${list(open)}`;
456
440
  const desktop = ['mac', 'windows'].filter((t) => p.targets.has(t));
457
441
  if (desktop.length)
458
- return [['warn', `${what} — the ${desktop.map((t) => (t === 'mac' ? 'Mac' : 'Windows')).join(' and ')} build honours them for anyone who starts it with a flag (three release builds honoured unlock flags: Koi Out -setcoins, Scrap Riot -lgr-unlocked, Dead Letter -deadletter-unlockall); ${fix}`]];
459
- return [['note', `${what} — harmless while the game ships only for phones (a store build there starts with no arguments, and Joydle Core reads Android's intent flags only in development builds), live the day it ships for Mac or Windows; ${fix}`]];
442
+ return [['warn', `${what} — the ${desktop.map((t) => (t === 'mac' ? 'Mac' : 'Windows')).join(' and ')} build honours them for anyone who starts it with a flag (three release builds honoured unlock flags: -setcoins, -unlocked, -unlockall); ${fix}`]];
443
+ return [['note', `${what} — harmless while the game ships only for phones (a store build there starts with no arguments, and Android's intent flags should be read only in development builds), live the day it ships for Mac or Windows; ${fix}`]];
460
444
  }
461
445
  const EXIT = /\bEditorApplication\s*\.\s*Exit\s*\(/g;
462
446
  const BATCH = /\bisBatchMode\b|\binBatchMode\b/;
@@ -519,7 +503,7 @@ export function checkNetstandard(p) {
519
503
  if (ns)
520
504
  return [['pass', `engine-free code: ${tests[0].folder} runs it on .NET and ${ns.csproj} compiles it against netstandard, Unity's API`]];
521
505
  const tfm = /<TargetFrameworks?>([^<]+)</i.exec(tests[0].text)?.[1] ?? '.NET';
522
- return [['note', `engine-free code: ${tests[0].folder} runs it on ${tfm} only, where an API Unity lacks still compiles — add a CoreNetStandard~ project that compiles the same files for netstandard2.1 (Gallery Heist's CoreNetStandard~/CoreNetStandard.csproj; 6 of 13 studio games have one)`]];
506
+ return [['note', `engine-free code: ${tests[0].folder} runs it on ${tfm} only, where an API Unity lacks still compiles — add a CoreNetStandard~ project that compiles the same files for netstandard2.1 (CoreNetStandard~/CoreNetStandard.csproj; 6 of 13 studio games have one)`]];
523
507
  }
524
508
  const PARSES = /\b(?:double|float|decimal|Double|Single)\s*\.\s*(?:Try)?Parse\s*\(|\bConvert\s*\.\s*To(?:Double|Single)\s*\(/;
525
509
  const PRINTS = /\.ToString\s*\(\s*"(?:R|G17)"/;
@@ -543,7 +527,7 @@ export function checkIl2cppNumbers(p) {
543
527
  });
544
528
  if (!hits.length)
545
529
  return [];
546
- return [['note', `numbers: the project replays goldens, and ${hits.length} player file(s) parse or print doubles with the runtime's own routines (${list(hits)}): under IL2CPP double.Parse misread 446 of 100,000 doubles and "R" printed 17 digits where 16 read back (Gallery Heist 3230bf9, 416d523), so a golden that passes in the Editor can differ in the player — replay one golden in a development player, or parse and print exactly (Gallery Heist's JsJson ParseDecimal and NumberToString)`]];
530
+ return [['note', `numbers: the project replays goldens, and ${hits.length} player file(s) parse or print doubles with the runtime's own routines (${list(hits)}): under IL2CPP double.Parse misread 446 of 100,000 doubles and "R" printed 17 digits where 16 read back (one game, twice), so a golden that passes in the Editor can differ in the player — replay one golden in a development player, or parse and print exactly (a decimal parser and printer of the game's own)`]];
547
531
  }
548
532
  const UDID = /\b[0-9A-F]{8}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{12}\b/;
549
533
  const SIM_CONTEXT = /sim|udid|device|\bDEV\b|xcrun|booted/i;
@@ -577,9 +561,9 @@ export function checkHardcodedSimulator(p) {
577
561
  }
578
562
  if (!hits.length)
579
563
  return [];
580
- return [['warn', `Simulator UDID typed into ${list(hits)}: every agent on this Mac then drives that one Simulator, and a run shut down under another killed it three times (Knockout Lap) — lease one per run: \`funtools sim lease\` prints a fresh udid, \`funtools sim release <udid>\` gives it back (skill funpixel-unity-game, references/agent-ops.md)`]];
564
+ return [['warn', `Simulator UDID typed into ${list(hits)}: every agent on this Mac then drives that one Simulator, and a run shut down under another killed it three times — lease one per run: \`funtools sim lease\` prints a fresh udid, \`funtools sim release <udid>\` gives it back (skill funpixel-unity-game, references/agent-ops.md)`]];
581
565
  }
582
- export const HISTORY_HEADING = "the studio's history · fixes the Joydle games' logs repeated (JOYDLE_STUDY §7)";
566
+ export const HISTORY_HEADING = "the studio's history · fixes its games' logs repeated";
583
567
  export function historyChecks(p, host) {
584
568
  const audio = audioSettings(p);
585
569
  const ix = assetIndex(p.dir);
@@ -1,43 +1,3 @@
1
- export const AB_SEED = [
2
- {
3
- id: 'gallery-heist-gdd-1', game: 'Gallery Heist', at: '2026-10-01', what: 'the GDD written by each route from one brief',
4
- judges: '3 blind seats, one rubric', winner: 'non-gdk',
5
- variants: [
6
- { route: 'gdk', label: 'GDK (lane F kit)', overall: 7.0, axes: { clarity: 8.4, feasibility: 7.2, 'level design': null, story: null, fun: null, phone: null }, seats_won: 0 },
7
- { route: 'non-gdk', label: 'non-GDK (hand brief)', overall: 8.0, axes: { clarity: 8.1, feasibility: 6.4, 'level design': null, story: null, fun: null, phone: null }, seats_won: 3 },
8
- ],
9
- better: { 'level design': 'non-gdk by 1.8', story: 'non-gdk by 1.7', fun: 'non-gdk by 1.2', phone: 'non-gdk by 1.0' },
10
- evidence: ['the studio\'s A/B notes, 1 Oct 2026: the second A/B, Gallery Heist'],
11
- note: 'Top gaps: places that differ, a world that answers the core verb, a first-person phone pack, judging what the player holds, targets before code.',
12
- },
13
- {
14
- id: 'gallery-heist-gdd-2', game: 'Gallery Heist', at: '2026-10-01', what: 'the GDD re-run with the lane H kit (invent first, studio pitch), same seats and rubric, order reshuffled',
15
- judges: '3 blind seats, one rubric', winner: 'gdk-h',
16
- variants: [
17
- { route: 'gdk-h', label: 'GDK (lane H kit)', overall: 8.07, axes: { clarity: 8.2, feasibility: 7.53, 'level design': 8.47, story: 8.1, fun: 7.9, phone: 8.03 }, seats_won: 2 },
18
- { route: 'gdk', label: 'GDK (lane F kit, re-judged)', overall: 7.37, axes: { clarity: 7.63, feasibility: 7.77, 'level design': 7.77, story: 7.03, fun: 7.4, phone: 7.43 }, seats_won: 0 },
19
- { route: 'non-gdk', label: 'non-GDK (hand brief)', overall: 7.9, axes: { clarity: 7.2, feasibility: 7.3, 'level design': 8.07, story: 8.67, fun: 7.7, phone: 7.37 }, seats_won: 1 },
20
- ],
21
- evidence: ['the studio\'s A/B notes, 1 Oct 2026: the GDD re-run with the newer kit'],
22
- note: 'The story seat still picked the non-GDK (its paintings are "alive"; ours is "systemic").',
23
- },
24
- {
25
- id: 'blue-freight-plan', game: 'Blue Freight', at: '2026-10-01', what: 'the plan made by each route (GDK agent vs the owner session by hand)',
26
- judges: 'the owner and the greenlight panel, in words', winner: 'split',
27
- variants: [{ route: 'gdk', label: 'GDK plan' }, { route: 'non-gdk', label: 'hand plan (owner session)' }],
28
- better: { mechanics: 'gdk', story: 'gdk', 'physics numbers': 'gdk', world: 'non-gdk', consistency: 'non-gdk', 'places pictured': 'non-gdk' },
29
- evidence: ['the studio\'s A/B notes, 1 Oct 2026: what the hand-made Blue Freight plan did well'],
30
- note: 'Confound: the hand plan had the owner\'s whole context; the GDK plan one fresh agent.',
31
- },
32
- {
33
- id: 'blue-freight-build', game: 'Blue Freight', at: '2026-10-01', what: 'the playable builds, round 2, played by the owner',
34
- judges: 'the owner, playing', winner: 'split',
35
- variants: [{ route: 'gdk', label: 'GDK build' }, { route: 'non-gdk', label: 'owner build' }],
36
- better: { 'composition and light': 'gdk', life: 'non-gdk', texture: 'non-gdk', challenge: 'neither', placement: 'neither' },
37
- evidence: ['the studio\'s A/B notes, 1 Oct 2026: the owner played both builds'],
38
- note: 'Both: "no challenges at all"; the GDK build: misplaces, collisions, static people. The kit opened zero skills in five sessions.',
39
- },
40
- ];
41
1
  export function axisLosses(records, route = 'gdk') {
42
2
  const rows = new Map();
43
3
  const row = (axis) => rows.get(axis) ?? { route, axis, lost: 0, of: 0, by: [], words: 0 };
package/dist/gen/unity.js CHANGED
@@ -127,8 +127,8 @@ export function toWav(file, run = realRun) {
127
127
  export const IMPORT_RULE_SOURCE = `${RULE_MARK} (v1). Import settings for what it writes under
128
128
  // ${UNITY_ROOT}/, set once, when Unity first imports a file (no .meta yet): from then on the settings are the
129
129
  // project's, kept in the .meta Unity writes, and a change you make in the Inspector stays. One exception: a normal
130
- // map is kept a NormalMap on every import, because a rule that imports every model texture as Default (Joydle
131
- // Core's TextureBudget) would turn it back. funtools rewrites this file while this first line stays; delete the
130
+ // map is kept a NormalMap on every import, because a rule that imports every model texture as Default (a
131
+ // texture-budget rule) would turn it back. funtools rewrites this file while this first line stays; delete the
132
132
  // line to keep your own edits, or the file to stop it.
133
133
  #if UNITY_EDITOR
134
134
  using System.Text.RegularExpressions;
@@ -145,7 +145,7 @@ namespace Funpixel.Generated.EditorTools
145
145
  static readonly Regex Normal = new Regex(@"(^|[_\\-. ])(nor|normal|nrm)(_gl|_dx)?($|[_\\-. ]|\\d)", RegexOptions.IgnoreCase);
146
146
  static readonly Regex Data = new Regex(@"(^|[_\\-. ])(rough|roughness|metal|metallic|ao|occlusion|height|disp|displacement|mask|arm|orm)($|[_\\-. ]|\\d)", RegexOptions.IgnoreCase);
147
147
 
148
- // After the project's own rules (Joydle Core's TextureBudget runs at 0), so these settings win on first import.
148
+ // After the project's own rules (a texture-budget rule runs at 0), so these settings win on first import.
149
149
  public override int GetPostprocessOrder() => 100;
150
150
 
151
151
  static bool Ours(string path) => path.Replace('\\\\', '/').StartsWith(Root, System.StringComparison.Ordinal);
@@ -8,6 +8,7 @@ import { COMPOSE_DIR } from "../compose/contract.js";
8
8
  import { ADS_BRIEF, ADS_OUT } from "../compose/variations.js";
9
9
  import { hostedFromApi } from "./hosted.js";
10
10
  import { localIds, withModels } from "./models.js";
11
+ import { currentVersion } from "../update.js";
11
12
  export const PROTOCOL = '2025-06-18';
12
13
  const MAX_IMAGE_BYTES = 1_500_000;
13
14
  const MAX_IMAGES = 4;
@@ -284,7 +285,7 @@ export function createServer(o) {
284
285
  try {
285
286
  if (method === 'initialize') {
286
287
  const asked = msg.params?.protocolVersion;
287
- return reply({ protocolVersion: typeof asked === 'string' ? asked : PROTOCOL, capabilities: { tools: { listChanged: true } }, serverInfo: { name: 'funtools', version: '0.1.0' }, instructions: 'The Funpixel game kit. Call `flow` at the start of every turn: it names the one next step and the tool for it. Pass the game folder as `dir` (an absolute path) on every call: the server does not start in it. The hosted Funpixel tools are here too (generation of pictures, sound, music, video and 3D models, and the rest); they run on the account `funtools login` signed in, and a call that cannot run says why and what to run.' });
288
+ return reply({ protocolVersion: typeof asked === 'string' ? asked : PROTOCOL, capabilities: { tools: { listChanged: true } }, serverInfo: { name: 'funtools', version: currentVersion() }, instructions: 'The Funpixel game kit. Call `flow` at the start of every turn: it names the one next step and the tool for it. Pass the game folder as `dir` (an absolute path) on every call: the server does not start in it. The hosted Funpixel tools are here too (generation of pictures, sound, music, video and 3D models, and the rest); they run on the account `funtools login` signed in, and a call that cannot run says why and what to run.' });
288
289
  }
289
290
  if (method === 'ping')
290
291
  return reply({});
@@ -15,7 +15,7 @@ export const PANEL_DEFAULT = 7.3;
15
15
  export const CATALOGUE = {
16
16
  pitch: {
17
17
  title: 'Invent and pitch',
18
- why: 'a game whose answers are generic loses to one that invented something (Gallery Heist A/B, 3 of 3 seats)',
18
+ why: 'a game whose answers are generic loses to one that invented something (an A/B, 3 of 3 seats)',
19
19
  gates: [{ kind: 'gdd', headings: ['The invention'] }, { kind: 'studio' }, { kind: 'worth' }],
20
20
  rules: [
21
21
  'Answer the six forcing questions for THIS game in the GDD\'s `## The invention`: what the core object means, why the verb exists in this world, who wants what (names), what the twist costs, the one system that lives, what only this game has. A generic answer means the idea is not there yet.',
@@ -70,20 +70,20 @@ export const CATALOGUE = {
70
70
  },
71
71
  'first-look': {
72
72
  title: 'First look',
73
- why: 'identity drifts between frames unless it is locked first (Blue Freight: 7 of 7 redraws on-model with reference sheets)',
73
+ why: 'identity drifts between frames unless it is locked first (one game: 7 of 7 redraws on-model with reference sheets)',
74
74
  gates: [{ kind: 'refs', min: 1 }, { kind: 'targets', min: 4 }, { kind: 'kit' }, { kind: 'set' }],
75
75
  rules: [
76
76
  `The whole game, not a few frames (owner, 4 Oct, asked twice): key art; every screen (the title as the play world, pause, the end; past small settings, results, a level select); the HUD on the phone and the desktop; a frame per place, each tied to a story beat; a living-world sheet; an animation board; a juice board; the sound list; the fun page. \`${T} firstlook\` lists what is missing; places and the living world only for a world game.`,
77
77
  'Reference sheets (identity lock) BEFORE moment frames; every recurring design drawn with its references and one verbatim style block.',
78
78
  'A target frame per hook moment at the play framing (desktop 1280x720, phone held sideways 852x393).',
79
- `The world's kit beside the hero: sheets of its made parts (structures, ground, props, the living cast), cut into pieces before the slice (\`${T} cut\`); the slice is built from them, never from plain shapes (a fresh Blue Freight build shipped code-drawn primitives until the owner's note).`,
79
+ `The world's kit beside the hero: sheets of its made parts (structures, ground, props, the living cast), cut into pieces before the slice (\`${T} cut\`); the slice is built from them, never from plain shapes (a fresh build shipped code-drawn primitives until the owner's note).`,
80
80
  'A picture of every place; no two places alike in shape, material, era and light.',
81
81
  'The HUD mockup drawn over a target frame.',
82
82
  ],
83
83
  },
84
84
  'core-test': {
85
85
  title: 'Core test (A1): the game bites',
86
- why: 'both Blue Freight builds spent their rounds on looks and the challenge never bit ("no challenges at all")',
86
+ why: 'both builds of one game spent their rounds on looks and the challenge never bit ("no challenges at all")',
87
87
  gates: [{ kind: 'tests' }, { kind: 'sim' }],
88
88
  rules: [
89
89
  `The GDD's named bots play the REAL level (\`${T} sim\`): an engine-free, fixed-step, seeded sim, plus a replay test.`,
@@ -118,7 +118,7 @@ export const CATALOGUE = {
118
118
  },
119
119
  expand: {
120
120
  title: 'Expand, room by room',
121
- why: 'our real games are 10 to 18 minutes of designed play, grown room by room from a slice that passed (Gallery Heist: "nothing in Rooms 2-6 starts until the slice passes its gates")',
121
+ why: 'our real games are 10 to 18 minutes of designed play, grown room by room from a slice that passed (one plan: "nothing in Rooms 2-6 starts until the slice passes its gates")',
122
122
  gates: [{ kind: 'rooms' }],
123
123
  rules: [
124
124
  `Slice first: a room is opened for building only once the room before it passes (\`${T} rooms open <id>\`); the owner alone releases one early (\`--by owner\`).`,
@@ -161,7 +161,7 @@ export const CATALOGUE = {
161
161
  },
162
162
  'blind-play': {
163
163
  title: 'Blind play from the title',
164
- why: 'blind players from the title found the blockers no panel could (Held Note)',
164
+ why: 'blind players from the title found the blockers no panel could',
165
165
  gates: [{ kind: 'play' }, { kind: 'sim' }],
166
166
  rules: [
167
167
  `A blind player from the title, no instructions (\`${T} play\`): a stall counts as blocking.`,
@@ -22,7 +22,7 @@ export function momentsMd(ms) {
22
22
  }
23
23
  const unreached = ms.filter((m) => m.staged?.reached === false);
24
24
  if (unreached.length)
25
- out.push('', `Staged frames the played route never reached: ${unreached.map((m) => `${m.moment} (\`${m.staged.frame}\`)`).join('; ')}. A frame that looks right only when staged is a finding (Held Note's Diver: showcase art in its lane, "a few coral points" in play).`);
25
+ out.push('', `Staged frames the played route never reached: ${unreached.map((m) => `${m.moment} (\`${m.staged.frame}\`)`).join('; ')}. A frame that looks right only when staged is a finding (one game's diver: showcase art in its lane, "a few coral points" in play).`);
26
26
  out.push('');
27
27
  return out;
28
28
  }
@@ -26,7 +26,7 @@ function stepMd(s, i) {
26
26
  export function evidenceMd(e) {
27
27
  if (!e || (!e.same.length && !e.logged.length))
28
28
  return [];
29
- const out = ['## Look at the captures first', '', 'The scores below are only as good as the frames the seats saw. Open these before trusting any number (Held Note scored 4.9 on views stuck at the opening shot, 6.55 once they reached their beats).', ''];
29
+ const out = ['## Look at the captures first', '', 'The scores below are only as good as the frames the seats saw. Open these before trusting any number (one game scored 4.9 on views stuck at the opening shot, 6.55 once they reached their beats).', ''];
30
30
  for (const g of e.same)
31
31
  out.push(`- Same picture on desktop: ${g.map((v) => `\`${v}\``).join(', ')}. Declared views that look alike usually mean a view never reached its beat.`);
32
32
  for (const l of e.logged.slice(0, 4))