@ak--47/dungeon-master 1.4.4 → 1.5.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 (67) hide show
  1. package/.claude/skills/analyze-soup/SKILL.md +158 -0
  2. package/.claude/skills/create-dungeon/SKILL.md +464 -0
  3. package/.claude/skills/verify-dungeon/SKILL.md +157 -0
  4. package/.claude/skills/verify-dungeon/references/counting-semantics.md +161 -0
  5. package/.claude/skills/verify-dungeon/references/report-format.md +216 -0
  6. package/.claude/skills/verify-dungeon/references/sql-recipes.md +857 -0
  7. package/.claude/skills/write-hooks/SKILL.md +468 -0
  8. package/CHANGELOG.md +147 -0
  9. package/HOOKS.md +1243 -597
  10. package/README.md +140 -5
  11. package/dungeons/technical/ad-spend.js +1 -1
  12. package/dungeons/technical/anonymous-users.js +1 -1
  13. package/dungeons/technical/array-of-object-lookup.js +1 -1
  14. package/dungeons/technical/datagen-v15-verify.js +74 -0
  15. package/dungeons/technical/experiments.js +1 -1
  16. package/dungeons/technical/foobar.js +1 -1
  17. package/dungeons/technical/group-analytics.js +1 -1
  18. package/dungeons/technical/mirror-strategies.js +1 -1
  19. package/dungeons/technical/nested-objects.js +1 -1
  20. package/dungeons/technical/retention-cadence.js +1 -1
  21. package/dungeons/technical/sanity.js +1 -1
  22. package/dungeons/technical/scale-test.js +1 -1
  23. package/dungeons/technical/scd.js +1 -1
  24. package/dungeons/technical/simple.js +1 -1
  25. package/dungeons/technical/simplest.js +74 -20
  26. package/dungeons/technical/text-generation.js +1 -1
  27. package/dungeons/vertical/ai-platform.js +4 -0
  28. package/dungeons/vertical/community.js +9 -3
  29. package/dungeons/vertical/crypto.js +5 -0
  30. package/dungeons/vertical/dating.js +23 -10
  31. package/dungeons/vertical/devtools.js +10 -0
  32. package/dungeons/vertical/ecommerce.js +6 -0
  33. package/dungeons/vertical/education.js +11 -0
  34. package/dungeons/vertical/fintech.js +13 -0
  35. package/dungeons/vertical/fitness.js +10 -0
  36. package/dungeons/vertical/food-delivery.js +9 -0
  37. package/dungeons/vertical/gaming.js +10 -0
  38. package/dungeons/vertical/healthcare.js +5 -0
  39. package/dungeons/vertical/insurance-application.js +10 -0
  40. package/dungeons/vertical/logistics.js +8 -1
  41. package/dungeons/vertical/marketplace.js +7 -0
  42. package/dungeons/vertical/media.js +8 -0
  43. package/dungeons/vertical/real-estate.js +7 -1
  44. package/dungeons/vertical/sass.js +12 -0
  45. package/dungeons/vertical/social.js +9 -0
  46. package/dungeons/vertical/travel.js +5 -0
  47. package/index.js +45 -7
  48. package/lib/core/config-validator.js +270 -7
  49. package/lib/core/context.js +58 -0
  50. package/lib/core/dungeon-loader.js +2 -5
  51. package/lib/generators/events.js +12 -13
  52. package/lib/generators/funnels.js +72 -1
  53. package/lib/hook-helpers/index.js +1 -0
  54. package/lib/hook-helpers/inject.js +95 -0
  55. package/lib/orchestrators/mixpanel-sender.js +27 -1
  56. package/lib/orchestrators/user-loop.js +488 -29
  57. package/lib/templates/macro-presets.js +39 -9
  58. package/lib/utils/utils.js +16 -79
  59. package/lib/verify/counting.js +320 -0
  60. package/lib/verify/emulate-breakdown.js +512 -108
  61. package/lib/verify/funnel-engine.js +539 -0
  62. package/lib/verify/identity.js +78 -0
  63. package/lib/verify/index.js +19 -0
  64. package/lib/verify/verify-dungeon.js +58 -0
  65. package/package.json +4 -2
  66. package/types.d.ts +314 -4
  67. package/scripts/smoke-test-all.mjs +0 -162
