@oxy.so/bloom 7.1.1 → 7.1.4

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 (246) hide show
  1. package/assets/character-runtime/README.md +114 -19
  2. package/assets/character-runtime/authored-parts.mjs +754 -0
  3. package/assets/character-runtime/catalog-parts.mjs +362 -0
  4. package/assets/character-runtime/character-recipe.mjs +247 -0
  5. package/assets/character-runtime/clippo-geometry.mjs +679 -0
  6. package/assets/character-runtime/controller-mode.mjs +208 -0
  7. package/assets/character-runtime/cyclops-geometry.mjs +180 -0
  8. package/assets/character-runtime/legacy-engine.mjs +406 -54
  9. package/assets/character-runtime/legacy-geometry.mjs +242 -85
  10. package/assets/character-runtime/legacy-worker.mjs +82 -23
  11. package/assets/character-runtime/managed-avatar.mjs +12 -17
  12. package/assets/character-runtime/migrated-contours.mjs +2067 -0
  13. package/assets/character-runtime/migrated-faces.mjs +59 -0
  14. package/assets/character-runtime/pose-transition.mjs +523 -0
  15. package/assets/character-runtime/preparation-cache.mjs +60 -0
  16. package/assets/character-runtime/render-budget.mjs +5 -3
  17. package/assets/character-runtime/render-errors.mjs +180 -0
  18. package/assets/character-runtime/resolution.mjs +10 -0
  19. package/assets/character-runtime/runtime.mjs +744 -295
  20. package/assets/character-runtime/sha256.mjs +44 -0
  21. package/assets/character-runtime/shared-programs.mjs +534 -0
  22. package/assets/character-runtime/shared-surface.mjs +490 -0
  23. package/assets/character-runtime/shared-textures.mjs +420 -0
  24. package/assets/character-runtime/thumbnails/eyes/todd.png +0 -0
  25. package/docs/adoption-matrix.mdx +2 -2
  26. package/docs/agent-avatar.mdx +45 -8
  27. package/docs/agent-creator.mdx +13 -3
  28. package/docs/bottom-sheet.mdx +1 -1
  29. package/lib/commonjs/agent-avatar/AgentAvatar.js +1 -1
  30. package/lib/commonjs/agent-avatar/AgentAvatar.js.map +1 -1
  31. package/lib/commonjs/agent-avatar/CharacterAvatar.js +2 -1
  32. package/lib/commonjs/agent-avatar/CharacterAvatar.js.map +1 -1
  33. package/lib/commonjs/agent-avatar/character-colors.js +19 -0
  34. package/lib/commonjs/agent-avatar/character-colors.js.map +1 -0
  35. package/lib/commonjs/agent-avatar/character-shapes.js +106 -0
  36. package/lib/commonjs/agent-avatar/character-shapes.js.map +1 -0
  37. package/lib/commonjs/agent-avatar/config-character.js +4 -0
  38. package/lib/commonjs/agent-avatar/config-character.js.map +1 -1
  39. package/lib/commonjs/agent-avatar/legacy-recipe.js +19 -6
  40. package/lib/commonjs/agent-avatar/legacy-recipe.js.map +1 -1
  41. package/lib/commonjs/agent-creator/AgentCreatorBase.js +67 -107
  42. package/lib/commonjs/agent-creator/AgentCreatorBase.js.map +1 -1
  43. package/lib/commonjs/agent-creator/CharacterControls.js +23 -5
  44. package/lib/commonjs/agent-creator/CharacterControls.js.map +1 -1
  45. package/lib/commonjs/agent-creator/ClippoArtwork.js +63 -0
  46. package/lib/commonjs/agent-creator/ClippoArtwork.js.map +1 -0
  47. package/lib/commonjs/agent-creator/CyclopsArtwork.js +45 -0
  48. package/lib/commonjs/agent-creator/CyclopsArtwork.js.map +1 -0
  49. package/lib/commonjs/agent-creator/EmotionPicker.js +8 -1
  50. package/lib/commonjs/agent-creator/EmotionPicker.js.map +1 -1
  51. package/lib/commonjs/agent-creator/ShapeSilhouette.js +8 -1
  52. package/lib/commonjs/agent-creator/ShapeSilhouette.js.map +1 -1
  53. package/lib/commonjs/agent-creator/ToddArtwork.js +29 -0
  54. package/lib/commonjs/agent-creator/ToddArtwork.js.map +1 -0
  55. package/lib/commonjs/agent-creator/constants.js +16 -17
  56. package/lib/commonjs/agent-creator/constants.js.map +1 -1
  57. package/lib/commonjs/agent-creator/messages.js +1 -1
  58. package/lib/commonjs/agent-creator/messages.js.map +1 -1
  59. package/lib/commonjs/bottom-sheet/BottomSheetBase.js +33 -49
  60. package/lib/commonjs/bottom-sheet/BottomSheetBase.js.map +1 -1
  61. package/lib/commonjs/dialog/DialogBottomSheet.js +1 -1
  62. package/lib/commonjs/dialog/DialogBottomSheet.js.map +1 -1
  63. package/lib/commonjs/locale/translations/ar.js +1 -1
  64. package/lib/commonjs/locale/translations/ar.js.map +1 -1
  65. package/lib/commonjs/locale/translations/bn.js +1 -1
  66. package/lib/commonjs/locale/translations/bn.js.map +1 -1
  67. package/lib/commonjs/locale/translations/ca.js +1 -1
  68. package/lib/commonjs/locale/translations/ca.js.map +1 -1
  69. package/lib/commonjs/locale/translations/de.js +1 -1
  70. package/lib/commonjs/locale/translations/de.js.map +1 -1
  71. package/lib/commonjs/locale/translations/es.js +1 -1
  72. package/lib/commonjs/locale/translations/es.js.map +1 -1
  73. package/lib/commonjs/locale/translations/fr.js +1 -1
  74. package/lib/commonjs/locale/translations/fr.js.map +1 -1
  75. package/lib/commonjs/locale/translations/hi.js +1 -1
  76. package/lib/commonjs/locale/translations/hi.js.map +1 -1
  77. package/lib/commonjs/locale/translations/id.js +1 -1
  78. package/lib/commonjs/locale/translations/id.js.map +1 -1
  79. package/lib/commonjs/locale/translations/it.js +1 -1
  80. package/lib/commonjs/locale/translations/it.js.map +1 -1
  81. package/lib/commonjs/locale/translations/ja.js +1 -1
  82. package/lib/commonjs/locale/translations/ja.js.map +1 -1
  83. package/lib/commonjs/locale/translations/pt.js +1 -1
  84. package/lib/commonjs/locale/translations/pt.js.map +1 -1
  85. package/lib/commonjs/locale/translations/ru.js +1 -1
  86. package/lib/commonjs/locale/translations/ru.js.map +1 -1
  87. package/lib/commonjs/locale/translations/tr.js +1 -1
  88. package/lib/commonjs/locale/translations/tr.js.map +1 -1
  89. package/lib/commonjs/locale/translations/zh.js +1 -1
  90. package/lib/commonjs/locale/translations/zh.js.map +1 -1
  91. package/lib/commonjs/surface/SurfacePaint.js +17 -4
  92. package/lib/commonjs/surface/SurfacePaint.js.map +1 -1
  93. package/lib/module/agent-avatar/AgentAvatar.js +1 -1
  94. package/lib/module/agent-avatar/AgentAvatar.js.map +1 -1
  95. package/lib/module/agent-avatar/CharacterAvatar.js +2 -1
  96. package/lib/module/agent-avatar/CharacterAvatar.js.map +1 -1
  97. package/lib/module/agent-avatar/character-colors.js +15 -0
  98. package/lib/module/agent-avatar/character-colors.js.map +1 -0
  99. package/lib/module/agent-avatar/character-shapes.js +97 -0
  100. package/lib/module/agent-avatar/character-shapes.js.map +1 -0
  101. package/lib/module/agent-avatar/config-character.js +4 -0
  102. package/lib/module/agent-avatar/config-character.js.map +1 -1
  103. package/lib/module/agent-avatar/legacy-recipe.js +19 -6
  104. package/lib/module/agent-avatar/legacy-recipe.js.map +1 -1
  105. package/lib/module/agent-creator/AgentCreatorBase.js +69 -109
  106. package/lib/module/agent-creator/AgentCreatorBase.js.map +1 -1
  107. package/lib/module/agent-creator/CharacterControls.js +24 -6
  108. package/lib/module/agent-creator/CharacterControls.js.map +1 -1
  109. package/lib/module/agent-creator/ClippoArtwork.js +59 -0
  110. package/lib/module/agent-creator/ClippoArtwork.js.map +1 -0
  111. package/lib/module/agent-creator/CyclopsArtwork.js +41 -0
  112. package/lib/module/agent-creator/CyclopsArtwork.js.map +1 -0
  113. package/lib/module/agent-creator/EmotionPicker.js +8 -1
  114. package/lib/module/agent-creator/EmotionPicker.js.map +1 -1
  115. package/lib/module/agent-creator/ShapeSilhouette.js +8 -1
  116. package/lib/module/agent-creator/ShapeSilhouette.js.map +1 -1
  117. package/lib/module/agent-creator/ToddArtwork.js +25 -0
  118. package/lib/module/agent-creator/ToddArtwork.js.map +1 -0
  119. package/lib/module/agent-creator/constants.js +8 -16
  120. package/lib/module/agent-creator/constants.js.map +1 -1
  121. package/lib/module/agent-creator/messages.js +1 -1
  122. package/lib/module/agent-creator/messages.js.map +1 -1
  123. package/lib/module/bottom-sheet/BottomSheetBase.js +33 -49
  124. package/lib/module/bottom-sheet/BottomSheetBase.js.map +1 -1
  125. package/lib/module/dialog/DialogBottomSheet.js +1 -1
  126. package/lib/module/dialog/DialogBottomSheet.js.map +1 -1
  127. package/lib/module/locale/translations/ar.js +1 -1
  128. package/lib/module/locale/translations/ar.js.map +1 -1
  129. package/lib/module/locale/translations/bn.js +1 -1
  130. package/lib/module/locale/translations/bn.js.map +1 -1
  131. package/lib/module/locale/translations/ca.js +1 -1
  132. package/lib/module/locale/translations/ca.js.map +1 -1
  133. package/lib/module/locale/translations/de.js +1 -1
  134. package/lib/module/locale/translations/de.js.map +1 -1
  135. package/lib/module/locale/translations/es.js +1 -1
  136. package/lib/module/locale/translations/es.js.map +1 -1
  137. package/lib/module/locale/translations/fr.js +1 -1
  138. package/lib/module/locale/translations/fr.js.map +1 -1
  139. package/lib/module/locale/translations/hi.js +1 -1
  140. package/lib/module/locale/translations/hi.js.map +1 -1
  141. package/lib/module/locale/translations/id.js +1 -1
  142. package/lib/module/locale/translations/id.js.map +1 -1
  143. package/lib/module/locale/translations/it.js +1 -1
  144. package/lib/module/locale/translations/it.js.map +1 -1
  145. package/lib/module/locale/translations/ja.js +1 -1
  146. package/lib/module/locale/translations/ja.js.map +1 -1
  147. package/lib/module/locale/translations/pt.js +1 -1
  148. package/lib/module/locale/translations/pt.js.map +1 -1
  149. package/lib/module/locale/translations/ru.js +1 -1
  150. package/lib/module/locale/translations/ru.js.map +1 -1
  151. package/lib/module/locale/translations/tr.js +1 -1
  152. package/lib/module/locale/translations/tr.js.map +1 -1
  153. package/lib/module/locale/translations/zh.js +1 -1
  154. package/lib/module/locale/translations/zh.js.map +1 -1
  155. package/lib/module/surface/SurfacePaint.js +18 -5
  156. package/lib/module/surface/SurfacePaint.js.map +1 -1
  157. package/lib/typescript/commonjs/agent-avatar/CharacterAvatar.d.ts.map +1 -1
  158. package/lib/typescript/commonjs/agent-avatar/character-colors.d.ts +13 -0
  159. package/lib/typescript/commonjs/agent-avatar/character-colors.d.ts.map +1 -0
  160. package/lib/typescript/commonjs/agent-avatar/character-shapes.d.ts +19 -0
  161. package/lib/typescript/commonjs/agent-avatar/character-shapes.d.ts.map +1 -0
  162. package/lib/typescript/commonjs/agent-avatar/config-character.d.ts +4 -0
  163. package/lib/typescript/commonjs/agent-avatar/config-character.d.ts.map +1 -1
  164. package/lib/typescript/commonjs/agent-avatar/legacy-recipe.d.ts +2 -10
  165. package/lib/typescript/commonjs/agent-avatar/legacy-recipe.d.ts.map +1 -1
  166. package/lib/typescript/commonjs/agent-creator/AgentCreatorBase.d.ts.map +1 -1
  167. package/lib/typescript/commonjs/agent-creator/CharacterControls.d.ts +2 -1
  168. package/lib/typescript/commonjs/agent-creator/CharacterControls.d.ts.map +1 -1
  169. package/lib/typescript/commonjs/agent-creator/ClippoArtwork.d.ts +6 -0
  170. package/lib/typescript/commonjs/agent-creator/ClippoArtwork.d.ts.map +1 -0
  171. package/lib/typescript/commonjs/agent-creator/CyclopsArtwork.d.ts +5 -0
  172. package/lib/typescript/commonjs/agent-creator/CyclopsArtwork.d.ts.map +1 -0
  173. package/lib/typescript/commonjs/agent-creator/EmotionPicker.d.ts +1 -0
  174. package/lib/typescript/commonjs/agent-creator/EmotionPicker.d.ts.map +1 -1
  175. package/lib/typescript/commonjs/agent-creator/ShapeSilhouette.d.ts.map +1 -1
  176. package/lib/typescript/commonjs/agent-creator/ToddArtwork.d.ts +6 -0
  177. package/lib/typescript/commonjs/agent-creator/ToddArtwork.d.ts.map +1 -0
  178. package/lib/typescript/commonjs/agent-creator/constants.d.ts +7 -15
  179. package/lib/typescript/commonjs/agent-creator/constants.d.ts.map +1 -1
  180. package/lib/typescript/commonjs/agent-creator/messages.d.ts.map +1 -1
  181. package/lib/typescript/commonjs/bottom-sheet/BottomSheetBase.d.ts.map +1 -1
  182. package/lib/typescript/commonjs/bottom-sheet/types.d.ts +1 -0
  183. package/lib/typescript/commonjs/bottom-sheet/types.d.ts.map +1 -1
  184. package/lib/typescript/commonjs/surface/SurfacePaint.d.ts.map +1 -1
  185. package/lib/typescript/module/agent-avatar/CharacterAvatar.d.ts.map +1 -1
  186. package/lib/typescript/module/agent-avatar/character-colors.d.ts +13 -0
  187. package/lib/typescript/module/agent-avatar/character-colors.d.ts.map +1 -0
  188. package/lib/typescript/module/agent-avatar/character-shapes.d.ts +19 -0
  189. package/lib/typescript/module/agent-avatar/character-shapes.d.ts.map +1 -0
  190. package/lib/typescript/module/agent-avatar/config-character.d.ts +4 -0
  191. package/lib/typescript/module/agent-avatar/config-character.d.ts.map +1 -1
  192. package/lib/typescript/module/agent-avatar/legacy-recipe.d.ts +2 -10
  193. package/lib/typescript/module/agent-avatar/legacy-recipe.d.ts.map +1 -1
  194. package/lib/typescript/module/agent-creator/AgentCreatorBase.d.ts.map +1 -1
  195. package/lib/typescript/module/agent-creator/CharacterControls.d.ts +2 -1
  196. package/lib/typescript/module/agent-creator/CharacterControls.d.ts.map +1 -1
  197. package/lib/typescript/module/agent-creator/ClippoArtwork.d.ts +6 -0
  198. package/lib/typescript/module/agent-creator/ClippoArtwork.d.ts.map +1 -0
  199. package/lib/typescript/module/agent-creator/CyclopsArtwork.d.ts +5 -0
  200. package/lib/typescript/module/agent-creator/CyclopsArtwork.d.ts.map +1 -0
  201. package/lib/typescript/module/agent-creator/EmotionPicker.d.ts +1 -0
  202. package/lib/typescript/module/agent-creator/EmotionPicker.d.ts.map +1 -1
  203. package/lib/typescript/module/agent-creator/ShapeSilhouette.d.ts.map +1 -1
  204. package/lib/typescript/module/agent-creator/ToddArtwork.d.ts +6 -0
  205. package/lib/typescript/module/agent-creator/ToddArtwork.d.ts.map +1 -0
  206. package/lib/typescript/module/agent-creator/constants.d.ts +7 -15
  207. package/lib/typescript/module/agent-creator/constants.d.ts.map +1 -1
  208. package/lib/typescript/module/agent-creator/messages.d.ts.map +1 -1
  209. package/lib/typescript/module/bottom-sheet/BottomSheetBase.d.ts.map +1 -1
  210. package/lib/typescript/module/bottom-sheet/types.d.ts +1 -0
  211. package/lib/typescript/module/bottom-sheet/types.d.ts.map +1 -1
  212. package/lib/typescript/module/surface/SurfacePaint.d.ts.map +1 -1
  213. package/package.json +1 -1
  214. package/src/agent-avatar/AgentAvatar.tsx +1 -1
  215. package/src/agent-avatar/CharacterAvatar.tsx +4 -1
  216. package/src/agent-avatar/character-colors.ts +12 -0
  217. package/src/agent-avatar/character-shapes.ts +122 -0
  218. package/src/agent-avatar/config-character.ts +39 -6
  219. package/src/agent-avatar/legacy-recipe.ts +34 -6
  220. package/src/agent-creator/AgentCreatorBase.tsx +121 -152
  221. package/src/agent-creator/CharacterControls.tsx +39 -14
  222. package/src/agent-creator/ClippoArtwork.tsx +49 -0
  223. package/src/agent-creator/CyclopsArtwork.tsx +27 -0
  224. package/src/agent-creator/EmotionPicker.tsx +55 -16
  225. package/src/agent-creator/ShapeSilhouette.tsx +16 -1
  226. package/src/agent-creator/ToddArtwork.tsx +24 -0
  227. package/src/agent-creator/constants.ts +47 -14
  228. package/src/agent-creator/messages.ts +2 -1
  229. package/src/bottom-sheet/BottomSheetBase.tsx +24 -34
  230. package/src/bottom-sheet/types.ts +1 -0
  231. package/src/dialog/DialogBottomSheet.tsx +1 -1
  232. package/src/locale/translations/ar.ts +1 -1
  233. package/src/locale/translations/bn.ts +1 -1
  234. package/src/locale/translations/ca.ts +1 -1
  235. package/src/locale/translations/de.ts +1 -1
  236. package/src/locale/translations/es.ts +1 -1
  237. package/src/locale/translations/fr.ts +1 -1
  238. package/src/locale/translations/hi.ts +1 -1
  239. package/src/locale/translations/id.ts +1 -1
  240. package/src/locale/translations/it.ts +1 -1
  241. package/src/locale/translations/ja.ts +1 -1
  242. package/src/locale/translations/pt.ts +1 -1
  243. package/src/locale/translations/ru.ts +1 -1
  244. package/src/locale/translations/tr.ts +1 -1
  245. package/src/locale/translations/zh.ts +1 -1
  246. package/src/surface/SurfacePaint.tsx +14 -4
