miaoda-game-devkit 0.7.1 → 0.7.3

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.
@@ -0,0 +1,3367 @@
1
+ {
2
+ "$schema": "./game-mechanics-capabilities.schema.json",
3
+ "schemaVersion": 1,
4
+ "requiredPackages": [
5
+ "miaoda-game-arcade-motion-core",
6
+ "miaoda-game-adventure-interaction-cocos",
7
+ "miaoda-game-adventure-interaction-core",
8
+ "miaoda-game-adventure-interaction-phaser",
9
+ "miaoda-game-adventure-interaction-react",
10
+ "miaoda-game-adventure-scenario-bridge-core",
11
+ "miaoda-game-command-cocos",
12
+ "miaoda-game-command-core",
13
+ "miaoda-game-command-phaser",
14
+ "miaoda-game-command-react",
15
+ "miaoda-game-contact2d-core",
16
+ "miaoda-game-controls-phaser",
17
+ "miaoda-game-expression-core",
18
+ "miaoda-game-fighter-cocos",
19
+ "miaoda-game-fighter-core",
20
+ "miaoda-game-fixed-step-core",
21
+ "miaoda-game-grid-core",
22
+ "miaoda-game-investigation-core",
23
+ "miaoda-game-kinematic2d-core",
24
+ "miaoda-game-objective-core",
25
+ "miaoda-game-objective-phaser",
26
+ "miaoda-game-objective-react",
27
+ "miaoda-game-platformer-core",
28
+ "miaoda-game-platformer-kinematic-core",
29
+ "miaoda-game-quest-core",
30
+ "miaoda-game-quest-react",
31
+ "miaoda-game-save-core",
32
+ "miaoda-game-save-react",
33
+ "miaoda-game-scenario-cocos",
34
+ "miaoda-game-scenario-core",
35
+ "miaoda-game-scenario-phaser",
36
+ "miaoda-game-scenario-react",
37
+ "miaoda-game-scheduler-core",
38
+ "miaoda-game-sokoban-core",
39
+ "miaoda-game-topdown-vehicle-core",
40
+ "miaoda-game-mcr-mahjong-analysis-core",
41
+ "miaoda-game-mcr-mahjong-react",
42
+ "miaoda-game-mcr-mahjong-rules",
43
+ "miaoda-game-mcr-mahjong-session-core",
44
+ "miaoda-game-mcr-mahjong-strategy-core",
45
+ "miaoda-game-big-two-rules",
46
+ "miaoda-game-big-two-react",
47
+ "miaoda-game-blackjack-rules",
48
+ "miaoda-game-blackjack-react",
49
+ "miaoda-game-bridge-rules",
50
+ "miaoda-game-bridge-react",
51
+ "miaoda-game-canasta-rules",
52
+ "miaoda-game-canasta-react",
53
+ "miaoda-game-crazy-eights-rules",
54
+ "miaoda-game-crazy-eights-react",
55
+ "miaoda-game-dou-dizhu-rules",
56
+ "miaoda-game-dou-dizhu-react",
57
+ "miaoda-game-euchre-rules",
58
+ "miaoda-game-euchre-react",
59
+ "miaoda-game-gin-rummy-rules",
60
+ "miaoda-game-gin-rummy-react",
61
+ "miaoda-game-gong-zhu-rules",
62
+ "miaoda-game-gong-zhu-react",
63
+ "miaoda-game-gou-ji-rules",
64
+ "miaoda-game-gou-ji-react",
65
+ "miaoda-game-guandan-rules",
66
+ "miaoda-game-guandan-react",
67
+ "miaoda-game-hearts-rules",
68
+ "miaoda-game-hearts-react",
69
+ "miaoda-game-paodekuai-rules",
70
+ "miaoda-game-paodekuai-react",
71
+ "miaoda-game-spades-rules",
72
+ "miaoda-game-spades-react",
73
+ "miaoda-game-texas-holdem-rules",
74
+ "miaoda-game-texas-holdem-react",
75
+ "miaoda-game-thirteen-water-rules",
76
+ "miaoda-game-thirteen-water-react",
77
+ "miaoda-game-tractor-rules",
78
+ "miaoda-game-tractor-react",
79
+ "miaoda-game-zha-jinhua-rules",
80
+ "miaoda-game-zha-jinhua-react",
81
+ "miaoda-game-bridge-strategy-core",
82
+ "miaoda-game-canasta-analysis-core",
83
+ "miaoda-game-gou-ji-analysis-core",
84
+ "miaoda-game-guandan-analysis-core",
85
+ "miaoda-game-thirteen-water-analysis-core",
86
+ "miaoda-game-bridge-tournament-core",
87
+ "miaoda-game-bridge-tournament-react",
88
+ "miaoda-game-meld-core",
89
+ "miaoda-game-trick-taking-core",
90
+ "miaoda-game-deck-core",
91
+ "miaoda-game-deck-cocos",
92
+ "miaoda-game-deck-phaser",
93
+ "miaoda-game-deck-react",
94
+ "miaoda-game-deckbuilder-core",
95
+ "miaoda-game-draft-pool-core",
96
+ "miaoda-game-draft-pool-react",
97
+ "miaoda-game-grid-cocos",
98
+ "miaoda-game-grid-phaser",
99
+ "miaoda-game-grid-react",
100
+ "miaoda-game-grid-piece-core",
101
+ "miaoda-game-grid-piece-react",
102
+ "miaoda-game-turn-core",
103
+ "miaoda-game-turn-cocos",
104
+ "miaoda-game-turn-phaser",
105
+ "miaoda-game-turn-react",
106
+ "miaoda-game-sports-ball-core",
107
+ "miaoda-game-road-core",
108
+ "miaoda-game-road-cocos",
109
+ "miaoda-game-road-phaser",
110
+ "miaoda-game-pinball-core",
111
+ "miaoda-game-pinball-cocos",
112
+ "miaoda-game-pinball-phaser",
113
+ "miaoda-game-score-core",
114
+ "miaoda-game-score-phaser",
115
+ "miaoda-game-score-react",
116
+ "miaoda-game-roster-core",
117
+ "miaoda-game-roster-react",
118
+ "miaoda-game-ballistics-core",
119
+ "miaoda-game-mode7-core",
120
+ "miaoda-game-tractor-analysis-core"
121
+ ],
122
+ "packages": {
123
+ "miaoda-game-arcade-motion-core": {
124
+ "engine": "neutral",
125
+ "domains": ["input", "motion", "racing"],
126
+ "owns": ["forward-advance-motion", "lateral-steering-motion"],
127
+ "doesNotOwn": ["collision", "rendering", "input-device-mapping"],
128
+ "compatibleWith": [],
129
+ "useInsteadWhen": [],
130
+ "persistence": "none",
131
+ "testability": {
132
+ "observation": "snapshot",
133
+ "advance": "update",
134
+ "methods": { "observe": "snapshot()", "advance": "update(dt, input, curve?)" }
135
+ }
136
+ },
137
+ "miaoda-game-adventure-interaction-cocos": {
138
+ "engine": "cocos",
139
+ "domains": ["adventure", "narrative"],
140
+ "owns": ["cocos-adventure-lifecycle", "cocos-adventure-projection"],
141
+ "doesNotOwn": ["adventure-rules", "dialogue-flow", "rendering-assets"],
142
+ "compatibleWith": ["miaoda-game-adventure-interaction-core"],
143
+ "useInsteadWhen": [
144
+ {
145
+ "package": "miaoda-game-adventure-interaction-core",
146
+ "condition": "The host does not use Cocos Creator."
147
+ }
148
+ ],
149
+ "persistence": "delegated"
150
+ },
151
+ "miaoda-game-adventure-interaction-core": {
152
+ "engine": "neutral",
153
+ "domains": ["adventure", "narrative"],
154
+ "owns": [
155
+ "adventure-action-legality",
156
+ "adventure-state-transitions",
157
+ "adventure-content-analysis",
158
+ "adventure-goal-path-witnesses",
159
+ "adventure-goal-assertions",
160
+ "adventure-goal-path-contracts",
161
+ "adventure-softlock-analysis",
162
+ "adventure-validation-manifests",
163
+ "adventure-ending-analysis"
164
+ ],
165
+ "doesNotOwn": ["dialogue-flow", "quest-progress", "rendering"],
166
+ "compatibleWith": [
167
+ "miaoda-game-adventure-interaction-cocos",
168
+ "miaoda-game-adventure-interaction-phaser",
169
+ "miaoda-game-adventure-interaction-react",
170
+ "miaoda-game-adventure-scenario-bridge-core",
171
+ "miaoda-game-investigation-core"
172
+ ],
173
+ "useInsteadWhen": [
174
+ {
175
+ "package": "miaoda-game-scenario-core",
176
+ "condition": "The content is primarily linear or branching dialogue rather than world verb/target interactions."
177
+ }
178
+ ],
179
+ "persistence": "snapshot",
180
+ "testability": {
181
+ "observation": "snapshot-and-result",
182
+ "advance": "command",
183
+ "methods": {
184
+ "observe": "snapshot(), dispatch(...), combine(...) results",
185
+ "advance": "dispatch(request), combine(a, b)"
186
+ }
187
+ }
188
+ },
189
+ "miaoda-game-adventure-interaction-phaser": {
190
+ "engine": "phaser",
191
+ "domains": ["adventure", "narrative"],
192
+ "owns": ["phaser-adventure-lifecycle", "phaser-adventure-projection"],
193
+ "doesNotOwn": ["adventure-rules", "dialogue-flow", "rendering-assets"],
194
+ "compatibleWith": ["miaoda-game-adventure-interaction-core"],
195
+ "useInsteadWhen": [
196
+ {
197
+ "package": "miaoda-game-adventure-interaction-core",
198
+ "condition": "The host does not use Phaser."
199
+ }
200
+ ],
201
+ "persistence": "delegated"
202
+ },
203
+ "miaoda-game-adventure-interaction-react": {
204
+ "engine": "react",
205
+ "domains": ["adventure", "narrative"],
206
+ "owns": ["react-adventure-controller", "react-adventure-projection"],
207
+ "doesNotOwn": ["adventure-rules", "dialogue-flow", "dom-layout"],
208
+ "compatibleWith": ["miaoda-game-adventure-interaction-core"],
209
+ "useInsteadWhen": [
210
+ {
211
+ "package": "miaoda-game-adventure-interaction-core",
212
+ "condition": "The host does not need React subscriptions or controller projection."
213
+ }
214
+ ],
215
+ "persistence": "delegated"
216
+ },
217
+ "miaoda-game-adventure-scenario-bridge-core": {
218
+ "engine": "neutral",
219
+ "domains": ["adventure", "narrative"],
220
+ "owns": ["adventure-scenario-command-binding", "cross-content-binding-analysis"],
221
+ "doesNotOwn": ["adventure-state", "scenario-flow", "command-execution"],
222
+ "compatibleWith": ["miaoda-game-adventure-interaction-core", "miaoda-game-scenario-core"],
223
+ "useInsteadWhen": [],
224
+ "persistence": "none"
225
+ },
226
+ "miaoda-game-command-cocos": {
227
+ "engine": "cocos",
228
+ "domains": ["command", "narrative"],
229
+ "owns": ["cocos-command-lifecycle"],
230
+ "doesNotOwn": ["command-semantics", "scenario-flow", "rendering"],
231
+ "compatibleWith": ["miaoda-game-command-core"],
232
+ "useInsteadWhen": [
233
+ {
234
+ "package": "miaoda-game-command-core",
235
+ "condition": "The host does not use Cocos Creator."
236
+ }
237
+ ],
238
+ "persistence": "delegated"
239
+ },
240
+ "miaoda-game-command-core": {
241
+ "engine": "neutral",
242
+ "domains": ["command", "orchestration"],
243
+ "owns": ["atomic-command-application", "command-preview", "command-replay"],
244
+ "doesNotOwn": ["dialogue-authoring", "input-dispatch", "domain-rules"],
245
+ "compatibleWith": [
246
+ "miaoda-game-command-cocos",
247
+ "miaoda-game-command-phaser",
248
+ "miaoda-game-command-react"
249
+ ],
250
+ "useInsteadWhen": [
251
+ {
252
+ "package": "miaoda-game-scenario-core",
253
+ "condition": "The requirement is authored branching story flow rather than atomic cross-system commands."
254
+ }
255
+ ],
256
+ "persistence": "snapshot",
257
+ "testability": {
258
+ "observation": "snapshot-and-result",
259
+ "advance": "command",
260
+ "methods": {
261
+ "observe": "state(), dispatch(...) result",
262
+ "advance": "dispatch(command, options?)"
263
+ }
264
+ }
265
+ },
266
+ "miaoda-game-command-phaser": {
267
+ "engine": "phaser",
268
+ "domains": ["command", "orchestration"],
269
+ "owns": ["phaser-command-lifecycle"],
270
+ "doesNotOwn": ["command-semantics", "scenario-flow", "rendering"],
271
+ "compatibleWith": ["miaoda-game-command-core"],
272
+ "useInsteadWhen": [
273
+ { "package": "miaoda-game-command-core", "condition": "The host does not use Phaser." }
274
+ ],
275
+ "persistence": "delegated"
276
+ },
277
+ "miaoda-game-command-react": {
278
+ "engine": "react",
279
+ "domains": ["command", "orchestration"],
280
+ "owns": ["react-command-controller", "react-command-projection"],
281
+ "doesNotOwn": ["command-semantics", "scenario-flow", "dom-layout"],
282
+ "compatibleWith": ["miaoda-game-command-core"],
283
+ "useInsteadWhen": [
284
+ {
285
+ "package": "miaoda-game-command-core",
286
+ "condition": "The host does not need React subscriptions or projected command views."
287
+ }
288
+ ],
289
+ "persistence": "delegated"
290
+ },
291
+ "miaoda-game-contact2d-core": {
292
+ "engine": "neutral",
293
+ "domains": ["collision", "geometry", "physics"],
294
+ "owns": [
295
+ "continuous-circle-time-of-impact",
296
+ "continuous-circle-capsule-contact",
297
+ "deterministic-contact-ordering"
298
+ ],
299
+ "doesNotOwn": [
300
+ "broadphase-indexing",
301
+ "collision-response",
302
+ "gameplay-rules",
303
+ "physics-world",
304
+ "position-integration"
305
+ ],
306
+ "compatibleWith": [
307
+ "miaoda-game-ballistics-core",
308
+ "miaoda-game-shooter-core",
309
+ "miaoda-game-sports-ball-core"
310
+ ],
311
+ "useInsteadWhen": [
312
+ {
313
+ "package": "miaoda-game-targeting2d-core",
314
+ "condition": "The game needs current-frame area filtering or spatial indexing rather than time of impact."
315
+ },
316
+ {
317
+ "package": "miaoda-game-kinematic2d-core",
318
+ "condition": "The game needs position-owning swept-AABB movement and collision response."
319
+ }
320
+ ],
321
+ "persistence": "none",
322
+ "testability": {
323
+ "observation": "return-value",
324
+ "advance": "none",
325
+ "methods": {
326
+ "observe": "sweepCircles(...), sweepCircleCapsule(...), sortContacts(...)",
327
+ "advance": "sweepCircles(...)"
328
+ }
329
+ }
330
+ },
331
+ "miaoda-game-controls-phaser": {
332
+ "engine": "phaser",
333
+ "domains": ["controls", "input", "joystick"],
334
+ "owns": ["logical-input-normalization", "device-input-lifecycle"],
335
+ "doesNotOwn": ["game-rules", "simulation-clock", "rendering"],
336
+ "compatibleWith": ["miaoda-game-fixed-step-core"],
337
+ "useInsteadWhen": [],
338
+ "persistence": "none",
339
+ "testability": {
340
+ "observation": "axis-and-actions",
341
+ "advance": "update",
342
+ "methods": { "observe": "axis(name), action(name)", "advance": "update()" }
343
+ }
344
+ },
345
+ "miaoda-game-expression-core": {
346
+ "engine": "neutral",
347
+ "domains": ["authoring", "narrative"],
348
+ "owns": ["pure-expression-compilation", "pure-expression-evaluation"],
349
+ "doesNotOwn": ["effects", "scenario-flow", "state-mutation"],
350
+ "compatibleWith": ["miaoda-game-scenario-core"],
351
+ "useInsteadWhen": [],
352
+ "persistence": "none"
353
+ },
354
+ "miaoda-game-fixed-step-core": {
355
+ "engine": "neutral",
356
+ "domains": ["input", "simulation", "time"],
357
+ "owns": ["fixed-tick-advancement", "logical-input-buffer", "logical-input-tape"],
358
+ "doesNotOwn": ["game-rules", "physics", "rendering", "wall-clock-scheduling"],
359
+ "compatibleWith": ["miaoda-game-controls-phaser"],
360
+ "useInsteadWhen": [],
361
+ "persistence": "none",
362
+ "testability": {
363
+ "observation": "snapshot-and-step-result",
364
+ "advance": "step",
365
+ "methods": { "observe": "snapshot", "advance": "step(count, callback)" }
366
+ }
367
+ },
368
+ "miaoda-game-grid-core": {
369
+ "engine": "neutral",
370
+ "domains": ["grid", "pathfinding", "search"],
371
+ "owns": ["grid-pathfinding", "grid-coordinate-model"],
372
+ "doesNotOwn": ["collision", "rendering", "unit-movement"],
373
+ "compatibleWith": [],
374
+ "useInsteadWhen": [],
375
+ "persistence": "none",
376
+ "testability": {
377
+ "observation": "return-value",
378
+ "advance": "none",
379
+ "methods": { "observe": "findPathResult(...)", "advance": "findPathResult(...)" }
380
+ }
381
+ },
382
+ "miaoda-game-fighter-core": {
383
+ "engine": "neutral",
384
+ "domains": ["combat", "fighting-game", "input"],
385
+ "owns": [
386
+ "fighter-input-normalization",
387
+ "fighter-command-parsing",
388
+ "fighter-control-states",
389
+ "fighter-action-orchestration",
390
+ "fighter-hitstop-control",
391
+ "fighter-versus-resolution",
392
+ "fighter-guard-policy",
393
+ "fighter-throw-policy",
394
+ "fighter-counter-punish-policy",
395
+ "fighter-air-combo-policy",
396
+ "fighter-resource-state",
397
+ "fighter-round-flow",
398
+ "fighter-arena-roster",
399
+ "fighter-arena-input-session",
400
+ "fighter-arena-team-identity",
401
+ "fighter-arena-stock-match",
402
+ "fighter-arena-time-score-match",
403
+ "fighter-arena-team-scoring",
404
+ "fighter-arena-sudden-death-state",
405
+ "fighter-arena-target-selection",
406
+ "fighter-arena-contact-arbitration",
407
+ "fighter-arena-friendly-fire-policy",
408
+ "fighter-arena-world-rollback",
409
+ "fighter-rollback-history",
410
+ "fighter-resimulation",
411
+ "fighter-state-checksums",
412
+ "fighter-session-determinism",
413
+ "fighter-snapshots"
414
+ ],
415
+ "doesNotOwn": [
416
+ "engine-input-events",
417
+ "animation-assets",
418
+ "movement-integration",
419
+ "hitbox-resolution",
420
+ "network-transport",
421
+ "rollback-session-authority"
422
+ ],
423
+ "compatibleWith": [
424
+ "miaoda-game-action-runtime-core",
425
+ "miaoda-game-combat2d-core",
426
+ "miaoda-game-fixed-step-core",
427
+ "miaoda-game-serialization-core",
428
+ "miaoda-game-stats-core",
429
+ "miaoda-game-status-core"
430
+ ],
431
+ "useInsteadWhen": [],
432
+ "persistence": "snapshot"
433
+ },
434
+ "miaoda-game-fighter-cocos": {
435
+ "engine": "cocos",
436
+ "domains": ["combat", "fighting-game", "presentation"],
437
+ "owns": ["fighter-semantic-presentation-bridge"],
438
+ "doesNotOwn": [
439
+ "fighter-rules",
440
+ "round-authority",
441
+ "animation-assets",
442
+ "audio-assets",
443
+ "effect-assets"
444
+ ],
445
+ "compatibleWith": ["miaoda-game-fighter-core", "miaoda-game-juice-cocos"],
446
+ "useInsteadWhen": [],
447
+ "persistence": "none"
448
+ },
449
+ "miaoda-game-investigation-core": {
450
+ "engine": "neutral",
451
+ "domains": ["adventure", "investigation", "narrative"],
452
+ "owns": [
453
+ "investigation-case-compilation",
454
+ "evidence-statement-rules",
455
+ "accusation-prerequisites"
456
+ ],
457
+ "doesNotOwn": ["adventure-execution", "dialogue-flow", "rendering"],
458
+ "compatibleWith": ["miaoda-game-adventure-interaction-core"],
459
+ "useInsteadWhen": [
460
+ {
461
+ "package": "miaoda-game-adventure-interaction-core",
462
+ "condition": "The game needs general world interactions without evidence, statements, or accusations."
463
+ }
464
+ ],
465
+ "persistence": "delegated"
466
+ },
467
+ "miaoda-game-kinematic2d-core": {
468
+ "engine": "neutral",
469
+ "domains": ["collision", "motion", "physics"],
470
+ "owns": ["swept-aabb-motion", "collision-response", "contact-resolution"],
471
+ "doesNotOwn": ["gravity", "gameplay-rules", "rendering", "input-device-mapping"],
472
+ "compatibleWith": ["miaoda-game-platformer-kinematic-core"],
473
+ "useInsteadWhen": [],
474
+ "persistence": "snapshot",
475
+ "testability": {
476
+ "observation": "snapshot-and-result",
477
+ "advance": "step",
478
+ "methods": {
479
+ "observe": "snapshot",
480
+ "advance": "step(dtSeconds, requestedVelocity, world, options?)"
481
+ }
482
+ }
483
+ },
484
+ "miaoda-game-objective-core": {
485
+ "engine": "neutral",
486
+ "domains": ["objective", "progression"],
487
+ "owns": ["objective-progress", "objective-completion", "objective-persistence"],
488
+ "doesNotOwn": ["quest-stage-graphs", "dialogue-flow", "reward-granting"],
489
+ "compatibleWith": [
490
+ "miaoda-game-objective-phaser",
491
+ "miaoda-game-objective-react",
492
+ "miaoda-game-quest-core"
493
+ ],
494
+ "useInsteadWhen": [
495
+ {
496
+ "package": "miaoda-game-quest-core",
497
+ "condition": "Progress belongs to prerequisite quests, stage graphs, exclusive branches, failure, or reward claims."
498
+ }
499
+ ],
500
+ "persistence": "snapshot",
501
+ "testability": {
502
+ "observation": "snapshot-and-result",
503
+ "advance": "update",
504
+ "methods": {
505
+ "observe": "state(), snapshot",
506
+ "advance": "emit(event), tick(dtSeconds)"
507
+ }
508
+ }
509
+ },
510
+ "miaoda-game-objective-phaser": {
511
+ "engine": "phaser",
512
+ "domains": ["objective", "progression"],
513
+ "owns": ["phaser-objective-lifecycle"],
514
+ "doesNotOwn": ["objective-semantics", "quest-stage-graphs", "rendering-assets"],
515
+ "compatibleWith": ["miaoda-game-objective-core"],
516
+ "useInsteadWhen": [
517
+ { "package": "miaoda-game-objective-core", "condition": "The host does not use Phaser." }
518
+ ],
519
+ "persistence": "delegated"
520
+ },
521
+ "miaoda-game-objective-react": {
522
+ "engine": "react",
523
+ "domains": ["objective", "progression"],
524
+ "owns": ["react-objective-projection", "react-objective-subscription"],
525
+ "doesNotOwn": ["objective-semantics", "quest-stage-graphs", "dom-layout"],
526
+ "compatibleWith": ["miaoda-game-objective-core"],
527
+ "useInsteadWhen": [
528
+ {
529
+ "package": "miaoda-game-objective-core",
530
+ "condition": "The host does not need React subscriptions."
531
+ }
532
+ ],
533
+ "persistence": "delegated"
534
+ },
535
+ "miaoda-game-platformer-core": {
536
+ "engine": "neutral",
537
+ "domains": ["motion", "platformer"],
538
+ "owns": ["platformer-movement-feel", "platformer-velocity-rules"],
539
+ "doesNotOwn": [
540
+ "collision-resolution",
541
+ "position-integration",
542
+ "rendering",
543
+ "input-device-mapping"
544
+ ],
545
+ "compatibleWith": ["miaoda-game-platformer-kinematic-core"],
546
+ "useInsteadWhen": [],
547
+ "persistence": "none",
548
+ "testability": {
549
+ "observation": "step-result",
550
+ "advance": "step",
551
+ "methods": {
552
+ "observe": "step(dt, input, contacts)",
553
+ "advance": "step(dt, input, contacts)"
554
+ }
555
+ }
556
+ },
557
+ "miaoda-game-platformer-kinematic-core": {
558
+ "engine": "neutral",
559
+ "domains": ["collision", "motion", "platformer"],
560
+ "owns": ["platformer-kinematic-step", "platformer-placement-validation"],
561
+ "doesNotOwn": ["input-device-mapping", "rendering"],
562
+ "compatibleWith": ["miaoda-game-kinematic2d-core", "miaoda-game-platformer-core"],
563
+ "useInsteadWhen": [],
564
+ "persistence": "none",
565
+ "testability": {
566
+ "observation": "snapshot-and-step-result",
567
+ "advance": "step",
568
+ "methods": { "observe": "snapshot()", "advance": "step(dt, input, world)" }
569
+ }
570
+ },
571
+ "miaoda-game-quest-core": {
572
+ "engine": "neutral",
573
+ "domains": ["narrative", "progression", "quest"],
574
+ "owns": ["quest-stage-graphs", "quest-branches", "quest-reward-claims"],
575
+ "doesNotOwn": ["dialogue-decisions", "objective-algorithms", "reward-granting"],
576
+ "compatibleWith": ["miaoda-game-objective-core", "miaoda-game-quest-react"],
577
+ "useInsteadWhen": [
578
+ {
579
+ "package": "miaoda-game-objective-core",
580
+ "condition": "The requirement is one lightweight challenge or achievement without quest lifecycle."
581
+ },
582
+ {
583
+ "package": "miaoda-game-scenario-core",
584
+ "condition": "The requirement is transient branching dialogue rather than persistent quest progress."
585
+ }
586
+ ],
587
+ "persistence": "snapshot"
588
+ },
589
+ "miaoda-game-quest-react": {
590
+ "engine": "react",
591
+ "domains": ["narrative", "progression", "quest"],
592
+ "owns": ["react-quest-controller", "react-quest-projection"],
593
+ "doesNotOwn": ["quest-semantics", "dialogue-flow", "dom-layout"],
594
+ "compatibleWith": ["miaoda-game-quest-core"],
595
+ "useInsteadWhen": [
596
+ {
597
+ "package": "miaoda-game-quest-core",
598
+ "condition": "The host does not need React subscriptions or controller projection."
599
+ }
600
+ ],
601
+ "persistence": "delegated"
602
+ },
603
+ "miaoda-game-save-core": {
604
+ "engine": "neutral",
605
+ "domains": ["persistence"],
606
+ "owns": ["save-envelope-validation", "save-version-migration", "save-checksums"],
607
+ "doesNotOwn": ["storage-backends", "story-flow", "domain-state"],
608
+ "compatibleWith": ["miaoda-game-save-react"],
609
+ "useInsteadWhen": [],
610
+ "persistence": "envelope",
611
+ "testability": {
612
+ "observation": "return-value",
613
+ "advance": "none",
614
+ "methods": {
615
+ "observe": "save(state, metadata), load(envelope, state)",
616
+ "advance": "load(envelope, state)"
617
+ }
618
+ }
619
+ },
620
+ "miaoda-game-save-react": {
621
+ "engine": "react",
622
+ "domains": ["persistence"],
623
+ "owns": ["react-save-controller", "react-save-status"],
624
+ "doesNotOwn": ["storage-backends", "save-envelope-semantics", "dom-layout"],
625
+ "compatibleWith": ["miaoda-game-save-core"],
626
+ "useInsteadWhen": [
627
+ {
628
+ "package": "miaoda-game-save-core",
629
+ "condition": "The host does not need React save status and controller wiring."
630
+ }
631
+ ],
632
+ "persistence": "delegated"
633
+ },
634
+ "miaoda-game-scenario-cocos": {
635
+ "engine": "cocos",
636
+ "domains": ["dialogue", "narrative"],
637
+ "owns": ["cocos-scenario-lifecycle", "cocos-scenario-presenters"],
638
+ "doesNotOwn": ["scenario-semantics", "dialogue-layout", "storage-backends"],
639
+ "compatibleWith": ["miaoda-game-scenario-core"],
640
+ "useInsteadWhen": [
641
+ {
642
+ "package": "miaoda-game-scenario-core",
643
+ "condition": "The host does not use Cocos Creator."
644
+ }
645
+ ],
646
+ "persistence": "delegated"
647
+ },
648
+ "miaoda-game-scenario-core": {
649
+ "engine": "neutral",
650
+ "domains": ["dialogue", "narrative"],
651
+ "owns": ["branching-scenario-flow", "scenario-memory", "scenario-choice-checkpoints"],
652
+ "doesNotOwn": ["quest-progress", "world-interactions", "rendering"],
653
+ "compatibleWith": [
654
+ "miaoda-game-expression-core",
655
+ "miaoda-game-scenario-cocos",
656
+ "miaoda-game-scenario-phaser",
657
+ "miaoda-game-scenario-react"
658
+ ],
659
+ "useInsteadWhen": [
660
+ {
661
+ "package": "miaoda-game-quest-core",
662
+ "condition": "The requirement is persistent quest stages, prerequisites, failure, or reward claims."
663
+ },
664
+ {
665
+ "package": "miaoda-game-adventure-interaction-core",
666
+ "condition": "The requirement is executable world verb/target/item/topic interactions."
667
+ }
668
+ ],
669
+ "persistence": "snapshot"
670
+ },
671
+ "miaoda-game-scenario-phaser": {
672
+ "engine": "phaser",
673
+ "domains": ["dialogue", "narrative"],
674
+ "owns": ["phaser-scenario-lifecycle", "phaser-scenario-presenters"],
675
+ "doesNotOwn": ["scenario-semantics", "dialogue-layout", "storage-backends"],
676
+ "compatibleWith": ["miaoda-game-scenario-core"],
677
+ "useInsteadWhen": [
678
+ { "package": "miaoda-game-scenario-core", "condition": "The host does not use Phaser." }
679
+ ],
680
+ "persistence": "delegated"
681
+ },
682
+ "miaoda-game-scenario-react": {
683
+ "engine": "react",
684
+ "domains": ["dialogue", "narrative"],
685
+ "owns": ["react-scenario-controller", "react-scenario-projection"],
686
+ "doesNotOwn": ["scenario-semantics", "dom-layout", "storage-backends"],
687
+ "compatibleWith": ["miaoda-game-scenario-core"],
688
+ "useInsteadWhen": [
689
+ {
690
+ "package": "miaoda-game-scenario-core",
691
+ "condition": "The host does not need React subscriptions or controller projection."
692
+ }
693
+ ],
694
+ "persistence": "delegated"
695
+ },
696
+ "miaoda-game-scheduler-core": {
697
+ "engine": "neutral",
698
+ "domains": ["scheduler", "simulation", "time"],
699
+ "owns": ["domain-time-scheduling", "scheduled-occurrence-ordering"],
700
+ "doesNotOwn": ["command-execution", "rendering", "wall-clock-timers"],
701
+ "compatibleWith": [],
702
+ "useInsteadWhen": [],
703
+ "persistence": "snapshot",
704
+ "testability": {
705
+ "observation": "snapshot-and-result",
706
+ "advance": "scheduler",
707
+ "methods": { "observe": "snapshot", "advance": "advanceTo(target)" }
708
+ }
709
+ },
710
+ "miaoda-game-sokoban-core": {
711
+ "engine": "neutral",
712
+ "domains": ["puzzle", "rules", "search"],
713
+ "owns": ["sokoban-rule-application", "bounded-sokoban-solving"],
714
+ "doesNotOwn": ["input-device-mapping", "rendering", "clock"],
715
+ "compatibleWith": [],
716
+ "useInsteadWhen": [],
717
+ "persistence": "none",
718
+ "testability": {
719
+ "observation": "command-result",
720
+ "advance": "command",
721
+ "methods": { "observe": "applyMove(...)", "advance": "replayMoves(...)" }
722
+ }
723
+ },
724
+ "miaoda-game-topdown-vehicle-core": {
725
+ "engine": "neutral",
726
+ "domains": ["input", "motion", "vehicle"],
727
+ "owns": ["grip-drift-motion", "heading-steering", "topdown-vehicle-kinematics"],
728
+ "doesNotOwn": ["collision", "input-device-mapping", "rendering"],
729
+ "compatibleWith": [],
730
+ "useInsteadWhen": [],
731
+ "persistence": "none",
732
+ "testability": {
733
+ "observation": "snapshot",
734
+ "advance": "update",
735
+ "methods": { "observe": "snapshot()", "advance": "update(dt, input)" }
736
+ }
737
+ },
738
+ "miaoda-game-mcr-mahjong-analysis-core": {
739
+ "engine": "neutral",
740
+ "domains": [
741
+ "analysis",
742
+ "mahjong",
743
+ "tabletop"
744
+ ],
745
+ "owns": [
746
+ "mcr-hand-scoring",
747
+ "mcr-shanten-analysis",
748
+ "mcr-effective-tile-analysis",
749
+ "mcr-discard-advice"
750
+ ],
751
+ "doesNotOwn": [
752
+ "mcr-round-authority",
753
+ "mcr-legal-action-authority",
754
+ "mcr-bot-action-selection",
755
+ "mcr-session-deadlines",
756
+ "rendering"
757
+ ],
758
+ "compatibleWith": [
759
+ "miaoda-game-mcr-mahjong-react",
760
+ "miaoda-game-mcr-mahjong-rules",
761
+ "miaoda-game-mcr-mahjong-strategy-core"
762
+ ],
763
+ "useInsteadWhen": [
764
+ {
765
+ "package": "miaoda-game-mcr-mahjong-strategy-core",
766
+ "condition": "The game needs an autonomous rules-ready bot action rather than player-facing analysis or discard advice."
767
+ }
768
+ ],
769
+ "persistence": "none",
770
+ "testability": {
771
+ "observation": "return-value",
772
+ "advance": "none",
773
+ "methods": {
774
+ "observe": "analyzeMcrHand(...), analyzeMcrHandProgress(...), settleMcrWin(...) results",
775
+ "advance": "analyzeMcrHand(...)"
776
+ }
777
+ }
778
+ },
779
+ "miaoda-game-mcr-mahjong-react": {
780
+ "engine": "react",
781
+ "domains": [
782
+ "mahjong",
783
+ "react",
784
+ "tabletop"
785
+ ],
786
+ "owns": [
787
+ "react-mcr-controller-lifecycle",
788
+ "react-mcr-safe-view-subscriptions"
789
+ ],
790
+ "doesNotOwn": [
791
+ "mcr-rules",
792
+ "mcr-bot-action-selection",
793
+ "mcr-session-deadlines",
794
+ "networking",
795
+ "dom-layout"
796
+ ],
797
+ "compatibleWith": [
798
+ "miaoda-game-mcr-mahjong-analysis-core",
799
+ "miaoda-game-mcr-mahjong-rules",
800
+ "miaoda-game-mcr-mahjong-strategy-core"
801
+ ],
802
+ "useInsteadWhen": [
803
+ {
804
+ "package": "miaoda-game-mcr-mahjong-rules",
805
+ "condition": "The host does not need React controller ownership or safe-view subscriptions."
806
+ }
807
+ ],
808
+ "persistence": "delegated",
809
+ "testability": {
810
+ "observation": "snapshot-and-result",
811
+ "advance": "command",
812
+ "methods": {
813
+ "observe": "controller.view, useMcrRoundView(controller), useMcrMatchView(controller)",
814
+ "advance": "controller.dispatch(action)"
815
+ }
816
+ }
817
+ },
818
+ "miaoda-game-mcr-mahjong-rules": {
819
+ "engine": "neutral",
820
+ "domains": [
821
+ "mahjong",
822
+ "rules",
823
+ "tabletop"
824
+ ],
825
+ "owns": [
826
+ "mcr-round-authority",
827
+ "mcr-match-authority",
828
+ "mcr-legal-action-authority",
829
+ "mcr-claim-resolution",
830
+ "mcr-settlement",
831
+ "mcr-safe-player-views",
832
+ "mcr-replay-restoration"
833
+ ],
834
+ "doesNotOwn": [
835
+ "mcr-bot-action-selection",
836
+ "mcr-session-deadlines",
837
+ "react-subscriptions",
838
+ "rendering",
839
+ "networking"
840
+ ],
841
+ "compatibleWith": [
842
+ "miaoda-game-mcr-mahjong-analysis-core",
843
+ "miaoda-game-mcr-mahjong-react",
844
+ "miaoda-game-mcr-mahjong-session-core",
845
+ "miaoda-game-mcr-mahjong-strategy-core"
846
+ ],
847
+ "useInsteadWhen": [],
848
+ "persistence": "snapshot",
849
+ "testability": {
850
+ "observation": "snapshot-and-result",
851
+ "advance": "command",
852
+ "methods": {
853
+ "observe": "createMcrRoundPlayerView(state, playerId), restoreMcrRoundState(snapshot)",
854
+ "advance": "applyMcrRoundAction(state, action), applyMcrMatchAction(state, action)"
855
+ }
856
+ }
857
+ },
858
+ "miaoda-game-mcr-mahjong-session-core": {
859
+ "engine": "neutral",
860
+ "domains": [
861
+ "mahjong",
862
+ "orchestration",
863
+ "session",
864
+ "time"
865
+ ],
866
+ "owns": [
867
+ "mcr-session-deadlines",
868
+ "mcr-timeout-actions",
869
+ "mcr-idempotent-commands",
870
+ "mcr-revision-checks",
871
+ "mcr-reconnect-views"
872
+ ],
873
+ "doesNotOwn": [
874
+ "mcr-bot-action-selection",
875
+ "process-clock-selection",
876
+ "networking",
877
+ "authentication",
878
+ "storage-backends"
879
+ ],
880
+ "compatibleWith": [
881
+ "miaoda-game-mcr-mahjong-rules",
882
+ "miaoda-game-mcr-mahjong-strategy-core"
883
+ ],
884
+ "useInsteadWhen": [
885
+ {
886
+ "package": "miaoda-game-mcr-mahjong-rules",
887
+ "condition": "A local host needs only direct deterministic rule transitions without deadlines, idempotency, or reconnect state."
888
+ }
889
+ ],
890
+ "persistence": "snapshot",
891
+ "testability": {
892
+ "observation": "snapshot-and-result",
893
+ "advance": "manual",
894
+ "methods": {
895
+ "observe": "createMcrSessionPlayerView(state, playerId), validateMcrSessionState(snapshot)",
896
+ "advance": "submitMcrSessionCommand(state, command, nowMs), advanceMcrSession(state, nowMs, options)"
897
+ }
898
+ }
899
+ },
900
+ "miaoda-game-mcr-mahjong-strategy-core": {
901
+ "engine": "neutral",
902
+ "domains": [
903
+ "ai",
904
+ "mahjong",
905
+ "strategy"
906
+ ],
907
+ "owns": [
908
+ "mcr-bot-action-selection",
909
+ "mcr-bot-difficulty-policy",
910
+ "mcr-bot-deterministic-tiebreaking"
911
+ ],
912
+ "doesNotOwn": [
913
+ "mcr-round-authority",
914
+ "mcr-action-scheduling",
915
+ "mcr-session-deadlines",
916
+ "hidden-opponent-state",
917
+ "rendering"
918
+ ],
919
+ "compatibleWith": [
920
+ "miaoda-game-mcr-mahjong-analysis-core",
921
+ "miaoda-game-mcr-mahjong-react",
922
+ "miaoda-game-mcr-mahjong-rules",
923
+ "miaoda-game-mcr-mahjong-session-core"
924
+ ],
925
+ "useInsteadWhen": [
926
+ {
927
+ "package": "miaoda-game-mcr-mahjong-analysis-core",
928
+ "condition": "The product needs player-facing scoring, shanten, or discard advice but no autonomous bot action."
929
+ }
930
+ ],
931
+ "persistence": "none",
932
+ "testability": {
933
+ "observation": "return-value",
934
+ "advance": "none",
935
+ "methods": {
936
+ "observe": "chooseMcrBotDecision(view, options), chooseMcrBotAction(view, options)",
937
+ "advance": "chooseMcrBotAction(view, options)"
938
+ }
939
+ }
940
+ },
941
+ "miaoda-game-big-two-rules": {
942
+ "engine": "neutral",
943
+ "domains": [
944
+ "card-game",
945
+ "rules",
946
+ "tabletop"
947
+ ],
948
+ "owns": [
949
+ "big-two-authoritative-rules",
950
+ "big-two-legal-action-authority",
951
+ "big-two-safe-player-views",
952
+ "big-two-snapshot-validation"
953
+ ],
954
+ "doesNotOwn": [
955
+ "big-two-bot-action-selection",
956
+ "session-deadlines",
957
+ "networking",
958
+ "rendering"
959
+ ],
960
+ "compatibleWith": [
961
+ "miaoda-game-big-two-react"
962
+ ],
963
+ "useInsteadWhen": [],
964
+ "persistence": "snapshot",
965
+ "testability": {
966
+ "observation": "snapshot-and-result",
967
+ "advance": "command",
968
+ "methods": {
969
+ "observe": "createBigTwoPlayerView(state, playerId)",
970
+ "advance": "applyBigTwoAction(state, action)"
971
+ }
972
+ }
973
+ },
974
+ "miaoda-game-big-two-react": {
975
+ "engine": "react",
976
+ "domains": [
977
+ "card-game",
978
+ "react",
979
+ "tabletop"
980
+ ],
981
+ "owns": [
982
+ "react-big-two-controller-lifecycle",
983
+ "react-big-two-safe-view-subscriptions",
984
+ "react-big-two-commit-projection"
985
+ ],
986
+ "doesNotOwn": [
987
+ "big-two-authoritative-rules",
988
+ "big-two-bot-action-selection",
989
+ "session-deadlines",
990
+ "networking",
991
+ "dom-layout"
992
+ ],
993
+ "compatibleWith": [
994
+ "miaoda-game-big-two-rules"
995
+ ],
996
+ "useInsteadWhen": [
997
+ {
998
+ "package": "miaoda-game-big-two-rules",
999
+ "condition": "The host does not need React controller ownership or safe-view subscriptions."
1000
+ }
1001
+ ],
1002
+ "persistence": "delegated",
1003
+ "testability": {
1004
+ "observation": "snapshot-and-result",
1005
+ "advance": "command",
1006
+ "methods": {
1007
+ "observe": "controller.view, useBigTwoView(controller)",
1008
+ "advance": "controller.dispatch(action)"
1009
+ }
1010
+ }
1011
+ },
1012
+ "miaoda-game-blackjack-rules": {
1013
+ "engine": "neutral",
1014
+ "domains": [
1015
+ "card-game",
1016
+ "rules",
1017
+ "tabletop"
1018
+ ],
1019
+ "owns": [
1020
+ "blackjack-authoritative-rules",
1021
+ "blackjack-legal-action-authority",
1022
+ "blackjack-safe-player-views",
1023
+ "blackjack-snapshot-validation"
1024
+ ],
1025
+ "doesNotOwn": [
1026
+ "blackjack-bot-action-selection",
1027
+ "session-deadlines",
1028
+ "networking",
1029
+ "rendering"
1030
+ ],
1031
+ "compatibleWith": [
1032
+ "miaoda-game-blackjack-react"
1033
+ ],
1034
+ "useInsteadWhen": [],
1035
+ "persistence": "snapshot",
1036
+ "testability": {
1037
+ "observation": "snapshot-and-result",
1038
+ "advance": "command",
1039
+ "methods": {
1040
+ "observe": "createBlackjackPlayerView(state, playerId)",
1041
+ "advance": "applyBlackjackAction(state, action)"
1042
+ }
1043
+ }
1044
+ },
1045
+ "miaoda-game-blackjack-react": {
1046
+ "engine": "react",
1047
+ "domains": [
1048
+ "card-game",
1049
+ "react",
1050
+ "tabletop"
1051
+ ],
1052
+ "owns": [
1053
+ "react-blackjack-controller-lifecycle",
1054
+ "react-blackjack-safe-view-subscriptions",
1055
+ "react-blackjack-commit-projection"
1056
+ ],
1057
+ "doesNotOwn": [
1058
+ "blackjack-authoritative-rules",
1059
+ "blackjack-bot-action-selection",
1060
+ "session-deadlines",
1061
+ "networking",
1062
+ "dom-layout"
1063
+ ],
1064
+ "compatibleWith": [
1065
+ "miaoda-game-blackjack-rules"
1066
+ ],
1067
+ "useInsteadWhen": [
1068
+ {
1069
+ "package": "miaoda-game-blackjack-rules",
1070
+ "condition": "The host does not need React controller ownership or safe-view subscriptions."
1071
+ }
1072
+ ],
1073
+ "persistence": "delegated",
1074
+ "testability": {
1075
+ "observation": "snapshot-and-result",
1076
+ "advance": "command",
1077
+ "methods": {
1078
+ "observe": "controller.view, useBlackjackView(controller)",
1079
+ "advance": "controller.dispatch(action)"
1080
+ }
1081
+ }
1082
+ },
1083
+ "miaoda-game-bridge-rules": {
1084
+ "engine": "neutral",
1085
+ "domains": [
1086
+ "card-game",
1087
+ "rules",
1088
+ "tabletop"
1089
+ ],
1090
+ "owns": [
1091
+ "bridge-authoritative-rules",
1092
+ "bridge-legal-action-authority",
1093
+ "bridge-safe-player-views",
1094
+ "bridge-snapshot-validation"
1095
+ ],
1096
+ "doesNotOwn": [
1097
+ "bridge-bot-action-selection",
1098
+ "session-deadlines",
1099
+ "networking",
1100
+ "rendering"
1101
+ ],
1102
+ "compatibleWith": [
1103
+ "miaoda-game-bridge-react",
1104
+ "miaoda-game-bridge-strategy-core"
1105
+ ],
1106
+ "useInsteadWhen": [],
1107
+ "persistence": "snapshot",
1108
+ "testability": {
1109
+ "observation": "snapshot-and-result",
1110
+ "advance": "command",
1111
+ "methods": {
1112
+ "observe": "createBridgePlayerView(state, playerId)",
1113
+ "advance": "applyBridgeAction(state, action)"
1114
+ }
1115
+ }
1116
+ },
1117
+ "miaoda-game-bridge-react": {
1118
+ "engine": "react",
1119
+ "domains": [
1120
+ "card-game",
1121
+ "react",
1122
+ "tabletop"
1123
+ ],
1124
+ "owns": [
1125
+ "react-bridge-controller-lifecycle",
1126
+ "react-bridge-safe-view-subscriptions",
1127
+ "react-bridge-commit-projection"
1128
+ ],
1129
+ "doesNotOwn": [
1130
+ "bridge-authoritative-rules",
1131
+ "bridge-bot-action-selection",
1132
+ "session-deadlines",
1133
+ "networking",
1134
+ "dom-layout"
1135
+ ],
1136
+ "compatibleWith": [
1137
+ "miaoda-game-bridge-rules",
1138
+ "miaoda-game-bridge-strategy-core"
1139
+ ],
1140
+ "useInsteadWhen": [
1141
+ {
1142
+ "package": "miaoda-game-bridge-rules",
1143
+ "condition": "The host does not need React controller ownership or safe-view subscriptions."
1144
+ }
1145
+ ],
1146
+ "persistence": "delegated",
1147
+ "testability": {
1148
+ "observation": "snapshot-and-result",
1149
+ "advance": "command",
1150
+ "methods": {
1151
+ "observe": "controller.view, useBridgeView(controller)",
1152
+ "advance": "controller.dispatch(action)"
1153
+ }
1154
+ }
1155
+ },
1156
+ "miaoda-game-canasta-rules": {
1157
+ "engine": "neutral",
1158
+ "domains": [
1159
+ "card-game",
1160
+ "rules",
1161
+ "tabletop"
1162
+ ],
1163
+ "owns": [
1164
+ "canasta-authoritative-rules",
1165
+ "canasta-legal-action-authority",
1166
+ "canasta-safe-player-views",
1167
+ "canasta-snapshot-validation"
1168
+ ],
1169
+ "doesNotOwn": [
1170
+ "canasta-bot-action-selection",
1171
+ "session-deadlines",
1172
+ "networking",
1173
+ "rendering"
1174
+ ],
1175
+ "compatibleWith": [
1176
+ "miaoda-game-canasta-react",
1177
+ "miaoda-game-canasta-analysis-core"
1178
+ ],
1179
+ "useInsteadWhen": [],
1180
+ "persistence": "snapshot",
1181
+ "testability": {
1182
+ "observation": "snapshot-and-result",
1183
+ "advance": "command",
1184
+ "methods": {
1185
+ "observe": "createCanastaPlayerView(state, playerId)",
1186
+ "advance": "applyCanastaAction(state, action)"
1187
+ }
1188
+ }
1189
+ },
1190
+ "miaoda-game-canasta-react": {
1191
+ "engine": "react",
1192
+ "domains": [
1193
+ "card-game",
1194
+ "react",
1195
+ "tabletop"
1196
+ ],
1197
+ "owns": [
1198
+ "react-canasta-controller-lifecycle",
1199
+ "react-canasta-safe-view-subscriptions",
1200
+ "react-canasta-commit-projection"
1201
+ ],
1202
+ "doesNotOwn": [
1203
+ "canasta-authoritative-rules",
1204
+ "canasta-bot-action-selection",
1205
+ "session-deadlines",
1206
+ "networking",
1207
+ "dom-layout"
1208
+ ],
1209
+ "compatibleWith": [
1210
+ "miaoda-game-canasta-rules",
1211
+ "miaoda-game-canasta-analysis-core"
1212
+ ],
1213
+ "useInsteadWhen": [
1214
+ {
1215
+ "package": "miaoda-game-canasta-rules",
1216
+ "condition": "The host does not need React controller ownership or safe-view subscriptions."
1217
+ }
1218
+ ],
1219
+ "persistence": "delegated",
1220
+ "testability": {
1221
+ "observation": "snapshot-and-result",
1222
+ "advance": "command",
1223
+ "methods": {
1224
+ "observe": "controller.view, useCanastaView(controller)",
1225
+ "advance": "controller.dispatch(action)"
1226
+ }
1227
+ }
1228
+ },
1229
+ "miaoda-game-crazy-eights-rules": {
1230
+ "engine": "neutral",
1231
+ "domains": [
1232
+ "card-game",
1233
+ "rules",
1234
+ "tabletop"
1235
+ ],
1236
+ "owns": [
1237
+ "crazy-eights-authoritative-rules",
1238
+ "crazy-eights-legal-action-authority",
1239
+ "crazy-eights-safe-player-views",
1240
+ "crazy-eights-snapshot-validation"
1241
+ ],
1242
+ "doesNotOwn": [
1243
+ "crazy-eights-bot-action-selection",
1244
+ "session-deadlines",
1245
+ "networking",
1246
+ "rendering"
1247
+ ],
1248
+ "compatibleWith": [
1249
+ "miaoda-game-crazy-eights-react"
1250
+ ],
1251
+ "useInsteadWhen": [],
1252
+ "persistence": "snapshot",
1253
+ "testability": {
1254
+ "observation": "snapshot-and-result",
1255
+ "advance": "command",
1256
+ "methods": {
1257
+ "observe": "createCrazyEightsPlayerView(state, playerId)",
1258
+ "advance": "applyCrazyEightsAction(state, action)"
1259
+ }
1260
+ }
1261
+ },
1262
+ "miaoda-game-crazy-eights-react": {
1263
+ "engine": "react",
1264
+ "domains": [
1265
+ "card-game",
1266
+ "react",
1267
+ "tabletop"
1268
+ ],
1269
+ "owns": [
1270
+ "react-crazy-eights-controller-lifecycle",
1271
+ "react-crazy-eights-safe-view-subscriptions",
1272
+ "react-crazy-eights-commit-projection"
1273
+ ],
1274
+ "doesNotOwn": [
1275
+ "crazy-eights-authoritative-rules",
1276
+ "crazy-eights-bot-action-selection",
1277
+ "session-deadlines",
1278
+ "networking",
1279
+ "dom-layout"
1280
+ ],
1281
+ "compatibleWith": [
1282
+ "miaoda-game-crazy-eights-rules"
1283
+ ],
1284
+ "useInsteadWhen": [
1285
+ {
1286
+ "package": "miaoda-game-crazy-eights-rules",
1287
+ "condition": "The host does not need React controller ownership or safe-view subscriptions."
1288
+ }
1289
+ ],
1290
+ "persistence": "delegated",
1291
+ "testability": {
1292
+ "observation": "snapshot-and-result",
1293
+ "advance": "command",
1294
+ "methods": {
1295
+ "observe": "controller.view, useCrazyEightsView(controller)",
1296
+ "advance": "controller.dispatch(action)"
1297
+ }
1298
+ }
1299
+ },
1300
+ "miaoda-game-dou-dizhu-rules": {
1301
+ "engine": "neutral",
1302
+ "domains": [
1303
+ "card-game",
1304
+ "rules",
1305
+ "tabletop"
1306
+ ],
1307
+ "owns": [
1308
+ "dou-dizhu-authoritative-rules",
1309
+ "dou-dizhu-legal-action-authority",
1310
+ "dou-dizhu-safe-player-views",
1311
+ "dou-dizhu-snapshot-validation"
1312
+ ],
1313
+ "doesNotOwn": [
1314
+ "dou-dizhu-bot-action-selection",
1315
+ "session-deadlines",
1316
+ "networking",
1317
+ "rendering"
1318
+ ],
1319
+ "compatibleWith": [
1320
+ "miaoda-game-dou-dizhu-react"
1321
+ ],
1322
+ "useInsteadWhen": [],
1323
+ "persistence": "snapshot",
1324
+ "testability": {
1325
+ "observation": "snapshot-and-result",
1326
+ "advance": "command",
1327
+ "methods": {
1328
+ "observe": "createDouDizhuPlayerView(state, playerId)",
1329
+ "advance": "applyDouDizhuAction(state, action)"
1330
+ }
1331
+ }
1332
+ },
1333
+ "miaoda-game-dou-dizhu-react": {
1334
+ "engine": "react",
1335
+ "domains": [
1336
+ "card-game",
1337
+ "react",
1338
+ "tabletop"
1339
+ ],
1340
+ "owns": [
1341
+ "react-dou-dizhu-controller-lifecycle",
1342
+ "react-dou-dizhu-safe-view-subscriptions",
1343
+ "react-dou-dizhu-commit-projection"
1344
+ ],
1345
+ "doesNotOwn": [
1346
+ "dou-dizhu-authoritative-rules",
1347
+ "dou-dizhu-bot-action-selection",
1348
+ "session-deadlines",
1349
+ "networking",
1350
+ "dom-layout"
1351
+ ],
1352
+ "compatibleWith": [
1353
+ "miaoda-game-dou-dizhu-rules"
1354
+ ],
1355
+ "useInsteadWhen": [
1356
+ {
1357
+ "package": "miaoda-game-dou-dizhu-rules",
1358
+ "condition": "The host does not need React controller ownership or safe-view subscriptions."
1359
+ }
1360
+ ],
1361
+ "persistence": "delegated",
1362
+ "testability": {
1363
+ "observation": "snapshot-and-result",
1364
+ "advance": "command",
1365
+ "methods": {
1366
+ "observe": "controller.view, useDouDizhuView(controller)",
1367
+ "advance": "controller.dispatch(action)"
1368
+ }
1369
+ }
1370
+ },
1371
+ "miaoda-game-euchre-rules": {
1372
+ "engine": "neutral",
1373
+ "domains": [
1374
+ "card-game",
1375
+ "rules",
1376
+ "tabletop"
1377
+ ],
1378
+ "owns": [
1379
+ "euchre-authoritative-rules",
1380
+ "euchre-legal-action-authority",
1381
+ "euchre-safe-player-views",
1382
+ "euchre-snapshot-validation"
1383
+ ],
1384
+ "doesNotOwn": [
1385
+ "euchre-bot-action-selection",
1386
+ "session-deadlines",
1387
+ "networking",
1388
+ "rendering"
1389
+ ],
1390
+ "compatibleWith": [
1391
+ "miaoda-game-euchre-react"
1392
+ ],
1393
+ "useInsteadWhen": [],
1394
+ "persistence": "snapshot",
1395
+ "testability": {
1396
+ "observation": "snapshot-and-result",
1397
+ "advance": "command",
1398
+ "methods": {
1399
+ "observe": "createEuchrePlayerView(state, playerId)",
1400
+ "advance": "applyEuchreAction(state, action)"
1401
+ }
1402
+ }
1403
+ },
1404
+ "miaoda-game-euchre-react": {
1405
+ "engine": "react",
1406
+ "domains": [
1407
+ "card-game",
1408
+ "react",
1409
+ "tabletop"
1410
+ ],
1411
+ "owns": [
1412
+ "react-euchre-controller-lifecycle",
1413
+ "react-euchre-safe-view-subscriptions",
1414
+ "react-euchre-commit-projection"
1415
+ ],
1416
+ "doesNotOwn": [
1417
+ "euchre-authoritative-rules",
1418
+ "euchre-bot-action-selection",
1419
+ "session-deadlines",
1420
+ "networking",
1421
+ "dom-layout"
1422
+ ],
1423
+ "compatibleWith": [
1424
+ "miaoda-game-euchre-rules"
1425
+ ],
1426
+ "useInsteadWhen": [
1427
+ {
1428
+ "package": "miaoda-game-euchre-rules",
1429
+ "condition": "The host does not need React controller ownership or safe-view subscriptions."
1430
+ }
1431
+ ],
1432
+ "persistence": "delegated",
1433
+ "testability": {
1434
+ "observation": "snapshot-and-result",
1435
+ "advance": "command",
1436
+ "methods": {
1437
+ "observe": "controller.view, useEuchreView(controller)",
1438
+ "advance": "controller.dispatch(action)"
1439
+ }
1440
+ }
1441
+ },
1442
+ "miaoda-game-gin-rummy-rules": {
1443
+ "engine": "neutral",
1444
+ "domains": [
1445
+ "card-game",
1446
+ "rules",
1447
+ "tabletop"
1448
+ ],
1449
+ "owns": [
1450
+ "gin-rummy-authoritative-rules",
1451
+ "gin-rummy-legal-action-authority",
1452
+ "gin-rummy-safe-player-views",
1453
+ "gin-rummy-snapshot-validation"
1454
+ ],
1455
+ "doesNotOwn": [
1456
+ "gin-rummy-bot-action-selection",
1457
+ "session-deadlines",
1458
+ "networking",
1459
+ "rendering"
1460
+ ],
1461
+ "compatibleWith": [
1462
+ "miaoda-game-gin-rummy-react"
1463
+ ],
1464
+ "useInsteadWhen": [],
1465
+ "persistence": "snapshot",
1466
+ "testability": {
1467
+ "observation": "snapshot-and-result",
1468
+ "advance": "command",
1469
+ "methods": {
1470
+ "observe": "createGinRummyPlayerView(state, playerId)",
1471
+ "advance": "applyGinRummyAction(state, action)"
1472
+ }
1473
+ }
1474
+ },
1475
+ "miaoda-game-gin-rummy-react": {
1476
+ "engine": "react",
1477
+ "domains": [
1478
+ "card-game",
1479
+ "react",
1480
+ "tabletop"
1481
+ ],
1482
+ "owns": [
1483
+ "react-gin-rummy-controller-lifecycle",
1484
+ "react-gin-rummy-safe-view-subscriptions",
1485
+ "react-gin-rummy-commit-projection"
1486
+ ],
1487
+ "doesNotOwn": [
1488
+ "gin-rummy-authoritative-rules",
1489
+ "gin-rummy-bot-action-selection",
1490
+ "session-deadlines",
1491
+ "networking",
1492
+ "dom-layout"
1493
+ ],
1494
+ "compatibleWith": [
1495
+ "miaoda-game-gin-rummy-rules"
1496
+ ],
1497
+ "useInsteadWhen": [
1498
+ {
1499
+ "package": "miaoda-game-gin-rummy-rules",
1500
+ "condition": "The host does not need React controller ownership or safe-view subscriptions."
1501
+ }
1502
+ ],
1503
+ "persistence": "delegated",
1504
+ "testability": {
1505
+ "observation": "snapshot-and-result",
1506
+ "advance": "command",
1507
+ "methods": {
1508
+ "observe": "controller.view, useGinRummyView(controller)",
1509
+ "advance": "controller.dispatch(action)"
1510
+ }
1511
+ }
1512
+ },
1513
+ "miaoda-game-gong-zhu-rules": {
1514
+ "engine": "neutral",
1515
+ "domains": [
1516
+ "card-game",
1517
+ "rules",
1518
+ "tabletop"
1519
+ ],
1520
+ "owns": [
1521
+ "gong-zhu-authoritative-rules",
1522
+ "gong-zhu-legal-action-authority",
1523
+ "gong-zhu-safe-player-views",
1524
+ "gong-zhu-snapshot-validation"
1525
+ ],
1526
+ "doesNotOwn": [
1527
+ "gong-zhu-bot-action-selection",
1528
+ "session-deadlines",
1529
+ "networking",
1530
+ "rendering"
1531
+ ],
1532
+ "compatibleWith": [
1533
+ "miaoda-game-gong-zhu-react"
1534
+ ],
1535
+ "useInsteadWhen": [],
1536
+ "persistence": "snapshot",
1537
+ "testability": {
1538
+ "observation": "snapshot-and-result",
1539
+ "advance": "command",
1540
+ "methods": {
1541
+ "observe": "createGongZhuPlayerView(state, playerId)",
1542
+ "advance": "applyGongZhuAction(state, action)"
1543
+ }
1544
+ }
1545
+ },
1546
+ "miaoda-game-gong-zhu-react": {
1547
+ "engine": "react",
1548
+ "domains": [
1549
+ "card-game",
1550
+ "react",
1551
+ "tabletop"
1552
+ ],
1553
+ "owns": [
1554
+ "react-gong-zhu-controller-lifecycle",
1555
+ "react-gong-zhu-safe-view-subscriptions",
1556
+ "react-gong-zhu-commit-projection"
1557
+ ],
1558
+ "doesNotOwn": [
1559
+ "gong-zhu-authoritative-rules",
1560
+ "gong-zhu-bot-action-selection",
1561
+ "session-deadlines",
1562
+ "networking",
1563
+ "dom-layout"
1564
+ ],
1565
+ "compatibleWith": [
1566
+ "miaoda-game-gong-zhu-rules"
1567
+ ],
1568
+ "useInsteadWhen": [
1569
+ {
1570
+ "package": "miaoda-game-gong-zhu-rules",
1571
+ "condition": "The host does not need React controller ownership or safe-view subscriptions."
1572
+ }
1573
+ ],
1574
+ "persistence": "delegated",
1575
+ "testability": {
1576
+ "observation": "snapshot-and-result",
1577
+ "advance": "command",
1578
+ "methods": {
1579
+ "observe": "controller.view, useGongZhuView(controller)",
1580
+ "advance": "controller.dispatch(action)"
1581
+ }
1582
+ }
1583
+ },
1584
+ "miaoda-game-gou-ji-rules": {
1585
+ "engine": "neutral",
1586
+ "domains": [
1587
+ "card-game",
1588
+ "rules",
1589
+ "tabletop"
1590
+ ],
1591
+ "owns": [
1592
+ "gou-ji-authoritative-rules",
1593
+ "gou-ji-legal-action-authority",
1594
+ "gou-ji-safe-player-views",
1595
+ "gou-ji-snapshot-validation"
1596
+ ],
1597
+ "doesNotOwn": [
1598
+ "gou-ji-bot-action-selection",
1599
+ "session-deadlines",
1600
+ "networking",
1601
+ "rendering"
1602
+ ],
1603
+ "compatibleWith": [
1604
+ "miaoda-game-gou-ji-react",
1605
+ "miaoda-game-gou-ji-analysis-core"
1606
+ ],
1607
+ "useInsteadWhen": [],
1608
+ "persistence": "snapshot",
1609
+ "testability": {
1610
+ "observation": "snapshot-and-result",
1611
+ "advance": "command",
1612
+ "methods": {
1613
+ "observe": "createGouJiPlayerView(state, playerId)",
1614
+ "advance": "applyGouJiAction(state, action)"
1615
+ }
1616
+ }
1617
+ },
1618
+ "miaoda-game-gou-ji-react": {
1619
+ "engine": "react",
1620
+ "domains": [
1621
+ "card-game",
1622
+ "react",
1623
+ "tabletop"
1624
+ ],
1625
+ "owns": [
1626
+ "react-gou-ji-controller-lifecycle",
1627
+ "react-gou-ji-safe-view-subscriptions",
1628
+ "react-gou-ji-commit-projection"
1629
+ ],
1630
+ "doesNotOwn": [
1631
+ "gou-ji-authoritative-rules",
1632
+ "gou-ji-bot-action-selection",
1633
+ "session-deadlines",
1634
+ "networking",
1635
+ "dom-layout"
1636
+ ],
1637
+ "compatibleWith": [
1638
+ "miaoda-game-gou-ji-rules",
1639
+ "miaoda-game-gou-ji-analysis-core"
1640
+ ],
1641
+ "useInsteadWhen": [
1642
+ {
1643
+ "package": "miaoda-game-gou-ji-rules",
1644
+ "condition": "The host does not need React controller ownership or safe-view subscriptions."
1645
+ }
1646
+ ],
1647
+ "persistence": "delegated",
1648
+ "testability": {
1649
+ "observation": "snapshot-and-result",
1650
+ "advance": "command",
1651
+ "methods": {
1652
+ "observe": "controller.view, useGouJiView(controller)",
1653
+ "advance": "controller.dispatch(action)"
1654
+ }
1655
+ }
1656
+ },
1657
+ "miaoda-game-guandan-rules": {
1658
+ "engine": "neutral",
1659
+ "domains": [
1660
+ "card-game",
1661
+ "rules",
1662
+ "tabletop"
1663
+ ],
1664
+ "owns": [
1665
+ "guandan-authoritative-rules",
1666
+ "guandan-legal-action-authority",
1667
+ "guandan-safe-player-views",
1668
+ "guandan-snapshot-validation"
1669
+ ],
1670
+ "doesNotOwn": [
1671
+ "guandan-bot-action-selection",
1672
+ "session-deadlines",
1673
+ "networking",
1674
+ "rendering"
1675
+ ],
1676
+ "compatibleWith": [
1677
+ "miaoda-game-guandan-react",
1678
+ "miaoda-game-guandan-analysis-core"
1679
+ ],
1680
+ "useInsteadWhen": [],
1681
+ "persistence": "snapshot",
1682
+ "testability": {
1683
+ "observation": "snapshot-and-result",
1684
+ "advance": "command",
1685
+ "methods": {
1686
+ "observe": "createGuandanPlayerView(state, playerId)",
1687
+ "advance": "applyGuandanAction(state, action)"
1688
+ }
1689
+ }
1690
+ },
1691
+ "miaoda-game-guandan-react": {
1692
+ "engine": "react",
1693
+ "domains": [
1694
+ "card-game",
1695
+ "react",
1696
+ "tabletop"
1697
+ ],
1698
+ "owns": [
1699
+ "react-guandan-controller-lifecycle",
1700
+ "react-guandan-safe-view-subscriptions",
1701
+ "react-guandan-commit-projection"
1702
+ ],
1703
+ "doesNotOwn": [
1704
+ "guandan-authoritative-rules",
1705
+ "guandan-bot-action-selection",
1706
+ "session-deadlines",
1707
+ "networking",
1708
+ "dom-layout"
1709
+ ],
1710
+ "compatibleWith": [
1711
+ "miaoda-game-guandan-rules",
1712
+ "miaoda-game-guandan-analysis-core"
1713
+ ],
1714
+ "useInsteadWhen": [
1715
+ {
1716
+ "package": "miaoda-game-guandan-rules",
1717
+ "condition": "The host does not need React controller ownership or safe-view subscriptions."
1718
+ }
1719
+ ],
1720
+ "persistence": "delegated",
1721
+ "testability": {
1722
+ "observation": "snapshot-and-result",
1723
+ "advance": "command",
1724
+ "methods": {
1725
+ "observe": "controller.view, useGuandanView(controller)",
1726
+ "advance": "controller.dispatch(action)"
1727
+ }
1728
+ }
1729
+ },
1730
+ "miaoda-game-hearts-rules": {
1731
+ "engine": "neutral",
1732
+ "domains": [
1733
+ "card-game",
1734
+ "rules",
1735
+ "tabletop"
1736
+ ],
1737
+ "owns": [
1738
+ "hearts-authoritative-rules",
1739
+ "hearts-legal-action-authority",
1740
+ "hearts-safe-player-views",
1741
+ "hearts-snapshot-validation"
1742
+ ],
1743
+ "doesNotOwn": [
1744
+ "hearts-bot-action-selection",
1745
+ "session-deadlines",
1746
+ "networking",
1747
+ "rendering"
1748
+ ],
1749
+ "compatibleWith": [
1750
+ "miaoda-game-hearts-react"
1751
+ ],
1752
+ "useInsteadWhen": [],
1753
+ "persistence": "snapshot",
1754
+ "testability": {
1755
+ "observation": "snapshot-and-result",
1756
+ "advance": "command",
1757
+ "methods": {
1758
+ "observe": "createHeartsPlayerView(state, playerId)",
1759
+ "advance": "applyHeartsAction(state, action)"
1760
+ }
1761
+ }
1762
+ },
1763
+ "miaoda-game-hearts-react": {
1764
+ "engine": "react",
1765
+ "domains": [
1766
+ "card-game",
1767
+ "react",
1768
+ "tabletop"
1769
+ ],
1770
+ "owns": [
1771
+ "react-hearts-controller-lifecycle",
1772
+ "react-hearts-safe-view-subscriptions",
1773
+ "react-hearts-commit-projection"
1774
+ ],
1775
+ "doesNotOwn": [
1776
+ "hearts-authoritative-rules",
1777
+ "hearts-bot-action-selection",
1778
+ "session-deadlines",
1779
+ "networking",
1780
+ "dom-layout"
1781
+ ],
1782
+ "compatibleWith": [
1783
+ "miaoda-game-hearts-rules"
1784
+ ],
1785
+ "useInsteadWhen": [
1786
+ {
1787
+ "package": "miaoda-game-hearts-rules",
1788
+ "condition": "The host does not need React controller ownership or safe-view subscriptions."
1789
+ }
1790
+ ],
1791
+ "persistence": "delegated",
1792
+ "testability": {
1793
+ "observation": "snapshot-and-result",
1794
+ "advance": "command",
1795
+ "methods": {
1796
+ "observe": "controller.view, useHeartsView(controller)",
1797
+ "advance": "controller.dispatch(action)"
1798
+ }
1799
+ }
1800
+ },
1801
+ "miaoda-game-paodekuai-rules": {
1802
+ "engine": "neutral",
1803
+ "domains": [
1804
+ "card-game",
1805
+ "rules",
1806
+ "tabletop"
1807
+ ],
1808
+ "owns": [
1809
+ "paodekuai-authoritative-rules",
1810
+ "paodekuai-legal-action-authority",
1811
+ "paodekuai-safe-player-views",
1812
+ "paodekuai-snapshot-validation"
1813
+ ],
1814
+ "doesNotOwn": [
1815
+ "paodekuai-bot-action-selection",
1816
+ "session-deadlines",
1817
+ "networking",
1818
+ "rendering"
1819
+ ],
1820
+ "compatibleWith": [
1821
+ "miaoda-game-paodekuai-react"
1822
+ ],
1823
+ "useInsteadWhen": [],
1824
+ "persistence": "snapshot",
1825
+ "testability": {
1826
+ "observation": "snapshot-and-result",
1827
+ "advance": "command",
1828
+ "methods": {
1829
+ "observe": "createPaoDeKuaiPlayerView(state, playerId)",
1830
+ "advance": "applyPaoDeKuaiAction(state, action)"
1831
+ }
1832
+ }
1833
+ },
1834
+ "miaoda-game-paodekuai-react": {
1835
+ "engine": "react",
1836
+ "domains": [
1837
+ "card-game",
1838
+ "react",
1839
+ "tabletop"
1840
+ ],
1841
+ "owns": [
1842
+ "react-paodekuai-controller-lifecycle",
1843
+ "react-paodekuai-safe-view-subscriptions",
1844
+ "react-paodekuai-commit-projection"
1845
+ ],
1846
+ "doesNotOwn": [
1847
+ "paodekuai-authoritative-rules",
1848
+ "paodekuai-bot-action-selection",
1849
+ "session-deadlines",
1850
+ "networking",
1851
+ "dom-layout"
1852
+ ],
1853
+ "compatibleWith": [
1854
+ "miaoda-game-paodekuai-rules"
1855
+ ],
1856
+ "useInsteadWhen": [
1857
+ {
1858
+ "package": "miaoda-game-paodekuai-rules",
1859
+ "condition": "The host does not need React controller ownership or safe-view subscriptions."
1860
+ }
1861
+ ],
1862
+ "persistence": "delegated",
1863
+ "testability": {
1864
+ "observation": "snapshot-and-result",
1865
+ "advance": "command",
1866
+ "methods": {
1867
+ "observe": "controller.view, usePaoDeKuaiView(controller)",
1868
+ "advance": "controller.dispatch(action)"
1869
+ }
1870
+ }
1871
+ },
1872
+ "miaoda-game-spades-rules": {
1873
+ "engine": "neutral",
1874
+ "domains": [
1875
+ "card-game",
1876
+ "rules",
1877
+ "tabletop"
1878
+ ],
1879
+ "owns": [
1880
+ "spades-authoritative-rules",
1881
+ "spades-legal-action-authority",
1882
+ "spades-safe-player-views",
1883
+ "spades-snapshot-validation"
1884
+ ],
1885
+ "doesNotOwn": [
1886
+ "spades-bot-action-selection",
1887
+ "session-deadlines",
1888
+ "networking",
1889
+ "rendering"
1890
+ ],
1891
+ "compatibleWith": [
1892
+ "miaoda-game-spades-react"
1893
+ ],
1894
+ "useInsteadWhen": [],
1895
+ "persistence": "snapshot",
1896
+ "testability": {
1897
+ "observation": "snapshot-and-result",
1898
+ "advance": "command",
1899
+ "methods": {
1900
+ "observe": "createSpadesPlayerView(state, playerId)",
1901
+ "advance": "applySpadesAction(state, action)"
1902
+ }
1903
+ }
1904
+ },
1905
+ "miaoda-game-spades-react": {
1906
+ "engine": "react",
1907
+ "domains": [
1908
+ "card-game",
1909
+ "react",
1910
+ "tabletop"
1911
+ ],
1912
+ "owns": [
1913
+ "react-spades-controller-lifecycle",
1914
+ "react-spades-safe-view-subscriptions",
1915
+ "react-spades-commit-projection"
1916
+ ],
1917
+ "doesNotOwn": [
1918
+ "spades-authoritative-rules",
1919
+ "spades-bot-action-selection",
1920
+ "session-deadlines",
1921
+ "networking",
1922
+ "dom-layout"
1923
+ ],
1924
+ "compatibleWith": [
1925
+ "miaoda-game-spades-rules"
1926
+ ],
1927
+ "useInsteadWhen": [
1928
+ {
1929
+ "package": "miaoda-game-spades-rules",
1930
+ "condition": "The host does not need React controller ownership or safe-view subscriptions."
1931
+ }
1932
+ ],
1933
+ "persistence": "delegated",
1934
+ "testability": {
1935
+ "observation": "snapshot-and-result",
1936
+ "advance": "command",
1937
+ "methods": {
1938
+ "observe": "controller.view, useSpadesView(controller)",
1939
+ "advance": "controller.dispatch(action)"
1940
+ }
1941
+ }
1942
+ },
1943
+ "miaoda-game-texas-holdem-rules": {
1944
+ "engine": "neutral",
1945
+ "domains": [
1946
+ "card-game",
1947
+ "rules",
1948
+ "tabletop"
1949
+ ],
1950
+ "owns": [
1951
+ "texas-holdem-authoritative-rules",
1952
+ "texas-holdem-legal-action-authority",
1953
+ "texas-holdem-safe-player-views",
1954
+ "texas-holdem-snapshot-validation"
1955
+ ],
1956
+ "doesNotOwn": [
1957
+ "texas-holdem-bot-action-selection",
1958
+ "session-deadlines",
1959
+ "networking",
1960
+ "rendering"
1961
+ ],
1962
+ "compatibleWith": [
1963
+ "miaoda-game-texas-holdem-react"
1964
+ ],
1965
+ "useInsteadWhen": [],
1966
+ "persistence": "snapshot",
1967
+ "testability": {
1968
+ "observation": "snapshot-and-result",
1969
+ "advance": "command",
1970
+ "methods": {
1971
+ "observe": "createTexasHoldemPlayerView(state, playerId)",
1972
+ "advance": "applyTexasHoldemAction(state, action)"
1973
+ }
1974
+ }
1975
+ },
1976
+ "miaoda-game-texas-holdem-react": {
1977
+ "engine": "react",
1978
+ "domains": [
1979
+ "card-game",
1980
+ "react",
1981
+ "tabletop"
1982
+ ],
1983
+ "owns": [
1984
+ "react-texas-holdem-controller-lifecycle",
1985
+ "react-texas-holdem-safe-view-subscriptions",
1986
+ "react-texas-holdem-commit-projection"
1987
+ ],
1988
+ "doesNotOwn": [
1989
+ "texas-holdem-authoritative-rules",
1990
+ "texas-holdem-bot-action-selection",
1991
+ "session-deadlines",
1992
+ "networking",
1993
+ "dom-layout"
1994
+ ],
1995
+ "compatibleWith": [
1996
+ "miaoda-game-texas-holdem-rules"
1997
+ ],
1998
+ "useInsteadWhen": [
1999
+ {
2000
+ "package": "miaoda-game-texas-holdem-rules",
2001
+ "condition": "The host does not need React controller ownership or safe-view subscriptions."
2002
+ }
2003
+ ],
2004
+ "persistence": "delegated",
2005
+ "testability": {
2006
+ "observation": "snapshot-and-result",
2007
+ "advance": "command",
2008
+ "methods": {
2009
+ "observe": "controller.view, useTexasHoldemView(controller)",
2010
+ "advance": "controller.dispatch(action)"
2011
+ }
2012
+ }
2013
+ },
2014
+ "miaoda-game-thirteen-water-rules": {
2015
+ "engine": "neutral",
2016
+ "domains": [
2017
+ "card-game",
2018
+ "rules",
2019
+ "tabletop"
2020
+ ],
2021
+ "owns": [
2022
+ "thirteen-water-authoritative-rules",
2023
+ "thirteen-water-legal-action-authority",
2024
+ "thirteen-water-safe-player-views",
2025
+ "thirteen-water-snapshot-validation"
2026
+ ],
2027
+ "doesNotOwn": [
2028
+ "thirteen-water-bot-action-selection",
2029
+ "session-deadlines",
2030
+ "networking",
2031
+ "rendering"
2032
+ ],
2033
+ "compatibleWith": [
2034
+ "miaoda-game-thirteen-water-react",
2035
+ "miaoda-game-thirteen-water-analysis-core"
2036
+ ],
2037
+ "useInsteadWhen": [],
2038
+ "persistence": "snapshot",
2039
+ "testability": {
2040
+ "observation": "snapshot-and-result",
2041
+ "advance": "command",
2042
+ "methods": {
2043
+ "observe": "createThirteenWaterPlayerView(state, playerId)",
2044
+ "advance": "applyThirteenWaterAction(state, action)"
2045
+ }
2046
+ }
2047
+ },
2048
+ "miaoda-game-thirteen-water-react": {
2049
+ "engine": "react",
2050
+ "domains": [
2051
+ "card-game",
2052
+ "react",
2053
+ "tabletop"
2054
+ ],
2055
+ "owns": [
2056
+ "react-thirteen-water-controller-lifecycle",
2057
+ "react-thirteen-water-safe-view-subscriptions",
2058
+ "react-thirteen-water-commit-projection"
2059
+ ],
2060
+ "doesNotOwn": [
2061
+ "thirteen-water-authoritative-rules",
2062
+ "thirteen-water-bot-action-selection",
2063
+ "session-deadlines",
2064
+ "networking",
2065
+ "dom-layout"
2066
+ ],
2067
+ "compatibleWith": [
2068
+ "miaoda-game-thirteen-water-rules",
2069
+ "miaoda-game-thirteen-water-analysis-core"
2070
+ ],
2071
+ "useInsteadWhen": [
2072
+ {
2073
+ "package": "miaoda-game-thirteen-water-rules",
2074
+ "condition": "The host does not need React controller ownership or safe-view subscriptions."
2075
+ }
2076
+ ],
2077
+ "persistence": "delegated",
2078
+ "testability": {
2079
+ "observation": "snapshot-and-result",
2080
+ "advance": "command",
2081
+ "methods": {
2082
+ "observe": "controller.view, useThirteenWaterView(controller)",
2083
+ "advance": "controller.dispatch(action)"
2084
+ }
2085
+ }
2086
+ },
2087
+ "miaoda-game-tractor-rules": {
2088
+ "engine": "neutral",
2089
+ "domains": [
2090
+ "card-game",
2091
+ "rules",
2092
+ "tabletop"
2093
+ ],
2094
+ "owns": [
2095
+ "tractor-authoritative-rules",
2096
+ "tractor-legal-action-authority",
2097
+ "tractor-safe-player-views",
2098
+ "tractor-snapshot-validation"
2099
+ ],
2100
+ "doesNotOwn": [
2101
+ "tractor-bot-action-selection",
2102
+ "session-deadlines",
2103
+ "networking",
2104
+ "rendering"
2105
+ ],
2106
+ "compatibleWith": [
2107
+ "miaoda-game-tractor-react",
2108
+ "miaoda-game-tractor-analysis-core"
2109
+ ],
2110
+ "useInsteadWhen": [],
2111
+ "persistence": "snapshot",
2112
+ "testability": {
2113
+ "observation": "snapshot-and-result",
2114
+ "advance": "command",
2115
+ "methods": {
2116
+ "observe": "getTractorDealPlayerView(state, playerId)",
2117
+ "advance": "applyTractorDeal(state, action)"
2118
+ }
2119
+ }
2120
+ },
2121
+ "miaoda-game-tractor-react": {
2122
+ "engine": "react",
2123
+ "domains": [
2124
+ "card-game",
2125
+ "react",
2126
+ "tabletop"
2127
+ ],
2128
+ "owns": [
2129
+ "react-tractor-controller-lifecycle",
2130
+ "react-tractor-safe-view-subscriptions",
2131
+ "react-tractor-commit-projection"
2132
+ ],
2133
+ "doesNotOwn": [
2134
+ "tractor-authoritative-rules",
2135
+ "tractor-bot-action-selection",
2136
+ "session-deadlines",
2137
+ "networking",
2138
+ "dom-layout"
2139
+ ],
2140
+ "compatibleWith": [
2141
+ "miaoda-game-tractor-rules",
2142
+ "miaoda-game-tractor-analysis-core"
2143
+ ],
2144
+ "useInsteadWhen": [
2145
+ {
2146
+ "package": "miaoda-game-tractor-rules",
2147
+ "condition": "The host does not need React controller ownership or safe-view subscriptions."
2148
+ }
2149
+ ],
2150
+ "persistence": "delegated",
2151
+ "testability": {
2152
+ "observation": "snapshot-and-result",
2153
+ "advance": "command",
2154
+ "methods": {
2155
+ "observe": "controller.view, useTractorView(controller)",
2156
+ "advance": "controller.dispatch(action)"
2157
+ }
2158
+ }
2159
+ },
2160
+ "miaoda-game-zha-jinhua-rules": {
2161
+ "engine": "neutral",
2162
+ "domains": [
2163
+ "card-game",
2164
+ "rules",
2165
+ "tabletop"
2166
+ ],
2167
+ "owns": [
2168
+ "zha-jinhua-authoritative-rules",
2169
+ "zha-jinhua-legal-action-authority",
2170
+ "zha-jinhua-safe-player-views",
2171
+ "zha-jinhua-snapshot-validation"
2172
+ ],
2173
+ "doesNotOwn": [
2174
+ "zha-jinhua-bot-action-selection",
2175
+ "session-deadlines",
2176
+ "networking",
2177
+ "rendering"
2178
+ ],
2179
+ "compatibleWith": [
2180
+ "miaoda-game-zha-jinhua-react"
2181
+ ],
2182
+ "useInsteadWhen": [],
2183
+ "persistence": "snapshot",
2184
+ "testability": {
2185
+ "observation": "snapshot-and-result",
2186
+ "advance": "command",
2187
+ "methods": {
2188
+ "observe": "createZhaJinhuaPlayerView(state, playerId)",
2189
+ "advance": "applyZhaJinhuaAction(state, action)"
2190
+ }
2191
+ }
2192
+ },
2193
+ "miaoda-game-zha-jinhua-react": {
2194
+ "engine": "react",
2195
+ "domains": [
2196
+ "card-game",
2197
+ "react",
2198
+ "tabletop"
2199
+ ],
2200
+ "owns": [
2201
+ "react-zha-jinhua-controller-lifecycle",
2202
+ "react-zha-jinhua-safe-view-subscriptions",
2203
+ "react-zha-jinhua-commit-projection"
2204
+ ],
2205
+ "doesNotOwn": [
2206
+ "zha-jinhua-authoritative-rules",
2207
+ "zha-jinhua-bot-action-selection",
2208
+ "session-deadlines",
2209
+ "networking",
2210
+ "dom-layout"
2211
+ ],
2212
+ "compatibleWith": [
2213
+ "miaoda-game-zha-jinhua-rules"
2214
+ ],
2215
+ "useInsteadWhen": [
2216
+ {
2217
+ "package": "miaoda-game-zha-jinhua-rules",
2218
+ "condition": "The host does not need React controller ownership or safe-view subscriptions."
2219
+ }
2220
+ ],
2221
+ "persistence": "delegated",
2222
+ "testability": {
2223
+ "observation": "snapshot-and-result",
2224
+ "advance": "command",
2225
+ "methods": {
2226
+ "observe": "controller.view, useZhaJinhuaView(controller)",
2227
+ "advance": "controller.dispatch(action)"
2228
+ }
2229
+ }
2230
+ },
2231
+ "miaoda-game-bridge-strategy-core": {
2232
+ "engine": "neutral",
2233
+ "domains": [
2234
+ "ai",
2235
+ "card-game",
2236
+ "strategy"
2237
+ ],
2238
+ "owns": [
2239
+ "bridge-bot-action-selection",
2240
+ "bridge-bot-auction-policy",
2241
+ "bridge-bot-card-play-policy"
2242
+ ],
2243
+ "doesNotOwn": [
2244
+ "bridge-authoritative-rules",
2245
+ "bridge-action-scheduling",
2246
+ "hidden-opponent-state",
2247
+ "rendering"
2248
+ ],
2249
+ "compatibleWith": [
2250
+ "miaoda-game-bridge-rules",
2251
+ "miaoda-game-bridge-react"
2252
+ ],
2253
+ "useInsteadWhen": [],
2254
+ "persistence": "none"
2255
+ },
2256
+ "miaoda-game-canasta-analysis-core": {
2257
+ "engine": "neutral",
2258
+ "domains": [
2259
+ "analysis",
2260
+ "card-game",
2261
+ "tabletop"
2262
+ ],
2263
+ "owns": [
2264
+ "canasta-card-value-analysis",
2265
+ "canasta-meld-candidate-analysis",
2266
+ "canasta-initial-meld-thresholds",
2267
+ "canasta-discard-pile-eligibility"
2268
+ ],
2269
+ "doesNotOwn": [
2270
+ "canasta-authoritative-rules",
2271
+ "canasta-bot-action-selection",
2272
+ "turn-orchestration",
2273
+ "rendering"
2274
+ ],
2275
+ "compatibleWith": [
2276
+ "miaoda-game-canasta-rules",
2277
+ "miaoda-game-canasta-react"
2278
+ ],
2279
+ "useInsteadWhen": [],
2280
+ "persistence": "none"
2281
+ },
2282
+ "miaoda-game-gou-ji-analysis-core": {
2283
+ "engine": "neutral",
2284
+ "domains": [
2285
+ "analysis",
2286
+ "card-game",
2287
+ "tabletop"
2288
+ ],
2289
+ "owns": [
2290
+ "gou-ji-play-classification",
2291
+ "gou-ji-play-comparison",
2292
+ "gou-ji-trigger-analysis",
2293
+ "gou-ji-legal-play-enumeration"
2294
+ ],
2295
+ "doesNotOwn": [
2296
+ "gou-ji-authoritative-rules",
2297
+ "gou-ji-bot-action-selection",
2298
+ "match-orchestration",
2299
+ "rendering"
2300
+ ],
2301
+ "compatibleWith": [
2302
+ "miaoda-game-gou-ji-rules",
2303
+ "miaoda-game-gou-ji-react"
2304
+ ],
2305
+ "useInsteadWhen": [],
2306
+ "persistence": "none"
2307
+ },
2308
+ "miaoda-game-guandan-analysis-core": {
2309
+ "engine": "neutral",
2310
+ "domains": [
2311
+ "analysis",
2312
+ "card-game",
2313
+ "tabletop"
2314
+ ],
2315
+ "owns": [
2316
+ "guandan-play-classification",
2317
+ "guandan-play-comparison",
2318
+ "guandan-wildcard-analysis",
2319
+ "guandan-legal-play-enumeration"
2320
+ ],
2321
+ "doesNotOwn": [
2322
+ "guandan-authoritative-rules",
2323
+ "guandan-bot-action-selection",
2324
+ "match-orchestration",
2325
+ "rendering"
2326
+ ],
2327
+ "compatibleWith": [
2328
+ "miaoda-game-guandan-rules",
2329
+ "miaoda-game-guandan-react"
2330
+ ],
2331
+ "useInsteadWhen": [],
2332
+ "persistence": "none"
2333
+ },
2334
+ "miaoda-game-thirteen-water-analysis-core": {
2335
+ "engine": "neutral",
2336
+ "domains": [
2337
+ "analysis",
2338
+ "card-game",
2339
+ "tabletop"
2340
+ ],
2341
+ "owns": [
2342
+ "thirteen-water-arrangement-validation",
2343
+ "thirteen-water-arrangement-enumeration",
2344
+ "thirteen-water-hand-comparison",
2345
+ "thirteen-water-foul-detection"
2346
+ ],
2347
+ "doesNotOwn": [
2348
+ "thirteen-water-authoritative-rules",
2349
+ "thirteen-water-bot-action-selection",
2350
+ "match-orchestration",
2351
+ "rendering"
2352
+ ],
2353
+ "compatibleWith": [
2354
+ "miaoda-game-thirteen-water-rules",
2355
+ "miaoda-game-thirteen-water-react"
2356
+ ],
2357
+ "useInsteadWhen": [],
2358
+ "persistence": "none"
2359
+ },
2360
+ "miaoda-game-tractor-analysis-core": {
2361
+ "engine": "neutral",
2362
+ "domains": [
2363
+ "analysis",
2364
+ "card-game",
2365
+ "tabletop"
2366
+ ],
2367
+ "owns": [
2368
+ "tractor-play-classification",
2369
+ "tractor-follow-obligation-analysis",
2370
+ "tractor-trick-winner-analysis",
2371
+ "tractor-settlement-analysis"
2372
+ ],
2373
+ "doesNotOwn": [
2374
+ "tractor-authoritative-rules",
2375
+ "tractor-bot-action-selection",
2376
+ "match-orchestration",
2377
+ "rendering"
2378
+ ],
2379
+ "compatibleWith": [
2380
+ "miaoda-game-tractor-rules",
2381
+ "miaoda-game-tractor-react"
2382
+ ],
2383
+ "useInsteadWhen": [],
2384
+ "persistence": "none"
2385
+ },
2386
+ "miaoda-game-bridge-tournament-core": {
2387
+ "engine": "neutral",
2388
+ "domains": [
2389
+ "bridge",
2390
+ "card-game",
2391
+ "tabletop",
2392
+ "tournament"
2393
+ ],
2394
+ "owns": [
2395
+ "bridge-mitchell-pairs-movement",
2396
+ "bridge-matchpoint-standings",
2397
+ "bridge-team-imp-aggregation",
2398
+ "bridge-tournament-command-validation",
2399
+ "bridge-tournament-public-views"
2400
+ ],
2401
+ "doesNotOwn": [
2402
+ "bridge-table-play-rules",
2403
+ "bridge-bot-action-selection",
2404
+ "tournament-networking",
2405
+ "tournament-clocks",
2406
+ "rendering"
2407
+ ],
2408
+ "compatibleWith": [
2409
+ "miaoda-game-bridge-rules",
2410
+ "miaoda-game-bridge-tournament-react"
2411
+ ],
2412
+ "useInsteadWhen": [],
2413
+ "persistence": "snapshot"
2414
+ },
2415
+ "miaoda-game-bridge-tournament-react": {
2416
+ "engine": "react",
2417
+ "domains": [
2418
+ "bridge",
2419
+ "card-game",
2420
+ "tabletop",
2421
+ "tournament",
2422
+ "react"
2423
+ ],
2424
+ "owns": [
2425
+ "react-bridge-tournament-controller",
2426
+ "react-bridge-public-view-subscriptions"
2427
+ ],
2428
+ "doesNotOwn": [
2429
+ "bridge-tournament-rules",
2430
+ "bridge-table-play-rules",
2431
+ "networking",
2432
+ "dom-layout"
2433
+ ],
2434
+ "compatibleWith": [
2435
+ "miaoda-game-bridge-tournament-core",
2436
+ "miaoda-game-bridge-rules"
2437
+ ],
2438
+ "useInsteadWhen": [
2439
+ {
2440
+ "package": "miaoda-game-bridge-tournament-core",
2441
+ "condition": "The host does not need react lifecycle or presentation integration."
2442
+ }
2443
+ ],
2444
+ "persistence": "delegated"
2445
+ },
2446
+ "miaoda-game-meld-core": {
2447
+ "engine": "neutral",
2448
+ "domains": [
2449
+ "analysis",
2450
+ "card-game",
2451
+ "tabletop"
2452
+ ],
2453
+ "owns": [
2454
+ "disjoint-meld-partition-search",
2455
+ "minimum-unused-card-optimization",
2456
+ "deterministic-meld-tie-breaking"
2457
+ ],
2458
+ "doesNotOwn": [
2459
+ "meld-candidate-generation",
2460
+ "card-game-rules",
2461
+ "card-scoring-policy",
2462
+ "turn-orchestration",
2463
+ "rendering"
2464
+ ],
2465
+ "compatibleWith": [
2466
+ "miaoda-game-gin-rummy-rules",
2467
+ "miaoda-game-canasta-rules"
2468
+ ],
2469
+ "useInsteadWhen": [],
2470
+ "persistence": "none"
2471
+ },
2472
+ "miaoda-game-trick-taking-core": {
2473
+ "engine": "neutral",
2474
+ "domains": [
2475
+ "card-game",
2476
+ "rules",
2477
+ "tabletop"
2478
+ ],
2479
+ "owns": [
2480
+ "trick-seat-order",
2481
+ "follow-suit-legality",
2482
+ "trump-winner-resolution",
2483
+ "trick-history",
2484
+ "trick-state-validation"
2485
+ ],
2486
+ "doesNotOwn": [
2487
+ "bidding-rules",
2488
+ "match-scoring",
2489
+ "multi-card-tricks",
2490
+ "card-ownership",
2491
+ "rendering"
2492
+ ],
2493
+ "compatibleWith": [
2494
+ "miaoda-game-bridge-rules",
2495
+ "miaoda-game-euchre-rules",
2496
+ "miaoda-game-hearts-rules",
2497
+ "miaoda-game-spades-rules"
2498
+ ],
2499
+ "useInsteadWhen": [],
2500
+ "persistence": "snapshot"
2501
+ },
2502
+ "miaoda-game-deck-core": {
2503
+ "engine": "neutral",
2504
+ "domains": [
2505
+ "card-game",
2506
+ "deck",
2507
+ "tabletop"
2508
+ ],
2509
+ "owns": [
2510
+ "deck-zone-ownership",
2511
+ "card-instance-identity",
2512
+ "deterministic-shuffle",
2513
+ "atomic-card-movement",
2514
+ "deck-snapshots"
2515
+ ],
2516
+ "doesNotOwn": [
2517
+ "card-effects",
2518
+ "card-play-legality",
2519
+ "turn-orchestration",
2520
+ "hidden-information-projection",
2521
+ "rendering"
2522
+ ],
2523
+ "compatibleWith": [
2524
+ "miaoda-game-deck-cocos",
2525
+ "miaoda-game-deck-phaser",
2526
+ "miaoda-game-deck-react",
2527
+ "miaoda-game-turn-core"
2528
+ ],
2529
+ "useInsteadWhen": [],
2530
+ "persistence": "snapshot"
2531
+ },
2532
+ "miaoda-game-deck-cocos": {
2533
+ "engine": "cocos",
2534
+ "domains": [
2535
+ "card-game",
2536
+ "deck",
2537
+ "tabletop",
2538
+ "cocos"
2539
+ ],
2540
+ "owns": [
2541
+ "cocos-deck-component-lifecycle",
2542
+ "cocos-deck-event-forwarding"
2543
+ ],
2544
+ "doesNotOwn": [
2545
+ "card-rules",
2546
+ "card-node-layout",
2547
+ "input-handling",
2548
+ "hidden-information-projection"
2549
+ ],
2550
+ "compatibleWith": [
2551
+ "miaoda-game-deck-core"
2552
+ ],
2553
+ "useInsteadWhen": [
2554
+ {
2555
+ "package": "miaoda-game-deck-core",
2556
+ "condition": "The host does not need cocos lifecycle or presentation integration."
2557
+ }
2558
+ ],
2559
+ "persistence": "delegated"
2560
+ },
2561
+ "miaoda-game-deck-phaser": {
2562
+ "engine": "phaser",
2563
+ "domains": [
2564
+ "card-game",
2565
+ "deck",
2566
+ "tabletop",
2567
+ "phaser"
2568
+ ],
2569
+ "owns": [
2570
+ "phaser-deck-scene-lifecycle",
2571
+ "phaser-deck-observable-ownership"
2572
+ ],
2573
+ "doesNotOwn": [
2574
+ "card-rules",
2575
+ "card-game-objects",
2576
+ "input-handling",
2577
+ "hidden-information-projection"
2578
+ ],
2579
+ "compatibleWith": [
2580
+ "miaoda-game-deck-core"
2581
+ ],
2582
+ "useInsteadWhen": [
2583
+ {
2584
+ "package": "miaoda-game-deck-core",
2585
+ "condition": "The host does not need phaser lifecycle or presentation integration."
2586
+ }
2587
+ ],
2588
+ "persistence": "delegated"
2589
+ },
2590
+ "miaoda-game-deck-react": {
2591
+ "engine": "react",
2592
+ "domains": [
2593
+ "card-game",
2594
+ "deck",
2595
+ "tabletop",
2596
+ "react"
2597
+ ],
2598
+ "owns": [
2599
+ "react-deck-instance-lifecycle",
2600
+ "react-deck-snapshot-subscriptions"
2601
+ ],
2602
+ "doesNotOwn": [
2603
+ "card-rules",
2604
+ "turn-flow",
2605
+ "hidden-information-projection",
2606
+ "dom-layout"
2607
+ ],
2608
+ "compatibleWith": [
2609
+ "miaoda-game-deck-core"
2610
+ ],
2611
+ "useInsteadWhen": [
2612
+ {
2613
+ "package": "miaoda-game-deck-core",
2614
+ "condition": "The host does not need react lifecycle or presentation integration."
2615
+ }
2616
+ ],
2617
+ "persistence": "delegated"
2618
+ },
2619
+ "miaoda-game-deckbuilder-core": {
2620
+ "engine": "neutral",
2621
+ "domains": [
2622
+ "card-game",
2623
+ "deckbuilder",
2624
+ "tabletop"
2625
+ ],
2626
+ "owns": [
2627
+ "deckbuilder-card-instance-identity",
2628
+ "deckbuilder-battle-phases",
2629
+ "deckbuilder-energy-legality",
2630
+ "deckbuilder-command-validation",
2631
+ "deckbuilder-snapshots"
2632
+ ],
2633
+ "doesNotOwn": [
2634
+ "card-effect-language",
2635
+ "combat-formulas",
2636
+ "enemy-ai",
2637
+ "run-progression",
2638
+ "rendering"
2639
+ ],
2640
+ "compatibleWith": [],
2641
+ "useInsteadWhen": [],
2642
+ "persistence": "snapshot"
2643
+ },
2644
+ "miaoda-game-draft-pool-core": {
2645
+ "engine": "neutral",
2646
+ "domains": [
2647
+ "card-game",
2648
+ "draft",
2649
+ "tabletop"
2650
+ ],
2651
+ "owns": [
2652
+ "finite-draft-pool",
2653
+ "weighted-draft-offers",
2654
+ "draft-reservation-lifecycle",
2655
+ "draft-conservation-checks",
2656
+ "draft-snapshots"
2657
+ ],
2658
+ "doesNotOwn": [
2659
+ "draft-item-effects",
2660
+ "player-economy",
2661
+ "matchmaking",
2662
+ "rendering"
2663
+ ],
2664
+ "compatibleWith": [
2665
+ "miaoda-game-draft-pool-react"
2666
+ ],
2667
+ "useInsteadWhen": [],
2668
+ "persistence": "snapshot"
2669
+ },
2670
+ "miaoda-game-draft-pool-react": {
2671
+ "engine": "react",
2672
+ "domains": [
2673
+ "card-game",
2674
+ "draft",
2675
+ "tabletop",
2676
+ "react"
2677
+ ],
2678
+ "owns": [
2679
+ "react-draft-pool-controller",
2680
+ "react-draft-pool-subscriptions"
2681
+ ],
2682
+ "doesNotOwn": [
2683
+ "draft-pool-rules",
2684
+ "player-economy",
2685
+ "drag-interactions",
2686
+ "dom-layout"
2687
+ ],
2688
+ "compatibleWith": [
2689
+ "miaoda-game-draft-pool-core"
2690
+ ],
2691
+ "useInsteadWhen": [
2692
+ {
2693
+ "package": "miaoda-game-draft-pool-core",
2694
+ "condition": "The host does not need react lifecycle or presentation integration."
2695
+ }
2696
+ ],
2697
+ "persistence": "delegated"
2698
+ },
2699
+ "miaoda-game-grid-cocos": {
2700
+ "engine": "cocos",
2701
+ "domains": [
2702
+ "board-game",
2703
+ "grid",
2704
+ "tabletop",
2705
+ "cocos"
2706
+ ],
2707
+ "owns": [
2708
+ "cocos-grid-layout-projection",
2709
+ "cocos-grid-input-translation"
2710
+ ],
2711
+ "doesNotOwn": [
2712
+ "grid-topology-rules",
2713
+ "piece-movement-rules",
2714
+ "game-outcomes",
2715
+ "rendering-assets"
2716
+ ],
2717
+ "compatibleWith": [
2718
+ "miaoda-game-grid-core"
2719
+ ],
2720
+ "useInsteadWhen": [
2721
+ {
2722
+ "package": "miaoda-game-grid-core",
2723
+ "condition": "The host does not need cocos lifecycle or presentation integration."
2724
+ }
2725
+ ],
2726
+ "persistence": "delegated"
2727
+ },
2728
+ "miaoda-game-grid-phaser": {
2729
+ "engine": "phaser",
2730
+ "domains": [
2731
+ "board-game",
2732
+ "grid",
2733
+ "tabletop",
2734
+ "phaser"
2735
+ ],
2736
+ "owns": [
2737
+ "phaser-grid-layout-projection",
2738
+ "phaser-grid-input-translation",
2739
+ "phaser-grid-movement-projection"
2740
+ ],
2741
+ "doesNotOwn": [
2742
+ "grid-topology-rules",
2743
+ "piece-movement-rules",
2744
+ "game-outcomes",
2745
+ "rendering-assets"
2746
+ ],
2747
+ "compatibleWith": [
2748
+ "miaoda-game-grid-core"
2749
+ ],
2750
+ "useInsteadWhen": [
2751
+ {
2752
+ "package": "miaoda-game-grid-core",
2753
+ "condition": "The host does not need phaser lifecycle or presentation integration."
2754
+ }
2755
+ ],
2756
+ "persistence": "delegated"
2757
+ },
2758
+ "miaoda-game-grid-react": {
2759
+ "engine": "react",
2760
+ "domains": [
2761
+ "board-game",
2762
+ "grid",
2763
+ "tabletop",
2764
+ "react"
2765
+ ],
2766
+ "owns": [
2767
+ "react-grid-state-subscriptions",
2768
+ "react-grid-transaction-projection"
2769
+ ],
2770
+ "doesNotOwn": [
2771
+ "grid-game-rules",
2772
+ "piece-art",
2773
+ "drag-interactions",
2774
+ "dom-layout"
2775
+ ],
2776
+ "compatibleWith": [
2777
+ "miaoda-game-grid-core"
2778
+ ],
2779
+ "useInsteadWhen": [
2780
+ {
2781
+ "package": "miaoda-game-grid-core",
2782
+ "condition": "The host does not need react lifecycle or presentation integration."
2783
+ }
2784
+ ],
2785
+ "persistence": "delegated"
2786
+ },
2787
+ "miaoda-game-grid-piece-core": {
2788
+ "engine": "neutral",
2789
+ "domains": [
2790
+ "board-game",
2791
+ "grid",
2792
+ "tabletop"
2793
+ ],
2794
+ "owns": [
2795
+ "multi-cell-piece-footprints",
2796
+ "grid-piece-occupancy",
2797
+ "grid-piece-fit-validation",
2798
+ "grid-piece-sliding",
2799
+ "grid-piece-rotation"
2800
+ ],
2801
+ "doesNotOwn": [
2802
+ "board-game-rules",
2803
+ "puzzle-solving",
2804
+ "equipment-slots",
2805
+ "rendering"
2806
+ ],
2807
+ "compatibleWith": [
2808
+ "miaoda-game-grid-core",
2809
+ "miaoda-game-grid-piece-react"
2810
+ ],
2811
+ "useInsteadWhen": [],
2812
+ "persistence": "snapshot"
2813
+ },
2814
+ "miaoda-game-grid-piece-react": {
2815
+ "engine": "react",
2816
+ "domains": [
2817
+ "board-game",
2818
+ "grid",
2819
+ "tabletop",
2820
+ "react"
2821
+ ],
2822
+ "owns": [
2823
+ "react-grid-piece-subscriptions",
2824
+ "react-grid-piece-command-projection"
2825
+ ],
2826
+ "doesNotOwn": [
2827
+ "board-game-rules",
2828
+ "drag-interactions",
2829
+ "piece-animation",
2830
+ "dom-layout"
2831
+ ],
2832
+ "compatibleWith": [
2833
+ "miaoda-game-grid-piece-core",
2834
+ "miaoda-game-grid-core"
2835
+ ],
2836
+ "useInsteadWhen": [
2837
+ {
2838
+ "package": "miaoda-game-grid-piece-core",
2839
+ "condition": "The host does not need react lifecycle or presentation integration."
2840
+ }
2841
+ ],
2842
+ "persistence": "delegated"
2843
+ },
2844
+ "miaoda-game-turn-core": {
2845
+ "engine": "neutral",
2846
+ "domains": [
2847
+ "tabletop",
2848
+ "turn-based"
2849
+ ],
2850
+ "owns": [
2851
+ "ordered-actor-turns",
2852
+ "faction-phase-turns",
2853
+ "seat-based-turns",
2854
+ "simultaneous-submission-barriers",
2855
+ "turn-state-validation"
2856
+ ],
2857
+ "doesNotOwn": [
2858
+ "game-action-legality",
2859
+ "game-outcomes",
2860
+ "networking",
2861
+ "rendering"
2862
+ ],
2863
+ "compatibleWith": [
2864
+ "miaoda-game-turn-cocos",
2865
+ "miaoda-game-turn-phaser",
2866
+ "miaoda-game-turn-react",
2867
+ "miaoda-game-deck-core"
2868
+ ],
2869
+ "useInsteadWhen": [],
2870
+ "persistence": "snapshot"
2871
+ },
2872
+ "miaoda-game-turn-cocos": {
2873
+ "engine": "cocos",
2874
+ "domains": [
2875
+ "tabletop",
2876
+ "turn-based",
2877
+ "cocos"
2878
+ ],
2879
+ "owns": [
2880
+ "cocos-turn-component-lifecycle",
2881
+ "cocos-turn-change-forwarding"
2882
+ ],
2883
+ "doesNotOwn": [
2884
+ "game-action-legality",
2885
+ "networking",
2886
+ "turn-ui-layout",
2887
+ "rendering-assets"
2888
+ ],
2889
+ "compatibleWith": [
2890
+ "miaoda-game-turn-core"
2891
+ ],
2892
+ "useInsteadWhen": [
2893
+ {
2894
+ "package": "miaoda-game-turn-core",
2895
+ "condition": "The host does not need cocos lifecycle or presentation integration."
2896
+ }
2897
+ ],
2898
+ "persistence": "delegated"
2899
+ },
2900
+ "miaoda-game-turn-phaser": {
2901
+ "engine": "phaser",
2902
+ "domains": [
2903
+ "tabletop",
2904
+ "turn-based",
2905
+ "phaser"
2906
+ ],
2907
+ "owns": [
2908
+ "phaser-turn-scene-lifecycle",
2909
+ "phaser-turn-observable-ownership"
2910
+ ],
2911
+ "doesNotOwn": [
2912
+ "game-action-legality",
2913
+ "networking",
2914
+ "turn-ui-layout",
2915
+ "rendering-assets"
2916
+ ],
2917
+ "compatibleWith": [
2918
+ "miaoda-game-turn-core"
2919
+ ],
2920
+ "useInsteadWhen": [
2921
+ {
2922
+ "package": "miaoda-game-turn-core",
2923
+ "condition": "The host does not need phaser lifecycle or presentation integration."
2924
+ }
2925
+ ],
2926
+ "persistence": "delegated"
2927
+ },
2928
+ "miaoda-game-turn-react": {
2929
+ "engine": "react",
2930
+ "domains": [
2931
+ "tabletop",
2932
+ "turn-based",
2933
+ "react"
2934
+ ],
2935
+ "owns": [
2936
+ "react-turn-controller-lifecycle",
2937
+ "react-turn-state-subscriptions"
2938
+ ],
2939
+ "doesNotOwn": [
2940
+ "game-action-legality",
2941
+ "networking",
2942
+ "turn-ui-layout",
2943
+ "dom-layout"
2944
+ ],
2945
+ "compatibleWith": [
2946
+ "miaoda-game-turn-core"
2947
+ ],
2948
+ "useInsteadWhen": [
2949
+ {
2950
+ "package": "miaoda-game-turn-core",
2951
+ "condition": "The host does not need react lifecycle or presentation integration."
2952
+ }
2953
+ ],
2954
+ "persistence": "delegated"
2955
+ },
2956
+ "miaoda-game-sports-ball-core": {
2957
+ "engine": "neutral",
2958
+ "domains": [
2959
+ "ball-game",
2960
+ "physics",
2961
+ "sports"
2962
+ ],
2963
+ "owns": [
2964
+ "sports-ball-held-free-state",
2965
+ "sports-ball-flat-field-motion",
2966
+ "sports-ball-airborne-arcs",
2967
+ "sports-ball-control-contests",
2968
+ "sports-ball-trajectory-prediction",
2969
+ "sports-ball-boundary-crossings"
2970
+ ],
2971
+ "doesNotOwn": [
2972
+ "player-movement",
2973
+ "sport-specific-rules",
2974
+ "team-ai",
2975
+ "collision-geometry",
2976
+ "rendering"
2977
+ ],
2978
+ "compatibleWith": [
2979
+ "miaoda-game-ballistics-core"
2980
+ ],
2981
+ "useInsteadWhen": [],
2982
+ "persistence": "snapshot"
2983
+ },
2984
+ "miaoda-game-road-core": {
2985
+ "engine": "neutral",
2986
+ "domains": [
2987
+ "racing",
2988
+ "sports",
2989
+ "vehicle"
2990
+ ],
2991
+ "owns": [
2992
+ "segmented-racing-road",
2993
+ "road-curve-projection",
2994
+ "road-hill-occlusion",
2995
+ "road-billboard-geometry"
2996
+ ],
2997
+ "doesNotOwn": [
2998
+ "vehicle-kinematics",
2999
+ "race-rules",
3000
+ "collision",
3001
+ "rendering"
3002
+ ],
3003
+ "compatibleWith": [
3004
+ "miaoda-game-road-cocos",
3005
+ "miaoda-game-road-phaser",
3006
+ "miaoda-game-arcade-motion-core"
3007
+ ],
3008
+ "useInsteadWhen": [],
3009
+ "persistence": "none"
3010
+ },
3011
+ "miaoda-game-road-cocos": {
3012
+ "engine": "cocos",
3013
+ "domains": [
3014
+ "racing",
3015
+ "sports",
3016
+ "vehicle",
3017
+ "cocos"
3018
+ ],
3019
+ "owns": [
3020
+ "cocos-road-ribbon-rendering",
3021
+ "cocos-road-billboard-projection"
3022
+ ],
3023
+ "doesNotOwn": [
3024
+ "vehicle-kinematics",
3025
+ "race-rules",
3026
+ "collision",
3027
+ "rendering-assets"
3028
+ ],
3029
+ "compatibleWith": [
3030
+ "miaoda-game-road-core"
3031
+ ],
3032
+ "useInsteadWhen": [
3033
+ {
3034
+ "package": "miaoda-game-road-core",
3035
+ "condition": "The host does not need cocos lifecycle or presentation integration."
3036
+ }
3037
+ ],
3038
+ "persistence": "delegated"
3039
+ },
3040
+ "miaoda-game-road-phaser": {
3041
+ "engine": "phaser",
3042
+ "domains": [
3043
+ "racing",
3044
+ "sports",
3045
+ "vehicle",
3046
+ "phaser"
3047
+ ],
3048
+ "owns": [
3049
+ "phaser-road-graphics-rendering",
3050
+ "phaser-road-frame-projection"
3051
+ ],
3052
+ "doesNotOwn": [
3053
+ "vehicle-kinematics",
3054
+ "race-rules",
3055
+ "collision",
3056
+ "rendering-assets"
3057
+ ],
3058
+ "compatibleWith": [
3059
+ "miaoda-game-road-core"
3060
+ ],
3061
+ "useInsteadWhen": [
3062
+ {
3063
+ "package": "miaoda-game-road-core",
3064
+ "condition": "The host does not need phaser lifecycle or presentation integration."
3065
+ }
3066
+ ],
3067
+ "persistence": "delegated"
3068
+ },
3069
+ "miaoda-game-pinball-core": {
3070
+ "engine": "neutral",
3071
+ "domains": [
3072
+ "arcade",
3073
+ "ball-game",
3074
+ "pinball"
3075
+ ],
3076
+ "owns": [
3077
+ "pinball-session-lifecycle",
3078
+ "pinball-ball-save",
3079
+ "pinball-multiball",
3080
+ "pinball-tilt-state",
3081
+ "pinball-switch-rules",
3082
+ "pinball-flow-tracking"
3083
+ ],
3084
+ "doesNotOwn": [
3085
+ "rigid-body-physics",
3086
+ "table-geometry",
3087
+ "flipper-impulses",
3088
+ "audio",
3089
+ "rendering"
3090
+ ],
3091
+ "compatibleWith": [
3092
+ "miaoda-game-pinball-cocos",
3093
+ "miaoda-game-pinball-phaser",
3094
+ "miaoda-game-score-core"
3095
+ ],
3096
+ "useInsteadWhen": [],
3097
+ "persistence": "snapshot"
3098
+ },
3099
+ "miaoda-game-pinball-cocos": {
3100
+ "engine": "cocos",
3101
+ "domains": [
3102
+ "arcade",
3103
+ "ball-game",
3104
+ "pinball",
3105
+ "cocos"
3106
+ ],
3107
+ "owns": [
3108
+ "cocos-pinball-table-lifecycle",
3109
+ "cocos-pinball-physics-contacts",
3110
+ "cocos-pinball-actuator-components"
3111
+ ],
3112
+ "doesNotOwn": [
3113
+ "pinball-rules",
3114
+ "table-specific-geometry",
3115
+ "visual-effects",
3116
+ "audio"
3117
+ ],
3118
+ "compatibleWith": [
3119
+ "miaoda-game-pinball-core",
3120
+ "miaoda-game-score-core"
3121
+ ],
3122
+ "useInsteadWhen": [
3123
+ {
3124
+ "package": "miaoda-game-pinball-core",
3125
+ "condition": "The host does not need cocos lifecycle or presentation integration."
3126
+ }
3127
+ ],
3128
+ "persistence": "delegated"
3129
+ },
3130
+ "miaoda-game-pinball-phaser": {
3131
+ "engine": "phaser",
3132
+ "domains": [
3133
+ "arcade",
3134
+ "ball-game",
3135
+ "pinball",
3136
+ "phaser"
3137
+ ],
3138
+ "owns": [
3139
+ "phaser-pinball-scene-lifecycle",
3140
+ "phaser-pinball-object-registration",
3141
+ "phaser-pinball-time-bridging"
3142
+ ],
3143
+ "doesNotOwn": [
3144
+ "pinball-rules",
3145
+ "physics-body-creation",
3146
+ "table-specific-geometry",
3147
+ "visual-effects"
3148
+ ],
3149
+ "compatibleWith": [
3150
+ "miaoda-game-pinball-core",
3151
+ "miaoda-game-score-core"
3152
+ ],
3153
+ "useInsteadWhen": [
3154
+ {
3155
+ "package": "miaoda-game-pinball-core",
3156
+ "condition": "The host does not need phaser lifecycle or presentation integration."
3157
+ }
3158
+ ],
3159
+ "persistence": "delegated"
3160
+ },
3161
+ "miaoda-game-score-core": {
3162
+ "engine": "neutral",
3163
+ "domains": [
3164
+ "arcade",
3165
+ "scoring",
3166
+ "sports"
3167
+ ],
3168
+ "owns": [
3169
+ "score-ledger",
3170
+ "score-multipliers",
3171
+ "timed-score-combos",
3172
+ "high-score-state",
3173
+ "score-snapshots"
3174
+ ],
3175
+ "doesNotOwn": [
3176
+ "score-award-policy",
3177
+ "leaderboard-services",
3178
+ "game-clock",
3179
+ "hud-rendering"
3180
+ ],
3181
+ "compatibleWith": [
3182
+ "miaoda-game-score-phaser",
3183
+ "miaoda-game-score-react",
3184
+ "miaoda-game-pinball-core"
3185
+ ],
3186
+ "useInsteadWhen": [],
3187
+ "persistence": "snapshot"
3188
+ },
3189
+ "miaoda-game-score-phaser": {
3190
+ "engine": "phaser",
3191
+ "domains": [
3192
+ "arcade",
3193
+ "scoring",
3194
+ "sports",
3195
+ "phaser"
3196
+ ],
3197
+ "owns": [
3198
+ "phaser-score-scene-lifecycle",
3199
+ "phaser-score-combo-time-bridging"
3200
+ ],
3201
+ "doesNotOwn": [
3202
+ "score-award-policy",
3203
+ "leaderboard-services",
3204
+ "hud-rendering",
3205
+ "game-pause-policy"
3206
+ ],
3207
+ "compatibleWith": [
3208
+ "miaoda-game-score-core"
3209
+ ],
3210
+ "useInsteadWhen": [
3211
+ {
3212
+ "package": "miaoda-game-score-core",
3213
+ "condition": "The host does not need phaser lifecycle or presentation integration."
3214
+ }
3215
+ ],
3216
+ "persistence": "delegated"
3217
+ },
3218
+ "miaoda-game-score-react": {
3219
+ "engine": "react",
3220
+ "domains": [
3221
+ "arcade",
3222
+ "scoring",
3223
+ "sports",
3224
+ "react"
3225
+ ],
3226
+ "owns": [
3227
+ "react-score-controller-lifecycle",
3228
+ "react-score-state-subscriptions"
3229
+ ],
3230
+ "doesNotOwn": [
3231
+ "score-award-policy",
3232
+ "game-clock",
3233
+ "leaderboard-services",
3234
+ "dom-layout"
3235
+ ],
3236
+ "compatibleWith": [
3237
+ "miaoda-game-score-core"
3238
+ ],
3239
+ "useInsteadWhen": [
3240
+ {
3241
+ "package": "miaoda-game-score-core",
3242
+ "condition": "The host does not need react lifecycle or presentation integration."
3243
+ }
3244
+ ],
3245
+ "persistence": "delegated"
3246
+ },
3247
+ "miaoda-game-roster-core": {
3248
+ "engine": "neutral",
3249
+ "domains": [
3250
+ "lineup",
3251
+ "roster",
3252
+ "sports",
3253
+ "tabletop"
3254
+ ],
3255
+ "owns": [
3256
+ "roster-instance-identity",
3257
+ "roster-zone-capacity",
3258
+ "roster-eligibility",
3259
+ "roster-atomic-transfers",
3260
+ "roster-merge-resolution",
3261
+ "roster-trait-derivation"
3262
+ ],
3263
+ "doesNotOwn": [
3264
+ "spatial-placement",
3265
+ "sport-specific-lineup-rules",
3266
+ "combat",
3267
+ "rendering"
3268
+ ],
3269
+ "compatibleWith": [
3270
+ "miaoda-game-roster-react",
3271
+ "miaoda-game-grid-core",
3272
+ "miaoda-game-grid-piece-core"
3273
+ ],
3274
+ "useInsteadWhen": [],
3275
+ "persistence": "snapshot"
3276
+ },
3277
+ "miaoda-game-roster-react": {
3278
+ "engine": "react",
3279
+ "domains": [
3280
+ "lineup",
3281
+ "roster",
3282
+ "sports",
3283
+ "tabletop",
3284
+ "react"
3285
+ ],
3286
+ "owns": [
3287
+ "react-roster-snapshot-subscriptions"
3288
+ ],
3289
+ "doesNotOwn": [
3290
+ "roster-rules",
3291
+ "spatial-placement",
3292
+ "drag-interactions",
3293
+ "merge-animation",
3294
+ "dom-layout"
3295
+ ],
3296
+ "compatibleWith": [
3297
+ "miaoda-game-roster-core"
3298
+ ],
3299
+ "useInsteadWhen": [
3300
+ {
3301
+ "package": "miaoda-game-roster-core",
3302
+ "condition": "The host does not need react lifecycle or presentation integration."
3303
+ }
3304
+ ],
3305
+ "persistence": "delegated"
3306
+ },
3307
+ "miaoda-game-ballistics-core": {
3308
+ "engine": "neutral",
3309
+ "domains": [
3310
+ "ball-game",
3311
+ "physics",
3312
+ "sports",
3313
+ "trajectory"
3314
+ ],
3315
+ "owns": [
3316
+ "projectile-motion-integration",
3317
+ "ballistic-launch-solving",
3318
+ "trajectory-sampling",
3319
+ "landing-prediction",
3320
+ "bounce-velocity",
3321
+ "aerodynamic-acceleration"
3322
+ ],
3323
+ "doesNotOwn": [
3324
+ "collision-world",
3325
+ "damage",
3326
+ "sport-specific-rules",
3327
+ "rigid-body-integration",
3328
+ "rendering"
3329
+ ],
3330
+ "compatibleWith": [
3331
+ "miaoda-game-sports-ball-core"
3332
+ ],
3333
+ "useInsteadWhen": [
3334
+ {
3335
+ "package": "miaoda-game-sports-ball-core",
3336
+ "condition": "The game needs authoritative held/free ownership, rolling, bounce/settle events, control contests, or interception prediction on a flat sports field."
3337
+ }
3338
+ ],
3339
+ "persistence": "none"
3340
+ },
3341
+ "miaoda-game-mode7-core": {
3342
+ "engine": "neutral",
3343
+ "domains": [
3344
+ "perspective",
3345
+ "racing",
3346
+ "sports"
3347
+ ],
3348
+ "owns": [
3349
+ "mode7-affine-coordinate-mapping",
3350
+ "mode7-perspective-scanlines",
3351
+ "mode7-ground-point-projection"
3352
+ ],
3353
+ "doesNotOwn": [
3354
+ "image-sampling",
3355
+ "shaders",
3356
+ "heightfield-terrain",
3357
+ "vehicle-kinematics",
3358
+ "rendering"
3359
+ ],
3360
+ "compatibleWith": [
3361
+ "miaoda-game-road-core"
3362
+ ],
3363
+ "useInsteadWhen": [],
3364
+ "persistence": "none"
3365
+ }
3366
+ }
3367
+ }