@zigrivers/scaffold 3.4.1 → 3.5.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 (194) hide show
  1. package/README.md +91 -0
  2. package/content/knowledge/game/game-accessibility.md +328 -0
  3. package/content/knowledge/game/game-ai-patterns.md +542 -0
  4. package/content/knowledge/game/game-asset-pipeline.md +359 -0
  5. package/content/knowledge/game/game-audio-design.md +342 -0
  6. package/content/knowledge/game/game-binary-vcs-strategy.md +396 -0
  7. package/content/knowledge/game/game-design-document.md +260 -0
  8. package/content/knowledge/game/game-domain-patterns.md +297 -0
  9. package/content/knowledge/game/game-economy-design.md +355 -0
  10. package/content/knowledge/game/game-engine-selection.md +242 -0
  11. package/content/knowledge/game/game-input-systems.md +357 -0
  12. package/content/knowledge/game/game-level-content-design.md +455 -0
  13. package/content/knowledge/game/game-liveops-analytics.md +280 -0
  14. package/content/knowledge/game/game-localization.md +323 -0
  15. package/content/knowledge/game/game-milestone-definitions.md +337 -0
  16. package/content/knowledge/game/game-modding-ugc.md +390 -0
  17. package/content/knowledge/game/game-narrative-design.md +404 -0
  18. package/content/knowledge/game/game-networking.md +391 -0
  19. package/content/knowledge/game/game-performance-budgeting.md +378 -0
  20. package/content/knowledge/game/game-platform-certification.md +417 -0
  21. package/content/knowledge/game/game-project-structure.md +360 -0
  22. package/content/knowledge/game/game-save-systems.md +452 -0
  23. package/content/knowledge/game/game-testing-strategy.md +470 -0
  24. package/content/knowledge/game/game-ui-patterns.md +475 -0
  25. package/content/knowledge/game/game-vr-ar-design.md +313 -0
  26. package/content/knowledge/review/review-art-bible.md +305 -0
  27. package/content/knowledge/review/review-game-design.md +303 -0
  28. package/content/knowledge/review/review-game-economy.md +272 -0
  29. package/content/knowledge/review/review-netcode.md +280 -0
  30. package/content/knowledge/review/review-platform-cert.md +341 -0
  31. package/content/methodology/custom-defaults.yml +25 -0
  32. package/content/methodology/deep.yml +25 -0
  33. package/content/methodology/game-overlay.yml +145 -0
  34. package/content/methodology/mvp.yml +25 -0
  35. package/content/pipeline/architecture/ai-behavior-design.md +87 -0
  36. package/content/pipeline/architecture/netcode-spec.md +86 -0
  37. package/content/pipeline/architecture/review-netcode.md +78 -0
  38. package/content/pipeline/foundation/performance-budgets.md +91 -0
  39. package/content/pipeline/modeling/narrative-bible.md +84 -0
  40. package/content/pipeline/pre/game-design-document.md +89 -0
  41. package/content/pipeline/pre/review-gdd.md +74 -0
  42. package/content/pipeline/quality/analytics-telemetry.md +98 -0
  43. package/content/pipeline/quality/live-ops-plan.md +99 -0
  44. package/content/pipeline/quality/platform-cert-prep.md +129 -0
  45. package/content/pipeline/quality/playtest-plan.md +83 -0
  46. package/content/pipeline/specification/art-bible.md +87 -0
  47. package/content/pipeline/specification/audio-design.md +96 -0
  48. package/content/pipeline/specification/content-structure-design.md +141 -0
  49. package/content/pipeline/specification/economy-design.md +104 -0
  50. package/content/pipeline/specification/game-accessibility.md +82 -0
  51. package/content/pipeline/specification/game-ui-spec.md +97 -0
  52. package/content/pipeline/specification/input-controls-spec.md +81 -0
  53. package/content/pipeline/specification/localization-plan.md +113 -0
  54. package/content/pipeline/specification/modding-ugc-spec.md +116 -0
  55. package/content/pipeline/specification/online-services-spec.md +104 -0
  56. package/content/pipeline/specification/review-economy.md +87 -0
  57. package/content/pipeline/specification/review-game-ui.md +73 -0
  58. package/content/pipeline/specification/save-system-spec.md +116 -0
  59. package/dist/cli/commands/adopt.d.ts.map +1 -1
  60. package/dist/cli/commands/adopt.js +25 -0
  61. package/dist/cli/commands/adopt.js.map +1 -1
  62. package/dist/cli/commands/adopt.test.js +28 -1
  63. package/dist/cli/commands/adopt.test.js.map +1 -1
  64. package/dist/cli/commands/build.test.js +3 -0
  65. package/dist/cli/commands/build.test.js.map +1 -1
  66. package/dist/cli/commands/init.d.ts +1 -0
  67. package/dist/cli/commands/init.d.ts.map +1 -1
  68. package/dist/cli/commands/init.js +6 -0
  69. package/dist/cli/commands/init.js.map +1 -1
  70. package/dist/cli/commands/init.test.js +12 -1
  71. package/dist/cli/commands/init.test.js.map +1 -1
  72. package/dist/cli/commands/knowledge.test.js +8 -0
  73. package/dist/cli/commands/knowledge.test.js.map +1 -1
  74. package/dist/cli/commands/next.d.ts.map +1 -1
  75. package/dist/cli/commands/next.js +19 -5
  76. package/dist/cli/commands/next.js.map +1 -1
  77. package/dist/cli/commands/next.test.js +56 -0
  78. package/dist/cli/commands/next.test.js.map +1 -1
  79. package/dist/cli/commands/rework.d.ts.map +1 -1
  80. package/dist/cli/commands/rework.js +11 -2
  81. package/dist/cli/commands/rework.js.map +1 -1
  82. package/dist/cli/commands/rework.test.js +5 -0
  83. package/dist/cli/commands/rework.test.js.map +1 -1
  84. package/dist/cli/commands/run.d.ts.map +1 -1
  85. package/dist/cli/commands/run.js +54 -4
  86. package/dist/cli/commands/run.js.map +1 -1
  87. package/dist/cli/commands/run.test.js +384 -0
  88. package/dist/cli/commands/run.test.js.map +1 -1
  89. package/dist/cli/commands/skip.test.js +3 -0
  90. package/dist/cli/commands/skip.test.js.map +1 -1
  91. package/dist/cli/commands/status.d.ts.map +1 -1
  92. package/dist/cli/commands/status.js +16 -3
  93. package/dist/cli/commands/status.js.map +1 -1
  94. package/dist/cli/commands/status.test.js +55 -0
  95. package/dist/cli/commands/status.test.js.map +1 -1
  96. package/dist/cli/output/auto.d.ts +3 -0
  97. package/dist/cli/output/auto.d.ts.map +1 -1
  98. package/dist/cli/output/auto.js +9 -0
  99. package/dist/cli/output/auto.js.map +1 -1
  100. package/dist/cli/output/context.d.ts +6 -0
  101. package/dist/cli/output/context.d.ts.map +1 -1
  102. package/dist/cli/output/context.js.map +1 -1
  103. package/dist/cli/output/context.test.js +87 -0
  104. package/dist/cli/output/context.test.js.map +1 -1
  105. package/dist/cli/output/error-display.test.js +3 -0
  106. package/dist/cli/output/error-display.test.js.map +1 -1
  107. package/dist/cli/output/interactive.d.ts +3 -0
  108. package/dist/cli/output/interactive.d.ts.map +1 -1
  109. package/dist/cli/output/interactive.js +76 -0
  110. package/dist/cli/output/interactive.js.map +1 -1
  111. package/dist/cli/output/json.d.ts +3 -0
  112. package/dist/cli/output/json.d.ts.map +1 -1
  113. package/dist/cli/output/json.js +9 -0
  114. package/dist/cli/output/json.js.map +1 -1
  115. package/dist/config/loader.d.ts.map +1 -1
  116. package/dist/config/loader.js +3 -2
  117. package/dist/config/loader.js.map +1 -1
  118. package/dist/config/schema.d.ts +641 -15
  119. package/dist/config/schema.d.ts.map +1 -1
  120. package/dist/config/schema.js +26 -1
  121. package/dist/config/schema.js.map +1 -1
  122. package/dist/config/schema.test.js +192 -1
  123. package/dist/config/schema.test.js.map +1 -1
  124. package/dist/core/assembly/overlay-loader.d.ts +24 -0
  125. package/dist/core/assembly/overlay-loader.d.ts.map +1 -0
  126. package/dist/core/assembly/overlay-loader.js +190 -0
  127. package/dist/core/assembly/overlay-loader.js.map +1 -0
  128. package/dist/core/assembly/overlay-loader.test.d.ts +2 -0
  129. package/dist/core/assembly/overlay-loader.test.d.ts.map +1 -0
  130. package/dist/core/assembly/overlay-loader.test.js +106 -0
  131. package/dist/core/assembly/overlay-loader.test.js.map +1 -0
  132. package/dist/core/assembly/overlay-resolver.d.ts +15 -0
  133. package/dist/core/assembly/overlay-resolver.d.ts.map +1 -0
  134. package/dist/core/assembly/overlay-resolver.js +58 -0
  135. package/dist/core/assembly/overlay-resolver.js.map +1 -0
  136. package/dist/core/assembly/overlay-resolver.test.d.ts +2 -0
  137. package/dist/core/assembly/overlay-resolver.test.d.ts.map +1 -0
  138. package/dist/core/assembly/overlay-resolver.test.js +246 -0
  139. package/dist/core/assembly/overlay-resolver.test.js.map +1 -0
  140. package/dist/core/assembly/overlay-state-resolver.d.ts +26 -0
  141. package/dist/core/assembly/overlay-state-resolver.d.ts.map +1 -0
  142. package/dist/core/assembly/overlay-state-resolver.js +63 -0
  143. package/dist/core/assembly/overlay-state-resolver.js.map +1 -0
  144. package/dist/core/assembly/overlay-state-resolver.test.d.ts +2 -0
  145. package/dist/core/assembly/overlay-state-resolver.test.d.ts.map +1 -0
  146. package/dist/core/assembly/overlay-state-resolver.test.js +256 -0
  147. package/dist/core/assembly/overlay-state-resolver.test.js.map +1 -0
  148. package/dist/core/assembly/preset-loader.d.ts +1 -0
  149. package/dist/core/assembly/preset-loader.d.ts.map +1 -1
  150. package/dist/core/assembly/preset-loader.js +2 -0
  151. package/dist/core/assembly/preset-loader.js.map +1 -1
  152. package/dist/core/dependency/eligibility.test.js +3 -0
  153. package/dist/core/dependency/eligibility.test.js.map +1 -1
  154. package/dist/e2e/game-pipeline.test.d.ts +10 -0
  155. package/dist/e2e/game-pipeline.test.d.ts.map +1 -0
  156. package/dist/e2e/game-pipeline.test.js +298 -0
  157. package/dist/e2e/game-pipeline.test.js.map +1 -0
  158. package/dist/e2e/init.test.js +3 -0
  159. package/dist/e2e/init.test.js.map +1 -1
  160. package/dist/project/adopt.d.ts +3 -1
  161. package/dist/project/adopt.d.ts.map +1 -1
  162. package/dist/project/adopt.js +29 -1
  163. package/dist/project/adopt.js.map +1 -1
  164. package/dist/project/adopt.test.js +51 -1
  165. package/dist/project/adopt.test.js.map +1 -1
  166. package/dist/types/config.d.ts +50 -4
  167. package/dist/types/config.d.ts.map +1 -1
  168. package/dist/types/config.test.d.ts +2 -0
  169. package/dist/types/config.test.d.ts.map +1 -0
  170. package/dist/types/config.test.js +97 -0
  171. package/dist/types/config.test.js.map +1 -0
  172. package/dist/utils/eligible.d.ts +3 -2
  173. package/dist/utils/eligible.d.ts.map +1 -1
  174. package/dist/utils/eligible.js +18 -4
  175. package/dist/utils/eligible.js.map +1 -1
  176. package/dist/utils/errors.d.ts +4 -0
  177. package/dist/utils/errors.d.ts.map +1 -1
  178. package/dist/utils/errors.js +31 -0
  179. package/dist/utils/errors.js.map +1 -1
  180. package/dist/utils/errors.test.js +4 -1
  181. package/dist/utils/errors.test.js.map +1 -1
  182. package/dist/wizard/questions.d.ts +4 -0
  183. package/dist/wizard/questions.d.ts.map +1 -1
  184. package/dist/wizard/questions.js +59 -1
  185. package/dist/wizard/questions.js.map +1 -1
  186. package/dist/wizard/questions.test.js +178 -4
  187. package/dist/wizard/questions.test.js.map +1 -1
  188. package/dist/wizard/wizard.d.ts +1 -0
  189. package/dist/wizard/wizard.d.ts.map +1 -1
  190. package/dist/wizard/wizard.js +4 -1
  191. package/dist/wizard/wizard.js.map +1 -1
  192. package/dist/wizard/wizard.test.js +102 -4
  193. package/dist/wizard/wizard.test.js.map +1 -1
  194. package/package.json +1 -1
