@maccesar/titools 5.1.1 → 5.2.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 (98) hide show
  1. package/CONTRIBUTING.md +69 -0
  2. package/README.md +112 -72
  3. package/agents/ti-pro.md +5 -1
  4. package/commands/ti-audit.md +5 -1
  5. package/docs/examples.md +91 -0
  6. package/docs/knowledge-index.md +57 -0
  7. package/lib/config.js +2 -0
  8. package/lib/downloader.js +1 -1
  9. package/package.json +4 -2
  10. package/skills/purgetss/references/multi-density-images.md +1 -1
  11. package/skills/ti-admob-unified/SKILL.md +58 -0
  12. package/skills/ti-admob-unified/agents/openai.yaml +4 -0
  13. package/skills/ti-admob-unified/assets/example/app.js +1207 -0
  14. package/skills/ti-admob-unified/assets/example/lib/ads.js +646 -0
  15. package/skills/ti-admob-unified/assets/example/library-usage.js +136 -0
  16. package/skills/ti-admob-unified/references/api-reference.md +615 -0
  17. package/skills/ti-admob-unified/references/banners.md +435 -0
  18. package/skills/ti-admob-unified/references/contributing.md +233 -0
  19. package/skills/ti-admob-unified/references/dependencies.md +91 -0
  20. package/skills/ti-admob-unified/references/fullscreen.md +238 -0
  21. package/skills/ti-admob-unified/references/game-monetization.md +148 -0
  22. package/skills/ti-admob-unified/references/getting-started.md +319 -0
  23. package/skills/ti-admob-unified/references/index.md +33 -0
  24. package/skills/ti-admob-unified/references/integration.md +87 -0
  25. package/skills/ti-admob-unified/references/library.md +220 -0
  26. package/skills/ti-admob-unified/references/mediation-parity.md +17 -0
  27. package/skills/ti-admob-unified/references/mediation.md +145 -0
  28. package/skills/ti-admob-unified/references/migration.md +259 -0
  29. package/skills/ti-admob-unified/references/module-changelog.md +84 -0
  30. package/skills/ti-admob-unified/references/module-license.txt +21 -0
  31. package/skills/ti-admob-unified/references/privacy.md +281 -0
  32. package/skills/ti-admob-unified/references/production.md +67 -0
  33. package/skills/ti-admob-unified/references/rewarded-interstitial.md +101 -0
  34. package/skills/ti-admob-unified/references/roadmap.md +143 -0
  35. package/skills/ti-admob-unified/references/source-notes.md +80 -0
  36. package/skills/ti-admob-unified/references/source-snapshot.json +644 -0
  37. package/skills/ti-admob-unified/references/third-party-notices.md +22 -0
  38. package/skills/ti-game/SKILL.md +31 -5
  39. package/skills/ti-game/references/api.md +36 -24
  40. package/skills/ti-game/references/debugging-performance.md +22 -7
  41. package/skills/ti-game/references/examples.md +113 -20
  42. package/skills/ti-game/references/input.md +101 -0
  43. package/skills/ti-game/references/patterns.md +56 -10
  44. package/skills/ti-game/references/physics.md +530 -0
  45. package/skills/ti-game/references/project-setup.md +131 -47
  46. package/skills/ti-game/references/recipes-action.md +149 -18
  47. package/skills/ti-game/references/recipes-adventure-effects.md +47 -4
  48. package/skills/ti-game/references/roadmap.md +11 -4
  49. package/skills/ti-game/references/source-notes.md +81 -0
  50. package/skills/ti-game/references/tilemaps.md +13 -4
  51. package/skills/ti-game-assets/SKILL.md +53 -0
  52. package/skills/ti-game-assets/agents/openai.yaml +4 -0
  53. package/skills/ti-game-assets/references/alpha.md +26 -0
  54. package/skills/ti-game-assets/references/art-direction.md +37 -0
  55. package/skills/ti-game-assets/references/integration.md +49 -0
  56. package/skills/ti-game-assets/references/manifest.example.json +429 -0
  57. package/skills/ti-game-assets/references/manifest.md +39 -0
  58. package/skills/ti-game-assets/references/offline-audio.md +33 -0
  59. package/skills/ti-game-assets/references/prompts.md +33 -0
  60. package/skills/ti-game-assets/references/repeating-textures.md +17 -0
  61. package/skills/ti-game-assets/references/responsible-ads.md +31 -0
  62. package/skills/ti-game-assets/references/sound-assets.md +42 -0
  63. package/skills/ti-game-assets/references/vector-sources.md +21 -0
  64. package/skills/ti-game-assets/scripts/alpha_tools.py +160 -0
  65. package/skills/ti-game-assets/scripts/requirements.txt +1 -0
  66. package/skills/ti-game-assets/scripts/validate_manifest.py +267 -0
  67. package/skills/ti-synthengine/SKILL.md +77 -67
  68. package/skills/ti-synthengine/assets/example/README.md +84 -0
  69. package/skills/ti-synthengine/assets/example/app.js +1178 -0
  70. package/skills/ti-synthengine/assets/example/lib/sequenceOwner.js +83 -0
  71. package/skills/ti-synthengine/assets/example/lib/sequenceScore.js +25 -0
  72. package/skills/ti-synthengine/references/advanced-examples.md +174 -0
  73. package/skills/ti-synthengine/references/android-sim80-correction-evidence.zip +0 -0
  74. package/skills/ti-synthengine/references/android-sim80-correction.json +162 -0
  75. package/skills/ti-synthengine/references/api.md +573 -153
  76. package/skills/ti-synthengine/references/audio-engine.md +272 -124
  77. package/skills/ti-synthengine/references/bypass-physical-recheck-evidence.zip +0 -0
  78. package/skills/ti-synthengine/references/examples.md +355 -106
  79. package/skills/ti-synthengine/references/frontier-android-evidence.zip +0 -0
  80. package/skills/ti-synthengine/references/frontier-ipad-evidence.zip +0 -0
  81. package/skills/ti-synthengine/references/frontier-physical-validation.json +1918 -0
  82. package/skills/ti-synthengine/references/guide.md +426 -75
  83. package/skills/ti-synthengine/references/performance-review-evidence.zip +0 -0
  84. package/skills/ti-synthengine/references/performance-review.json +1146 -0
  85. package/skills/ti-synthengine/references/physical-validation.json +1457 -0
  86. package/skills/ti-synthengine/references/recipes-interaction.md +549 -0
  87. package/skills/ti-synthengine/references/recipes.md +434 -420
  88. package/skills/ti-synthengine/references/recommendations.md +72 -85
  89. package/skills/ti-synthengine/references/sound-design.md +375 -155
  90. package/skills/ti-synthengine/references/source-notes.md +109 -0
  91. package/skills/ti-synthengine/references/source-snapshot.json +452 -0
  92. package/skills/ti-synthengine/references/stats-performance.json +2992 -0
  93. package/skills/ti-synthengine/references/stats-performance.md +82 -0
  94. package/skills/ti-synthengine/references/studio-validation.json +6202 -0
  95. package/skills/ti-synthengine/references/troubleshooting.md +123 -78
  96. package/skills/ti-synthengine/references/unified-bypass-performance.json +22425 -0
  97. package/skills/ti-synthengine/references/unified-validation.json +314 -0
  98. package/AGENTS-VERCEL-RESEARCH.md +0 -175
