summer-engine 3.5.1 → 3.6.0

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 (60) hide show
  1. package/.claude-plugin/marketplace.json +2 -2
  2. package/.claude-plugin/plugin.json +3 -2
  3. package/.codex-plugin/plugin.json +4 -3
  4. package/.cursor-plugin/plugin.json +3 -2
  5. package/.factory-plugin/plugin.json +3 -2
  6. package/CHANGELOG.md +22 -1
  7. package/commands/summer.md +1 -0
  8. package/dist/core/capabilities/sfx-choices.d.ts +91 -0
  9. package/dist/core/capabilities/sfx-choices.js +291 -0
  10. package/dist/core/capabilities/tool-dispatch.js +35 -0
  11. package/dist/mcp/hosted-mount.js +2 -1
  12. package/dist/mcp/provider-safe-schema.d.ts +10 -0
  13. package/dist/mcp/provider-safe-schema.js +96 -0
  14. package/dist/mcp/server.js +3 -0
  15. package/dist/mcp/tools/generate-tools.js +70 -3
  16. package/gemini-extension.json +2 -1
  17. package/library/references/mcp-tools-reference/mcp-tools-reference.md +5 -3
  18. package/library/references/mcp-tools-reference/resource.yaml +1 -1
  19. package/library/skills/README.md +4 -3
  20. package/library/skills/ambient-bed/SKILL.md +3 -1
  21. package/library/skills/ambient-bed/resource.yaml +1 -1
  22. package/library/skills/audio-direction/SKILL.md +5 -5
  23. package/library/skills/audio-direction/resource.yaml +1 -1
  24. package/library/skills/export-and-ship/SKILL.md +4 -0
  25. package/library/skills/make-game/SKILL.md +21 -2
  26. package/library/skills/make-game/resource.yaml +1 -0
  27. package/library/skills/multiplayer/SKILL.md +3 -1
  28. package/library/skills/multiplayer/resource.yaml +1 -0
  29. package/library/skills/multiplayer-movement/SKILL.md +1 -1
  30. package/library/skills/multiplayer-movement/files.md +2 -3
  31. package/library/skills/multiplayer-project/SKILL.md +20 -4
  32. package/library/skills/multiplayer-project/files.md +2 -3
  33. package/library/skills/multiplayer-publish/SKILL.md +90 -5
  34. package/library/skills/multiplayer-publish/resource.yaml +1 -0
  35. package/library/skills/multiplayer-state/SKILL.md +1 -1
  36. package/library/skills/multiplayer-state/files.md +2 -3
  37. package/library/skills/multiplayer-testing/SKILL.md +13 -0
  38. package/library/skills/multiplayer-testing/resource.yaml +1 -0
  39. package/library/skills/publish-your-game/SKILL.md +2 -0
  40. package/library/skills/release-readiness/SKILL.md +437 -0
  41. package/library/skills/release-readiness/resource.yaml +44 -0
  42. package/library/skills/sound-effect/SKILL.md +83 -158
  43. package/library/skills/sound-effect/resource.yaml +8 -2
  44. package/library/skills/summer-parties/SKILL.md +1 -1
  45. package/library/skills/ui-basics/SKILL.md +1 -0
  46. package/library/tools/generate-audio/resource.yaml +6 -2
  47. package/library/tools/generate-sfx-choices/resource.yaml +69 -0
  48. package/library/tools/get-choices/resource.yaml +50 -0
  49. package/package.json +1 -1
  50. package/registry/generated/aliases.json +2 -0
  51. package/registry/generated/counts.json +3 -3
  52. package/registry/generated/gemini-extension.json +2 -1
  53. package/registry/generated/index.json +163 -24
  54. package/registry/generated/marketplace.claude.json +2 -2
  55. package/registry/generated/plugin.claude.json +3 -2
  56. package/registry/generated/plugin.codex.json +4 -3
  57. package/registry/generated/plugin.cursor.json +3 -2
  58. package/registry/generated/plugin.factory.json +3 -2
  59. package/registry/generated/skills-index.md +4 -3
  60. package/registry/generated/skills-registry.json +15 -1