@@ -2,7 +2,9 @@
2
2
 
3
3
  Serve this directory unchanged from a static URL and pass runtime.mjs's URL to
4
4
  AgentAvatarProvider. The runtime loads lazily when an avatar becomes visible.
5
- Serve .mjs as JavaScript and .wasm as application/wasm.
5
+ Serve .mjs as JavaScript and .wasm as application/wasm. Version the static
6
+ directory as a unit: changing only the runtime.mjs query does not invalidate
7
+ its relative imports under immutable HTTP caching.
6
8
 
7
9
  The four generated engine files are preserved byte for byte from the supplied
8
10
  local beta. integrity.json records their SHA-256 hashes. The complete supplied
@@ -14,18 +16,97 @@ runtime.mjs is an adapter for the original engine, retaining its appearance,
14
16
  materials and animations. It owns loading, selection, input, display scaling and
15
17
  resource lifetime. There is no replacement mesh renderer in the product.
16
18
 
17
- Beta characters share one engine per document and all avatars share a 30fps
18
- clock. Legacy contours isolate rendering modules to keep native geometry caches
19
- from returning another silhouette; one worker prepares their scenes. Unused
20
- modules are released. Static portrait preparation is serialized, cached (up to 64 images), and
21
- releases its graphics surfaces after painting. Offscreen/background characters
22
- stop rendering; pause and reduced motion freeze a complete visible frame. The
23
- binary's initial reduced-motion flag can produce transparent frames; the adapter
24
- freezes its own clock after painting instead.
19
+ All visible moving characters share one physical WebGL2 context, a packed canvas,
20
+ and one animation clock with a 30fps per-character target. Each character retains its own state and private
21
+ render targets. shared-surface.mjs maps its default framebuffer into a tile,
22
+ resolves MSAA before translation, and clips output copies to that tile. Only the
23
+ last lease destroys the physical context. shared-programs.mjs pools shaders and
24
+ linked programs, preserving independent uniforms and Emscripten object metadata.
25
+ Identical uniform values are not resent when changing logical program owners.
26
+ shared-textures.mjs shares the exact bytes and parameters of the two 512px
27
+ mipmapped RGBA8 assets and the 576×960 RGBA8 atlas. Mutation or framebuffer
28
+ attachment first gives that logical texture independent storage. Other textures,
29
+ mutable buffers and private render targets are not deduplicated. Small avatars
30
+ use compact meshes independent of device pixel ratio. Fur and original materials
31
+ remain intact. resolution.mjs selects backing size by CSS size and DPR, activating
32
+ the original engine's existing size-dependent fur LOD.
25
33
 
