@ak--47/dungeon-master 1.2.3 → 1.3.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 (51) hide show
  1. package/CHANGELOG.md +42 -0
  2. package/README.md +51 -13
  3. package/dungeons/technical/ad-spend.js +2 -2
  4. package/dungeons/technical/anonymous-users.js +2 -2
  5. package/dungeons/technical/array-of-object-lookup.js +2 -2
  6. package/dungeons/technical/experiments.js +2 -2
  7. package/dungeons/technical/foobar.js +2 -2
  8. package/dungeons/technical/group-analytics.js +2 -2
  9. package/dungeons/technical/mirror-strategies.js +2 -2
  10. package/dungeons/technical/nested-objects.js +2 -2
  11. package/dungeons/technical/retention-cadence.js +2 -3
  12. package/dungeons/technical/sanity.js +2 -2
  13. package/dungeons/technical/scale-test.js +2 -2
  14. package/dungeons/technical/scd.js +2 -2
  15. package/dungeons/technical/simple.js +2 -2
  16. package/dungeons/technical/simplest.js +2 -2
  17. package/dungeons/technical/text-generation.js +2 -2
  18. package/dungeons/vertical/ai-platform-schema.json +617 -0
  19. package/dungeons/vertical/ai-platform.js +799 -0
  20. package/dungeons/vertical/community.js +40 -26
  21. package/dungeons/vertical/crypto-schema.json +546 -0
  22. package/dungeons/vertical/crypto.js +721 -0
  23. package/dungeons/vertical/dating-schema.json +401 -0
  24. package/dungeons/vertical/dating.js +798 -0
  25. package/dungeons/vertical/devtools.js +13 -9
  26. package/dungeons/vertical/ecommerce.js +2 -3
  27. package/dungeons/vertical/education.js +4 -5
  28. package/dungeons/vertical/fintech.js +32 -29
  29. package/dungeons/vertical/fitness.js +2 -3
  30. package/dungeons/vertical/food-delivery.js +37 -43
  31. package/dungeons/vertical/gaming-schema.json +2495 -230
  32. package/dungeons/vertical/gaming.js +771 -388
  33. package/dungeons/vertical/healthcare.js +2 -3
  34. package/dungeons/vertical/insurance-application.js +2 -3
  35. package/dungeons/vertical/logistics.js +20 -14
  36. package/dungeons/vertical/marketplace.js +22 -14
  37. package/dungeons/vertical/media.js +39 -30
  38. package/dungeons/vertical/real-estate-schema.json +527 -0
  39. package/dungeons/vertical/real-estate.js +774 -0
  40. package/dungeons/vertical/sass.js +2 -3
  41. package/dungeons/vertical/social.js +15 -13
  42. package/dungeons/vertical/travel.js +59 -26
  43. package/lib/core/config-validator.js +71 -15
  44. package/lib/orchestrators/user-loop.js +39 -5
  45. package/lib/templates/macro-presets.js +111 -0
  46. package/lib/templates/soup-presets.js +19 -36
  47. package/package.json +8 -2
  48. package/types.d.ts +219 -42
  49. package/dungeons/user/.gitkeep +0 -0
  50. package/dungeons/vertical/rpg-schema.json +0 -2491
  51. package/dungeons/vertical/rpg.js +0 -976