@@ -0,0 +1,437 @@
1
+ ---
2
+ name: release-readiness
3
+ description: "Before releasing a Summer game version, prove players can play it: server scene, online join, progress, Game ID, released Summer, packed files, app version."
4
+ license: MIT
5
+ compatibility: [Cursor, Claude Code, Windsurf, Codex]
6
+ category: deployment
7
+ user-invocable: true
8
+ allowed-tools: Read Grep Glob Bash summer_read_file summer_get_diagnostics
9
+ paths: ["export_presets.cfg", "project.godot", "summer.build.json", "world.json", "**/*.gd"]
10
+ ---
11
+
12
+ # /release-readiness: prove players can play it
13
+
14
+ Summer checks every upload: platforms, packs, and the files they name. Those
15
+ checks prove the export is well formed. They can't prove that a player who
16
+ presses **Play online** gets into a game. Each check below exists because a
17
+ real release passed every upload check and still failed for its players.
18
+
19
+ The creator docs have the same checklist, with the same numbers:
20
+ https://docs.summerengine.com/publishing/release-readiness (fetch it as `.md`).
21
+
22
+ ## When to run it
23
+
24
+ - Before you upload a new Build of a game that will go to players.
25
+ - Before you promote or release a version.
26
+ - After a release fails for players, to find the cause, and then to add the
27
+ check that would have caught it (see the last section).
28
+
29
+ For a jam build or a prototype nobody else plays, skip it.
30
+
31
+ ## How to report
32
+
33
+ Run every check that applies. Each check needs **evidence**: a command's
34
+ output or something you saw in the running game. Reading the project and
35
+ deciding it looks right is not evidence.
36
+
37
+ Report one line per check:
38
+
39
+ - **pass**, with the evidence;
40
+ - **fail**, with what you saw;
41
+ - **not applicable**, with the reason (for example, no server);
42
+ - **not run**, with what is still needed (for example, "needs a real online
43
+ join after publishing").
44
+
45
+ A check that was not run is not a pass. Show the list to the user before you
46
+ change anything; the user decides what to fix and whether to release with a
47
+ check still open.
48
+
49
+ ## Test the file you upload
50
+
51
+ Run the checks on the summer.games `.zip`, not on something close to it.
52
+ Export the bundle (in the editor: **Project > Export**, preset
53
+ **summer.games**, **Export Project**; from an agent: `summer_export_game`; or
54
+ from a terminal), then take the server pack and the packaged build file out
55
+ of it:
56
+
57
+ ```sh
58
+ <summer> --headless --path . --import
59
+ <summer> --headless --path . --export-release "summer.games" build/<game>.summer.zip
60
+ mkdir -p build/bundle
61
+ unzip -o build/<game>.summer.zip server.pck client.pck summer-bundle.json config/summer.build.json -d build/bundle
62
+ ```
63
+
64
+ A game without a server has no `server.pck` or `config/`; `unzip` then
65
+ warns about the missing names and extracts the rest.
66
+
67
+ `<summer>` is the Summer Engine executable. Two look-alikes hide real
68
+ failures:
69
+
70
+ - **A server pack exported on its own** with your server preset
71
+ (`--export-pack`) is not the bundle's `server.pck`. For example, it keeps
72
+ `gameId`, which the bundle leaves out, so it can pass check 6 while the
73
+ uploaded `.zip` fails it.
74
+ - **Local Play** always starts the authority scene by name, so it can't catch
75
+ check 1. It also runs without a hosted identity, so it can't catch check 6.
76
+
77
+ ## The checks
78
+
79
+ Checks 1 and 2 apply to every game with a server (`summer.build.json` names
80
+ a `server.exportPreset`). Checks 3 and 4 apply to every game with online
81
+ play. Checks 5 to 8 and 10 apply to every game. Check 9 applies to every
82
+ bundle for iPhone or Android.
83
+
84
+ ### 1. The server pack starts the authority scene
85
+
86
+ **Why.** Summer starts a hosted World's `server.pck` with no scene argument,
87
+ so the pack's own main scene decides what runs. The server preset must carry
88
+ the custom feature `summer_authority`, and `project.godot` must set that
89
+ feature's main scene:
90
+
91
+ ```ini
92
+ [application]
93
+
94
+ run/main_scene="res://client/main.tscn"
95
+ run/main_scene.summer_client="res://client/main.tscn"
96
+ run/main_scene.summer_authority="res://authority/main.tscn"
97
+ ```
98
+
99
+ ```ini
100
+ # export_presets.cfg, the server preset
101
+ platform="Linux"
102
+ dedicated_server=true
103
+ custom_features="summer_authority"
104
+ ```
105
+
106
+ Without the feature, `run/main_scene.summer_authority` never applies and
107
+ the server starts the players' main scene, usually the title screen. That
108
+ scene never restores the World or tells Summer it is ready, so **every
109
+ online join fails with `world_start_timeout`**. The bundle manifest still
110
+ names the authority scene as the server's main scene, so reading the
111
+ manifest proves nothing.
112
+
113
+ **Check it.** Start the bundle's `server.pck` the way Summer does, with no
114
+ scene argument, and stop it after a few seconds:
115
+
116
+ ```sh
117
+ perl -e 'alarm shift; exec @ARGV' 15 <summer> --headless --verbose --main-pack build/bundle/server.pck
118
+ ```
119
+
120
+ Find the first `Completed load for: 'res://….tscn'` line. It must be the
121
+ authority scene: the `entry_point` of the `headless_engine` component in
122
+ `world.json`. Later lines may complain that there is no hosted World; that
123
+ is expected in a local run. Then confirm the source too: the server preset in
124
+ `export_presets.cfg` has `summer_authority` in `custom_features`, and
125
+ `project.godot` sets `run/main_scene.summer_authority`.
126
+
127
+ **Fix.** Add `summer_authority` to the server preset's **Features > Custom**,
128
+ set `application/run/main_scene.summer_authority` to the authority scene,
129
+ export again and rerun the check. If your Summer version's export refuses a
130
+ server pack that starts the wrong scene, that refusal is this check failing;
131
+ run the check anyway, because older versions don't refuse it.
132
+
133
+ ### 2. Join online with the version you release
134
+
135
+ **Why.** Check 1 runs on your computer. Players use a hosted server, and some
136
+ failures, such as check 6, only show up there.
137
+
138
+ **Check it.** Right after you publish or promote the version, open the game
139
+ in a Summer Games app as a player, join online and play until you are in the
140
+ game. Do it before you tell players about the update. An agent can't do this
141
+ step; report it as **not run** and ask the user to do it, then record what
142
+ they saw. If the join fails, see [Troubleshooting](#troubleshooting).
143
+
144
+ ### 3. Players can find online play
145
+
146
+ **Why.** If nobody, including you, reaches online play, nobody notices when
147
+ it breaks. A game hid online play behind a grown-ups setting, so its hosted
148
+ join was never tried before release, and it failed for every player who
149
+ found it.
150
+
151
+ **Check it.** Start the client as a new player and follow the default path
152
+ to online play. List every gate on that path: settings, parental or age
153
+ gates, debug toggles. A new player should reach online play without
154
+ changing a setting. If online play is off by default on purpose, the user
155
+ must confirm that decision, and then check 2 must run before every release.
156
+
157
+ ### 4. The server saves online progress
158
+
159
+ **Why.** Progress kept only in the player's local files is lost on
160
+ reinstall or a new device, and players can edit it.
161
+
162
+ **Check it.** In code, the authority loads each player's progress when they
163
+ join (`Summer.authority.player_data.load(session)`) and saves it with
164
+ `commit_public` or `commit_secret` (`summer-player-data`). Then play online,
165
+ earn something, leave, and join again from a fresh install or another
166
+ device. The progress must still be there. Local Play stores player data on
167
+ disk; only hosted play proves it lasts.
168
+
169
+ ### 5. Players can get back to the title
170
+
171
+ **Why.** A player with no way out of a session has to kill the app.
172
+
173
+ **Check it.** Play into a session, online and offline, and find the way
174
+ back: a pause menu or a **Leave** button. Use it, then start a new session
175
+ from the title. In online play, leaving should call
176
+ `Summer.client.leave()` before the title loads.
177
+
178
+ ### 6. The game doesn't hard-code its Game ID
179
+
180
+ **Why.** The summer.games export is portable: the bundle's
181
+ `summer.build.json` has no `gameId`. Summer takes the game's identity from
182
+ wherever it runs: the Summer Games app, the hosted server or Local Play.
183
+ Any other ID fails on the hosted server with `game_identity_mismatch`, "The
184
+ initialized Game ID does not match hosted runtime context." The authority
185
+ then stops before it restores the World or reports ready, and every online
186
+ join ends in `world_start_timeout`, even though check 1 passes. The Summer
187
+ Games app refuses a mismatched ID the same way.
188
+
189
+ **Check it.**
190
+
191
+ 1. Find every call: `grep -rn "Summer.initialize" --include=*.gd .`
192
+ 2. For each, trace the argument back to where it comes from. It must be
193
+ nothing (`Summer.initialize()`) or an ID the game got from Summer. It must
194
+ never be a literal, a placeholder, or a fallback such as
195
+ `"game.my-game"` used when `gameId` is missing.
196
+ 3. `cat build/bundle/config/summer.build.json`: it has no `gameId`, so
197
+ anything the game reads from this file at run time comes back empty.
198
+
199
+ Local Play and the local run in check 1 have no hosted identity, so a wrong
200
+ ID passes there. Only check 2 proves this one.
201
+
202
+ **Fix.** Call `Summer.initialize()` with no ID (Summer 0.7.1 and later), on
203
+ the client and on the authority.
204
+
205
+ ### 7. Export with a released Summer, and its scripts compile on the players' runtime
206
+
207
+ **Why.** The export records which Summer made it, in the client pack's
208
+ `.summer/export.json` and under `export` in the bundle's
209
+ `summer-bundle.json`: `summerVersion` and `engineSha`. Players' apps run the
210
+ game on a released Summer runtime with the same MAJOR.MINOR and a patch at
211
+ least the stamped one. A development build of Summer
212
+ can stamp a version that is already released while it has APIs that release
213
+ lacks. Scripts that use them then fail to compile on every player's device,
214
+ and the game opens to an empty or black window. Summer doesn't compile
215
+ scripts when you upload, so every upload check passes.
216
+
217
+ **Check it.**
218
+
219
+ 1. Read the stamp: `cat build/bundle/summer-bundle.json`. The export log
220
+ shows it too: `Exported by Summer <version> (engine <sha>)`.
221
+ 2. `summerVersion` must be a released Summer version, and `engineSha` must
222
+ equal that release's `engineSha` in
223
+ `downloads.summer.games/engine-templates/<summerVersion>/manifest.json`
224
+ (published for Summer 0.7.1 and later). If it differs, or that address has
225
+ nothing for the version, a development build made the export.
226
+ 3. Run the client pack on that released Summer, and fail on any compile
227
+ error. The run exits normally even when a script fails, so the grep is the
228
+ check:
229
+
230
+ ```sh
231
+ perl -e 'alarm shift; exec @ARGV' 60 <released-summer> --headless --verbose --main-pack build/bundle/client.pck --quit-after 600 > build/client-run.log 2>&1
232
+ grep -E 'SCRIPT ERROR|Parse Error|Failed to load script' build/client-run.log
233
+ ```
234
+
235
+ `<released-summer>` is the Summer executable of the stamped version from
236
+ the download page, not the development build that made the export. The
237
+ grep must print nothing. The run compiles the scripts that the main
238
+ scene and autoloads load; a script that loads only later in play compiles
239
+ when play reaches it, so check 2 still matters for online games.
240
+
241
+ **Fix.** Ask the user to install the current Summer release from
242
+ https://summerengine.com/download (or, with their OK, run
243
+ `summer install --yes`). Export again with it, and rerun this check on the
244
+ new `.zip` before you upload it.
245
+
246
+ ### 8. Every file the game reads at run time is in the pack
247
+
248
+ **Why.** The export packs scenes, scripts and imported assets. A file the
249
+ game opens itself by path (`FileAccess`, `DirAccess`, `load_from_file`,
250
+ `FontFile.load_dynamic_font`, `ConfigFile.load`) that has no `.import`
251
+ beside it, such as a `.bin`, `.json` or `.txt`, is a non-resource file. It
252
+ goes into the pack only when the preset's `include_filter` (**Resources >
253
+ Filters to export non-resource files/folders**) matches it and
254
+ `exclude_filter` doesn't. Each preset has its own filters: the summer.games
255
+ preset doesn't inherit one set on another preset. A file left out is not an
256
+ export error; on players' devices `FileAccess` just returns nothing and the
257
+ game's fallback runs. Fonts show it first: in the Summer Games app on iPhone
258
+ a `SystemFont` has no system fonts to use, so every glyph draws as a box,
259
+ while the editor, Local Play and desktop find a system font and look right.
260
+ A real release shipped this way: its font file was missing from the
261
+ uploaded pack, and every letter on iPhone was a box.
262
+
263
+ **Check it.**
264
+
265
+ 1. Find every read by path:
266
+ `grep -rn -E 'FileAccess\.|DirAccess\.|load_from_file|load_dynamic_font|ConfigFile' --include=*.gd .`
267
+ Note each `res://` file or folder they read; skip `user://` (saves). A
268
+ file is raw when no `<file>.import` sits beside it.
269
+ 2. Check the filters:
270
+ `grep -n -E '^name=|^include_filter=|^exclude_filter=' export_presets.cfg`.
271
+ The summer.games preset's `include_filter` must match each raw file the
272
+ client reads, and its `exclude_filter` must not. Do the same on the
273
+ server preset for files the authority reads.
274
+ 3. List the pack. Save this script **outside** the project, for example as
275
+ `~/list_pack.gd`:
276
+
277
+ ```gdscript
278
+ extends SceneTree
279
+ # Prints one "PACK res://..." line per file in the pack mounted with --main-pack.
280
+ func _init() -> void:
281
+ _walk("res://")
282
+ quit()
283
+
284
+ func _walk(dir: String) -> void:
285
+ var d := DirAccess.open(dir)
286
+ if d == null:
287
+ return
288
+ d.include_hidden = true
289
+ for f in d.get_files():
290
+ print("PACK ", dir.path_join(f))
291
+ for s in d.get_directories():
292
+ _walk(dir.path_join(s))
293
+ ```
294
+
295
+ ```sh
296
+ perl -e 'alarm shift; exec @ARGV' 60 <summer> --headless --main-pack build/bundle/client.pck --script ~/list_pack.gd > build/client-pack.txt 2>&1
297
+ grep -Fx 'PACK res://fonts/MyFont.bin' build/client-pack.txt # once per raw file from step 1
298
+ ```
299
+
300
+ Every raw file must print its line. No line means the file is not in the
301
+ pack, whatever the preset says. List `server.pck` the same way for files
302
+ the authority reads.
303
+ 4. `grep -rn SystemFont --include=*.gd --include=*.tscn --include=*.tres .`
304
+ must find nothing on a path phone players reach, fallbacks included.
305
+ 5. After publishing, open the game on an iPhone in the Summer Games app and
306
+ look at the title and one menu: letters, not boxes. An agent can't do
307
+ this step; report it as **not run** and ask the user.
308
+
309
+ **Fix.** Add each missing file to the summer.games preset's non-resource
310
+ filter (for example `fonts/*.bin`), or import it as a resource instead.
311
+ Ship the font in the project (an imported `.ttf`/`.otf`, or raw bytes that
312
+ step 3 proves are packed) and fall back to `ThemeDB.fallback_font`, Summer's
313
+ built-in font, never to `SystemFont`. Export again and rerun steps 3 and 5.
314
+
315
+ ### 9. Export with the Summer version line the Summer Games apps run
316
+
317
+ **Why.** The Summer Games apps for iPhone and Android carry Summer inside
318
+ the app and download none. An app starts a game only when the export's
319
+ `summerVersion` has the app's MAJOR.MINOR (for example `0.7`) and a patch no
320
+ newer than the app's. A `0.6.x` export doesn't start in an app that carries
321
+ `0.7`: the player sees **The game could not start**. The desktop app fetches
322
+ the right Summer for each game, so the game can run on Mac and Windows and
323
+ still fail on every phone. The upload checks don't catch it.
324
+
325
+ **Check it.**
326
+
327
+ 1. Read the stamp and platforms:
328
+ `python3 -c 'import json; b=json.load(open("build/bundle/summer-bundle.json")); print(b["export"]["summerVersion"], b["client"]["targetPlatforms"])'`
329
+ 2. If `targetPlatforms` lists `ios` or `android`, the first two numbers of
330
+ `summerVersion` must match the current Summer release, shown on
331
+ https://summerengine.com/download and in Help > About after updating.
332
+ 3. After publishing, open the game on a phone in the Summer Games app, as in
333
+ check 2. "The game could not start" there, while desktop works, is this
334
+ check failing.
335
+
336
+ **Fix.** Ask the user to update Summer to the current release (or, with
337
+ their OK, run `summer install --yes`). Export again, upload it as a new
338
+ version and promote it. Do this again after every Summer minor update
339
+ (0.6 to 0.7), because the apps move to the new line.
340
+
341
+ ### 10. A signed-in player keeps playing for three minutes
342
+
343
+ **Why.** While the game runs, it calls Summer services for the signed-in
344
+ player: analytics, player data, the store. A short test can end before the
345
+ first of those calls. A real release closed for every player about a minute
346
+ in, with "That link can't be opened", and left them signed out: a Summer
347
+ service refused the player's sign-in, and the app ended play. The fault was
348
+ Summer's, not the game's, and no check on the game's files could see it.
349
+
350
+ **Check it.** After publishing, sign in to a Summer Games app on a phone,
351
+ open the released version and play it for at least 3 minutes, through at
352
+ least one analytics event. The game must not close, and the player must
353
+ still be signed in afterwards. Do it in each Summer Games app the game
354
+ targets. An agent can't do this step; report it as **not run** and ask the
355
+ user, then record what they saw.
356
+
357
+ **Fix.** Nothing in the game. Ask the user to report it to Summer with the
358
+ game's name, the app and the time it happened.
359
+
360
+ ## Troubleshooting
361
+
362
+ ### Every online join fails with `world_start_timeout`, but Local Play works
363
+
364
+ Most likely, in this order:
365
+
366
+ 1. The server pack starts the wrong scene. Run check 1.
367
+ 2. The game passes a fixed Game ID. Run check 6.
368
+
369
+ After the fix, export a new `.zip`, upload it, promote it and run check 2.
370
+
371
+ ### The game opens to a blank window for every player
372
+
373
+ The game works in your editor, but every player sees an empty or black
374
+ window. Running the client pack as in check 7 prints
375
+ `Parse Error: Static function "…" not found` and
376
+ `Failed to load script "res://…"`. A development build of Summer made the
377
+ export, and the scripts use something the released version doesn't have.
378
+ Re-export with the current Summer release, upload the new version and
379
+ promote it.
380
+
381
+ ### Text shows as boxes on iPhone
382
+
383
+ Every letter draws as an empty box in the Summer Games app on iPhone, while
384
+ the game looks right on desktop. The game most likely reads a font file that
385
+ isn't in the pack and falls back to `SystemFont`. Run check 8.
386
+
387
+ ### "The game could not start" on iPhone or Android
388
+
389
+ The game works on desktop, but the phone app says "The game could not
390
+ start". The `.zip` most likely comes from a Summer version line the app
391
+ doesn't carry. Run check 9, then export again with the current Summer
392
+ release, upload and promote.
393
+
394
+ ### The game closes after about a minute and the player is signed out
395
+
396
+ The Summer Games app closes the game 20 to 60 seconds into play with "Play
397
+ paused" or "That link can't be opened", and the player finds they are signed
398
+ out. A Summer service refused the player's sign-in while the game played.
399
+ This is Summer's fault, not the game's: see check 10, and ask the user to
400
+ report it with the time it happened.
401
+
402
+ ### The game server's log is empty
403
+
404
+ An empty server log is not proof that the server hung or never started. A
405
+ release server holds back what the game prints until it exits when it isn't
406
+ attached to a terminal, so its log can look empty while the title scene
407
+ runs. Don't debug from the empty log; run check 1 on your own computer to
408
+ see which scene starts.
409
+
410
+ ## Add a check after every incident
411
+
412
+ The list grows from real failures. When a release fails in a way no check
413
+ here would have caught:
414
+
415
+ 1. Fix the game, and record the cause in the project's `.summer/memory/`.
416
+ 2. Write the check that would have caught it: **Why**, **Check it** (a
417
+ command to run or something to observe, against the real summer.games
418
+ `.zip`), and **Fix**.
419
+ 3. Propose it for this skill and for the docs page
420
+ (`/publishing/release-readiness`), with the same number in both, through
421
+ a pull request to summerengine/summer and to the docs. Until it lands,
422
+ keep it in the project's memory so the next release runs it.
423
+
424
+ ## Checklist
425
+
426
+ - [ ] Ran the checks on the summer.games `.zip` you upload, not a separately exported pack.
427
+ - [ ] 1. The bundle's `server.pck`, run with no scene, loads the authority scene first.
428
+ - [ ] 2. A real online join with the released version reaches the game (or is reported as not run).
429
+ - [ ] 3. A new player reaches online play without changing a setting, or the user confirmed it is off on purpose.
430
+ - [ ] 4. Online progress is loaded and committed through authority player data, and survives a fresh install.
431
+ - [ ] 5. Players can get back to the title from inside a session, online and offline.
432
+ - [ ] 6. Every `Summer.initialize` passes no ID, or an ID the game got from Summer.
433
+ - [ ] 7. The export stamp names a released Summer and its `engineSha`, and `client.pck` run on that released Summer prints no `SCRIPT ERROR`, `Parse Error` or `Failed to load script`.
434
+ - [ ] 8. Every file the game reads by path has a `PACK res://…` line in the listing of `client.pck` (or `server.pck`), no phone text uses `SystemFont`, and text shows as letters on an iPhone (or is reported as not run).
435
+ - [ ] 9. For an iPhone or Android bundle, `summerVersion` has the current Summer release's MAJOR.MINOR.
436
+ - [ ] 10. A signed-in player played the released version for 3 minutes in each Summer Games app, through an analytics event, without the game closing or being signed out (or it is reported as not run).
437
+ - [ ] One line per check reported to the user before anything is changed.
@@ -0,0 +1,44 @@
1
+ id: skill/release-readiness
2
+ kind: skill
3
+ version: 1.0.0
4
+ summary: "Before releasing a Summer game version, prove players can play it: server scene, online join, progress, Game ID, released Summer, packed files, app version."
5
+ use_when:
6
+ - "before uploading, promoting or releasing a new version to players: is it ready to release"
7
+ - "every online join fails with world_start_timeout, or the hosted server's log is empty, while Local Play works"
8
+ - "Summer.initialize fails with game_identity_mismatch: the initialized Game ID does not match hosted runtime context"
9
+ - "checking that a hosted game's server.pck starts the authority scene and not the title screen"
10
+ - "players get a blank or black screen when they open the released game, but it runs in the editor: client scripts fail with Parse Error or Failed to load script"
11
+ - "text shows as boxes on iPhone but looks fine on desktop: a font or other file read with FileAccess is missing from the pack, or SystemFont is used"
12
+ - "the Summer Games phone app says the game could not start, but it works on desktop: the game's Summer version line differs from the app's"
13
+ - "the game closes about a minute into play with Play paused or That link can't be opened, and the player is signed out"
14
+ - "a game release failed for players and the check that would have caught it needs adding"
15
+ do_not_use_when:
16
+ - "only producing a local export for a jam or prototype nobody else plays — skill/export-and-ship"
17
+ facets:
18
+ lifecycle:
19
+ - launch
20
+ - support
21
+ domains:
22
+ - deployment
23
+ - multiplayer
24
+ - playtest
25
+ modalities:
26
+ - project
27
+ - docs
28
+ compatibility:
29
+ engine: ">=4.6"
30
+ related:
31
+ skills:
32
+ - skill/multiplayer
33
+ - skill/multiplayer-publish
34
+ - skill/multiplayer-testing
35
+ - skill/multiplayer-project
36
+ - skill/summer-player-data
37
+ - skill/publish-your-game
38
+ - skill/export-and-ship
39
+ - skill/make-game
40
+ - skill/bounded-engine-runs
41
+ source: official
42
+ license: MIT
43
+ status: preview
44
+ recommended: false