@series-inc/rundot-syncplay 5.23.0-beta.7

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 (264) hide show
  1. package/README.md +610 -0
  2. package/dist/animation.d.ts +119 -0
  3. package/dist/animation.js +488 -0
  4. package/dist/asset-cooking.d.ts +82 -0
  5. package/dist/asset-cooking.js +364 -0
  6. package/dist/authority-room.d.ts +217 -0
  7. package/dist/authority-room.js +701 -0
  8. package/dist/bot-documents.d.ts +115 -0
  9. package/dist/bot-documents.js +549 -0
  10. package/dist/bot-primitives.d.ts +152 -0
  11. package/dist/bot-primitives.js +472 -0
  12. package/dist/browser.d.ts +57 -0
  13. package/dist/browser.js +53 -0
  14. package/dist/canonical.d.ts +12 -0
  15. package/dist/canonical.js +288 -0
  16. package/dist/certification.d.ts +455 -0
  17. package/dist/certification.js +1855 -0
  18. package/dist/chaos-certification.d.ts +56 -0
  19. package/dist/chaos-certification.js +1397 -0
  20. package/dist/cjs/animation.js +495 -0
  21. package/dist/cjs/asset-cooking.js +372 -0
  22. package/dist/cjs/authority-room.js +704 -0
  23. package/dist/cjs/bot-documents.js +556 -0
  24. package/dist/cjs/bot-primitives.js +482 -0
  25. package/dist/cjs/browser.js +96 -0
  26. package/dist/cjs/canonical.js +299 -0
  27. package/dist/cjs/certification.js +1860 -0
  28. package/dist/cjs/chaos-certification.js +1402 -0
  29. package/dist/cjs/collections.js +36 -0
  30. package/dist/cjs/collision.js +96 -0
  31. package/dist/cjs/commands.js +987 -0
  32. package/dist/cjs/config-bundle.js +491 -0
  33. package/dist/cjs/creator.js +30 -0
  34. package/dist/cjs/deterministic-primitives.js +134 -0
  35. package/dist/cjs/deterministic-session.js +1410 -0
  36. package/dist/cjs/ecs-lite.js +155 -0
  37. package/dist/cjs/effects-adapter.js +97 -0
  38. package/dist/cjs/engine-complete.js +2297 -0
  39. package/dist/cjs/engine-core-proof.js +70 -0
  40. package/dist/cjs/engine-parity-matrix.js +874 -0
  41. package/dist/cjs/engine-parity.js +3183 -0
  42. package/dist/cjs/engine-runtime.js +3141 -0
  43. package/dist/cjs/errors.js +22 -0
  44. package/dist/cjs/events.js +247 -0
  45. package/dist/cjs/examples/counter-duel.js +157 -0
  46. package/dist/cjs/examples/fixed-arena.js +368 -0
  47. package/dist/cjs/index.js +229 -0
  48. package/dist/cjs/input-authority.js +150 -0
  49. package/dist/cjs/input-button.js +256 -0
  50. package/dist/cjs/input-timeline.js +418 -0
  51. package/dist/cjs/instant-replay.js +66 -0
  52. package/dist/cjs/lag-compensation3d.js +837 -0
  53. package/dist/cjs/local-authority-server-runner.js +1121 -0
  54. package/dist/cjs/local-authority-wire.js +1497 -0
  55. package/dist/cjs/local-authority.js +817 -0
  56. package/dist/cjs/local-ws-adapter.js +150 -0
  57. package/dist/cjs/match-log.js +61 -0
  58. package/dist/cjs/math.js +157 -0
  59. package/dist/cjs/mock-network-adapter.js +26 -0
  60. package/dist/cjs/movement.js +703 -0
  61. package/dist/cjs/movement3d.js +1246 -0
  62. package/dist/cjs/multiclient-authority.js +308 -0
  63. package/dist/cjs/multiplayer-service.js +434 -0
  64. package/dist/cjs/navigation.js +347 -0
  65. package/dist/cjs/navmesh.js +1437 -0
  66. package/dist/cjs/networked-client.js +691 -0
  67. package/dist/cjs/networked-input-authority.js +443 -0
  68. package/dist/cjs/node.js +47 -0
  69. package/dist/cjs/number-lab.js +78 -0
  70. package/dist/cjs/offline-session.js +370 -0
  71. package/dist/cjs/package.json +1 -0
  72. package/dist/cjs/pause-resume.js +43 -0
  73. package/dist/cjs/physics-cert.js +426 -0
  74. package/dist/cjs/physics2d.js +751 -0
  75. package/dist/cjs/physics3d.js +1996 -0
  76. package/dist/cjs/prediction-culling.js +203 -0
  77. package/dist/cjs/protocol-lab.js +1299 -0
  78. package/dist/cjs/r3f-render-adapter.js +209 -0
  79. package/dist/cjs/random.js +59 -0
  80. package/dist/cjs/replay-bundle.js +1598 -0
  81. package/dist/cjs/replay-inspect.js +236 -0
  82. package/dist/cjs/replay-scoring.js +68 -0
  83. package/dist/cjs/replay.js +356 -0
  84. package/dist/cjs/reports.js +181 -0
  85. package/dist/cjs/rollback-history.js +251 -0
  86. package/dist/cjs/runtime-guards.js +111 -0
  87. package/dist/cjs/sample-lab.js +145 -0
  88. package/dist/cjs/sample-scenes.js +752 -0
  89. package/dist/cjs/schema-artifacts.js +359 -0
  90. package/dist/cjs/schema-codegen.js +544 -0
  91. package/dist/cjs/schema-dsl-binary.js +655 -0
  92. package/dist/cjs/schema.js +319 -0
  93. package/dist/cjs/sdk-offline.js +99 -0
  94. package/dist/cjs/session-promotion.js +74 -0
  95. package/dist/cjs/session-snapshot.js +265 -0
  96. package/dist/cjs/session-wire.js +216 -0
  97. package/dist/cjs/signals.js +103 -0
  98. package/dist/cjs/sparse-set.js +169 -0
  99. package/dist/cjs/synctest.js +136 -0
  100. package/dist/cjs/system-lifecycle.js +286 -0
  101. package/dist/cjs/timers.js +61 -0
  102. package/dist/cjs/tools/static-checker.js +1468 -0
  103. package/dist/cjs/types.js +2 -0
  104. package/dist/cjs/venus-mp-budget.js +125 -0
  105. package/dist/cjs/ws-frame.js +255 -0
  106. package/dist/cli.d.ts +2 -0
  107. package/dist/cli.js +11379 -0
  108. package/dist/collections.d.ts +9 -0
  109. package/dist/collections.js +30 -0
  110. package/dist/collision.d.ts +25 -0
  111. package/dist/collision.js +85 -0
  112. package/dist/commands.d.ts +137 -0
  113. package/dist/commands.js +977 -0
  114. package/dist/config-bundle.d.ts +89 -0
  115. package/dist/config-bundle.js +483 -0
  116. package/dist/creator.d.ts +20 -0
  117. package/dist/creator.js +11 -0
  118. package/dist/deterministic-primitives.d.ts +59 -0
  119. package/dist/deterministic-primitives.js +126 -0
  120. package/dist/deterministic-session.d.ts +197 -0
  121. package/dist/deterministic-session.js +1401 -0
  122. package/dist/ecs-lite.d.ts +26 -0
  123. package/dist/ecs-lite.js +152 -0
  124. package/dist/effects-adapter.d.ts +21 -0
  125. package/dist/effects-adapter.js +94 -0
  126. package/dist/engine-complete.d.ts +45 -0
  127. package/dist/engine-complete.js +2292 -0
  128. package/dist/engine-core-proof.d.ts +26 -0
  129. package/dist/engine-core-proof.js +66 -0
  130. package/dist/engine-parity-matrix.d.ts +300 -0
  131. package/dist/engine-parity-matrix.js +869 -0
  132. package/dist/engine-parity.d.ts +74 -0
  133. package/dist/engine-parity.js +3178 -0
  134. package/dist/engine-runtime.d.ts +351 -0
  135. package/dist/engine-runtime.js +3123 -0
  136. package/dist/errors.d.ts +11 -0
  137. package/dist/errors.js +17 -0
  138. package/dist/events.d.ts +45 -0
  139. package/dist/events.js +242 -0
  140. package/dist/examples/counter-duel.d.ts +43 -0
  141. package/dist/examples/counter-duel.js +150 -0
  142. package/dist/examples/fixed-arena.d.ts +110 -0
  143. package/dist/examples/fixed-arena.js +356 -0
  144. package/dist/index.d.ts +101 -0
  145. package/dist/index.js +66 -0
  146. package/dist/input-authority.d.ts +82 -0
  147. package/dist/input-authority.js +147 -0
  148. package/dist/input-button.d.ts +36 -0
  149. package/dist/input-button.js +249 -0
  150. package/dist/input-timeline.d.ts +65 -0
  151. package/dist/input-timeline.js +412 -0
  152. package/dist/instant-replay.d.ts +59 -0
  153. package/dist/instant-replay.js +62 -0
  154. package/dist/lag-compensation3d.d.ts +146 -0
  155. package/dist/lag-compensation3d.js +827 -0
  156. package/dist/local-authority-server-runner.d.ts +79 -0
  157. package/dist/local-authority-server-runner.js +1118 -0
  158. package/dist/local-authority-wire.d.ts +142 -0
  159. package/dist/local-authority-wire.js +1477 -0
  160. package/dist/local-authority.d.ts +160 -0
  161. package/dist/local-authority.js +810 -0
  162. package/dist/local-ws-adapter.d.ts +14 -0
  163. package/dist/local-ws-adapter.js +146 -0
  164. package/dist/match-log.d.ts +74 -0
  165. package/dist/match-log.js +57 -0
  166. package/dist/math.d.ts +41 -0
  167. package/dist/math.js +154 -0
  168. package/dist/mock-network-adapter.d.ts +13 -0
  169. package/dist/mock-network-adapter.js +23 -0
  170. package/dist/movement.d.ts +155 -0
  171. package/dist/movement.js +694 -0
  172. package/dist/movement3d.d.ts +195 -0
  173. package/dist/movement3d.js +1238 -0
  174. package/dist/multiclient-authority.d.ts +30 -0
  175. package/dist/multiclient-authority.js +305 -0
  176. package/dist/multiplayer-service.d.ts +153 -0
  177. package/dist/multiplayer-service.js +429 -0
  178. package/dist/navigation.d.ts +91 -0
  179. package/dist/navigation.js +338 -0
  180. package/dist/navmesh.d.ts +236 -0
  181. package/dist/navmesh.js +1423 -0
  182. package/dist/networked-client.d.ts +124 -0
  183. package/dist/networked-client.js +688 -0
  184. package/dist/networked-input-authority.d.ts +51 -0
  185. package/dist/networked-input-authority.js +439 -0
  186. package/dist/node.d.ts +22 -0
  187. package/dist/node.js +19 -0
  188. package/dist/number-lab.d.ts +15 -0
  189. package/dist/number-lab.js +75 -0
  190. package/dist/offline-session.d.ts +2 -0
  191. package/dist/offline-session.js +367 -0
  192. package/dist/pause-resume.d.ts +48 -0
  193. package/dist/pause-resume.js +40 -0
  194. package/dist/physics-cert.d.ts +40 -0
  195. package/dist/physics-cert.js +389 -0
  196. package/dist/physics2d.d.ts +142 -0
  197. package/dist/physics2d.js +741 -0
  198. package/dist/physics3d.d.ts +285 -0
  199. package/dist/physics3d.js +1979 -0
  200. package/dist/prediction-culling.d.ts +34 -0
  201. package/dist/prediction-culling.js +200 -0
  202. package/dist/protocol-lab.d.ts +115 -0
  203. package/dist/protocol-lab.js +1295 -0
  204. package/dist/r3f-render-adapter.d.ts +61 -0
  205. package/dist/r3f-render-adapter.js +203 -0
  206. package/dist/random.d.ts +13 -0
  207. package/dist/random.js +55 -0
  208. package/dist/replay-bundle.d.ts +150 -0
  209. package/dist/replay-bundle.js +1586 -0
  210. package/dist/replay-inspect.d.ts +60 -0
  211. package/dist/replay-inspect.js +228 -0
  212. package/dist/replay-scoring.d.ts +28 -0
  213. package/dist/replay-scoring.js +65 -0
  214. package/dist/replay.d.ts +17 -0
  215. package/dist/replay.js +351 -0
  216. package/dist/reports.d.ts +176 -0
  217. package/dist/reports.js +174 -0
  218. package/dist/rollback-history.d.ts +46 -0
  219. package/dist/rollback-history.js +247 -0
  220. package/dist/runtime-guards.d.ts +1 -0
  221. package/dist/runtime-guards.js +108 -0
  222. package/dist/sample-lab.d.ts +32 -0
  223. package/dist/sample-lab.js +134 -0
  224. package/dist/sample-scenes.d.ts +86 -0
  225. package/dist/sample-scenes.js +745 -0
  226. package/dist/schema-artifacts.d.ts +49 -0
  227. package/dist/schema-artifacts.js +356 -0
  228. package/dist/schema-codegen.d.ts +21 -0
  229. package/dist/schema-codegen.js +538 -0
  230. package/dist/schema-dsl-binary.d.ts +75 -0
  231. package/dist/schema-dsl-binary.js +648 -0
  232. package/dist/schema.d.ts +87 -0
  233. package/dist/schema.js +315 -0
  234. package/dist/sdk-offline.d.ts +34 -0
  235. package/dist/sdk-offline.js +96 -0
  236. package/dist/session-promotion.d.ts +26 -0
  237. package/dist/session-promotion.js +70 -0
  238. package/dist/session-snapshot.d.ts +95 -0
  239. package/dist/session-snapshot.js +255 -0
  240. package/dist/session-wire.d.ts +89 -0
  241. package/dist/session-wire.js +211 -0
  242. package/dist/signals.d.ts +31 -0
  243. package/dist/signals.js +99 -0
  244. package/dist/sparse-set.d.ts +34 -0
  245. package/dist/sparse-set.js +165 -0
  246. package/dist/synctest.d.ts +31 -0
  247. package/dist/synctest.js +133 -0
  248. package/dist/system-lifecycle.d.ts +72 -0
  249. package/dist/system-lifecycle.js +281 -0
  250. package/dist/timers.d.ts +17 -0
  251. package/dist/timers.js +53 -0
  252. package/dist/tools/index.d.ts +4 -0
  253. package/dist/tools/index.js +4 -0
  254. package/dist/tools/static-checker.d.ts +31 -0
  255. package/dist/tools/static-checker.js +1462 -0
  256. package/dist/tools/vite-plugin.d.ts +69 -0
  257. package/dist/tools/vite-plugin.js +203 -0
  258. package/dist/types.d.ts +148 -0
  259. package/dist/types.js +1 -0
  260. package/dist/venus-mp-budget.d.ts +29 -0
  261. package/dist/venus-mp-budget.js +122 -0
  262. package/dist/ws-frame.d.ts +49 -0
  263. package/dist/ws-frame.js +247 -0
  264. package/package.json +169 -0
