make-mp-data 3.0.3 → 3.0.5

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 (70) hide show
  1. package/README.md +46 -0
  2. package/dungeons/array-of-object-lookup-schema.json +327 -0
  3. package/dungeons/array-of-object-lookup.js +29 -9
  4. package/dungeons/capstone/capstone-ic3.js +291 -0
  5. package/dungeons/capstone/capstone-ic4.js +598 -0
  6. package/dungeons/capstone/capstone-ic5.js +668 -0
  7. package/dungeons/capstone/generate-product-lookup.js +309 -0
  8. package/dungeons/ecommerce-schema.json +462 -0
  9. package/dungeons/{copilot.js → ecommerce.js} +79 -17
  10. package/dungeons/education-schema.json +2409 -0
  11. package/dungeons/education.js +226 -462
  12. package/dungeons/fintech-schema.json +14034 -0
  13. package/dungeons/fintech.js +134 -413
  14. package/dungeons/foobar-schema.json +403 -0
  15. package/dungeons/foobar.js +27 -4
  16. package/dungeons/food-delivery-schema.json +192 -0
  17. package/dungeons/food-delivery.js +602 -0
  18. package/dungeons/food-schema.json +1152 -0
  19. package/dungeons/food.js +173 -406
  20. package/dungeons/gaming-schema.json +1270 -0
  21. package/dungeons/gaming.js +182 -42
  22. package/dungeons/insurance-application-schema.json +204 -0
  23. package/dungeons/insurance-application.js +605 -0
  24. package/dungeons/media-schema.json +906 -0
  25. package/dungeons/media.js +250 -420
  26. package/dungeons/retention-cadence-schema.json +78 -0
  27. package/dungeons/retention-cadence.js +35 -1
  28. package/dungeons/rpg-schema.json +4526 -0
  29. package/dungeons/rpg.js +171 -429
  30. package/dungeons/sanity-schema.json +255 -0
  31. package/dungeons/sanity.js +21 -10
  32. package/dungeons/sass-schema.json +1291 -0
  33. package/dungeons/sass.js +241 -368
  34. package/dungeons/scd-schema.json +919 -0
  35. package/dungeons/scd.js +41 -13
  36. package/dungeons/simple-schema.json +608 -0
  37. package/dungeons/simple.js +52 -15
  38. package/dungeons/simplest-schema.json +1418 -0
  39. package/dungeons/simplest.js +392 -0
  40. package/dungeons/social-schema.json +1118 -0
  41. package/dungeons/social.js +150 -391
  42. package/dungeons/text-generation-schema.json +3096 -0
  43. package/dungeons/text-generation.js +71 -0
  44. package/index.js +8 -6
  45. package/lib/core/config-validator.js +28 -8
  46. package/lib/core/storage.js +5 -5
  47. package/lib/generators/events.js +4 -4
  48. package/lib/orchestrators/mixpanel-sender.js +16 -13
  49. package/lib/orchestrators/user-loop.js +14 -6
  50. package/lib/templates/soup-presets.js +188 -0
  51. package/lib/utils/utils.js +52 -6
  52. package/package.json +1 -1
  53. package/types.d.ts +20 -3
  54. package/dungeons/adspend.js +0 -130
  55. package/dungeons/anon.js +0 -128
  56. package/dungeons/benchmark-heavy.js +0 -240
  57. package/dungeons/benchmark-light.js +0 -140
  58. package/dungeons/big.js +0 -226
  59. package/dungeons/business.js +0 -391
  60. package/dungeons/complex.js +0 -428
  61. package/dungeons/experiments.js +0 -137
  62. package/dungeons/funnels.js +0 -309
  63. package/dungeons/mil.js +0 -323
  64. package/dungeons/mirror.js +0 -161
  65. package/dungeons/soup-test.js +0 -52
  66. package/dungeons/streaming.js +0 -372
  67. package/dungeons/strict-event-test.js +0 -30
  68. package/dungeons/student-teacher.js +0 -438
  69. package/dungeons/too-big-events.js +0 -203
  70. package/dungeons/user-agent.js +0 -209