@@ -0,0 +1,429 @@
1
+ {
2
+ "schema_version": 1,
3
+ "contracts": {
4
+ "demo-world": {
5
+ "notes": "Minimal example; declare other required families for the real game. Sound assets are separate from PNG frames.",
6
+ "resources": [
7
+ {
8
+ "resource": "ship",
9
+ "family": "players",
10
+ "variant": "scout",
11
+ "state": "intact",
12
+ "frames": 1
13
+ },
14
+ {
15
+ "resource": "ship",
16
+ "family": "players",
17
+ "variant": "scout",
18
+ "state": "damaged",
19
+ "frames": 1
20
+ },
21
+ {
22
+ "resource": "explosion",
23
+ "family": "ambient",
24
+ "variant": "metal",
25
+ "state": "burst",
26
+ "frames": 3
27
+ },
28
+ {
29
+ "resource": "sky-far",
30
+ "family": "backgrounds",
31
+ "variant": "base",
32
+ "state": "idle",
33
+ "frames": 1
34
+ },
35
+ {
36
+ "resource": "sky-middle",
37
+ "family": "backgrounds",
38
+ "variant": "base",
39
+ "state": "idle",
40
+ "frames": 1
41
+ },
42
+ {
43
+ "resource": "sky-near",
44
+ "family": "backgrounds",
45
+ "variant": "base",
46
+ "state": "idle",
47
+ "frames": 1
48
+ }
49
+ ],
50
+ "sounds": [
51
+ {
52
+ "sound": "explosion-metal",
53
+ "variants": [
54
+ "a",
55
+ "b",
56
+ "c"
57
+ ]
58
+ }
59
+ ],
60
+ "parallax": true
61
+ }
62
+ },
63
+ "sets": [
64
+ {
65
+ "id": "world-one",
66
+ "contract": "demo-world",
67
+ "assets": [
68
+ {
69
+ "resource": "ship",
70
+ "family": "players",
71
+ "variant": "scout",
72
+ "state": "intact",
73
+ "id": "ship-scout-intact-0",
74
+ "frame": 0,
75
+ "source": "art/masters/ship-scout-intact-0.png",
76
+ "dimensions": [
77
+ 1024,
78
+ 1024
79
+ ],
80
+ "canvas": [
81
+ 1024,
82
+ 1024
83
+ ],
84
+ "pivot": [
85
+ 512,
86
+ 512
87
+ ],
88
+ "style": "hd",
89
+ "transparency": true,
90
+ "provenance": {
91
+ "prompt": "Replace with the actual art-contract prompt",
92
+ "tool": "image_gen",
93
+ "reference_roles": {},
94
+ "lineage": "original"
95
+ }
96
+ },
97
+ {
98
+ "resource": "ship",
99
+ "family": "players",
100
+ "variant": "scout",
101
+ "state": "damaged",
102
+ "id": "ship-scout-damaged-0",
103
+ "frame": 0,
104
+ "source": "art/masters/ship-scout-damaged-0.png",
105
+ "dimensions": [
106
+ 1024,
107
+ 1024
108
+ ],
109
+ "canvas": [
110
+ 1024,
111
+ 1024
112
+ ],
113
+ "pivot": [
114
+ 512,
115
+ 512
116
+ ],
117
+ "style": "hd",
118
+ "transparency": true,
119
+ "provenance": {
120
+ "prompt": "Replace with the actual art-contract prompt",
121
+ "tool": "image_gen",
122
+ "reference_roles": {},
123
+ "lineage": "original"
124
+ }
125
+ },
126
+ {
127
+ "resource": "explosion",
128
+ "family": "ambient",
129
+ "variant": "metal",
130
+ "state": "burst",
131
+ "id": "explosion-metal-burst-0",
132
+ "frame": 0,
133
+ "source": "art/masters/explosion-metal-burst-0.png",
134
+ "dimensions": [
135
+ 1024,
136
+ 1024
137
+ ],
138
+ "canvas": [
139
+ 1024,
140
+ 1024
141
+ ],
142
+ "pivot": [
143
+ 512,
144
+ 512
145
+ ],
146
+ "style": "soft-fx",
147
+ "transparency": true,
148
+ "provenance": {
149
+ "prompt": "Replace with the actual art-contract prompt",
150
+ "tool": "image_gen",
151
+ "reference_roles": {},
152
+ "lineage": "original"
153
+ }
154
+ },
155
+ {
156
+ "resource": "explosion",
157
+ "family": "ambient",
158
+ "variant": "metal",
159
+ "state": "burst",
160
+ "id": "explosion-metal-burst-1",
161
+ "frame": 1,
162
+ "source": "art/masters/explosion-metal-burst-1.png",
163
+ "dimensions": [
164
+ 1024,
165
+ 1024
166
+ ],
167
+ "canvas": [
168
+ 1024,
169
+ 1024
170
+ ],
171
+ "pivot": [
172
+ 512,
173
+ 512
174
+ ],
175
+ "style": "soft-fx",
176
+ "transparency": true,
177
+ "provenance": {
178
+ "prompt": "Replace with the actual art-contract prompt",
179
+ "tool": "image_gen",
180
+ "reference_roles": {},
181
+ "lineage": "original"
182
+ }
183
+ },
184
+ {
185
+ "resource": "explosion",
186
+ "family": "ambient",
187
+ "variant": "metal",
188
+ "state": "burst",
189
+ "id": "explosion-metal-burst-2",
190
+ "frame": 2,
191
+ "source": "art/masters/explosion-metal-burst-2.png",
192
+ "dimensions": [
193
+ 1024,
194
+ 1024
195
+ ],
196
+ "canvas": [
197
+ 1024,
198
+ 1024
199
+ ],
200
+ "pivot": [
201
+ 512,
202
+ 512
203
+ ],
204
+ "style": "soft-fx",
205
+ "transparency": true,
206
+ "provenance": {
207
+ "prompt": "Replace with the actual art-contract prompt",
208
+ "tool": "image_gen",
209
+ "reference_roles": {},
210
+ "lineage": "original"
211
+ }
212
+ },
213
+ {
214
+ "resource": "sky-far",
215
+ "family": "backgrounds",
216
+ "variant": "base",
217
+ "state": "idle",
218
+ "id": "sky-far-base-idle-0",
219
+ "frame": 0,
220
+ "source": "art/masters/sky-far-base-idle-0.png",
221
+ "dimensions": [
222
+ 1024,
223
+ 1024
224
+ ],
225
+ "canvas": [
226
+ 1024,
227
+ 1024
228
+ ],
229
+ "pivot": [
230
+ 512,
231
+ 512
232
+ ],
233
+ "style": "hd",
234
+ "transparency": false,
235
+ "provenance": {
236
+ "prompt": "Replace with the actual art-contract prompt",
237
+ "tool": "image_gen",
238
+ "reference_roles": {},
239
+ "lineage": "original"
240
+ }
241
+ },
242
+ {
243
+ "resource": "sky-middle",
244
+ "family": "backgrounds",
245
+ "variant": "base",
246
+ "state": "idle",
247
+ "id": "sky-middle-base-idle-0",
248
+ "frame": 0,
249
+ "source": "art/masters/sky-middle-base-idle-0.png",
250
+ "dimensions": [
251
+ 1024,
252
+ 1024
253
+ ],
254
+ "canvas": [
255
+ 1024,
256
+ 1024
257
+ ],
258
+ "pivot": [
259
+ 512,
260
+ 512
261
+ ],
262
+ "style": "hd",
263
+ "transparency": true,
264
+ "provenance": {
265
+ "prompt": "Replace with the actual art-contract prompt",
266
+ "tool": "image_gen",
267
+ "reference_roles": {},
268
+ "lineage": "original"
269
+ }
270
+ },
271
+ {
272
+ "resource": "sky-near",
273
+ "family": "backgrounds",
274
+ "variant": "base",
275
+ "state": "idle",
276
+ "id": "sky-near-base-idle-0",
277
+ "frame": 0,
278
+ "source": "art/masters/sky-near-base-idle-0.png",
279
+ "dimensions": [
280
+ 1024,
281
+ 1024
282
+ ],
283
+ "canvas": [
284
+ 1024,
285
+ 1024
286
+ ],
287
+ "pivot": [
288
+ 512,
289
+ 512
290
+ ],
291
+ "style": "hd",
292
+ "transparency": true,
293
+ "provenance": {
294
+ "prompt": "Replace with the actual art-contract prompt",
295
+ "tool": "image_gen",
296
+ "reference_roles": {},
297
+ "lineage": "original"
298
+ }
299
+ }
300
+ ],
301
+ "sounds": [
302
+ {
303
+ "id": "explosion-metal-a",
304
+ "sound": "explosion-metal",
305
+ "variant": "a",
306
+ "source": "audio/recipes.js",
307
+ "reference": "explosions.metal.a",
308
+ "kind": "effect",
309
+ "design": {
310
+ "semantic_event": "explosion",
311
+ "timbre": "filtered noise and metallic body",
312
+ "envelope": "Specify validated attack/decay/sustain/release",
313
+ "variation": "related texture variants without immediate repeat",
314
+ "stereo": "bounded screen-position pan, coherent event layers",
315
+ "overlap": "derive voice budget and gain from busy scenes",
316
+ "owner": "existing project audio service"
317
+ },
318
+ "provenance": {
319
+ "contract": "Read current ti-synthengine API before implementing",
320
+ "rationale": "material-specific cue"
321
+ }
322
+ },
323
+ {
324
+ "id": "explosion-metal-b",
325
+ "sound": "explosion-metal",
326
+ "variant": "b",
327
+ "source": "audio/recipes.js",
328
+ "reference": "explosions.metal.b",
329
+ "kind": "effect",
330
+ "design": {
331
+ "semantic_event": "explosion",
332
+ "timbre": "filtered noise and metallic body",
333
+ "envelope": "Specify validated attack/decay/sustain/release",
334
+ "variation": "related texture variants without immediate repeat",
335
+ "stereo": "bounded screen-position pan, coherent event layers",
336
+ "overlap": "derive voice budget and gain from busy scenes",
337
+ "owner": "existing project audio service"
338
+ },
339
+ "provenance": {
340
+ "contract": "Read current ti-synthengine API before implementing",
341
+ "rationale": "material-specific cue"
342
+ }
343
+ },
344
+ {
345
+ "id": "explosion-metal-c",
346
+ "sound": "explosion-metal",
347
+ "variant": "c",
348
+ "source": "audio/recipes.js",
349
+ "reference": "explosions.metal.c",
350
+ "kind": "effect",
351
+ "design": {
352
+ "semantic_event": "explosion",
353
+ "timbre": "filtered noise and metallic body",
354
+ "envelope": "Specify validated attack/decay/sustain/release",
355
+ "variation": "related texture variants without immediate repeat",
356
+ "stereo": "bounded screen-position pan, coherent event layers",
357
+ "overlap": "derive voice budget and gain from busy scenes",
358
+ "owner": "existing project audio service"
359
+ },
360
+ "provenance": {
361
+ "contract": "Read current ti-synthengine API before implementing",
362
+ "rationale": "material-specific cue"
363
+ }
364
+ }
365
+ ],
366
+ "aliases": {
367
+ "player": "ship-scout-intact-0"
368
+ },
369
+ "parallax": [
370
+ {
371
+ "depth": "far",
372
+ "asset": "sky-far-base-idle-0",
373
+ "order": 0,
374
+ "transparent": false,
375
+ "repeat": "x",
376
+ "displacement": [
377
+ 0.1,
378
+ 0
379
+ ]
380
+ },
381
+ {
382
+ "depth": "middle",
383
+ "asset": "sky-middle-base-idle-0",
384
+ "order": 1,
385
+ "transparent": true,
386
+ "repeat": "x",
387
+ "displacement": [
388
+ 0.4,
389
+ 0
390
+ ]
391
+ },
392
+ {
393
+ "depth": "near",
394
+ "asset": "sky-near-base-idle-0",
395
+ "order": 2,
396
+ "transparent": true,
397
+ "repeat": "x",
398
+ "displacement": [
399
+ 0.8,
400
+ 0
401
+ ]
402
+ }
403
+ ],
404
+ "events": [
405
+ {
406
+ "event": "explosion-metal-a",
407
+ "visual": "explosion-metal-burst-0",
408
+ "sound": "explosion-metal-a",
409
+ "timing": "discrete"
410
+ },
411
+ {
412
+ "event": "explosion-metal-b",
413
+ "visual": "explosion-metal-burst-0",
414
+ "sound": "explosion-metal-b",
415
+ "timing": "discrete"
416
+ },
417
+ {
418
+ "event": "explosion-metal-c",
419
+ "visual": "explosion-metal-burst-0",
420
+ "sound": "explosion-metal-c",
421
+ "timing": "discrete"
422
+ }
423
+ ],
424
+ "exports": {
425
+ "note": "Declare real atlas/HUD/preview/density paths and exporter commands here"
426
+ }
427
+ }
428
+ ]
429
+ }
@@ -0,0 +1,39 @@
1
+ # Manifest contract (schema version 1)
2
+
3
+ Use `manifest.example.json` as a template, not a shipped asset library. Its paths are placeholders for actual project sources; validation must fail until those files exist. Paths resolve from the manifest directory or `--root`.
4
+
5
+ ```bash
6
+ python3 scripts/validate_manifest.py path/to/manifest.json --root path/to/project
7
+ ```
8
+
9
+ `contracts` maps names to required inventories. Each resource definition declares `resource`, `family`, `variant`, `state` and positive `frames`. Every frame 0..frames-1 must exist exactly once in each set using that contract. Define another contract when a game/world/level needs a different set; never force every world to match a remembered 44/45 file count. List omissions intentionally in the contract's notes. Families are `players`, `enemies`, `allies`, `obstacles`, `ammunition`, `rewards`, `ambient`, `backgrounds`, `technical`.
10
+
11
+ Each set has `id`, `contract`, `assets`, `sounds`, `aliases`, optional `parallax` and `events`. Each PNG asset has a unique `id`, the contract identity fields, zero-based `frame`, existing `source`, positive integer `dimensions` and `canvas`, finite pixel `pivot`, `style` (`pixel-art`, `hard-surface`, `soft-fx`, `hd`), Boolean `transparency` and `provenance.prompt`. Record generator/tool, reference roles and edit lineage in provenance. Pixel art additionally requires `logical_size`.
12
+
13
+ Masters retain their full common canvas. All states and frames for one resource/variant must share canvas, pivot and logical size. The validator checks PNG dimensions, nonempty alpha and declared transparency (true requires actual transparent pixels; false requires an opaque image); it cannot recognize a painted checkerboard, grid quality or artistic continuity. Review those visually. For trimmed derivatives, store source dimensions, crop offset, output dimensions and adjusted pivot in the alpha report/export inventory; never substitute a trimmed derivative for the aligned master.
14
+
15
+ `aliases` maps alternate names directly to existing image or sound IDs, without hiding an ID or chaining aliases. Technical utilities are inventoried distinctly through their family, not mistaken for unique gameplay drawings. The count report separates unique visual resources, PNG frames, sound variants and aliases.
16
+
17
+ ## Sounds are assets
18
+
19
+ Contract `sounds` entries declare a sound family and its required named variants. Each set supplies every variant exactly once. A sound entry has `id`, `sound`, `variant`, an existing `source` code/data file, a `reference` identifying the recipe/pattern within it, `kind` (`effect`, `sustained`, `music`, `ambient`, `ui`), `design` and `provenance`. Synthesized sounds do not need a WAV or PNG; their reusable source is the recipe and its parameters. Keep sound assets distinct from image frames.
20
+
21
+ Record semantic purpose, waveform/timbre, envelope, pitch movement, filters/FM, duration, gain, voice/overlap budget, variation strategy, stereo placement and lifecycle owner in design when relevant. Record which `ti-synthengine` contract/references were consulted. The inventory validator proves source presence and variant completeness, not that a symbol exists or synthesis options are accepted: verify recipe references and calls against the current module contract separately.
22
+
23
+ `events` maps a semantic `event` to an image ID, sound ID and `timing` (`discrete`, `sustained`, `music`). Use variant-specific bindings where needed. An explosion sound starts at the explosion event, not once per animation frame. Sound-only/UI events may live in the project's audio inventory without requiring a made-up visual; this audiovisual mapping is only for events having both.
24
+
25
+ ## Parallax and derived outputs
26
+
27
+ When the contract declares `parallax: true`, provide exactly three independent background assets: `far`, `middle`, `near`. Each layer declares `asset`, integer `order` increasing with depth, Boolean `transparent` matching its source asset, `repeat` (`none`, `x`, `y`, `xy`) and finite `[x,y]` displacement. Review seams and actual native scrolling separately. Transparency of opaque distant skies and translucent nearer layers is a style choice declared here.
28
+
29
+ Extend the manifest with project-specific `exports` (atlas/JSON/frame map, HUD/cards/previews/menu/densities), collision-overlay references and source-to-output dependencies. Reuse the project's validator/exporter for those formats. The bundled validator validates masters/inventory only; include its report and the project export checks in acceptance. Quantities are compared within a named contract, not across unlike contracts.
30
+
31
+ For each export destination, record the selected resources/aliases and their actual consumer. Keep this selection distinct from the complete source inventory: menu icons, HD previews, Archive cards and covers can require different subsets. An unused source or alias is not a reason to generate a UI copy. Follow [integration.md](integration.md#export-only-what-each-consumer-uses) for selection, obsolete-density cleanup and package verification.
32
+
33
+ ## Optional reproducible sources and audio files
34
+
35
+ For vector-authored artwork, `vector_source` points at the existing SVG with a finite, positive-extent `viewBox`; `source` remains the full-canvas PNG render checked for image geometry. Preserve the actual editable source and record generator/render settings. `build.files` optionally maps all source, generator and generated paths to lowercase SHA-256 hashes, checked against existing files. See [vector-sources.md](vector-sources.md).
36
+
37
+ For offline audio, a sound can add `wav: {file, sample_rate, channels, sample_width, frames, loop}`. `sample_width` is bytes/sample; numeric header fields are positive integers and `loop` is Boolean. The validator checks nonempty PCM headers and complete payloads; signal/loop quality is a separate analysis. See [offline-audio.md](offline-audio.md).
38
+
39
+ Project-specific `tiling` and ad policy metadata remain checked by project verifiers, not by this inventory helper. See [repeating-textures.md](repeating-textures.md) and [responsible-ads.md](responsible-ads.md).
@@ -0,0 +1,33 @@
1
+ # Procedural WAV sources and audio analysis
2
+
3
+ Support both runtime `ti.synthengine` recipes and offline synthesized WAV assets. Preserve the project's chosen backend: Lander generates PCM WAV with Python's `wave`/`struct` and deterministic synthesis; Guardian uses native recipes with generated WAV fallback. Do not install a synthesizer module just to generate a WAV. The authoring agent (Claude Code, Codex CLI, etc.) is provenance, not the synthesis algorithm.
4
+
5
+ Keep generator code, recipe parameters, seed, reference roles, sample rate, bit depth/sample width, channels, duration/frame count and loop/one-shot role. Store source and resulting file hashes. Choose formats compatible with the installed playback engine. Make fallback semantics match the requested cue, and preserve mute/preferences, pause, lifecycle and graceful failure. A mono WAV can still be spatialized if the playback backend supports it; do not assume that support.
6
+
7
+ ## Analysis and tools
8
+
9
+ Inspect available tools/versions before use. `ffprobe` reports codec, sample format, rate, channels and duration. FFmpeg can decode/convert, measure peak/RMS/DC statistics and draw spectral views; that does not automatically identify the notes in noisy or polyphonic effects. Use FFT/autocorrelation or a dedicated pitch estimator for an appropriate signal, state window/hop and uncertainty, and distinguish a harmonic peak from the fundamental. Music note naming is an optional interpretation under an explicit tuning reference, not a reliable description of every noise effect.
10
+
11
+ Examples (read/derived output only; choose new paths and inspect installed filter help):
12
+
13
+ ```bash
14
+ ffprobe -v error -select_streams a:0 -show_entries stream=codec_name,sample_rate,channels,bits_per_sample:format=duration -of json cue.wav
15
+ ffmpeg -hide_banner -i cue.wav -af astats -f null -
16
+ ffmpeg -n -i cue.wav -lavfi showspectrumpic=s=1024x512 -frames:v 1 /tmp/cue-spectrum.png
17
+ ```
18
+
19
+ Do not claim a historical project used FFmpeg unless its code/logs show it. Verified in this review: Lander's current generator writes WAV directly in Python; Guardian's `docs/scripts/generate-audio.js` writes RIFF/PCM directly in Node. Both can be analyzed with other tools without those tools being the original synthesizer.
20
+
21
+ ## Synthesis and loops
22
+
23
+ For a changing frequency, integrate frequency into phase (`phase[n+1] = phase[n] + 2π f[n]/sampleRate`); multiplying a time-varying frequency by time produces a different sweep. Keep oscillators/modulation below meaningful aliasing limits or use a suitable band-limited method; square/saw/noise/FM require listening beyond a peak check. Mix with headroom and verify clipped samples, DC offset, peak, RMS and tails; do not solve every mix by normalization.
24
+
25
+ A one-shot's fades/envelope must not automatically wrap around a loop. Measure amplitude continuity and local RMS through repeated joins, as well as phase/tangent continuity for tonal components. Integer cycles of tonal and modulation periods are one useful periodic construction, not a universal recipe for noisy loops. Check the complete mixed/noise signal too. Crossfading can help suitable ambience, but is not a substitute for reviewing the loop; detuned partials may introduce an unwanted amplitude beat.
26
+
27
+ Lander's documented thruster pulse came from fades inside the WAV, despite gapless playback. It rebuilt the loops with periodic tonal/modulation components and tested with an old-file positive control (`docs/project/decisions.md`, 2026-08-18; `scripts/generate_game_assets.py`). Preserve this diagnostic lesson rather than its exact frequencies or durations.
28
+
29
+ ## Manifest and acceptance
30
+
31
+ A sound may keep `source`/`reference` for its generator recipe and optionally declare `wav: {file, sample_rate, channels, sample_width, frames, loop}`. The validator checks an existing PCM WAV against those header fields and rejects empty/truncated payloads; it does not check pitch, clipping, loop quality or native playback. `sample_width` is bytes per sample. `loop` records intent, not a quality certificate. Use project analysis/tests and repeated listening to prove those properties.
32
+
33
+ Report separately: file/contract checks, signal analysis, native playback and headphone/phone listening. Preserve reference rights/provenance; original sound design based on technical observations does not authorize redistributing reference recordings or ROM/sample data.
@@ -0,0 +1,33 @@
1
+ # Prompt starting points
2
+
3
+ Replace brackets from the world's art contract. Attach only relevant references and explicitly identify their role. Use integrated `image_gen`, not a script/API, to create or edit raster art. These examples require review rather than guaranteeing generator compliance.
4
+
5
+ ## Pixel sprite
6
+
7
+ “Create one individual [player ship], strict [64×64] logical pixel grid represented as uniform proportional blocks on a transparent HD canvas. [Palette], [orientation/perspective], [materials], clear silhouette at game size. No cast, ground or external drop shadow; internal shading only. Match [style reference] for this family. Use the maximum useful canvas with tight framing of the complete silhouette, only the transparent edge needed to prevent clipping, and pivot [coordinates]. No antialiased subpixel edges or painted checkerboard.” Keep the master, prepare nearest-neighbor logical output and inspect grid/palette. A shared state/animation canvas overrides independent tight framing when its contract requires alignment.
8
+
9
+ For pixel-art effects, explicitly add: “Final atlas cell [32×32 impact / 64×64 explosion], visible phase extent [W×H], source-to-logical mapping [registered common grid / phase-specific grid]. Each logical pixel is one uniform square block of flat RGBA in the HD master, proportional to the actual final display size. No mixed block sizes, tiny HD texture or subpixel sparks. Smoke uses square clusters on the same grid, controlled partial-alpha steps and increasingly transparent outer clusters, with transparent gaps; no opaque grey backing shape or smooth painted smoke.” Inspect the actual reduced frame and neighboring phases with nearest-neighbor rendering; HD appearance alone is not acceptance.
10
+
11
+ ## Individual HD sprite
12
+
13
+ “Create one individual [power-up/ship/asteroid] as a transparent HD master in [world style and palette]. [Reference A] defines materials and rendering; [reference B] defines composition. Use the highest suitable supported generation quality, [appropriate aspect ratio] and maximum useful canvas coverage. Closely frame the entire subject with only minimal transparent edge clearance; preserve every outline and [declared effect extent], without clipping. Crisp angles and clean contours, finely defined [textures/material reflections], smooth controlled gradients and internal shading, readable silhouette at [display size]. No external shadow or painted checkerboard.” Record actual output dimensions, inspect alpha/detail and keep the original pixels. Do not insert arbitrary occupancy percentages or force the HD master to the small display size.
14
+
15
+ ## HD reconstruction
16
+
17
+ For a requested substantial mechanical reconstruction, use: “Create a freshly redrawn individual HD [ship/object]. [Original] defines recognizable design/topology only; [quality reference] defines the required finish. Rebuild the geometry with [required symmetry], precise straight panel lines, regular curved edges and concentric rings, defined bevels/joints/material textures, clean gradients and coherent [lighting]. Correct the original's warped shading and irregular curves. Use the highest useful native generation resolution and tight complete framing with real alpha. A near-identical copy with slight sharpening is insufficient.” Preserve deliberate design asymmetry where applicable; do not impose mechanical geometry on other styles. Inspect original, new master and final-size derivative together.
18
+
19
+ ## HD state edit
20
+
21
+ “Edit the attached [exact target], preserving canvas, silhouette, scale, orientation and pivot. Add [damage] in [specified areas] using the same [palette/materials/texture]. Real transparency, no external shadow, no cropping. [Second image] is a composition reference only.” Inspect both states overlaid; regenerate exports.
22
+
23
+ ## Soft explosion
24
+
25
+ “Create [frame description] of an explosion sequence in [style/palette]. Real transparent background with intentional faint smoke and [declared halo]. Common [canvas] and center [pivot] across frames, increasing radius [progression]. No ground/cast shadow.” Analyze alpha at all thresholds; preserve faint effect edges. Cleaning needs an explicit reviewed protected region.
26
+
27
+ ## Level and parallax with sound
28
+
29
+ “Design [world] using [contract], with players, enemies, allies, obstacles, ammunition, rewards, ambient objects and backgrounds as required. Produce independent far, middle and near parallax layers; [axes] repeat seamlessly with [transparency] and [order/displacement].” Complete the manifest before integration. If shot/explosion/ambience synthesis is requested, map semantic events to existing `ti.synthengine` sounds/patterns, consult its current contract and preserve the native clock; never trigger each frame.
30
+
31
+ ## Sound family with variants and stereo
32
+
33
+ “Create [three] related [metallic explosion] variants for [world/material] using `ti.synthengine`, keeping the same recognizable family and distinguishing texture/envelope rather than random volume alone. Place discrete events from their screen origin, keep event layers spatially coherent, preserve the current audio owner/clock/preferences and size the overlap budget from representative scenes. Inventory recipes and explain waveform/envelope/filter choices. Validate calls separately from device listening.” Read `sound-assets.md` and the current `ti-synthengine` references first.
@@ -0,0 +1,17 @@
1
+ # Textures, tiles and seamless repetition
2
+
3
+ Clarify what “symmetric” means: mirrored appearance, rotational symmetry, or periodic edges that repeat without a visible seam. A seamless texture need not be mirrored. Mirroring can join edges while leaving obvious center axes and repeated motifs, as Lander's terrain review found.
4
+
5
+ Declare repeat axes (`x`, `y`, `xy`, none), period, logical scale, opacity and allowed neighbors. A sky may repeat only horizontally; a terrain interior may repeat both ways; a surface tile has a free top silhouette and only joins an interior below. Specify corner/edge/interior roles and index order when topology matters. Never validate every pair as if all pairs are reachable in the level.
6
+
7
+ For raster creation request periodic edges and balanced visual density with integrated `image_gen`; inspect the result rather than assuming the prompt made it seamless. For authored SVG/procedural textures use periodic geometry and wrapped copies of border-crossing elements. With seeded stars/details, check spacing across the wrap boundary as well as inside the tile; otherwise a seam can create a cluster. Avoid modular placement rules that create diagonal bands.
8
+
9
+ Generate 3×3 repeated previews and offset the image by half its width/height to expose central seams. Test all reachable horizontal/vertical adjacency pairs and top-to-interior joins. Compare RGBA edges with premultiplied RGB and alpha separately so invisible RGB does not create false seams. Compare the edge jump to ordinary adjacent-pixel differences and inspect gradients/tangent continuity: identical end pixels alone cannot certify an invisible join. Record measured tolerance for the style; no universal numeric seam threshold applies to every texture.
10
+
11
+ Review at actual zoom/filtering and while native camera scrolling crosses the seam. Check larger patches for visible repetition, symmetry axes and brightness bands. Seam correctness and repetition fatigue are distinct concerns.
12
+
13
+ Use independent full textures for repeated backgrounds where the renderer repeats whole textures; do not assume an atlas frame repeats safely. Consult the installed `ti-game` build for texture-repeat restrictions (including power-of-two when required), filtering, UV inset and tile-layer support. A non-repeated atlas need not obey repeat-texture dimensions. For a circular world, coordinate world width, texture period and parallax factors so every layer returns to the same phase at wrap. Keep motion native.
14
+
15
+ Store project-specific `tiling` metadata (axes, period, allowed neighbors, edge roles and seam-preview paths) and validate it with the project's existing tile verifier. The bundled manifest validator checks inventory/parallax declarations, not rendered seam quality.
16
+
17
+ Evidence: Lander `docs/art/terrain-tiles.md` separates surface/interior topology and warns about visible mirror axes. Guardian `docs/art/README.md`, `docs/scripts/verify-art.js` and `docs/project/context.md` document periodic backgrounds, wrap spacing and circular parallax phase.
@@ -0,0 +1,31 @@
1
+ # Responsible monetization in the game flow
2
+
3
+ Advertising is a game lifecycle/experience concern, not an image or sound asset format. Route here when the user requests monetization or the task touches existing ad transitions; do not initialize ads because assets are being generated. Use `ti-game` for native pause/cleanup and Titanium integration skills plus the installed ad-module documentation for exact APIs. For César's **TiAdmobUnified** module (`ti.admob.unified`), use the standalone `ti-admob-unified` skill: official installation/API/privacy/library/mediation guides govern technical integration and provider setup. Its first public 1.0.0 release is under preparation at the initial snapshot; do not assume publication. Inspect the installed version/source/examples; do not invent method names or edit a vendored upstream helper casually.
4
+
5
+ ## Protect play and navigation
6
+
7
+ Choose deliberate natural breaks (for example, settled end-of-run results) rather than interrupting flight, combat, tutorial or a rapid retry. Do not queue an ad from a timer simply because a quota was reached. A load callback or foreground resume must not spring an old ad on a new screen. Failed/no-fill/skipped attempts should allow the user's intended action, without loops of loading screens or counting an exposure that never happened.
8
+
9
+ Use one owner and prevent simultaneous presentations. At the selected boundary, ensure the native game is actually paused or the session is released as appropriate; stopping a JS decision timer does not stop native gravity or audio. Do not universally destroy a session that legitimately needs to resume. Restore the correct scene, clock, inputs and sound only after dismissal or a confirmed failure to present.
10
+
11
+ Separate grace period, accumulated active play, cooldown since dismissal, per-hour/day quotas and eligible presentation points. Pause/background/menu time should not accidentally earn ad eligibility. Persist what the game's policy requires and handle restarts/date changes/clock rollback conservatively. Count a confirmed opening exactly once; count close separately. Do not copy Lander/Guardian's numeric thresholds as an industry optimum: those are an initial product configuration awaiting retention/fatigue evidence. Frequency caps are ceilings, not targets.
12
+
13
+ ## Failure and callbacks
14
+
15
+ Guard continuations against screen destruction and duplicate/late callbacks. Bound the wait for an ad that never opens; a timeout must not unlock gameplay behind an ad confirmed open. Back/Menu/Retry should not each trigger another presentation. Preserve preload/backoff behavior without presenting from load callbacks. Exercise no module, no fill, load/show failure, repeated taps, late opening, actual dismissal, background/resume and destruction in both platforms.
16
+
17
+ ## Format choice and measurement
18
+
19
+ Choose formats for the requested game: banners need safe placement away from controls and important visual/audio cues; rewarded ads need a clear voluntary offer, a predictable reward and completion handling without duplicate rewards. Do not silently replace an interstitial policy with paid continues, App Open, forced rewards or banners. Inventory the chosen policy and measure confirmed exposures, ads per active-play minute, abandonment around breaks, retries/retention and reward usage when applicable. Collect only authorized telemetry and keep experiments separate from normal persistent counters. No tested optimum follows from passing unit tests.
20
+
21
+ Use test IDs while developing. Preserve the existing consent/privacy flow and ability to revisit choices; consult current UMP guidance and the installed module's exposed eligibility before requesting ads. Consent is not a universal Boolean substitute for actual request eligibility. This guide does not enable live monetization, change IDs or make legal conclusions.
22
+
23
+ ## Current policy sources
24
+
25
+ Check these official sources again before proposing or changing a live placement; policies can change. Consulted 2026-10-11:
26
+
27
+ - [AdMob: disallowed interstitial implementations](https://support.google.com/admob/answer/6201362?hl=en) — natural breaks, unexpected launches, navigation and excessive repeated placements.
28
+ - [AdMob: recommended interstitial implementations](https://support.google.com/admob/answer/6201350?hl=en) — natural boundaries and preload considerations.
29
+ - [Google UMP Android setup](https://developers.google.com/admob/android/privacy) — current consent updates, privacy options and request eligibility; consult corresponding iOS guidance and module documentation for platform parity.
30
+
31
+ Project evidence: Lander `app/lib/game/AdDirector.js` and Guardian `app/lib/systems/ad-director.js` separate presentation from play. Their October decisions document final-result attempts, active-play counters, confirmed openings, cooldown after close and callback ownership. Treat their old proposals and newer implemented decisions distinctly.
@@ -0,0 +1,42 @@
1
+ # Create and refine sound assets
2
+
3
+ Sound is an essential asset domain alongside images. `ti-game-assets` coordinates creation, variation, inventory, integration and acceptance of both. `ti-synthengine` governs synthesis and acoustic design with the **`ti.synthengine`** native contract; `ti-game` governs visual representation, movement and events. Neither domain is subordinate to the other.
4
+
5
+ Read the installed `ti-synthengine` skill and its API, sound-design/recipes, audio-engine and lifecycle references relevant to the request before composing or editing sounds. Use integrated `image_gen` for raster drawings and native synthesis recipes/patterns for runtime sounds. For procedural WAV generators, file analysis, fallback and seamless loops read [offline-audio.md](offline-audio.md); preserve the project backend instead of requiring a native synthesis module. Do not treat `image_gen` as an audio generator. If requested sound cannot be represented by `ti.synthengine` (such as recorded speech or sample playback), explain the limitation and use the project's appropriate audio workflow when authorized; never invent synthesizer capabilities.
6
+
7
+ ## Synthesis knowledge to apply
8
+
9
+ Use these concepts to explain the acoustic choices, then consult `ti-synthengine`'s `references/sound-design.md` and `references/recipes.md` for details and `references/api.md` for exact supported fields. These are design starting points, not another API manual.
10
+
11
+ | Control | What to listen for | Useful game direction |
12
+ | --- | --- | --- |
13
+ | Waveform and harmonics | Sine is clean; triangle softer than square; square/saw have stronger harmonics; noise has no single pitch | Clean UI, retro rewards, buzzy alarms, impact/wind texture |
14
+ | ADSR envelope | Attack shapes onset; decay falls to sustain; release shapes the tail | Fast impact vs. soft ambience, pluck vs. held propulsion; fit stages inside duration |
15
+ | Pitch and sweep | Register and upward/downward motion change perceived energy | Laser zap, activation, power-down; distinguish actual pitch from noise-rate changes |
16
+ | Filters and resonance | Low-pass darkens, high-pass thins, band-pass isolates a band; resonance can emphasize it | Material/body vs. hiss, explosion tails, wah or wind; watch resonant peaks |
17
+ | FM | Modulator/carrier ratio and modulation depth change harmonic/metallic character | Bell/glass/metal attacks, electric-piano rewards; declining depth mellows the tail |
18
+ | Detune and LFO | Nearby pitched voices beat; LFO adds pitch motion | Unison texture or vibrato; avoid adding voices or modulation without a perceptual purpose |
19
+ | Layering and gain | Body and noise can combine; overlap and release tails add energy | One recognizable event with a controlled voice budget; check clipping and masking |
20
+ | Pan and movement | Stereo position or sweep supports spatial meaning | Place impacts in the playfield, keep UI centered when appropriate, verify mono cues |
21
+
22
+ Avoid equating lower frequency with a guaranteed bigger sound on a phone speaker. Listen for harmonics, attack, noise/body balance and intelligibility in context. Change one design dimension at a time when comparing candidates; keep level comparable so louder does not win by accident. Describe why each waveform, envelope and modulation creates the requested effect. Exact range, cross-field validity and module-specific limitations remain `ti-synthengine`'s responsibility.
23
+
24
+ ## Work from meaning to timbre
25
+
26
+ Inspect the existing sound owner and inventory first. Define an acoustic palette per game/world/family, just as for art: retro/clean/metallic/organic texture, attack and decay character, pitch register, emotional role and density. Design shots, impacts, explosions, thrust, pickups, damage, UI, music and ambience only as required by the contract. Create or refine focused recipes and reusable parameter variants, not another global audio owner. Preserve prompts/design rationale and provenance with their source code/data.
27
+
28
+ Make variation meaningful: material, enemy, weapon or reward function should guide timbre, envelope, pitch/filter/FM choices. Random pitch or volume alone may be insufficient. Choose among related variants without immediate repetition when that suits the event, and coordinate visual/audio variation indices when they describe the same outcome. Preserve a recognizable family sound and avoid distracting differences. These are design criteria, not universal counts or mandatory mechanics.
29
+
30
+ ## Stereo, overlap and lifecycle
31
+
32
+ Where screen position matters, derive bounded pan from the event's horizontal position using the measured playfield width. Clamp to a deliberately chosen range and use center when position is unavailable. Capture coordinates before pooling/recycling an entity. Keep layers of one event at the same spatial position unless a deliberate sweep is part of the sound. When a static position is intended, consult the current contract for `pan`/`panEnd` behavior. Do not add frame timers or extra voices just for panning. Check mono/small-speaker audibility: stereo supports a cue, never carries its only meaning.
33
+
34
+ Use accepted events, not every spawned projectile or animation frame, as sound triggers. Budget simultaneous voices including release tails, layers, enemies and music. Use event gates, priorities, family aggregation and gain staging when actual overlap calls for them; derive the values from the game, not from another project's constants. Sustained propulsion/ambience and music need a different ownership/timing strategy from discrete effects. Preserve the native clock, pause/background/resume behavior, mute/preferences and cleanup. Verify the module's real scheduling/cancellation limitations before proposing changes.
35
+
36
+ Asteroids provides useful design evidence: related explosion variants, material/enemy profiles, stereo positions captured before recycling, family aggregation and overlap budgets. Those choices are examples rather than fixed caps, gates, gains, pan ranges or API wrappers for every game. Inspect a target project's current implementation; do not import Asteroids' balance or assumptions.
37
+
38
+ ## Validate and listen
39
+
40
+ Check every recipe/pattern against the current strict option contract, envelope intersection, finite/ranged values, accepted results and lifecycle. If a project has a contract harness or DSP render tool, reuse it; do not certify a mock as native playback. Use a temporary diagnostic listening surface when appropriate, preserving app data and existing owners.
41
+
42
+ Listen to individual variants and representative busy scenes on headphones and a physical phone speaker, including mono behavior, distinction between cues, clipping/fatigue and music/effect masking. Record technical validation, audition path and human acceptance separately. Simulation or DSP replay can catch problems but cannot certify device sound quality. No new sound library, module install or unrelated gameplay change is implied by an image-only request.