@@ -459,6 +459,7 @@ const config = {
459
459
  {
460
460
  event: "checkout",
461
461
  weight: 2,
462
+ isStrictEvent: false,
462
463
  properties: {
463
464
  currency: ["USD", "CAD", "EUR", "BTC", "ETH", "JPY"],
464
465
  coupon: weighChoices(["none", "none", "none", "none", "10%OFF", "20%OFF", "10%OFF", "20%OFF", "30%OFF", "40%OFF", "50%OFF"]),
@@ -468,6 +469,7 @@ const config = {
468
469
  {
469
470
  event: "add to cart",
470
471
  weight: 4,
472
+ isStrictEvent: false,
471
473
  properties: {
472
474
  item: makeProducts(1),
473
475
  amount: weighNumRange(1, 100, 0.3),
@@ -484,6 +486,7 @@ const config = {
484
486
  {
485
487
  event: "view item",
486
488
  weight: 8,
489
+ isStrictEvent: false,
487
490
  properties: {
488
491
  item: makeProducts(1),
489
492
  amount: weighNumRange(1, 100, 0.3),
@@ -500,6 +503,7 @@ const config = {
500
503
  {
501
504
  event: "save item",
502
505
  weight: 5,
506
+ isStrictEvent: false,
503
507
  properties: {
504
508
  item: makeProducts(1),
505
509
  amount: weighNumRange(1, 100, 0.3),
@@ -516,6 +520,7 @@ const config = {
516
520
  {
517
521
  event: "page view",
518
522
  weight: 10,
523
+ isStrictEvent: false,
519
524
  properties: {
520
525
  page: ["/", "/help", "/account", "/watch", "/listen", "/product", "/people", "/peace"],
521
526
  }
@@ -523,6 +528,7 @@ const config = {
523
528
  {
524
529
  event: "watch video",
525
530
  weight: 8,
531
+ isStrictEvent: false,
526
532
  properties: {
527
533
  watchTimeSec: weighNumRange(10, 600, .25),
528
534
  quality: ["2160p", "1440p", "1080p", "720p", "480p", "360p", "240p"],
@@ -383,6 +383,7 @@ const config = {
383
383
  conversionRate: 70,
384
384
  timeToConvert: 4,
385
385
  weight: 5,
386
+ reentry: true,
386
387
  },
387
388
  {
388
389
  // Assessment flow: quizzes and assignments after studying
@@ -390,6 +391,7 @@ const config = {
390
391
  conversionRate: 55,
391
392
  timeToConvert: 8,
392
393
  weight: 3,
394
+ reentry: true,
393
395
  },
394
396
  {
395
397
  // Course completion journey: enroll → complete → earn certificate
@@ -443,6 +445,7 @@ const config = {
443
445
  {
444
446
  event: "course enrolled",
445
447
  weight: 8,
448
+ isStrictEvent: false,
446
449
  properties: {
447
450
  "course_id": courseIds,
448
451
  "course_category": ["CS", "Math", "Science", "Business", "Arts", "Languages"],
@@ -463,6 +466,7 @@ const config = {
463
466
  {
464
467
  event: "lecture completed",
465
468
  weight: 14,
469
+ isStrictEvent: false,
466
470
  properties: {
467
471
  "course_id": courseIds,
468
472
  "lecture_id": lectureIds,
@@ -474,6 +478,7 @@ const config = {
474
478
  {
475
479
  event: "quiz started",
476
480
  weight: 10,
481
+ isStrictEvent: false,
477
482
  properties: {
478
483
  "course_id": courseIds,
479
484
  "quiz_id": quizIds,
@@ -484,6 +489,7 @@ const config = {
484
489
  {
485
490
  event: "quiz completed",
486
491
  weight: 8,
492
+ isStrictEvent: false,
487
493
  properties: {
488
494
  "course_id": courseIds,
489
495
  "quiz_id": quizIds,
@@ -495,6 +501,7 @@ const config = {
495
501
  {
496
502
  event: "assignment submitted",
497
503
  weight: 6,
504
+ isStrictEvent: false,
498
505
  properties: {
499
506
  "course_id": courseIds,
500
507
  "assignment_id": assignmentIds,
@@ -517,6 +524,7 @@ const config = {
517
524
  {
518
525
  event: "discussion posted",
519
526
  weight: 7,
527
+ isStrictEvent: false,
520
528
  properties: {
521
529
  "course_id": courseIds,
522
530
  "post_type": ["question", "answer", "comment"],
@@ -526,6 +534,7 @@ const config = {
526
534
  {
527
535
  event: "certificate earned",
528
536
  weight: 2,
537
+ isStrictEvent: false,
529
538
  properties: {
530
539
  "course_id": courseIds,
531
540
  "completion_time_days": u.weighNumRange(7, 180, 0.5, 45),
@@ -535,6 +544,7 @@ const config = {
535
544
  {
536
545
  event: "study group joined",
537
546
  weight: 4,
547
+ isStrictEvent: false,
538
548
  properties: {
539
549
  "group_id": groupIds,
540
550
  "group_size": u.weighNumRange(3, 20, 0.7, 8),
@@ -587,6 +597,7 @@ const config = {
587
597
  {
588
598
  event: "practice problem solved",
589
599
  weight: 12,
600
+ isStrictEvent: false,
590
601
  properties: {
591
602
  "course_id": courseIds,
592
603
  "problem_id": problemIds,
@@ -463,6 +463,7 @@ const config = {
463
463
  {
464
464
  event: "app session",
465
465
  weight: 20,
466
+ isStrictEvent: false,
466
467
  properties: {
467
468
  "session_duration_sec": u.weighNumRange(10, 600, 0.3, 60),
468
469
  "pages_viewed": u.weighNumRange(1, 15, 0.5, 3),
@@ -471,6 +472,7 @@ const config = {
471
472
  {
472
473
  event: "balance checked",
473
474
  weight: 15,
475
+ isStrictEvent: false,
474
476
  properties: {
475
477
  "account_balance": u.weighNumRange(0, 50000, 0.8, 2500),
476
478
  "account_type": ["checking", "savings", "investment"],
@@ -479,6 +481,7 @@ const config = {
479
481
  {
480
482
  event: "transaction completed",
481
483
  weight: 18,
484
+ isStrictEvent: false,
482
485
  properties: {
483
486
  "transaction_type": ["purchase", "atm", "direct_deposit", "refund"],
484
487
  "amount": u.weighNumRange(1, 5000, 0.3, 50),
@@ -489,6 +492,7 @@ const config = {
489
492
  {
490
493
  event: "transfer sent",
491
494
  weight: 8,
495
+ isStrictEvent: false,
492
496
  properties: {
493
497
  "transfer_type": ["internal", "external", "p2p", "wire"],
494
498
  "amount": u.weighNumRange(10, 10000, 0.3, 200),
@@ -498,6 +502,7 @@ const config = {
498
502
  {
499
503
  event: "bill paid",
500
504
  weight: 6,
505
+ isStrictEvent: false,
501
506
  properties: {
502
507
  "bill_type": ["rent", "utilities", "phone", "insurance", "subscription", "loan_payment"],
503
508
  "amount": u.weighNumRange(20, 3000, 0.5, 150),
@@ -516,6 +521,7 @@ const config = {
516
521
  {
517
522
  event: "budget created",
518
523
  weight: 3,
524
+ isStrictEvent: false,
519
525
  properties: {
520
526
  "category": ["food", "transport", "entertainment", "shopping", "bills", "savings"],
521
527
  "monthly_limit": u.weighNumRange(50, 2000, 0.5, 300),
@@ -532,6 +538,7 @@ const config = {
532
538
  {
533
539
  event: "savings goal set",
534
540
  weight: 3,
541
+ isStrictEvent: false,
535
542
  properties: {
536
543
  "goal_type": ["emergency", "vacation", "car", "home", "education", "retirement"],
537
544
  "target_amount": u.weighNumRange(500, 50000, 0.3, 5000),
@@ -541,6 +548,7 @@ const config = {
541
548
  {
542
549
  event: "investment made",
543
550
  weight: 4,
551
+ isStrictEvent: false,
544
552
  properties: {
545
553
  "investment_type": ["stocks", "etf", "crypto", "bonds", "mutual_fund"],
546
554
  "amount": u.weighNumRange(10, 10000, 0.3, 250),
@@ -550,6 +558,7 @@ const config = {
550
558
  {
551
559
  event: "card locked",
552
560
  weight: 2,
561
+ isStrictEvent: false,
553
562
  properties: {
554
563
  "reason": ["lost", "stolen", "suspicious_activity", "travel"],
555
564
  }
@@ -557,6 +566,7 @@ const config = {
557
566
  {
558
567
  event: "dispute filed",
559
568
  weight: 2,
569
+ isStrictEvent: false,
560
570
  properties: {
561
571
  "dispute_amount": u.weighNumRange(10, 2000, 0.5, 100),
562
572
  "reason": ["unauthorized", "duplicate", "not_received", "damaged", "wrong_amount"],
@@ -582,6 +592,7 @@ const config = {
582
592
  {
583
593
  event: "premium upgraded",
584
594
  weight: 2,
595
+ isStrictEvent: false,
585
596
  properties: {
586
597
  "old_tier": ["basic", "plus", "premium"],
587
598
  "new_tier": ["plus", "premium", "premium"],
@@ -591,6 +602,7 @@ const config = {
591
602
  {
592
603
  event: "support contacted",
593
604
  weight: 3,
605
+ isStrictEvent: false,
594
606
  properties: {
595
607
  "channel": ["chat", "phone", "email", "in_app"],
596
608
  "issue_type": ["transaction", "account", "card", "transfer", "technical"],
@@ -608,6 +620,7 @@ const config = {
608
620
  {
609
621
  event: "reward redeemed",
610
622
  weight: 4,
623
+ isStrictEvent: false,
611
624
  properties: {
612
625
  "reward_type": ["cashback", "points", "discount", "partner_offer"],
613
626
  "value": u.weighNumRange(1, 100, 0.5, 10),
@@ -362,6 +362,7 @@ const config = {
362
362
  {
363
363
  event: "workout completed",
364
364
  weight: 8,
365
+ isStrictEvent: false,
365
366
  properties: {
366
367
  duration_minutes: u.weighNumRange(10, 90, 0.5, 40),
367
368
  calories_burned: u.weighNumRange(50, 800, 0.4, 300),
@@ -374,6 +375,7 @@ const config = {
374
375
  {
375
376
  event: "workout planned",
376
377
  weight: 6,
378
+ isStrictEvent: false,
377
379
  properties: {
378
380
  planned_duration_minutes: u.weighNumRange(15, 90, 0.5, 45),
379
381
  day_of_week: ["monday", "tuesday", "wednesday", "thursday", "friday", "saturday", "sunday"],
@@ -393,6 +395,7 @@ const config = {
393
395
  {
394
396
  event: "challenge joined",
395
397
  weight: 3,
398
+ isStrictEvent: false,
396
399
  properties: {
397
400
  challenge_type: ["steps", "calories", "streak", "strength", "team_relay"],
398
401
  duration_days: [7, 14, 21, 30],
@@ -403,6 +406,7 @@ const config = {
403
406
  {
404
407
  event: "challenge completed",
405
408
  weight: 2,
409
+ isStrictEvent: false,
406
410
  properties: {
407
411
  challenge_type: ["steps", "calories", "streak", "strength", "team_relay"],
408
412
  final_rank: u.weighNumRange(1, 50, 0.3, 10),
@@ -413,6 +417,7 @@ const config = {
413
417
  {
414
418
  event: "achievement unlocked",
415
419
  weight: 2,
420
+ isStrictEvent: false,
416
421
  properties: {
417
422
  achievement_type: ["streak_milestone", "weight_goal", "distance_record", "calories_target", "social_champion", "first_workout"],
418
423
  streak_days_at_unlock: u.weighNumRange(1, 100, 0.3, 10),
@@ -421,6 +426,7 @@ const config = {
421
426
  {
422
427
  event: "friend added",
423
428
  weight: 2,
429
+ isStrictEvent: false,
424
430
  properties: {
425
431
  source: ["search", "contacts", "challenge", "suggestion", "qr_code"],
426
432
  },
@@ -436,6 +442,7 @@ const config = {
436
442
  {
437
443
  event: "progress checked",
438
444
  weight: 5,
445
+ isStrictEvent: false,
439
446
  properties: {
440
447
  metric_viewed: ["weight", "body_fat", "steps", "calories_burned", "workout_count", "streaks"],
441
448
  trend_direction: ["improving", "improving", "stable", "declining"],
@@ -445,6 +452,7 @@ const config = {
445
452
  {
446
453
  event: "coach session",
447
454
  weight: 3,
455
+ isStrictEvent: false,
448
456
  properties: {
449
457
  session_type: ["live_video", "chat", "plan_review", "form_check"],
450
458
  duration_minutes: u.weighNumRange(10, 60, 0.5, 30),
@@ -497,6 +505,7 @@ const config = {
497
505
  {
498
506
  event: "profile updated",
499
507
  weight: 2,
508
+ isStrictEvent: false,
500
509
  properties: {
501
510
  field_updated: ["weight", "height", "goal", "avatar", "workout_preferences", "notification_settings"],
502
511
  },
@@ -531,6 +540,7 @@ const config = {
531
540
  order: "sequential",
532
541
  timeToConvert: 48,
533
542
  weight: 5,
543
+ reentry: true,
534
544
  },
535
545
  {
536
546
  name: "Social Engagement",
@@ -446,6 +446,7 @@ const config = {
446
446
  {
447
447
  event: "restaurant viewed",
448
448
  weight: 15,
449
+ isStrictEvent: false,
449
450
  properties: {
450
451
  "restaurant_id": restaurantIds,
451
452
  "cuisine_type": [
@@ -466,6 +467,7 @@ const config = {
466
467
  {
467
468
  event: "item added to cart",
468
469
  weight: 14,
470
+ isStrictEvent: false,
469
471
  properties: {
470
472
  "item_id": itemIds,
471
473
  "item_category": ["entree", "appetizer", "drink", "dessert", "side"],
@@ -484,6 +486,7 @@ const config = {
484
486
  {
485
487
  event: "coupon applied",
486
488
  weight: 4,
489
+ isStrictEvent: false,
487
490
  properties: {
488
491
  "coupon_code": couponCodes,
489
492
  "discount_type": ["percent", "flat", "free_delivery"],
@@ -493,6 +496,7 @@ const config = {
493
496
  {
494
497
  event: "checkout started",
495
498
  weight: 12,
499
+ isStrictEvent: false,
496
500
  properties: {
497
501
  "cart_total": u.weighNumRange(8, 150, 0.8, 40),
498
502
  "items_count": u.weighNumRange(1, 8, 1.2, 20),
@@ -502,6 +506,7 @@ const config = {
502
506
  {
503
507
  event: "order placed",
504
508
  weight: 10,
509
+ isStrictEvent: false,
505
510
  properties: {
506
511
  "order_id": orderIds,
507
512
  "payment_method": ["credit_card", "apple_pay", "google_pay", "paypal", "cash"],
@@ -522,6 +527,7 @@ const config = {
522
527
  {
523
528
  event: "order delivered",
524
529
  weight: 9,
530
+ isStrictEvent: false,
525
531
  properties: {
526
532
  "order_id": orderIds,
527
533
  "actual_delivery_mins": u.weighNumRange(12, 90, 1.0, 40),
@@ -531,6 +537,7 @@ const config = {
531
537
  {
532
538
  event: "order rated",
533
539
  weight: 7,
540
+ isStrictEvent: false,
534
541
  properties: {
535
542
  "order_id": orderIds,
536
543
  "food_rating": u.weighNumRange(1, 5, 0.8, 30),
@@ -563,6 +570,7 @@ const config = {
563
570
  {
564
571
  event: "subscription started",
565
572
  weight: 2,
573
+ isStrictEvent: false,
566
574
  properties: {
567
575
  "plan": ["quickbite_plus_monthly", "quickbite_plus_monthly", "quickbite_plus_annual"],
568
576
  "price": [9.99, 9.99, 79.99],
@@ -588,6 +596,7 @@ const config = {
588
596
  {
589
597
  event: "reorder initiated",
590
598
  weight: 6,
599
+ isStrictEvent: false,
591
600
  properties: {
592
601
  "order_id": orderIds,
593
602
  "original_order_age_days": u.weighNumRange(1, 60, 1.5, 30),
@@ -435,6 +435,7 @@ const config = {
435
435
  {
436
436
  event: "quest turned in",
437
437
  weight: 10,
438
+ isStrictEvent: false,
438
439
  properties: {
439
440
  "quest_id": questIds,
440
441
  "reward_gold": u.weighNumRange(10, 500, 0.5, 100),
@@ -453,6 +454,7 @@ const config = {
453
454
  {
454
455
  event: "exit dungeon",
455
456
  weight: 14,
457
+ isStrictEvent: false,
456
458
  properties: {
457
459
  "dungeon_id": dungeonIds,
458
460
  "time_spent_mins": u.weighNumRange(5, 120, 0.6, 30),
@@ -462,6 +464,7 @@ const config = {
462
464
  {
463
465
  event: "find treasure",
464
466
  weight: 16,
467
+ isStrictEvent: false,
465
468
  properties: {
466
469
  "treasure_type": ["Gold", "Weapon", "Armor", "Potion", "Scroll", "Rare Artifact"],
467
470
  "treasure_value": u.weighNumRange(5, 1000, 1.2, 50),
@@ -488,6 +491,7 @@ const config = {
488
491
  {
489
492
  event: "item purchased",
490
493
  weight: 11,
494
+ isStrictEvent: false,
491
495
  properties: {
492
496
  "item_id": itemIds,
493
497
  "item_type": ["Weapon", "Armor", "Potion", "Scroll", "Mount", "Cosmetic"],
@@ -507,6 +511,7 @@ const config = {
507
511
  {
508
512
  event: "real money purchase",
509
513
  weight: 3,
514
+ isStrictEvent: false,
510
515
  properties: {
511
516
  "product": [
512
517
  "Premium Currency (1000)",
@@ -523,6 +528,7 @@ const config = {
523
528
  {
524
529
  event: "guild joined",
525
530
  weight: 4,
531
+ isStrictEvent: false,
526
532
  properties: {
527
533
  "guild_size": u.weighNumRange(5, 100),
528
534
  "guild_level": u.weighNumRange(1, 20),
@@ -538,6 +544,7 @@ const config = {
538
544
  {
539
545
  event: "inspect",
540
546
  weight: 9,
547
+ isStrictEvent: false,
541
548
  properties: {
542
549
  "inspect_target": ["NPC", "Monster", "Treasure Chest", "Door", "Statue", "Bookshelf"],
543
550
  }
@@ -545,6 +552,7 @@ const config = {
545
552
  {
546
553
  event: "search for clues",
547
554
  weight: 8,
555
+ isStrictEvent: false,
548
556
  properties: {
549
557
  "location_type": ["Dungeon Entrance", "Hidden Room", "Quest Location", "Town Square"],
550
558
  "clue_found": [false, false, true, true, true],
@@ -553,6 +561,7 @@ const config = {
553
561
  {
554
562
  event: "use item",
555
563
  weight: 14,
564
+ isStrictEvent: false,
556
565
  properties: {
557
566
  "item_id": itemIds,
558
567
  "item_type": [
@@ -574,6 +583,7 @@ const config = {
574
583
  {
575
584
  event: "combat completed",
576
585
  weight: 18,
586
+ isStrictEvent: false,
577
587
  properties: {
578
588
  "outcome": ["Victory", "Defeat", "Fled"],
579
589
  "loot_gained": [false, false, false, true, true, true, true, true, true, true],
@@ -354,6 +354,7 @@ const config = {
354
354
  {
355
355
  event: "appointment booked",
356
356
  weight: 6,
357
+ isStrictEvent: false,
357
358
  properties: {
358
359
  doctor_id: chance.pickone.bind(chance, doctorIds),
359
360
  clinic_id: chance.pickone.bind(chance, clinicIds),
@@ -365,6 +366,7 @@ const config = {
365
366
  {
366
367
  event: "consultation completed",
367
368
  weight: 5,
369
+ isStrictEvent: false,
368
370
  properties: {
369
371
  doctor_id: chance.pickone.bind(chance, doctorIds),
370
372
  consultation_mode: ["phone", "phone", "video"],
@@ -377,6 +379,7 @@ const config = {
377
379
  {
378
380
  event: "prescription issued",
379
381
  weight: 4,
382
+ isStrictEvent: false,
380
383
  properties: {
381
384
  medication_type: ["antibiotic", "antiviral", "painkiller", "anti_inflammatory", "antidepressant", "inhaler", "topical", "chronic_maintenance"],
382
385
  quantity: u.weighNumRange(1, 90, 0.3, 30),
@@ -387,6 +390,7 @@ const config = {
387
390
  {
388
391
  event: "prescription refill",
389
392
  weight: 3,
393
+ isStrictEvent: false,
390
394
  properties: {
391
395
  medication_type: ["antibiotic", "antiviral", "painkiller", "anti_inflammatory", "antidepressant", "inhaler", "topical", "chronic_maintenance"],
392
396
  quantity: u.weighNumRange(1, 90, 0.3, 30),
@@ -397,6 +401,7 @@ const config = {
397
401
  {
398
402
  event: "follow up scheduled",
399
403
  weight: 3,
404
+ isStrictEvent: false,
400
405
  properties: {
401
406
  doctor_id: chance.pickone.bind(chance, doctorIds),
402
407
  days_until_followup: u.weighNumRange(3, 30, 0.5, 7),
@@ -430,6 +430,7 @@ const config = {
430
430
  {
431
431
  event: "application started",
432
432
  weight: 4,
433
+ isStrictEvent: false,
433
434
  properties: {
434
435
  coverage_level: ["basic", "standard", "premium"],
435
436
  estimated_premium: u.weighNumRange(30, 800, 0.3, 150),
@@ -438,6 +439,7 @@ const config = {
438
439
  {
439
440
  event: "application step completed",
440
441
  weight: 6,
442
+ isStrictEvent: false,
441
443
  properties: {
442
444
  step_name: [
443
445
  "personal_info",
@@ -454,6 +456,7 @@ const config = {
454
456
  {
455
457
  event: "document uploaded",
456
458
  weight: 3,
459
+ isStrictEvent: false,
457
460
  properties: {
458
461
  document_type: [
459
462
  "drivers_license",
@@ -476,6 +479,7 @@ const config = {
476
479
  {
477
480
  event: "application approved",
478
481
  weight: 2,
482
+ isStrictEvent: false,
479
483
  properties: {
480
484
  approved_premium: u.weighNumRange(30, 800, 0.3, 150),
481
485
  approval_time_hours: u.weighNumRange(1, 72, 0.5, 24),
@@ -484,6 +488,7 @@ const config = {
484
488
  {
485
489
  event: "policy activated",
486
490
  weight: 2,
491
+ isStrictEvent: false,
487
492
  properties: {
488
493
  policy_term_months: [6, 12, 12, 12, 24],
489
494
  effective_date_offset_days: u.weighNumRange(0, 30, 0.5, 7),
@@ -492,6 +497,7 @@ const config = {
492
497
  {
493
498
  event: "claim filed",
494
499
  weight: 2,
500
+ isStrictEvent: false,
495
501
  properties: {
496
502
  claim_type: [
497
503
  "collision",
@@ -521,6 +527,7 @@ const config = {
521
527
  {
522
528
  event: "payment made",
523
529
  weight: 5,
530
+ isStrictEvent: false,
524
531
  properties: {
525
532
  payment_method: ["credit_card", "bank_transfer", "auto_pay", "check"],
526
533
  amount: u.weighNumRange(30, 800, 0.3, 150),
@@ -531,6 +538,7 @@ const config = {
531
538
  {
532
539
  event: "support ticket created",
533
540
  weight: 4,
541
+ isStrictEvent: false,
534
542
  properties: {
535
543
  issue_category: [
536
544
  "billing",
@@ -564,6 +572,7 @@ const config = {
564
572
  {
565
573
  event: "coverage reviewed",
566
574
  weight: 4,
575
+ isStrictEvent: false,
567
576
  properties: {
568
577
  current_premium: u.weighNumRange(30, 800, 0.3, 150),
569
578
  coverage_adequate: [true, true, true, false],
@@ -586,6 +595,7 @@ const config = {
586
595
  {
587
596
  event: "renewal completed",
588
597
  weight: 2,
598
+ isStrictEvent: false,
589
599
  properties: {
590
600
  renewal_premium: u.weighNumRange(30, 800, 0.3, 150),
591
601
  premium_change_pct: u.weighNumRange(-15, 20, 1, 3),
@@ -391,6 +391,7 @@ const config = {
391
391
  {
392
392
  event: "inventory checked",
393
393
  weight: 8,
394
+ isStrictEvent: false,
394
395
  properties: {
395
396
  warehouse_id: chance.pickone.bind(chance, warehouseIds),
396
397
  sku_category: ["electronics", "apparel", "food_beverage", "pharma", "raw_materials", "packaging", "automotive_parts"],
@@ -402,6 +403,7 @@ const config = {
402
403
  {
403
404
  event: "stockout alert",
404
405
  weight: 5,
406
+ isStrictEvent: false,
405
407
  properties: {
406
408
  warehouse_id: chance.pickone.bind(chance, warehouseIds),
407
409
  sku_category: ["electronics", "apparel", "food_beverage", "pharma", "raw_materials", "packaging"],
@@ -413,6 +415,7 @@ const config = {
413
415
  {
414
416
  event: "purchase order created",
415
417
  weight: 5,
418
+ isStrictEvent: false,
416
419
  properties: {
417
420
  supplier_id: chance.pickone.bind(chance, supplierIds),
418
421
  sku_category: ["electronics", "apparel", "food_beverage", "pharma", "raw_materials", "packaging", "automotive_parts"],
@@ -457,6 +460,7 @@ const config = {
457
460
  {
458
461
  event: "integration connected",
459
462
  weight: 2,
463
+ isStrictEvent: false,
460
464
  properties: {
461
465
  integration_type: ["erp", "accounting", "shipping", "ecommerce", "crm", "bi_tool"],
462
466
  integration_name: ["SAP", "QuickBooks", "ShipStation", "Shopify", "Salesforce", "NetSuite", "Xero"],
@@ -466,6 +470,7 @@ const config = {
466
470
  {
467
471
  event: "report generated",
468
472
  weight: 4,
473
+ isStrictEvent: false,
469
474
  properties: {
470
475
  report_type: ["inventory_summary", "order_history", "supplier_performance", "cost_analysis", "forecast", "compliance"],
471
476
  report_pages: u.weighNumRange(1, 50, 0.4, 20),
@@ -476,6 +481,7 @@ const config = {
476
481
  {
477
482
  event: "alert configured",
478
483
  weight: 2,
484
+ isStrictEvent: false,
479
485
  properties: {
480
486
  alert_type: ["low_stock", "delivery_delay", "price_change", "quality_threshold", "expiry_warning"],
481
487
  threshold_value: u.weighNumRange(1, 500, 0.4, 50),
@@ -569,6 +575,7 @@ const config = {
569
575
  order: "sequential",
570
576
  timeToConvert: 168,
571
577
  weight: 5,
578
+ reentry: true,
572
579
  },
573
580
  {
574
581
  name: "Supplier Management",
@@ -939,7 +946,7 @@ const config = {
939
946
  if (invCheckCount >= 5 && invCheckCount <= 15) {
940
947
  record.forEach(e => {
941
948
  if (e.event === 'purchase order created' && typeof e.quantity === 'number') {
942
- e.quantity = Math.round(e.quantity * 1.25);
949
+ e.quantity = Math.round(e.quantity * 1.4);
943
950
  }
944
951
  });
945
952
  } else if (invCheckCount >= 16) {
@@ -354,6 +354,7 @@ const config = {
354
354
  {
355
355
  event: "item searched",
356
356
  weight: 8,
357
+ isStrictEvent: false,
357
358
  properties: {
358
359
  search_query: ["laptop", "vintage jacket", "sneakers", "headphones", "phone case", "gaming console", "watch", "sunglasses", "backpack", "camera"],
359
360
  results_count: u.weighNumRange(0, 50, 0.5),
@@ -363,6 +364,7 @@ const config = {
363
364
  {
364
365
  event: "item viewed",
365
366
  weight: 7,
367
+ isStrictEvent: false,
366
368
  properties: {
367
369
  listing_id: chance.pickone.bind(chance, listingIds),
368
370
  item_price: u.weighNumRange(5, 500, 0.3, 45),
@@ -383,6 +385,7 @@ const config = {
383
385
  {
384
386
  event: "purchase completed",
385
387
  weight: 3,
388
+ isStrictEvent: false,
386
389
  properties: {
387
390
  listing_id: chance.pickone.bind(chance, listingIds),
388
391
  total_amount: u.weighNumRange(10, 500, 0.3, 60),
@@ -394,6 +397,7 @@ const config = {
394
397
  {
395
398
  event: "listing created",
396
399
  weight: 4,
400
+ isStrictEvent: false,
397
401
  properties: {
398
402
  listing_id: chance.pickone.bind(chance, listingIds),
399
403
  store_id: chance.pickone.bind(chance, storeIds),
@@ -414,6 +418,7 @@ const config = {
414
418
  {
415
419
  event: "offer received",
416
420
  weight: 3,
421
+ isStrictEvent: false,
417
422
  properties: {
418
423
  listing_id: chance.pickone.bind(chance, listingIds),
419
424
  offer_amount: u.weighNumRange(5, 400, 0.3, 40),
@@ -423,6 +428,7 @@ const config = {
423
428
  {
424
429
  event: "offer accepted",
425
430
  weight: 2,
431
+ isStrictEvent: false,
426
432
  properties: {
427
433
  listing_id: chance.pickone.bind(chance, listingIds),
428
434
  final_price: u.weighNumRange(10, 500, 0.3, 55),
@@ -452,6 +458,7 @@ const config = {
452
458
  {
453
459
  event: "message sent",
454
460
  weight: 5,
461
+ isStrictEvent: false,
455
462
  properties: {
456
463
  message_type: ["inquiry", "inquiry", "negotiation", "shipping_question", "complaint", "thank_you"],
457
464
  recipient_type: ["seller", "seller", "buyer", "support"],