@@ -0,0 +1,874 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.evaluateEngineParityMatrixResult = evaluateEngineParityMatrixResult;
4
+ exports.createEngineParityMatrixReport = createEngineParityMatrixReport;
5
+ exports.stableEngineParityMatrixJson = stableEngineParityMatrixJson;
6
+ const canonical_js_1 = require("./canonical.js");
7
+ function evaluateEngineParityMatrixResult(summary) {
8
+ return summary.unsupportedRequiredCliGaps > 0
9
+ ? 'fail'
10
+ : summary.requiredOpenCliGaps > 0
11
+ ? 'warn'
12
+ : 'pass';
13
+ }
14
+ function createEngineParityMatrixReport(evidence = {}) {
15
+ const entries = applyEngineParityEvidence(engineParityMatrixEntries, evidence);
16
+ const byStatus = statusCounts(entries);
17
+ const requiredOpenCliGaps = entries.filter((entry) => entry.requiredForCliParity
18
+ && entry.status !== 'project-certified'
19
+ && entry.status !== 'non-goal').length;
20
+ const unsupportedRequiredCliGaps = entries.filter((entry) => entry.requiredForCliParity
21
+ && entry.canCloseWithCli
22
+ && entry.status === 'unsupported').length;
23
+ const summary = {
24
+ entries: entries.length,
25
+ requiredForCliParity: entries.filter((entry) => entry.requiredForCliParity).length,
26
+ canCloseWithCli: entries.filter((entry) => entry.canCloseWithCli).length,
27
+ byStatus,
28
+ requiredOpenCliGaps,
29
+ unsupportedRequiredCliGaps,
30
+ };
31
+ const withoutId = {
32
+ schemaVersion: 1,
33
+ kind: 'engine-parity-matrix',
34
+ reportId: '',
35
+ summary,
36
+ entries,
37
+ result: evaluateEngineParityMatrixResult(summary),
38
+ };
39
+ return {
40
+ ...withoutId,
41
+ reportId: (0, canonical_js_1.defaultChecksum)(withoutId),
42
+ };
43
+ }
44
+ function stableEngineParityMatrixJson(report) {
45
+ return `${(0, canonical_js_1.canonicalStringify)(report)}\n`;
46
+ }
47
+ function applyEngineParityEvidence(entries, evidence) {
48
+ return entries.map((entry) => {
49
+ if (entry.id === 'typed-frame-runtime' && typedFrameRuntimeEvidencePasses(evidence.projectRuntime)) {
50
+ return closeEntryWithEvidence(entry, [
51
+ 'artifact:project runtime descriptor and generated runtime source certified at 128 players and 5000 frames',
52
+ 'artifact:project game-state replay runtime, command channel, event channel, and self-contained replay verified',
53
+ ]);
54
+ }
55
+ if (entry.id === 'project-level-certification' && projectRuntimeEvidencePasses(evidence.projectRuntime)) {
56
+ return closeEntryWithEvidence(entry, [
57
+ 'artifact:engine-complete project-runtime passed at 128 players and 5000 frames',
58
+ 'artifact:project runtime replay and self-contained replay both verified',
59
+ ]);
60
+ }
61
+ if (entry.id === 'input-command-protocol' && commandProtocolEvidencePasses(evidence.authority)) {
62
+ return closeEntryWithEvidence(entry, [
63
+ 'artifact:local-authority server accepted, acked, resent, and reordered reliable commands in the live wire session',
64
+ 'artifact:reliable command loss, duplicate rejection, rollback convergence, and command-effect checksums verified',
65
+ ]);
66
+ }
67
+ if (entry.id === 'authority-reconnect-latejoin' && authorityEvidencePasses(evidence.authority)) {
68
+ return closeEntryWithEvidence(entry, [
69
+ 'artifact:local-authority server proof passed at 128 players and 1000 frames',
70
+ 'artifact:migration restore, convergence, hostile rejection, and command effects verified',
71
+ ]);
72
+ }
73
+ if (entry.id === 'replay-debugging' && replayDebuggingEvidencePasses(evidence.replayDebugging)) {
74
+ return closeEntryWithEvidence(entry, [
75
+ 'artifact:chaos resync replay bundles verify from cold start with semantic replay',
76
+ 'artifact:chaos first-divergence minimized desync bundle reports a concrete first mismatch frame',
77
+ ]);
78
+ }
79
+ if (entry.id === 'browser-sdk-boundary' && browserSdkEvidencePasses(evidence.browserSdk)) {
80
+ return closeEntryWithEvidence(entry, [
81
+ 'artifact:static determinism artifact audit passed for browser replay, engine-core browser, and SDK test app proofs',
82
+ 'artifact:Chromium browser replay, 128-player engine-core numeric proof, and SDK rendered canvas proof verified',
83
+ ]);
84
+ }
85
+ if (entry.id === 'lag-compensation' && lagCompAuthorityEvidencePasses(evidence.authority)) {
86
+ return closeEntryWithEvidence(entry, [
87
+ 'artifact:local-authority server accepted lag-compensated shot commands through the live command path',
88
+ 'artifact:lag-compensated command hits, forged timing rejections, and restore/replay checksum equivalence verified',
89
+ ]);
90
+ }
91
+ if (entry.id === 'samples' && sampleEvidencePasses(evidence.samples)) {
92
+ return closeEntryWithEvidence(entry, [
93
+ 'artifact:sample-scene category passed with 128-player integrated trace evidence',
94
+ 'artifact:per-sample representative state traces, rollback checksums, and integrated replay counters certified',
95
+ ]);
96
+ }
97
+ if (entry.id === 'assets-config-prototypes' && assetConfigEvidencePasses(evidence.assetConfig)) {
98
+ return closeEntryWithEvidence(entry, [
99
+ 'artifact:asset/config categories certify inherited prototypes, dynamic collections, map spawn materialization, and rebake invalidation',
100
+ 'artifact:descriptor-backed prototype runtime validation and config identity/tamper rejection pass in required-full parity suite',
101
+ ]);
102
+ }
103
+ if (entry.id === 'animation' && animationEvidencePasses(evidence.animation)) {
104
+ return closeEntryWithEvidence(entry, [
105
+ 'artifact:animation category certifies blend tree sampling, animation layers, root motion, event reconstruction, and rollback equivalence',
106
+ 'artifact:engine-complete animation fixture records layer pose, root motion, reconstructed event, normalized clip-time, and blend-weight hashes',
107
+ ]);
108
+ }
109
+ if (entry.id === 'bots' && botEvidencePasses(evidence.bots)) {
110
+ return closeEntryWithEvidence(entry, [
111
+ 'artifact:bot category certifies 128-player bot replacement, rollback equivalence, BT services, utility curves, nested considerations, momentum, and cooldowns',
112
+ 'artifact:bot document trace records advanced behavior service and utility coverage counters with zero failures',
113
+ ]);
114
+ }
115
+ if (entry.id === 'physics' && physicsEvidencePasses(evidence.physics)) {
116
+ return closeEntryWithEvidence(entry, [
117
+ 'artifact:engine-complete physics3d certifies full-step no-fast proof mode, callback lifecycle, scheduled queries, shape casts, stack stability, and rollback equivalence',
118
+ 'artifact:physics metrics include full-step contact/query timings, mesh static collider coverage, angular geometry coverage, and zero optimized stress frames',
119
+ ]);
120
+ }
121
+ if (entry.id === 'kcc-movement' && kccEvidencePasses(evidence.kcc)) {
122
+ return closeEntryWithEvidence(entry, [
123
+ 'artifact:engine-complete kcc3d certifies full-step no-fast proof mode, 128-player KCC, swept collisions, physics queries, callback filtering, and rollback equivalence',
124
+ 'artifact:KCC adversarial fixture covers thin walls, corners, ledges, moving platform edge transfers, slope-limit rejection, and configurable controller geometry',
125
+ ]);
126
+ }
127
+ if (entry.id === 'navigation' && navigationEvidencePasses(evidence.navigation)) {
128
+ return closeEntryWithEvidence(entry, [
129
+ 'artifact:engine-complete navmesh certifies 128 agents, imported navmesh order stability, off-mesh traversal lifecycle, layered 3D lookup, dynamic regions, and rollback equivalence',
130
+ 'artifact:navigation metrics include dense avoidance corrections, velocity-obstacle prediction/order validation, portal/spawn validation, and layered vertical off-mesh traversal',
131
+ ]);
132
+ }
133
+ return entry;
134
+ });
135
+ }
136
+ function closeEntryWithEvidence(entry, evidence) {
137
+ return {
138
+ ...entry,
139
+ status: 'project-certified',
140
+ currentEvidence: [...entry.currentEvidence, ...evidence],
141
+ gaps: [],
142
+ nextCliWork: [],
143
+ };
144
+ }
145
+ function typedFrameRuntimeEvidencePasses(evidence) {
146
+ return evidence !== undefined
147
+ && evidence.result === 'pass'
148
+ && evidence.players === 128
149
+ && evidence.frames >= 5_000
150
+ && evidence.projectRuntimePassed
151
+ && evidence.descriptorCertified
152
+ && evidence.generatedRuntimeSourceCertified
153
+ && evidence.replayAcceptsGeneratedRuntimeSourceHash
154
+ && evidence.replayUsesProjectGameStateRuntime
155
+ && evidence.replayRuntimeVerified
156
+ && evidence.selfContainedReplayRuntimeVerified
157
+ && evidence.replayRuntimeCoversProjectCommands
158
+ && evidence.replayRuntimeCoversProjectEvents
159
+ && evidence.generatedRuntimeSourceHash.length > 0
160
+ && evidence.runtimeDescriptorHash.length > 0
161
+ && evidence.replaySystemId === 'project-game-state-runtime-replay-v1'
162
+ && evidence.replayRuntimeCommandChannels >= 1
163
+ && evidence.replayRuntimeEventChannels >= 1;
164
+ }
165
+ function projectRuntimeEvidencePasses(evidence) {
166
+ return evidence !== undefined
167
+ && typedFrameRuntimeEvidencePasses(evidence)
168
+ && evidence.projectRuntimePassed
169
+ && evidence.assetsConfigCertified
170
+ && evidence.botNavAnimationCertified;
171
+ }
172
+ function authorityEvidencePasses(evidence) {
173
+ return evidence !== undefined
174
+ && evidence.result === 'pass'
175
+ && evidence.players === 128
176
+ && evidence.frames >= 1_000
177
+ && evidence.serverEvaluated
178
+ && evidence.migrationRestored
179
+ && evidence.convergence
180
+ && evidence.disconnects >= 1
181
+ && evidence.reconnects >= 1
182
+ && evidence.lateJoins >= 1
183
+ && evidence.spectators >= 1
184
+ && evidence.snapshotMaxAgeFrames > 0
185
+ && evidence.wireSnapshotRequestEnvelopes >= 2
186
+ && evidence.wireSnapshotOfferEnvelopes >= 2
187
+ && evidence.wireSnapshotChunkEnvelopes >= 2
188
+ && evidence.wireSnapshotCompleteEnvelopes >= 2
189
+ && evidence.wireSnapshotNegotiationCompletesApplied >= 2
190
+ && evidence.wireSnapshotsApplied >= 4
191
+ && evidence.wireAcceptedCommands >= evidence.frames * 2
192
+ && evidence.wireRejectedCommands >= 2
193
+ && evidence.wireSpectatorCommandsRejected >= 2
194
+ && evidence.commandEffectSubmissions >= evidence.frames * 2
195
+ && evidence.commandEffectValue > 0
196
+ && evidence.commandEffectChecksum.length > 0
197
+ && evidence.commandEffectProjectionChecksum.length > 0
198
+ && evidence.failures.length === 0;
199
+ }
200
+ function commandProtocolEvidencePasses(evidence) {
201
+ if (!authorityEvidencePasses(evidence) || evidence === undefined) {
202
+ return false;
203
+ }
204
+ return evidence.reliableCommandAcked >= evidence.frames
205
+ && evidence.reliableCommandResent >= 1
206
+ && evidence.reliableCommandLossesInjected >= 1
207
+ && evidence.reliableCommandDuplicatesRejected >= 1
208
+ && evidence.reliableCommandReordersObserved >= 1
209
+ && evidence.reliableCommandRollbackConverged;
210
+ }
211
+ function lagCompAuthorityEvidencePasses(evidence) {
212
+ if (!authorityEvidencePasses(evidence) || evidence === undefined) {
213
+ return false;
214
+ }
215
+ return true
216
+ && evidence.lagCompCommandSubmissions >= evidence.frames * 2
217
+ && evidence.lagCompAcceptedShots >= evidence.frames * 2
218
+ && evidence.lagCompHitCommands >= evidence.frames * 2
219
+ && evidence.lagCompInvalidShotCommands >= 2
220
+ && evidence.lagCompForgedTimingRejected >= 2
221
+ && evidence.lagCompReplayChecksum.length > 0
222
+ && evidence.lagCompRestoredChecksum === evidence.lagCompReplayChecksum
223
+ && evidence.lagCompRollbackEquivalent;
224
+ }
225
+ function replayDebuggingEvidencePasses(evidence) {
226
+ return evidence !== undefined
227
+ && evidence.result === 'pass'
228
+ && evidence.verifiedResyncBundles >= 3
229
+ && evidence.semanticReplayFrames > 0
230
+ && evidence.minimizedDesyncBundles >= 1
231
+ && evidence.minimizedDesyncFirstMismatchFrame >= 0
232
+ && evidence.failures.length === 0;
233
+ }
234
+ function browserSdkEvidencePasses(evidence) {
235
+ return evidence !== undefined
236
+ && evidence.result === 'pass'
237
+ && evidence.staticAuditPassed
238
+ && evidence.browserReplayVerified
239
+ && evidence.browserReplayFrames >= 120
240
+ && evidence.browserReplayPlayers >= 4
241
+ && evidence.engineCoreBrowserVerified
242
+ && evidence.engineCorePlayers === 128
243
+ && evidence.engineCoreFrames >= 1_000
244
+ && evidence.engineCoreCategoryMatches >= 3
245
+ && evidence.sdkTestAppVerified
246
+ && evidence.sdkCanvasRendered
247
+ && evidence.failures.length === 0;
248
+ }
249
+ function sampleEvidencePasses(evidence) {
250
+ return evidence !== undefined
251
+ && evidence.result === 'pass'
252
+ && evidence.players === 128
253
+ && evidence.frames >= 1_000
254
+ && evidence.sampleCategoryPassed
255
+ && evidence.allMechanicsCovered
256
+ && evidence.integratedHeadlessSceneCovered
257
+ && evidence.integratedReplayVerified
258
+ && evidence.integratedRollbackEquivalent
259
+ && evidence.artifactTracePresent
260
+ && evidence.artifactTraceAllSamplesCovered
261
+ && evidence.artifactTraceMechanicsCovered
262
+ && evidence.artifactTraceRollbackEquivalent
263
+ && evidence.artifactTraceIntegratedReplayVerified
264
+ && evidence.artifactTraceSampleCount >= 10
265
+ && evidence.artifactTraceMechanicCount >= 80
266
+ && evidence.artifactTraceRepresentativeStates >= 30
267
+ && evidence.artifactTraceIntegratedReplaySnapshots > 0
268
+ && evidence.artifactTraceHash.length > 0
269
+ && evidence.failures.length === 0;
270
+ }
271
+ function assetConfigEvidencePasses(evidence) {
272
+ return evidence !== undefined
273
+ && evidence.result === 'pass'
274
+ && evidence.players === 128
275
+ && evidence.frames >= 1_000
276
+ && evidence.assetCategoryPassed
277
+ && evidence.configCategoryPassed
278
+ && evidence.descriptorBackedPrototypeValidation
279
+ && evidence.compoundPrototypeInheritanceCovered
280
+ && evidence.dynamicCollectionAllocationCovered
281
+ && evidence.mapSpawnMaterializationCovered
282
+ && evidence.mapRebakeInvalidationCovered
283
+ && evidence.configInheritedPrototypeMaterialized
284
+ && evidence.configDynamicCollectionsMaterialized
285
+ && evidence.configMapMaterializationStable
286
+ && evidence.configMapRebakeInvalidated
287
+ && evidence.runtimeValidatedPrototypeEntities >= 4
288
+ && evidence.runtimeInjectedPrototypeComponents >= 12
289
+ && evidence.assetMapMaterializedEntityCount >= 4
290
+ && evidence.configMapMaterializedEntityCount >= 2
291
+ && evidence.mapBakeHash.length > 0
292
+ && evidence.configMapBakeHash.length > 0
293
+ && evidence.failures.length === 0;
294
+ }
295
+ function animationEvidencePasses(evidence) {
296
+ return evidence !== undefined
297
+ && evidence.result === 'pass'
298
+ && evidence.players === 128
299
+ && evidence.frames >= 1_000
300
+ && evidence.animationCategoryPassed
301
+ && evidence.stateTransitionsCovered
302
+ && evidence.exitFrameTransitionsCovered
303
+ && evidence.transitionBlendCovered
304
+ && evidence.triggerLatchCovered
305
+ && evidence.animationEventsEmitted
306
+ && evidence.normalizedClipTimeCovered
307
+ && evidence.sampledPoseCovered
308
+ && evidence.blendTreeCovered
309
+ && evidence.animationLayersCovered
310
+ && evidence.rootMotionCovered
311
+ && evidence.eventReconstructionCovered
312
+ && evidence.rollbackEquivalent
313
+ && evidence.blendTreeFrames > 0
314
+ && evidence.layerPoseFrames > 0
315
+ && evidence.rootMotionFrames > 0
316
+ && evidence.reconstructedEvents > 0
317
+ && evidence.reconstructedEventHash.length > 0
318
+ && evidence.failures.length === 0;
319
+ }
320
+ function botEvidencePasses(evidence) {
321
+ return evidence !== undefined
322
+ && evidence.result === 'pass'
323
+ && evidence.players === 128
324
+ && evidence.frames >= 1_000
325
+ && evidence.botCategoryPassed
326
+ && evidence.player128BotReplacement
327
+ && evidence.rollbackEquivalent
328
+ && evidence.behaviorServicesCovered
329
+ && evidence.utilityCurvesCovered
330
+ && evidence.utilityNestedCovered
331
+ && evidence.utilityMomentumCovered
332
+ && evidence.utilityCooldownCovered
333
+ && evidence.botDocumentBehaviorServicesCovered
334
+ && evidence.botDocumentUtilityCurvesCovered
335
+ && evidence.botDocumentUtilityNestedCovered
336
+ && evidence.botDocumentUtilityMomentumCovered
337
+ && evidence.botDocumentUtilityCooldownCovered
338
+ && evidence.behaviorServiceTicks > 0
339
+ && evidence.utilityCurveSelections > 0
340
+ && evidence.utilityNestedSelections > 0
341
+ && evidence.utilityMomentumSelections > 0
342
+ && evidence.utilityCooldownSuppressions > 0
343
+ && evidence.botDocumentBehaviorServiceTicks > 0
344
+ && evidence.botDocumentUtilityCurveSelections > 0
345
+ && evidence.botDocumentUtilityNestedSelections > 0
346
+ && evidence.botDocumentUtilityMomentumSelections > 0
347
+ && evidence.botDocumentUtilityCooldownSuppressions > 0
348
+ && evidence.failures.length === 0;
349
+ }
350
+ function physicsEvidencePasses(evidence) {
351
+ return evidence !== undefined
352
+ && evidence.result === 'pass'
353
+ && evidence.players === 128
354
+ && evidence.frames >= 5_000
355
+ && evidence.categoryPassed
356
+ && evidence.noFastStressHonored
357
+ && evidence.proofMode === 'full-step'
358
+ && evidence.fullRequiredProofCovered
359
+ && evidence.fullStepRollbackEquivalent
360
+ && evidence.fullStepContactsAndQueriesCovered
361
+ && evidence.stackStabilityCovered
362
+ && evidence.stackRollbackEquivalent
363
+ && evidence.stackAuthoringOrderStable
364
+ && evidence.scheduledQueriesRan
365
+ && evidence.shapeCastsCovered
366
+ && evidence.callbackLifecycleCovered
367
+ && evidence.materialResponseCovered
368
+ && evidence.meshStaticCollidersCovered
369
+ && evidence.angularGeometryCovered
370
+ && evidence.fullStepFrames > 0
371
+ && evidence.optimizedStressFrames === 0
372
+ && evidence.failures.length === 0;
373
+ }
374
+ function kccEvidencePasses(evidence) {
375
+ return evidence !== undefined
376
+ && evidence.result === 'pass'
377
+ && evidence.players === 128
378
+ && evidence.frames >= 5_000
379
+ && evidence.categoryPassed
380
+ && evidence.noFastStressHonored
381
+ && evidence.proofMode === 'full-step'
382
+ && evidence.fullRequiredProofCovered
383
+ && evidence.fullStepRollbackEquivalent
384
+ && evidence.slopesCovered
385
+ && evidence.stepsCovered
386
+ && evidence.movingPlatformsCovered
387
+ && evidence.sweptCollisionsCovered
388
+ && evidence.physicsQueriesCovered
389
+ && evidence.perHitCallbackFilteringCovered
390
+ && evidence.controllerGeometryConfigurable
391
+ && evidence.adversarialRollbackEquivalent
392
+ && evidence.adversarialThinWallSweepsCovered
393
+ && evidence.adversarialCornerSweepsCovered
394
+ && evidence.adversarialSlopeLimitRejectionsCovered
395
+ && evidence.fullStepPlayers === 128
396
+ && evidence.fullStepFrames > 0
397
+ && evidence.optimizedStressFrames === 0
398
+ && evidence.failures.length === 0;
399
+ }
400
+ function navigationEvidencePasses(evidence) {
401
+ return evidence !== undefined
402
+ && evidence.result === 'pass'
403
+ && evidence.players === 128
404
+ && evidence.frames >= 5_000
405
+ && evidence.categoryPassed
406
+ && evidence.rollbackEquivalent
407
+ && evidence.agentsCovered
408
+ && evidence.importedCookOrderStable
409
+ && evidence.importedPointPathCovered
410
+ && evidence.importedPortalAndSpawnCovered
411
+ && evidence.importedValidationFailuresCovered
412
+ && evidence.offMeshTraversalLifecycleCovered
413
+ && evidence.layered3DLookupDisambiguated
414
+ && evidence.layered3DOffMeshTraversalCovered
415
+ && evidence.layered3DRollbackEquivalent
416
+ && evidence.velocityObstacleAvoidanceCovered
417
+ && evidence.velocityObstaclePredictionCovered
418
+ && evidence.velocityObstacleOrderStable
419
+ && evidence.velocityObstacleValidationRejected
420
+ && evidence.agentVelocityObstacleAvoidanceCovered
421
+ && evidence.avoidanceCorrections > 0
422
+ && evidence.velocityObstacleAvoidanceCorrections > 0
423
+ && evidence.importedPortalCount > 0
424
+ && evidence.layeredVerticalOffMeshTraversals > 0
425
+ && evidence.failures.length === 0;
426
+ }
427
+ function statusCounts(entries) {
428
+ return {
429
+ 'project-certified': entries.filter((entry) => entry.status === 'project-certified').length,
430
+ implemented: entries.filter((entry) => entry.status === 'implemented').length,
431
+ 'headless-only': entries.filter((entry) => entry.status === 'headless-only').length,
432
+ 'fixture-only': entries.filter((entry) => entry.status === 'fixture-only').length,
433
+ unsupported: entries.filter((entry) => entry.status === 'unsupported').length,
434
+ 'non-goal': entries.filter((entry) => entry.status === 'non-goal').length,
435
+ };
436
+ }
437
+ const engineParityMatrixEntries = [
438
+ {
439
+ id: 'typed-frame-runtime',
440
+ system: 'ECS and frame runtime',
441
+ engineExpectation: 'DSL-defined components, singleton/global state, stateless systems, generated accessors, frame-owned snapshots, deterministic queries, rollback restore.',
442
+ status: 'implemented',
443
+ requiredForCliParity: true,
444
+ canCloseWithCli: true,
445
+ currentEvidence: [
446
+ 'packages/syncplay/src/engine-runtime.ts',
447
+ 'packages/syncplay/src/sparse-set.ts',
448
+ 'packages/syncplay/tests/engine-complete.test.ts',
449
+ ],
450
+ cliProofs: [
451
+ 'npm run certify:engine-complete -- --filter typed-frame-runtime --players 128 --frames 5000',
452
+ 'npm run schema:runtime <descriptor.json> --execute --json artifacts/certification/schema-runtime.json',
453
+ ],
454
+ gaps: [
455
+ 'Project-authored generated runtime replay is not yet mandatory in the top-level parity artifact.',
456
+ 'Frame-heap allocation/free-on-component-lifecycle policy is not yet project-certified.',
457
+ ],
458
+ nextCliWork: [
459
+ 'Require generated runtime source hash and self-contained replay bundle verification in project:certify.',
460
+ 'Add descriptor-level dynamic collection lifecycle fixtures for add/remove component and entity destroy.',
461
+ ],
462
+ referenceDocs: [
463
+ 'external-deterministic-engine-reference:manual/engine-ecs/dsl',
464
+ 'external-deterministic-engine-reference:manual/engine-ecs/systems',
465
+ ],
466
+ },
467
+ {
468
+ id: 'project-level-certification',
469
+ system: 'Project artifact chain',
470
+ engineExpectation: 'A game project can be certified from authored DSL, systems, assets, configs, static checks, replay identity, and runtime execution as one artifact.',
471
+ status: 'headless-only',
472
+ requiredForCliParity: true,
473
+ canCloseWithCli: true,
474
+ currentEvidence: [
475
+ 'packages/syncplay/src/cli.ts',
476
+ 'packages/syncplay/src/engine-complete.ts',
477
+ 'packages/syncplay/fixtures/projects/engine-parity/project.json',
478
+ 'packages/syncplay/tests/product-cli.test.ts',
479
+ 'packages/syncplay/tests/engine-complete.test.ts',
480
+ ],
481
+ cliProofs: [
482
+ 'npm run project:certify fixtures/projects/engine-parity/project.json -- --require all --out-dir artifacts/certification/project --json artifacts/certification/project-certify.json',
483
+ 'npm run certify:engine-complete -- --filter project-runtime --players 128 --frames 5000 --json artifacts/certification/engine-complete-project-runtime.json',
484
+ ],
485
+ gaps: [
486
+ 'Project proof is not yet tied into SDK packed-export smoke tests or browser-safe subpath certification.',
487
+ 'Project certification artifacts are not yet ingested by an evidence-derived parity matrix.',
488
+ ],
489
+ nextCliWork: [
490
+ 'Add project certification output to static artifact audit and SDK pack/install smoke.',
491
+ 'Promote project:certify valid runtime replay and minimized runtime desync artifact into final certification artifact audit.',
492
+ ],
493
+ referenceDocs: [
494
+ 'external-deterministic-engine-reference:manual/assets/assets-simulation',
495
+ 'external-deterministic-engine-reference:manual/config-files',
496
+ 'external-deterministic-engine-reference:manual/replay',
497
+ ],
498
+ },
499
+ {
500
+ id: 'assets-config-prototypes',
501
+ system: 'Assets, configs, prototypes',
502
+ engineExpectation: 'Immutable asset DB, session/simulation/runtime/player config identity, entity prototypes, baked map materialization, stale hash rejection, migrations.',
503
+ status: 'headless-only',
504
+ requiredForCliParity: true,
505
+ canCloseWithCli: true,
506
+ currentEvidence: [
507
+ 'packages/syncplay/src/asset-cooking.ts',
508
+ 'packages/syncplay/src/config-bundle.ts',
509
+ 'packages/syncplay/tests/asset-cooking.test.ts',
510
+ 'packages/syncplay/tests/config-bundle.test.ts',
511
+ ],
512
+ cliProofs: [
513
+ 'npm run cook:syncplay-assets -- --verify fixtures/assets --json artifacts/certification/assets.json',
514
+ 'npm run config:bundle <config.json> --out artifacts/certification/config.bundle.json --json artifacts/certification/config-bundle.json',
515
+ 'npm run config:verify artifacts/certification/config.bundle.json --json artifacts/certification/config-verify.json',
516
+ ],
517
+ gaps: [
518
+ 'Prototype materialization is shallow component cloning, not full map/entity-prototype authoring parity.',
519
+ 'Dynamic collection allocation inside prototypes is not certified.',
520
+ ],
521
+ nextCliWork: [
522
+ 'Add compound prototype inheritance, override, typed defaults, dynamic collection allocation, map spawn, and rebake invalidation fixtures.',
523
+ ],
524
+ referenceDocs: [
525
+ 'external-deterministic-engine-reference:manual/entity-prototypes',
526
+ 'external-deterministic-engine-reference:manual/assets/assets-simulation',
527
+ ],
528
+ },
529
+ {
530
+ id: 'input-command-protocol',
531
+ system: 'Inputs, commands, protocol',
532
+ engineExpectation: 'Per-tick compact inputs plus reliable occasional commands, prediction, validation, rollback delivery, loss/dup/reorder resilience.',
533
+ status: 'implemented',
534
+ requiredForCliParity: true,
535
+ canCloseWithCli: true,
536
+ currentEvidence: [
537
+ 'packages/syncplay/src/input-timeline.ts',
538
+ 'packages/syncplay/src/commands.ts',
539
+ 'packages/syncplay/src/protocol-lab.ts',
540
+ 'packages/syncplay/tests/command-timeline.test.ts',
541
+ 'packages/syncplay/tests/input-timeline.test.ts',
542
+ ],
543
+ cliProofs: [
544
+ 'npm run lab:input-timeline -- --players 128 --frames 1000 --json artifacts/reports/input-timeline-p128.json',
545
+ 'npm run lab:command-timeline -- --players 128 --json artifacts/reports/command-timeline-p128.json',
546
+ 'npm run lab:protocol-rollback -- --players 128 --frames 1000 --json artifacts/reports/protocol-p128.json',
547
+ ],
548
+ gaps: [
549
+ 'Reliable command resend/ack is not yet proven over the same live local authority session as the wire receiver.',
550
+ ],
551
+ nextCliWork: [
552
+ 'Add a long integrated authority-wire protocol fixture with reliable commands, acks, resend, hostile rejection, and convergence.',
553
+ ],
554
+ referenceDocs: [
555
+ 'external-deterministic-engine-reference:manual/input',
556
+ 'external-deterministic-engine-reference:manual/commands',
557
+ ],
558
+ },
559
+ {
560
+ id: 'authority-reconnect-latejoin',
561
+ system: 'Local authoritative runner',
562
+ engineExpectation: 'Server-confirmed verified frames, predicted clients, reconnect, late join, spectator reconstruction, snapshot exchange, migration, hostile-client rejection.',
563
+ status: 'fixture-only',
564
+ requiredForCliParity: true,
565
+ canCloseWithCli: true,
566
+ currentEvidence: [
567
+ 'packages/syncplay/src/local-authority.ts',
568
+ 'packages/syncplay/src/local-authority-wire.ts',
569
+ 'packages/syncplay/src/local-authority-server-runner.ts',
570
+ 'packages/syncplay/tests/engine-complete.test.ts',
571
+ ],
572
+ cliProofs: [
573
+ 'npm run lab:local-authority-server -- --players 128 --frames 1000 --seed 71 --json artifacts/reports/local-authority-server-p128.json',
574
+ ],
575
+ gaps: [
576
+ 'Reconnect, late join, snapshot chunks, replay continuity, and command reliability are split across fixtures.',
577
+ 'Current local server runner proof is not yet a long session parity gate.',
578
+ ],
579
+ nextCliWork: [
580
+ 'Add one 128-client integrated session proof covering disconnect to snapshot restore to catch-up to replay verification.',
581
+ 'Emit replay bundle and desync minimizer artifacts from that session.',
582
+ ],
583
+ referenceDocs: [
584
+ 'external-deterministic-engine-reference:manual/frames',
585
+ 'external-deterministic-engine-reference:manual/game-session/reconnecting',
586
+ ],
587
+ },
588
+ {
589
+ id: 'replay-debugging',
590
+ system: 'Replay, checksum, desync debugger',
591
+ engineExpectation: 'Replay identity binds runtime, assets, configs, input/command history, checksums, debug tables, and minimized desync artifacts.',
592
+ status: 'implemented',
593
+ requiredForCliParity: true,
594
+ canCloseWithCli: true,
595
+ currentEvidence: [
596
+ 'packages/syncplay/src/replay-bundle.ts',
597
+ 'packages/syncplay/tests/replay-bundle-cli.test.ts',
598
+ ],
599
+ cliProofs: [
600
+ 'npm run replay-bundle:verify <bundle.json> --json artifacts/certification/replay-bundle.json',
601
+ 'npm run replay-bundle:verify-runtime <bundle.json> --json artifacts/certification/replay-runtime.json',
602
+ 'npm run replay-bundle:diff <expected.json> <actual.json> --json artifacts/certification/replay-diff.json',
603
+ ],
604
+ gaps: [
605
+ 'Protocol-generated desyncs are not yet automatically converted into self-contained minimized replay bundle artifacts.',
606
+ ],
607
+ nextCliWork: [
608
+ 'Wire protocol and local-authority desync scenarios into replay-bundle minimization outputs.',
609
+ ],
610
+ referenceDocs: [
611
+ 'external-deterministic-engine-reference:manual/replay',
612
+ 'external-deterministic-engine-reference:getting-started/faq',
613
+ ],
614
+ },
615
+ {
616
+ id: 'physics',
617
+ system: 'Physics 2D, 2.5D, 3D',
618
+ engineExpectation: 'Deterministic rollback-safe 2D/3D/2.5D physics, queries, materials, constraints, CCD, triggers, callbacks, stable performance.',
619
+ status: 'headless-only',
620
+ requiredForCliParity: true,
621
+ canCloseWithCli: true,
622
+ currentEvidence: [
623
+ 'packages/syncplay/src/physics2d.ts',
624
+ 'packages/syncplay/src/physics3d.ts',
625
+ 'packages/syncplay/tests/physics2d.test.ts',
626
+ 'packages/syncplay/tests/engine-complete.test.ts',
627
+ ],
628
+ cliProofs: [
629
+ 'npm run lab:physics3d -- --bodies 128 --frames 1000 --no-fast-stress --json artifacts/reports/physics3d-no-fast.json',
630
+ 'npm run certify:engine-complete -- --filter physics3d --players 128 --frames 5000 --no-fast-stress',
631
+ ],
632
+ gaps: [
633
+ 'Production-quality stacked rigid-body solving, broad mesh import, full CCD, and long no-fast stress are not proven.',
634
+ '100k stress can use optimized-tail mode unless no-fast-stress is required.',
635
+ ],
636
+ nextCliWork: [
637
+ 'Add adversarial no-fast fixtures for stacks, tunneling, joints, query ordering, 2.5D overload, and rollback equivalence.',
638
+ ],
639
+ referenceDocs: [
640
+ 'external-deterministic-engine-reference:manual/physics/overview',
641
+ 'external-deterministic-engine-reference:manual/physics/physics-25d',
642
+ 'external-deterministic-engine-reference:manual/physics/queries',
643
+ ],
644
+ },
645
+ {
646
+ id: 'kcc-movement',
647
+ system: 'KCC and movement',
648
+ engineExpectation: 'Deterministic 2D/3D KCC, capsule processors, slopes, stairs, ledges, platforms, filters, callbacks, adversarial playground coverage.',
649
+ status: 'headless-only',
650
+ requiredForCliParity: true,
651
+ canCloseWithCli: true,
652
+ currentEvidence: [
653
+ 'packages/syncplay/src/movement.ts',
654
+ 'packages/syncplay/src/movement3d.ts',
655
+ 'packages/syncplay/tests/movement.test.ts',
656
+ 'packages/syncplay/tests/engine-complete.test.ts',
657
+ ],
658
+ cliProofs: [
659
+ 'npm run lab:kcc3d -- --players 128 --frames 1000 --no-fast-stress --json artifacts/reports/kcc3d-no-fast.json',
660
+ 'npm run certify:engine-complete -- --filter kcc3d --players 128 --frames 5000 --no-fast-stress',
661
+ ],
662
+ gaps: [
663
+ 'KCC processor asset model and authored playground/import fixture are missing.',
664
+ 'Long full-workload no-fast KCC stress is not mandatory.',
665
+ ],
666
+ nextCliWork: [
667
+ 'Add processor asset compile/trace and playground-style CLI fixture for stairs, slopes, corridors, gaps, moving platforms, filters, and callbacks.',
668
+ ],
669
+ referenceDocs: [
670
+ 'external-deterministic-engine-reference:manual/physics/kcc',
671
+ 'external-deterministic-engine-reference:addons/kcc/sample-project',
672
+ ],
673
+ },
674
+ {
675
+ id: 'navigation',
676
+ system: 'Navigation and avoidance',
677
+ engineExpectation: 'Deterministic navmesh bake/import, pathfinding, steering, regions, off-mesh links, 3D nav, HRVO-style agent avoidance, dynamic obstacles.',
678
+ status: 'headless-only',
679
+ requiredForCliParity: true,
680
+ canCloseWithCli: true,
681
+ currentEvidence: [
682
+ 'packages/syncplay/src/navigation.ts',
683
+ 'packages/syncplay/src/navmesh.ts',
684
+ 'packages/syncplay/tests/navigation.test.ts',
685
+ ],
686
+ cliProofs: [
687
+ 'npm run navmesh:validate -- fixtures/navmesh/engine-parity-arena.json --json artifacts/reports/navmesh-validate.json',
688
+ 'npm run navmesh:trace -- fixtures/navmesh/engine-parity-arena.json --agents 128 --frames 1000 --out artifacts/traces/navmesh.json --json artifacts/reports/navmesh-trace.json',
689
+ ],
690
+ gaps: [
691
+ 'HRVO-style dense symmetric avoidance/deadlock fixtures need stronger candidate-solver evidence beyond current avoidance/progress trace counters.',
692
+ 'DCC/R3F navmesh import and bake are outside current headless proof.',
693
+ ],
694
+ nextCliWork: [
695
+ 'Add HRVO-style candidate velocity solver fixtures for dense corridor, symmetric crossing, dynamic obstacle, region toggle, off-mesh, and layered 3D navmesh stress.',
696
+ ],
697
+ referenceDocs: [
698
+ 'external-deterministic-engine-reference:manual/navigation/overview',
699
+ 'external-deterministic-engine-reference:manual/navigation/avoidance',
700
+ ],
701
+ },
702
+ {
703
+ id: 'bots',
704
+ system: 'Bot SDK runtime',
705
+ engineExpectation: 'HFSM, behavior trees, utility theory, blackboards, document compile, traces, rich utility curves, momentum, cooldowns, nested considerations.',
706
+ status: 'headless-only',
707
+ requiredForCliParity: true,
708
+ canCloseWithCli: true,
709
+ currentEvidence: [
710
+ 'packages/syncplay/src/bot-primitives.ts',
711
+ 'packages/syncplay/src/bot-documents.ts',
712
+ 'packages/syncplay/tests/bot-primitives.test.ts',
713
+ ],
714
+ cliProofs: [
715
+ 'npm run bot:compile -- fixtures/bots/engine-parity-bot.json --valid-asset-refs ability.dash --out artifacts/cooked/bot.json --json artifacts/reports/bot-compile.json',
716
+ 'npm run bot:trace -- fixtures/bots/engine-parity-bot.json --valid-asset-refs ability.dash --slots 0,1,2,3 --frames 120 --require-model-coverage --require-advanced-coverage --out artifacts/traces/bot.json --json artifacts/reports/bot-trace.json',
717
+ ],
718
+ gaps: [
719
+ 'Advanced bot document coverage is now modeled and strictly traceable, but the final parity matrix still requires generated evidence artifacts to promote it to project-certified.',
720
+ 'Visual authoring remains a non-CLI gap; CLI scope should focus on richer fail-closed document validation and artifact ingestion.',
721
+ ],
722
+ nextCliWork: [
723
+ 'Promote strict bot trace and project certification artifacts into the evidence-derived parity matrix.',
724
+ 'Add negative bot document fixtures for duplicate ids, bad blackboard refs, invalid nested utility refs, service cadence errors, and unsupported deterministic value types.',
725
+ ],
726
+ referenceDocs: [
727
+ 'external-deterministic-engine-reference:addons/bot-sdk/overview',
728
+ 'external-deterministic-engine-reference:addons/bot-sdk/utility-theory',
729
+ ],
730
+ },
731
+ {
732
+ id: 'animation',
733
+ system: 'Deterministic animation',
734
+ engineExpectation: 'Deterministic animation state machines, Mecanim-style baking constraints, clips, transitions, events, blends, layers, root motion, rollback-safe playback.',
735
+ status: 'headless-only',
736
+ requiredForCliParity: true,
737
+ canCloseWithCli: true,
738
+ currentEvidence: [
739
+ 'packages/syncplay/src/animation.ts',
740
+ 'packages/syncplay/tests/engine-complete.test.ts',
741
+ 'packages/syncplay/tests/product-cli.test.ts',
742
+ ],
743
+ cliProofs: [
744
+ 'npm run animation:compile -- fixtures/animation/engine-parity-animator.json --out artifacts/cooked/animation.json --json artifacts/reports/animation-compile.json',
745
+ 'npm run animation:trace -- fixtures/animation/engine-parity-animator.json --frames 240 --require-transition-coverage --require-advanced-coverage --out artifacts/traces/animation.json --json artifacts/reports/animation-trace.json',
746
+ ],
747
+ gaps: [
748
+ 'Blend trees, layers, root motion, and synchronized event reconstruction are now strictly traceable, but final parity still depends on generated evidence artifacts and long-run project certification.',
749
+ ],
750
+ nextCliWork: [
751
+ 'Promote strict animation trace and project certification artifacts into the evidence-derived parity matrix.',
752
+ 'Add CLI fixtures for non-synchronized event reconstruction policy, late-join animation slicing, transition interruption, layer masks, and invalid animator descriptor rejection.',
753
+ ],
754
+ referenceDocs: [
755
+ 'external-deterministic-engine-reference:manual/animation',
756
+ ],
757
+ },
758
+ {
759
+ id: 'lag-compensation',
760
+ system: 'Lag compensation',
761
+ engineExpectation: 'Authoritative rewind, per-client shot timing, hitbox proxies, occlusion, anti-forgery, replay validation, rollback-safe snapshots.',
762
+ status: 'implemented',
763
+ requiredForCliParity: true,
764
+ canCloseWithCli: true,
765
+ currentEvidence: [
766
+ 'packages/syncplay/src/lag-compensation3d.ts',
767
+ 'packages/syncplay/tests/lag-compensation3d.test.ts',
768
+ ],
769
+ cliProofs: [
770
+ 'npm run lab:lag-compensation3d -- --players 128 --frames 1000 --seed 71 --json artifacts/reports/lag-comp3d.json',
771
+ ],
772
+ gaps: [
773
+ 'End-to-end authority session proof with command ingestion, per-client shot time, anti-forgery, replay bundle validation, and rollback is not mandatory.',
774
+ ],
775
+ nextCliWork: [
776
+ 'Integrate lag-compensated shot commands into the local authority session proof and replay bundle verification.',
777
+ ],
778
+ referenceDocs: [
779
+ 'external-deterministic-engine-reference:game-samples/engine-simple-fps/overview',
780
+ ],
781
+ },
782
+ {
783
+ id: 'samples',
784
+ system: 'Samples and common scenes',
785
+ engineExpectation: 'Robust reusable samples for common multiplayer genres that prove engine systems in realistic combinations.',
786
+ status: 'fixture-only',
787
+ requiredForCliParity: true,
788
+ canCloseWithCli: true,
789
+ currentEvidence: [
790
+ 'packages/syncplay/src/sample-scenes.ts',
791
+ 'packages/syncplay/tests/sample-scenes.test.ts',
792
+ ],
793
+ cliProofs: [
794
+ 'npm run certify:v2 -- --profile required-full --players 128 --frames 1000 --json artifacts/certification/engine-parity-required-full.json',
795
+ ],
796
+ gaps: [
797
+ 'Headless sample counters do not yet prove creator-facing scene templates or artifact-rendered sample state.',
798
+ 'Integrated samples need stronger per-scene mechanics assertions and replay artifacts.',
799
+ ],
800
+ nextCliWork: [
801
+ 'Add CLI-rendered or artifact-traced Simple FPS, platform shooter, arena brawler, nav agents, animator, KCC playground, vehicle, and waiting-room samples.',
802
+ ],
803
+ referenceDocs: [
804
+ 'external-deterministic-engine-reference:game-samples/engine-simple-fps/overview',
805
+ 'external-deterministic-engine-reference:technical-samples/asteroids/overview',
806
+ ],
807
+ },
808
+ {
809
+ id: 'browser-sdk-boundary',
810
+ system: 'Browser and SDK boundary',
811
+ engineExpectation: 'Engine core is consumable from SDK/browser-safe subpaths, with Node-only tooling excluded and browser replay proofs required.',
812
+ status: 'implemented',
813
+ requiredForCliParity: true,
814
+ canCloseWithCli: true,
815
+ currentEvidence: [
816
+ 'packages/syncplay/src/browser.ts',
817
+ 'packages/sdk/src/syncplay/index.ts',
818
+ 'packages/sdk/src/syncplay/browser.ts',
819
+ 'packages/sdk/src/syncplay/node.ts',
820
+ 'packages/sdk/tests/deterministicMultiplayer.test.ts',
821
+ ],
822
+ cliProofs: [
823
+ 'npm run lab:replay-verify-browser -- artifacts/replays/browser-proof-current.json --runtime chromium --json artifacts/certification/browser-replay-chromium-current.json',
824
+ 'cd packages/sdk && npm test -- deterministicMultiplayer.test.ts --runInBand && npm run build:sdk',
825
+ ],
826
+ gaps: [
827
+ 'Browser proof artifacts are not always present and are not yet mandatory for every parity report.',
828
+ ],
829
+ nextCliWork: [
830
+ 'Require Chromium browser replay and SDK test-app proof artifacts in static:determinism certification mode.',
831
+ ],
832
+ referenceDocs: [
833
+ 'external-deterministic-engine-reference:manual/replay',
834
+ ],
835
+ },
836
+ {
837
+ id: 'venus-r3f-production-integration',
838
+ system: 'Venus, R3F, production hosting',
839
+ engineExpectation: 'Production multiplayer transport, R3F presentation, Cloud Run room deployment, and hosted game-engine integration.',
840
+ status: 'non-goal',
841
+ requiredForCliParity: false,
842
+ canCloseWithCli: false,
843
+ currentEvidence: [
844
+ 'Explicit user scope keeps R3F presentation out of this CLI-first goal and keeps third-party game-engine work out of scope.',
845
+ ],
846
+ cliProofs: [],
847
+ gaps: [
848
+ 'Out of scope until core deterministic engine systems are fully CLI-certified.',
849
+ ],
850
+ nextCliWork: [],
851
+ referenceDocs: [
852
+ 'external-deterministic-engine-reference:engine-intro',
853
+ ],
854
+ },
855
+ {
856
+ id: 'external-engine-non-goal',
857
+ system: 'Third-party game engines',
858
+ engineExpectation: 'No integration work for third-party game engines.',
859
+ status: 'non-goal',
860
+ requiredForCliParity: false,
861
+ canCloseWithCli: false,
862
+ currentEvidence: [
863
+ 'Working with third-party game engines is explicitly not a goal.',
864
+ ],
865
+ cliProofs: [],
866
+ gaps: [
867
+ 'No third-party game-engine work should be done for this goal.',
868
+ ],
869
+ nextCliWork: [],
870
+ referenceDocs: [
871
+ 'external-deterministic-engine-reference:engine-intro',
872
+ ],
873
+ },
874
+ ];