package/CHANGELOG.md ADDED
@@ -0,0 +1,42 @@
1
+ # Changelog
2
+
3
+ All notable changes to `@ak--47/dungeon-master`.
4
+
5
+ ## 1.3.0 — 2026-04-28
6
+
7
+ The "no more end-of-dataset blowup" release. Rewrote how per-user event budgets and big-picture trends are decided so the default chart looks flat with a weekly cycle, instead of meteoric ramp + cliff in the final ~14 days.
8
+
9
+ ### Added
10
+
11
+ - **`avgEventsPerUserPerDay` (canonical event-volume primitive).** Per-user event budgets now scale with each user's active days (`rate × user_active_days`), so users born late in the dataset don't compress their entire event budget into a tiny window. `numEvents` still works as a fallback target — see [`research/1.3.0-upgrade-guide.md`](research/1.3.0-upgrade-guide.md).
12
+ - **`macro` preset system.** Big-picture trend across the whole window. Default: `"flat"`. Other presets: `"steady"`, `"growth"`, `"viral"`, `"decline"`. Accepts a string, `{ preset, ...overrides }`, or a fully custom object.
13
+ - **`preExistingSpread` config field.** `"uniform"` (default in `flat`) spreads pre-existing users' first event time across `[FIXED_BEGIN-30d, FIXED_BEGIN]`. `"pinned"` (legacy, used by `growth`/`viral`) stacks them all at `FIXED_BEGIN`.
14
+ - **Future-event guard.** End of `lib/orchestrators/user-loop.js` drops any event whose timestamp landed past `MAX_TIME` after the everything hook runs. Mixpanel rejects future-dated events; this catches hook-injected duplicates that overflow.
15
+ - **Public type aliases.** `Soup`, `Macro`, `ResolvedMacro`, plus per-hook-type meta interfaces (`HookMetaEvent`, `HookMetaUser`, `HookMetaEverything`, etc.) for users who want to narrow inside their hooks.
16
+ - **Validator hardening.** Rejects `numUsers <= 0` and explicit `numDays <= 0`; clamps `bornRecentBias` to `[-1, 1]`; coerces non-finite `bornRecentBias` to `0`.
17
+ - **`engines.node: ">=18.0.0"`** declared in `package.json`.
18
+ - **`tests/macro-and-rate.test.js`** and **`tests/integration-1.3.0.test.js`** — 34 new tests covering the rate primitive, macro resolution, validator guards, future-event guard, per-user budget, and `preExistingSpread`.
19
+
20
+ ### Changed
21
+
22
+ - **Default trend is now `flat`.** Previously the implicit trend (via the `growth` soup preset) used `bornRecentBias: 0.3` and `percentUsersBornInDataset: 15`. New default produces a level chart with weekly oscillation. To recover the old shape, set `macro: "growth"`.
23
+ - **Soup presets are now intra-week / intra-day only.** `bornRecentBias` and `percentUsersBornInDataset` were removed from soup presets and live on `macro` instead. Soup preset names are unchanged.
24
+ - **`dungeons/vertical/questforge.js` → `dungeons/vertical/gaming.js`.** File names follow the vertical convention; the product/app name lives inside file comments.
25
+ - **Auto-batch ordering bug fixed.** The `numEvents >= 2_000_000` auto-batch check in `config-validator.js` now runs AFTER rate→numEvents resolution, so dungeons that set only `avgEventsPerUserPerDay` correctly trigger batch mode.
26
+ - **Validator no longer mutates the caller's config.** Macro-resolved values (`bornRecentBias`, `percentUsersBornInDataset`, `preExistingSpread`) are stored in local vars and added to the output, instead of being written back onto the input object.
27
+ - **All 36 dungeons migrated** via `scripts/experiments/migrate-dungeons.mjs` to use `avgEventsPerUserPerDay`. Hook bugs surfaced by `/verify-hooks` (13 failures) fixed across `dating`, `social`, `travel`, `community`, `logistics`, `media`, `fintech`, `food-delivery`, `education`, `real-estate`, `devtools`, and `marketplace`.
28
+ - **npm publish surface trimmed.** `dungeons/user/` and `scripts/experiments/` excluded from the published package.
29
+
30
+ ### Documentation
31
+
32
+ - **`research/1.3.0-upgrade-guide.md`** — full upgrade guide for AI agents, including hook-writing learnings from the verify-hooks pass.
33
+ - **`research/end-bunchiness.md`** — full diagnosis, experiment data, before/after numbers.
34
+ - **`research/hook-results.md`** — consolidated PASS/WEAK/FAIL report for ~160 hooks across 20 vertical dungeons.
35
+ - **`CLAUDE.md`** and **`.claude/skills/create-dungeon/SKILL.md`** updated with the new two-tier preset API and hook-writing rules.
36
+
37
+ ### Backward compatibility
38
+
39
+ - Dungeons that set only `numEvents` continue to work — the per-day rate is derived. They render with the new `flat` macro defaults; add `macro: "growth"` to restore the old growth-bias.
40
+ - Dungeons that set `bornRecentBias` / `percentUsersBornInDataset` directly continue to work — those values override the macro preset.
41
+ - Soup preset names are unchanged. Hook semantics are unchanged. Output file naming is unchanged.
42
+ - `numEvents` is **not deprecated** — it remains the right primitive for fixed total-volume targets.
package/README.md CHANGED
@@ -272,24 +272,54 @@ hook: function(record, type, meta) {
272
272
  4. to drop events, use the `everything` hook and return a filtered array. don't return `{}` from event hooks (creates broken events)
273
273
  5. the `everything` hook is the most powerful. it sees all events for one user, has access to `meta.profile`, and can correlate across event types
274
274
 
275
- ## timesoup
275
+ ## time shape — macro and soup
276
276
 
277
- timesoup controls how events are distributed across time. it uses gaussian cluster sampling layered with day-of-week and hour-of-day weighting derived from... i won't tell you. a prize goes to whoever can guess. the result is realistic temporal patterns: weekday peaks, weekend valleys, morning surges, afternoon dips.
277
+ two orthogonal axes shape how events are distributed in time:
278
+
279
+ - **`macro`** — big-picture trend across the whole window (births, growth, decline). default: `"flat"`.
280
+ - **`soup`** — intra-week and intra-day rhythm (DOW/HOD weights, peak count, deviation). default: `"growth"`.
281
+
282
+ mix and match. most dungeons want `macro: "flat"` (the chart doesn't blow up at the right edge) plus a soup that gives the desired weekly/daily texture.
283
+
284
+ ### per-user-per-day rate
285
+
286
+ `avgEventsPerUserPerDay` is the canonical event-volume primitive. born-late users get `rate × remaining_days`, not a full per-user budget compressed into a small window — that's what prevents the meteoric ramp at the right edge of the chart. `numEvents` still works as a fallback (the rate is derived from `numEvents / numUsers / numDays`), but new dungeons should set the rate directly.
287
+
288
+ ### macro presets
289
+
290
+ | preset | trend shape | use case |
291
+ |--------|-------------|----------|
292
+ | `"flat"` (default) | pure weekly oscillation, no net trend | mature product; let hooks supply the story |
293
+ | `"steady"` | slight uptrend | lightly-growing saas |
294
+ | `"growth"` | visible acquisition story (no spike) | startup acquisition narrative |
295
+ | `"viral"` | hockey-stick acquisition | pair with persona / feature hooks |
296
+ | `"decline"` | sunsetting product | pair with churn hooks |
297
+
298
+ ```javascript
299
+ macro: 'flat' // default
300
+ macro: 'growth' // preset string
301
+ macro: { preset: 'growth', percentUsersBornInDataset: 40 } // preset + override
302
+ macro: { bornRecentBias: 0, percentUsersBornInDataset: 15, preExistingSpread: 'uniform' } // fully custom
303
+ ```
304
+
305
+ ## timesoup (intra-week / intra-day rhythm)
306
+
307
+ timesoup controls the texture of events inside the macro trend. it uses gaussian cluster sampling layered with day-of-week and hour-of-day weighting derived from... i won't tell you. a prize goes to whoever can guess. the result is realistic temporal patterns: weekday peaks, weekend valleys, morning surges, afternoon dips.
278
308
 
279
309
  ### presets
280
310
 
281
311
  ```javascript
282
- soup: 'growth' // default. gradual uptrend with weekly cycles
312
+ soup: 'growth' // default. real-world weekly + daily rhythm
283
313
  ```
284
314
 
285
315
  | preset | pattern | use case |
286
316
  |--------|---------|----------|
287
- | `"steady"` | flat, minimal variation | mature saas, utility apps |
288
- | `"growth"` | gradual uptrend + weekly cycle | general purpose (default) |
317
+ | `"steady"` | tighter clustering | mature saas, utility apps |
318
+ | `"growth"` | standard intra-week rhythm | general purpose (default) |
289
319
  | `"spiky"` | dramatic peaks and valleys | gaming, social, viral products |
290
320
  | `"seasonal"` | 3-4 major waves | ecommerce, education |
291
321
  | `"global"` | flat DOW + flat HOD | global saas, infrastructure |
292
- | `"churny"` | flat, no growth trend | declining products (pair with churn hooks) |
322
+ | `"churny"` | standard rhythm | pair with `macro: "decline"` for declining shape |
293
323
  | `"chaotic"` | wild variation | anomaly detection, incident response |
294
324
 
295
325
  ### custom configuration
@@ -401,13 +431,18 @@ ordering strategies: `sequential`, `random`, `first-fixed`, `last-fixed`, `first
401
431
 
402
432
  ## user generation
403
433
 
404
- users are generated with configurable birth distributions. `percentUsersBornInDataset` controls how many users were "created" during the dataset window vs. pre-existing. `bornRecentBias` skews new user creation toward recent dates (0 = uniform, 1 = heavily recent).
434
+ users are generated with configurable birth distributions, normally controlled via the `macro` preset (see "time shape" above). these three knobs can also be set directly on the dungeon config they override the preset's values.
435
+
436
+ | knob | range | effect |
437
+ |------|-------|--------|
438
+ | `percentUsersBornInDataset` | 0..100 | share of users created inside the window vs pre-existing |
439
+ | `bornRecentBias` | -1..1 | birth-date skew. negative = early, 0 = uniform, positive = recent |
440
+ | `preExistingSpread` | `"uniform"` \| `"pinned"` | placement of pre-existing users' first event time |
405
441
 
406
442
  ```javascript
407
443
  {
408
444
  numUsers: 10_000,
409
- percentUsersBornInDataset: 25, // 25% of users sign up during the time window
410
- bornRecentBias: 0.5 // new users skew toward recent dates
445
+ macro: { preset: 'growth', percentUsersBornInDataset: 40, bornRecentBias: 0.5 }
411
446
  }
412
447
  ```
413
448
 
@@ -482,7 +517,8 @@ see [types.d.ts](types.d.ts) for the complete `Dungeon` interface. here are the
482
517
  | property | type | default | description |
483
518
  |----------|------|---------|-------------|
484
519
  | `numUsers` | number | 1000 | number of users to generate |
485
- | `numEvents` | number | 100000 | target event count |
520
+ | `numEvents` | number | 100000 | target event count (legacy fallback; derived from `avgEventsPerUserPerDay` when set) |
521
+ | `avgEventsPerUserPerDay` | number | derived | per-user-per-day rate (canonical event-volume primitive) |
486
522
  | `numDays` | number | 30 | days the dataset spans |
487
523
  | `seed` | string | random | RNG seed for reproducibility |
488
524
  | `format` | string | `'csv'` | output format (csv, json, parquet) |
@@ -494,9 +530,11 @@ see [types.d.ts](types.d.ts) for the complete `Dungeon` interface. here are the
494
530
  | `strictEventCount` | boolean | false | stop at exact numEvents |
495
531
  | `batchSize` | number | 2500000 | records before auto-flush |
496
532
  | `concurrency` | number | 1 | parallel user generation |
497
- | `soup` | string/object | `'growth'` | time distribution preset |
498
- | `bornRecentBias` | number | 0.3 | user birth date skew (0-1) |
499
- | `percentUsersBornInDataset` | number | 15 | % of users born in time window |
533
+ | `macro` | string/object | `'flat'` | big-picture trend preset (flat/steady/growth/viral/decline) |
534
+ | `soup` | string/object | `'growth'` | intra-week / intra-day rhythm preset |
535
+ | `bornRecentBias` | number | 0 (from macro `flat`) | user birth date skew (-1..1) |
536
+ | `percentUsersBornInDataset` | number | 15 (from macro `flat`) | % of users born in time window |
537
+ | `preExistingSpread` | string | `'uniform'` (from macro `flat`) | placement of pre-existing users' first event |
500
538
  | `hook` | function/string | passthrough | data transformation function |
501
539
  | `hasLocation` | boolean | false | include geo properties |
502
540
  | `hasCampaigns` | boolean | false | include UTM properties |
@@ -2,7 +2,7 @@
2
2
  const SEED = "ad spend test";
3
3
  const num_days = 90;
4
4
  const num_users = 1_000;
5
- const avg_events_per_user = 50;
5
+ const avg_events_per_user_per_day = 0.56;
6
6
  let token = "your-mixpanel-token";
7
7
 
8
8
  // ── env overrides ──
@@ -39,7 +39,7 @@ const config = {
39
39
  seed: SEED,
40
40
  name: "ad-spend",
41
41
  numDays: num_days,
42
- numEvents: num_users * avg_events_per_user,
42
+ avgEventsPerUserPerDay: avg_events_per_user_per_day,
43
43
  numUsers: num_users,
44
44
  format: 'json',
45
45
  region: "US",
@@ -2,7 +2,7 @@
2
2
  const SEED = "anonymous-users";
3
3
  const num_days = 180;
4
4
  const num_users = 1_000;
5
- const avg_events_per_user = 50;
5
+ const avg_events_per_user_per_day = 0.28;
6
6
  let token = "your-mixpanel-token";
7
7
 
8
8
  // ── env overrides ──
@@ -30,7 +30,7 @@ const config = {
30
30
  token,
31
31
  seed: SEED,
32
32
  numDays: num_days,
33
- numEvents: num_users * avg_events_per_user,
33
+ avgEventsPerUserPerDay: avg_events_per_user_per_day,
34
34
  numUsers: num_users,
35
35
  format: "json",
36
36
  region: "US",
@@ -2,7 +2,7 @@
2
2
  const SEED = "dm4-array-of-object-lookup";
3
3
  const num_days = 60;
4
4
  const num_users = 1_000;
5
- const avg_events_per_user = 100;
5
+ const avg_events_per_user_per_day = 1.67;
6
6
  let token = "your-mixpanel-token";
7
7
 
8
8
  // ── env overrides ──
@@ -54,7 +54,7 @@ const config = {
54
54
  seed: SEED,
55
55
  name: "array-of-object-lookup",
56
56
  numDays: num_days,
57
- numEvents: num_users * avg_events_per_user,
57
+ avgEventsPerUserPerDay: avg_events_per_user_per_day,
58
58
  numUsers: num_users,
59
59
  format: 'json', //csv or json
60
60
  region: "US",
@@ -2,7 +2,7 @@
2
2
  const SEED = "experiments";
3
3
  const num_days = 60;
4
4
  const num_users = 2_000;
5
- const avg_events_per_user = 50;
5
+ const avg_events_per_user_per_day = 0.83;
6
6
  let token = "your-mixpanel-token";
7
7
 
8
8
  // ── env overrides ──
@@ -30,7 +30,7 @@ const config = {
30
30
  token,
31
31
  seed: SEED,
32
32
  numDays: num_days,
33
- numEvents: num_users * avg_events_per_user,
33
+ avgEventsPerUserPerDay: avg_events_per_user_per_day,
34
34
  numUsers: num_users,
35
35
  format: "json",
36
36
  region: "US",
@@ -2,7 +2,7 @@
2
2
  const SEED = "dm4-foobar";
3
3
  const num_days = 30;
4
4
  const num_users = 4_000_000;
5
- const avg_events_per_user = 500;
5
+ const avg_events_per_user_per_day = 16.67;
6
6
  let token = "your-mixpanel-token";
7
7
 
8
8
  // ── env overrides ──
@@ -166,7 +166,7 @@ const config = {
166
166
  token,
167
167
  seed: SEED,
168
168
  numDays: num_days,
169
- numEvents: num_users * avg_events_per_user,
169
+ avgEventsPerUserPerDay: avg_events_per_user_per_day,
170
170
  numUsers: num_users,
171
171
  format: 'json', //csv or json
172
172
  region: "US",
@@ -2,7 +2,7 @@
2
2
  const SEED = "group-analytics";
3
3
  const num_days = 60;
4
4
  const num_users = 500;
5
- const avg_events_per_user = 60;
5
+ const avg_events_per_user_per_day = 1;
6
6
  let token = "your-mixpanel-token";
7
7
 
8
8
  // ── env overrides ──
@@ -30,7 +30,7 @@ const config = {
30
30
  token,
31
31
  seed: SEED,
32
32
  numDays: num_days,
33
- numEvents: num_users * avg_events_per_user,
33
+ avgEventsPerUserPerDay: avg_events_per_user_per_day,
34
34
  numUsers: num_users,
35
35
  format: "json",
36
36
  region: "US",
@@ -2,7 +2,7 @@
2
2
  const SEED = "mirror-strategies";
3
3
  const num_days = 30;
4
4
  const num_users = 500;
5
- const avg_events_per_user = 60;
5
+ const avg_events_per_user_per_day = 2;
6
6
  let token = "your-mixpanel-token";
7
7
 
8
8
  // ── env overrides ──
@@ -29,7 +29,7 @@ const config = {
29
29
  token,
30
30
  seed: SEED,
31
31
  numDays: num_days,
32
- numEvents: num_users * avg_events_per_user,
32
+ avgEventsPerUserPerDay: avg_events_per_user_per_day,
33
33
  numUsers: num_users,
34
34
  format: "json",
35
35
  region: "US",
@@ -2,7 +2,7 @@
2
2
  const SEED = "dm4-nested-objects";
3
3
  const num_days = 30;
4
4
  const num_users = 500;
5
- const avg_events_per_user = 60;
5
+ const avg_events_per_user_per_day = 2;
6
6
  let token = "your-mixpanel-token";
7
7
 
8
8
  // ── env overrides ──
@@ -44,7 +44,7 @@ const config = {
44
44
  seed: SEED,
45
45
  name: "nested-objects",
46
46
  numDays: num_days,
47
- numEvents: num_users * avg_events_per_user,
47
+ avgEventsPerUserPerDay: avg_events_per_user_per_day,
48
48
  numUsers: num_users,
49
49
  format: 'json',
50
50
  region: "US",
@@ -2,7 +2,7 @@
2
2
  const SEED = "kurby-retention";
3
3
  const num_days = 360;
4
4
  const num_users = 100;
5
- const avg_events_per_user = 50;
5
+ const avg_events_per_user_per_day = 0.14;
6
6
  let token = "your-mixpanel-token";
7
7
 
8
8
  // ── env overrides ──
@@ -110,7 +110,7 @@ const config = {
110
110
  token,
111
111
  seed: SEED,
112
112
  numDays: num_days,
113
- numEvents: num_users * avg_events_per_user,
113
+ avgEventsPerUserPerDay: avg_events_per_user_per_day,
114
114
  numUsers: num_users,
115
115
  hasAnonIds: false,
116
116
  hasSessionIds: false,
@@ -127,7 +127,6 @@ const config = {
127
127
  hasAvatar: false,
128
128
  concurrency: 1,
129
129
  writeToDisk: false,
130
- percentUsersBornInDataset: 100,
131
130
 
132
131
  funnels: [],
133
132
 
@@ -2,7 +2,7 @@
2
2
  const SEED = "foo bar";
3
3
  const num_days = 90;
4
4
  const num_users = 500;
5
- const avg_events_per_user = 100;
5
+ const avg_events_per_user_per_day = 1.11;
6
6
  let token = "your-mixpanel-token";
7
7
 
8
8
  // ── env overrides ──
@@ -43,7 +43,7 @@ const config = {
43
43
  token,
44
44
  seed: SEED,
45
45
  numDays: num_days,
46
- numEvents: num_users * avg_events_per_user,
46
+ avgEventsPerUserPerDay: avg_events_per_user_per_day,
47
47
  numUsers: num_users,
48
48
  format: 'json', //csv or json
49
49
  region: "US",
@@ -2,7 +2,7 @@
2
2
  const SEED = "scale test";
3
3
  const num_days = 365;
4
4
  const num_users = 10_000;
5
- const avg_events_per_user = 50;
5
+ const avg_events_per_user_per_day = 0.14;
6
6
  let token = "your-mixpanel-token";
7
7
 
8
8
  // ── env overrides ──
@@ -38,7 +38,7 @@ const config = {
38
38
  seed: SEED,
39
39
  name: "scale-test",
40
40
  numDays: num_days,
41
- numEvents: num_users * avg_events_per_user,
41
+ avgEventsPerUserPerDay: avg_events_per_user_per_day,
42
42
  numUsers: num_users,
43
43
  format: 'json',
44
44
  gzip: true,
@@ -2,7 +2,7 @@
2
2
  const SEED = "simple is best";
3
3
  const num_days = 30;
4
4
  const num_users = 500;
5
- const avg_events_per_user = 100;
5
+ const avg_events_per_user_per_day = 3.33;
6
6
  let token = "your-mixpanel-token";
7
7
 
8
8
  // ── env overrides ──
@@ -64,7 +64,7 @@ const config = {
64
64
  token,
65
65
  seed: SEED,
66
66
  numDays: num_days,
67
- numEvents: num_users * avg_events_per_user,
67
+ avgEventsPerUserPerDay: avg_events_per_user_per_day,
68
68
  numUsers: num_users,
69
69
  format: 'csv', //csv or json
70
70
  region: "US",
@@ -2,7 +2,7 @@
2
2
  const SEED = "simple is best";
3
3
  const num_days = 100;
4
4
  const num_users = 5_000;
5
- const avg_events_per_user = 100;
5
+ const avg_events_per_user_per_day = 1;
6
6
  let token = "your-mixpanel-token";
7
7
 
8
8
  // ── env overrides ──
@@ -73,7 +73,7 @@ const config = {
73
73
  token,
74
74
  seed: SEED,
75
75
  numDays: num_days,
76
- numEvents: num_users * avg_events_per_user,
76
+ avgEventsPerUserPerDay: avg_events_per_user_per_day,
77
77
  numUsers: num_users,
78
78
  format: 'json', //csv or json
79
79
  region: "US",
@@ -2,7 +2,7 @@
2
2
  const SEED = "simple is best";
3
3
  const num_days = 100;
4
4
  const num_users = 2_500;
5
- const avg_events_per_user = 100;
5
+ const avg_events_per_user_per_day = 1;
6
6
  let token = "your-mixpanel-token";
7
7
 
8
8
  // ── env overrides ──
@@ -47,7 +47,7 @@ const config = {
47
47
  token,
48
48
  seed: SEED,
49
49
  numDays: num_days,
50
- numEvents: num_users * avg_events_per_user,
50
+ avgEventsPerUserPerDay: avg_events_per_user_per_day,
51
51
  numUsers: num_users,
52
52
  format: 'json', //csv or json
53
53
  region: "US",
@@ -2,7 +2,7 @@
2
2
  const SEED = "SUPER DUPER DANGEROUS BROOO";
3
3
  const num_days = 92;
4
4
  const num_users = 8_000;
5
- const avg_events_per_user = 120;
5
+ const avg_events_per_user_per_day = 1.3;
6
6
  let token = "your-mixpanel-token";
7
7
 
8
8
  // ── env overrides ──
@@ -407,7 +407,7 @@ const dungeon = {
407
407
  seed: SEED,
408
408
  token,
409
409
  numDays: num_days,
410
- numEvents: num_users * avg_events_per_user,
410
+ avgEventsPerUserPerDay: avg_events_per_user_per_day,
411
411
  numUsers: num_users,
412
412
  hasAnonIds: false,
413
413
  hasSessionIds: true, // Enable for chat flow tracking