@virjay/playscope-cocos 0.0.0-stage → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (92) hide show
  1. package/CHANGELOG.md +30 -0
  2. package/README.md +314 -2
  3. package/USAGE.md +372 -0
  4. package/VALIDATION.md +93 -0
  5. package/dist/adapters/levelplay/index.d.ts +15 -0
  6. package/dist/adapters/levelplay/index.js +14 -0
  7. package/dist/cocos/Storage.d.ts +16 -0
  8. package/dist/cocos/Storage.js +16 -0
  9. package/dist/cocos/XhrJsonTransport.d.ts +8 -0
  10. package/dist/cocos/XhrJsonTransport.js +65 -0
  11. package/dist/cocos/index.d.ts +48 -0
  12. package/dist/cocos/index.js +134 -0
  13. package/dist/core/ClientOwnership.d.ts +6 -0
  14. package/dist/core/ClientOwnership.js +39 -0
  15. package/dist/core/ClientScope.d.ts +5 -0
  16. package/dist/core/ClientScope.js +34 -0
  17. package/dist/core/ConfigurationSync.d.ts +18 -0
  18. package/dist/core/ConfigurationSync.js +66 -0
  19. package/dist/core/FactEncoding.d.ts +10 -0
  20. package/dist/core/FactEncoding.js +29 -0
  21. package/dist/core/HttpError.d.ts +10 -0
  22. package/dist/core/HttpError.js +17 -0
  23. package/dist/core/OutboxStore.d.ts +31 -0
  24. package/dist/core/OutboxStore.js +228 -0
  25. package/dist/core/PersistentState.d.ts +33 -0
  26. package/dist/core/PersistentState.js +92 -0
  27. package/dist/core/PlayScopeClient.d.ts +65 -0
  28. package/dist/core/PlayScopeClient.js +422 -0
  29. package/dist/core/QueueAdmission.d.ts +4 -0
  30. package/dist/core/QueueAdmission.js +29 -0
  31. package/dist/core/index.d.ts +7 -0
  32. package/dist/core/index.js +27 -0
  33. package/dist/core/revenue.d.ts +33 -0
  34. package/dist/core/revenue.js +23 -0
  35. package/dist/core/types.d.ts +155 -0
  36. package/dist/core/types.js +2 -0
  37. package/dist/core/uuid.d.ts +1 -0
  38. package/dist/core/uuid.js +9 -0
  39. package/dist/esm/adapters/levelplay/index.js +11 -0
  40. package/dist/esm/cocos/Storage.js +12 -0
  41. package/dist/esm/cocos/XhrJsonTransport.js +61 -0
  42. package/dist/esm/cocos/index.js +115 -0
  43. package/dist/esm/core/ClientOwnership.js +34 -0
  44. package/dist/esm/core/ClientScope.js +30 -0
  45. package/dist/esm/core/ConfigurationSync.js +62 -0
  46. package/dist/esm/core/FactEncoding.js +24 -0
  47. package/dist/esm/core/HttpError.js +12 -0
  48. package/dist/esm/core/OutboxStore.js +224 -0
  49. package/dist/esm/core/PersistentState.js +85 -0
  50. package/dist/esm/core/PlayScopeClient.js +415 -0
  51. package/dist/esm/core/QueueAdmission.js +25 -0
  52. package/dist/esm/core/index.js +7 -0
  53. package/dist/esm/core/revenue.js +20 -0
  54. package/dist/esm/core/types.js +1 -0
  55. package/dist/esm/core/uuid.js +6 -0
  56. package/dist/esm/package.json +1 -0
  57. package/dist/esm/protocols/game-v1/index.js +21 -0
  58. package/dist/protocols/game-v1/index.d.ts +8 -0
  59. package/dist/protocols/game-v1/index.js +25 -0
  60. package/doc/README.md +4 -0
  61. package/doc//344/275/277/347/224/250/346/214/207/345/215/227/README.md +585 -0
  62. package/doc//344/275/277/347/224/250/346/214/207/345/215/227//345/217/202/350/200/203/350/265/204/346/226/231/0.1.1-types/adapters/levelplay/index.d.ts +15 -0
  63. package/doc//344/275/277/347/224/250/346/214/207/345/215/227//345/217/202/350/200/203/350/265/204/346/226/231/0.1.1-types/cocos/Storage.d.ts +13 -0
  64. package/doc//344/275/277/347/224/250/346/214/207/345/215/227//345/217/202/350/200/203/350/265/204/346/226/231/0.1.1-types/cocos/XhrJsonTransport.d.ts +8 -0
  65. package/doc//344/275/277/347/224/250/346/214/207/345/215/227//345/217/202/350/200/203/350/265/204/346/226/231/0.1.1-types/cocos/index.d.ts +38 -0
  66. package/doc//344/275/277/347/224/250/346/214/207/345/215/227//345/217/202/350/200/203/350/265/204/346/226/231/0.1.1-types/core/PlayScopeClient.d.ts +46 -0
  67. package/doc//344/275/277/347/224/250/346/214/207/345/215/227//345/217/202/350/200/203/350/265/204/346/226/231/0.1.1-types/core/index.d.ts +3 -0
  68. package/doc//344/275/277/347/224/250/346/214/207/345/215/227//345/217/202/350/200/203/350/265/204/346/226/231/0.1.1-types/core/revenue.d.ts +25 -0
  69. package/doc//344/275/277/347/224/250/346/214/207/345/215/227//345/217/202/350/200/203/350/265/204/346/226/231/0.1.1-types/core/types.d.ts +81 -0
  70. package/doc//344/275/277/347/224/250/346/214/207/345/215/227//345/217/202/350/200/203/350/265/204/346/226/231/exports.json +89 -0
  71. package/doc//344/275/277/347/224/250/346/214/207/345/215/227//345/217/202/350/200/203/350/265/204/346/226/231/public-api.d.ts +281 -0
  72. package/doc//344/275/277/347/224/250/346/214/207/345/215/227//345/217/202/350/200/203/350/265/204/346/226/231//346/234/215/345/212/241/347/253/257/client-context.schema.json +103 -0
  73. package/doc//344/275/277/347/224/250/346/214/207/345/215/227//345/217/202/350/200/203/350/265/204/346/226/231//346/234/215/345/212/241/347/253/257/game-ad-properties.json +765 -0
  74. package/doc//344/275/277/347/224/250/346/214/207/345/215/227//345/217/202/350/200/203/350/265/204/346/226/231//346/234/215/345/212/241/347/253/257/game-builtin-properties.json +479 -0
  75. package/doc//344/275/277/347/224/250/346/214/207/345/215/227//345/217/202/350/200/203/350/265/204/346/226/231//346/234/215/345/212/241/347/253/257/game-event.json +278 -0
  76. package/doc//344/275/277/347/224/250/346/214/207/345/215/227//345/217/202/350/200/203/350/265/204/346/226/231//346/234/215/345/212/241/347/253/257/product-events.json +2878 -0
  77. package/doc//344/275/277/347/224/250/346/214/207/345/215/227//345/217/202/350/200/203/350/265/204/346/226/231//346/234/215/345/212/241/347/253/257/standard-contract.json +183 -0
  78. package/doc//344/275/277/347/224/250/346/214/207/345/215/227//345/217/202/350/200/203/350/265/204/346/226/231//346/234/215/345/212/241/347/253/257//344/272/247/345/223/201/344/272/213/344/273/266/347/264/242/345/274/225.md +87 -0
  79. package/doc//344/275/277/347/224/250/346/214/207/345/215/227//345/217/202/350/200/203/350/265/204/346/226/231//346/235/245/346/272/220/344/270/216/347/211/210/346/234/254.json +35 -0
  80. package/doc//344/275/277/347/224/250/346/214/207/345/215/227//347/244/272/344/276/213/CoreIntegration.ts +13 -0
  81. package/doc//344/275/277/347/224/250/346/214/207/345/215/227//347/244/272/344/276/213/LevelPlayTelemetry.ts +119 -0
  82. package/doc//344/275/277/347/224/250/346/214/207/345/215/227//347/244/272/344/276/213/PlayScopeExample.ts +46 -0
  83. package/doc//344/275/277/347/224/250/346/214/207/345/215/227//347/244/272/344/276/213/QuestGarden.ts +129 -0
  84. package/doc//344/275/277/347/224/250/346/214/207/345/215/227//347/244/272/344/276/213/README.md +23 -0
  85. package/doc//344/275/277/347/224/250/346/214/207/345/215/227//347/244/272/344/276/213/project-fixture.json +188 -0
  86. package/doc//344/275/277/347/224/250/346/214/207/345/215/227//347/244/272/344/276/213/tsconfig.json +20 -0
  87. package/examples/cocos-minimal/PlayScopeExample.ts +27 -0
  88. package/examples/quest-garden/QuestGarden.ts +129 -0
  89. package/examples/quest-garden/README.md +180 -0
  90. package/examples/quest-garden/project-fixture.json +188 -0
  91. package/examples/quest-garden/tsconfig.json +12 -0
  92. package/package.json +73 -4
