@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.
- package/README.md +91 -0
- package/content/knowledge/game/game-accessibility.md +328 -0
- package/content/knowledge/game/game-ai-patterns.md +542 -0
- package/content/knowledge/game/game-asset-pipeline.md +359 -0
- package/content/knowledge/game/game-audio-design.md +342 -0
- package/content/knowledge/game/game-binary-vcs-strategy.md +396 -0
- package/content/knowledge/game/game-design-document.md +260 -0
- package/content/knowledge/game/game-domain-patterns.md +297 -0
- package/content/knowledge/game/game-economy-design.md +355 -0
- package/content/knowledge/game/game-engine-selection.md +242 -0
- package/content/knowledge/game/game-input-systems.md +357 -0
- package/content/knowledge/game/game-level-content-design.md +455 -0
- package/content/knowledge/game/game-liveops-analytics.md +280 -0
- package/content/knowledge/game/game-localization.md +323 -0
- package/content/knowledge/game/game-milestone-definitions.md +337 -0
- package/content/knowledge/game/game-modding-ugc.md +390 -0
- package/content/knowledge/game/game-narrative-design.md +404 -0
- package/content/knowledge/game/game-networking.md +391 -0
- package/content/knowledge/game/game-performance-budgeting.md +378 -0
- package/content/knowledge/game/game-platform-certification.md +417 -0
- package/content/knowledge/game/game-project-structure.md +360 -0
- package/content/knowledge/game/game-save-systems.md +452 -0
- package/content/knowledge/game/game-testing-strategy.md +470 -0
- package/content/knowledge/game/game-ui-patterns.md +475 -0
- package/content/knowledge/game/game-vr-ar-design.md +313 -0
- package/content/knowledge/review/review-art-bible.md +305 -0
- package/content/knowledge/review/review-game-design.md +303 -0
- package/content/knowledge/review/review-game-economy.md +272 -0
- package/content/knowledge/review/review-netcode.md +280 -0
- package/content/knowledge/review/review-platform-cert.md +341 -0
- package/content/methodology/custom-defaults.yml +25 -0
- package/content/methodology/deep.yml +25 -0
- package/content/methodology/game-overlay.yml +145 -0
- package/content/methodology/mvp.yml +25 -0
- package/content/pipeline/architecture/ai-behavior-design.md +87 -0
- package/content/pipeline/architecture/netcode-spec.md +86 -0
- package/content/pipeline/architecture/review-netcode.md +78 -0
- package/content/pipeline/foundation/performance-budgets.md +91 -0
- package/content/pipeline/modeling/narrative-bible.md +84 -0
- package/content/pipeline/pre/game-design-document.md +89 -0
- package/content/pipeline/pre/review-gdd.md +74 -0
- package/content/pipeline/quality/analytics-telemetry.md +98 -0
- package/content/pipeline/quality/live-ops-plan.md +99 -0
- package/content/pipeline/quality/platform-cert-prep.md +129 -0
- package/content/pipeline/quality/playtest-plan.md +83 -0
- package/content/pipeline/specification/art-bible.md +87 -0
- package/content/pipeline/specification/audio-design.md +96 -0
- package/content/pipeline/specification/content-structure-design.md +141 -0
- package/content/pipeline/specification/economy-design.md +104 -0
- package/content/pipeline/specification/game-accessibility.md +82 -0
- package/content/pipeline/specification/game-ui-spec.md +97 -0
- package/content/pipeline/specification/input-controls-spec.md +81 -0
- package/content/pipeline/specification/localization-plan.md +113 -0
- package/content/pipeline/specification/modding-ugc-spec.md +116 -0
- package/content/pipeline/specification/online-services-spec.md +104 -0
- package/content/pipeline/specification/review-economy.md +87 -0
- package/content/pipeline/specification/review-game-ui.md +73 -0
- package/content/pipeline/specification/save-system-spec.md +116 -0
- package/dist/cli/commands/adopt.d.ts.map +1 -1
- package/dist/cli/commands/adopt.js +25 -0
- package/dist/cli/commands/adopt.js.map +1 -1
- package/dist/cli/commands/adopt.test.js +28 -1
- package/dist/cli/commands/adopt.test.js.map +1 -1
- package/dist/cli/commands/build.test.js +3 -0
- package/dist/cli/commands/build.test.js.map +1 -1
- package/dist/cli/commands/init.d.ts +1 -0
- package/dist/cli/commands/init.d.ts.map +1 -1
- package/dist/cli/commands/init.js +6 -0
- package/dist/cli/commands/init.js.map +1 -1
- package/dist/cli/commands/init.test.js +12 -1
- package/dist/cli/commands/init.test.js.map +1 -1
- package/dist/cli/commands/knowledge.test.js +8 -0
- package/dist/cli/commands/knowledge.test.js.map +1 -1
- package/dist/cli/commands/next.d.ts.map +1 -1
- package/dist/cli/commands/next.js +19 -5
- package/dist/cli/commands/next.js.map +1 -1
- package/dist/cli/commands/next.test.js +56 -0
- package/dist/cli/commands/next.test.js.map +1 -1
- package/dist/cli/commands/rework.d.ts.map +1 -1
- package/dist/cli/commands/rework.js +11 -2
- package/dist/cli/commands/rework.js.map +1 -1
- package/dist/cli/commands/rework.test.js +5 -0
- package/dist/cli/commands/rework.test.js.map +1 -1
- package/dist/cli/commands/run.d.ts.map +1 -1
- package/dist/cli/commands/run.js +54 -4
- package/dist/cli/commands/run.js.map +1 -1
- package/dist/cli/commands/run.test.js +384 -0
- package/dist/cli/commands/run.test.js.map +1 -1
- package/dist/cli/commands/skip.test.js +3 -0
- package/dist/cli/commands/skip.test.js.map +1 -1
- package/dist/cli/commands/status.d.ts.map +1 -1
- package/dist/cli/commands/status.js +16 -3
- package/dist/cli/commands/status.js.map +1 -1
- package/dist/cli/commands/status.test.js +55 -0
- package/dist/cli/commands/status.test.js.map +1 -1
- package/dist/cli/output/auto.d.ts +3 -0
- package/dist/cli/output/auto.d.ts.map +1 -1
- package/dist/cli/output/auto.js +9 -0
- package/dist/cli/output/auto.js.map +1 -1
- package/dist/cli/output/context.d.ts +6 -0
- package/dist/cli/output/context.d.ts.map +1 -1
- package/dist/cli/output/context.js.map +1 -1
- package/dist/cli/output/context.test.js +87 -0
- package/dist/cli/output/context.test.js.map +1 -1
- package/dist/cli/output/error-display.test.js +3 -0
- package/dist/cli/output/error-display.test.js.map +1 -1
- package/dist/cli/output/interactive.d.ts +3 -0
- package/dist/cli/output/interactive.d.ts.map +1 -1
- package/dist/cli/output/interactive.js +76 -0
- package/dist/cli/output/interactive.js.map +1 -1
- package/dist/cli/output/json.d.ts +3 -0
- package/dist/cli/output/json.d.ts.map +1 -1
- package/dist/cli/output/json.js +9 -0
- package/dist/cli/output/json.js.map +1 -1
- package/dist/config/loader.d.ts.map +1 -1
- package/dist/config/loader.js +3 -2
- package/dist/config/loader.js.map +1 -1
- package/dist/config/schema.d.ts +641 -15
- package/dist/config/schema.d.ts.map +1 -1
- package/dist/config/schema.js +26 -1
- package/dist/config/schema.js.map +1 -1
- package/dist/config/schema.test.js +192 -1
- package/dist/config/schema.test.js.map +1 -1
- package/dist/core/assembly/overlay-loader.d.ts +24 -0
- package/dist/core/assembly/overlay-loader.d.ts.map +1 -0
- package/dist/core/assembly/overlay-loader.js +190 -0
- package/dist/core/assembly/overlay-loader.js.map +1 -0
- package/dist/core/assembly/overlay-loader.test.d.ts +2 -0
- package/dist/core/assembly/overlay-loader.test.d.ts.map +1 -0
- package/dist/core/assembly/overlay-loader.test.js +106 -0
- package/dist/core/assembly/overlay-loader.test.js.map +1 -0
- package/dist/core/assembly/overlay-resolver.d.ts +15 -0
- package/dist/core/assembly/overlay-resolver.d.ts.map +1 -0
- package/dist/core/assembly/overlay-resolver.js +58 -0
- package/dist/core/assembly/overlay-resolver.js.map +1 -0
- package/dist/core/assembly/overlay-resolver.test.d.ts +2 -0
- package/dist/core/assembly/overlay-resolver.test.d.ts.map +1 -0
- package/dist/core/assembly/overlay-resolver.test.js +246 -0
- package/dist/core/assembly/overlay-resolver.test.js.map +1 -0
- package/dist/core/assembly/overlay-state-resolver.d.ts +26 -0
- package/dist/core/assembly/overlay-state-resolver.d.ts.map +1 -0
- package/dist/core/assembly/overlay-state-resolver.js +63 -0
- package/dist/core/assembly/overlay-state-resolver.js.map +1 -0
- package/dist/core/assembly/overlay-state-resolver.test.d.ts +2 -0
- package/dist/core/assembly/overlay-state-resolver.test.d.ts.map +1 -0
- package/dist/core/assembly/overlay-state-resolver.test.js +256 -0
- package/dist/core/assembly/overlay-state-resolver.test.js.map +1 -0
- package/dist/core/assembly/preset-loader.d.ts +1 -0
- package/dist/core/assembly/preset-loader.d.ts.map +1 -1
- package/dist/core/assembly/preset-loader.js +2 -0
- package/dist/core/assembly/preset-loader.js.map +1 -1
- package/dist/core/dependency/eligibility.test.js +3 -0
- package/dist/core/dependency/eligibility.test.js.map +1 -1
- package/dist/e2e/game-pipeline.test.d.ts +10 -0
- package/dist/e2e/game-pipeline.test.d.ts.map +1 -0
- package/dist/e2e/game-pipeline.test.js +298 -0
- package/dist/e2e/game-pipeline.test.js.map +1 -0
- package/dist/e2e/init.test.js +3 -0
- package/dist/e2e/init.test.js.map +1 -1
- package/dist/project/adopt.d.ts +3 -1
- package/dist/project/adopt.d.ts.map +1 -1
- package/dist/project/adopt.js +29 -1
- package/dist/project/adopt.js.map +1 -1
- package/dist/project/adopt.test.js +51 -1
- package/dist/project/adopt.test.js.map +1 -1
- package/dist/types/config.d.ts +50 -4
- package/dist/types/config.d.ts.map +1 -1
- package/dist/types/config.test.d.ts +2 -0
- package/dist/types/config.test.d.ts.map +1 -0
- package/dist/types/config.test.js +97 -0
- package/dist/types/config.test.js.map +1 -0
- package/dist/utils/eligible.d.ts +3 -2
- package/dist/utils/eligible.d.ts.map +1 -1
- package/dist/utils/eligible.js +18 -4
- package/dist/utils/eligible.js.map +1 -1
- package/dist/utils/errors.d.ts +4 -0
- package/dist/utils/errors.d.ts.map +1 -1
- package/dist/utils/errors.js +31 -0
- package/dist/utils/errors.js.map +1 -1
- package/dist/utils/errors.test.js +4 -1
- package/dist/utils/errors.test.js.map +1 -1
- package/dist/wizard/questions.d.ts +4 -0
- package/dist/wizard/questions.d.ts.map +1 -1
- package/dist/wizard/questions.js +59 -1
- package/dist/wizard/questions.js.map +1 -1
- package/dist/wizard/questions.test.js +178 -4
- package/dist/wizard/questions.test.js.map +1 -1
- package/dist/wizard/wizard.d.ts +1 -0
- package/dist/wizard/wizard.d.ts.map +1 -1
- package/dist/wizard/wizard.js +4 -1
- package/dist/wizard/wizard.js.map +1 -1
- package/dist/wizard/wizard.test.js +102 -4
- package/dist/wizard/wizard.test.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,280 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: review-netcode
|
|
3
|
+
description: Failure modes and review passes specific to netcode design — latency analysis, bandwidth ceilings, cheat surfaces, and disconnect handling
|
|
4
|
+
topics: [game-dev, review, networking, latency, bandwidth, anticheat]
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Review: Netcode Design
|
|
8
|
+
|
|
9
|
+
Netcode design documents must specify how the game handles the physical reality of network latency, limited bandwidth, and untrusted clients. A netcode design that works under ideal conditions (20ms ping, no packet loss, no cheaters) is not a design — it is a fantasy. This review uses 7 passes targeting the specific ways netcode designs fail under real-world conditions.
|
|
10
|
+
|
|
11
|
+
Follows the review process defined in `review-methodology.md`.
|
|
12
|
+
|
|
13
|
+
## Summary
|
|
14
|
+
|
|
15
|
+
- **Pass 1 — Worst-Case Latency Analysis**: The design handles 200ms+ latency gracefully; player-facing impact at each latency tier is documented; no mechanic requires sub-frame synchronization over the network.
|
|
16
|
+
- **Pass 2 — Bandwidth Ceiling Calculation**: Per-player and per-match bandwidth budgets are calculated; entity count × update rate × payload size does not exceed typical residential upstream limits.
|
|
17
|
+
- **Pass 3 — Cheat Surface Audit**: Every piece of data sent to the client is evaluated for cheat potential; server-authoritative validation exists for every game-state-changing action.
|
|
18
|
+
- **Pass 4 — Determinism Verification**: For lockstep and rollback architectures, determinism requirements are identified and verified; floating-point divergence, platform differences, and desync detection are addressed. (NOT applicable to pure client-server designs.)
|
|
19
|
+
- **Pass 5 — Disconnect/Reconnect Handling**: Graceful handling for every disconnect scenario: mid-match, mid-transaction, mid-save; reconnection restores state without exploits or data loss.
|
|
20
|
+
- **Pass 6 — Matchmaking Fairness Assessment**: Matchmaking considers latency, skill, party size, and region; no systematic advantage for players in specific network conditions.
|
|
21
|
+
- **Pass 7 — Bandwidth Spike Resilience**: The design handles transient bandwidth spikes (ability usage, explosions, mass entity spawns) without degrading below playable quality.
|
|
22
|
+
|
|
23
|
+
## Deep Guidance
|
|
24
|
+
|
|
25
|
+
---
|
|
26
|
+
|
|
27
|
+
## Pass 1: Worst-Case Latency Analysis
|
|
28
|
+
|
|
29
|
+
### What to Check
|
|
30
|
+
|
|
31
|
+
The netcode design documents player experience at every latency tier: ideal (< 50ms), acceptable (50-100ms), degraded (100-200ms), and poor (200-500ms). Every gameplay mechanic is evaluated for its latency tolerance. No mechanic assumes LAN-quality latency.
|
|
32
|
+
|
|
33
|
+
### Why This Matters
|
|
34
|
+
|
|
35
|
+
Most netcode designs are tested and tuned on local networks or same-region servers. In production, 10-20% of players experience 100ms+ latency and 5% experience 200ms+. A mechanic that feels great at 30ms but breaks at 150ms will generate complaints from millions of players. The design must define what "graceful degradation" means for each latency tier — not "it still works" but specifically what the player experiences.
|
|
36
|
+
|
|
37
|
+
### How to Check
|
|
38
|
+
|
|
39
|
+
1. List every gameplay mechanic that involves networked state: movement, combat, trading, inventory, chat, matchmaking
|
|
40
|
+
2. For each mechanic, evaluate at four latency tiers: < 50ms, 50-100ms, 100-200ms, 200ms+
|
|
41
|
+
3. Identify mechanics with strict timing requirements: fighting game frame data, rhythm game hit windows, reaction-based combat
|
|
42
|
+
4. Verify that client-side prediction is specified for latency-sensitive mechanics (movement, shooting)
|
|
43
|
+
5. Check for latency compensation on hit detection: is the system using client-side hit detection with server validation, server-side hit detection with lag compensation, or something else?
|
|
44
|
+
6. Verify that the design specifies what happens at extreme latency (> 500ms): timeout? Disconnect? Graceful degradation?
|
|
45
|
+
7. Check for latency hiding techniques: animations that mask delay, local prediction for responsiveness, rollback for correction
|
|
46
|
+
|
|
47
|
+
```markdown
|
|
48
|
+
## Latency Impact Matrix
|
|
49
|
+
|
|
50
|
+
| Mechanic | < 50ms | 50-100ms | 100-200ms | 200ms+ |
|
|
51
|
+
|---------------------|---------------|---------------|----------------|----------------|
|
|
52
|
+
| Player movement | [experience] | [experience] | [experience] | [experience] |
|
|
53
|
+
| Combat hit reg | [experience] | [experience] | [experience] | [experience] |
|
|
54
|
+
| Ability activation | [experience] | [experience] | [experience] | [experience] |
|
|
55
|
+
| Item pickup | [experience] | [experience] | [experience] | [experience] |
|
|
56
|
+
| Chat/emotes | [experience] | [experience] | [experience] | [experience] |
|
|
57
|
+
| Trading | [experience] | [experience] | [experience] | [experience] |
|
|
58
|
+
|
|
59
|
+
Acceptable threshold: [Define which cells are acceptable, degraded, or unplayable]
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
### What a Finding Looks Like
|
|
63
|
+
|
|
64
|
+
- P0: "Combat uses server-authoritative hit detection with no lag compensation. At 150ms, players must lead targets by 300ms (round trip) — making fast-paced combat unplayable for 15% of the player base."
|
|
65
|
+
- P0: "The design specifies 16ms tick rate for combat resolution but does not address how clients at 100ms+ latency interact with this tick rate. Inputs will consistently arrive 6+ ticks late."
|
|
66
|
+
- P1: "Movement prediction exists but no reconciliation strategy is specified. When the server corrects a misprediction, what does the player see? Rubber-banding? Snap? Smooth interpolation?"
|
|
67
|
+
- P2: "Latency tolerance for the trading system is not specified. Trades at 200ms latency may show stale inventory or allow double-spend if not handled."
|
|
68
|
+
|
|
69
|
+
---
|
|
70
|
+
|
|
71
|
+
## Pass 2: Bandwidth Ceiling Calculation
|
|
72
|
+
|
|
73
|
+
### What to Check
|
|
74
|
+
|
|
75
|
+
Total bandwidth consumption is calculated for worst-case scenarios: maximum players, maximum entities, maximum action density. Per-player upstream and downstream bandwidth stay within residential internet limits. Bandwidth is budgeted across entity types, not just estimated in aggregate.
|
|
76
|
+
|
|
77
|
+
### Why This Matters
|
|
78
|
+
|
|
79
|
+
Bandwidth overruns cause packet loss, which causes desync, rubber-banding, and hit registration failures. Unlike latency (which is physics), bandwidth is design-controllable — the team chooses how much data to send. A 64-player battle royale where each player sends full state at 60Hz consumes more bandwidth than most residential connections provide. The design must calculate this before implementation, not discover it in the first 64-player playtest.
|
|
80
|
+
|
|
81
|
+
### How to Check
|
|
82
|
+
|
|
83
|
+
1. Calculate per-entity update size: how many bytes does one entity state update require? (Position: 12 bytes, rotation: 4-16 bytes, velocity: 12 bytes, state flags: varies)
|
|
84
|
+
2. Calculate entity count × update rate = updates per second
|
|
85
|
+
3. Calculate total downstream: (entity count × update size × update rate) + overhead (packet headers, reliability layer)
|
|
86
|
+
4. Verify downstream stays under 1 Mbps for residential players (conservative) or document the minimum connection requirement
|
|
87
|
+
5. Calculate upstream: (local entity updates × update size × update rate) + input data
|
|
88
|
+
6. Verify upstream stays under 256 Kbps (many residential connections have asymmetric upload)
|
|
89
|
+
7. Check for bandwidth scaling: does bandwidth grow linearly with player count? Are there diminishing returns from interest management?
|
|
90
|
+
|
|
91
|
+
### What a Finding Looks Like
|
|
92
|
+
|
|
93
|
+
- P0: "64-player match with 30Hz updates at 64 bytes per entity = 64 × 64 × 30 = 122,880 bytes/sec (983 Kbps) downstream for entities alone. With packet overhead and game events, this exceeds 1.5 Mbps — above many residential connections."
|
|
94
|
+
- P1: "Bandwidth calculation exists but does not account for game events (ability effects, explosions, chat). Events can spike bandwidth 3-5x above entity-update baseline."
|
|
95
|
+
- P1: "No interest management (relevancy filtering) is specified. Every player receives updates for all 64 players regardless of distance, even if most are not visible."
|
|
96
|
+
- P2: "Upstream bandwidth is not calculated. If the game sends input + local entity state at 60Hz, upstream may exceed residential upload limits."
|
|
97
|
+
|
|
98
|
+
---
|
|
99
|
+
|
|
100
|
+
## Pass 3: Cheat Surface Audit
|
|
101
|
+
|
|
102
|
+
### What to Check
|
|
103
|
+
|
|
104
|
+
Every piece of data sent to the client is evaluated for cheat potential. The server validates every game-state-changing action. The client is treated as untrusted — it is a rendering terminal, not an authority. Anti-cheat measures are proportional to the competitive stakes.
|
|
105
|
+
|
|
106
|
+
### Why This Matters
|
|
107
|
+
|
|
108
|
+
Any data the client possesses can be read by a cheater. Any action the client is authoritative on can be forged by a cheater. In competitive games, cheating drives away legitimate players — a single aimbotter in a lobby causes 63 other players to have a bad experience. Anti-cheat is not a post-launch bolt-on; the netcode architecture must be designed with cheat resistance as a core constraint.
|
|
109
|
+
|
|
110
|
+
### How to Check
|
|
111
|
+
|
|
112
|
+
1. List every data type sent to the client: player positions, health values, inventory contents, map data, enemy positions, loot tables
|
|
113
|
+
2. For each, evaluate: what can a cheater do with this data? (Wallhacks from enemy positions, ESP from health values, loot sniping from loot table data)
|
|
114
|
+
3. Verify server authority: for every game-state-changing action (damage, movement, item acquisition, currency change), does the server validate the action or trust the client?
|
|
115
|
+
4. Check for speed hacks: does the server validate movement speed, or does it trust client-reported position?
|
|
116
|
+
5. Check for teleport prevention: does the server verify position continuity (no instant jumps)?
|
|
117
|
+
6. Verify that hit detection is server-validated: even if the client reports a hit, does the server verify line-of-sight, range, cooldowns, and ammunition?
|
|
118
|
+
7. Check for economy cheats: can the client modify currency, item counts, or transaction outcomes?
|
|
119
|
+
|
|
120
|
+
```markdown
|
|
121
|
+
## Cheat Surface Audit Template
|
|
122
|
+
|
|
123
|
+
| Data Sent to Client | Cheat Vector | Impact | Mitigation |
|
|
124
|
+
|-------------------------|-----------------------|-----------|--------------------|
|
|
125
|
+
| All player positions | Wallhack/ESP | High | [Fog of war / culling] |
|
|
126
|
+
| Player health values | Health ESP | Medium | [Send only for visible] |
|
|
127
|
+
| Loot table / drop data | Loot prediction | Medium | [Server-side only] |
|
|
128
|
+
| Full map data | Map reveal | Low-High | [Stream on demand] |
|
|
129
|
+
| Hit registration | Aimbot + client auth | Critical | [Server validation] |
|
|
130
|
+
| Movement authority | Speed/teleport hack | Critical | [Server validation] |
|
|
131
|
+
| Inventory/currency | Item duplication | Critical | [Server-authoritative] |
|
|
132
|
+
|
|
133
|
+
Unmitigated critical vectors: [COUNT — must be 0]
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
### What a Finding Looks Like
|
|
137
|
+
|
|
138
|
+
- P0: "Client is authoritative for hit detection. A cheater can send 'I hit every player for maximum damage every frame' and the server will accept it."
|
|
139
|
+
- P0: "All player positions are sent to every client regardless of visibility. This enables trivial wallhacks — the cheat client simply renders hidden players."
|
|
140
|
+
- P1: "Server validates movement speed but not acceleration. A speed hack that gradually increases speed from 100% to 200% over 10 seconds would bypass the speed check."
|
|
141
|
+
- P2: "Inventory changes are server-authoritative but the client caches inventory locally. A cheater could display spoofed items to other players in social contexts."
|
|
142
|
+
|
|
143
|
+
---
|
|
144
|
+
|
|
145
|
+
## Pass 4: Determinism Verification
|
|
146
|
+
|
|
147
|
+
### What to Check
|
|
148
|
+
|
|
149
|
+
**CONDITIONAL: This pass applies only to lockstep or rollback netcode architectures.** For client-server authority models, skip this pass entirely.
|
|
150
|
+
|
|
151
|
+
For deterministic architectures, every operation that affects game state must produce identical results on every machine given the same inputs. Floating-point operations, random number generation, physics simulation, and platform-specific behavior are all sources of non-determinism that cause desync.
|
|
152
|
+
|
|
153
|
+
### Why This Matters
|
|
154
|
+
|
|
155
|
+
Lockstep and rollback architectures rely on all clients simulating identically. A single non-deterministic operation causes the simulations to diverge — desync — which manifests as teleporting players, phantom hits, and corrupted game state. Desync is catastrophic because it is cumulative: once simulations diverge, they never re-converge without correction. Determinism is an all-or-nothing requirement.
|
|
156
|
+
|
|
157
|
+
### How to Check
|
|
158
|
+
|
|
159
|
+
1. Verify that the architecture is actually lockstep or rollback — if it is client-server with authoritative server, skip this pass
|
|
160
|
+
2. Check floating-point handling: are fixed-point math libraries used? If IEEE 754 floating-point is used, are platform-specific differences (x86 vs. ARM) addressed?
|
|
161
|
+
3. Verify RNG determinism: all random number generation uses a shared seed with a deterministic algorithm (no system RNG)
|
|
162
|
+
4. Check physics engine determinism: is the physics engine guaranteed deterministic? (Most are NOT across platforms)
|
|
163
|
+
5. Verify iteration order: hash maps, sets, and any unordered data structures must use deterministic iteration
|
|
164
|
+
6. Check that desync detection exists: periodic state hash comparison between clients to detect divergence early
|
|
165
|
+
7. Verify desync recovery: when detected, how is desync resolved? Full state resync? Rollback to last known good state?
|
|
166
|
+
|
|
167
|
+
### What a Finding Looks Like
|
|
168
|
+
|
|
169
|
+
- P0: "Rollback architecture uses Unity's built-in physics engine, which is not deterministic across platforms. PC and console clients will desync within minutes."
|
|
170
|
+
- P0: "Floating-point arithmetic is used for all game state calculations with no fixed-point alternative. x86 and ARM produce different results for the same operations."
|
|
171
|
+
- P1: "RNG uses a shared seed but the document does not specify which PRNG algorithm. Different implementations of 'random' produce different sequences."
|
|
172
|
+
- P2: "Desync detection is mentioned but no detection mechanism is specified. Without periodic state hashing, desync goes undetected until it becomes visible to players."
|
|
173
|
+
|
|
174
|
+
---
|
|
175
|
+
|
|
176
|
+
## Pass 5: Disconnect/Reconnect Handling
|
|
177
|
+
|
|
178
|
+
### What to Check
|
|
179
|
+
|
|
180
|
+
Every disconnect scenario is handled: mid-match, mid-transaction, mid-save, mid-trade. Reconnection restores the player to their correct state without data loss, exploits, or unfair advantage. Timeout thresholds and abandon penalties are specified.
|
|
181
|
+
|
|
182
|
+
### Why This Matters
|
|
183
|
+
|
|
184
|
+
Disconnects are not edge cases — they are guaranteed. On mobile, network transitions (Wi-Fi to cellular) cause momentary disconnects. On any platform, ISP issues, router restarts, and game crashes cause unexpected disconnects. A game that loses player progress, duplicates items, or awards undeserved wins/losses on disconnect will hemorrhage players. Disconnect handling is a core system, not an afterthought.
|
|
185
|
+
|
|
186
|
+
### How to Check
|
|
187
|
+
|
|
188
|
+
1. For each game mode, specify what happens when a player disconnects: is their character removed instantly? After a timeout? Does an AI take over?
|
|
189
|
+
2. Check for mid-transaction disconnect: if a player disconnects while buying/selling/trading, what is the transaction state? Is it rolled back? Completed? Left in limbo?
|
|
190
|
+
3. Verify reconnection flow: can a player rejoin an in-progress match? Within what time window? Is their state preserved?
|
|
191
|
+
4. Check for exploit potential: can a player disconnect to avoid a loss? To duplicate items? To undo a bad trade?
|
|
192
|
+
5. Verify timeout thresholds: how long does the server wait before treating a disconnect as an abandon?
|
|
193
|
+
6. Check for abandon penalties: are players who intentionally disconnect punished? How are intentional disconnects distinguished from network issues?
|
|
194
|
+
7. Verify save state consistency: if the player disconnects between a game state change and a save, which state wins?
|
|
195
|
+
|
|
196
|
+
### What a Finding Looks Like
|
|
197
|
+
|
|
198
|
+
- P0: "No reconnection mechanism exists. A player who disconnects from a 45-minute match must start over. This is unacceptable for competitive modes."
|
|
199
|
+
- P0: "Mid-trade disconnect handling is not specified. If player A sends an item and disconnects before receiving player B's item, the trade state is undefined — potential item duplication or loss."
|
|
200
|
+
- P1: "Disconnect during a ranked match counts as an automatic loss. No grace period exists for reconnection. A 2-second ISP hiccup causes a full loss of ranked points."
|
|
201
|
+
- P2: "AI takeover is specified for disconnected players but the AI difficulty level is not defined. An overpowered AI substitute could be more effective than the disconnected player, creating a perverse incentive to disconnect."
|
|
202
|
+
|
|
203
|
+
---
|
|
204
|
+
|
|
205
|
+
## Pass 6: Matchmaking Fairness Assessment
|
|
206
|
+
|
|
207
|
+
### What to Check
|
|
208
|
+
|
|
209
|
+
Matchmaking considers latency (players are matched within acceptable ping ranges), skill (players face opponents of similar ability), party size (solo players are not matched against coordinated groups), and region (geographic proximity for latency). No systematic advantage exists for players in specific network conditions or regions.
|
|
210
|
+
|
|
211
|
+
### Why This Matters
|
|
212
|
+
|
|
213
|
+
Unfair matchmaking drives player churn faster than any other factor. A new player matched against a veteran quits in frustration. A player with 30ms ping matched against a player with 200ms ping has a structural advantage in any real-time combat. A solo player matched against a coordinated 4-stack loses due to communication, not skill. Matchmaking fairness is the foundation of competitive game health.
|
|
214
|
+
|
|
215
|
+
### How to Check
|
|
216
|
+
|
|
217
|
+
1. Verify that ping-based matchmaking exists: players within the same match should have comparable latency (< 50ms difference ideal, < 100ms acceptable)
|
|
218
|
+
2. Check for skill-based matchmaking (SBMM): is there a rating system? How does it handle new players (placement matches)? How quickly does it converge?
|
|
219
|
+
3. Verify party-size matching: solo players vs. solo players, groups vs. groups — or at minimum, compensation for size imbalance
|
|
220
|
+
4. Check for region selection: can players choose their region? Is the choice locked or advisory?
|
|
221
|
+
5. Verify that matchmaking queue times are bounded: what happens when the pool is too small for fair matches? (Wider skill range? Cross-region? Bot backfill?)
|
|
222
|
+
6. Check for smurf prevention: can experienced players create new accounts to stomp new players?
|
|
223
|
+
7. Verify that matchmaking data is used for balance analysis: is win rate by skill bracket tracked?
|
|
224
|
+
|
|
225
|
+
### What a Finding Looks Like
|
|
226
|
+
|
|
227
|
+
- P0: "No ping-based matchmaking exists. A player in Tokyo can be matched against a player in New York, producing 200ms+ latency in a competitive shooter."
|
|
228
|
+
- P1: "SBMM exists but no placement system is defined. New players start at median rating and are immediately matched against average players, producing 30-50 matches of stomps before the rating converges."
|
|
229
|
+
- P1: "Solo players and 5-stacks are in the same matchmaking pool with no compensation. Coordinated groups have a 15-20% win rate advantage over equivalent-skill solo players."
|
|
230
|
+
- P2: "Queue time bounds are not specified. In low-population regions, players may wait indefinitely or receive wildly unfair matches."
|
|
231
|
+
|
|
232
|
+
---
|
|
233
|
+
|
|
234
|
+
## Pass 7: Bandwidth Spike Resilience
|
|
235
|
+
|
|
236
|
+
### What to Check
|
|
237
|
+
|
|
238
|
+
The design handles transient bandwidth spikes caused by gameplay events: ability usage, explosions, mass entity spawns, zone transitions, and player clustering. Spike mitigation strategies (priority queuing, delta compression, update rate reduction) are specified.
|
|
239
|
+
|
|
240
|
+
### Why This Matters
|
|
241
|
+
|
|
242
|
+
Steady-state bandwidth may be well within limits, but a single moment — 10 players using abilities simultaneously in a team fight — can spike bandwidth 5-10x above baseline. Without spike mitigation, this causes packet loss during the most important gameplay moments, precisely when network quality matters most. Players remember "the game lagged during the final team fight" more than any other quality issue.
|
|
243
|
+
|
|
244
|
+
### How to Check
|
|
245
|
+
|
|
246
|
+
1. Identify spike scenarios: large battles, ability clusters, zone transitions, mass spawns, world events
|
|
247
|
+
2. For each scenario, calculate peak bandwidth: (entities changed × update size) for that frame/tick
|
|
248
|
+
3. Verify that peak bandwidth does not exceed steady-state by more than 3x without mitigation
|
|
249
|
+
4. Check for priority queuing: are critical updates (player position, health) prioritized over cosmetic updates (emotes, particle effects)?
|
|
250
|
+
5. Verify delta compression: are only changed fields sent, or full entity state on every update?
|
|
251
|
+
6. Check for adaptive update rates: does the server reduce update frequency under load? Which entities are downgraded first?
|
|
252
|
+
7. Verify that spike mitigation degrades gracefully: cosmetic quality drops before gameplay accuracy
|
|
253
|
+
|
|
254
|
+
### What a Finding Looks Like
|
|
255
|
+
|
|
256
|
+
- P0: "10v10 team fight with all abilities active produces 15x baseline bandwidth. No spike mitigation is specified. This will cause packet loss and desync during the most critical gameplay moments."
|
|
257
|
+
- P1: "Delta compression is specified for entity position but not for game events. A single explosion event sends full effect data (particle count, damage list, audio trigger) to all 64 players simultaneously."
|
|
258
|
+
- P2: "Adaptive update rate is mentioned but priority order is not defined. Without explicit priority (gameplay > VFX > audio > cosmetic), the system may downgrade gameplay updates to preserve cosmetic fidelity."
|
|
259
|
+
|
|
260
|
+
---
|
|
261
|
+
|
|
262
|
+
## Common Review Anti-Patterns
|
|
263
|
+
|
|
264
|
+
### 1. LAN-Optimized Netcode
|
|
265
|
+
|
|
266
|
+
The netcode design was tested and tuned on a local network. All latency budgets assume < 20ms. Bandwidth calculations assume gigabit LAN speeds. The design feels great in the studio and breaks for every player outside the same city as the data center.
|
|
267
|
+
|
|
268
|
+
**How to spot it:** Latency analysis mentions only one tier (e.g., "at 20ms latency"). No latency degradation table exists. Bandwidth calculations do not reference residential internet speeds or upstream limits.
|
|
269
|
+
|
|
270
|
+
### 2. "Anti-Cheat Will Handle It"
|
|
271
|
+
|
|
272
|
+
The netcode design defers all cheat prevention to a third-party anti-cheat solution (EasyAntiCheat, BattlEye, Vanguard). These tools detect cheat software but cannot fix architectural flaws. If the client is authoritative for hit detection, no anti-cheat tool can prevent a modified client from reporting false hits. Architectural cheat resistance and software-based anti-cheat are complementary, not substitutes.
|
|
273
|
+
|
|
274
|
+
**How to spot it:** The cheat prevention section names an anti-cheat product but does not analyze the server-authority model. No discussion of what data the client receives or what actions the client is authoritative for.
|
|
275
|
+
|
|
276
|
+
### 3. Determinism Assumed, Not Verified
|
|
277
|
+
|
|
278
|
+
For lockstep/rollback designs, the document states "the simulation is deterministic" without analyzing sources of non-determinism. Floating-point operations, hash map iteration order, physics engine behavior, and platform-specific math libraries are all sources of non-determinism that must be explicitly addressed.
|
|
279
|
+
|
|
280
|
+
**How to spot it:** The word "deterministic" appears without any discussion of fixed-point math, PRNG seeding, physics engine guarantees, or cross-platform verification.
|
|
@@ -0,0 +1,341 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: review-platform-cert
|
|
3
|
+
description: Failure modes and review passes specific to platform certification — TRC/TCR compliance, save data, suspend/resume, controller disconnect, and content ratings
|
|
4
|
+
topics: [game-dev, review, certification, trc, tcr, compliance]
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Review: Platform Certification
|
|
8
|
+
|
|
9
|
+
Platform certification documents must demonstrate compliance with each target platform's Technical Requirements Checklist (TRC for PlayStation, TCR for Xbox, Lotcheck for Nintendo, platform guidelines for mobile stores). Certification failures cause submission rejections that cost weeks of schedule and tens of thousands of dollars in resubmission fees. This review uses 7 passes targeting the common certification failure points that can be caught at design time.
|
|
10
|
+
|
|
11
|
+
Follows the review process defined in `review-methodology.md`.
|
|
12
|
+
|
|
13
|
+
## Summary
|
|
14
|
+
|
|
15
|
+
- **Pass 1 — Common TRC/TCR Failure Points**: Known high-failure-rate requirements are addressed per platform; no reliance on "we will fix it during cert prep."
|
|
16
|
+
- **Pass 2 — Save Data Compliance**: Save data size limits, save/load timing, corruption recovery, and platform-mandated save behaviors are specified.
|
|
17
|
+
- **Pass 3 — Suspend/Resume Handling**: Application correctly handles OS-level suspend and resume events on every target platform without data loss or state corruption.
|
|
18
|
+
- **Pass 4 — Controller Disconnect Behavior**: Every controller disconnect scenario has a defined UI response and game state handling; no scenario leaves the player stuck.
|
|
19
|
+
- **Pass 5 — Error Message Requirements**: Error messages meet platform-specific wording, formatting, and localization requirements; no generic or developer-facing error text.
|
|
20
|
+
- **Pass 6 — Trophy/Achievement Compliance**: Trophy/achievement design meets platform rules for count, point totals, descriptions, difficulty distribution, and unlock conditions.
|
|
21
|
+
- **Pass 7 — Content Rating Alignment**: Game content aligns with submitted content rating questionnaires; no undisclosed content triggers a rating change post-submission.
|
|
22
|
+
|
|
23
|
+
## Deep Guidance
|
|
24
|
+
|
|
25
|
+
---
|
|
26
|
+
|
|
27
|
+
## Pass 1: Common TRC/TCR Failure Points
|
|
28
|
+
|
|
29
|
+
### What to Check
|
|
30
|
+
|
|
31
|
+
Each target platform has a published Technical Requirements Checklist (or equivalent) with hundreds of requirements. Certain requirements have historically high failure rates because they are non-obvious, require specific implementation, or are commonly overlooked. This pass focuses on those high-failure-rate requirements.
|
|
32
|
+
|
|
33
|
+
### Why This Matters
|
|
34
|
+
|
|
35
|
+
A certification failure costs 2-6 weeks of schedule (resubmission queue times) and potentially $10,000-$50,000 in fees, QA costs, and delayed revenue. Most failures are preventable — they are caused by requirements that the team did not know about until the certification report arrived. Catching these at design time costs hours; catching them at certification costs weeks.
|
|
36
|
+
|
|
37
|
+
### How to Check
|
|
38
|
+
|
|
39
|
+
Use this per-platform checklist for common failure points:
|
|
40
|
+
|
|
41
|
+
```markdown
|
|
42
|
+
## PlayStation TRC — Common Failure Points
|
|
43
|
+
|
|
44
|
+
- [ ] Title does not exceed 128 character limit for save data descriptions
|
|
45
|
+
- [ ] System software version check on boot (display update prompt if outdated)
|
|
46
|
+
- [ ] PS button behavior: single press returns to system menu, hold opens quick menu
|
|
47
|
+
- [ ] All mandatory terminology used correctly (e.g., "PS5" not "PlayStation 5" in certain contexts)
|
|
48
|
+
- [ ] User account switching handled (user signs in with different PSN account mid-session)
|
|
49
|
+
- [ ] Network connectivity loss displays correct system dialog (not custom error)
|
|
50
|
+
- [ ] Background download/install does not interfere with gameplay
|
|
51
|
+
- [ ] HDR output handled correctly when TV does not support HDR
|
|
52
|
+
- [ ] Activity cards populated correctly for PS5
|
|
53
|
+
- [ ] Game help content provided for PS5 (if applicable)
|
|
54
|
+
- [ ] Haptic feedback and adaptive trigger usage follows platform guidelines
|
|
55
|
+
- [ ] 4K and Performance mode options available on PS5
|
|
56
|
+
|
|
57
|
+
## Xbox TCR — Common Failure Points
|
|
58
|
+
|
|
59
|
+
- [ ] Title must function on all Xbox console SKUs (Series X, Series S, One)
|
|
60
|
+
- [ ] Quick Resume must not corrupt game state or lose progress
|
|
61
|
+
- [ ] Xbox network connectivity requirements: graceful offline mode or clear messaging
|
|
62
|
+
- [ ] Gamertag display uses correct formatting (no truncation of long Gamertags)
|
|
63
|
+
- [ ] Smart Delivery configured correctly (correct build for each SKU)
|
|
64
|
+
- [ ] Suspend/resume does not desync multiplayer session
|
|
65
|
+
- [ ] Accessibility: text-to-speech and speech-to-text for chat (XR-015)
|
|
66
|
+
- [ ] Energy efficiency: game must reduce power consumption during idle
|
|
67
|
+
- [ ] Cross-generation save data compatibility (if applicable)
|
|
68
|
+
- [ ] Game Pass integration: trial/demo behavior if accessed via subscription
|
|
69
|
+
|
|
70
|
+
## Nintendo Lotcheck — Common Failure Points
|
|
71
|
+
|
|
72
|
+
- [ ] Controller grip change handling: game pauses when grip changes
|
|
73
|
+
- [ ] Handheld vs. docked display adapts correctly (resolution, UI scaling)
|
|
74
|
+
- [ ] Joy-Con detachment pauses game and prompts reconnection
|
|
75
|
+
- [ ] Touch screen functionality in handheld mode (if applicable)
|
|
76
|
+
- [ ] Sleep mode does not corrupt save data
|
|
77
|
+
- [ ] Nintendo Account and online service integration follows guidelines
|
|
78
|
+
- [ ] Age-gated content handled per Nintendo requirements
|
|
79
|
+
- [ ] Home button behavior: game suspends cleanly
|
|
80
|
+
- [ ] Screenshot and video capture do not include restricted content
|
|
81
|
+
- [ ] NFC (amiibo) integration follows guidelines (if applicable)
|
|
82
|
+
|
|
83
|
+
## Mobile (iOS App Store / Google Play) — Common Failure Points
|
|
84
|
+
|
|
85
|
+
- [ ] No external payment links (iOS) or compliant alternative payment (where permitted)
|
|
86
|
+
- [ ] App Tracking Transparency (ATT) prompt before any tracking (iOS 14.5+)
|
|
87
|
+
- [ ] Background audio handling: music apps continue when game is not in focus
|
|
88
|
+
- [ ] Push notification permissions requested at appropriate time (not on first launch)
|
|
89
|
+
- [ ] Data deletion capability per Apple/Google requirements
|
|
90
|
+
- [ ] Subscription management deep links provided
|
|
91
|
+
- [ ] Minimum OS version support matches store requirements
|
|
92
|
+
- [ ] App size within store limits (or uses on-demand resources)
|
|
93
|
+
- [ ] Accessibility: VoiceOver/TalkBack support for critical UI flows
|
|
94
|
+
- [ ] Privacy nutrition label / Data Safety section accurate and complete
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
### What a Finding Looks Like
|
|
98
|
+
|
|
99
|
+
- P0: "Game targets Xbox but Quick Resume handling is not documented. Quick Resume is a mandatory TCR — the game must restore correctly from a suspended state hours or days later."
|
|
100
|
+
- P0: "Game targets iOS but no App Tracking Transparency implementation is documented. Missing ATT will cause App Store rejection."
|
|
101
|
+
- P1: "PlayStation TRC requires specific system dialogs for network errors, but the design uses custom error dialogs. Custom dialogs will fail certification."
|
|
102
|
+
- P2: "Nintendo Lotcheck requires pause on Joy-Con detachment, but the design does not mention Joy-Con-specific controller handling."
|
|
103
|
+
|
|
104
|
+
---
|
|
105
|
+
|
|
106
|
+
## Pass 2: Save Data Compliance
|
|
107
|
+
|
|
108
|
+
### What to Check
|
|
109
|
+
|
|
110
|
+
Save data implementation meets platform-specific requirements for size limits, save timing, corruption detection and recovery, user-facing save indicators, and platform-mandated save behaviors (cloud sync, account-specific save isolation).
|
|
111
|
+
|
|
112
|
+
### Why This Matters
|
|
113
|
+
|
|
114
|
+
Save data certification failures are among the most costly because they often require architectural changes. A save system that exceeds the platform's size limit cannot be fixed with a tweak — it requires save data restructuring, migration planning, and backward compatibility testing. Save corruption that loses player progress generates more support tickets and refund requests than almost any other bug.
|
|
115
|
+
|
|
116
|
+
### How to Check
|
|
117
|
+
|
|
118
|
+
1. Verify save data size against platform limits: PlayStation has per-title limits, Nintendo Switch has strict per-title allocation, mobile platforms have iCloud/Google Play limits
|
|
119
|
+
2. Check save timing: does the game save at appropriate points? Is there a visible save indicator during all save operations? (Most platforms require this)
|
|
120
|
+
3. Verify corruption detection: does the save system detect corrupted data? Is there a recovery mechanism (backup save, previous version rollback)?
|
|
121
|
+
4. Check for platform-mandated save behaviors: cloud save sync, account-specific save isolation, save data portability between console generations
|
|
122
|
+
5. Verify that the save indicator is never hidden or obscured during save operations
|
|
123
|
+
6. Check for save data migration: if the game updates change the save format, is there a migration path from old saves?
|
|
124
|
+
7. Verify that save/load operations do not block the main thread (certification requirement on most platforms)
|
|
125
|
+
|
|
126
|
+
### What a Finding Looks Like
|
|
127
|
+
|
|
128
|
+
- P0: "Save data size is estimated at 50MB per slot but Nintendo Switch allocates a maximum of 32MB per title. The save system exceeds the platform limit."
|
|
129
|
+
- P0: "No save corruption detection exists. A power loss during save produces a corrupted file with no recovery — the player loses all progress."
|
|
130
|
+
- P1: "Save indicator is shown during manual saves but not during autosaves. Platform certification requires the save indicator during ALL save operations."
|
|
131
|
+
- P2: "Save data migration strategy is not documented. A future update that changes save format will either break old saves or require emergency migration code."
|
|
132
|
+
|
|
133
|
+
---
|
|
134
|
+
|
|
135
|
+
## Pass 3: Suspend/Resume Handling
|
|
136
|
+
|
|
137
|
+
### What to Check
|
|
138
|
+
|
|
139
|
+
The application correctly handles OS-level suspend and resume events on every target platform. Suspend can happen at any time — during loading, during cutscenes, during multiplayer matches, during transactions. Resume must restore the game to a usable state without data loss, state corruption, or stale connections.
|
|
140
|
+
|
|
141
|
+
### Why This Matters
|
|
142
|
+
|
|
143
|
+
Players suspend games constantly — answering phone calls, switching apps, putting the console to sleep. On Xbox, Quick Resume can suspend a game for days. On mobile, any incoming call or notification can trigger a suspend. A game that crashes on resume, loses unsaved progress, or shows a black screen after resume will fail certification on every platform.
|
|
144
|
+
|
|
145
|
+
### How to Check
|
|
146
|
+
|
|
147
|
+
1. List all game states where suspend can occur: main menu, loading screen, gameplay, cutscene, multiplayer match, store transaction, save in progress, download in progress
|
|
148
|
+
2. For each state, verify the resume behavior: does the game return to the correct state? Are network connections re-established? Are time-sensitive elements (timers, cooldowns, server sessions) handled?
|
|
149
|
+
3. Check for stale connection handling: after a 4-hour suspend, network connections are dead — does the game detect this and reconnect or show an appropriate error?
|
|
150
|
+
4. Verify that suspend during save does not corrupt data (save must be atomic or recoverable)
|
|
151
|
+
5. Check for time-sensitive resume: if the game has daily resets, seasonal events, or time-limited offers, what happens when the player resumes after the reset time?
|
|
152
|
+
6. Verify audio resume: does audio restart correctly? Are audio handles stale after resume?
|
|
153
|
+
7. Check for authentication token expiry: OAuth tokens, session tokens, and platform authentication may expire during long suspends
|
|
154
|
+
|
|
155
|
+
### What a Finding Looks Like
|
|
156
|
+
|
|
157
|
+
- P0: "No suspend/resume handling is documented. The game will crash on resume when attempting to use stale network connections."
|
|
158
|
+
- P0: "Xbox Quick Resume is not addressed. A game suspended for 48 hours will resume with expired authentication tokens, stale multiplayer sessions, and incorrect daily reset states."
|
|
159
|
+
- P1: "Resume after network-based suspend (multiplayer match) attempts to continue the match without checking if the session still exists. This will produce a desync or crash."
|
|
160
|
+
- P2: "Audio resume is not specified. Some platforms require explicit audio session reactivation after resume — without it, the game is silent."
|
|
161
|
+
|
|
162
|
+
---
|
|
163
|
+
|
|
164
|
+
## Pass 4: Controller Disconnect Behavior
|
|
165
|
+
|
|
166
|
+
### What to Check
|
|
167
|
+
|
|
168
|
+
Every controller disconnect scenario has a defined game response: which player is affected, what UI is shown, how gameplay is affected, and how reconnection is handled. No scenario leaves the player in an unrecoverable state.
|
|
169
|
+
|
|
170
|
+
### Why This Matters
|
|
171
|
+
|
|
172
|
+
Controller disconnect is a certification-tested scenario on every console platform. The platform holder will disconnect controllers at every possible moment during certification testing — during gameplay, during menus, during saving, during loading. Every disconnect must produce a clear, user-recoverable response. A game that freezes, crashes, or continues playing without input on controller disconnect will fail certification.
|
|
173
|
+
|
|
174
|
+
### How to Check
|
|
175
|
+
|
|
176
|
+
1. Verify that controller disconnect shows a system-appropriate dialog: "Controller disconnected. Please reconnect controller to continue."
|
|
177
|
+
2. Check that gameplay pauses on disconnect (except in multiplayer where pausing is not possible)
|
|
178
|
+
3. Verify that the correct player is identified in split-screen/local multiplayer — disconnecting Player 2's controller should not pause Player 1
|
|
179
|
+
4. Check for wireless controller battery death: same as disconnect but may occur gradually (low battery warning first)
|
|
180
|
+
5. Verify reconnection behavior: does the game resume automatically, or does the player press a button to continue?
|
|
181
|
+
6. Check for controller reassignment: if the player reconnects a different controller, is it accepted?
|
|
182
|
+
7. Verify behavior during critical moments: what happens if the controller disconnects during a save? During a purchase? During a cutscene?
|
|
183
|
+
|
|
184
|
+
```markdown
|
|
185
|
+
## Controller Disconnect Scenario Matrix
|
|
186
|
+
|
|
187
|
+
| Game State | Disconnect Response | Gameplay Impact | Reconnect Behavior |
|
|
188
|
+
|---------------------|---------------------------|--------------------|-----------------------|
|
|
189
|
+
| Main menu | [Dialog shown] | [Menu navigation paused] | [Resume on reconnect] |
|
|
190
|
+
| Single-player | [Dialog + pause] | [Game paused] | [Resume on button press] |
|
|
191
|
+
| Local multiplayer | [Dialog for affected player] | [Affected player paused] | [Resume on reconnect] |
|
|
192
|
+
| Online multiplayer | [Dialog shown, no pause] | [Player input stops] | [Resume on reconnect] |
|
|
193
|
+
| Loading screen | [Dialog shown] | [Loading continues] | [Resume on reconnect] |
|
|
194
|
+
| Cutscene | [Dialog + pause cutscene] | [Cutscene paused] | [Resume cutscene] |
|
|
195
|
+
| Save in progress | [Dialog after save completes] | [Save completes first] | [Resume on reconnect] |
|
|
196
|
+
| Store/purchase | [Dialog + cancel transaction] | [Transaction rolled back] | [Restart transaction] |
|
|
197
|
+
```
|
|
198
|
+
|
|
199
|
+
### What a Finding Looks Like
|
|
200
|
+
|
|
201
|
+
- P0: "Controller disconnect during gameplay is not documented. No pause dialog, no input handling, no reconnection flow — this is a guaranteed certification failure."
|
|
202
|
+
- P1: "Controller disconnect in multiplayer is handled (toast notification) but in single-player there is no pause. Single-player must pause on disconnect per TRC/TCR."
|
|
203
|
+
- P1: "Low battery warning is not mentioned. Platforms require a low battery notification before the controller dies — this is separate from the disconnect dialog."
|
|
204
|
+
- P2: "Controller disconnect during save shows the disconnect dialog immediately. If the save has not completed, this could cause the player to pull the power cord, corrupting the save. Show the dialog only after the save completes."
|
|
205
|
+
|
|
206
|
+
---
|
|
207
|
+
|
|
208
|
+
## Pass 5: Error Message Requirements
|
|
209
|
+
|
|
210
|
+
### What to Check
|
|
211
|
+
|
|
212
|
+
Error messages meet platform-specific requirements for wording, formatting, button prompts, and localization. No error message contains developer-facing text (error codes without explanation, stack traces, debug information). Error messages use platform-standard terminology.
|
|
213
|
+
|
|
214
|
+
### Why This Matters
|
|
215
|
+
|
|
216
|
+
Platform holders test every error state during certification. An error message that says "Error 0x80070005" or "null reference exception" will fail certification. An error message that says "Press A to continue" on PlayStation (where the button is "Cross" or a symbol) will fail certification. Error messages must use the platform's mandated terminology, button iconography, and localization for every supported language.
|
|
217
|
+
|
|
218
|
+
### How to Check
|
|
219
|
+
|
|
220
|
+
1. List every error state: network failure, save failure, authentication failure, matchmaking failure, content download failure, server maintenance, account restriction
|
|
221
|
+
2. For each error state, verify the message explains what happened and what the player can do
|
|
222
|
+
3. Check button prompt correctness per platform: PlayStation uses symbols (Cross, Circle, Triangle, Square), Xbox uses letters (A, B, X, Y), Nintendo Switch uses letters in different positions
|
|
223
|
+
4. Verify that error messages do not contain: error codes without explanation, technical jargon, developer-facing debug information, profanity, or blame-the-user language
|
|
224
|
+
5. Check localization: are all error messages localized into every supported language?
|
|
225
|
+
6. Verify that platform-specific terminology is used: "PlayStation Network" not "PSN," "Xbox network" not "Xbox Live" (terminology changes over time)
|
|
226
|
+
7. Check that network error messages use platform-mandated dialogs where required (some platforms require system-level network error dialogs, not custom ones)
|
|
227
|
+
|
|
228
|
+
### What a Finding Looks Like
|
|
229
|
+
|
|
230
|
+
- P0: "Network error message says 'Connection failed (errno: 110).' This developer-facing message will fail certification on every platform."
|
|
231
|
+
- P0: "Error messages reference 'Press A' on all platforms. PlayStation requires Cross symbol, not 'A.' Nintendo Switch 'A' button is in a different position than Xbox 'A'."
|
|
232
|
+
- P1: "Error messages are in English only but the game supports 12 languages. Every user-facing string must be localized."
|
|
233
|
+
- P2: "Server maintenance message says 'Server is down, try again later.' This does not tell the player why (maintenance) or when (estimated return time). Improve to 'Server maintenance in progress. Expected to return at [TIME].'"
|
|
234
|
+
|
|
235
|
+
---
|
|
236
|
+
|
|
237
|
+
## Pass 6: Trophy/Achievement Compliance
|
|
238
|
+
|
|
239
|
+
### What to Check
|
|
240
|
+
|
|
241
|
+
Trophy/achievement design meets platform rules for total count, point totals (Gamerscore, trophy distribution), description formatting, difficulty distribution, secret/hidden achievement handling, and unlock conditions.
|
|
242
|
+
|
|
243
|
+
### Why This Matters
|
|
244
|
+
|
|
245
|
+
Trophy and achievement systems have strict platform rules that vary between PlayStation, Xbox, and Steam. PlayStation mandates a Platinum trophy, a specific distribution of Gold/Silver/Bronze trophies, and exact description formatting. Xbox mandates a base Gamerscore of 1000 and specific rules for DLC Gamerscore additions. Violating these rules causes certification failure — and the fix requires redesigning the achievement list, which is a design task, not an engineering task.
|
|
246
|
+
|
|
247
|
+
### How to Check
|
|
248
|
+
|
|
249
|
+
1. Verify trophy/achievement count meets platform requirements:
|
|
250
|
+
- **PlayStation**: Must include 1 Platinum (unlock all others), appropriate Gold/Silver/Bronze distribution
|
|
251
|
+
- **Xbox**: Base game must total exactly 1000 Gamerscore; DLC adds up to 250 per release
|
|
252
|
+
- **Nintendo/Steam**: More flexible but verify platform-specific guidelines
|
|
253
|
+
2. Check descriptions: no spoilers in visible descriptions (use hidden/secret for story spoilers), no profanity, correct platform terminology
|
|
254
|
+
3. Verify difficulty distribution: not all trophies should be trivially easy (cheapens the system) or brutally hard (frustrates completionists)
|
|
255
|
+
4. Check for unobtainable achievements: can every achievement actually be earned? Multiplayer achievements in games that may lose their servers are a known issue
|
|
256
|
+
5. Verify that no achievement requires luck-based conditions that a player cannot influence through skill
|
|
257
|
+
6. Check DLC achievement rules: DLC achievements must not be required for the base game Platinum/100%
|
|
258
|
+
7. Verify that achievement unlock conditions are testable by QA and certifiable by the platform
|
|
259
|
+
|
|
260
|
+
```markdown
|
|
261
|
+
## Achievement Compliance Matrix
|
|
262
|
+
|
|
263
|
+
| Requirement | PlayStation | Xbox | Steam | Status |
|
|
264
|
+
|------------------------------------|-------------|---------|---------|---------|
|
|
265
|
+
| Total count within limits | [✅/❌] | [✅/❌] | [✅/❌] | [Done] |
|
|
266
|
+
| Point/tier distribution correct | [✅/❌] | [✅/❌] | N/A | [Done] |
|
|
267
|
+
| Platinum/100% achievable | [✅/❌] | [✅/❌] | [✅/❌] | [Done] |
|
|
268
|
+
| No unobtainable achievements | [✅/❌] | [✅/❌] | [✅/❌] | [Done] |
|
|
269
|
+
| Descriptions spoiler-free | [✅/❌] | [✅/❌] | [✅/❌] | [Done] |
|
|
270
|
+
| Difficulty distribution reasonable | [✅/❌] | [✅/❌] | [✅/❌] | [Done] |
|
|
271
|
+
| DLC achievements separate from base| [✅/❌] | [✅/❌] | [✅/❌] | [Done] |
|
|
272
|
+
| Hidden achievements used correctly | [✅/❌] | [✅/❌] | [✅/❌] | [Done] |
|
|
273
|
+
```
|
|
274
|
+
|
|
275
|
+
### What a Finding Looks Like
|
|
276
|
+
|
|
277
|
+
- P0: "Xbox base game Gamerscore totals 750, not 1000. Xbox certification requires exactly 1000 base Gamerscore."
|
|
278
|
+
- P0: "PlayStation trophy list has no Platinum trophy. A Platinum trophy is mandatory for all PlayStation games."
|
|
279
|
+
- P1: "Achievement 'Win 1000 Online Matches' requires approximately 500 hours of multiplayer. If the game's servers are shut down in 3 years, this achievement becomes permanently unobtainable."
|
|
280
|
+
- P2: "Achievement description 'Defeat the final boss' spoils the story. Mark as a hidden/secret achievement to hide the description until earned."
|
|
281
|
+
|
|
282
|
+
---
|
|
283
|
+
|
|
284
|
+
## Pass 7: Content Rating Alignment
|
|
285
|
+
|
|
286
|
+
### What to Check
|
|
287
|
+
|
|
288
|
+
Game content aligns with the content rating submitted to rating boards (ESRB, PEGI, CERO, USK, GRAC, ACB). No in-game content exceeds the submitted rating. User-generated content (chat, custom names, shared creations) has moderation to prevent rating-exceeding content.
|
|
289
|
+
|
|
290
|
+
### Why This Matters
|
|
291
|
+
|
|
292
|
+
A content rating mismatch — submitting for Teen/PEGI 12 but shipping Mature/PEGI 18 content — results in the game being pulled from stores until the rating is corrected. This is a commercial disaster: lost sales during delisting, re-rating fees, potential fines, and reputational damage. Rating boards test the game independently and will find content that the developer's questionnaire did not disclose.
|
|
293
|
+
|
|
294
|
+
### How to Check
|
|
295
|
+
|
|
296
|
+
1. List all content that could affect ratings: violence level (depiction, blood, gore), language (profanity, slurs), sexual content, drug/alcohol references, gambling mechanics, horror/fear themes
|
|
297
|
+
2. Cross-reference content with the intended rating per rating board:
|
|
298
|
+
- **ESRB** (North America): E, E10+, T, M, AO
|
|
299
|
+
- **PEGI** (Europe): 3, 7, 12, 16, 18
|
|
300
|
+
- **CERO** (Japan): A, B, C, D, Z
|
|
301
|
+
- **USK** (Germany): 0, 6, 12, 16, 18
|
|
302
|
+
3. Verify that user-generated content has moderation: text chat filters, image moderation, name filters
|
|
303
|
+
4. Check that in-game purchases are disclosed in the rating (most boards now require "In-Game Purchases" or "In-Game Purchases (Includes Random Items)" descriptors)
|
|
304
|
+
5. Verify that DLC and updates do not introduce content that exceeds the base game's rating
|
|
305
|
+
6. Check for simulated gambling: loot boxes, slot machines, card packs — these may trigger gambling descriptors in some markets
|
|
306
|
+
7. Verify that content differs by market where required: some content acceptable in one market may be banned in another (Germany has specific rules about symbols, Australia about drug references)
|
|
307
|
+
|
|
308
|
+
### What a Finding Looks Like
|
|
309
|
+
|
|
310
|
+
- P0: "Game is rated ESRB Teen but includes decapitation animations in combat. Dismemberment/decapitation typically triggers Mature rating."
|
|
311
|
+
- P0: "Loot boxes with real-money purchase are present but 'In-Game Purchases (Includes Random Items)' descriptor was not submitted. This will be flagged by every rating board."
|
|
312
|
+
- P1: "Text chat exists with no profanity filter. Unmoderated text chat allows players to share content that exceeds the game's rating."
|
|
313
|
+
- P2: "The Australian market is targeted but drug references in a side quest may trigger ACB refusal of classification. Review the specific content against ACB guidelines."
|
|
314
|
+
|
|
315
|
+
---
|
|
316
|
+
|
|
317
|
+
## Common Review Anti-Patterns
|
|
318
|
+
|
|
319
|
+
### 1. "We Will Handle Cert During Cert Prep"
|
|
320
|
+
|
|
321
|
+
The certification compliance section of the design document says "TRC/TCR compliance will be addressed during the certification preparation phase" — 6-8 weeks before submission. Requirements that affect architecture (save system, suspend/resume, controller handling) cannot be retrofitted in 6 weeks. By design time, these requirements must be baked into the architecture.
|
|
322
|
+
|
|
323
|
+
**How to spot it:** The design document has no section for platform certification requirements. Or it has a section that says "see certification preparation milestone." No platform-specific technical requirements are mentioned in the technical design.
|
|
324
|
+
|
|
325
|
+
### 2. Single-Platform Certification Focus
|
|
326
|
+
|
|
327
|
+
The document addresses one platform's certification requirements thoroughly (usually the platform the team is most familiar with) and ignores or hand-waves the others. Each platform has unique requirements — Xbox Quick Resume, PlayStation Activity Cards, Nintendo Switch handheld/docked modes — that require distinct implementation.
|
|
328
|
+
|
|
329
|
+
**How to spot it:** One platform has a detailed checklist; other platforms have "similar requirements apply" or "to be determined." The unique requirements of each platform are not enumerated.
|
|
330
|
+
|
|
331
|
+
### 3. Outdated Certification Requirements
|
|
332
|
+
|
|
333
|
+
The certification requirements referenced in the document are from a previous console generation or an outdated version of the TRC/TCR. Platform requirements change with every SDK update — new requirements are added, old ones are modified. A document referencing PS4-era TRC for a PS5 game will miss Activity Cards, Haptic Feedback guidelines, and Game Help requirements.
|
|
334
|
+
|
|
335
|
+
**How to spot it:** The document references a specific TRC/TCR version number that does not match the current SDK. Or it does not reference any version at all, making it impossible to verify currency. Requirements like "Activity Cards" or "Quick Resume" are absent despite targeting current-gen platforms.
|
|
336
|
+
|
|
337
|
+
### 4. Content Rating as Afterthought
|
|
338
|
+
|
|
339
|
+
The content rating questionnaire is treated as a bureaucratic checkbox rather than a design input. The team fills out the rating questionnaire based on the current build without verifying that planned future content (DLC, seasonal content, user-generated content) will not exceed the submitted rating. A Mature rating on a Teen-targeted game means rebuilding the marketing strategy, store page, and potentially removing content.
|
|
340
|
+
|
|
341
|
+
**How to spot it:** The rating section references only current content, not planned content. No mention of DLC or live-service content in the rating analysis. User-generated content moderation is not connected to rating compliance.
|