@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.
- package/README.md +610 -0
- package/dist/animation.d.ts +119 -0
- package/dist/animation.js +488 -0
- package/dist/asset-cooking.d.ts +82 -0
- package/dist/asset-cooking.js +364 -0
- package/dist/authority-room.d.ts +217 -0
- package/dist/authority-room.js +701 -0
- package/dist/bot-documents.d.ts +115 -0
- package/dist/bot-documents.js +549 -0
- package/dist/bot-primitives.d.ts +152 -0
- package/dist/bot-primitives.js +472 -0
- package/dist/browser.d.ts +57 -0
- package/dist/browser.js +53 -0
- package/dist/canonical.d.ts +12 -0
- package/dist/canonical.js +288 -0
- package/dist/certification.d.ts +455 -0
- package/dist/certification.js +1855 -0
- package/dist/chaos-certification.d.ts +56 -0
- package/dist/chaos-certification.js +1397 -0
- package/dist/cjs/animation.js +495 -0
- package/dist/cjs/asset-cooking.js +372 -0
- package/dist/cjs/authority-room.js +704 -0
- package/dist/cjs/bot-documents.js +556 -0
- package/dist/cjs/bot-primitives.js +482 -0
- package/dist/cjs/browser.js +96 -0
- package/dist/cjs/canonical.js +299 -0
- package/dist/cjs/certification.js +1860 -0
- package/dist/cjs/chaos-certification.js +1402 -0
- package/dist/cjs/collections.js +36 -0
- package/dist/cjs/collision.js +96 -0
- package/dist/cjs/commands.js +987 -0
- package/dist/cjs/config-bundle.js +491 -0
- package/dist/cjs/creator.js +30 -0
- package/dist/cjs/deterministic-primitives.js +134 -0
- package/dist/cjs/deterministic-session.js +1410 -0
- package/dist/cjs/ecs-lite.js +155 -0
- package/dist/cjs/effects-adapter.js +97 -0
- package/dist/cjs/engine-complete.js +2297 -0
- package/dist/cjs/engine-core-proof.js +70 -0
- package/dist/cjs/engine-parity-matrix.js +874 -0
- package/dist/cjs/engine-parity.js +3183 -0
- package/dist/cjs/engine-runtime.js +3141 -0
- package/dist/cjs/errors.js +22 -0
- package/dist/cjs/events.js +247 -0
- package/dist/cjs/examples/counter-duel.js +157 -0
- package/dist/cjs/examples/fixed-arena.js +368 -0
- package/dist/cjs/index.js +229 -0
- package/dist/cjs/input-authority.js +150 -0
- package/dist/cjs/input-button.js +256 -0
- package/dist/cjs/input-timeline.js +418 -0
- package/dist/cjs/instant-replay.js +66 -0
- package/dist/cjs/lag-compensation3d.js +837 -0
- package/dist/cjs/local-authority-server-runner.js +1121 -0
- package/dist/cjs/local-authority-wire.js +1497 -0
- package/dist/cjs/local-authority.js +817 -0
- package/dist/cjs/local-ws-adapter.js +150 -0
- package/dist/cjs/match-log.js +61 -0
- package/dist/cjs/math.js +157 -0
- package/dist/cjs/mock-network-adapter.js +26 -0
- package/dist/cjs/movement.js +703 -0
- package/dist/cjs/movement3d.js +1246 -0
- package/dist/cjs/multiclient-authority.js +308 -0
- package/dist/cjs/multiplayer-service.js +434 -0
- package/dist/cjs/navigation.js +347 -0
- package/dist/cjs/navmesh.js +1437 -0
- package/dist/cjs/networked-client.js +691 -0
- package/dist/cjs/networked-input-authority.js +443 -0
- package/dist/cjs/node.js +47 -0
- package/dist/cjs/number-lab.js +78 -0
- package/dist/cjs/offline-session.js +370 -0
- package/dist/cjs/package.json +1 -0
- package/dist/cjs/pause-resume.js +43 -0
- package/dist/cjs/physics-cert.js +426 -0
- package/dist/cjs/physics2d.js +751 -0
- package/dist/cjs/physics3d.js +1996 -0
- package/dist/cjs/prediction-culling.js +203 -0
- package/dist/cjs/protocol-lab.js +1299 -0
- package/dist/cjs/r3f-render-adapter.js +209 -0
- package/dist/cjs/random.js +59 -0
- package/dist/cjs/replay-bundle.js +1598 -0
- package/dist/cjs/replay-inspect.js +236 -0
- package/dist/cjs/replay-scoring.js +68 -0
- package/dist/cjs/replay.js +356 -0
- package/dist/cjs/reports.js +181 -0
- package/dist/cjs/rollback-history.js +251 -0
- package/dist/cjs/runtime-guards.js +111 -0
- package/dist/cjs/sample-lab.js +145 -0
- package/dist/cjs/sample-scenes.js +752 -0
- package/dist/cjs/schema-artifacts.js +359 -0
- package/dist/cjs/schema-codegen.js +544 -0
- package/dist/cjs/schema-dsl-binary.js +655 -0
- package/dist/cjs/schema.js +319 -0
- package/dist/cjs/sdk-offline.js +99 -0
- package/dist/cjs/session-promotion.js +74 -0
- package/dist/cjs/session-snapshot.js +265 -0
- package/dist/cjs/session-wire.js +216 -0
- package/dist/cjs/signals.js +103 -0
- package/dist/cjs/sparse-set.js +169 -0
- package/dist/cjs/synctest.js +136 -0
- package/dist/cjs/system-lifecycle.js +286 -0
- package/dist/cjs/timers.js +61 -0
- package/dist/cjs/tools/static-checker.js +1468 -0
- package/dist/cjs/types.js +2 -0
- package/dist/cjs/venus-mp-budget.js +125 -0
- package/dist/cjs/ws-frame.js +255 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +11379 -0
- package/dist/collections.d.ts +9 -0
- package/dist/collections.js +30 -0
- package/dist/collision.d.ts +25 -0
- package/dist/collision.js +85 -0
- package/dist/commands.d.ts +137 -0
- package/dist/commands.js +977 -0
- package/dist/config-bundle.d.ts +89 -0
- package/dist/config-bundle.js +483 -0
- package/dist/creator.d.ts +20 -0
- package/dist/creator.js +11 -0
- package/dist/deterministic-primitives.d.ts +59 -0
- package/dist/deterministic-primitives.js +126 -0
- package/dist/deterministic-session.d.ts +197 -0
- package/dist/deterministic-session.js +1401 -0
- package/dist/ecs-lite.d.ts +26 -0
- package/dist/ecs-lite.js +152 -0
- package/dist/effects-adapter.d.ts +21 -0
- package/dist/effects-adapter.js +94 -0
- package/dist/engine-complete.d.ts +45 -0
- package/dist/engine-complete.js +2292 -0
- package/dist/engine-core-proof.d.ts +26 -0
- package/dist/engine-core-proof.js +66 -0
- package/dist/engine-parity-matrix.d.ts +300 -0
- package/dist/engine-parity-matrix.js +869 -0
- package/dist/engine-parity.d.ts +74 -0
- package/dist/engine-parity.js +3178 -0
- package/dist/engine-runtime.d.ts +351 -0
- package/dist/engine-runtime.js +3123 -0
- package/dist/errors.d.ts +11 -0
- package/dist/errors.js +17 -0
- package/dist/events.d.ts +45 -0
- package/dist/events.js +242 -0
- package/dist/examples/counter-duel.d.ts +43 -0
- package/dist/examples/counter-duel.js +150 -0
- package/dist/examples/fixed-arena.d.ts +110 -0
- package/dist/examples/fixed-arena.js +356 -0
- package/dist/index.d.ts +101 -0
- package/dist/index.js +66 -0
- package/dist/input-authority.d.ts +82 -0
- package/dist/input-authority.js +147 -0
- package/dist/input-button.d.ts +36 -0
- package/dist/input-button.js +249 -0
- package/dist/input-timeline.d.ts +65 -0
- package/dist/input-timeline.js +412 -0
- package/dist/instant-replay.d.ts +59 -0
- package/dist/instant-replay.js +62 -0
- package/dist/lag-compensation3d.d.ts +146 -0
- package/dist/lag-compensation3d.js +827 -0
- package/dist/local-authority-server-runner.d.ts +79 -0
- package/dist/local-authority-server-runner.js +1118 -0
- package/dist/local-authority-wire.d.ts +142 -0
- package/dist/local-authority-wire.js +1477 -0
- package/dist/local-authority.d.ts +160 -0
- package/dist/local-authority.js +810 -0
- package/dist/local-ws-adapter.d.ts +14 -0
- package/dist/local-ws-adapter.js +146 -0
- package/dist/match-log.d.ts +74 -0
- package/dist/match-log.js +57 -0
- package/dist/math.d.ts +41 -0
- package/dist/math.js +154 -0
- package/dist/mock-network-adapter.d.ts +13 -0
- package/dist/mock-network-adapter.js +23 -0
- package/dist/movement.d.ts +155 -0
- package/dist/movement.js +694 -0
- package/dist/movement3d.d.ts +195 -0
- package/dist/movement3d.js +1238 -0
- package/dist/multiclient-authority.d.ts +30 -0
- package/dist/multiclient-authority.js +305 -0
- package/dist/multiplayer-service.d.ts +153 -0
- package/dist/multiplayer-service.js +429 -0
- package/dist/navigation.d.ts +91 -0
- package/dist/navigation.js +338 -0
- package/dist/navmesh.d.ts +236 -0
- package/dist/navmesh.js +1423 -0
- package/dist/networked-client.d.ts +124 -0
- package/dist/networked-client.js +688 -0
- package/dist/networked-input-authority.d.ts +51 -0
- package/dist/networked-input-authority.js +439 -0
- package/dist/node.d.ts +22 -0
- package/dist/node.js +19 -0
- package/dist/number-lab.d.ts +15 -0
- package/dist/number-lab.js +75 -0
- package/dist/offline-session.d.ts +2 -0
- package/dist/offline-session.js +367 -0
- package/dist/pause-resume.d.ts +48 -0
- package/dist/pause-resume.js +40 -0
- package/dist/physics-cert.d.ts +40 -0
- package/dist/physics-cert.js +389 -0
- package/dist/physics2d.d.ts +142 -0
- package/dist/physics2d.js +741 -0
- package/dist/physics3d.d.ts +285 -0
- package/dist/physics3d.js +1979 -0
- package/dist/prediction-culling.d.ts +34 -0
- package/dist/prediction-culling.js +200 -0
- package/dist/protocol-lab.d.ts +115 -0
- package/dist/protocol-lab.js +1295 -0
- package/dist/r3f-render-adapter.d.ts +61 -0
- package/dist/r3f-render-adapter.js +203 -0
- package/dist/random.d.ts +13 -0
- package/dist/random.js +55 -0
- package/dist/replay-bundle.d.ts +150 -0
- package/dist/replay-bundle.js +1586 -0
- package/dist/replay-inspect.d.ts +60 -0
- package/dist/replay-inspect.js +228 -0
- package/dist/replay-scoring.d.ts +28 -0
- package/dist/replay-scoring.js +65 -0
- package/dist/replay.d.ts +17 -0
- package/dist/replay.js +351 -0
- package/dist/reports.d.ts +176 -0
- package/dist/reports.js +174 -0
- package/dist/rollback-history.d.ts +46 -0
- package/dist/rollback-history.js +247 -0
- package/dist/runtime-guards.d.ts +1 -0
- package/dist/runtime-guards.js +108 -0
- package/dist/sample-lab.d.ts +32 -0
- package/dist/sample-lab.js +134 -0
- package/dist/sample-scenes.d.ts +86 -0
- package/dist/sample-scenes.js +745 -0
- package/dist/schema-artifacts.d.ts +49 -0
- package/dist/schema-artifacts.js +356 -0
- package/dist/schema-codegen.d.ts +21 -0
- package/dist/schema-codegen.js +538 -0
- package/dist/schema-dsl-binary.d.ts +75 -0
- package/dist/schema-dsl-binary.js +648 -0
- package/dist/schema.d.ts +87 -0
- package/dist/schema.js +315 -0
- package/dist/sdk-offline.d.ts +34 -0
- package/dist/sdk-offline.js +96 -0
- package/dist/session-promotion.d.ts +26 -0
- package/dist/session-promotion.js +70 -0
- package/dist/session-snapshot.d.ts +95 -0
- package/dist/session-snapshot.js +255 -0
- package/dist/session-wire.d.ts +89 -0
- package/dist/session-wire.js +211 -0
- package/dist/signals.d.ts +31 -0
- package/dist/signals.js +99 -0
- package/dist/sparse-set.d.ts +34 -0
- package/dist/sparse-set.js +165 -0
- package/dist/synctest.d.ts +31 -0
- package/dist/synctest.js +133 -0
- package/dist/system-lifecycle.d.ts +72 -0
- package/dist/system-lifecycle.js +281 -0
- package/dist/timers.d.ts +17 -0
- package/dist/timers.js +53 -0
- package/dist/tools/index.d.ts +4 -0
- package/dist/tools/index.js +4 -0
- package/dist/tools/static-checker.d.ts +31 -0
- package/dist/tools/static-checker.js +1462 -0
- package/dist/tools/vite-plugin.d.ts +69 -0
- package/dist/tools/vite-plugin.js +203 -0
- package/dist/types.d.ts +148 -0
- package/dist/types.js +1 -0
- package/dist/venus-mp-budget.d.ts +29 -0
- package/dist/venus-mp-budget.js +122 -0
- package/dist/ws-frame.d.ts +49 -0
- package/dist/ws-frame.js +247 -0
- 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
|
+
];
|