@@ -0,0 +1,2878 @@
1
+ [
2
+ {
3
+ "definitionSource": "product",
4
+ "dictionaryId": "E001",
5
+ "name": "app_install",
6
+ "category": "安装/启动",
7
+ "trigger": "首次安装启动",
8
+ "source": "AppsFlyer",
9
+ "priority": "P0",
10
+ "keyFields": "归因必报;是所有 LTV 计算的起点",
11
+ "notes": "",
12
+ "version": 1,
13
+ "countsAsActivity": false,
14
+ "propertiesSchema": {
15
+ "type": "object",
16
+ "properties": {},
17
+ "additionalProperties": true
18
+ }
19
+ },
20
+ {
21
+ "definitionSource": "product",
22
+ "dictionaryId": "E002",
23
+ "name": "app_launch",
24
+ "category": "安装/启动",
25
+ "trigger": "冷启动或热启动",
26
+ "source": "Firebase + 自研",
27
+ "priority": "P0",
28
+ "keyFields": "记录启动来源(推送/图标/DeepLink)",
29
+ "notes": "",
30
+ "version": 1,
31
+ "countsAsActivity": true,
32
+ "propertiesSchema": {
33
+ "type": "object",
34
+ "properties": {},
35
+ "additionalProperties": true
36
+ }
37
+ },
38
+ {
39
+ "definitionSource": "product",
40
+ "dictionaryId": "E003",
41
+ "name": "session_start",
42
+ "category": "安装/启动",
43
+ "trigger": "前后台切换进入前台",
44
+ "source": "自研",
45
+ "priority": "P0",
46
+ "keyFields": "30s 内复用 session_id,超过 30s 算新会话",
47
+ "notes": "",
48
+ "version": 1,
49
+ "countsAsActivity": true,
50
+ "propertiesSchema": {
51
+ "type": "object",
52
+ "properties": {},
53
+ "additionalProperties": true
54
+ }
55
+ },
56
+ {
57
+ "definitionSource": "product",
58
+ "dictionaryId": "E004",
59
+ "name": "session_end",
60
+ "category": "安装/启动",
61
+ "trigger": "进入后台",
62
+ "source": "自研",
63
+ "priority": "P1",
64
+ "keyFields": "后台上报也保留,防止 App 被杀丢数",
65
+ "notes": "",
66
+ "version": 1,
67
+ "countsAsActivity": false,
68
+ "propertiesSchema": {
69
+ "type": "object",
70
+ "properties": {},
71
+ "additionalProperties": true
72
+ }
73
+ },
74
+ {
75
+ "definitionSource": "product",
76
+ "dictionaryId": "E005",
77
+ "name": "user_first_open",
78
+ "category": "安装/启动",
79
+ "trigger": "新设备首次启动",
80
+ "source": "自研",
81
+ "priority": "P0",
82
+ "keyFields": "关联 A/B 实验分组入口;判断新用户",
83
+ "notes": "",
84
+ "version": 1,
85
+ "countsAsActivity": true,
86
+ "propertiesSchema": {
87
+ "type": "object",
88
+ "properties": {},
89
+ "additionalProperties": true
90
+ }
91
+ },
92
+ {
93
+ "definitionSource": "product",
94
+ "dictionaryId": "E006",
95
+ "name": "user_return",
96
+ "category": "安装/启动",
97
+ "trigger": "流失 ≥7 天后再次启动",
98
+ "source": "自研",
99
+ "priority": "P0",
100
+ "keyFields": "触发回归用户特权(前 3 局免插屏+放水)",
101
+ "notes": "",
102
+ "version": 1,
103
+ "countsAsActivity": true,
104
+ "propertiesSchema": {
105
+ "type": "object",
106
+ "properties": {},
107
+ "additionalProperties": true
108
+ }
109
+ },
110
+ {
111
+ "definitionSource": "product",
112
+ "dictionaryId": "E010",
113
+ "name": "user_login",
114
+ "category": "账号",
115
+ "trigger": "登录成功",
116
+ "source": "自研",
117
+ "priority": "P0",
118
+ "keyFields": "区分首次登录 vs 老用户登录",
119
+ "notes": "",
120
+ "version": 1,
121
+ "countsAsActivity": true,
122
+ "propertiesSchema": {
123
+ "type": "object",
124
+ "properties": {},
125
+ "additionalProperties": true
126
+ }
127
+ },
128
+ {
129
+ "definitionSource": "product",
130
+ "dictionaryId": "E011",
131
+ "name": "user_register",
132
+ "category": "账号",
133
+ "trigger": "完成注册",
134
+ "source": "自研",
135
+ "priority": "P0",
136
+ "keyFields": "注册转化漏斗终点",
137
+ "notes": "",
138
+ "version": 1,
139
+ "countsAsActivity": true,
140
+ "propertiesSchema": {
141
+ "type": "object",
142
+ "properties": {},
143
+ "additionalProperties": true
144
+ }
145
+ },
146
+ {
147
+ "definitionSource": "product",
148
+ "dictionaryId": "E020",
149
+ "name": "game_start",
150
+ "category": "游戏行为",
151
+ "trigger": "点击「开始」进入一局",
152
+ "source": "自研",
153
+ "priority": "P0",
154
+ "keyFields": "记录关卡/模式;board_state_hash 用于异常复盘",
155
+ "notes": "",
156
+ "version": 1,
157
+ "countsAsActivity": true,
158
+ "propertiesSchema": {
159
+ "type": "object",
160
+ "properties": {
161
+ "board_state_hash": {
162
+ "type": "string",
163
+ "maxLength": 256
164
+ }
165
+ },
166
+ "additionalProperties": true
167
+ }
168
+ },
169
+ {
170
+ "definitionSource": "product",
171
+ "dictionaryId": "E021",
172
+ "name": "game_pause",
173
+ "category": "游戏行为",
174
+ "trigger": "局中点击暂停",
175
+ "source": "自研",
176
+ "priority": "P1",
177
+ "keyFields": "触发暂停/主页插屏冷却计算",
178
+ "notes": "",
179
+ "version": 1,
180
+ "countsAsActivity": true,
181
+ "propertiesSchema": {
182
+ "type": "object",
183
+ "properties": {},
184
+ "additionalProperties": true
185
+ }
186
+ },
187
+ {
188
+ "definitionSource": "product",
189
+ "dictionaryId": "E022",
190
+ "name": "game_resume",
191
+ "category": "游戏行为",
192
+ "trigger": "从暂停恢复",
193
+ "source": "自研",
194
+ "priority": "P1",
195
+ "keyFields": "",
196
+ "notes": "",
197
+ "version": 1,
198
+ "countsAsActivity": true,
199
+ "propertiesSchema": {
200
+ "type": "object",
201
+ "properties": {},
202
+ "additionalProperties": true
203
+ }
204
+ },
205
+ {
206
+ "definitionSource": "product",
207
+ "dictionaryId": "E023",
208
+ "name": "game_over",
209
+ "category": "游戏行为",
210
+ "trigger": "对局结束(死亡判定)",
211
+ "source": "自研",
212
+ "priority": "P0",
213
+ "keyFields": "死亡插屏/复活弹窗决策点",
214
+ "notes": "",
215
+ "version": 1,
216
+ "countsAsActivity": true,
217
+ "propertiesSchema": {
218
+ "type": "object",
219
+ "properties": {
220
+ "failureIndex": {
221
+ "type": "integer",
222
+ "minimum": 1,
223
+ "maximum": 9007199254740991
224
+ },
225
+ "summary": {},
226
+ "started": {
227
+ "type": "boolean"
228
+ }
229
+ },
230
+ "additionalProperties": true,
231
+ "required": [
232
+ "failureIndex"
233
+ ]
234
+ }
235
+ },
236
+ {
237
+ "definitionSource": "product",
238
+ "dictionaryId": "E024",
239
+ "name": "board_cant_place",
240
+ "category": "游戏行为",
241
+ "trigger": "无解探测(出现死局)",
242
+ "source": "自研",
243
+ "priority": "P0",
244
+ "keyFields": "熵增刺客算法的核心触发",
245
+ "notes": "",
246
+ "version": 1,
247
+ "countsAsActivity": true,
248
+ "propertiesSchema": {
249
+ "type": "object",
250
+ "properties": {},
251
+ "additionalProperties": true
252
+ }
253
+ },
254
+ {
255
+ "definitionSource": "product",
256
+ "dictionaryId": "E025",
257
+ "name": "new_high_score",
258
+ "category": "游戏行为",
259
+ "trigger": "本局打破个人纪录",
260
+ "source": "自研",
261
+ "priority": "P1",
262
+ "keyFields": "触发 eCPM 刺客高频死局",
263
+ "notes": "",
264
+ "version": 1,
265
+ "countsAsActivity": true,
266
+ "propertiesSchema": {
267
+ "type": "object",
268
+ "properties": {},
269
+ "additionalProperties": true
270
+ }
271
+ },
272
+ {
273
+ "definitionSource": "product",
274
+ "dictionaryId": "E026",
275
+ "name": "combo_milestone",
276
+ "category": "游戏行为",
277
+ "trigger": "达到连击里程碑(2/3/4/5x)",
278
+ "source": "自研",
279
+ "priority": "P1",
280
+ "keyFields": "兴趣曲线高位判定输入",
281
+ "notes": "",
282
+ "version": 1,
283
+ "countsAsActivity": true,
284
+ "propertiesSchema": {
285
+ "type": "object",
286
+ "properties": {},
287
+ "additionalProperties": true
288
+ }
289
+ },
290
+ {
291
+ "definitionSource": "product",
292
+ "dictionaryId": "E027",
293
+ "name": "level_win",
294
+ "category": "游戏行为",
295
+ "trigger": "关卡模式通关",
296
+ "source": "自研",
297
+ "priority": "P0",
298
+ "keyFields": "胜利插屏+双倍视频触发点",
299
+ "notes": "",
300
+ "version": 1,
301
+ "countsAsActivity": true,
302
+ "propertiesSchema": {
303
+ "type": "object",
304
+ "properties": {
305
+ "summary": {},
306
+ "started": {
307
+ "type": "boolean"
308
+ }
309
+ },
310
+ "additionalProperties": true
311
+ }
312
+ },
313
+ {
314
+ "definitionSource": "product",
315
+ "dictionaryId": "E028",
316
+ "name": "level_lose",
317
+ "category": "游戏行为",
318
+ "trigger": "关卡模式失败",
319
+ "source": "自研",
320
+ "priority": "P0",
321
+ "keyFields": "",
322
+ "notes": "",
323
+ "version": 1,
324
+ "countsAsActivity": true,
325
+ "propertiesSchema": {
326
+ "type": "object",
327
+ "properties": {
328
+ "summary": {},
329
+ "started": {
330
+ "type": "boolean"
331
+ }
332
+ },
333
+ "additionalProperties": true
334
+ }
335
+ },
336
+ {
337
+ "definitionSource": "product",
338
+ "dictionaryId": "E030",
339
+ "name": "revive_offer_show",
340
+ "category": "复活",
341
+ "trigger": "死亡时弹出复活视频选项",
342
+ "source": "自研",
343
+ "priority": "P0",
344
+ "keyFields": "20% 走复活 / 80% 走结算插屏",
345
+ "notes": "",
346
+ "version": 1,
347
+ "countsAsActivity": false,
348
+ "propertiesSchema": {
349
+ "type": "object",
350
+ "properties": {},
351
+ "additionalProperties": true
352
+ }
353
+ },
354
+ {
355
+ "definitionSource": "product",
356
+ "dictionaryId": "E031",
357
+ "name": "revive_video_start",
358
+ "category": "复活",
359
+ "trigger": "用户点击「看视频复活」",
360
+ "source": "自研",
361
+ "priority": "P0",
362
+ "keyFields": "与 MAX SDK onRewardedVideoStarted 同步",
363
+ "notes": "",
364
+ "version": 1,
365
+ "countsAsActivity": true,
366
+ "propertiesSchema": {
367
+ "type": "object",
368
+ "properties": {},
369
+ "additionalProperties": true
370
+ }
371
+ },
372
+ {
373
+ "definitionSource": "product",
374
+ "dictionaryId": "E032",
375
+ "name": "revive_video_complete",
376
+ "category": "复活",
377
+ "trigger": "激励视频完整播放",
378
+ "source": "MAX + 自研",
379
+ "priority": "P0",
380
+ "keyFields": "onUserRewarded 回调;同时上报 ad_rewarded_grant",
381
+ "notes": "",
382
+ "version": 1,
383
+ "countsAsActivity": false,
384
+ "propertiesSchema": {
385
+ "type": "object",
386
+ "properties": {},
387
+ "additionalProperties": true
388
+ }
389
+ },
390
+ {
391
+ "definitionSource": "product",
392
+ "dictionaryId": "E033",
393
+ "name": "revive_video_fail",
394
+ "category": "复活",
395
+ "trigger": "视频加载失败/中途退出",
396
+ "source": "自研",
397
+ "priority": "P0",
398
+ "keyFields": "可降级为插屏+送一次免费复活",
399
+ "notes": "",
400
+ "version": 1,
401
+ "countsAsActivity": false,
402
+ "propertiesSchema": {
403
+ "type": "object",
404
+ "properties": {},
405
+ "additionalProperties": true
406
+ }
407
+ },
408
+ {
409
+ "definitionSource": "product",
410
+ "dictionaryId": "E034",
411
+ "name": "revive_success",
412
+ "category": "复活",
413
+ "trigger": "玩家成功复活继续游戏",
414
+ "source": "自研",
415
+ "priority": "P0",
416
+ "keyFields": "激活 revive_skip_interstitial 标志",
417
+ "notes": "",
418
+ "version": 1,
419
+ "countsAsActivity": true,
420
+ "propertiesSchema": {
421
+ "type": "object",
422
+ "properties": {
423
+ "failureIndex": {
424
+ "type": "integer",
425
+ "minimum": 1,
426
+ "maximum": 9007199254740991
427
+ }
428
+ },
429
+ "additionalProperties": true,
430
+ "required": [
431
+ "failureIndex"
432
+ ]
433
+ }
434
+ },
435
+ {
436
+ "definitionSource": "product",
437
+ "dictionaryId": "E035",
438
+ "name": "revive_block_issued",
439
+ "category": "复活",
440
+ "trigger": "复活块生成器下发",
441
+ "source": "自研",
442
+ "priority": "P0",
443
+ "keyFields": "确保 100% 可清场,防秒死",
444
+ "notes": "",
445
+ "version": 1,
446
+ "countsAsActivity": false,
447
+ "propertiesSchema": {
448
+ "type": "object",
449
+ "properties": {},
450
+ "additionalProperties": true
451
+ }
452
+ },
453
+ {
454
+ "definitionSource": "product",
455
+ "dictionaryId": "E040",
456
+ "name": "hint_video_start",
457
+ "category": "提示",
458
+ "trigger": "点击「提示/技能」",
459
+ "source": "自研",
460
+ "priority": "P0",
461
+ "keyFields": "",
462
+ "notes": "",
463
+ "version": 1,
464
+ "countsAsActivity": true,
465
+ "propertiesSchema": {
466
+ "type": "object",
467
+ "properties": {},
468
+ "additionalProperties": true
469
+ }
470
+ },
471
+ {
472
+ "definitionSource": "product",
473
+ "dictionaryId": "E041",
474
+ "name": "hint_video_complete",
475
+ "category": "提示",
476
+ "trigger": "完整播放",
477
+ "source": "MAX + 自研",
478
+ "priority": "P0",
479
+ "keyFields": "下发 2 次提示次数",
480
+ "notes": "",
481
+ "version": 1,
482
+ "countsAsActivity": false,
483
+ "propertiesSchema": {
484
+ "type": "object",
485
+ "properties": {},
486
+ "additionalProperties": true
487
+ }
488
+ },
489
+ {
490
+ "definitionSource": "product",
491
+ "dictionaryId": "E050",
492
+ "name": "difficulty_entropy_trigger",
493
+ "category": "算法",
494
+ "trigger": "熵增刺客触发",
495
+ "source": "自研",
496
+ "priority": "P0",
497
+ "keyFields": "记录被下发「刺客死局」用于回溯 eCPM",
498
+ "notes": "",
499
+ "version": 1,
500
+ "countsAsActivity": false,
501
+ "propertiesSchema": {
502
+ "type": "object",
503
+ "properties": {},
504
+ "additionalProperties": true
505
+ }
506
+ },
507
+ {
508
+ "definitionSource": "product",
509
+ "dictionaryId": "E051",
510
+ "name": "difficulty_pity_trigger",
511
+ "category": "算法",
512
+ "trigger": "放水保底触发",
513
+ "source": "自研",
514
+ "priority": "P0",
515
+ "keyFields": "三档放水保底,防摔手机流失",
516
+ "notes": "",
517
+ "version": 1,
518
+ "countsAsActivity": false,
519
+ "propertiesSchema": {
520
+ "type": "object",
521
+ "properties": {},
522
+ "additionalProperties": true
523
+ }
524
+ },
525
+ {
526
+ "definitionSource": "product",
527
+ "dictionaryId": "E052",
528
+ "name": "quantile_fetch",
529
+ "category": "算法",
530
+ "trigger": "拉取云端分位数",
531
+ "source": "自研",
532
+ "priority": "P1",
533
+ "keyFields": "校准本地高分基线",
534
+ "notes": "",
535
+ "version": 1,
536
+ "countsAsActivity": false,
537
+ "propertiesSchema": {
538
+ "type": "object",
539
+ "properties": {},
540
+ "additionalProperties": true
541
+ }
542
+ },
543
+ {
544
+ "definitionSource": "product",
545
+ "dictionaryId": "E060",
546
+ "name": "ad_request",
547
+ "category": "广告",
548
+ "trigger": "业务层调用 loadAd",
549
+ "source": "MAX 包装",
550
+ "priority": "P0",
551
+ "keyFields": "placement: revive_video/gameover_interstitial/win_interstitial/pause_interstitial/hint_video/win_double/banner",
552
+ "notes": "",
553
+ "version": 1,
554
+ "countsAsActivity": false,
555
+ "propertiesSchema": {
556
+ "type": "object",
557
+ "properties": {
558
+ "placement": {
559
+ "enum": [
560
+ "revive_video",
561
+ "gameover_interstitial",
562
+ "win_interstitial",
563
+ "pause_interstitial",
564
+ "hint_video",
565
+ "win_double",
566
+ "banner"
567
+ ]
568
+ }
569
+ },
570
+ "additionalProperties": true,
571
+ "required": [
572
+ "placement"
573
+ ]
574
+ }
575
+ },
576
+ {
577
+ "definitionSource": "product",
578
+ "dictionaryId": "E061",
579
+ "name": "ad_load_success",
580
+ "category": "广告",
581
+ "trigger": "广告加载成功",
582
+ "source": "MAX 包装",
583
+ "priority": "P0",
584
+ "keyFields": "核心计费用样本",
585
+ "notes": "",
586
+ "version": 1,
587
+ "countsAsActivity": false,
588
+ "propertiesSchema": {
589
+ "type": "object",
590
+ "properties": {
591
+ "placement": {
592
+ "enum": [
593
+ "revive_video",
594
+ "gameover_interstitial",
595
+ "win_interstitial",
596
+ "pause_interstitial",
597
+ "hint_video",
598
+ "win_double",
599
+ "banner"
600
+ ]
601
+ }
602
+ },
603
+ "additionalProperties": true
604
+ }
605
+ },
606
+ {
607
+ "definitionSource": "product",
608
+ "dictionaryId": "E062",
609
+ "name": "ad_load_fail",
610
+ "category": "广告",
611
+ "trigger": "广告加载失败",
612
+ "source": "MAX 包装",
613
+ "priority": "P0",
614
+ "keyFields": "填充率告警源",
615
+ "notes": "",
616
+ "version": 1,
617
+ "countsAsActivity": false,
618
+ "propertiesSchema": {
619
+ "type": "object",
620
+ "properties": {
621
+ "placement": {
622
+ "enum": [
623
+ "revive_video",
624
+ "gameover_interstitial",
625
+ "win_interstitial",
626
+ "pause_interstitial",
627
+ "hint_video",
628
+ "win_double",
629
+ "banner"
630
+ ]
631
+ }
632
+ },
633
+ "additionalProperties": true
634
+ }
635
+ },
636
+ {
637
+ "definitionSource": "product",
638
+ "dictionaryId": "E063",
639
+ "name": "ad_impression",
640
+ "category": "广告",
641
+ "trigger": "广告展示(计费点)",
642
+ "source": "MAX 包装",
643
+ "priority": "P0",
644
+ "keyFields": "收入主指标;与 MAX 后台对账",
645
+ "notes": "",
646
+ "version": 1,
647
+ "countsAsActivity": false,
648
+ "propertiesSchema": {
649
+ "type": "object",
650
+ "properties": {
651
+ "placement": {
652
+ "enum": [
653
+ "revive_video",
654
+ "gameover_interstitial",
655
+ "win_interstitial",
656
+ "pause_interstitial",
657
+ "hint_video",
658
+ "win_double",
659
+ "banner"
660
+ ]
661
+ }
662
+ },
663
+ "additionalProperties": true
664
+ }
665
+ },
666
+ {
667
+ "definitionSource": "product",
668
+ "dictionaryId": "E064",
669
+ "name": "ad_click",
670
+ "category": "广告",
671
+ "trigger": "用户点击广告",
672
+ "source": "MAX 包装",
673
+ "priority": "P0",
674
+ "keyFields": "",
675
+ "notes": "",
676
+ "version": 1,
677
+ "countsAsActivity": true,
678
+ "propertiesSchema": {
679
+ "type": "object",
680
+ "properties": {
681
+ "placement": {
682
+ "enum": [
683
+ "revive_video",
684
+ "gameover_interstitial",
685
+ "win_interstitial",
686
+ "pause_interstitial",
687
+ "hint_video",
688
+ "win_double",
689
+ "banner"
690
+ ]
691
+ }
692
+ },
693
+ "additionalProperties": true
694
+ }
695
+ },
696
+ {
697
+ "definitionSource": "product",
698
+ "dictionaryId": "E065",
699
+ "name": "ad_rewarded_grant",
700
+ "category": "广告",
701
+ "trigger": "激励视频完整播放发奖",
702
+ "source": "MAX 包装",
703
+ "priority": "P0",
704
+ "keyFields": "与 revive_video_complete 配对",
705
+ "notes": "",
706
+ "version": 1,
707
+ "countsAsActivity": false,
708
+ "propertiesSchema": {
709
+ "type": "object",
710
+ "properties": {
711
+ "placement": {
712
+ "enum": [
713
+ "revive_video",
714
+ "gameover_interstitial",
715
+ "win_interstitial",
716
+ "pause_interstitial",
717
+ "hint_video",
718
+ "win_double",
719
+ "banner"
720
+ ]
721
+ }
722
+ },
723
+ "additionalProperties": true
724
+ }
725
+ },
726
+ {
727
+ "definitionSource": "product",
728
+ "dictionaryId": "E066",
729
+ "name": "ad_skipped",
730
+ "category": "广告",
731
+ "trigger": "可跳过广告被跳过",
732
+ "source": "MAX 包装",
733
+ "priority": "P1",
734
+ "keyFields": "频控用",
735
+ "notes": "",
736
+ "version": 1,
737
+ "countsAsActivity": false,
738
+ "propertiesSchema": {
739
+ "type": "object",
740
+ "properties": {
741
+ "placement": {
742
+ "enum": [
743
+ "revive_video",
744
+ "gameover_interstitial",
745
+ "win_interstitial",
746
+ "pause_interstitial",
747
+ "hint_video",
748
+ "win_double",
749
+ "banner"
750
+ ]
751
+ }
752
+ },
753
+ "additionalProperties": true
754
+ }
755
+ },
756
+ {
757
+ "definitionSource": "product",
758
+ "dictionaryId": "E067",
759
+ "name": "ad_close",
760
+ "category": "广告",
761
+ "trigger": "广告被关闭",
762
+ "source": "MAX 包装",
763
+ "priority": "P1",
764
+ "keyFields": "",
765
+ "notes": "",
766
+ "version": 1,
767
+ "countsAsActivity": false,
768
+ "propertiesSchema": {
769
+ "type": "object",
770
+ "properties": {
771
+ "placement": {
772
+ "enum": [
773
+ "revive_video",
774
+ "gameover_interstitial",
775
+ "win_interstitial",
776
+ "pause_interstitial",
777
+ "hint_video",
778
+ "win_double",
779
+ "banner"
780
+ ]
781
+ }
782
+ },
783
+ "additionalProperties": true
784
+ }
785
+ },
786
+ {
787
+ "definitionSource": "product",
788
+ "dictionaryId": "E120",
789
+ "name": "mediation_init_success",
790
+ "category": "广告-SDK",
791
+ "trigger": "MAX 聚合 SDK 初始化成功",
792
+ "source": "MAX",
793
+ "priority": "P0",
794
+ "keyFields": "event_id, session_id, sdk_version, country, init_latency_ms",
795
+ "notes": "启动时必报, 用于算 SDK 健康度",
796
+ "version": 1,
797
+ "countsAsActivity": false,
798
+ "propertiesSchema": {
799
+ "type": "object",
800
+ "properties": {
801
+ "sdk_version": {
802
+ "type": "string",
803
+ "maxLength": 4096
804
+ },
805
+ "country": {
806
+ "type": "string",
807
+ "maxLength": 4096
808
+ },
809
+ "init_latency_ms": {
810
+ "type": "integer",
811
+ "minimum": 0,
812
+ "maximum": 9007199254740991
813
+ }
814
+ },
815
+ "additionalProperties": true,
816
+ "required": [
817
+ "sdk_version",
818
+ "country",
819
+ "init_latency_ms"
820
+ ]
821
+ }
822
+ },
823
+ {
824
+ "definitionSource": "product",
825
+ "dictionaryId": "E121",
826
+ "name": "mediation_init_fail",
827
+ "category": "广告-SDK",
828
+ "trigger": "MAX 聚合 SDK 初始化失败",
829
+ "source": "MAX",
830
+ "priority": "P0",
831
+ "keyFields": "event_id, session_id, error_code, error_msg, retry_count",
832
+ "notes": "失败原因会直接影响当天收入=0, 要 P0 告警",
833
+ "version": 1,
834
+ "countsAsActivity": false,
835
+ "propertiesSchema": {
836
+ "type": "object",
837
+ "properties": {
838
+ "error_code": {
839
+ "type": "string",
840
+ "maxLength": 4096
841
+ },
842
+ "error_msg": {
843
+ "type": "string",
844
+ "maxLength": 4096
845
+ },
846
+ "retry_count": {
847
+ "type": "integer",
848
+ "minimum": 0,
849
+ "maximum": 9007199254740991
850
+ }
851
+ },
852
+ "additionalProperties": true,
853
+ "required": [
854
+ "error_code",
855
+ "error_msg",
856
+ "retry_count"
857
+ ]
858
+ }
859
+ },
860
+ {
861
+ "definitionSource": "product",
862
+ "dictionaryId": "E122",
863
+ "name": "adapter_init",
864
+ "category": "广告-SDK",
865
+ "trigger": "各广告源 adapter 初始化(AdMob/Meta/Unity 等)",
866
+ "source": "MAX → 子 SDK",
867
+ "priority": "P0",
868
+ "keyFields": "event_id, network, network_version, init_status(success/fail), error_code",
869
+ "notes": "粒度到每个子网络, 方便定位哪个网络挂了",
870
+ "version": 1,
871
+ "countsAsActivity": false,
872
+ "propertiesSchema": {
873
+ "type": "object",
874
+ "properties": {
875
+ "network": {
876
+ "type": "string",
877
+ "maxLength": 4096
878
+ },
879
+ "network_version": {
880
+ "type": "string",
881
+ "maxLength": 4096
882
+ },
883
+ "init_status": {
884
+ "enum": [
885
+ "success",
886
+ "fail"
887
+ ]
888
+ },
889
+ "error_code": {
890
+ "type": "string",
891
+ "maxLength": 4096
892
+ }
893
+ },
894
+ "additionalProperties": true,
895
+ "required": [
896
+ "network",
897
+ "network_version",
898
+ "init_status",
899
+ "error_code"
900
+ ]
901
+ }
902
+ },
903
+ {
904
+ "definitionSource": "product",
905
+ "dictionaryId": "E123",
906
+ "name": "ad_request_bid",
907
+ "category": "广告-请求",
908
+ "trigger": "本次请求哪些网络参与竞价",
909
+ "source": "MAX",
910
+ "priority": "P0",
911
+ "keyFields": "event_id, placement, requested_networks[], bid_responses[], winner_network, bid_price",
912
+ "notes": "★ 漏斗关键 ★ request 发出去了多少、有多少网络响应、最高价多少",
913
+ "version": 1,
914
+ "countsAsActivity": false,
915
+ "propertiesSchema": {
916
+ "type": "object",
917
+ "properties": {
918
+ "placement": {
919
+ "enum": [
920
+ "revive_video",
921
+ "gameover_interstitial",
922
+ "win_interstitial",
923
+ "pause_interstitial",
924
+ "hint_video",
925
+ "win_double",
926
+ "banner"
927
+ ]
928
+ },
929
+ "requested_networks": {
930
+ "type": "array",
931
+ "maxItems": 1000,
932
+ "items": {
933
+ "type": "string",
934
+ "maxLength": 256
935
+ }
936
+ },
937
+ "bid_responses": {
938
+ "type": "array",
939
+ "maxItems": 1000,
940
+ "items": {
941
+ "type": "object"
942
+ }
943
+ },
944
+ "winner_network": {
945
+ "type": "string",
946
+ "maxLength": 4096
947
+ },
948
+ "bid_price": {
949
+ "type": "number",
950
+ "minimum": 0
951
+ }
952
+ },
953
+ "additionalProperties": true,
954
+ "required": [
955
+ "placement",
956
+ "requested_networks",
957
+ "bid_responses",
958
+ "winner_network",
959
+ "bid_price"
960
+ ]
961
+ }
962
+ },
963
+ {
964
+ "definitionSource": "product",
965
+ "dictionaryId": "E124",
966
+ "name": "ad_no_fill",
967
+ "category": "广告-请求",
968
+ "trigger": "所有网络都没返回广告",
969
+ "source": "MAX",
970
+ "priority": "P0",
971
+ "keyFields": "event_id, placement, requested_networks, fill_rate_at_request",
972
+ "notes": "填充率 < 80% 必查, 按国家/广告位/网络看",
973
+ "version": 1,
974
+ "countsAsActivity": false,
975
+ "propertiesSchema": {
976
+ "type": "object",
977
+ "properties": {
978
+ "placement": {
979
+ "enum": [
980
+ "revive_video",
981
+ "gameover_interstitial",
982
+ "win_interstitial",
983
+ "pause_interstitial",
984
+ "hint_video",
985
+ "win_double",
986
+ "banner"
987
+ ]
988
+ },
989
+ "requested_networks": {
990
+ "type": "array",
991
+ "maxItems": 1000,
992
+ "items": {
993
+ "type": "string",
994
+ "maxLength": 256
995
+ }
996
+ },
997
+ "fill_rate_at_request": {
998
+ "type": "number",
999
+ "minimum": 0
1000
+ }
1001
+ },
1002
+ "additionalProperties": true,
1003
+ "required": [
1004
+ "placement",
1005
+ "requested_networks",
1006
+ "fill_rate_at_request"
1007
+ ]
1008
+ }
1009
+ },
1010
+ {
1011
+ "definitionSource": "product",
1012
+ "dictionaryId": "E125",
1013
+ "name": "ad_request_timeout",
1014
+ "category": "广告-请求",
1015
+ "trigger": "请求超时",
1016
+ "source": "MAX",
1017
+ "priority": "P0",
1018
+ "keyFields": "event_id, placement, network, timeout_ms, retry",
1019
+ "notes": "网络请求 > 5s 算超时, 用户看到的就是\"没广告\"",
1020
+ "version": 1,
1021
+ "countsAsActivity": false,
1022
+ "propertiesSchema": {
1023
+ "type": "object",
1024
+ "properties": {
1025
+ "placement": {
1026
+ "enum": [
1027
+ "revive_video",
1028
+ "gameover_interstitial",
1029
+ "win_interstitial",
1030
+ "pause_interstitial",
1031
+ "hint_video",
1032
+ "win_double",
1033
+ "banner"
1034
+ ]
1035
+ },
1036
+ "network": {
1037
+ "type": "string",
1038
+ "maxLength": 4096
1039
+ },
1040
+ "timeout_ms": {
1041
+ "type": "integer",
1042
+ "minimum": 0,
1043
+ "maximum": 9007199254740991
1044
+ },
1045
+ "retry": {
1046
+ "type": "integer",
1047
+ "minimum": 0,
1048
+ "maximum": 9007199254740991
1049
+ }
1050
+ },
1051
+ "additionalProperties": true,
1052
+ "required": [
1053
+ "placement",
1054
+ "network",
1055
+ "timeout_ms",
1056
+ "retry"
1057
+ ]
1058
+ }
1059
+ },
1060
+ {
1061
+ "definitionSource": "product",
1062
+ "dictionaryId": "E126",
1063
+ "name": "ad_show",
1064
+ "category": "广告-展示",
1065
+ "trigger": "广告成功展示到屏幕(首次曝光)",
1066
+ "source": "MAX",
1067
+ "priority": "P0",
1068
+ "keyFields": "event_id, placement, ad_unit_id, network, ad_format, show_latency_ms",
1069
+ "notes": "impression(已存在)算\"广告主视角曝光\", show 算\"用户实际看到\", 两者差异 = 误曝光",
1070
+ "version": 1,
1071
+ "countsAsActivity": false,
1072
+ "propertiesSchema": {
1073
+ "type": "object",
1074
+ "properties": {
1075
+ "placement": {
1076
+ "enum": [
1077
+ "revive_video",
1078
+ "gameover_interstitial",
1079
+ "win_interstitial",
1080
+ "pause_interstitial",
1081
+ "hint_video",
1082
+ "win_double",
1083
+ "banner"
1084
+ ]
1085
+ },
1086
+ "ad_unit_id": {
1087
+ "type": "string",
1088
+ "maxLength": 4096
1089
+ },
1090
+ "network": {
1091
+ "type": "string",
1092
+ "maxLength": 4096
1093
+ },
1094
+ "ad_format": {
1095
+ "type": "string",
1096
+ "maxLength": 4096
1097
+ },
1098
+ "show_latency_ms": {
1099
+ "type": "integer",
1100
+ "minimum": 0,
1101
+ "maximum": 9007199254740991
1102
+ }
1103
+ },
1104
+ "additionalProperties": true,
1105
+ "required": [
1106
+ "placement",
1107
+ "ad_unit_id",
1108
+ "network",
1109
+ "ad_format",
1110
+ "show_latency_ms"
1111
+ ]
1112
+ }
1113
+ },
1114
+ {
1115
+ "definitionSource": "product",
1116
+ "dictionaryId": "E127",
1117
+ "name": "ad_first_quartile",
1118
+ "category": "广告-展示",
1119
+ "trigger": "视频播放 25%",
1120
+ "source": "MAX",
1121
+ "priority": "P1",
1122
+ "keyFields": "event_id, placement, network, ad_unit_id, quartile, played_sec",
1123
+ "notes": "完播率拆解的 4 个节点之一",
1124
+ "version": 1,
1125
+ "countsAsActivity": false,
1126
+ "propertiesSchema": {
1127
+ "type": "object",
1128
+ "properties": {
1129
+ "placement": {
1130
+ "enum": [
1131
+ "revive_video",
1132
+ "gameover_interstitial",
1133
+ "win_interstitial",
1134
+ "pause_interstitial",
1135
+ "hint_video",
1136
+ "win_double",
1137
+ "banner"
1138
+ ]
1139
+ },
1140
+ "network": {
1141
+ "type": "string",
1142
+ "maxLength": 4096
1143
+ },
1144
+ "ad_unit_id": {
1145
+ "type": "string",
1146
+ "maxLength": 4096
1147
+ },
1148
+ "quartile": {
1149
+ "type": "integer",
1150
+ "minimum": 0,
1151
+ "maximum": 9007199254740991
1152
+ },
1153
+ "played_sec": {
1154
+ "type": "number",
1155
+ "minimum": 0
1156
+ }
1157
+ },
1158
+ "additionalProperties": true,
1159
+ "required": [
1160
+ "placement",
1161
+ "network",
1162
+ "ad_unit_id",
1163
+ "quartile",
1164
+ "played_sec"
1165
+ ]
1166
+ }
1167
+ },
1168
+ {
1169
+ "definitionSource": "product",
1170
+ "dictionaryId": "E128",
1171
+ "name": "ad_midpoint",
1172
+ "category": "广告-展示",
1173
+ "trigger": "视频播放 50%",
1174
+ "source": "MAX",
1175
+ "priority": "P1",
1176
+ "keyFields": "event_id, placement, network, ad_unit_id, quartile, played_sec",
1177
+ "notes": "完播率拆解的 4 个节点之一",
1178
+ "version": 1,
1179
+ "countsAsActivity": false,
1180
+ "propertiesSchema": {
1181
+ "type": "object",
1182
+ "properties": {
1183
+ "placement": {
1184
+ "enum": [
1185
+ "revive_video",
1186
+ "gameover_interstitial",
1187
+ "win_interstitial",
1188
+ "pause_interstitial",
1189
+ "hint_video",
1190
+ "win_double",
1191
+ "banner"
1192
+ ]
1193
+ },
1194
+ "network": {
1195
+ "type": "string",
1196
+ "maxLength": 4096
1197
+ },
1198
+ "ad_unit_id": {
1199
+ "type": "string",
1200
+ "maxLength": 4096
1201
+ },
1202
+ "quartile": {
1203
+ "type": "integer",
1204
+ "minimum": 0,
1205
+ "maximum": 9007199254740991
1206
+ },
1207
+ "played_sec": {
1208
+ "type": "number",
1209
+ "minimum": 0
1210
+ }
1211
+ },
1212
+ "additionalProperties": true,
1213
+ "required": [
1214
+ "placement",
1215
+ "network",
1216
+ "ad_unit_id",
1217
+ "quartile",
1218
+ "played_sec"
1219
+ ]
1220
+ }
1221
+ },
1222
+ {
1223
+ "definitionSource": "product",
1224
+ "dictionaryId": "E129",
1225
+ "name": "ad_third_quartile",
1226
+ "category": "广告-展示",
1227
+ "trigger": "视频播放 75%",
1228
+ "source": "MAX",
1229
+ "priority": "P1",
1230
+ "keyFields": "event_id, placement, network, ad_unit_id, quartile, played_sec",
1231
+ "notes": "完播率拆解的 4 个节点之一",
1232
+ "version": 1,
1233
+ "countsAsActivity": false,
1234
+ "propertiesSchema": {
1235
+ "type": "object",
1236
+ "properties": {
1237
+ "placement": {
1238
+ "enum": [
1239
+ "revive_video",
1240
+ "gameover_interstitial",
1241
+ "win_interstitial",
1242
+ "pause_interstitial",
1243
+ "hint_video",
1244
+ "win_double",
1245
+ "banner"
1246
+ ]
1247
+ },
1248
+ "network": {
1249
+ "type": "string",
1250
+ "maxLength": 4096
1251
+ },
1252
+ "ad_unit_id": {
1253
+ "type": "string",
1254
+ "maxLength": 4096
1255
+ },
1256
+ "quartile": {
1257
+ "type": "integer",
1258
+ "minimum": 0,
1259
+ "maximum": 9007199254740991
1260
+ },
1261
+ "played_sec": {
1262
+ "type": "number",
1263
+ "minimum": 0
1264
+ }
1265
+ },
1266
+ "additionalProperties": true,
1267
+ "required": [
1268
+ "placement",
1269
+ "network",
1270
+ "ad_unit_id",
1271
+ "quartile",
1272
+ "played_sec"
1273
+ ]
1274
+ }
1275
+ },
1276
+ {
1277
+ "definitionSource": "product",
1278
+ "dictionaryId": "E130",
1279
+ "name": "ad_complete",
1280
+ "category": "广告-展示",
1281
+ "trigger": "视频播放 100%(完播)",
1282
+ "source": "MAX",
1283
+ "priority": "P0",
1284
+ "keyFields": "event_id, placement, network, ad_unit_id, played_sec, reward_granted(yes/no)",
1285
+ "notes": "★ 完播率分子 = ad_complete / ad_show",
1286
+ "version": 1,
1287
+ "countsAsActivity": false,
1288
+ "propertiesSchema": {
1289
+ "type": "object",
1290
+ "properties": {
1291
+ "placement": {
1292
+ "enum": [
1293
+ "revive_video",
1294
+ "gameover_interstitial",
1295
+ "win_interstitial",
1296
+ "pause_interstitial",
1297
+ "hint_video",
1298
+ "win_double",
1299
+ "banner"
1300
+ ]
1301
+ },
1302
+ "network": {
1303
+ "type": "string",
1304
+ "maxLength": 4096
1305
+ },
1306
+ "ad_unit_id": {
1307
+ "type": "string",
1308
+ "maxLength": 4096
1309
+ },
1310
+ "played_sec": {
1311
+ "type": "number",
1312
+ "minimum": 0
1313
+ },
1314
+ "reward_granted": {
1315
+ "enum": [
1316
+ "yes",
1317
+ "no"
1318
+ ]
1319
+ }
1320
+ },
1321
+ "additionalProperties": true,
1322
+ "required": [
1323
+ "placement",
1324
+ "network",
1325
+ "ad_unit_id",
1326
+ "played_sec",
1327
+ "reward_granted"
1328
+ ]
1329
+ }
1330
+ },
1331
+ {
1332
+ "definitionSource": "product",
1333
+ "dictionaryId": "E131",
1334
+ "name": "ad_landing_open",
1335
+ "category": "广告-点击",
1336
+ "trigger": "点击后跳转落地页(应用商店/网页)",
1337
+ "source": "MAX",
1338
+ "priority": "P1",
1339
+ "keyFields": "event_id, placement, ad_unit_id, landing_type(store/web)",
1340
+ "notes": "iOS 14.5+ SKAN 归因关键",
1341
+ "version": 1,
1342
+ "countsAsActivity": true,
1343
+ "propertiesSchema": {
1344
+ "type": "object",
1345
+ "properties": {
1346
+ "placement": {
1347
+ "enum": [
1348
+ "revive_video",
1349
+ "gameover_interstitial",
1350
+ "win_interstitial",
1351
+ "pause_interstitial",
1352
+ "hint_video",
1353
+ "win_double",
1354
+ "banner"
1355
+ ]
1356
+ },
1357
+ "ad_unit_id": {
1358
+ "type": "string",
1359
+ "maxLength": 4096
1360
+ },
1361
+ "landing_type": {
1362
+ "enum": [
1363
+ "store",
1364
+ "web"
1365
+ ]
1366
+ }
1367
+ },
1368
+ "additionalProperties": true,
1369
+ "required": [
1370
+ "placement",
1371
+ "ad_unit_id",
1372
+ "landing_type"
1373
+ ]
1374
+ }
1375
+ },
1376
+ {
1377
+ "definitionSource": "product",
1378
+ "dictionaryId": "E132",
1379
+ "name": "ad_landing_return",
1380
+ "category": "广告-点击",
1381
+ "trigger": "从落地页返回",
1382
+ "source": "客户端",
1383
+ "priority": "P1",
1384
+ "keyFields": "event_id, placement, return_within_sec, action_after_return",
1385
+ "notes": "用于算\"误点击\"率",
1386
+ "version": 1,
1387
+ "countsAsActivity": true,
1388
+ "propertiesSchema": {
1389
+ "type": "object",
1390
+ "properties": {
1391
+ "placement": {
1392
+ "enum": [
1393
+ "revive_video",
1394
+ "gameover_interstitial",
1395
+ "win_interstitial",
1396
+ "pause_interstitial",
1397
+ "hint_video",
1398
+ "win_double",
1399
+ "banner"
1400
+ ]
1401
+ },
1402
+ "return_within_sec": {
1403
+ "type": "number",
1404
+ "minimum": 0
1405
+ },
1406
+ "action_after_return": {
1407
+ "type": "string",
1408
+ "maxLength": 4096
1409
+ }
1410
+ },
1411
+ "additionalProperties": true,
1412
+ "required": [
1413
+ "placement",
1414
+ "return_within_sec",
1415
+ "action_after_return"
1416
+ ]
1417
+ }
1418
+ },
1419
+ {
1420
+ "definitionSource": "product",
1421
+ "dictionaryId": "E133",
1422
+ "name": "ad_revenue",
1423
+ "category": "广告-收入",
1424
+ "trigger": "广告主付费(毛收入)",
1425
+ "source": "MAX / AdMob / Meta",
1426
+ "priority": "P0",
1427
+ "keyFields": "event_id, placement, ad_unit_id, network, revenue, currency, exchange_rate_usd",
1428
+ "notes": "★ MAX 上报的 revenue(毛收入), 每天对账基准",
1429
+ "version": 1,
1430
+ "countsAsActivity": false,
1431
+ "propertiesSchema": {
1432
+ "type": "object",
1433
+ "properties": {
1434
+ "placement": {
1435
+ "enum": [
1436
+ "revive_video",
1437
+ "gameover_interstitial",
1438
+ "win_interstitial",
1439
+ "pause_interstitial",
1440
+ "hint_video",
1441
+ "win_double",
1442
+ "banner"
1443
+ ]
1444
+ },
1445
+ "ad_unit_id": {
1446
+ "type": "string",
1447
+ "maxLength": 4096
1448
+ },
1449
+ "network": {
1450
+ "type": "string",
1451
+ "maxLength": 4096
1452
+ },
1453
+ "revenue": {
1454
+ "type": "number",
1455
+ "minimum": 0
1456
+ },
1457
+ "currency": {
1458
+ "type": "string",
1459
+ "maxLength": 4096
1460
+ },
1461
+ "exchange_rate_usd": {
1462
+ "type": "number",
1463
+ "minimum": 0
1464
+ }
1465
+ },
1466
+ "additionalProperties": true,
1467
+ "required": [
1468
+ "placement",
1469
+ "ad_unit_id",
1470
+ "network",
1471
+ "revenue",
1472
+ "currency",
1473
+ "exchange_rate_usd"
1474
+ ]
1475
+ }
1476
+ },
1477
+ {
1478
+ "definitionSource": "product",
1479
+ "dictionaryId": "E134",
1480
+ "name": "ad_payout",
1481
+ "category": "广告-收入",
1482
+ "trigger": "平台分成后到手(净收入)",
1483
+ "source": "MAX",
1484
+ "priority": "P0",
1485
+ "keyFields": "event_id, placement, network, gross_revenue, platform_share, net_revenue, currency",
1486
+ "notes": "净收入 = 毛收入 × (1 - 平台分成), 通常 70% 到手",
1487
+ "version": 1,
1488
+ "countsAsActivity": false,
1489
+ "propertiesSchema": {
1490
+ "type": "object",
1491
+ "properties": {
1492
+ "placement": {
1493
+ "enum": [
1494
+ "revive_video",
1495
+ "gameover_interstitial",
1496
+ "win_interstitial",
1497
+ "pause_interstitial",
1498
+ "hint_video",
1499
+ "win_double",
1500
+ "banner"
1501
+ ]
1502
+ },
1503
+ "network": {
1504
+ "type": "string",
1505
+ "maxLength": 4096
1506
+ },
1507
+ "gross_revenue": {
1508
+ "type": "number",
1509
+ "minimum": 0
1510
+ },
1511
+ "platform_share": {
1512
+ "type": "number",
1513
+ "minimum": 0
1514
+ },
1515
+ "net_revenue": {
1516
+ "type": "number",
1517
+ "minimum": 0
1518
+ },
1519
+ "currency": {
1520
+ "type": "string",
1521
+ "maxLength": 4096
1522
+ }
1523
+ },
1524
+ "additionalProperties": true,
1525
+ "required": [
1526
+ "placement",
1527
+ "network",
1528
+ "gross_revenue",
1529
+ "platform_share",
1530
+ "net_revenue",
1531
+ "currency"
1532
+ ]
1533
+ }
1534
+ },
1535
+ {
1536
+ "definitionSource": "product",
1537
+ "dictionaryId": "E135",
1538
+ "name": "ad_ecpm",
1539
+ "category": "广告-收入",
1540
+ "trigger": "千次曝光收入",
1541
+ "source": "MAX",
1542
+ "priority": "P0",
1543
+ "keyFields": "event_id, placement, network, country, ecpm_usd, impressions, ad_count",
1544
+ "notes": "★ ARPDAU 核心驱动 ★ 按 placement × country × network 看",
1545
+ "version": 1,
1546
+ "countsAsActivity": false,
1547
+ "propertiesSchema": {
1548
+ "type": "object",
1549
+ "properties": {
1550
+ "placement": {
1551
+ "enum": [
1552
+ "revive_video",
1553
+ "gameover_interstitial",
1554
+ "win_interstitial",
1555
+ "pause_interstitial",
1556
+ "hint_video",
1557
+ "win_double",
1558
+ "banner"
1559
+ ]
1560
+ },
1561
+ "network": {
1562
+ "type": "string",
1563
+ "maxLength": 4096
1564
+ },
1565
+ "country": {
1566
+ "type": "string",
1567
+ "maxLength": 4096
1568
+ },
1569
+ "ecpm_usd": {
1570
+ "type": "number",
1571
+ "minimum": 0
1572
+ },
1573
+ "impressions": {
1574
+ "type": "integer",
1575
+ "minimum": 0,
1576
+ "maximum": 9007199254740991
1577
+ },
1578
+ "ad_count": {
1579
+ "type": "integer",
1580
+ "minimum": 0,
1581
+ "maximum": 9007199254740991
1582
+ }
1583
+ },
1584
+ "additionalProperties": true,
1585
+ "required": [
1586
+ "placement",
1587
+ "network",
1588
+ "country",
1589
+ "ecpm_usd",
1590
+ "impressions",
1591
+ "ad_count"
1592
+ ]
1593
+ }
1594
+ },
1595
+ {
1596
+ "definitionSource": "product",
1597
+ "dictionaryId": "E136",
1598
+ "name": "ad_freq_cap_hit",
1599
+ "category": "广告-频控",
1600
+ "trigger": "频控命中(被拦截,未展示)",
1601
+ "source": "Remote Config",
1602
+ "priority": "P1",
1603
+ "keyFields": "event_id, placement, user_id, cap_type(level/session/day), cap_value, hit_count",
1604
+ "notes": "频控太严 → eCPM 上不去, 频控太松 → 用户被弹到崩溃",
1605
+ "version": 1,
1606
+ "countsAsActivity": false,
1607
+ "propertiesSchema": {
1608
+ "type": "object",
1609
+ "properties": {
1610
+ "placement": {
1611
+ "enum": [
1612
+ "revive_video",
1613
+ "gameover_interstitial",
1614
+ "win_interstitial",
1615
+ "pause_interstitial",
1616
+ "hint_video",
1617
+ "win_double",
1618
+ "banner"
1619
+ ]
1620
+ },
1621
+ "user_id": {
1622
+ "type": "string",
1623
+ "maxLength": 4096
1624
+ },
1625
+ "cap_type": {
1626
+ "enum": [
1627
+ "level",
1628
+ "session",
1629
+ "day"
1630
+ ]
1631
+ },
1632
+ "cap_value": {
1633
+ "type": "integer",
1634
+ "minimum": 0,
1635
+ "maximum": 9007199254740991
1636
+ },
1637
+ "hit_count": {
1638
+ "type": "integer",
1639
+ "minimum": 0,
1640
+ "maximum": 9007199254740991
1641
+ }
1642
+ },
1643
+ "additionalProperties": true,
1644
+ "required": [
1645
+ "placement",
1646
+ "user_id",
1647
+ "cap_type",
1648
+ "cap_value",
1649
+ "hit_count"
1650
+ ]
1651
+ }
1652
+ },
1653
+ {
1654
+ "definitionSource": "product",
1655
+ "dictionaryId": "E104",
1656
+ "name": "mail_claim",
1657
+ "category": "公告",
1658
+ "trigger": "领取附件",
1659
+ "source": "客户端",
1660
+ "priority": "P0",
1661
+ "keyFields": "event_id, message_id, user_id, item, count, claim_latency_sec",
1662
+ "notes": "奖励实际触达",
1663
+ "version": 1,
1664
+ "countsAsActivity": true,
1665
+ "propertiesSchema": {
1666
+ "type": "object",
1667
+ "properties": {
1668
+ "message_id": {
1669
+ "type": "string",
1670
+ "maxLength": 4096
1671
+ },
1672
+ "user_id": {
1673
+ "type": "string",
1674
+ "maxLength": 4096
1675
+ },
1676
+ "item": {
1677
+ "type": "string",
1678
+ "maxLength": 4096
1679
+ },
1680
+ "count": {
1681
+ "type": "integer",
1682
+ "minimum": 0,
1683
+ "maximum": 9007199254740991
1684
+ },
1685
+ "claim_latency_sec": {
1686
+ "type": "integer",
1687
+ "minimum": 0,
1688
+ "maximum": 9007199254740991
1689
+ }
1690
+ },
1691
+ "additionalProperties": true,
1692
+ "required": [
1693
+ "message_id",
1694
+ "user_id",
1695
+ "item",
1696
+ "count",
1697
+ "claim_latency_sec"
1698
+ ]
1699
+ }
1700
+ },
1701
+ {
1702
+ "definitionSource": "product",
1703
+ "dictionaryId": "E105",
1704
+ "name": "mail_expire",
1705
+ "category": "公告",
1706
+ "trigger": "附件过期未领",
1707
+ "source": "定时任务",
1708
+ "priority": "P0",
1709
+ "keyFields": "event_id, message_id, user_id, item, lost_value, expire_at",
1710
+ "notes": "召回改进依据:哪些活动附件过期率最高",
1711
+ "version": 1,
1712
+ "countsAsActivity": false,
1713
+ "propertiesSchema": {
1714
+ "type": "object",
1715
+ "properties": {
1716
+ "message_id": {
1717
+ "type": "string",
1718
+ "maxLength": 4096
1719
+ },
1720
+ "user_id": {
1721
+ "type": "string",
1722
+ "maxLength": 4096
1723
+ },
1724
+ "item": {
1725
+ "type": "string",
1726
+ "maxLength": 4096
1727
+ },
1728
+ "lost_value": {
1729
+ "type": "number",
1730
+ "minimum": 0
1731
+ },
1732
+ "expire_at": {
1733
+ "type": "string",
1734
+ "maxLength": 4096
1735
+ }
1736
+ },
1737
+ "additionalProperties": true,
1738
+ "required": [
1739
+ "message_id",
1740
+ "user_id",
1741
+ "item",
1742
+ "lost_value",
1743
+ "expire_at"
1744
+ ]
1745
+ }
1746
+ },
1747
+ {
1748
+ "definitionSource": "product",
1749
+ "dictionaryId": "E106",
1750
+ "name": "popup_show",
1751
+ "category": "公告",
1752
+ "trigger": "弹窗出现",
1753
+ "source": "Remote Config → 客户端",
1754
+ "priority": "P0",
1755
+ "keyFields": "event_id, popup_id, ab_version, session_count, force_show",
1756
+ "notes": "强引导转化漏斗",
1757
+ "version": 1,
1758
+ "countsAsActivity": false,
1759
+ "propertiesSchema": {
1760
+ "type": "object",
1761
+ "properties": {
1762
+ "popup_id": {
1763
+ "type": "string",
1764
+ "maxLength": 4096
1765
+ },
1766
+ "ab_version": {
1767
+ "type": "string",
1768
+ "maxLength": 4096
1769
+ },
1770
+ "session_count": {
1771
+ "type": "integer",
1772
+ "minimum": 0,
1773
+ "maximum": 9007199254740991
1774
+ },
1775
+ "force_show": {
1776
+ "type": "boolean"
1777
+ }
1778
+ },
1779
+ "additionalProperties": true,
1780
+ "required": [
1781
+ "popup_id",
1782
+ "ab_version",
1783
+ "session_count",
1784
+ "force_show"
1785
+ ]
1786
+ }
1787
+ },
1788
+ {
1789
+ "definitionSource": "product",
1790
+ "dictionaryId": "E107",
1791
+ "name": "popup_btn_click",
1792
+ "category": "公告",
1793
+ "trigger": "弹窗按钮点击",
1794
+ "source": "客户端",
1795
+ "priority": "P0",
1796
+ "keyFields": "event_id, popup_id, btn_text, btn_action, click_position",
1797
+ "notes": "主按钮 vs 关闭按钮比例",
1798
+ "version": 1,
1799
+ "countsAsActivity": true,
1800
+ "propertiesSchema": {
1801
+ "type": "object",
1802
+ "properties": {
1803
+ "popup_id": {
1804
+ "type": "string",
1805
+ "maxLength": 4096
1806
+ },
1807
+ "btn_text": {
1808
+ "type": "string",
1809
+ "maxLength": 4096
1810
+ },
1811
+ "btn_action": {
1812
+ "type": "string",
1813
+ "maxLength": 4096
1814
+ },
1815
+ "click_position": {
1816
+ "type": "integer",
1817
+ "minimum": 0,
1818
+ "maximum": 9007199254740991
1819
+ }
1820
+ },
1821
+ "additionalProperties": true,
1822
+ "required": [
1823
+ "popup_id",
1824
+ "btn_text",
1825
+ "btn_action",
1826
+ "click_position"
1827
+ ]
1828
+ }
1829
+ },
1830
+ {
1831
+ "definitionSource": "product",
1832
+ "dictionaryId": "E108",
1833
+ "name": "red_dot_show",
1834
+ "category": "公告",
1835
+ "trigger": "红点出现",
1836
+ "source": "客户端",
1837
+ "priority": "P1",
1838
+ "keyFields": "event_id, entry, count, source(mail/activity/friend/vip)",
1839
+ "notes": "运营看入口漏斗, 用得太多会麻木",
1840
+ "version": 1,
1841
+ "countsAsActivity": false,
1842
+ "propertiesSchema": {
1843
+ "type": "object",
1844
+ "properties": {
1845
+ "entry": {
1846
+ "type": "string",
1847
+ "maxLength": 4096
1848
+ },
1849
+ "count": {
1850
+ "type": "integer",
1851
+ "minimum": 0,
1852
+ "maximum": 9007199254740991
1853
+ },
1854
+ "source": {
1855
+ "enum": [
1856
+ "mail",
1857
+ "activity",
1858
+ "friend",
1859
+ "vip"
1860
+ ]
1861
+ }
1862
+ },
1863
+ "additionalProperties": true,
1864
+ "required": [
1865
+ "entry",
1866
+ "count",
1867
+ "source"
1868
+ ]
1869
+ }
1870
+ },
1871
+ {
1872
+ "definitionSource": "product",
1873
+ "dictionaryId": "E109",
1874
+ "name": "red_dot_click",
1875
+ "category": "公告",
1876
+ "trigger": "红点点击",
1877
+ "source": "客户端",
1878
+ "priority": "P1",
1879
+ "keyFields": "event_id, entry, count_before, count_after, clear_method",
1880
+ "notes": "清理转化",
1881
+ "version": 1,
1882
+ "countsAsActivity": true,
1883
+ "propertiesSchema": {
1884
+ "type": "object",
1885
+ "properties": {
1886
+ "entry": {
1887
+ "type": "string",
1888
+ "maxLength": 4096
1889
+ },
1890
+ "count_before": {
1891
+ "type": "integer",
1892
+ "minimum": 0,
1893
+ "maximum": 9007199254740991
1894
+ },
1895
+ "count_after": {
1896
+ "type": "integer",
1897
+ "minimum": 0,
1898
+ "maximum": 9007199254740991
1899
+ },
1900
+ "clear_method": {
1901
+ "type": "string",
1902
+ "maxLength": 4096
1903
+ }
1904
+ },
1905
+ "additionalProperties": true,
1906
+ "required": [
1907
+ "entry",
1908
+ "count_before",
1909
+ "count_after",
1910
+ "clear_method"
1911
+ ]
1912
+ }
1913
+ },
1914
+ {
1915
+ "definitionSource": "product",
1916
+ "dictionaryId": "E110",
1917
+ "name": "stamina_change",
1918
+ "category": "体力",
1919
+ "trigger": "体力增减",
1920
+ "source": "游戏主循环",
1921
+ "priority": "P0",
1922
+ "keyFields": "event_id, user_id, change_type(consume/recover/buy/gift), delta, before, after, reason",
1923
+ "notes": "用于算 eCPM 刺客实际发牌密度 / 用户疲劳点",
1924
+ "version": 1,
1925
+ "countsAsActivity": false,
1926
+ "propertiesSchema": {
1927
+ "type": "object",
1928
+ "properties": {
1929
+ "user_id": {
1930
+ "type": "string",
1931
+ "maxLength": 4096
1932
+ },
1933
+ "change_type": {
1934
+ "enum": [
1935
+ "consume",
1936
+ "recover",
1937
+ "buy",
1938
+ "gift"
1939
+ ]
1940
+ },
1941
+ "delta": {
1942
+ "type": "integer",
1943
+ "minimum": -9007199254740991,
1944
+ "maximum": 9007199254740991
1945
+ },
1946
+ "before": {
1947
+ "type": "integer",
1948
+ "minimum": 0,
1949
+ "maximum": 9007199254740991
1950
+ },
1951
+ "after": {
1952
+ "type": "integer",
1953
+ "minimum": 0,
1954
+ "maximum": 9007199254740991
1955
+ },
1956
+ "reason": {
1957
+ "type": "string",
1958
+ "maxLength": 4096
1959
+ }
1960
+ },
1961
+ "additionalProperties": true,
1962
+ "required": [
1963
+ "user_id",
1964
+ "change_type",
1965
+ "delta",
1966
+ "before",
1967
+ "after",
1968
+ "reason"
1969
+ ]
1970
+ }
1971
+ },
1972
+ {
1973
+ "definitionSource": "product",
1974
+ "dictionaryId": "E111",
1975
+ "name": "stamina_overflow",
1976
+ "category": "体力",
1977
+ "trigger": "体力溢出",
1978
+ "source": "游戏主循环",
1979
+ "priority": "P0",
1980
+ "keyFields": "event_id, user_id, overflow_amount, recover_at, max_stamina",
1981
+ "notes": "达到上限没领到 → 调整 max_stamina 或 recover 速率",
1982
+ "version": 1,
1983
+ "countsAsActivity": false,
1984
+ "propertiesSchema": {
1985
+ "type": "object",
1986
+ "properties": {
1987
+ "user_id": {
1988
+ "type": "string",
1989
+ "maxLength": 4096
1990
+ },
1991
+ "overflow_amount": {
1992
+ "type": "integer",
1993
+ "minimum": 0,
1994
+ "maximum": 9007199254740991
1995
+ },
1996
+ "recover_at": {
1997
+ "type": "string",
1998
+ "maxLength": 4096
1999
+ },
2000
+ "max_stamina": {
2001
+ "type": "integer",
2002
+ "minimum": 0,
2003
+ "maximum": 9007199254740991
2004
+ }
2005
+ },
2006
+ "additionalProperties": true,
2007
+ "required": [
2008
+ "user_id",
2009
+ "overflow_amount",
2010
+ "recover_at",
2011
+ "max_stamina"
2012
+ ]
2013
+ }
2014
+ },
2015
+ {
2016
+ "definitionSource": "product",
2017
+ "dictionaryId": "E070",
2018
+ "name": "config_fetch",
2019
+ "category": "配置",
2020
+ "trigger": "从 Remote Config 拉取配置",
2021
+ "source": "Remote Config",
2022
+ "priority": "P0",
2023
+ "keyFields": "event_id, user_id, config_version, fetch_latency_ms, ab_group, source(cache/network)",
2024
+ "notes": "拉配置成功=业务可用, 拉失败走兜底配置",
2025
+ "version": 1,
2026
+ "countsAsActivity": false,
2027
+ "propertiesSchema": {
2028
+ "type": "object",
2029
+ "properties": {
2030
+ "user_id": {
2031
+ "type": "string",
2032
+ "maxLength": 4096
2033
+ },
2034
+ "config_version": {
2035
+ "type": "string",
2036
+ "maxLength": 4096
2037
+ },
2038
+ "fetch_latency_ms": {
2039
+ "type": "integer",
2040
+ "minimum": 0,
2041
+ "maximum": 9007199254740991
2042
+ },
2043
+ "ab_group": {
2044
+ "type": "string",
2045
+ "maxLength": 4096
2046
+ },
2047
+ "source": {
2048
+ "enum": [
2049
+ "cache",
2050
+ "network"
2051
+ ]
2052
+ }
2053
+ },
2054
+ "additionalProperties": true,
2055
+ "required": [
2056
+ "user_id",
2057
+ "config_version",
2058
+ "fetch_latency_ms",
2059
+ "ab_group",
2060
+ "source"
2061
+ ]
2062
+ }
2063
+ },
2064
+ {
2065
+ "definitionSource": "product",
2066
+ "dictionaryId": "E071",
2067
+ "name": "config_apply",
2068
+ "category": "配置",
2069
+ "trigger": "配置生效(参数已应用到本地)",
2070
+ "source": "客户端",
2071
+ "priority": "P0",
2072
+ "keyFields": "event_id, user_id, config_version, applied_params_count, diff_params",
2073
+ "notes": "与 config_fetch 配对, 看配置真的生效了没",
2074
+ "version": 1,
2075
+ "countsAsActivity": false,
2076
+ "propertiesSchema": {
2077
+ "type": "object",
2078
+ "properties": {
2079
+ "user_id": {
2080
+ "type": "string",
2081
+ "maxLength": 4096
2082
+ },
2083
+ "config_version": {
2084
+ "type": "string",
2085
+ "maxLength": 4096
2086
+ },
2087
+ "applied_params_count": {
2088
+ "type": "integer",
2089
+ "minimum": 0,
2090
+ "maximum": 9007199254740991
2091
+ },
2092
+ "diff_params": {
2093
+ "type": "array",
2094
+ "maxItems": 1000,
2095
+ "items": {
2096
+ "type": "string",
2097
+ "maxLength": 256
2098
+ }
2099
+ }
2100
+ },
2101
+ "additionalProperties": true,
2102
+ "required": [
2103
+ "user_id",
2104
+ "config_version",
2105
+ "applied_params_count",
2106
+ "diff_params"
2107
+ ]
2108
+ }
2109
+ },
2110
+ {
2111
+ "definitionSource": "product",
2112
+ "dictionaryId": "E080",
2113
+ "name": "client_error",
2114
+ "category": "异常",
2115
+ "trigger": "客户端业务异常",
2116
+ "source": "客户端 catch",
2117
+ "priority": "P0",
2118
+ "keyFields": "event_id, error_type, error_msg, stack_trace, page, user_action",
2119
+ "notes": "业务异常(不是崩溃)— 频次突变要告警",
2120
+ "version": 1,
2121
+ "countsAsActivity": false,
2122
+ "propertiesSchema": {
2123
+ "type": "object",
2124
+ "properties": {
2125
+ "error_type": {
2126
+ "type": "string",
2127
+ "maxLength": 4096
2128
+ },
2129
+ "error_msg": {
2130
+ "type": "string",
2131
+ "maxLength": 4096
2132
+ },
2133
+ "stack_trace": {
2134
+ "type": "string",
2135
+ "maxLength": 4096
2136
+ },
2137
+ "page": {
2138
+ "type": "string",
2139
+ "maxLength": 4096
2140
+ },
2141
+ "user_action": {
2142
+ "type": "string",
2143
+ "maxLength": 4096
2144
+ }
2145
+ },
2146
+ "additionalProperties": true,
2147
+ "required": [
2148
+ "error_type",
2149
+ "error_msg",
2150
+ "stack_trace",
2151
+ "page",
2152
+ "user_action"
2153
+ ]
2154
+ }
2155
+ },
2156
+ {
2157
+ "definitionSource": "product",
2158
+ "dictionaryId": "E081",
2159
+ "name": "sdk_error",
2160
+ "category": "异常",
2161
+ "trigger": "第三方 SDK 报错",
2162
+ "source": "各 SDK 回调",
2163
+ "priority": "P0",
2164
+ "keyFields": "event_id, sdk_name, error_code, error_msg, retry_count, network",
2165
+ "notes": "SDK 异常直接影响功能可用性",
2166
+ "version": 1,
2167
+ "countsAsActivity": false,
2168
+ "propertiesSchema": {
2169
+ "type": "object",
2170
+ "properties": {
2171
+ "sdk_name": {
2172
+ "type": "string",
2173
+ "maxLength": 4096
2174
+ },
2175
+ "error_code": {
2176
+ "type": "string",
2177
+ "maxLength": 4096
2178
+ },
2179
+ "error_msg": {
2180
+ "type": "string",
2181
+ "maxLength": 4096
2182
+ },
2183
+ "retry_count": {
2184
+ "type": "integer",
2185
+ "minimum": 0,
2186
+ "maximum": 9007199254740991
2187
+ },
2188
+ "network": {
2189
+ "type": "string",
2190
+ "maxLength": 4096
2191
+ }
2192
+ },
2193
+ "additionalProperties": true,
2194
+ "required": [
2195
+ "sdk_name",
2196
+ "error_code",
2197
+ "error_msg",
2198
+ "retry_count",
2199
+ "network"
2200
+ ]
2201
+ }
2202
+ },
2203
+ {
2204
+ "definitionSource": "product",
2205
+ "dictionaryId": "E082",
2206
+ "name": "crash",
2207
+ "category": "异常",
2208
+ "trigger": "客户端崩溃",
2209
+ "source": "Crashlytics/自研",
2210
+ "priority": "P0",
2211
+ "keyFields": "event_id, stack_trace, device, os, app_version, is_recoverable",
2212
+ "notes": "崩率 > 1% 必须修, P0 告警",
2213
+ "version": 1,
2214
+ "countsAsActivity": false,
2215
+ "propertiesSchema": {
2216
+ "type": "object",
2217
+ "properties": {
2218
+ "stack_trace": {
2219
+ "type": "string",
2220
+ "maxLength": 4096
2221
+ },
2222
+ "device": {
2223
+ "type": "string",
2224
+ "maxLength": 4096
2225
+ },
2226
+ "os": {
2227
+ "type": "string",
2228
+ "maxLength": 4096
2229
+ },
2230
+ "app_version": {
2231
+ "type": "string",
2232
+ "maxLength": 4096
2233
+ },
2234
+ "is_recoverable": {
2235
+ "type": "boolean"
2236
+ }
2237
+ },
2238
+ "additionalProperties": true,
2239
+ "required": [
2240
+ "stack_trace",
2241
+ "device",
2242
+ "os",
2243
+ "app_version",
2244
+ "is_recoverable"
2245
+ ]
2246
+ }
2247
+ },
2248
+ {
2249
+ "definitionSource": "product",
2250
+ "dictionaryId": "E083",
2251
+ "name": "cheat_signal",
2252
+ "category": "异常",
2253
+ "trigger": "作弊/外挂信号",
2254
+ "source": "风控引擎",
2255
+ "priority": "P0",
2256
+ "keyFields": "event_id, cheat_type, signal_strength, device_id, action(banned/warn)",
2257
+ "notes": "改包/模拟器/越狱/root 检测",
2258
+ "version": 1,
2259
+ "countsAsActivity": false,
2260
+ "propertiesSchema": {
2261
+ "type": "object",
2262
+ "properties": {
2263
+ "cheat_type": {
2264
+ "type": "string",
2265
+ "maxLength": 4096
2266
+ },
2267
+ "signal_strength": {
2268
+ "type": "number",
2269
+ "minimum": 0
2270
+ },
2271
+ "device_id": {
2272
+ "type": "string",
2273
+ "maxLength": 4096
2274
+ },
2275
+ "action": {
2276
+ "enum": [
2277
+ "banned",
2278
+ "warn"
2279
+ ]
2280
+ }
2281
+ },
2282
+ "additionalProperties": true,
2283
+ "required": [
2284
+ "cheat_type",
2285
+ "signal_strength",
2286
+ "device_id",
2287
+ "action"
2288
+ ]
2289
+ }
2290
+ },
2291
+ {
2292
+ "definitionSource": "product",
2293
+ "dictionaryId": "E090",
2294
+ "name": "push_token_register",
2295
+ "category": "推送",
2296
+ "trigger": "设备首次注册推送 token",
2297
+ "source": "FCM / 个推 / APNs",
2298
+ "priority": "P0",
2299
+ "keyFields": "event_id, push_id, user_id, token, channel, registered_at",
2300
+ "notes": "",
2301
+ "version": 1,
2302
+ "countsAsActivity": false,
2303
+ "propertiesSchema": {
2304
+ "type": "object",
2305
+ "properties": {
2306
+ "push_id": {
2307
+ "type": "string",
2308
+ "maxLength": 4096
2309
+ },
2310
+ "user_id": {
2311
+ "type": "string",
2312
+ "maxLength": 4096
2313
+ },
2314
+ "token": {
2315
+ "type": "string",
2316
+ "maxLength": 4096
2317
+ },
2318
+ "channel": {
2319
+ "type": "string",
2320
+ "maxLength": 4096
2321
+ },
2322
+ "registered_at": {
2323
+ "type": "string",
2324
+ "maxLength": 4096
2325
+ }
2326
+ },
2327
+ "additionalProperties": true,
2328
+ "required": [
2329
+ "push_id",
2330
+ "user_id",
2331
+ "token",
2332
+ "channel",
2333
+ "registered_at"
2334
+ ]
2335
+ }
2336
+ },
2337
+ {
2338
+ "definitionSource": "product",
2339
+ "dictionaryId": "E091",
2340
+ "name": "push_token_refresh",
2341
+ "category": "推送",
2342
+ "trigger": "token 刷新(换设备/重置/过期)",
2343
+ "source": "FCM / 个推 / APNs",
2344
+ "priority": "P0",
2345
+ "keyFields": "event_id, push_id, user_id, old_token, new_token, channel, refreshed_at",
2346
+ "notes": "",
2347
+ "version": 1,
2348
+ "countsAsActivity": false,
2349
+ "propertiesSchema": {
2350
+ "type": "object",
2351
+ "properties": {
2352
+ "push_id": {
2353
+ "type": "string",
2354
+ "maxLength": 4096
2355
+ },
2356
+ "user_id": {
2357
+ "type": "string",
2358
+ "maxLength": 4096
2359
+ },
2360
+ "old_token": {
2361
+ "type": "string",
2362
+ "maxLength": 4096
2363
+ },
2364
+ "new_token": {
2365
+ "type": "string",
2366
+ "maxLength": 4096
2367
+ },
2368
+ "channel": {
2369
+ "type": "string",
2370
+ "maxLength": 4096
2371
+ },
2372
+ "refreshed_at": {
2373
+ "type": "string",
2374
+ "maxLength": 4096
2375
+ }
2376
+ },
2377
+ "additionalProperties": true,
2378
+ "required": [
2379
+ "push_id",
2380
+ "user_id",
2381
+ "old_token",
2382
+ "new_token",
2383
+ "channel",
2384
+ "refreshed_at"
2385
+ ]
2386
+ }
2387
+ },
2388
+ {
2389
+ "definitionSource": "product",
2390
+ "dictionaryId": "E092",
2391
+ "name": "push_send",
2392
+ "category": "推送",
2393
+ "trigger": "后台发起一次推送任务",
2394
+ "source": "运营后台 → Push API",
2395
+ "priority": "P0",
2396
+ "keyFields": "event_id, push_id, target_segment, target_size, channel, copy_id, ab_group, scheduled_at",
2397
+ "notes": "",
2398
+ "version": 1,
2399
+ "countsAsActivity": false,
2400
+ "propertiesSchema": {
2401
+ "type": "object",
2402
+ "properties": {
2403
+ "push_id": {
2404
+ "type": "string",
2405
+ "maxLength": 4096
2406
+ },
2407
+ "target_segment": {
2408
+ "type": "string",
2409
+ "maxLength": 4096
2410
+ },
2411
+ "target_size": {
2412
+ "type": "integer",
2413
+ "minimum": 0,
2414
+ "maximum": 9007199254740991
2415
+ },
2416
+ "channel": {
2417
+ "type": "string",
2418
+ "maxLength": 4096
2419
+ },
2420
+ "copy_id": {
2421
+ "type": "string",
2422
+ "maxLength": 4096
2423
+ },
2424
+ "ab_group": {
2425
+ "type": "string",
2426
+ "maxLength": 4096
2427
+ },
2428
+ "scheduled_at": {
2429
+ "type": "string",
2430
+ "maxLength": 4096
2431
+ }
2432
+ },
2433
+ "additionalProperties": true,
2434
+ "required": [
2435
+ "push_id",
2436
+ "target_segment",
2437
+ "target_size",
2438
+ "channel",
2439
+ "copy_id",
2440
+ "ab_group",
2441
+ "scheduled_at"
2442
+ ]
2443
+ }
2444
+ },
2445
+ {
2446
+ "definitionSource": "product",
2447
+ "dictionaryId": "E093",
2448
+ "name": "push_delivered",
2449
+ "category": "推送",
2450
+ "trigger": "API 层面送达成功",
2451
+ "source": "FCM / 个推 / APNs",
2452
+ "priority": "P0",
2453
+ "keyFields": "event_id, push_id, user_id, channel, delivered_at, latency_ms",
2454
+ "notes": "区分 received(SDK 收到)和 delivered(API 报成功)",
2455
+ "version": 1,
2456
+ "countsAsActivity": false,
2457
+ "propertiesSchema": {
2458
+ "type": "object",
2459
+ "properties": {
2460
+ "push_id": {
2461
+ "type": "string",
2462
+ "maxLength": 4096
2463
+ },
2464
+ "user_id": {
2465
+ "type": "string",
2466
+ "maxLength": 4096
2467
+ },
2468
+ "channel": {
2469
+ "type": "string",
2470
+ "maxLength": 4096
2471
+ },
2472
+ "delivered_at": {
2473
+ "type": "string",
2474
+ "maxLength": 4096
2475
+ },
2476
+ "latency_ms": {
2477
+ "type": "integer",
2478
+ "minimum": 0,
2479
+ "maximum": 9007199254740991
2480
+ }
2481
+ },
2482
+ "additionalProperties": true,
2483
+ "required": [
2484
+ "push_id",
2485
+ "user_id",
2486
+ "channel",
2487
+ "delivered_at",
2488
+ "latency_ms"
2489
+ ]
2490
+ }
2491
+ },
2492
+ {
2493
+ "definitionSource": "product",
2494
+ "dictionaryId": "E094",
2495
+ "name": "push_received",
2496
+ "category": "推送",
2497
+ "trigger": "SDK 收到推送",
2498
+ "source": "客户端",
2499
+ "priority": "P0",
2500
+ "keyFields": "event_id, push_id, user_id, received_at, push_type",
2501
+ "notes": "",
2502
+ "version": 1,
2503
+ "countsAsActivity": false,
2504
+ "propertiesSchema": {
2505
+ "type": "object",
2506
+ "properties": {
2507
+ "push_id": {
2508
+ "type": "string",
2509
+ "maxLength": 4096
2510
+ },
2511
+ "user_id": {
2512
+ "type": "string",
2513
+ "maxLength": 4096
2514
+ },
2515
+ "received_at": {
2516
+ "type": "string",
2517
+ "maxLength": 4096
2518
+ },
2519
+ "push_type": {
2520
+ "type": "string",
2521
+ "maxLength": 4096
2522
+ }
2523
+ },
2524
+ "additionalProperties": true,
2525
+ "required": [
2526
+ "push_id",
2527
+ "user_id",
2528
+ "received_at",
2529
+ "push_type"
2530
+ ]
2531
+ }
2532
+ },
2533
+ {
2534
+ "definitionSource": "product",
2535
+ "dictionaryId": "E095",
2536
+ "name": "push_open",
2537
+ "category": "推送",
2538
+ "trigger": "用户点击打开",
2539
+ "source": "客户端",
2540
+ "priority": "P0",
2541
+ "keyFields": "event_id, push_id, user_id, opened_at, deep_link",
2542
+ "notes": "",
2543
+ "version": 1,
2544
+ "countsAsActivity": true,
2545
+ "propertiesSchema": {
2546
+ "type": "object",
2547
+ "properties": {
2548
+ "push_id": {
2549
+ "type": "string",
2550
+ "maxLength": 4096
2551
+ },
2552
+ "user_id": {
2553
+ "type": "string",
2554
+ "maxLength": 4096
2555
+ },
2556
+ "opened_at": {
2557
+ "type": "string",
2558
+ "maxLength": 4096
2559
+ },
2560
+ "deep_link": {
2561
+ "type": "string",
2562
+ "maxLength": 4096
2563
+ }
2564
+ },
2565
+ "additionalProperties": true,
2566
+ "required": [
2567
+ "push_id",
2568
+ "user_id",
2569
+ "opened_at",
2570
+ "deep_link"
2571
+ ]
2572
+ }
2573
+ },
2574
+ {
2575
+ "definitionSource": "product",
2576
+ "dictionaryId": "E096",
2577
+ "name": "push_dismiss",
2578
+ "category": "推送",
2579
+ "trigger": "收到但划掉未点击",
2580
+ "source": "客户端",
2581
+ "priority": "P1",
2582
+ "keyFields": "event_id, push_id, user_id, dismissed_at, displayed_duration_ms",
2583
+ "notes": "漏斗关键节点:知道用户没点但看到了",
2584
+ "version": 1,
2585
+ "countsAsActivity": false,
2586
+ "propertiesSchema": {
2587
+ "type": "object",
2588
+ "properties": {
2589
+ "push_id": {
2590
+ "type": "string",
2591
+ "maxLength": 4096
2592
+ },
2593
+ "user_id": {
2594
+ "type": "string",
2595
+ "maxLength": 4096
2596
+ },
2597
+ "dismissed_at": {
2598
+ "type": "string",
2599
+ "maxLength": 4096
2600
+ },
2601
+ "displayed_duration_ms": {
2602
+ "type": "integer",
2603
+ "minimum": 0,
2604
+ "maximum": 9007199254740991
2605
+ }
2606
+ },
2607
+ "additionalProperties": true,
2608
+ "required": [
2609
+ "push_id",
2610
+ "user_id",
2611
+ "dismissed_at",
2612
+ "displayed_duration_ms"
2613
+ ]
2614
+ }
2615
+ },
2616
+ {
2617
+ "definitionSource": "product",
2618
+ "dictionaryId": "E097",
2619
+ "name": "push_convert",
2620
+ "category": "推送",
2621
+ "trigger": "收到/点击后 24h 内回流",
2622
+ "source": "客户端",
2623
+ "priority": "P0",
2624
+ "keyFields": "event_id, push_id, user_id, converted_at, return_within_sec, action_after_return",
2625
+ "notes": "★ 推送真正 KPI ★ — 比 push_open 更能反映文案转化质量",
2626
+ "version": 1,
2627
+ "countsAsActivity": true,
2628
+ "propertiesSchema": {
2629
+ "type": "object",
2630
+ "properties": {
2631
+ "push_id": {
2632
+ "type": "string",
2633
+ "maxLength": 4096
2634
+ },
2635
+ "user_id": {
2636
+ "type": "string",
2637
+ "maxLength": 4096
2638
+ },
2639
+ "converted_at": {
2640
+ "type": "string",
2641
+ "maxLength": 4096
2642
+ },
2643
+ "return_within_sec": {
2644
+ "type": "number",
2645
+ "minimum": 0
2646
+ },
2647
+ "action_after_return": {
2648
+ "type": "string",
2649
+ "maxLength": 4096
2650
+ }
2651
+ },
2652
+ "additionalProperties": true,
2653
+ "required": [
2654
+ "push_id",
2655
+ "user_id",
2656
+ "converted_at",
2657
+ "return_within_sec",
2658
+ "action_after_return"
2659
+ ]
2660
+ }
2661
+ },
2662
+ {
2663
+ "definitionSource": "product",
2664
+ "dictionaryId": "E098",
2665
+ "name": "push_channel_fail",
2666
+ "category": "推送",
2667
+ "trigger": "通道失败",
2668
+ "source": "FCM / 个推 / APNs",
2669
+ "priority": "P0",
2670
+ "keyFields": "event_id, push_id, user_id, channel, error_code, error_msg, retry_count",
2671
+ "notes": "通道侧失败:APNs BadDeviceToken / FCM InvalidRegistration 等",
2672
+ "version": 1,
2673
+ "countsAsActivity": false,
2674
+ "propertiesSchema": {
2675
+ "type": "object",
2676
+ "properties": {
2677
+ "push_id": {
2678
+ "type": "string",
2679
+ "maxLength": 4096
2680
+ },
2681
+ "user_id": {
2682
+ "type": "string",
2683
+ "maxLength": 4096
2684
+ },
2685
+ "channel": {
2686
+ "type": "string",
2687
+ "maxLength": 4096
2688
+ },
2689
+ "error_code": {
2690
+ "type": "string",
2691
+ "maxLength": 4096
2692
+ },
2693
+ "error_msg": {
2694
+ "type": "string",
2695
+ "maxLength": 4096
2696
+ },
2697
+ "retry_count": {
2698
+ "type": "integer",
2699
+ "minimum": 0,
2700
+ "maximum": 9007199254740991
2701
+ }
2702
+ },
2703
+ "additionalProperties": true,
2704
+ "required": [
2705
+ "push_id",
2706
+ "user_id",
2707
+ "channel",
2708
+ "error_code",
2709
+ "error_msg",
2710
+ "retry_count"
2711
+ ]
2712
+ }
2713
+ },
2714
+ {
2715
+ "definitionSource": "product",
2716
+ "dictionaryId": "E100",
2717
+ "name": "marquee_show",
2718
+ "category": "公告",
2719
+ "trigger": "跑马灯曝光",
2720
+ "source": "Remote Config → 客户端",
2721
+ "priority": "P0",
2722
+ "keyFields": "event_id, marquee_id, ab_version, country, session_id, position, exposure_duration_ms",
2723
+ "notes": "每条按曝光计, 看\"我配的跑马灯到底多少人看到\"",
2724
+ "version": 1,
2725
+ "countsAsActivity": false,
2726
+ "propertiesSchema": {
2727
+ "type": "object",
2728
+ "properties": {
2729
+ "marquee_id": {
2730
+ "type": "string",
2731
+ "maxLength": 4096
2732
+ },
2733
+ "ab_version": {
2734
+ "type": "string",
2735
+ "maxLength": 4096
2736
+ },
2737
+ "country": {
2738
+ "type": "string",
2739
+ "maxLength": 4096
2740
+ },
2741
+ "position": {
2742
+ "type": "string",
2743
+ "maxLength": 4096
2744
+ },
2745
+ "exposure_duration_ms": {
2746
+ "type": "integer",
2747
+ "minimum": 0,
2748
+ "maximum": 9007199254740991
2749
+ }
2750
+ },
2751
+ "additionalProperties": true,
2752
+ "required": [
2753
+ "marquee_id",
2754
+ "ab_version",
2755
+ "country",
2756
+ "position",
2757
+ "exposure_duration_ms"
2758
+ ]
2759
+ }
2760
+ },
2761
+ {
2762
+ "definitionSource": "product",
2763
+ "dictionaryId": "E101",
2764
+ "name": "marquee_click",
2765
+ "category": "公告",
2766
+ "trigger": "跑马灯点击",
2767
+ "source": "客户端",
2768
+ "priority": "P0",
2769
+ "keyFields": "event_id, marquee_id, link_action, ab_version, click_latency_ms",
2770
+ "notes": "A/B 文案胜出依据",
2771
+ "version": 1,
2772
+ "countsAsActivity": true,
2773
+ "propertiesSchema": {
2774
+ "type": "object",
2775
+ "properties": {
2776
+ "marquee_id": {
2777
+ "type": "string",
2778
+ "maxLength": 4096
2779
+ },
2780
+ "link_action": {
2781
+ "type": "string",
2782
+ "maxLength": 4096
2783
+ },
2784
+ "ab_version": {
2785
+ "type": "string",
2786
+ "maxLength": 4096
2787
+ },
2788
+ "click_latency_ms": {
2789
+ "type": "number",
2790
+ "minimum": 0
2791
+ }
2792
+ },
2793
+ "additionalProperties": true,
2794
+ "required": [
2795
+ "marquee_id",
2796
+ "link_action",
2797
+ "ab_version",
2798
+ "click_latency_ms"
2799
+ ]
2800
+ }
2801
+ },
2802
+ {
2803
+ "definitionSource": "product",
2804
+ "dictionaryId": "E102",
2805
+ "name": "mail_new",
2806
+ "category": "公告",
2807
+ "trigger": "收到新站内信",
2808
+ "source": "消息中心 → 客户端",
2809
+ "priority": "P0",
2810
+ "keyFields": "event_id, message_id, template_id, user_id, has_attachment",
2811
+ "notes": "通道到达监控, 分母",
2812
+ "version": 1,
2813
+ "countsAsActivity": false,
2814
+ "propertiesSchema": {
2815
+ "type": "object",
2816
+ "properties": {
2817
+ "message_id": {
2818
+ "type": "string",
2819
+ "maxLength": 4096
2820
+ },
2821
+ "template_id": {
2822
+ "type": "string",
2823
+ "maxLength": 4096
2824
+ },
2825
+ "user_id": {
2826
+ "type": "string",
2827
+ "maxLength": 4096
2828
+ },
2829
+ "has_attachment": {
2830
+ "type": "boolean"
2831
+ }
2832
+ },
2833
+ "additionalProperties": true,
2834
+ "required": [
2835
+ "message_id",
2836
+ "template_id",
2837
+ "user_id",
2838
+ "has_attachment"
2839
+ ]
2840
+ }
2841
+ },
2842
+ {
2843
+ "definitionSource": "product",
2844
+ "dictionaryId": "E103",
2845
+ "name": "mail_read",
2846
+ "category": "公告",
2847
+ "trigger": "打开站内信",
2848
+ "source": "客户端",
2849
+ "priority": "P0",
2850
+ "keyFields": "event_id, message_id, user_id, time_to_read_sec",
2851
+ "notes": "用户活跃度, time_to_read 用于召回时机优化",
2852
+ "version": 1,
2853
+ "countsAsActivity": true,
2854
+ "propertiesSchema": {
2855
+ "type": "object",
2856
+ "properties": {
2857
+ "message_id": {
2858
+ "type": "string",
2859
+ "maxLength": 4096
2860
+ },
2861
+ "user_id": {
2862
+ "type": "string",
2863
+ "maxLength": 4096
2864
+ },
2865
+ "time_to_read_sec": {
2866
+ "type": "number",
2867
+ "minimum": 0
2868
+ }
2869
+ },
2870
+ "additionalProperties": true,
2871
+ "required": [
2872
+ "message_id",
2873
+ "user_id",
2874
+ "time_to_read_sec"
2875
+ ]
2876
+ }
2877
+ }
2878
+ ]