26
- Current editing supports the beta's original catalog combinations and actual
27
- availability constraints. appearance-codec.mjs validates explicit RGB and optional eye
28
- transform edits through the original engine. Untouched presets keep their bytes.
34
+ Physical Pixel 8a measurements and exact asset fingerprints are recorded in
35
+ docs/benchmarks/avatar-continuous-renderer.json (same-character controllers and
36
+ pose transitions, before shared authored parts). All 24/48 avatars move with
37
+ one context and no graphics errors. Median paint rates are 4.42/2.29 Hz per avatar;
38
+ all-ready latency is 14.85/24.80 seconds with warm HTTP caches. The 30 fps target
39
+ is not achieved. Earlier snapshots are retained for comparison; see
40
+ docs/agent-avatar.mdx for workload and measurement limitations.
41
+
42
+ Original and migrated contours share a rendering WASM module and one preparation
43
+ worker, which owns a separate WASM instance. Geometry identities include contour and attachment transforms. The adapter
44
+ scopes the recovered engine's deferred preparation dispatcher to its character;
45
+ that boundary is specific to the integrity-pinned glue. Its native global batch
46
+ can combine jobs from different characters, so wrapping callbacks alone is not
47
+ sufficient: the preparation lease spans mutation, deferred jobs and first paint. Cold preparation is
48
+ serialized; painted moving neighbours remain resident. Static portraits are
49
+ cached (up to 64 images), and release graphics surfaces after painting. Exact contour preparations use an independent 8 MiB/16-entry LRU cache, including appearance, quality, activity and contour and authored-part identity; returned buffers are copied. The preparation owner receives a render turn every batch until its first complete paint. Recent interactions receive alternate-batch priority without starving the remaining round-robin queue.
50
+ Offscreen/background characters release their leases. Pause and reduced motion
51
+ freeze a complete visible frame. The binary's initial reduced-motion flag can
52
+ produce transparent frames; the adapter freezes its clock after painting instead.
53
+
54
+ Shared submissions contain at most eight avatars and an 8 ms CPU allowance. A WebGL fence is polled asynchronously before error checks and presentation, allowing the page to process input while the GPU works. Lifecycle and native input operations wait for this boundary; DOM pointer capture remains synchronous. Diagnostics separate CPU submission/presentation from elapsed GPU waiting and task dispatch. This improves responsiveness without claiming faster GPU throughput.
55
+
56
+ React and Work retain one native Character, its prepared meshes and animation
57
+ clock. controller-mode.mjs verifies the original WASM SHA-256 before capturing
58
+ its memory through the supported instantiateWasm hook. A JS hash fallback keeps
59
+ this check working on insecure HTTP WebView origins. The adapter validates the
60
+ Embind handle, native type marker, live instance, bounds and boolean controller
61
+ field on every access; memory growth never leaves a stale typed view. Its ABI
62
+ layout is specific to the pinned WASM and must be re-proved for another binary.
63
+ Activity support prepares the original props up front. A constructor without
64
+ activity support rejects Restore/Start; incremental preparation is not assumed.
65
+ Stop completion reads the original current phase/activity/episode, since both
66
+ copyActivityRestore and hasPendingUpdate can misrepresent outro completion.
67
+ Appearance changes retain any simultaneous Work/React request until the new
68
+ scene is painted; pausing or disposal cancels those requests.
69
+ Queued reactions retain the original Busy semantics until the suspended reaction
70
+ finishes. verify-avatar-controller-continuity.mjs checks the complete runtime
71
+ switches, native identity, unchanged geometry, original outro and real pixels.
72
+ pose-transition.mjs interpolates reflected transform/skin uniform blocks and
73
+ camera for 180 ms from the last presented pose. It preserves material/discrete
74
+ bytes and original animation of newly added props. No bitmap crossfade or
75
+ replacement mesh renderer is involved.
76
+
77
+ authored-parts.mjs exposes eyes:todd and accessory:felipe_beret across all 21
78
+ shapes. The worker copies complete native records from lime_frog and blue_beret,
79
+ retaining materials and animation deltas, fits them after contour deformation,
80
+ and removes the generic fitting references. Original activity data remains intact; the aggregate scene bounds expand to
81
+ include the fitted parts. Virtual IDs never reach native catalog selection. Cache keys include
82
+ these parts; verify-avatar-authored-parts.mjs checks all 21 real rendered shapes,
83
+ original/migrated Work and React, generic selections and cleanup.
84
+
85
+ clippo-geometry.mjs adds a smooth open tube and an independently selectable
86
+ Clippo eye/brow set as native prepared records. It generates capped tube meshes,
87
+ retains the original eye deformation fields and uses the recovered smooth
88
+ material in the same renderer. No raster cutout or additional WebGL context is
89
+ used. character-recipe.mjs resolves the clippo preset to its virtual shape/eyes
90
+ and grey paint; explicit selections override those defaults. Runtime capabilities
91
+ retain the caller's raw saved key, including when an explicit default selection
92
+ leaves the prepared appearance unchanged. Editor chips are static SVG artwork.
93
+
94
+ catalog-parts.mjs fits actual original eye, eyewear and accessory meshes across
95
+ all bodies. Named presets supply editable defaults; changing a part retains the
96
+ original body. Opaque sunglasses recover their hidden-eye fitting references
97
+ without replacing the body. Donor records have an 8 MiB/24-entry bounded cache.
98
+ verify-avatar-catalog-parts.mjs checks 312 combinations, exact requested mesh
99
+ labels, preserved body vertices and the cache bound.
100
+
101
+ cyclops-geometry.mjs adds one native white eyeball, a teal iris, pupil and glint;
102
+ its layered meshes retain native blink/look deformation. Each shape owns eye
103
+ positions and size, shared by every eye style; historical character.eyeSpacing
104
+ values are ignored. Todd's actual body is also independently selectable
105
+ as shape:todd. verify-avatar-cyclops.mjs checks actual eye colors, movement and
106
+ cleanup; verify-avatar-customization.mjs exercises all eye styles on Todd in the
107
+ real editor, shape changes and accessories. appearance-codec.mjs
108
+ validates explicit RGB through the original engine. Untouched presets keep their
109
+ bytes; unnamed original paint is reported from its actual material.
29
110
 