@@ -0,0 +1,1291 @@
1
+ {
2
+ "schema": {
3
+ "token": "",
4
+ "seed": "harness-sass",
5
+ "numDays": 100,
6
+ "numEvents": 600000,
7
+ "numUsers": 5000,
8
+ "hasAnonIds": false,
9
+ "hasSessionIds": true,
10
+ "format": "json",
11
+ "gzip": true,
12
+ "alsoInferFunnels": false,
13
+ "hasLocation": true,
14
+ "hasAndroidDevices": false,
15
+ "hasIOSDevices": false,
16
+ "hasDesktopDevices": true,
17
+ "hasBrowser": true,
18
+ "hasCampaigns": false,
19
+ "isAnonymous": false,
20
+ "hasAdSpend": false,
21
+ "percentUsersBornInDataset": 50,
22
+ "hasAvatar": true,
23
+ "batchSize": 2500000,
24
+ "concurrency": 1,
25
+ "writeToDisk": false,
26
+ "scdProps": {},
27
+ "funnels": [
28
+ {
29
+ "sequence": [
30
+ "workspace created",
31
+ "service deployed",
32
+ "dashboard viewed"
33
+ ],
34
+ "isFirstFunnel": true,
35
+ "conversionRate": 70,
36
+ "timeToConvert": 2
37
+ },
38
+ {
39
+ "sequence": [
40
+ "dashboard viewed",
41
+ "query executed",
42
+ "api call"
43
+ ],
44
+ "conversionRate": 80,
45
+ "timeToConvert": 0.5,
46
+ "weight": 5
47
+ },
48
+ {
49
+ "sequence": [
50
+ "alert triggered",
51
+ "alert acknowledged",
52
+ "alert resolved"
53
+ ],
54
+ "conversionRate": 55,
55
+ "timeToConvert": 6,
56
+ "weight": 4
57
+ },
58
+ {
59
+ "sequence": [
60
+ "deployment pipeline run",
61
+ "service deployed",
62
+ "dashboard viewed"
63
+ ],
64
+ "conversionRate": 65,
65
+ "timeToConvert": 1,
66
+ "weight": 3
67
+ },
68
+ {
69
+ "sequence": [
70
+ "cost report generated",
71
+ "infrastructure scaled",
72
+ "security scan"
73
+ ],
74
+ "conversionRate": 50,
75
+ "timeToConvert": 4,
76
+ "weight": 2
77
+ },
78
+ {
79
+ "sequence": [
80
+ "team member invited",
81
+ "integration configured",
82
+ "feature flag toggled"
83
+ ],
84
+ "conversionRate": 40,
85
+ "timeToConvert": 8,
86
+ "weight": 2
87
+ },
88
+ {
89
+ "sequence": [
90
+ "documentation viewed",
91
+ "runbook executed",
92
+ "service deployed"
93
+ ],
94
+ "conversionRate": 45,
95
+ "timeToConvert": 2,
96
+ "weight": 2
97
+ },
98
+ {
99
+ "sequence": [
100
+ "billing event",
101
+ "dashboard viewed"
102
+ ],
103
+ "conversionRate": 60,
104
+ "timeToConvert": 1,
105
+ "weight": 1
106
+ }
107
+ ],
108
+ "events": [
109
+ {
110
+ "event": "workspace created",
111
+ "weight": 1,
112
+ "isFirstEvent": true,
113
+ "properties": {
114
+ "company_size": [
115
+ "startup",
116
+ "smb",
117
+ "mid_market",
118
+ "enterprise"
119
+ ],
120
+ "industry": [
121
+ "tech",
122
+ "finance",
123
+ "healthcare",
124
+ "retail",
125
+ "media"
126
+ ]
127
+ }
128
+ },
129
+ {
130
+ "event": "service deployed",
131
+ "weight": 10,
132
+ "properties": {
133
+ "service_id": {
134
+ "functionName": "arrow",
135
+ "body": "function () {\n\t\tconst weighted = [];\n\t\tfor (let i = 0; i < 10; i++) {\n\t\t\tconst rand = chance.d10(); // Random number between 1 and 10\n\n\t\t\t// 35% chance to favor the most chosen index\n\t\t\tif (chance.bool({ likelihood: 35 })) {\n\t\t\t\t// 50% chance to slightly alter the index\n\t\t\t\tif (chance.bool({ likelihood: 50 })) {\n\t\t\t\t\tweighted.push(items[mostChosenIndex]);\n\t\t\t\t} else {\n\t\t\t\t\tconst addOrSubtract = chance.bool({ likelihood: 50 }) ? -rand : rand;\n\t\t\t\t\tlet newIndex = mostChosenIndex + addOrSubtract;\n\n\t\t\t\t\t// Ensure newIndex is within bounds\n\t\t\t\t\tif (newIndex < 0) newIndex = 0;\n\t\t\t\t\tif (newIndex >= items.length) newIndex = items.length - 1;\n\t\t\t\t\tweighted.push(items[newIndex]);\n\t\t\t\t}\n\t\t\t}\n\t\t\t// 25% chance to favor the second most chosen index\n\t\t\telse if (chance.bool({ likelihood: 25 })) {\n\t\t\t\tweighted.push(items[secondMostChosenIndex]);\n\t\t\t}\n\t\t\t// 15% chance to favor the third most chosen index\n\t\t\telse if (chance.bool({ likelihood: 15 })) {\n\t\t\t\tweighted.push(items[thirdMostChosenIndex]);\n\t\t\t}\n\t\t\t// Otherwise, pick a random item from the list\n\t\t\telse {\n\t\t\t\tweighted.push(chance.pickone(items));\n\t\t\t}\n\t\t}\n\t\treturn weighted;\n\t}"
136
+ },
137
+ "service_type": [
138
+ "web_app",
139
+ "api",
140
+ "database",
141
+ "cache",
142
+ "queue",
143
+ "ml_model"
144
+ ],
145
+ "environment": [
146
+ "production",
147
+ "staging",
148
+ "dev"
149
+ ],
150
+ "cloud_provider": [
151
+ "aws",
152
+ "gcp",
153
+ "azure"
154
+ ]
155
+ }
156
+ },
157
+ {
158
+ "event": "dashboard viewed",
159
+ "weight": 20,
160
+ "properties": {
161
+ "dashboard_type": [
162
+ "overview",
163
+ "cost",
164
+ "performance",
165
+ "security",
166
+ "custom"
167
+ ],
168
+ "time_range": [
169
+ "1h",
170
+ "6h",
171
+ "24h",
172
+ "7d",
173
+ "30d"
174
+ ]
175
+ }
176
+ },
177
+ {
178
+ "event": "alert triggered",
179
+ "weight": 12,
180
+ "properties": {
181
+ "alert_id": {
182
+ "functionName": "arrow",
183
+ "body": "function () {\n\t\tconst weighted = [];\n\t\tfor (let i = 0; i < 10; i++) {\n\t\t\tconst rand = chance.d10(); // Random number between 1 and 10\n\n\t\t\t// 35% chance to favor the most chosen index\n\t\t\tif (chance.bool({ likelihood: 35 })) {\n\t\t\t\t// 50% chance to slightly alter the index\n\t\t\t\tif (chance.bool({ likelihood: 50 })) {\n\t\t\t\t\tweighted.push(items[mostChosenIndex]);\n\t\t\t\t} else {\n\t\t\t\t\tconst addOrSubtract = chance.bool({ likelihood: 50 }) ? -rand : rand;\n\t\t\t\t\tlet newIndex = mostChosenIndex + addOrSubtract;\n\n\t\t\t\t\t// Ensure newIndex is within bounds\n\t\t\t\t\tif (newIndex < 0) newIndex = 0;\n\t\t\t\t\tif (newIndex >= items.length) newIndex = items.length - 1;\n\t\t\t\t\tweighted.push(items[newIndex]);\n\t\t\t\t}\n\t\t\t}\n\t\t\t// 25% chance to favor the second most chosen index\n\t\t\telse if (chance.bool({ likelihood: 25 })) {\n\t\t\t\tweighted.push(items[secondMostChosenIndex]);\n\t\t\t}\n\t\t\t// 15% chance to favor the third most chosen index\n\t\t\telse if (chance.bool({ likelihood: 15 })) {\n\t\t\t\tweighted.push(items[thirdMostChosenIndex]);\n\t\t\t}\n\t\t\t// Otherwise, pick a random item from the list\n\t\t\telse {\n\t\t\t\tweighted.push(chance.pickone(items));\n\t\t\t}\n\t\t}\n\t\treturn weighted;\n\t}"
184
+ },
185
+ "severity": [
186
+ "info",
187
+ "warning",
188
+ "critical",
189
+ "emergency"
190
+ ],
191
+ "alert_type": [
192
+ "cpu",
193
+ "memory",
194
+ "latency",
195
+ "error_rate",
196
+ "disk",
197
+ "network"
198
+ ],
199
+ "service_id": {
200
+ "functionName": "arrow",
201
+ "body": "function () {\n\t\tconst weighted = [];\n\t\tfor (let i = 0; i < 10; i++) {\n\t\t\tconst rand = chance.d10(); // Random number between 1 and 10\n\n\t\t\t// 35% chance to favor the most chosen index\n\t\t\tif (chance.bool({ likelihood: 35 })) {\n\t\t\t\t// 50% chance to slightly alter the index\n\t\t\t\tif (chance.bool({ likelihood: 50 })) {\n\t\t\t\t\tweighted.push(items[mostChosenIndex]);\n\t\t\t\t} else {\n\t\t\t\t\tconst addOrSubtract = chance.bool({ likelihood: 50 }) ? -rand : rand;\n\t\t\t\t\tlet newIndex = mostChosenIndex + addOrSubtract;\n\n\t\t\t\t\t// Ensure newIndex is within bounds\n\t\t\t\t\tif (newIndex < 0) newIndex = 0;\n\t\t\t\t\tif (newIndex >= items.length) newIndex = items.length - 1;\n\t\t\t\t\tweighted.push(items[newIndex]);\n\t\t\t\t}\n\t\t\t}\n\t\t\t// 25% chance to favor the second most chosen index\n\t\t\telse if (chance.bool({ likelihood: 25 })) {\n\t\t\t\tweighted.push(items[secondMostChosenIndex]);\n\t\t\t}\n\t\t\t// 15% chance to favor the third most chosen index\n\t\t\telse if (chance.bool({ likelihood: 15 })) {\n\t\t\t\tweighted.push(items[thirdMostChosenIndex]);\n\t\t\t}\n\t\t\t// Otherwise, pick a random item from the list\n\t\t\telse {\n\t\t\t\tweighted.push(chance.pickone(items));\n\t\t\t}\n\t\t}\n\t\treturn weighted;\n\t}"
202
+ }
203
+ }
204
+ },
205
+ {
206
+ "event": "alert acknowledged",
207
+ "weight": 8,
208
+ "properties": {
209
+ "alert_id": {
210
+ "functionName": "arrow",
211
+ "body": "function () {\n\t\tconst weighted = [];\n\t\tfor (let i = 0; i < 10; i++) {\n\t\t\tconst rand = chance.d10(); // Random number between 1 and 10\n\n\t\t\t// 35% chance to favor the most chosen index\n\t\t\tif (chance.bool({ likelihood: 35 })) {\n\t\t\t\t// 50% chance to slightly alter the index\n\t\t\t\tif (chance.bool({ likelihood: 50 })) {\n\t\t\t\t\tweighted.push(items[mostChosenIndex]);\n\t\t\t\t} else {\n\t\t\t\t\tconst addOrSubtract = chance.bool({ likelihood: 50 }) ? -rand : rand;\n\t\t\t\t\tlet newIndex = mostChosenIndex + addOrSubtract;\n\n\t\t\t\t\t// Ensure newIndex is within bounds\n\t\t\t\t\tif (newIndex < 0) newIndex = 0;\n\t\t\t\t\tif (newIndex >= items.length) newIndex = items.length - 1;\n\t\t\t\t\tweighted.push(items[newIndex]);\n\t\t\t\t}\n\t\t\t}\n\t\t\t// 25% chance to favor the second most chosen index\n\t\t\telse if (chance.bool({ likelihood: 25 })) {\n\t\t\t\tweighted.push(items[secondMostChosenIndex]);\n\t\t\t}\n\t\t\t// 15% chance to favor the third most chosen index\n\t\t\telse if (chance.bool({ likelihood: 15 })) {\n\t\t\t\tweighted.push(items[thirdMostChosenIndex]);\n\t\t\t}\n\t\t\t// Otherwise, pick a random item from the list\n\t\t\telse {\n\t\t\t\tweighted.push(chance.pickone(items));\n\t\t\t}\n\t\t}\n\t\treturn weighted;\n\t}"
212
+ },
213
+ "response_time_mins": [
214
+ 48,
215
+ 60,
216
+ 117,
217
+ 21,
218
+ 33,
219
+ 51,
220
+ 57,
221
+ 110,
222
+ 79,
223
+ 11,
224
+ 61,
225
+ 72,
226
+ 37,
227
+ 84,
228
+ 33,
229
+ 42,
230
+ 29,
231
+ 47,
232
+ 100,
233
+ 68,
234
+ 79,
235
+ 10,
236
+ 45,
237
+ 67,
238
+ 50,
239
+ 58,
240
+ 51,
241
+ 20,
242
+ 68,
243
+ 84,
244
+ 30,
245
+ 27,
246
+ 93,
247
+ 53,
248
+ 31,
249
+ 106,
250
+ 28,
251
+ 49,
252
+ 26,
253
+ 70,
254
+ 59,
255
+ 51,
256
+ 33,
257
+ 61,
258
+ 46,
259
+ 49,
260
+ 51,
261
+ 46,
262
+ 66,
263
+ 33
264
+ ],
265
+ "acknowledged_by_role": [
266
+ "engineer",
267
+ "sre",
268
+ "manager",
269
+ "oncall"
270
+ ]
271
+ }
272
+ },
273
+ {
274
+ "event": "alert resolved",
275
+ "weight": 7,
276
+ "properties": {
277
+ "alert_id": {
278
+ "functionName": "arrow",
279
+ "body": "function () {\n\t\tconst weighted = [];\n\t\tfor (let i = 0; i < 10; i++) {\n\t\t\tconst rand = chance.d10(); // Random number between 1 and 10\n\n\t\t\t// 35% chance to favor the most chosen index\n\t\t\tif (chance.bool({ likelihood: 35 })) {\n\t\t\t\t// 50% chance to slightly alter the index\n\t\t\t\tif (chance.bool({ likelihood: 50 })) {\n\t\t\t\t\tweighted.push(items[mostChosenIndex]);\n\t\t\t\t} else {\n\t\t\t\t\tconst addOrSubtract = chance.bool({ likelihood: 50 }) ? -rand : rand;\n\t\t\t\t\tlet newIndex = mostChosenIndex + addOrSubtract;\n\n\t\t\t\t\t// Ensure newIndex is within bounds\n\t\t\t\t\tif (newIndex < 0) newIndex = 0;\n\t\t\t\t\tif (newIndex >= items.length) newIndex = items.length - 1;\n\t\t\t\t\tweighted.push(items[newIndex]);\n\t\t\t\t}\n\t\t\t}\n\t\t\t// 25% chance to favor the second most chosen index\n\t\t\telse if (chance.bool({ likelihood: 25 })) {\n\t\t\t\tweighted.push(items[secondMostChosenIndex]);\n\t\t\t}\n\t\t\t// 15% chance to favor the third most chosen index\n\t\t\telse if (chance.bool({ likelihood: 15 })) {\n\t\t\t\tweighted.push(items[thirdMostChosenIndex]);\n\t\t\t}\n\t\t\t// Otherwise, pick a random item from the list\n\t\t\telse {\n\t\t\t\tweighted.push(chance.pickone(items));\n\t\t\t}\n\t\t}\n\t\treturn weighted;\n\t}"
280
+ },
281
+ "resolution_time_mins": [
282
+ 1305,
283
+ 549,
284
+ 716,
285
+ 805,
286
+ 683,
287
+ 998,
288
+ 723,
289
+ 382,
290
+ 197,
291
+ 545,
292
+ 723,
293
+ 374,
294
+ 9,
295
+ 983,
296
+ 360,
297
+ 157,
298
+ 1023,
299
+ 298,
300
+ 1271,
301
+ 944,
302
+ 640,
303
+ 1058,
304
+ 535,
305
+ 544,
306
+ 661,
307
+ 628,
308
+ 371,
309
+ 703,
310
+ 581,
311
+ 474,
312
+ 457,
313
+ 344,
314
+ 823,
315
+ 83,
316
+ 664,
317
+ 617,
318
+ 733,
319
+ 596,
320
+ 844,
321
+ 951,
322
+ 481,
323
+ 421,
324
+ 124,
325
+ 361,
326
+ 159,
327
+ 681,
328
+ 1195,
329
+ 290,
330
+ 391,
331
+ 133
332
+ ],
333
+ "root_cause": [
334
+ "config_change",
335
+ "capacity",
336
+ "bug",
337
+ "dependency",
338
+ "network"
339
+ ]
340
+ }
341
+ },
342
+ {
343
+ "event": "deployment pipeline run",
344
+ "weight": 9,
345
+ "properties": {
346
+ "pipeline_id": {
347
+ "functionName": "arrow",
348
+ "body": "function () {\n\t\tconst weighted = [];\n\t\tfor (let i = 0; i < 10; i++) {\n\t\t\tconst rand = chance.d10(); // Random number between 1 and 10\n\n\t\t\t// 35% chance to favor the most chosen index\n\t\t\tif (chance.bool({ likelihood: 35 })) {\n\t\t\t\t// 50% chance to slightly alter the index\n\t\t\t\tif (chance.bool({ likelihood: 50 })) {\n\t\t\t\t\tweighted.push(items[mostChosenIndex]);\n\t\t\t\t} else {\n\t\t\t\t\tconst addOrSubtract = chance.bool({ likelihood: 50 }) ? -rand : rand;\n\t\t\t\t\tlet newIndex = mostChosenIndex + addOrSubtract;\n\n\t\t\t\t\t// Ensure newIndex is within bounds\n\t\t\t\t\tif (newIndex < 0) newIndex = 0;\n\t\t\t\t\tif (newIndex >= items.length) newIndex = items.length - 1;\n\t\t\t\t\tweighted.push(items[newIndex]);\n\t\t\t\t}\n\t\t\t}\n\t\t\t// 25% chance to favor the second most chosen index\n\t\t\telse if (chance.bool({ likelihood: 25 })) {\n\t\t\t\tweighted.push(items[secondMostChosenIndex]);\n\t\t\t}\n\t\t\t// 15% chance to favor the third most chosen index\n\t\t\telse if (chance.bool({ likelihood: 15 })) {\n\t\t\t\tweighted.push(items[thirdMostChosenIndex]);\n\t\t\t}\n\t\t\t// Otherwise, pick a random item from the list\n\t\t\telse {\n\t\t\t\tweighted.push(chance.pickone(items));\n\t\t\t}\n\t\t}\n\t\treturn weighted;\n\t}"
349
+ },
350
+ "status": [
351
+ "success",
352
+ "failed",
353
+ "cancelled"
354
+ ],
355
+ "duration_sec": [
356
+ 717,
357
+ 1051,
358
+ 558,
359
+ 606,
360
+ 1261,
361
+ 522,
362
+ 400,
363
+ 1136,
364
+ 1100,
365
+ 684,
366
+ 1393,
367
+ 1027,
368
+ 232,
369
+ 1213,
370
+ 799,
371
+ 527,
372
+ 493,
373
+ 968,
374
+ 992,
375
+ 955,
376
+ 1304,
377
+ 717,
378
+ 494,
379
+ 687,
380
+ 764,
381
+ 1343,
382
+ 1465,
383
+ 584,
384
+ 285,
385
+ 969,
386
+ 1012,
387
+ 888,
388
+ 445,
389
+ 444,
390
+ 816,
391
+ 480,
392
+ 915,
393
+ 1292,
394
+ 825,
395
+ 392,
396
+ 1638,
397
+ 833,
398
+ 387,
399
+ 1062,
400
+ 1188,
401
+ 914,
402
+ 1166,
403
+ 552,
404
+ 595,
405
+ 455
406
+ ],
407
+ "commit_count": [
408
+ 9,
409
+ 10,
410
+ 11,
411
+ 4,
412
+ 3,
413
+ 5,
414
+ 19,
415
+ 5,
416
+ 6,
417
+ 6,
418
+ 6,
419
+ 5,
420
+ 4,
421
+ 11,
422
+ 7,
423
+ 17,
424
+ 12,
425
+ 8,
426
+ 8,
427
+ 9,
428
+ 9,
429
+ 6,
430
+ 13,
431
+ 13,
432
+ 14,
433
+ 4,
434
+ 5,
435
+ 9,
436
+ 18,
437
+ 18,
438
+ 7,
439
+ 4,
440
+ 5,
441
+ 6,
442
+ 13,
443
+ 7,
444
+ 6,
445
+ 13,
446
+ 13,
447
+ 11,
448
+ 7,
449
+ 12,
450
+ 9,
451
+ 6,
452
+ 18,
453
+ 16,
454
+ 6,
455
+ 16,
456
+ 12,
457
+ 10
458
+ ]
459
+ }
460
+ },
461
+ {
462
+ "event": "infrastructure scaled",
463
+ "weight": 5,
464
+ "properties": {
465
+ "service_id": {
466
+ "functionName": "arrow",
467
+ "body": "function () {\n\t\tconst weighted = [];\n\t\tfor (let i = 0; i < 10; i++) {\n\t\t\tconst rand = chance.d10(); // Random number between 1 and 10\n\n\t\t\t// 35% chance to favor the most chosen index\n\t\t\tif (chance.bool({ likelihood: 35 })) {\n\t\t\t\t// 50% chance to slightly alter the index\n\t\t\t\tif (chance.bool({ likelihood: 50 })) {\n\t\t\t\t\tweighted.push(items[mostChosenIndex]);\n\t\t\t\t} else {\n\t\t\t\t\tconst addOrSubtract = chance.bool({ likelihood: 50 }) ? -rand : rand;\n\t\t\t\t\tlet newIndex = mostChosenIndex + addOrSubtract;\n\n\t\t\t\t\t// Ensure newIndex is within bounds\n\t\t\t\t\tif (newIndex < 0) newIndex = 0;\n\t\t\t\t\tif (newIndex >= items.length) newIndex = items.length - 1;\n\t\t\t\t\tweighted.push(items[newIndex]);\n\t\t\t\t}\n\t\t\t}\n\t\t\t// 25% chance to favor the second most chosen index\n\t\t\telse if (chance.bool({ likelihood: 25 })) {\n\t\t\t\tweighted.push(items[secondMostChosenIndex]);\n\t\t\t}\n\t\t\t// 15% chance to favor the third most chosen index\n\t\t\telse if (chance.bool({ likelihood: 15 })) {\n\t\t\t\tweighted.push(items[thirdMostChosenIndex]);\n\t\t\t}\n\t\t\t// Otherwise, pick a random item from the list\n\t\t\telse {\n\t\t\t\tweighted.push(chance.pickone(items));\n\t\t\t}\n\t\t}\n\t\treturn weighted;\n\t}"
468
+ },
469
+ "scale_direction": {
470
+ "functionName": "arrow",
471
+ "body": "function () {\n\t\tconst weighted = [];\n\t\tfor (let i = 0; i < 10; i++) {\n\t\t\tconst rand = chance.d10(); // Random number between 1 and 10\n\n\t\t\t// 35% chance to favor the most chosen index\n\t\t\tif (chance.bool({ likelihood: 35 })) {\n\t\t\t\t// 50% chance to slightly alter the index\n\t\t\t\tif (chance.bool({ likelihood: 50 })) {\n\t\t\t\t\tweighted.push(items[mostChosenIndex]);\n\t\t\t\t} else {\n\t\t\t\t\tconst addOrSubtract = chance.bool({ likelihood: 50 }) ? -rand : rand;\n\t\t\t\t\tlet newIndex = mostChosenIndex + addOrSubtract;\n\n\t\t\t\t\t// Ensure newIndex is within bounds\n\t\t\t\t\tif (newIndex < 0) newIndex = 0;\n\t\t\t\t\tif (newIndex >= items.length) newIndex = items.length - 1;\n\t\t\t\t\tweighted.push(items[newIndex]);\n\t\t\t\t}\n\t\t\t}\n\t\t\t// 25% chance to favor the second most chosen index\n\t\t\telse if (chance.bool({ likelihood: 25 })) {\n\t\t\t\tweighted.push(items[secondMostChosenIndex]);\n\t\t\t}\n\t\t\t// 15% chance to favor the third most chosen index\n\t\t\telse if (chance.bool({ likelihood: 15 })) {\n\t\t\t\tweighted.push(items[thirdMostChosenIndex]);\n\t\t\t}\n\t\t\t// Otherwise, pick a random item from the list\n\t\t\telse {\n\t\t\t\tweighted.push(chance.pickone(items));\n\t\t\t}\n\t\t}\n\t\treturn weighted;\n\t}"
472
+ },
473
+ "previous_capacity": [
474
+ 20,
475
+ 29,
476
+ 53,
477
+ 22,
478
+ 77,
479
+ 59,
480
+ 23,
481
+ 34,
482
+ 38,
483
+ 27,
484
+ 43,
485
+ 51,
486
+ 29,
487
+ 41,
488
+ 46,
489
+ 31,
490
+ 26,
491
+ 19,
492
+ 28,
493
+ 42,
494
+ 53,
495
+ 81,
496
+ 39,
497
+ 18,
498
+ 56,
499
+ 66,
500
+ 74,
501
+ 27,
502
+ 59,
503
+ 9,
504
+ 39,
505
+ 74,
506
+ 38,
507
+ 54,
508
+ 40,
509
+ 30,
510
+ 51,
511
+ 57,
512
+ 82,
513
+ 24,
514
+ 22,
515
+ 36,
516
+ 25,
517
+ 25,
518
+ 56,
519
+ 25,
520
+ 64,
521
+ 86,
522
+ 14,
523
+ 37
524
+ ],
525
+ "new_capacity": [
526
+ 27,
527
+ 73,
528
+ 33,
529
+ 16,
530
+ 33,
531
+ 32,
532
+ 27,
533
+ 28,
534
+ 34,
535
+ 50,
536
+ 2,
537
+ 61,
538
+ 38,
539
+ 64,
540
+ 43,
541
+ 51,
542
+ 24,
543
+ 39,
544
+ 86,
545
+ 19,
546
+ 76,
547
+ 68,
548
+ 46,
549
+ 28,
550
+ 26,
551
+ 27,
552
+ 67,
553
+ 27,
554
+ 25,
555
+ 38,
556
+ 53,
557
+ 55,
558
+ 20,
559
+ 79,
560
+ 8,
561
+ 32,
562
+ 75,
563
+ 58,
564
+ 19,
565
+ 40,
566
+ 24,
567
+ 51,
568
+ 28,
569
+ 36,
570
+ 28,
571
+ 43,
572
+ 24,
573
+ 68,
574
+ 65,
575
+ 45
576
+ ],
577
+ "auto_scaled": {
578
+ "functionName": "arrow",
579
+ "body": "function () {\n\t\tconst weighted = [];\n\t\tfor (let i = 0; i < 10; i++) {\n\t\t\tconst rand = chance.d10(); // Random number between 1 and 10\n\n\t\t\t// 35% chance to favor the most chosen index\n\t\t\tif (chance.bool({ likelihood: 35 })) {\n\t\t\t\t// 50% chance to slightly alter the index\n\t\t\t\tif (chance.bool({ likelihood: 50 })) {\n\t\t\t\t\tweighted.push(items[mostChosenIndex]);\n\t\t\t\t} else {\n\t\t\t\t\tconst addOrSubtract = chance.bool({ likelihood: 50 }) ? -rand : rand;\n\t\t\t\t\tlet newIndex = mostChosenIndex + addOrSubtract;\n\n\t\t\t\t\t// Ensure newIndex is within bounds\n\t\t\t\t\tif (newIndex < 0) newIndex = 0;\n\t\t\t\t\tif (newIndex >= items.length) newIndex = items.length - 1;\n\t\t\t\t\tweighted.push(items[newIndex]);\n\t\t\t\t}\n\t\t\t}\n\t\t\t// 25% chance to favor the second most chosen index\n\t\t\telse if (chance.bool({ likelihood: 25 })) {\n\t\t\t\tweighted.push(items[secondMostChosenIndex]);\n\t\t\t}\n\t\t\t// 15% chance to favor the third most chosen index\n\t\t\telse if (chance.bool({ likelihood: 15 })) {\n\t\t\t\tweighted.push(items[thirdMostChosenIndex]);\n\t\t\t}\n\t\t\t// Otherwise, pick a random item from the list\n\t\t\telse {\n\t\t\t\tweighted.push(chance.pickone(items));\n\t\t\t}\n\t\t}\n\t\treturn weighted;\n\t}"
580
+ }
581
+ }
582
+ },
583
+ {
584
+ "event": "cost report generated",
585
+ "weight": 4,
586
+ "properties": {
587
+ "report_period": [
588
+ "daily",
589
+ "weekly",
590
+ "monthly"
591
+ ],
592
+ "total_cost": [
593
+ 33339,
594
+ 16308,
595
+ 32687,
596
+ 21677,
597
+ 16415,
598
+ 18476,
599
+ 23884,
600
+ 9047,
601
+ 22718,
602
+ 25050,
603
+ 23859,
604
+ 38645,
605
+ 28859,
606
+ 16243,
607
+ 25150,
608
+ 13965,
609
+ 18197,
610
+ 21324,
611
+ 16533,
612
+ 33173,
613
+ 30583,
614
+ 8109,
615
+ 5005,
616
+ 15649,
617
+ 42012,
618
+ 33050,
619
+ 16895,
620
+ 18808,
621
+ 32175,
622
+ 19794,
623
+ 15507,
624
+ 31491,
625
+ 18195,
626
+ 32250,
627
+ 12541,
628
+ 16019,
629
+ 25050,
630
+ 20575,
631
+ 15786,
632
+ 39872,
633
+ 39979,
634
+ 12566,
635
+ 20776,
636
+ 15554,
637
+ 13352,
638
+ 14649,
639
+ 1979,
640
+ 34972,
641
+ 14297,
642
+ 14073
643
+ ],
644
+ "cost_change_percent": [
645
+ -5,
646
+ -3,
647
+ -19,
648
+ 1,
649
+ 29,
650
+ 0,
651
+ 19,
652
+ -8,
653
+ -15,
654
+ -14,
655
+ 38,
656
+ 9,
657
+ -8,
658
+ 17,
659
+ -4,
660
+ -29,
661
+ 14,
662
+ 26,
663
+ 20,
664
+ -6,
665
+ -15,
666
+ -3,
667
+ -2,
668
+ -14,
669
+ 8,
670
+ -7,
671
+ -7,
672
+ -8,
673
+ 9,
674
+ -19,
675
+ -5,
676
+ 10,
677
+ 18,
678
+ 4,
679
+ 8,
680
+ -22,
681
+ -19,
682
+ 23,
683
+ 29,
684
+ -15,
685
+ -5,
686
+ -28,
687
+ -6,
688
+ 10,
689
+ -11,
690
+ -2,
691
+ 16,
692
+ -13,
693
+ 20,
694
+ 3
695
+ ]
696
+ }
697
+ },
698
+ {
699
+ "event": "team member invited",
700
+ "weight": 3,
701
+ "properties": {
702
+ "role": [
703
+ "admin",
704
+ "editor",
705
+ "viewer",
706
+ "billing"
707
+ ],
708
+ "invitation_method": [
709
+ "email",
710
+ "sso",
711
+ "slack"
712
+ ]
713
+ }
714
+ },
715
+ {
716
+ "event": "integration configured",
717
+ "weight": 4,
718
+ "properties": {
719
+ "integration_type": [
720
+ "slack",
721
+ "pagerduty",
722
+ "jira",
723
+ "github",
724
+ "datadog",
725
+ "terraform"
726
+ ],
727
+ "status": [
728
+ "active",
729
+ "paused",
730
+ "error"
731
+ ]
732
+ }
733
+ },
734
+ {
735
+ "event": "query executed",
736
+ "weight": 15,
737
+ "properties": {
738
+ "query_type": [
739
+ "metrics",
740
+ "logs",
741
+ "traces"
742
+ ],
743
+ "time_range_hours": [
744
+ 487,
745
+ 136,
746
+ 497,
747
+ 160,
748
+ 409,
749
+ 237,
750
+ 469,
751
+ 185,
752
+ 203,
753
+ 161,
754
+ 391,
755
+ 228,
756
+ 204,
757
+ 240,
758
+ 568,
759
+ 244,
760
+ 574,
761
+ 132,
762
+ 87,
763
+ 193,
764
+ 286,
765
+ 198,
766
+ 458,
767
+ 430,
768
+ 304,
769
+ 134,
770
+ 165,
771
+ 577,
772
+ 605,
773
+ 392,
774
+ 36,
775
+ 224,
776
+ 207,
777
+ 401,
778
+ 272,
779
+ 215,
780
+ 377,
781
+ 221,
782
+ 483,
783
+ 314,
784
+ 180,
785
+ 187,
786
+ 393,
787
+ 179,
788
+ 345,
789
+ 87,
790
+ 224,
791
+ 536,
792
+ 334,
793
+ 337
794
+ ],
795
+ "result_count": [
796
+ 3693,
797
+ 3762,
798
+ 618,
799
+ 345,
800
+ 2743,
801
+ 5490,
802
+ 3903,
803
+ 4162,
804
+ 5699,
805
+ 5394,
806
+ 2833,
807
+ 7269,
808
+ 2553,
809
+ 7965,
810
+ 6550,
811
+ 2786,
812
+ 3581,
813
+ 4070,
814
+ 888,
815
+ 6361,
816
+ 5094,
817
+ 7330,
818
+ 4330,
819
+ 6507,
820
+ 3977,
821
+ 2168,
822
+ 4501,
823
+ 2939,
824
+ 2980,
825
+ 4914,
826
+ 7583,
827
+ 2788,
828
+ 5533,
829
+ 5493,
830
+ 3346,
831
+ 5119,
832
+ 3708,
833
+ 5548,
834
+ 4408,
835
+ 7229,
836
+ 3141,
837
+ 1357,
838
+ 3774,
839
+ 3860,
840
+ 7555,
841
+ 4329,
842
+ 6470,
843
+ 6853,
844
+ 4820,
845
+ 8437
846
+ ]
847
+ }
848
+ },
849
+ {
850
+ "event": "runbook executed",
851
+ "weight": 3,
852
+ "properties": {
853
+ "runbook_id": {
854
+ "functionName": "arrow",
855
+ "body": "function () {\n\t\tconst weighted = [];\n\t\tfor (let i = 0; i < 10; i++) {\n\t\t\tconst rand = chance.d10(); // Random number between 1 and 10\n\n\t\t\t// 35% chance to favor the most chosen index\n\t\t\tif (chance.bool({ likelihood: 35 })) {\n\t\t\t\t// 50% chance to slightly alter the index\n\t\t\t\tif (chance.bool({ likelihood: 50 })) {\n\t\t\t\t\tweighted.push(items[mostChosenIndex]);\n\t\t\t\t} else {\n\t\t\t\t\tconst addOrSubtract = chance.bool({ likelihood: 50 }) ? -rand : rand;\n\t\t\t\t\tlet newIndex = mostChosenIndex + addOrSubtract;\n\n\t\t\t\t\t// Ensure newIndex is within bounds\n\t\t\t\t\tif (newIndex < 0) newIndex = 0;\n\t\t\t\t\tif (newIndex >= items.length) newIndex = items.length - 1;\n\t\t\t\t\tweighted.push(items[newIndex]);\n\t\t\t\t}\n\t\t\t}\n\t\t\t// 25% chance to favor the second most chosen index\n\t\t\telse if (chance.bool({ likelihood: 25 })) {\n\t\t\t\tweighted.push(items[secondMostChosenIndex]);\n\t\t\t}\n\t\t\t// 15% chance to favor the third most chosen index\n\t\t\telse if (chance.bool({ likelihood: 15 })) {\n\t\t\t\tweighted.push(items[thirdMostChosenIndex]);\n\t\t\t}\n\t\t\t// Otherwise, pick a random item from the list\n\t\t\telse {\n\t\t\t\tweighted.push(chance.pickone(items));\n\t\t\t}\n\t\t}\n\t\treturn weighted;\n\t}"
856
+ },
857
+ "trigger": [
858
+ "manual",
859
+ "automated",
860
+ "alert_triggered"
861
+ ],
862
+ "success": {
863
+ "functionName": "arrow",
864
+ "body": "function () {\n\t\tconst weighted = [];\n\t\tfor (let i = 0; i < 10; i++) {\n\t\t\tconst rand = chance.d10(); // Random number between 1 and 10\n\n\t\t\t// 35% chance to favor the most chosen index\n\t\t\tif (chance.bool({ likelihood: 35 })) {\n\t\t\t\t// 50% chance to slightly alter the index\n\t\t\t\tif (chance.bool({ likelihood: 50 })) {\n\t\t\t\t\tweighted.push(items[mostChosenIndex]);\n\t\t\t\t} else {\n\t\t\t\t\tconst addOrSubtract = chance.bool({ likelihood: 50 }) ? -rand : rand;\n\t\t\t\t\tlet newIndex = mostChosenIndex + addOrSubtract;\n\n\t\t\t\t\t// Ensure newIndex is within bounds\n\t\t\t\t\tif (newIndex < 0) newIndex = 0;\n\t\t\t\t\tif (newIndex >= items.length) newIndex = items.length - 1;\n\t\t\t\t\tweighted.push(items[newIndex]);\n\t\t\t\t}\n\t\t\t}\n\t\t\t// 25% chance to favor the second most chosen index\n\t\t\telse if (chance.bool({ likelihood: 25 })) {\n\t\t\t\tweighted.push(items[secondMostChosenIndex]);\n\t\t\t}\n\t\t\t// 15% chance to favor the third most chosen index\n\t\t\telse if (chance.bool({ likelihood: 15 })) {\n\t\t\t\tweighted.push(items[thirdMostChosenIndex]);\n\t\t\t}\n\t\t\t// Otherwise, pick a random item from the list\n\t\t\telse {\n\t\t\t\tweighted.push(chance.pickone(items));\n\t\t\t}\n\t\t}\n\t\treturn weighted;\n\t}"
865
+ }
866
+ }
867
+ },
868
+ {
869
+ "event": "billing event",
870
+ "weight": 3,
871
+ "properties": {
872
+ "event_type": [
873
+ "invoice_generated",
874
+ "payment_received",
875
+ "payment_failed",
876
+ "plan_upgraded",
877
+ "plan_downgraded"
878
+ ],
879
+ "amount": [
880
+ 6062,
881
+ 14124,
882
+ 10582,
883
+ 3760,
884
+ 18181,
885
+ 9705,
886
+ 4628,
887
+ 14574,
888
+ 16955,
889
+ 15536,
890
+ 16536,
891
+ 14755,
892
+ 12407,
893
+ 7163,
894
+ 7787,
895
+ 7862,
896
+ 20345,
897
+ 8410,
898
+ 5584,
899
+ 8092,
900
+ 12372,
901
+ 9482,
902
+ 12550,
903
+ 23951,
904
+ 19496,
905
+ 7656,
906
+ 6647,
907
+ 17636,
908
+ 10973,
909
+ 4511,
910
+ 17603,
911
+ 11923,
912
+ 5222,
913
+ 2886,
914
+ 18266,
915
+ 12187,
916
+ 13298,
917
+ 20717,
918
+ 6647,
919
+ 7420,
920
+ 4462,
921
+ 3141,
922
+ 3292,
923
+ 11057,
924
+ 8153,
925
+ 6865,
926
+ 5990,
927
+ 11123,
928
+ 7470,
929
+ 12306
930
+ ]
931
+ }
932
+ },
933
+ {
934
+ "event": "security scan",
935
+ "weight": 6,
936
+ "properties": {
937
+ "scan_type": [
938
+ "vulnerability",
939
+ "compliance",
940
+ "access_audit"
941
+ ],
942
+ "findings_count": [
943
+ 27,
944
+ 17,
945
+ 24,
946
+ 35,
947
+ 15,
948
+ 33,
949
+ 14,
950
+ 20,
951
+ 19,
952
+ 14,
953
+ 34,
954
+ 29,
955
+ 27,
956
+ 38,
957
+ 18,
958
+ 39,
959
+ 9,
960
+ 46,
961
+ 16,
962
+ 12,
963
+ 22,
964
+ 6,
965
+ 11,
966
+ 23,
967
+ 21,
968
+ 17,
969
+ 11,
970
+ 27,
971
+ 26,
972
+ 24,
973
+ 10,
974
+ 25,
975
+ 33,
976
+ 11,
977
+ 36,
978
+ 37,
979
+ 33,
980
+ 20,
981
+ 5,
982
+ 6,
983
+ 29,
984
+ 34,
985
+ 18,
986
+ 34,
987
+ 22,
988
+ 30,
989
+ 35,
990
+ 24,
991
+ 6,
992
+ 38
993
+ ],
994
+ "critical_findings": [
995
+ 4,
996
+ 6,
997
+ 7,
998
+ 8,
999
+ 8,
1000
+ 3,
1001
+ 1,
1002
+ 5,
1003
+ 5,
1004
+ 2,
1005
+ 9,
1006
+ 5,
1007
+ 4,
1008
+ 5,
1009
+ 2,
1010
+ 6,
1011
+ 5,
1012
+ 2,
1013
+ 3,
1014
+ 6,
1015
+ 2,
1016
+ 3,
1017
+ 2,
1018
+ 2,
1019
+ 7,
1020
+ 5,
1021
+ 6,
1022
+ 4,
1023
+ 6,
1024
+ 3,
1025
+ 6,
1026
+ 5,
1027
+ 2,
1028
+ 7,
1029
+ 6,
1030
+ 2,
1031
+ 4,
1032
+ 2,
1033
+ 5,
1034
+ 4,
1035
+ 4,
1036
+ 3,
1037
+ 3,
1038
+ 5,
1039
+ 6,
1040
+ 2,
1041
+ 7,
1042
+ 9,
1043
+ 5,
1044
+ 3
1045
+ ]
1046
+ }
1047
+ },
1048
+ {
1049
+ "event": "api call",
1050
+ "weight": 16,
1051
+ "properties": {
1052
+ "endpoint": [
1053
+ "/deploy",
1054
+ "/status",
1055
+ "/metrics",
1056
+ "/alerts",
1057
+ "/config",
1058
+ "/billing"
1059
+ ],
1060
+ "method": [
1061
+ "GET",
1062
+ "POST",
1063
+ "PUT",
1064
+ "DELETE"
1065
+ ],
1066
+ "response_time_ms": [
1067
+ 583,
1068
+ 956,
1069
+ 2505,
1070
+ 1590,
1071
+ 2355,
1072
+ 3294,
1073
+ 2396,
1074
+ 2972,
1075
+ 1751,
1076
+ 1896,
1077
+ 1827,
1078
+ 3899,
1079
+ 1231,
1080
+ 3174,
1081
+ 3087,
1082
+ 1921,
1083
+ 1351,
1084
+ 1483,
1085
+ 2268,
1086
+ 2229,
1087
+ 1855,
1088
+ 1139,
1089
+ 1793,
1090
+ 411,
1091
+ 1008,
1092
+ 2601,
1093
+ 801,
1094
+ 2107,
1095
+ 1360,
1096
+ 1386,
1097
+ 3976,
1098
+ 2275,
1099
+ 3306,
1100
+ 1820,
1101
+ 835,
1102
+ 2559,
1103
+ 1530,
1104
+ 964,
1105
+ 1734,
1106
+ 2054,
1107
+ 1552,
1108
+ 959,
1109
+ 1828,
1110
+ 2538,
1111
+ 2630,
1112
+ 2330,
1113
+ 1183,
1114
+ 385,
1115
+ 1634,
1116
+ 1407
1117
+ ],
1118
+ "status_code": {
1119
+ "functionName": "arrow",
1120
+ "body": "function () {\n\t\tconst weighted = [];\n\t\tfor (let i = 0; i < 10; i++) {\n\t\t\tconst rand = chance.d10(); // Random number between 1 and 10\n\n\t\t\t// 35% chance to favor the most chosen index\n\t\t\tif (chance.bool({ likelihood: 35 })) {\n\t\t\t\t// 50% chance to slightly alter the index\n\t\t\t\tif (chance.bool({ likelihood: 50 })) {\n\t\t\t\t\tweighted.push(items[mostChosenIndex]);\n\t\t\t\t} else {\n\t\t\t\t\tconst addOrSubtract = chance.bool({ likelihood: 50 }) ? -rand : rand;\n\t\t\t\t\tlet newIndex = mostChosenIndex + addOrSubtract;\n\n\t\t\t\t\t// Ensure newIndex is within bounds\n\t\t\t\t\tif (newIndex < 0) newIndex = 0;\n\t\t\t\t\tif (newIndex >= items.length) newIndex = items.length - 1;\n\t\t\t\t\tweighted.push(items[newIndex]);\n\t\t\t\t}\n\t\t\t}\n\t\t\t// 25% chance to favor the second most chosen index\n\t\t\telse if (chance.bool({ likelihood: 25 })) {\n\t\t\t\tweighted.push(items[secondMostChosenIndex]);\n\t\t\t}\n\t\t\t// 15% chance to favor the third most chosen index\n\t\t\telse if (chance.bool({ likelihood: 15 })) {\n\t\t\t\tweighted.push(items[thirdMostChosenIndex]);\n\t\t\t}\n\t\t\t// Otherwise, pick a random item from the list\n\t\t\telse {\n\t\t\t\tweighted.push(chance.pickone(items));\n\t\t\t}\n\t\t}\n\t\treturn weighted;\n\t}"
1121
+ }
1122
+ }
1123
+ },
1124
+ {
1125
+ "event": "documentation viewed",
1126
+ "weight": 7,
1127
+ "properties": {
1128
+ "doc_section": [
1129
+ "getting_started",
1130
+ "api_reference",
1131
+ "best_practices",
1132
+ "troubleshooting",
1133
+ "changelog"
1134
+ ],
1135
+ "time_on_page_sec": [
1136
+ 47,
1137
+ 247,
1138
+ 303,
1139
+ 278,
1140
+ 50,
1141
+ 218,
1142
+ 314,
1143
+ 268,
1144
+ 482,
1145
+ 477,
1146
+ 290,
1147
+ 440,
1148
+ 276,
1149
+ 95,
1150
+ 215,
1151
+ 412,
1152
+ 348,
1153
+ 339,
1154
+ 222,
1155
+ 369,
1156
+ 389,
1157
+ 208,
1158
+ 171,
1159
+ 104,
1160
+ 454,
1161
+ 475,
1162
+ 265,
1163
+ 454,
1164
+ 257,
1165
+ 273,
1166
+ 486,
1167
+ 191,
1168
+ 323,
1169
+ 324,
1170
+ 412,
1171
+ 403,
1172
+ 273,
1173
+ 235,
1174
+ 383,
1175
+ 234,
1176
+ 92,
1177
+ 282,
1178
+ 383,
1179
+ 262,
1180
+ 116,
1181
+ 408,
1182
+ 249,
1183
+ 295,
1184
+ 151,
1185
+ 462
1186
+ ]
1187
+ }
1188
+ },
1189
+ {
1190
+ "event": "feature flag toggled",
1191
+ "weight": 4,
1192
+ "properties": {
1193
+ "flag_name": {
1194
+ "functionName": "arrow",
1195
+ "body": "() => `flag_${chance.word()}`"
1196
+ },
1197
+ "new_state": {
1198
+ "functionName": "arrow",
1199
+ "body": "function () {\n\t\tconst weighted = [];\n\t\tfor (let i = 0; i < 10; i++) {\n\t\t\tconst rand = chance.d10(); // Random number between 1 and 10\n\n\t\t\t// 35% chance to favor the most chosen index\n\t\t\tif (chance.bool({ likelihood: 35 })) {\n\t\t\t\t// 50% chance to slightly alter the index\n\t\t\t\tif (chance.bool({ likelihood: 50 })) {\n\t\t\t\t\tweighted.push(items[mostChosenIndex]);\n\t\t\t\t} else {\n\t\t\t\t\tconst addOrSubtract = chance.bool({ likelihood: 50 }) ? -rand : rand;\n\t\t\t\t\tlet newIndex = mostChosenIndex + addOrSubtract;\n\n\t\t\t\t\t// Ensure newIndex is within bounds\n\t\t\t\t\tif (newIndex < 0) newIndex = 0;\n\t\t\t\t\tif (newIndex >= items.length) newIndex = items.length - 1;\n\t\t\t\t\tweighted.push(items[newIndex]);\n\t\t\t\t}\n\t\t\t}\n\t\t\t// 25% chance to favor the second most chosen index\n\t\t\telse if (chance.bool({ likelihood: 25 })) {\n\t\t\t\tweighted.push(items[secondMostChosenIndex]);\n\t\t\t}\n\t\t\t// 15% chance to favor the third most chosen index\n\t\t\telse if (chance.bool({ likelihood: 15 })) {\n\t\t\t\tweighted.push(items[thirdMostChosenIndex]);\n\t\t\t}\n\t\t\t// Otherwise, pick a random item from the list\n\t\t\telse {\n\t\t\t\tweighted.push(chance.pickone(items));\n\t\t\t}\n\t\t}\n\t\treturn weighted;\n\t}"
1200
+ },
1201
+ "environment": [
1202
+ "production",
1203
+ "staging",
1204
+ "dev"
1205
+ ]
1206
+ }
1207
+ }
1208
+ ],
1209
+ "superProps": {
1210
+ "plan_tier": {
1211
+ "functionName": "arrow",
1212
+ "body": "function () {\n\t\tconst weighted = [];\n\t\tfor (let i = 0; i < 10; i++) {\n\t\t\tconst rand = chance.d10(); // Random number between 1 and 10\n\n\t\t\t// 35% chance to favor the most chosen index\n\t\t\tif (chance.bool({ likelihood: 35 })) {\n\t\t\t\t// 50% chance to slightly alter the index\n\t\t\t\tif (chance.bool({ likelihood: 50 })) {\n\t\t\t\t\tweighted.push(items[mostChosenIndex]);\n\t\t\t\t} else {\n\t\t\t\t\tconst addOrSubtract = chance.bool({ likelihood: 50 }) ? -rand : rand;\n\t\t\t\t\tlet newIndex = mostChosenIndex + addOrSubtract;\n\n\t\t\t\t\t// Ensure newIndex is within bounds\n\t\t\t\t\tif (newIndex < 0) newIndex = 0;\n\t\t\t\t\tif (newIndex >= items.length) newIndex = items.length - 1;\n\t\t\t\t\tweighted.push(items[newIndex]);\n\t\t\t\t}\n\t\t\t}\n\t\t\t// 25% chance to favor the second most chosen index\n\t\t\telse if (chance.bool({ likelihood: 25 })) {\n\t\t\t\tweighted.push(items[secondMostChosenIndex]);\n\t\t\t}\n\t\t\t// 15% chance to favor the third most chosen index\n\t\t\telse if (chance.bool({ likelihood: 15 })) {\n\t\t\t\tweighted.push(items[thirdMostChosenIndex]);\n\t\t\t}\n\t\t\t// Otherwise, pick a random item from the list\n\t\t\telse {\n\t\t\t\tweighted.push(chance.pickone(items));\n\t\t\t}\n\t\t}\n\t\treturn weighted;\n\t}"
1213
+ },
1214
+ "cloud_provider": [
1215
+ "aws",
1216
+ "gcp",
1217
+ "azure",
1218
+ "multi_cloud"
1219
+ ]
1220
+ },
1221
+ "userProps": {
1222
+ "company_size": {
1223
+ "functionName": "arrow",
1224
+ "body": "function () {\n\t\tconst weighted = [];\n\t\tfor (let i = 0; i < 10; i++) {\n\t\t\tconst rand = chance.d10(); // Random number between 1 and 10\n\n\t\t\t// 35% chance to favor the most chosen index\n\t\t\tif (chance.bool({ likelihood: 35 })) {\n\t\t\t\t// 50% chance to slightly alter the index\n\t\t\t\tif (chance.bool({ likelihood: 50 })) {\n\t\t\t\t\tweighted.push(items[mostChosenIndex]);\n\t\t\t\t} else {\n\t\t\t\t\tconst addOrSubtract = chance.bool({ likelihood: 50 }) ? -rand : rand;\n\t\t\t\t\tlet newIndex = mostChosenIndex + addOrSubtract;\n\n\t\t\t\t\t// Ensure newIndex is within bounds\n\t\t\t\t\tif (newIndex < 0) newIndex = 0;\n\t\t\t\t\tif (newIndex >= items.length) newIndex = items.length - 1;\n\t\t\t\t\tweighted.push(items[newIndex]);\n\t\t\t\t}\n\t\t\t}\n\t\t\t// 25% chance to favor the second most chosen index\n\t\t\telse if (chance.bool({ likelihood: 25 })) {\n\t\t\t\tweighted.push(items[secondMostChosenIndex]);\n\t\t\t}\n\t\t\t// 15% chance to favor the third most chosen index\n\t\t\telse if (chance.bool({ likelihood: 15 })) {\n\t\t\t\tweighted.push(items[thirdMostChosenIndex]);\n\t\t\t}\n\t\t\t// Otherwise, pick a random item from the list\n\t\t\telse {\n\t\t\t\tweighted.push(chance.pickone(items));\n\t\t\t}\n\t\t}\n\t\treturn weighted;\n\t}"
1225
+ },
1226
+ "primary_role": [
1227
+ "engineer",
1228
+ "sre",
1229
+ "devops",
1230
+ "manager",
1231
+ "executive"
1232
+ ],
1233
+ "team_name": [
1234
+ "Platform",
1235
+ "Backend",
1236
+ "Frontend",
1237
+ "Data",
1238
+ "Security",
1239
+ "Infrastructure"
1240
+ ]
1241
+ },
1242
+ "groupKeys": [
1243
+ [
1244
+ "company_id",
1245
+ 300,
1246
+ [
1247
+ "workspace created",
1248
+ "service deployed",
1249
+ "billing event",
1250
+ "team member invited"
1251
+ ]
1252
+ ]
1253
+ ],
1254
+ "groupProps": {
1255
+ "company_id": {
1256
+ "name": {
1257
+ "functionName": "arrow",
1258
+ "body": "() => `${chance.word({ capitalize: true })} ${chance.pickone([\"Systems\", \"Technologies\", \"Labs\", \"Cloud\", \"Digital\", \"Networks\", \"Solutions\"])}`"
1259
+ },
1260
+ "industry": [
1261
+ "tech",
1262
+ "finance",
1263
+ "healthcare",
1264
+ "retail",
1265
+ "media",
1266
+ "manufacturing",
1267
+ "logistics"
1268
+ ],
1269
+ "employee_count": [
1270
+ "1-10",
1271
+ "11-50",
1272
+ "51-200",
1273
+ "201-1000",
1274
+ "1001-5000",
1275
+ "5000+"
1276
+ ],
1277
+ "arr_bucket": [
1278
+ "<10k",
1279
+ "10k-50k",
1280
+ "50k-200k",
1281
+ "200k-1M",
1282
+ "1M+"
1283
+ ]
1284
+ }
1285
+ },
1286
+ "lookupTables": []
1287
+ },
1288
+ "hooks": "function (record, type, meta) {\n\t\tconst NOW = dayjs();\n\t\tconst DATASET_START = NOW.subtract(days, \"days\");\n\n\t\t// ─────────────────────────────────────────────────────────────\n\t\t// Hook #1: END-OF-QUARTER SPIKE (event)\n\t\t// Days 80-90: billing upgrades and team expansion surge\n\t\t// ─────────────────────────────────────────────────────────────\n\t\tif (type === \"event\") {\n\t\t\tconst EVENT_TIME = dayjs(record.time);\n\t\t\tconst dayInDataset = EVENT_TIME.diff(DATASET_START, \"days\", true);\n\n\t\t\tif (record.event === \"billing event\") {\n\t\t\t\tif (dayInDataset >= 80 && dayInDataset <= 90 && chance.bool({ likelihood: 40 })) {\n\t\t\t\t\trecord.event_type = \"plan_upgraded\";\n\t\t\t\t\trecord.quarter_end_push = true;\n\t\t\t\t} else {\n\t\t\t\t\trecord.quarter_end_push = false;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (record.event === \"team member invited\") {\n\t\t\t\tif (dayInDataset >= 80 && dayInDataset <= 90) {\n\t\t\t\t\trecord.quarter_end_push = true;\n\t\t\t\t\t// 50% of the time duplicate the invite event (hiring push)\n\t\t\t\t\tif (chance.bool({ likelihood: 50 })) {\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\tevent: \"team member invited\",\n\t\t\t\t\t\t\ttime: EVENT_TIME.add(chance.integer({ min: 1, max: 60 }), \"minutes\").toISOString(),\n\t\t\t\t\t\t\tuser_id: record.user_id,\n\t\t\t\t\t\t\trole: chance.pickone([\"editor\", \"viewer\"]),\n\t\t\t\t\t\t\tinvitation_method: chance.pickone([\"email\", \"sso\", \"slack\"]),\n\t\t\t\t\t\t\tquarter_end_push: true,\n\t\t\t\t\t\t\tduplicate_invite: true,\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\trecord.quarter_end_push = false;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// ─────────────────────────────────────────────────────────────\n\t\t// Hook #3: ALERT ESCALATION REPLACEMENT (event)\n\t\t// Critical/emergency alerts sometimes become formal incidents\n\t\t// ─────────────────────────────────────────────────────────────\n\t\tif (type === \"event\") {\n\t\t\tif (record.event === \"alert triggered\") {\n\t\t\t\tconst severity = record.severity;\n\t\t\t\tif ((severity === \"critical\" || severity === \"emergency\") && chance.bool({ likelihood: 30 })) {\n\t\t\t\t\t// REPLACE the event entirely with an \"incident created\" event\n\t\t\t\t\treturn {\n\t\t\t\t\t\tevent: \"incident created\",\n\t\t\t\t\t\ttime: record.time,\n\t\t\t\t\t\tuser_id: record.user_id,\n\t\t\t\t\t\tescalation_level: chance.pickone([\"P1\", \"P2\"]),\n\t\t\t\t\t\tteams_paged: chance.integer({ min: 1, max: 5 }),\n\t\t\t\t\t\tincident_id: `inc_${v.uid(8)}`,\n\t\t\t\t\t\toriginal_severity: severity,\n\t\t\t\t\t\toriginal_alert_type: record.alert_type,\n\t\t\t\t\t\tservice_id: record.service_id,\n\t\t\t\t\t\tauto_escalated: true,\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// ─────────────────────────────────────────────────────────────\n\t\t// Hook #6: COST OVERRUN PATTERN (event)\n\t\t// Budget-exceeded users react by scaling down infrastructure\n\t\t// Uses module-level costOverrunUsers Map for cross-call state\n\t\t// ─────────────────────────────────────────────────────────────\n\t\tif (type === \"event\") {\n\t\t\tif (record.event === \"cost report generated\") {\n\t\t\t\tconst costChange = record.cost_change_percent;\n\t\t\t\tif (costChange > 25) {\n\t\t\t\t\trecord.cost_alert = true;\n\t\t\t\t\trecord.budget_exceeded = true;\n\t\t\t\t\tcostOverrunUsers.set(record.user_id, true);\n\t\t\t\t} else {\n\t\t\t\t\trecord.cost_alert = false;\n\t\t\t\t\trecord.budget_exceeded = false;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (record.event === \"infrastructure scaled\") {\n\t\t\t\tif (costOverrunUsers.has(record.user_id)) {\n\t\t\t\t\trecord.scale_direction = \"down\";\n\t\t\t\t\trecord.cost_reaction = true;\n\t\t\t\t\tcostOverrunUsers.delete(record.user_id);\n\t\t\t\t} else {\n\t\t\t\t\trecord.cost_reaction = false;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// ─────────────────────────────────────────────────────────────\n\t\t// Hook #7: FAILED DEPLOYMENT RECOVERY (event)\n\t\t// Recovery deploys take 1.5x longer after a failure\n\t\t// Uses module-level failedDeployUsers Map for cross-call state\n\t\t// ─────────────────────────────────────────────────────────────\n\t\tif (type === \"event\") {\n\t\t\tif (record.event === \"deployment pipeline run\") {\n\t\t\t\tconst status = record.status;\n\t\t\t\tif (status === \"failed\") {\n\t\t\t\t\tfailedDeployUsers.set(record.user_id, true);\n\t\t\t\t\trecord.recovery_deployment = false;\n\t\t\t\t} else if (status === \"success\" && failedDeployUsers.has(record.user_id)) {\n\t\t\t\t\trecord.duration_sec = Math.floor((record.duration_sec || 300) * 1.5);\n\t\t\t\t\trecord.recovery_deployment = true;\n\t\t\t\t\tfailedDeployUsers.delete(record.user_id);\n\t\t\t\t} else {\n\t\t\t\t\trecord.recovery_deployment = false;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// ─────────────────────────────────────────────────────────────\n\t\t// Hook #2: CHURNED ACCOUNT SILENCING (everything)\n\t\t// ~20% targeted (hash % 5), yielding ~10% visible after accounting for invisible churned users\n\t\t// ─────────────────────────────────────────────────────────────\n\t\tif (type === \"everything\") {\n\t\t\tconst userEvents = record;\n\t\t\tif (userEvents && userEvents.length > 0) {\n\t\t\t\tconst firstEvent = userEvents[0];\n\t\t\t\tconst idHash = String(firstEvent.user_id || firstEvent.device_id).split(\"\").reduce((acc, char) => acc + char.charCodeAt(0), 0);\n\t\t\t\tconst isChurnedAccount = (idHash % 5) === 0;\n\n\t\t\t\tif (isChurnedAccount) {\n\t\t\t\t\tfor (let i = userEvents.length - 1; i >= 0; i--) {\n\t\t\t\t\t\tconst evt = userEvents[i];\n\t\t\t\t\t\tconst dayInDataset = dayjs(evt.time).diff(DATASET_START, \"days\", true);\n\t\t\t\t\t\tif (dayInDataset > 30) {\n\t\t\t\t\t\t\tuserEvents.splice(i, 1);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// ─────────────────────────────────────────────────────────────\n\t\t// Hook #4: INTEGRATION USERS SUCCEED (everything)\n\t\t// Users with both Slack AND PagerDuty integrations resolve faster\n\t\t// ─────────────────────────────────────────────────────────────\n\t\tif (type === \"everything\") {\n\t\t\tconst userEvents = record;\n\n\t\t\t// First pass: check if user has both slack and pagerduty integrations\n\t\t\tlet hasSlack = false;\n\t\t\tlet hasPagerduty = false;\n\n\t\t\tuserEvents.forEach((event) => {\n\t\t\t\tif (event.event === \"integration configured\") {\n\t\t\t\t\tconst integrationType = event.integration_type;\n\t\t\t\t\tif (integrationType === \"slack\") hasSlack = true;\n\t\t\t\t\tif (integrationType === \"pagerduty\") hasPagerduty = true;\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tconst hasFullIntegration = hasSlack && hasPagerduty;\n\n\t\t\t// Second pass: set integrated_team on all alert events, then boost for integrated users\n\t\t\tuserEvents.forEach((event) => {\n\t\t\t\tif (event.event === \"alert acknowledged\") {\n\t\t\t\t\tif (hasFullIntegration && event.response_time_mins) {\n\t\t\t\t\t\tevent.response_time_mins = Math.floor(event.response_time_mins * 0.4);\n\t\t\t\t\t\tevent.integrated_team = true;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tevent.integrated_team = false;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (event.event === \"alert resolved\") {\n\t\t\t\t\tif (hasFullIntegration && event.resolution_time_mins) {\n\t\t\t\t\t\tevent.resolution_time_mins = Math.floor(event.resolution_time_mins * 0.5);\n\t\t\t\t\t\tevent.integrated_team = true;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tevent.integrated_team = false;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\t// ─────────────────────────────────────────────────────────────\n\t\t// Hook #5: DOCS READERS DEPLOY MORE (everything)\n\t\t// Users who read best_practices 3+ times get extra production deploys\n\t\t// ─────────────────────────────────────────────────────────────\n\t\tif (type === \"everything\") {\n\t\t\tconst userEvents = record;\n\n\t\t\t// First pass: count best_practices documentation views\n\t\t\tlet bestPracticesCount = 0;\n\t\t\tuserEvents.forEach((event) => {\n\t\t\t\tif (event.event === \"documentation viewed\" && event.doc_section === \"best_practices\") {\n\t\t\t\t\tbestPracticesCount++;\n\t\t\t\t}\n\t\t\t});\n\n\t\t\t// Second pass: if 3+ best practices views, add extra production deploys\n\t\t\tif (bestPracticesCount >= 3) {\n\t\t\t\tconst extraDeploys = chance.integer({ min: 2, max: 3 });\n\t\t\t\tconst lastEvent = userEvents[userEvents.length - 1];\n\t\t\t\tif (lastEvent) {\n\t\t\t\t\tfor (let i = 0; i < extraDeploys; i++) {\n\t\t\t\t\t\tconst deployEvent = {\n\t\t\t\t\t\t\tevent: \"service deployed\",\n\t\t\t\t\t\t\ttime: dayjs(lastEvent.time).add(chance.integer({ min: 1, max: 48 }), \"hours\").toISOString(),\n\t\t\t\t\t\t\tuser_id: lastEvent.user_id,\n\t\t\t\t\t\t\tservice_id: chance.pickone(serviceIds),\n\t\t\t\t\t\t\tservice_type: chance.pickone([\"web_app\", \"api\", \"database\", \"cache\", \"queue\", \"ml_model\"]),\n\t\t\t\t\t\t\tenvironment: \"production\",\n\t\t\t\t\t\t\tcloud_provider: chance.pickone([\"aws\", \"gcp\", \"azure\"]),\n\t\t\t\t\t\t\tdocs_informed: true,\n\t\t\t\t\t\t};\n\t\t\t\t\t\tuserEvents.splice(userEvents.length, 0, deployEvent);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// ─────────────────────────────────────────────────────────────\n\t\t// Hook #8: ENTERPRISE VS STARTUP (user)\n\t\t// Company size determines seat count, ACV, and health score\n\t\t// ─────────────────────────────────────────────────────────────\n\t\tif (type === \"user\") {\n\t\t\t// Hook #2 support: tag churned accounts on user profile for discoverability\n\t\t\tconst idHash = String(record.distinct_id || \"\").split(\"\").reduce((acc, char) => acc + char.charCodeAt(0), 0);\n\t\t\trecord.churned_account = (idHash % 5) === 0;\n\n\t\t\tconst companySize = record.company_size;\n\n\t\t\tif (companySize === \"enterprise\") {\n\t\t\t\trecord.seat_count = chance.integer({ min: 50, max: 500 });\n\t\t\t\trecord.annual_contract_value = chance.integer({ min: 50000, max: 500000 });\n\t\t\t\trecord.customer_success_manager = true;\n\t\t\t} else if (companySize === \"mid_market\") {\n\t\t\t\trecord.seat_count = chance.integer({ min: 10, max: 50 });\n\t\t\t\trecord.annual_contract_value = chance.integer({ min: 12000, max: 50000 });\n\t\t\t\trecord.customer_success_manager = false;\n\t\t\t} else if (companySize === \"smb\") {\n\t\t\t\trecord.seat_count = chance.integer({ min: 3, max: 10 });\n\t\t\t\trecord.annual_contract_value = chance.integer({ min: 3600, max: 12000 });\n\t\t\t\trecord.customer_success_manager = false;\n\t\t\t} else if (companySize === \"startup\") {\n\t\t\t\trecord.seat_count = chance.integer({ min: 1, max: 5 });\n\t\t\t\trecord.annual_contract_value = chance.integer({ min: 0, max: 3600 });\n\t\t\t\trecord.customer_success_manager = false;\n\t\t\t}\n\n\t\t\trecord.customer_health_score = chance.integer({ min: 1, max: 100 });\n\t\t}\n\n\t\treturn record;\n\t}",
1289
+ "timestamp": "2026-04-10T01:39:07.978Z",
1290
+ "version": "4.0"
1291
+ }