@@ -0,0 +1,313 @@
1
+ ---
2
+ name: game-vr-ar-design
3
+ description: VR comfort and locomotion, stereo rendering budgets, spatial UI, hand tracking, gaze interaction, motion sickness, and certification
4
+ topics: [game-dev, vr, ar, comfort, locomotion, spatial-ui]
5
+ ---
6
+
7
+ VR and AR development is fundamentally constrained by human physiology in ways that flat-screen development is not. Every design decision — camera movement, UI placement, rendering performance, input method — must account for the vestibular system, visual comfort, and spatial cognition of the player. A frame drop that is a minor annoyance on a monitor becomes nausea-inducing in a headset. A UI panel that works at arm's length on a screen becomes unreadable at 0.5 meters or causes eye strain at 0.3 meters. Motion that the player did not initiate with their own body creates a sensory conflict that the brain interprets as poisoning. VR/AR design is not flat-screen design with head tracking bolted on — it requires rethinking interaction, performance, and comfort from first principles.
8
+
9
+ ## Summary
10
+
11
+ ### Performance Targets
12
+
13
+ VR has the most demanding performance requirements in real-time rendering because dropped frames directly cause motion sickness:
14
+
15
+ - **Quest 3 / Quest Pro**: 72 Hz or 90 Hz (90 Hz strongly recommended). Per-eye resolution: 2064x2208. Total pixels per frame: ~9.1 million (both eyes). GPU: Mobile Adreno, roughly equivalent to a 2018 mid-range phone GPU.
16
+ - **PlayStation VR2**: 90 Hz or 120 Hz. Per-eye resolution: 2000x2040. Total pixels: ~8.2 million. GPU: PS5 AMD RDNA2 — much more capable than Quest but still must hit 90+ Hz.
17
+ - **PC VR (Valve Index, Pimax)**: 90 Hz, 120 Hz, or 144 Hz. Per-eye resolution varies (Index: 1440x1600). GPU: Desktop RTX-class, but driving high refresh rates at high resolution is still demanding.
18
+ - **Apple Vision Pro**: 90 Hz with dynamic foveated rendering. Per-eye resolution: ~3660x3200. GPU: M2+R1 chip with dedicated real-time sensor processing.
19
+
20
+ **The golden rule**: Never drop below the headset's target frame rate. A single dropped frame is noticeable. Sustained drops below target cause discomfort within 30 seconds and nausea within 2-3 minutes for sensitive users.
21
+
22
+ **Motion-to-photon latency**: The time between the player moving their head and the display updating. Must be below 20 ms. Above 20 ms, the visual world lags behind head movement, creating a disconnect that triggers motion sickness. Headset runtimes (SteamVR, Oculus Runtime) provide reprojection/timewarp as a safety net, but it is a fallback, not a strategy.
23
+
24
+ ### Comfort Ratings
25
+
26
+ Platform holders (Meta, Sony, Apple) require games to self-rate their comfort level:
27
+
28
+ - **Comfortable**: Stationary or room-scale with no artificial locomotion. Suitable for all players. (Example: Beat Saber, puzzle games)
29
+ - **Moderate**: Slow artificial locomotion with comfort options. Most players tolerate with breaks. (Example: Walkabout Mini Golf, seated cockpit games)
30
+ - **Intense**: Fast movement, artificial rotation, or camera control not driven by head movement. Many players experience discomfort. (Example: fast FPS games, roller coaster simulations)
31
+
32
+ ### Locomotion Options
33
+
34
+ Locomotion is the most contentious design problem in VR. Every method trades off between immersion, comfort, and accessibility.
35
+
36
+ **Teleportation:**
37
+ - Player points a parabolic arc, selects a destination, and instantly moves there
38
+ - Most comfortable (zero vestibular conflict)
39
+ - Breaks spatial continuity — players lose sense of distance traveled
40
+ - Standard for Quest platform and first-time VR users
41
+
42
+ **Smooth locomotion (thumbstick movement):**
43
+ - Continuous movement in the direction the player is looking or pointing
44
+ - Familiar to flat-screen gamers
45
+ - Causes motion sickness in 30-60% of new VR users
46
+ - Always offer as an option alongside teleportation, never as the only choice
47
+
48
+ **Snap turn vs smooth turn:**
49
+ - Snap turn rotates in fixed increments (30, 45, or 90 degrees) — eliminates rotational vestibular mismatch
50
+ - Smooth turn rotates continuously — more immersive but more nauseating
51
+ - Default to snap turn; offer smooth turn as an advanced option
52
+
53
+ **Room-scale (1:1 physical movement):**
54
+ - Player walks in real space; movement is tracked 1:1 in the virtual world
55
+ - Zero motion sickness (vestibular and visual signals match perfectly)
56
+ - Limited by physical play area (typically 2x2 m to 3x3 m)
57
+ - Best for experiences designed around small spaces
58
+
59
+ ## Deep Guidance
60
+
61
+ ### Stereo Rendering Architecture
62
+
63
+ VR renders every frame twice — once per eye — with slightly different camera positions to create stereoscopic depth. This doubles the rendering cost compared to flat-screen at the same resolution.
64
+
65
+ **Single-pass stereo rendering:**
66
+
67
+ Modern VR SDKs (OpenXR, Unity XR, Unreal VR) support single-pass stereo, which renders both eyes in a single draw call using instanced rendering. This eliminates the CPU overhead of submitting draw calls twice.
68
+
69
+ ```hlsl
70
+ // Single-pass instanced stereo vertex shader (HLSL / Unity URP example)
71
+ // The GPU renders each triangle twice — once per eye — using SV_InstanceID
72
+ // or unity_StereoEyeIndex to select the correct view-projection matrix.
73
+
74
+ struct VertexInput {
75
+ float3 positionOS : POSITION;
76
+ float3 normalOS : NORMAL;
77
+ float2 uv : TEXCOORD0;
78
+ UNITY_VERTEX_INPUT_INSTANCE_ID
79
+ };
80
+
81
+ struct VertexOutput {
82
+ float4 positionCS : SV_POSITION;
83
+ float2 uv : TEXCOORD0;
84
+ float3 normalWS : TEXCOORD1;
85
+ UNITY_VERTEX_OUTPUT_STEREO
86
+ };
87
+
88
+ VertexOutput vert(VertexInput input) {
89
+ VertexOutput output;
90
+ UNITY_SETUP_INSTANCE_ID(input);
91
+ UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(output);
92
+
93
+ float3 positionWS = TransformObjectToWorld(input.positionOS);
94
+ output.positionCS = TransformWorldToHClip(positionWS);
95
+ output.normalWS = TransformObjectToWorldNormal(input.normalOS);
96
+ output.uv = input.uv;
97
+ return output;
98
+ }
99
+ ```
100
+
101
+ **Foveated rendering:**
102
+
103
+ Foveated rendering reduces pixel workload by rendering the periphery at lower resolution than the center of the player's gaze. Fixed foveated rendering uses a static center region; eye-tracked foveated rendering dynamically follows the player's gaze.
104
+
105
+ Performance impact:
106
+ - Fixed foveated rendering (Quest 3): 20-30% GPU time savings at high foveation levels
107
+ - Eye-tracked foveated rendering (PSVR2, Vision Pro): 40-50% GPU time savings with no perceptible quality loss
108
+ - Outer ring can render at 1/4 to 1/16 resolution with minimal visual impact because peripheral vision has very low acuity
109
+
110
+ **Rendering budget for Quest 3 (mobile VR):**
111
+ - Target: 90 FPS = 11.1 ms per frame
112
+ - Draw calls: 50-100 maximum (batching and instancing are critical)
113
+ - Triangles: 100K-300K per frame (both eyes combined)
114
+ - Texture memory: 200-400 MB (compressed ASTC textures mandatory)
115
+ - Shader complexity: avoid multi-pass shaders; one directional light, baked GI, no real-time shadows if possible
116
+ - Post-processing: avoid or minimize — bloom, SSAO, and motion blur are expensive and motion blur in VR causes nausea
117
+
118
+ **Rendering budget for PC VR:**
119
+ - Target: 90-120 FPS depending on headset
120
+ - Draw calls: 500-2,000 (still much lower than flat-screen games due to frame rate target)
121
+ - Triangles: 1-3 million per frame
122
+ - Real-time shadows: one cascade, limited distance
123
+ - Post-processing: use sparingly; temporal anti-aliasing is recommended but must be tuned to avoid ghosting at high head rotation speeds
124
+
125
+ ### Spatial UI Design
126
+
127
+ VR UI cannot follow flat-screen conventions. Flat HUDs locked to the camera (head-locked UI) cause eye strain and nausea. VR UI must exist in 3D space.
128
+
129
+ **UI placement guidelines:**
130
+
131
+ - **Comfortable viewing distance**: 1.5-3.0 meters from the player. Closer than 1.0 m forces uncomfortable eye convergence. Farther than 5.0 m loses readability.
132
+ - **Comfortable viewing angle**: Within 30 degrees of center gaze (horizontally and vertically). UI at extreme angles requires neck rotation, which fatigues players.
133
+ - **Text size**: Minimum 1.0 degree of visual arc per line height. At 2 meters distance, this is approximately 3.5 cm tall text. For Quest 3 resolution, aim for 1.5+ degrees per line to remain crisp.
134
+ - **Panel curvature**: Curve large UI panels to maintain consistent distance from the player's eyes across the panel's width. A flat 2-meter-wide panel has edges 15-20% farther from the player than the center, causing focus mismatch.
135
+
136
+ **UI anchoring strategies:**
137
+
138
+ ```
139
+ World-locked UI:
140
+ - Attached to a fixed position in the game world
141
+ - Example: A scoreboard on a virtual wall, a label above an NPC
142
+ - Feels most natural and immersive
143
+ - Disappears when the player turns away (can be disorienting if critical)
144
+
145
+ Body-locked UI:
146
+ - Follows the player's body position but not head rotation
147
+ - Example: A wrist-mounted menu (look at your virtual wrist to open)
148
+ - Good for persistent info (health, ammo) without head-lock nausea
149
+ - Requires the player to consciously look at it
150
+
151
+ Tag-along UI:
152
+ - Lazily follows head gaze with damping and deadzone
153
+ - Stays roughly in front of the player but does not track head 1:1
154
+ - Soft spring behavior: UI drifts into view when the player looks away for a few seconds
155
+ - Good for notifications, subtitles, and non-critical persistent info
156
+ - NEVER lock UI rigidly to the head — this is the most common VR UI mistake
157
+
158
+ Hand-attached UI:
159
+ - Anchored to the player's tracked hand or controller
160
+ - Example: Inventory panel that appears when the player flips their hand palm-up
161
+ - Natural interaction metaphor but can be jittery on hand tracking (vs controllers)
162
+ ```
163
+
164
+ ### Hand Tracking and Gaze Interaction
165
+
166
+ Hand tracking (Quest, Vision Pro) eliminates controllers but introduces new design constraints:
167
+
168
+ **Hand tracking limitations:**
169
+ - Accuracy: ±5-10 mm positional, ±5-10 degree rotational (much worse than controller tracking)
170
+ - Occlusion: Hands behind the back, behind the head, or overlapping each other lose tracking
171
+ - Latency: 20-40 ms higher than controller input
172
+ - False positives: Casual hand movements may trigger unintended interactions
173
+ - Fatigue: Sustained arm-raised interactions cause "gorilla arm" fatigue within 2-3 minutes
174
+
175
+ **Design rules for hand tracking:**
176
+ - Use large interaction targets (minimum 6 cm diameter at arm's length)
177
+ - Provide visual and audio feedback for hover, select, and release states
178
+ - Rest position for hands should be below chest height — do not require raised arms for extended interactions
179
+ - Avoid precision tasks (small buttons, fine sliders) — hand tracking does not have the precision
180
+ - Always provide a controller fallback for accessibility
181
+
182
+ **Gaze interaction (eye tracking):**
183
+ - Eye tracking (PSVR2, Vision Pro, Pimax Crystal) allows gaze to act as a pointer
184
+ - Gaze + pinch (Vision Pro model): Look at a target, pinch thumb-and-finger to select
185
+ - Gaze + dwell: Look at a target for a threshold duration (1.0-1.5 seconds) to select
186
+ - Dwell timers need visual feedback (radial progress indicator on the target)
187
+ - Midas touch problem: Players look at things they do not intend to interact with; require explicit confirmation (pinch, button press, or dwell) rather than gaze-alone activation
188
+
189
+ ### Motion Sickness Mitigation
190
+
191
+ Motion sickness in VR (technically "cybersickness") is caused by conflict between vestibular (inner ear) and visual signals. The inner ear reports "not moving" while the eyes report "moving." The brain interprets this conflict as potential poisoning and triggers nausea.
192
+
193
+ **Proven mitigation techniques:**
194
+
195
+ ```
196
+ Technique | Effectiveness | Immersion Cost
197
+ ────────────────────────┼───────────────┼───────────────
198
+ Teleportation | High | High (breaks continuity)
199
+ Snap turn | High | Low
200
+ Vignetting during move | Medium-High | Low (reduces FOV temporarily)
201
+ Stationary reference | Medium | Low (cockpit, nose)
202
+ Reduced FOV during move | Medium | Medium
203
+ Comfort cage / grid | Medium | Medium (visible overlay)
204
+ Slower movement speed | Medium | Low
205
+ Head-bob removal | Medium | Low
206
+ Fixed horizon line | Medium | Low
207
+ ```
208
+
209
+ **Vignetting (tunnel vision):**
210
+ - During artificial locomotion, darken or black out the peripheral vision
211
+ - Reduces the visual area that conflicts with vestibular signals
212
+ - Player adjustable: some players want full FOV, others need heavy vignetting
213
+ - Implementation: post-process shader that blends a dark vignette from the edges inward when velocity exceeds a threshold
214
+
215
+ **Stationary reference frame:**
216
+ - Add a fixed visual element that does not move with the virtual world
217
+ - A virtual nose, cockpit dashboard, or helmet rim provides a stable reference that reduces conflict
218
+ - Even a subtle grid overlay on the floor during movement reduces discomfort
219
+
220
+ **Developer testing protocol:**
221
+ - Test with VR-naive users (not just the dev team, who have developed "VR legs")
222
+ - Minimum 20-minute test sessions — sickness often appears after 10-15 minutes of continuous play
223
+ - Include a post-session questionnaire (Simulator Sickness Questionnaire / SSQ)
224
+ - Track drop-off points where testers request to stop
225
+ - Any feature that causes 20%+ of testers to report discomfort must be optional or removed
226
+
227
+ ### VR-Specific Certification Requirements
228
+
229
+ Platform holders impose VR-specific certification requirements beyond standard console certification:
230
+
231
+ **Meta Quest Store requirements:**
232
+ - Must maintain 72 Hz or 90 Hz with zero dropped frames during normal gameplay
233
+ - Must not render anything closer than 0.5 m to the camera (causes eye strain)
234
+ - Must include a "recenter" option accessible at any time
235
+ - Must pause when the headset is removed (proximity sensor)
236
+ - Must render a passthrough or guardian boundary when the player approaches play area edges
237
+ - Must include comfort rating metadata in the store listing
238
+ - Must not artificially move the camera without player input (no forced camera animations, no cutscenes that rotate the player)
239
+
240
+ **PlayStation VR2 requirements:**
241
+ - Must support 90 Hz minimum; 120 Hz mode recommended for fast-paced games
242
+ - Must implement reprojection correctly (Sony provides the SDK)
243
+ - Must use eye-tracking-based foveated rendering (PlayStation SDK provides the API)
244
+ - Must support the Sense controller haptics (adaptive triggers, haptic feedback)
245
+ - Must implement the "cinematic mode" fallback for non-VR displays
246
+ - Must display health and safety warnings at first launch
247
+
248
+ **Apple visionOS requirements:**
249
+ - Must use RealityKit or Metal with the Compositor Services API
250
+ - Must support Shared Space (runs alongside other apps) or Full Space (exclusive VR mode)
251
+ - Must implement passthrough correctly — never render over the user's real environment without explicit consent
252
+ - Must support eye-and-pinch interaction as the primary input method
253
+ - Must handle "Digital Crown" press to return to the home view
254
+ - Must not cause the system thermal throttling warning (sustained thermal headroom)
255
+
256
+ ### AR-Specific Design Considerations
257
+
258
+ AR overlays virtual content onto the real world, introducing unique constraints:
259
+
260
+ **Spatial anchoring:**
261
+ - Virtual objects must be anchored to real-world surfaces (planes, walls, floors) detected by the device's scene understanding
262
+ - Anchors drift over time (1-5 cm per minute without re-localization)
263
+ - Save and restore anchors across sessions using persistent world maps (ARKit, ARCore, or OpenXR spatial anchors)
264
+ - Test on various surface types: glossy floors, textured carpet, low-light rooms, outdoor grass
265
+
266
+ **Lighting estimation:**
267
+ - AR devices estimate real-world lighting direction and intensity
268
+ - Virtual objects must match the real-world lighting to avoid looking "pasted on"
269
+ - Use the AR framework's light estimation API (ARKit provides ambient intensity + color temperature + directional light probes)
270
+ - Cast virtual shadows onto real-world surfaces for grounding
271
+
272
+ **Occlusion:**
273
+ - Real-world objects should occlude (block) virtual objects that are behind them
274
+ - LiDAR-equipped devices (iPhone Pro, iPad Pro, Vision Pro) provide depth maps for real-time occlusion
275
+ - Non-LiDAR devices can approximate with plane-based occlusion (objects behind detected floor/wall planes are hidden)
276
+ - Imperfect occlusion is more distracting than no occlusion — if the device cannot produce clean occlusion, consider disabling it
277
+
278
+ **Interaction distance:**
279
+ - AR content at arm's length (0.3-1.0 m) works for tabletop experiences and close-up inspection
280
+ - AR content at room scale (1-5 m) works for furniture placement, navigation overlays
281
+ - AR content beyond 5 m has significant tracking drift and parallax issues on phone-based AR
282
+ - Head-mounted AR (Vision Pro, HoloLens) handles distance better due to stereoscopic depth
283
+
284
+ ### Performance Profiling for VR
285
+
286
+ Standard profiling tools miss VR-specific issues. Use platform-specific VR profilers:
287
+
288
+ ```
289
+ Platform | Profiling Tool | Key Metrics
290
+ ────────────────┼─────────────────────────────┼─────────────────────────────
291
+ Quest 3 | Meta Quest Developer Hub | FPS, GPU utilization %,
292
+ | (MQDH) + OVR Metrics Tool | CPU/GPU frame time,
293
+ | | thermal state, foveation level
294
+ ────────────────┼─────────────────────────────┼─────────────────────────────
295
+ PC VR | SteamVR Frame Timing | Frame time, reprojection %,
296
+ | + fpsVR + GPU vendor tools | GPU/CPU bound indicator,
297
+ | (Nsight, RenderDoc) | motion-to-photon latency
298
+ ────────────────┼─────────────────────────────┼─────────────────────────────
299
+ PSVR2 | PlayStation Performance | Frame time per eye,
300
+ | Analyzer (Razor) | foveated rendering savings,
301
+ | | Sense controller haptic load
302
+ ────────────────┼─────────────────────────────┼─────────────────────────────
303
+ Vision Pro | Xcode Instruments + | Render pipeline timeline,
304
+ | RealityKit Trace | thermal headroom %,
305
+ | | compositor latency
306
+ ```
307
+
308
+ **Key VR profiling metrics:**
309
+ - **Frame time (per eye)**: Must stay under the frame budget (11.1 ms at 90 Hz)
310
+ - **Reprojection/timewarp ratio**: Percentage of frames that required reprojection. Above 5% indicates consistent performance problems. Above 20% causes visible artifacts.
311
+ - **Thermal state**: Mobile VR (Quest) throttles GPU/CPU when overheating. Monitor thermal headroom and reduce quality settings proactively before thermal throttling kicks in.
312
+ - **Draw call count**: VR amplifies draw call overhead because each call may be issued twice (once per eye, unless using single-pass stereo). Batch aggressively.
313
+ - **Shader complexity**: Profile per-pixel shader cost. In VR, the pixel count is 2-3x a 1080p flat-screen game, so expensive fragment shaders hit much harder.
@@ -0,0 +1,305 @@
1
+ ---
2
+ name: review-art-bible
3
+ description: Failure modes and review passes specific to Art Bible documents — budget consistency, naming conventions, LOD coverage, and pipeline validation
4
+ topics: [game-dev, review, art, assets, lod, naming]
5
+ ---
6
+
7
+ # Review: Art Bible
8
+
9
+ The Art Bible defines visual standards, asset specifications, and production pipelines for every art asset in the game. It must be consistent with performance budgets, complete in naming conventions and LOD tier definitions, and actionable for artists working in DCC tools. This review uses 7 passes targeting the specific ways Art Bibles fail.
10
+
11
+ Follows the review process defined in `review-methodology.md`.
12
+
13
+ ## Summary
14
+
15
+ - **Pass 1 — Budget Consistency**: Polygon counts, texture sizes, and draw call limits align with performance budgets defined elsewhere; no asset exceeds its tier's budget.
16
+ - **Pass 2 — Naming Convention Completeness**: Every asset type (mesh, texture, material, animation, audio, VFX) has a naming convention; no gaps force artists to invent names.
17
+ - **Pass 3 — LOD Tier Coverage**: LOD tiers are defined for every asset category with specific poly reduction targets, transition distances, and quality fallback rules.
18
+ - **Pass 4 — Pipeline Validation Steps**: Every stage from DCC export to engine import has a validation step; no "hope it works" gaps in the pipeline.
19
+ - **Pass 5 — Platform-Specific Compression**: Texture compression formats, audio codecs, and mesh optimization targets are specified per target platform.
20
+ - **Pass 6 — DCC-to-Engine Import Validation**: Export settings, coordinate systems, scale factors, and material mappings are documented for every DCC-to-engine path.
21
+ - **Pass 7 — Style Guide Enforceability**: Visual style rules are objectively verifiable, not subjective; an artist can determine compliance without asking the art director.
22
+
23
+ ## Deep Guidance
24
+
25
+ ---
26
+
27
+ ## Pass 1: Budget Consistency
28
+
29
+ ### What to Check
30
+
31
+ Polygon counts, texture memory budgets, draw call targets, and shader complexity limits in the Art Bible align with performance budgets defined in the technical design or performance-budgets document. No individual asset spec exceeds what the performance budget allocates for its category.
32
+
33
+ ### Why This Matters
34
+
35
+ An Art Bible that specifies 50K polygons per character while the performance budget allocates 200K polygons for 10 on-screen characters has a math problem — 10 × 50K = 500K, which is 2.5x over budget. This disconnect is invisible until the game runs at 15 FPS on target hardware. Budget consistency between the Art Bible and performance constraints is the single most impactful review pass.
36
+
37
+ ### How to Check
38
+
39
+ 1. Extract per-asset-type budgets from the Art Bible: characters, props, environment tiles, VFX, UI elements
40
+ 2. Extract scene composition limits from the performance budget: max simultaneous characters, max props in view, max active VFX
41
+ 3. Multiply: (per-asset budget) × (max simultaneous count) = total budget consumption per category
42
+ 4. Sum all categories — does the total exceed the frame budget for the target platform?
43
+ 5. Check texture memory: total unique textures × resolution × format size vs. available VRAM on minimum spec hardware
44
+ 6. Verify draw call budget: each material instance is typically one draw call — count materials × max instances
45
+ 7. Check shader complexity: are there real-time shadowing, SSR, volumetric, or post-process budgets that conflict with art specifications?
46
+
47
+ ### What a Finding Looks Like
48
+
49
+ - P0: "Art Bible specifies 4K textures for hero characters (4 × 4096×4096 RGBA = 256MB). With 4 characters on screen, texture memory alone is 1GB — exceeding the 2GB VRAM target when environment textures are included."
50
+ - P1: "Character polygon budget is 30K but no LOD specification exists. At 200m distance, 30K characters consume the same budget as at 5m distance."
51
+ - P2: "VFX particle budget says 'up to 10,000 particles per effect' but does not specify max simultaneous effects. 3 effects × 10K = 30K particles may exceed the GPU particle budget."
52
+
53
+ ---
54
+
55
+ ## Pass 2: Naming Convention Completeness
56
+
57
+ ### What to Check
58
+
59
+ Every asset type in the production pipeline has an explicit naming convention. Naming covers prefixes/suffixes for type identification, platform/LOD/variant tagging, and version control disambiguation. No asset type requires an artist to invent a naming scheme.
60
+
61
+ ### Why This Matters
62
+
63
+ Inconsistent naming breaks automated pipelines. When the build system expects `T_CharacterName_D.png` for diffuse textures and an artist names it `CharacterName_diffuse.tga`, the import pipeline either fails silently or imports the asset incorrectly. At scale, naming inconsistency makes asset search, batch processing, and automated validation impossible. Every hour spent fixing naming retroactively costs 10x the effort of defining conventions upfront.
64
+
65
+ ### How to Check
66
+
67
+ Use this checklist to verify every asset type is covered:
68
+
69
+ ```markdown
70
+ ## Naming Convention Coverage Checklist
71
+
72
+ ### Meshes
73
+ - [ ] Static meshes: prefix, category, variant, LOD suffix
74
+ - [ ] Skeletal meshes: prefix, character/creature name, variant
75
+ - [ ] Collision meshes: prefix convention (UCX_, UBX_, USP_ or equivalent)
76
+ - [ ] LOD suffix convention: _LOD0, _LOD1, _LOD2, etc.
77
+
78
+ ### Textures
79
+ - [ ] Diffuse/Albedo: suffix convention (_D, _Albedo, _BaseColor)
80
+ - [ ] Normal map: suffix convention (_N, _Normal)
81
+ - [ ] Roughness/Metallic/AO: suffix conventions for each channel
82
+ - [ ] Packed channel maps: channel order documented (e.g., RGBA = R:Metallic, G:Roughness, B:AO, A:Height)
83
+ - [ ] Emissive: suffix convention (_E, _Emissive)
84
+ - [ ] Resolution suffix if multiple resolutions exist (_2K, _4K)
85
+
86
+ ### Materials
87
+ - [ ] Master material naming
88
+ - [ ] Material instance naming: parent reference in name
89
+ - [ ] Material function naming
90
+
91
+ ### Animations
92
+ - [ ] Animation clip naming: character_action_variant format
93
+ - [ ] Animation blend space naming
94
+ - [ ] Animation montage naming
95
+ - [ ] Additive vs. override distinction in name
96
+
97
+ ### Audio
98
+ - [ ] Sound cue naming
99
+ - [ ] Waveform file naming
100
+ - [ ] Music track naming
101
+ - [ ] Attenuation preset naming
102
+
103
+ ### VFX
104
+ - [ ] Particle system naming
105
+ - [ ] VFX texture naming (flipbook, noise, gradient)
106
+ - [ ] VFX material naming
107
+
108
+ ### UI
109
+ - [ ] Widget/component naming
110
+ - [ ] Icon naming: category_name_state format
111
+ - [ ] Font asset naming
112
+
113
+ ### Folders
114
+ - [ ] Folder hierarchy convention documented
115
+ - [ ] Per-asset-type folder location specified
116
+ - [ ] Shared vs. unique asset folder rules
117
+ ```
118
+
119
+ ### What a Finding Looks Like
120
+
121
+ - P0: "Texture naming convention exists for diffuse and normal maps but packed channel maps (ORM, MRAO) have no convention. Artists will invent inconsistent suffixes and channel orders."
122
+ - P1: "Animation naming convention uses character_action format but does not address variants. 'Hero_Run' and 'Hero_Run_Injured' need a variant convention or the library becomes unsearchable."
123
+ - P2: "VFX textures have no naming convention distinct from material textures. A search for 'Smoke' returns both VFX flipbooks and environment material textures."
124
+
125
+ ---
126
+
127
+ ## Pass 3: LOD Tier Coverage
128
+
129
+ ### What to Check
130
+
131
+ LOD (Level of Detail) tiers are defined for every asset category that appears at varying distances. Each tier specifies polygon reduction targets, texture downscale ratios, transition distances, and quality fallback rules for when LOD transitions are visible.
132
+
133
+ ### Why This Matters
134
+
135
+ Without LOD specifications, every asset renders at maximum quality regardless of screen size. A 50K polygon character at 500m distance occupies 3 pixels but consumes the same GPU budget as at 5m. LOD is the primary tool for maintaining frame rate in open environments. Missing LOD specs mean either every asset is over-budgeted for distance viewing (wasting GPU) or under-budgeted for close-up viewing (visible quality loss).
136
+
137
+ ### How to Check
138
+
139
+ 1. Verify LOD tiers exist for: characters, props, environment assets, foliage, vehicles, weapons
140
+ 2. For each asset category, check that each LOD tier specifies: polygon count or percentage reduction, texture resolution, transition distance
141
+ 3. Verify transition method: distance-based, screen-size-based, or manual — is it consistent across categories?
142
+ 4. Check for LOD transition artifacts: does the Art Bible specify dithering, cross-fade, or hard-cut transitions?
143
+ 5. Verify that LOD0 (highest quality) budget matches the performance budget from Pass 1
144
+ 6. Check for imposter/billboard LODs for distant foliage and crowd characters
145
+ 7. Verify that skeletal meshes have LOD-appropriate bone reduction (fewer bones at lower LODs to reduce skinning cost)
146
+
147
+ ### What a Finding Looks Like
148
+
149
+ - P0: "No LOD specification exists for any asset type. The game has open-world environments where assets are visible at 50m-2000m distances."
150
+ - P1: "Character LODs are defined (LOD0-LOD3) but environment props have no LOD specification. Dense environments with hundreds of props will exceed frame budget."
151
+ - P1: "LOD transition distance is specified as 'appropriate for the asset size' — this is not a specification. Each asset category needs concrete distance thresholds."
152
+ - P2: "Foliage LODs exist but no imposter/billboard LOD is specified for distances beyond 200m. Dense forests will render full 3D meshes at any distance."
153
+
154
+ ---
155
+
156
+ ## Pass 4: Pipeline Validation Steps
157
+
158
+ ### What to Check
159
+
160
+ The Art Bible defines validation checkpoints at every stage of the asset pipeline: DCC authoring constraints, export settings verification, automated import validation, in-engine quality checks, and integration testing. No stage relies on "the artist will check it looks right."
161
+
162
+ ### Why This Matters
163
+
164
+ Art pipelines without validation gates produce assets that are technically correct in the DCC tool but broken in-engine. Typical failures: non-manifold geometry that renders in Maya but creates lighting artifacts in-engine, textures with wrong color space (sRGB vs. linear) that look correct in Photoshop but are washed out in-engine, animations with baked scale that cause character size to change. Each failure is discovered late and costs exponentially more to fix.
165
+
166
+ ### How to Check
167
+
168
+ 1. Map the pipeline stages: concept → modeling → texturing → rigging → animation → export → import → integration
169
+ 2. For each stage, verify a validation step exists with specific pass/fail criteria
170
+ 3. Check that validation criteria are automatable where possible (polygon count check, texture size check, naming convention check)
171
+ 4. Verify that DCC-side validation exists: artists should catch problems before export, not after import
172
+ 5. Check for batch validation tooling: can the entire asset library be validated in one pass?
173
+ 6. Verify that validation failures have a documented remediation path (not just "fix it")
174
+ 7. Check that the validation pipeline handles asset updates (re-imported assets) not just new assets
175
+
176
+ ### What a Finding Looks Like
177
+
178
+ - P0: "No automated validation steps exist in the pipeline. Asset quality is verified manually by the art lead reviewing each asset in-engine."
179
+ - P1: "Export validation checks polygon count but not UV layout. Overlapping UVs cause lightmap artifacts that are only discovered during level lighting builds."
180
+ - P2: "Validation exists for new assets but re-imported assets (updates) bypass validation. An artist updating a texture could introduce a color space error that goes undetected."
181
+
182
+ ---
183
+
184
+ ## Pass 5: Platform-Specific Compression
185
+
186
+ ### What to Check
187
+
188
+ Texture compression formats, audio codecs, mesh optimization targets, and shader feature levels are specified per target platform. The Art Bible does not assume a single platform — it documents the differences and provides per-platform asset specifications.
189
+
190
+ ### Why This Matters
191
+
192
+ Each platform has different compression format requirements (ASTC for mobile, BC7 for PC/console, ETC2 for older Android), memory constraints, and GPU capabilities. An Art Bible that specifies "use DXT5 compression" without acknowledging mobile targets will produce assets that either cannot be loaded on mobile or are decompressed at runtime (doubling memory usage). Platform-specific compression is not optional — it is a correctness requirement.
193
+
194
+ ### How to Check
195
+
196
+ 1. List all target platforms from the GDD or technical design
197
+ 2. For each platform, verify texture compression formats are specified: PC (BC1-BC7), Console (BC1-BC7, platform-specific), Mobile (ASTC, ETC2), Web (basis/KTX2)
198
+ 3. Verify audio codec specifications per platform: Vorbis, Opus, ADPCM, platform-native
199
+ 4. Check that mesh complexity targets differ per platform where hardware diverges (mobile vs. PC)
200
+ 5. Verify that shader feature level targets per platform are documented
201
+ 6. Check for a fallback chain: if the preferred format is unsupported, what is the fallback?
202
+ 7. Verify that platform-specific build configurations are documented for the asset pipeline
203
+
204
+ ```markdown
205
+ ## Platform Compression Matrix
206
+
207
+ | Asset Type | PC (DX12/Vulkan) | Console (PS5/XSX) | Mobile (iOS/Android) | Switch |
208
+ |---------------|-------------------|--------------------|----------------------|------------|
209
+ | Diffuse | BC7 | BC7 | ASTC 4x4 | ASTC 4x4 |
210
+ | Normal | BC5 | BC5 | ASTC 6x6 | ASTC 6x6 |
211
+ | ORM Pack | BC7 | BC7 | ASTC 4x4 | ASTC 4x4 |
212
+ | UI | BC7 (sRGB) | BC7 (sRGB) | ASTC 4x4 (sRGB) | ASTC 4x4 |
213
+ | Audio (SFX) | Vorbis Q6 | Platform native | Opus 96kbps | ADPCM |
214
+ | Audio (Music) | Vorbis Q8 | Platform native | Opus 128kbps | Vorbis Q6 |
215
+ | Mesh LOD0 | 100% | 100% | 50% | 60% |
216
+ ```
217
+
218
+ ### What a Finding Looks Like
219
+
220
+ - P0: "Art Bible specifies BC7 texture compression with no mobile platform section. The game targets iOS and Android where BC7 is not natively supported."
221
+ - P1: "Audio is specified as 'WAV in production, compressed for shipping' without specifying the target codec or quality per platform."
222
+ - P2: "Switch platform is listed as a target but has no platform-specific compression or budget section. Switch has significantly lower GPU and memory budgets than PS5/XSX."
223
+
224
+ ---
225
+
226
+ ## Pass 6: DCC-to-Engine Import Validation
227
+
228
+ ### What to Check
229
+
230
+ Export settings from every DCC tool (Maya, Blender, 3ds Max, Substance, ZBrush, Houdini) to the target engine are documented. Coordinate system handedness, scale factors, axis orientation, FBX settings, material channel mappings, and animation export options are all specified.
231
+
232
+ ### Why This Matters
233
+
234
+ Every DCC tool uses different conventions. Blender is Z-up right-handed, Unreal is Z-up left-handed, Unity is Y-up left-handed. A model exported from Blender without the correct axis conversion will appear rotated 90 degrees in Unreal. Scale factor mismatches (1 unit = 1cm vs. 1 unit = 1m) produce assets that are 100x too large or too small. Material channel mappings differ between Substance Painter's export presets and engine material inputs. Each mismatch is a bug that wastes time to diagnose.
235
+
236
+ ### How to Check
237
+
238
+ 1. List all DCC tools used in the pipeline
239
+ 2. For each DCC-to-engine path, verify these are documented:
240
+ - Coordinate system and axis orientation
241
+ - Scale factor (units per meter)
242
+ - FBX export version and settings (if FBX is the interchange format)
243
+ - Material/texture channel mapping (Substance channels to engine material inputs)
244
+ - Animation export settings (bake vs. curves, frame rate, root motion handling)
245
+ - Skeletal mesh: bone naming convention, required root bone, max bone count
246
+ 3. Verify that import settings in the engine are documented (not just export settings)
247
+ 4. Check for automated import rules (engine import settings presets per asset type)
248
+ 5. Verify that round-trip workflows are documented (export → import → modify in engine → re-export to DCC if needed)
249
+
250
+ ### What a Finding Looks Like
251
+
252
+ - P0: "No DCC-to-engine export documentation exists. Artists must discover correct export settings by trial and error."
253
+ - P1: "Blender export settings are documented but Substance Painter texture channel mappings are not. Artists exporting from Substance must guess which channel maps to which engine input."
254
+ - P1: "Animation export settings do not address root motion. Locomotion animations may have root motion baked in or extracted — the convention is undocumented."
255
+ - P2: "FBX export version is not specified. FBX 2020 and FBX 2014 handle blend shapes differently — inconsistent versions across the team will produce different results."
256
+
257
+ ---
258
+
259
+ ## Pass 7: Style Guide Enforceability
260
+
261
+ ### What to Check
262
+
263
+ Visual style rules are defined in objectively verifiable terms. An artist can determine whether their work complies without subjective judgment. Color palettes have specific hex/RGB values, proportions have ratios, and stylization rules reference concrete visual examples rather than mood descriptions.
264
+
265
+ ### Why This Matters
266
+
267
+ A style guide that says "warm, inviting color palette" is not enforceable. Five artists will produce five different interpretations of "warm and inviting." When the art lead must manually review every asset for style compliance, the art lead becomes a bottleneck and a single point of failure. Objectively verifiable style rules enable self-review and automated validation (hue range checks, proportion ratio checks), scaling art production without scaling art direction overhead.
268
+
269
+ ### How to Check
270
+
271
+ 1. Check color specifications: are palettes defined with specific values (hex, RGB, HSV ranges) or subjective descriptions ("warm tones")?
272
+ 2. Verify proportion rules: character head-to-body ratios, prop scale references, environment module dimensions — are they numeric?
273
+ 3. Check stylization rules: if the style is "stylized," what are the specific deviations from realism? (Edge softness, saturation boost, proportion exaggeration percentages)
274
+ 4. Verify material property ranges: roughness 0.3-0.7, metallic 0 or 1 only (no partial metallic), emissive intensity ranges
275
+ 5. Check for visual reference sheets per asset category: characters, props, environments, UI — do they exist?
276
+ 6. Verify that "do" and "don't" examples exist for common style violations
277
+ 7. Check that the style guide addresses edge cases: what happens when gameplay clarity conflicts with style? (Enemy readability vs. environmental cohesion)
278
+
279
+ ### What a Finding Looks Like
280
+
281
+ - P0: "Color palette is described as 'earthy tones with vibrant accents' with no specific values. This is a mood description, not a specification."
282
+ - P1: "Character proportion guide shows a reference image but no numeric ratios. Subtle proportion differences between artists will accumulate into an inconsistent character roster."
283
+ - P2: "Roughness values for wood materials are described as 'fairly rough' — specify a range (0.6-0.8) so artists and material validation tools have a concrete target."
284
+
285
+ ---
286
+
287
+ ## Common Review Anti-Patterns
288
+
289
+ ### 1. Art Bible Without Performance Budget Cross-Reference
290
+
291
+ The Art Bible defines beautiful, detailed asset specifications that were never compared against the game's performance budget. The specs are aspirational quality targets that will produce a game running at 15 FPS. The review must catch this disconnect before production begins.
292
+
293
+ **How to spot it:** The Art Bible contains no references to frame budget, VRAM budget, or draw call limits. Asset specifications are described in terms of quality ("high-quality PBR materials") rather than budgets ("2048×2048 textures, 3 texture sets per character").
294
+
295
+ ### 2. Naming Convention for Meshes Only
296
+
297
+ The naming convention section thoroughly covers mesh naming but skips textures, materials, animations, audio, or VFX. In practice, texture naming inconsistency causes more pipeline failures than mesh naming because textures have more variants (diffuse, normal, ORM, emissive, mask) and more naming ambiguity.
298
+
299
+ **How to spot it:** Count the asset types covered by the naming convention. If fewer than 6 categories are covered, significant gaps exist.
300
+
301
+ ### 3. Single-Platform Art Bible for Multi-Platform Game
302
+
303
+ The Art Bible specifies one set of asset standards (typically the highest-end target platform) and assumes other platforms will be "optimized later." Platform-specific compression, budget, and quality targets are absent. In practice, "optimize later" means a 6-month crunch to make assets work on lower-end platforms.
304
+
305
+ **How to spot it:** The Art Bible has no platform-specific sections. Texture formats, poly budgets, and shader targets reference only one platform. Words like "we will optimize for mobile later" appear.