30
111
  legacy-geometry.mjs transforms copies of prepared scene assemblies: existing
31
112
  Bloom contours deform the body, pose deltas, normals and fur roots. The packaged
@@ -39,17 +120,31 @@ diamond and heart recipes reuse the original beta shapes instead of duplicates.
39
120
  Alien avatars are removed from the visible catalog, with saved-data compatibility. The
40
121
  migrated bodies use the original catalog eyes at their authored proportions and
41
122
  animations; old expression/eye transform fields no longer alter the 3D face.
42
- Migrated bodies support original eyewear and accessories. Headwear, Bulb, bow
43
- and Tuft receive rigid contour-relative translations; eyewear and headphones
44
- keep original placement. A bounded reference cache identifies attachment meshes
45
- without changing eyes, materials or fur vectors. Intact presets retain authored
46
- signature reactions; edited and migrated bodies fall back to the original Wave.
123
+ All visible bodies accept native catalog eyes, eyewear and accessories through
124
+ original donor assemblies. Fitting uses the actual target face/crown anchors;
125
+ Clippo headwear is scaled to its narrow crown. A bounded reference cache retains
126
+ original material/animation data, and spacing moves the eye groups without
127
+ stretching lenses. `verify-avatar-catalog-parts.mjs` checks all 312 native
128
+ body/part combinations, exact requested labels, unchanged body vertices and
129
+ cache bounds without creating a WebGL context. Intact presets retain authored
130
+ signature reactions. Independent piece edits retain the body's original
131
+ signature. Native shapes use their corresponding authored signature; distinct
132
+ migrated contours and Clippo use Todd's signature as the common default.
133
+ The adapter never substitutes the original Wave/maracas reaction. A pinned,
134
+ validated controller scope borrows only the reaction identity during the original
135
+ native dispatch and restores it immediately; saved appearance and materials
136
+ remain independent. Named bodies also retain their original fitted Work payload.
47
137
  Mascots and hidden faces still use SVG.
48
138
  Original material/grain effects become the beta's 3D surface.
49
139
 
50
140
  Browser gates (with Storybook running) are scripts/verify-character-avatars.mjs
51
- and scripts/verify-legacy-avatars.mjs. They inspect painted pixels, interaction,
141
+ and scripts/verify-legacy-avatars.mjs, plus verify-avatar-render-budget.mjs and
142
+ verify-avatar-shared-renderer.mjs for crowd lifetime and actual 24/48-avatar motion.
143
+ verify-avatar-shared-surface.mjs checks atlas pixels, MSAA and failed allocation;
144
+ verify-avatar-shared-programs.mjs and verify-avatar-shared-textures.mjs compare
145
+ actual frame pixels against the original commands and verify independent changes.
146
+ verify-avatar-runtime-errors.mjs injects a GL failure before publication. verify-avatar-deferred-input.mjs forces a delayed GPU fence and checks real mouse capture, reactions, appearance edits, resizing and disposal during that wait. They inspect painted pixels, interaction,
52
147
  activity, transitions and resource cleanup, not just preparation callbacks.
53
148
 
54
149
  The optional native bridge uses separate WebViews, which cannot share the web
55
- engine/context caches. Physical-device validation remains pending.
150
+ engine/context caches. A physical Android WebView is checked separately from the native multi-WebView bridge.