mokshak commited on
Commit
2915986
·
verified ·
1 Parent(s): b09541a

Tighten adaptive unseen and pharmacy refill safety

Browse files
.gitattributes CHANGED
@@ -1,35 +1,35 @@
1
- *.7z filter=lfs diff=lfs merge=lfs -text
2
- *.arrow filter=lfs diff=lfs merge=lfs -text
3
- *.bin filter=lfs diff=lfs merge=lfs -text
4
- *.bz2 filter=lfs diff=lfs merge=lfs -text
5
- *.ckpt filter=lfs diff=lfs merge=lfs -text
6
- *.ftz filter=lfs diff=lfs merge=lfs -text
7
- *.gz filter=lfs diff=lfs merge=lfs -text
8
- *.h5 filter=lfs diff=lfs merge=lfs -text
9
- *.joblib filter=lfs diff=lfs merge=lfs -text
10
- *.lfs.* filter=lfs diff=lfs merge=lfs -text
11
- *.mlmodel filter=lfs diff=lfs merge=lfs -text
12
- *.model filter=lfs diff=lfs merge=lfs -text
13
- *.msgpack filter=lfs diff=lfs merge=lfs -text
14
- *.npy filter=lfs diff=lfs merge=lfs -text
15
- *.npz filter=lfs diff=lfs merge=lfs -text
16
- *.onnx filter=lfs diff=lfs merge=lfs -text
17
- *.ot filter=lfs diff=lfs merge=lfs -text
18
- *.parquet filter=lfs diff=lfs merge=lfs -text
19
- *.pb filter=lfs diff=lfs merge=lfs -text
20
- *.pickle filter=lfs diff=lfs merge=lfs -text
21
- *.pkl filter=lfs diff=lfs merge=lfs -text
22
- *.pt filter=lfs diff=lfs merge=lfs -text
23
- *.pth filter=lfs diff=lfs merge=lfs -text
24
- *.rar filter=lfs diff=lfs merge=lfs -text
25
- *.safetensors filter=lfs diff=lfs merge=lfs -text
26
- saved_model/**/* filter=lfs diff=lfs merge=lfs -text
27
- *.tar.* filter=lfs diff=lfs merge=lfs -text
28
- *.tar filter=lfs diff=lfs merge=lfs -text
29
- *.tflite filter=lfs diff=lfs merge=lfs -text
30
- *.tgz filter=lfs diff=lfs merge=lfs -text
31
- *.wasm filter=lfs diff=lfs merge=lfs -text
32
- *.xz filter=lfs diff=lfs merge=lfs -text
33
- *.zip filter=lfs diff=lfs merge=lfs -text
34
- *.zst filter=lfs diff=lfs merge=lfs -text
35
- *tfevents* filter=lfs diff=lfs merge=lfs -text
 
1
+ *.7z filter=lfs diff=lfs merge=lfs -text
2
+ *.arrow filter=lfs diff=lfs merge=lfs -text
3
+ *.bin filter=lfs diff=lfs merge=lfs -text
4
+ *.bz2 filter=lfs diff=lfs merge=lfs -text
5
+ *.ckpt filter=lfs diff=lfs merge=lfs -text
6
+ *.ftz filter=lfs diff=lfs merge=lfs -text
7
+ *.gz filter=lfs diff=lfs merge=lfs -text
8
+ *.h5 filter=lfs diff=lfs merge=lfs -text
9
+ *.joblib filter=lfs diff=lfs merge=lfs -text
10
+ *.lfs.* filter=lfs diff=lfs merge=lfs -text
11
+ *.mlmodel filter=lfs diff=lfs merge=lfs -text
12
+ *.model filter=lfs diff=lfs merge=lfs -text
13
+ *.msgpack filter=lfs diff=lfs merge=lfs -text
14
+ *.npy filter=lfs diff=lfs merge=lfs -text
15
+ *.npz filter=lfs diff=lfs merge=lfs -text
16
+ *.onnx filter=lfs diff=lfs merge=lfs -text
17
+ *.ot filter=lfs diff=lfs merge=lfs -text
18
+ *.parquet filter=lfs diff=lfs merge=lfs -text
19
+ *.pb filter=lfs diff=lfs merge=lfs -text
20
+ *.pickle filter=lfs diff=lfs merge=lfs -text
21
+ *.pkl filter=lfs diff=lfs merge=lfs -text
22
+ *.pt filter=lfs diff=lfs merge=lfs -text
23
+ *.pth filter=lfs diff=lfs merge=lfs -text
24
+ *.rar filter=lfs diff=lfs merge=lfs -text
25
+ *.safetensors filter=lfs diff=lfs merge=lfs -text
26
+ saved_model/**/* filter=lfs diff=lfs merge=lfs -text
27
+ *.tar.* filter=lfs diff=lfs merge=lfs -text
28
+ *.tar filter=lfs diff=lfs merge=lfs -text
29
+ *.tflite filter=lfs diff=lfs merge=lfs -text
30
+ *.tgz filter=lfs diff=lfs merge=lfs -text
31
+ *.wasm filter=lfs diff=lfs merge=lfs -text
32
+ *.xz filter=lfs diff=lfs merge=lfs -text
33
+ *.zip filter=lfs diff=lfs merge=lfs -text
34
+ *.zst filter=lfs diff=lfs merge=lfs -text
35
+ *tfevents* filter=lfs diff=lfs merge=lfs -text
README.pdf ADDED
Binary file (96 kB). View file
 
app/composer.py CHANGED
@@ -415,8 +415,8 @@ def _compose_customer(category: Context, merchant: Context, trigger: Context, cu
415
  if not _has_any(payload, "molecule_list", "stock_runs_out_iso"):
416
  return _generic_customer(category, merchant, trigger, customer)
417
  meds = ", ".join(payload.get("molecule_list", []))
418
- saved = "saved address" if payload.get("delivery_address_saved") else "your preferred address"
419
- body = f"Namaste {customer_name}, {merchant_name} here. Your monthly medicines ({meds}) are due by {_date_from_iso(payload.get('stock_runs_out_iso'))}. {offer}; delivery can go to the {saved}. Reply CONFIRM to dispatch, or tell us if dosage changed."
420
  return _msg(body, CTA_CONFIRM, "merchant_on_behalf", trigger, "Refill reminder uses molecule list, run-out date, delivery status, and pharmacy offer.")
421
 
422
  return _msg(
 
415
  if not _has_any(payload, "molecule_list", "stock_runs_out_iso"):
416
  return _generic_customer(category, merchant, trigger, customer)
417
  meds = ", ".join(payload.get("molecule_list", []))
418
+ address_note = "We have your saved delivery address on file." if payload.get("delivery_address_saved") else "We can confirm the delivery address after your reply."
419
+ body = f"Namaste {customer_name}, {merchant_name} here. Your monthly medicines ({meds}) are due by {_date_from_iso(payload.get('stock_runs_out_iso'))}. {address_note} Reply CONFIRM and our pharmacist will verify stock and delivery details before preparing it."
420
  return _msg(body, CTA_CONFIRM, "merchant_on_behalf", trigger, "Refill reminder uses molecule list, run-out date, delivery status, and pharmacy offer.")
421
 
422
  return _msg(
app/decision_engine.py CHANGED
@@ -942,6 +942,28 @@ def render_body(category: Context, merchant: Context, trigger: Context, customer
942
  if not customer and car and should_use_adaptive_unseen_body(trigger, evidence, car):
943
  return adaptive_unseen_body(cat, name, trigger, car, evidence)
944
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
945
  if not customer and str(trigger.get("kind")) == "active_planning_intent" and car:
946
  topic = fact_value(evidence, "intent_topic") or fact_value(evidence, "topic") or "this plan"
947
  offer = fact_value(evidence, "active_offer") or (car.active_offers[0] if car.active_offers else "")
@@ -1102,6 +1124,16 @@ def render_body(category: Context, merchant: Context, trigger: Context, customer
1102
  season = fact_value(evidence, "season") or "this season"
1103
  trends = fact_value(evidence, "trends")
1104
  shelf_action = fact_value(evidence, "shelf_action_recommended") or "reorder/checklist action"
 
 
 
 
 
 
 
 
 
 
1105
  body = f"{name}, {season} demand is shifting: {trends}. Best next step is {shelf_action}, with claim-free customer copy. Want me to draft the reorder checklist and counter note now?"
1106
  return final_scrub(body)
1107
 
@@ -1432,7 +1464,7 @@ def merchant_vulnerability_signal(car: MerchantCAR, trigger: Context, evidence:
1432
 
1433
  def adaptive_unseen_body(cat: str, name: str, trigger: Context, car: MerchantCAR, evidence: list[Evidence]) -> str:
1434
  kind = str(trigger.get("kind") or "signal")
1435
- signal_name = signal_label(kind)
1436
  archetype = adaptive_archetype(trigger, evidence)
1437
  locality = car.locality if car.locality and car.locality != "unknown" else "your area"
1438
  demand = compact_demand_anchor(car)
@@ -1464,15 +1496,30 @@ def adaptive_unseen_body(cat: str, name: str, trigger: Context, car: MerchantCAR
1464
 
1465
  pressure = adaptive_pressure_sentence(archetype, cat)
1466
  consequence = business_consequence_sentence(car, trigger, evidence, archetype)
 
 
1467
  consequence_phrase = f" {consequence}" if consequence else ""
1468
- body = f"{name}, this {signal_name} alert is actionable now: {fact_sentence}.{category_phrase}{consequence_phrase} {pressure}{offer_phrase} Want me to draft {action} now?"
1469
  return final_scrub(body)
1470
 
1471
 
 
 
 
 
 
 
 
 
 
 
 
1472
  def adaptive_body_facts(evidence: list[Evidence]) -> list[Evidence]:
 
1473
  priority = {
1474
  "metric": 0,
1475
- "delta_pct": 1,
 
1476
  "occurrences_30d": 2,
1477
  "avg_delay_minutes": 3,
1478
  "available_slots": 4,
@@ -1485,13 +1532,15 @@ def adaptive_body_facts(evidence: list[Evidence]) -> list[Evidence]:
1485
  "retrieved_trend_query": 11,
1486
  "retrieved_seasonal_note": 12,
1487
  "retrieved_digest_actionable": 13,
1488
- "locality": 14,
 
1489
  }
1490
  candidates = [
1491
  item for item in evidence
1492
  if item.kind != "identity"
1493
  and item.label not in {"retrieval_confidence", "peer_ctr", "peer_reviews", "car_consent_state", "car_customer_stage"}
1494
  and item.value not in {"unknown", "not applicable", "merchant only"}
 
1495
  ]
1496
  candidates.sort(key=lambda item: (priority.get(item.label.replace("car_", ""), 40), -item.weight))
1497
  chosen: list[Evidence] = []
@@ -1508,12 +1557,14 @@ def adaptive_body_facts(evidence: list[Evidence]) -> list[Evidence]:
1508
 
1509
  def adaptive_archetype(trigger: Context, evidence: list[Evidence]) -> str:
1510
  terms = terms_from_values([trigger, [item.value for item in evidence if item.source.startswith("trigger") or item.source.startswith("category.adaptive")]])
 
 
 
 
1511
  if terms & {"compliance", "regulation", "audit", "expiry", "expired", "batch", "stock", "supply", "recall", "safety"}:
1512
  return "compliance"
1513
  if terms & {"late", "delay", "dispatch", "complaint", "review", "rating", "cold", "wrong", "service"}:
1514
  return "ops"
1515
- if terms & {"lapsed", "inactive", "dormant", "winback", "churn", "renewal", "expired"}:
1516
- return "retention"
1517
  if terms & {"competitor", "rival", "opened", "nearby", "compare"}:
1518
  return "competitive"
1519
  if terms & {"spike", "search", "trend", "festival", "season", "demand", "views", "calls", "growth", "yoy"}:
@@ -1534,6 +1585,14 @@ def adaptive_pressure_sentence(archetype: str, cat: str) -> str:
1534
  return "The right move is a checklist first, then any customer-facing note after merchant approval."
1535
  if archetype == "retention":
1536
  return "The reply should make restart feel easy, not like a guilt or discount blast."
 
 
 
 
 
 
 
 
1537
  if archetype == "competitive":
1538
  return "This is a local comparison moment; make the profile look current before shoppers compare."
1539
  if archetype == "demand":
@@ -1551,6 +1610,8 @@ def business_consequence_sentence(car: MerchantCAR, trigger: Context, evidence:
1551
  return "The cost is trust: the next promo wastes demand if the same ops signal stays visible."
1552
  if archetype == "retention":
1553
  return "The cost is silence: each missed week makes the comeback ask colder."
 
 
1554
  if archetype == "compliance":
1555
  return "The risk is process drift: the team may keep using the old checklist after the trigger window."
1556
  if archetype == "demand" and car.views_30d:
@@ -1564,6 +1625,8 @@ def adaptive_category_action(cat: str, archetype: str) -> str:
1564
  if cat == "dentists":
1565
  if archetype == "compliance":
1566
  return "the 3-point clinic checklist and patient-safe counter note"
 
 
1567
  if archetype == "demand":
1568
  return "the patient-safe service note and GBP update"
1569
  return "the clinic checklist and patient-safe reply"
@@ -1810,7 +1873,7 @@ def recommended_action(cat: str, kind: str, playbook: Context, customer: Context
1810
  return "I can draft a consent-safe approval note for you first."
1811
  if customer:
1812
  if kind == "chronic_refill_due":
1813
- return "Reply CONFIRM to dispatch, or tell us if dosage/brand changed."
1814
  if kind in {"recall_due", "appointment_tomorrow"}:
1815
  return "Reply YES to confirm, or send a better time."
1816
  if kind in {"customer_lapsed_hard", "customer_lapsed_soft"}:
@@ -2451,6 +2514,8 @@ def format_fact(e: Evidence) -> str:
2451
  "locality": "locality",
2452
  "verified": "verified",
2453
  "merchant_offer_status": "merchant offer",
 
 
2454
  "metric": "metric",
2455
  "delta_pct": "delta",
2456
  "vs_baseline": "baseline",
 
942
  if not customer and car and should_use_adaptive_unseen_body(trigger, evidence, car):
943
  return adaptive_unseen_body(cat, name, trigger, car, evidence)
944
 
945
+ if customer and str(trigger.get("kind")) == "chronic_refill_due" and send_as != "merchant_on_behalf":
946
+ meds = fact_value(evidence, "molecule_list") or fact_value(evidence, "metric_or_topic") or "refill context"
947
+ due_raw = fact_value(evidence, "stock_runs_out_iso")
948
+ due_phrase = f" due by {str(due_raw).split('T', 1)[0]}" if due_raw else ""
949
+ if cat != "pharmacies":
950
+ cust = customer_name(customer)
951
+ visits = fact_value(evidence, "visits_total")
952
+ last_visit = fact_value(evidence, "last_visit")
953
+ visit_phrase = f"; {cust} has {visits} visits and last visited {last_visit}" if visits or last_visit else f"; customer: {cust}"
954
+ body = f"{name}, chronic refill due is a mismatched customer trigger for a {cat[:-1] if cat.endswith('s') else cat}{visit_phrase}. Consent is not explicit for this outreach, so I can prepare a consent-safe merchant approval note instead of direct customer copy. Reply YES and I will draft it."
955
+ else:
956
+ body = f"{name}, chronic refill due context is present{due_phrase}: {meds}. Consent is not explicit for direct outreach, so I can prepare a consent-safe merchant approval note first. Reply YES and I will draft it."
957
+ return final_scrub(body)
958
+
959
+ if customer and cat == "pharmacies" and str(trigger.get("kind")) == "chronic_refill_due":
960
+ meds = fact_value(evidence, "molecule_list") or "your monthly medicines"
961
+ due_raw = fact_value(evidence, "stock_runs_out_iso")
962
+ due = str(due_raw).split("T", 1)[0] if due_raw else "the refill date"
963
+ address_note = "Address is already saved." if str(fact_value(evidence, "delivery_address_saved")).lower() == "true" else "We can confirm the delivery address after your reply."
964
+ body = f"{name}, {merchant_name} here. Chronic refill due reminder: your monthly medicines ({meds}) are due by {due}. {address_note} Reply CONFIRM and our pharmacist will verify stock and delivery details before preparing it."
965
+ return final_scrub(body)
966
+
967
  if not customer and str(trigger.get("kind")) == "active_planning_intent" and car:
968
  topic = fact_value(evidence, "intent_topic") or fact_value(evidence, "topic") or "this plan"
969
  offer = fact_value(evidence, "active_offer") or (car.active_offers[0] if car.active_offers else "")
 
1124
  season = fact_value(evidence, "season") or "this season"
1125
  trends = fact_value(evidence, "trends")
1126
  shelf_action = fact_value(evidence, "shelf_action_recommended") or "reorder/checklist action"
1127
+ if str(shelf_action).lower() in {"true", "yes", "1"}:
1128
+ shelf_action = {
1129
+ "pharmacies": "a reorder checklist for fast-moving summer stock",
1130
+ "restaurants": "a menu-window prep checklist",
1131
+ "salons": "a slot and service-package prep checklist",
1132
+ "gyms": "a seasonal class/restart prep checklist",
1133
+ "dentists": "a patient-safe service and recall checklist",
1134
+ }.get(cat, "a category-specific prep checklist")
1135
+ elif str(shelf_action).lower() in {"false", "no", "0"}:
1136
+ shelf_action = "a conservative hold-and-monitor checklist"
1137
  body = f"{name}, {season} demand is shifting: {trends}. Best next step is {shelf_action}, with claim-free customer copy. Want me to draft the reorder checklist and counter note now?"
1138
  return final_scrub(body)
1139
 
 
1464
 
1465
  def adaptive_unseen_body(cat: str, name: str, trigger: Context, car: MerchantCAR, evidence: list[Evidence]) -> str:
1466
  kind = str(trigger.get("kind") or "signal")
1467
+ signal_name = adaptive_signal_name(kind)
1468
  archetype = adaptive_archetype(trigger, evidence)
1469
  locality = car.locality if car.locality and car.locality != "unknown" else "your area"
1470
  demand = compact_demand_anchor(car)
 
1496
 
1497
  pressure = adaptive_pressure_sentence(archetype, cat)
1498
  consequence = business_consequence_sentence(car, trigger, evidence, archetype)
1499
+ if consequence and any(label in fact_sentence.lower() for label in ["baseline gap", "estimated value gap"]):
1500
+ consequence = "Every quiet cycle keeps the leak open."
1501
  consequence_phrase = f" {consequence}" if consequence else ""
1502
+ body = f"{name}, this {signal_name} signal is actionable now: {fact_sentence}.{category_phrase}{consequence_phrase} {pressure}{offer_phrase} Want me to draft {action} now?"
1503
  return final_scrub(body)
1504
 
1505
 
1506
+ def adaptive_signal_name(kind: str) -> str:
1507
+ label = signal_label(kind)
1508
+ replacements = {
1509
+ "dormant with vera": "dormant outreach",
1510
+ "winback eligible": "winback",
1511
+ "renewal due": "renewal",
1512
+ "gbp unverified": "GBP verification",
1513
+ }
1514
+ return replacements.get(label, label)
1515
+
1516
+
1517
  def adaptive_body_facts(evidence: list[Evidence]) -> list[Evidence]:
1518
+ has_concrete_gap = bool(fact_value(evidence, "implied_loss") or fact_value(evidence, "implied_gap"))
1519
  priority = {
1520
  "metric": 0,
1521
+ "implied_loss": 1,
1522
+ "implied_gap": 1,
1523
  "occurrences_30d": 2,
1524
  "avg_delay_minutes": 3,
1525
  "available_slots": 4,
 
1532
  "retrieved_trend_query": 11,
1533
  "retrieved_seasonal_note": 12,
1534
  "retrieved_digest_actionable": 13,
1535
+ "delta_pct": 18,
1536
+ "locality": 19,
1537
  }
1538
  candidates = [
1539
  item for item in evidence
1540
  if item.kind != "identity"
1541
  and item.label not in {"retrieval_confidence", "peer_ctr", "peer_reviews", "car_consent_state", "car_customer_stage"}
1542
  and item.value not in {"unknown", "not applicable", "merchant only"}
1543
+ and not (has_concrete_gap and item.label.replace("car_", "") == "delta_pct")
1544
  ]
1545
  candidates.sort(key=lambda item: (priority.get(item.label.replace("car_", ""), 40), -item.weight))
1546
  chosen: list[Evidence] = []
 
1557
 
1558
  def adaptive_archetype(trigger: Context, evidence: list[Evidence]) -> str:
1559
  terms = terms_from_values([trigger, [item.value for item in evidence if item.source.startswith("trigger") or item.source.startswith("category.adaptive")]])
1560
+ if terms & {"renewal"}:
1561
+ return "renewal"
1562
+ if terms & {"lapsed", "inactive", "dormant", "winback", "churn", "expired"}:
1563
+ return "retention"
1564
  if terms & {"compliance", "regulation", "audit", "expiry", "expired", "batch", "stock", "supply", "recall", "safety"}:
1565
  return "compliance"
1566
  if terms & {"late", "delay", "dispatch", "complaint", "review", "rating", "cold", "wrong", "service"}:
1567
  return "ops"
 
 
1568
  if terms & {"competitor", "rival", "opened", "nearby", "compare"}:
1569
  return "competitive"
1570
  if terms & {"spike", "search", "trend", "festival", "season", "demand", "views", "calls", "growth", "yoy"}:
 
1585
  return "The right move is a checklist first, then any customer-facing note after merchant approval."
1586
  if archetype == "retention":
1587
  return "The reply should make restart feel easy, not like a guilt or discount blast."
1588
+ if archetype == "renewal":
1589
+ return {
1590
+ "dentists": "Treat it as a clinic ROI check before renewal; fix patient acquisition before asking them to renew.",
1591
+ "salons": "Treat it as a slot ROI check before renewal; show one action that fills chairs first.",
1592
+ "restaurants": "Treat it as a demand ROI check before renewal; show one meal-window recovery action first.",
1593
+ "gyms": "Treat it as a member acquisition check before renewal; show the next-session plan first.",
1594
+ "pharmacies": "Treat it as an operational ROI check before renewal; keep the action calm and checklist-led.",
1595
+ }.get(cat, "Treat it as an ROI check before renewal.")
1596
  if archetype == "competitive":
1597
  return "This is a local comparison moment; make the profile look current before shoppers compare."
1598
  if archetype == "demand":
 
1610
  return "The cost is trust: the next promo wastes demand if the same ops signal stays visible."
1611
  if archetype == "retention":
1612
  return "The cost is silence: each missed week makes the comeback ask colder."
1613
+ if archetype == "renewal":
1614
+ return "The cost is renewal without proof: fix one visible demand gap before the plan decision."
1615
  if archetype == "compliance":
1616
  return "The risk is process drift: the team may keep using the old checklist after the trigger window."
1617
  if archetype == "demand" and car.views_30d:
 
1625
  if cat == "dentists":
1626
  if archetype == "compliance":
1627
  return "the 3-point clinic checklist and patient-safe counter note"
1628
+ if archetype == "renewal":
1629
+ return "the 3-point clinic recovery checklist"
1630
  if archetype == "demand":
1631
  return "the patient-safe service note and GBP update"
1632
  return "the clinic checklist and patient-safe reply"
 
1873
  return "I can draft a consent-safe approval note for you first."
1874
  if customer:
1875
  if kind == "chronic_refill_due":
1876
+ return "Reply CONFIRM and the pharmacist will verify stock and delivery details before preparing it."
1877
  if kind in {"recall_due", "appointment_tomorrow"}:
1878
  return "Reply YES to confirm, or send a better time."
1879
  if kind in {"customer_lapsed_hard", "customer_lapsed_soft"}:
 
2514
  "locality": "locality",
2515
  "verified": "verified",
2516
  "merchant_offer_status": "merchant offer",
2517
+ "implied_gap": "baseline gap",
2518
+ "implied_loss": "estimated value gap",
2519
  "metric": "metric",
2520
  "delta_pct": "delta",
2521
  "vs_baseline": "baseline",
judge_full_release_log.json ADDED
@@ -0,0 +1,145 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ [
2
+ {
3
+ "trigger_id": "trg_002_compliance_dci_radiograph",
4
+ "merchant_id": "m_001_drmeera_dentist_delhi",
5
+ "customer_id": null,
6
+ "total": 42,
7
+ "specificity": 9,
8
+ "category_fit": 9,
9
+ "merchant_fit": 8,
10
+ "decision_quality": 9,
11
+ "engagement": 7,
12
+ "hint": "Fold the 22-day stale-posts and sub-median CTR into the cost of delay to make inaction feel expensive.",
13
+ "body": "Dr. Meera, immediate action needed: DCI revised radiograph dose limits effective 2026-12-15 from Dental Council of India circular 2026-11-04. Maximum dose per IOPA exposure drops from 1.5 mSv to 1.0 mSv. E-speed film passes at the new limit; D-speed does not. Digital RVG sensors unaffected. For your Lajpat Nagar clinic, audit your X-ray setup before Dec 15; document E-speed or RVG in your SOPs. A missed audit risks staff using the wrong film after the deadline. Say GO and I'll draft the 5-point SOP checklist and patient-safe counter note now."
14
+ },
15
+ {
16
+ "trigger_id": "trg_004_perf_dip_bharat",
17
+ "merchant_id": "m_002_bharat_dentist_mumbai",
18
+ "customer_id": null,
19
+ "total": 41,
20
+ "specificity": 8,
21
+ "category_fit": 9,
22
+ "merchant_fit": 8,
23
+ "decision_quality": 9,
24
+ "engagement": 7,
25
+ "hint": "A whisper of calendar pressure and renewal proximity can turn clinical clarity into immediate action without breaking peer tone.",
26
+ "body": "Dr. Bharat, calls are 8 below baseline. Do not let the leak sit another cycle. GBP is unverified; no active merchant offer; only 4 calls came through in 30d, so the fastest fix is listing cleanup plus owner callback. Say GO and I'll draft the GBP cleanup checklist and missed-call callback script now."
27
+ },
28
+ {
29
+ "trigger_id": "trg_005_renewal_due_bharat",
30
+ "merchant_id": "m_002_bharat_dentist_mumbai",
31
+ "customer_id": null,
32
+ "total": 41,
33
+ "specificity": 8,
34
+ "category_fit": 9,
35
+ "merchant_fit": 9,
36
+ "decision_quality": 8,
37
+ "engagement": 7,
38
+ "hint": "Let the dormant signal whisper that unverified GBP is bleeding appointments before they renew.",
39
+ "body": "Dr. Bharat, Pro is due in 12 days for \u20b94,999; calls are down with 4 30d calls. Before renewal, fix the patient acquisition gap first. Say GO and I'll prepare the 3-point clinic recovery checklist now."
40
+ },
41
+ {
42
+ "trigger_id": "trg_009_winback_glamour",
43
+ "merchant_id": "m_004_glamour_salon_pune",
44
+ "customer_id": null,
45
+ "total": 39,
46
+ "specificity": 8,
47
+ "category_fit": 7,
48
+ "merchant_fit": 9,
49
+ "decision_quality": 8,
50
+ "engagement": 7,
51
+ "hint": "A whisper of scarcity around peak-hour slots can tip quiet owners into motion without breaking warmth.",
52
+ "body": "Anjali, your customer outreach has been quiet for 38 days and 24 lapsed customers are waiting for a reason to return; 1200 30d views and 8 calls show the profile still has demand. Restart warm, not salesy: one slot-led comeback note for recent visitors. I'll keep it slot-led around your busiest hour. Say YES and I'll prepare it now."
53
+ },
54
+ {
55
+ "trigger_id": "trg_011_review_theme_late_delivery",
56
+ "merchant_id": "m_005_pizzajunction_restaurant_delhi",
57
+ "customer_id": null,
58
+ "total": 39,
59
+ "specificity": 9,
60
+ "category_fit": 6,
61
+ "merchant_fit": 9,
62
+ "decision_quality": 8,
63
+ "engagement": 7,
64
+ "hint": "Let the 50-minute sting hint at tables turning faster than pies can leave the oven.",
65
+ "body": "Suresh, 4 reviews in 30d mention delivery late; one says \"took 50 mins for a 15 min ride\". This is a reply-and-ops moment, not a promo. Say YES and I'll draft the public reply pattern plus the counter/team checklist now."
66
+ },
67
+ {
68
+ "trigger_id": "trg_014_seasonal_acquisition_dip_powerhouse",
69
+ "merchant_id": "m_007_powerhouse_gym_bangalore",
70
+ "customer_id": null,
71
+ "total": 36,
72
+ "specificity": 7,
73
+ "category_fit": 8,
74
+ "merchant_fit": 8,
75
+ "decision_quality": 7,
76
+ "engagement": 6,
77
+ "hint": "Let the ledger speak: HSR peers gaining while views bleed makes the next seven days a wager against pride, not just a nudge.",
78
+ "body": "Karthik, seasonal perf dip: views dropped 30% in 7d. Keep it no-shame and restart-focused before another week of restart decisions passes. Use 3 FREE Trial Classes only as the hook. No guilt, just the next session. Reply YES. I'll draft a 7-day comeback class nudge now."
79
+ },
80
+ {
81
+ "trigger_id": "trg_012_milestone_mylari",
82
+ "merchant_id": "m_006_southindiancafe_restaurant_bangalore",
83
+ "customer_id": null,
84
+ "total": 41,
85
+ "specificity": 9,
86
+ "category_fit": 7,
87
+ "merchant_fit": 9,
88
+ "decision_quality": 8,
89
+ "engagement": 8,
90
+ "hint": "A whisper of social proof at the finish line could tip urgency without breaking taboo.",
91
+ "body": "Suresh, review count is 145, only 5 away from 150 in Indiranagar. Tie it to Weekday Lunch Thali @ \u00e2\u201a\u00b9149 while customers are happy. The clean play is to ask the next happy customers at billing, not create a discount. Say YES and I'll draft the 2-line review ask now."
92
+ },
93
+ {
94
+ "trigger_id": "trg_018_supply_atorvastatin_recall",
95
+ "merchant_id": "m_009_apollo_pharmacy_jaipur",
96
+ "customer_id": null,
97
+ "total": 39,
98
+ "specificity": 9,
99
+ "category_fit": 8,
100
+ "merchant_fit": 7,
101
+ "decision_quality": 8,
102
+ "engagement": 7,
103
+ "hint": "Let the recall whisper its own consequence while your checklist waits in the wings.",
104
+ "body": "Ramesh, supply alert: urgent stock action for atorvastatin batches AT2024-1102, AT2024-1108 from MfrZ. Check the 240 repeat/chronic customer context before outreach. Keep it calm and pharmacist-approved; Confirm YES and I'll draft the replacement-call list plus counter checklist now."
105
+ },
106
+ {
107
+ "trigger_id": "trg_021_unverified_gbp_sunrise",
108
+ "merchant_id": "m_010_sunrisepharm_pharmacy_lucknow",
109
+ "customer_id": null,
110
+ "total": 41,
111
+ "specificity": 8,
112
+ "category_fit": 9,
113
+ "merchant_fit": 9,
114
+ "decision_quality": 8,
115
+ "engagement": 7,
116
+ "hint": "Let silence verify what urgency amplifies.",
117
+ "body": "Vikas, GBP is still unverified via postcard or phone call with 14 recent calls at stake; the context estimates 30% visibility lift. This is a visibility fix, not a promo. Calm, clear, and claim-free. Confirm YES and I'll prepare the exact 3-step verification checklist now."
118
+ },
119
+ {
120
+ "trigger_id": "trg_023_competitor_opened_dentist",
121
+ "merchant_id": "m_001_drmeera_dentist_delhi",
122
+ "customer_id": null,
123
+ "total": 38,
124
+ "specificity": 9,
125
+ "category_fit": 8,
126
+ "merchant_fit": 7,
127
+ "decision_quality": 8,
128
+ "engagement": 6,
129
+ "hint": "Fold her 22-day stale-post gap and sub-median CTR into the threat so the 'sharper listing' is a rescue, not an upsell.",
130
+ "body": "Dr. Meera, Smile Studio opened 1.3 km away on 2026-04-08 with Dental Cleaning @ \u00e2\u201a\u00b9199. Your hook is Dental Cleaning @ \u00e2\u201a\u00b9299. This week, nearby searchers will compare both profiles. Say GO and I'll draft a sharper local listing post that protects your nearby demand."
131
+ },
132
+ {
133
+ "trigger_id": "trg_025_dormancy_glamour",
134
+ "merchant_id": "m_004_glamour_salon_pune",
135
+ "customer_id": null,
136
+ "total": 39,
137
+ "specificity": 8,
138
+ "category_fit": 7,
139
+ "merchant_fit": 9,
140
+ "decision_quality": 8,
141
+ "engagement": 7,
142
+ "hint": "Let silence cost her a busy-hour slot she can't reclaim once the week fills.",
143
+ "body": "Anjali, your customer outreach has been quiet for 38 days since the last subscription expiry conversation; 1200 30d views and 8 calls show the profile still has demand. Restart warm, not salesy: one slot-led comeback note for recent visitors. I'll keep it slot-led around your busiest hour. Say YES and I'll prepare it now."
144
+ }
145
+ ]
judge_full_release_log_after_fix.json ADDED
@@ -0,0 +1,145 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ [
2
+ {
3
+ "trigger_id": "trg_002_compliance_dci_radiograph",
4
+ "merchant_id": "m_001_drmeera_dentist_delhi",
5
+ "customer_id": null,
6
+ "total": 41,
7
+ "specificity": 9,
8
+ "category_fit": 9,
9
+ "merchant_fit": 8,
10
+ "decision_quality": 8,
11
+ "engagement": 7,
12
+ "hint": "Fold her 22-day stale-posts and sub-median CTR into the compliance hook so the regulation feels like a reputational lever, not just a checklist.",
13
+ "body": "Dr. Meera, immediate action needed: DCI revised radiograph dose limits effective 2026-12-15 from Dental Council of India circular 2026-11-04. Maximum dose per IOPA exposure drops from 1.5 mSv to 1.0 mSv. E-speed film passes at the new limit; D-speed does not. Digital RVG sensors unaffected. For your Lajpat Nagar clinic, audit your X-ray setup before Dec 15; document E-speed or RVG in your SOPs. A missed audit risks staff using the wrong film after the deadline. Say GO and I'll draft the 5-point SOP checklist and patient-safe counter note now."
14
+ },
15
+ {
16
+ "trigger_id": "trg_004_perf_dip_bharat",
17
+ "merchant_id": "m_002_bharat_dentist_mumbai",
18
+ "customer_id": null,
19
+ "total": 36,
20
+ "specificity": 7,
21
+ "category_fit": 8,
22
+ "merchant_fit": 7,
23
+ "decision_quality": 8,
24
+ "engagement": 6,
25
+ "hint": "A whisper of local ranking bleed often hides in plain sight when GBP sleeps.",
26
+ "body": "Dr. Bharat, calls are 8 below baseline. Do not let the leak sit another cycle. GBP is unverified; no active merchant offer; only 4 calls came through in 30d, so the fastest fix is listing cleanup plus owner callback. Say GO and I'll draft the GBP cleanup checklist and missed-call callback script now."
27
+ },
28
+ {
29
+ "trigger_id": "trg_005_renewal_due_bharat",
30
+ "merchant_id": "m_002_bharat_dentist_mumbai",
31
+ "customer_id": null,
32
+ "total": 41,
33
+ "specificity": 8,
34
+ "category_fit": 9,
35
+ "merchant_fit": 9,
36
+ "decision_quality": 8,
37
+ "engagement": 7,
38
+ "hint": "Let the checklist preview whisper ROI before the bill lands.",
39
+ "body": "Dr. Bharat, Pro is due in 12 days for \u20b94,999; calls are down with 4 30d calls. Before renewal, fix the patient acquisition gap first. Say GO and I'll prepare the 3-point clinic recovery checklist now."
40
+ },
41
+ {
42
+ "trigger_id": "trg_009_winback_glamour",
43
+ "merchant_id": "m_004_glamour_salon_pune",
44
+ "customer_id": null,
45
+ "total": 39,
46
+ "specificity": 8,
47
+ "category_fit": 7,
48
+ "merchant_fit": 9,
49
+ "decision_quality": 8,
50
+ "engagement": 7,
51
+ "hint": "A dusk-lit mirror reflects only what is brought to it.",
52
+ "body": "Anjali, your customer outreach has been quiet for 38 days and 24 lapsed customers are waiting for a reason to return; 1200 30d views and 8 calls show the profile still has demand. Restart warm, not salesy: one slot-led comeback note for recent visitors. I'll keep it slot-led around your busiest hour. Say YES and I'll prepare it now."
53
+ },
54
+ {
55
+ "trigger_id": "trg_011_review_theme_late_delivery",
56
+ "merchant_id": "m_005_pizzajunction_restaurant_delhi",
57
+ "customer_id": null,
58
+ "total": 40,
59
+ "specificity": 9,
60
+ "category_fit": 7,
61
+ "merchant_fit": 9,
62
+ "decision_quality": 8,
63
+ "engagement": 7,
64
+ "hint": "Let the rising 4-review wave threaten the Tue-Thu BOGO flow to sharpen the yes-now sting.",
65
+ "body": "Suresh, 4 reviews in 30d mention delivery late; one says \"took 50 mins for a 15 min ride\". This is a reply-and-ops moment, not a promo. Say YES and I'll draft the public reply pattern plus the counter/team checklist now."
66
+ },
67
+ {
68
+ "trigger_id": "trg_014_seasonal_acquisition_dip_powerhouse",
69
+ "merchant_id": "m_007_powerhouse_gym_bangalore",
70
+ "customer_id": null,
71
+ "total": 36,
72
+ "specificity": 7,
73
+ "category_fit": 8,
74
+ "merchant_fit": 8,
75
+ "decision_quality": 7,
76
+ "engagement": 6,
77
+ "hint": "A streak about to break carries more weight than a calendar nudge.",
78
+ "body": "Karthik, seasonal perf dip: views dropped 30% in 7d. Keep it no-shame and restart-focused before another week of restart decisions passes. Use 3 FREE Trial Classes only as the hook. No guilt, just the next session. Reply YES. I'll draft a 7-day comeback class nudge now."
79
+ },
80
+ {
81
+ "trigger_id": "trg_012_milestone_mylari",
82
+ "merchant_id": "m_006_southindiancafe_restaurant_bangalore",
83
+ "customer_id": null,
84
+ "total": 42,
85
+ "specificity": 9,
86
+ "category_fit": 7,
87
+ "merchant_fit": 10,
88
+ "decision_quality": 8,
89
+ "engagement": 8,
90
+ "hint": "A whisper of social proof could tip urgency without breaking taboos.",
91
+ "body": "Suresh, review count is 145, only 5 away from 150 in Indiranagar. Tie it to Weekday Lunch Thali @ \u00e2\u201a\u00b9149 while customers are happy. The clean play is to ask the next happy customers at billing, not create a discount. Say YES and I'll draft the 2-line review ask now."
92
+ },
93
+ {
94
+ "trigger_id": "trg_018_supply_atorvastatin_recall",
95
+ "merchant_id": "m_009_apollo_pharmacy_jaipur",
96
+ "customer_id": null,
97
+ "total": 39,
98
+ "specificity": 8,
99
+ "category_fit": 9,
100
+ "merchant_fit": 7,
101
+ "decision_quality": 8,
102
+ "engagement": 7,
103
+ "hint": "Let the recall's reach speak for itself without naming the machinery behind the counter.",
104
+ "body": "Ramesh, supply alert: urgent stock action for atorvastatin batches AT2024-1102, AT2024-1108 from MfrZ. Check the 240 repeat/chronic customer context before outreach. Keep it calm and pharmacist-approved; Confirm YES and I'll draft the replacement-call list plus counter checklist now."
105
+ },
106
+ {
107
+ "trigger_id": "trg_021_unverified_gbp_sunrise",
108
+ "merchant_id": "m_010_sunrisepharm_pharmacy_lucknow",
109
+ "customer_id": null,
110
+ "total": 38,
111
+ "specificity": 7,
112
+ "category_fit": 9,
113
+ "merchant_fit": 8,
114
+ "decision_quality": 8,
115
+ "engagement": 6,
116
+ "hint": "A whisper of scarcity wrapped in sunrise precision nudges the hand to move before the light shifts.",
117
+ "body": "Vikas, GBP is still unverified via postcard or phone call with 14 recent calls at stake; the context estimates 30% visibility lift. This is a visibility fix, not a promo. Calm, clear, and claim-free. Confirm YES and I'll prepare the exact 3-step verification checklist now."
118
+ },
119
+ {
120
+ "trigger_id": "trg_023_competitor_opened_dentist",
121
+ "merchant_id": "m_001_drmeera_dentist_delhi",
122
+ "customer_id": null,
123
+ "total": 38,
124
+ "specificity": 9,
125
+ "category_fit": 8,
126
+ "merchant_fit": 7,
127
+ "decision_quality": 8,
128
+ "engagement": 6,
129
+ "hint": "A whisper of peer momentum often bends the scroll before logic ever weighs the choice.",
130
+ "body": "Dr. Meera, Smile Studio opened 1.3 km away on 2026-04-08 with Dental Cleaning @ \u00e2\u201a\u00b9199. Your hook is Dental Cleaning @ \u00e2\u201a\u00b9299. This week, nearby searchers will compare both profiles. Say GO and I'll draft a sharper local listing post that protects your nearby demand."
131
+ },
132
+ {
133
+ "trigger_id": "trg_025_dormancy_glamour",
134
+ "merchant_id": "m_004_glamour_salon_pune",
135
+ "customer_id": null,
136
+ "total": 39,
137
+ "specificity": 8,
138
+ "category_fit": 7,
139
+ "merchant_fit": 9,
140
+ "decision_quality": 8,
141
+ "engagement": 7,
142
+ "hint": "Let silence cost more than the reply.",
143
+ "body": "Anjali, your customer outreach has been quiet for 38 days since the last subscription expiry conversation; 1200 30d views and 8 calls show the profile still has demand. Restart warm, not salesy: one slot-led comeback note for recent visitors. I'll keep it slot-led around your busiest hour. Say YES and I'll prepare it now."
144
+ }
145
+ ]
judge_full_release_log_after_restart.json ADDED
@@ -0,0 +1,145 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ [
2
+ {
3
+ "trigger_id": "trg_002_compliance_dci_radiograph",
4
+ "merchant_id": "m_001_drmeera_dentist_delhi",
5
+ "customer_id": null,
6
+ "total": 43,
7
+ "specificity": 9,
8
+ "category_fit": 9,
9
+ "merchant_fit": 8,
10
+ "decision_quality": 9,
11
+ "engagement": 8,
12
+ "hint": "Fold their 22-day stale posts and CTR dip into the cost of delayed compliance to sharpen the now-or-never hook.",
13
+ "body": "Dr. Meera, immediate action needed: DCI revised radiograph dose limits effective 2026-12-15 from Dental Council of India circular 2026-11-04. Maximum dose per IOPA exposure drops from 1.5 mSv to 1.0 mSv. E-speed film passes at the new limit; D-speed does not. Digital RVG sensors unaffected. For your Lajpat Nagar clinic, audit your X-ray setup before Dec 15; document E-speed or RVG in your SOPs. A missed audit risks staff using the wrong film after the deadline. Say GO and I'll draft the 5-point SOP checklist and patient-safe counter note now."
14
+ },
15
+ {
16
+ "trigger_id": "trg_004_perf_dip_bharat",
17
+ "merchant_id": "m_002_bharat_dentist_mumbai",
18
+ "customer_id": null,
19
+ "total": 36,
20
+ "specificity": 7,
21
+ "category_fit": 8,
22
+ "merchant_fit": 7,
23
+ "decision_quality": 8,
24
+ "engagement": 6,
25
+ "hint": "A whisper of calendar precision and a peer's nod from the corridor often tightens the loop without raising volume.",
26
+ "body": "Dr. Bharat, calls are 8 below baseline. Do not let the leak sit another cycle. GBP is unverified; no active merchant offer; only 4 calls came through in 30d, so the fastest fix is listing cleanup plus owner callback. Say GO and I'll draft the GBP cleanup checklist and missed-call callback script now."
27
+ },
28
+ {
29
+ "trigger_id": "trg_005_renewal_due_bharat",
30
+ "merchant_id": "m_002_bharat_dentist_mumbai",
31
+ "customer_id": null,
32
+ "total": 41,
33
+ "specificity": 8,
34
+ "category_fit": 9,
35
+ "merchant_fit": 9,
36
+ "decision_quality": 8,
37
+ "engagement": 7,
38
+ "hint": "A whisper of local ranking bleed and a single peer benchmark can tip the scale without breaking clinical reserve.",
39
+ "body": "Dr. Bharat, Pro is due in 12 days for \u20b94,999; calls are down with 4 30d calls. Before renewal, fix the patient acquisition gap first. Say GO and I'll prepare the 3-point clinic recovery checklist now."
40
+ },
41
+ {
42
+ "trigger_id": "trg_009_winback_glamour",
43
+ "merchant_id": "m_004_glamour_salon_pune",
44
+ "customer_id": null,
45
+ "total": 38,
46
+ "specificity": 7,
47
+ "category_fit": 8,
48
+ "merchant_fit": 9,
49
+ "decision_quality": 8,
50
+ "engagement": 6,
51
+ "hint": "A whisper of peer scarcity and the unspoken cost of empty chairs after dark can move dormant owners faster than gentle nudges.",
52
+ "body": "Anjali, customer outreach has been quiet for 38 days and 24 lapsed customers are waiting for a reason to return; 1200 30d views and 8 calls show the profile still has demand. Before this week's evening slots go cold, make one warm comeback ask. Draft one slot-led comeback note for recent visitors, not a discount blast. Say YES and I'll draft it around your busiest hour now."
53
+ },
54
+ {
55
+ "trigger_id": "trg_011_review_theme_late_delivery",
56
+ "merchant_id": "m_005_pizzajunction_restaurant_delhi",
57
+ "customer_id": null,
58
+ "total": 41,
59
+ "specificity": 9,
60
+ "category_fit": 8,
61
+ "merchant_fit": 9,
62
+ "decision_quality": 8,
63
+ "engagement": 7,
64
+ "hint": "A tighter cost-of-delay line showing rupees per late ticket could tip urgency from 3 to 5 without hype.",
65
+ "body": "Suresh, 4 reviews in 30d mention delivery late; one says \"took 50 mins for a 15 min ride\". That is a kitchen-dispatch problem before it is a promo problem. Keep Buy 1 Pizza Get 1 Free (Tue-Thu) out of peak-delay windows until dispatch is tighter. Say YES and I'll draft the public reply plus a 3-step prep/rider handoff checklist now."
66
+ },
67
+ {
68
+ "trigger_id": "trg_014_seasonal_acquisition_dip_powerhouse",
69
+ "merchant_id": "m_007_powerhouse_gym_bangalore",
70
+ "customer_id": null,
71
+ "total": 38,
72
+ "specificity": 8,
73
+ "category_fit": 9,
74
+ "merchant_fit": 7,
75
+ "decision_quality": 8,
76
+ "engagement": 6,
77
+ "hint": "Let the post-resolution window whisper urgency without shouting; tie the 245 to a visible ripple in HSR Layout.",
78
+ "body": "Karthik, seasonal perf dip: views dropped 30% in 7d. Calls are also -35%. You still have 245 active members to build proof around. Do not buy cold ads into the April-June dip; make the next 7 days about trial-to-restart conversion. Use 3 FREE Trial Classes only as the hook. No guilt, just the next session. Reply YES. I'll draft the 7-day class comeback post now."
79
+ },
80
+ {
81
+ "trigger_id": "trg_012_milestone_mylari",
82
+ "merchant_id": "m_006_southindiancafe_restaurant_bangalore",
83
+ "customer_id": null,
84
+ "total": 44,
85
+ "specificity": 9,
86
+ "category_fit": 8,
87
+ "merchant_fit": 10,
88
+ "decision_quality": 9,
89
+ "engagement": 8,
90
+ "hint": "A whisper of scarcity around the 150-mark could tilt urgency without breaking the practical voice.",
91
+ "body": "Suresh, review count is 145, only 5 away from 150 in Indiranagar. Tie it to Weekday Lunch Thali @ Rs 149 while customers are happy. The clean play is to ask the next happy customers at billing, not create a discount. Say YES and I'll draft the 2-line review ask now."
92
+ },
93
+ {
94
+ "trigger_id": "trg_018_supply_atorvastatin_recall",
95
+ "merchant_id": "m_009_apollo_pharmacy_jaipur",
96
+ "customer_id": null,
97
+ "total": 41,
98
+ "specificity": 9,
99
+ "category_fit": 9,
100
+ "merchant_fit": 8,
101
+ "decision_quality": 8,
102
+ "engagement": 7,
103
+ "hint": "Let the recall notice and batch ledger speak; imply consequence without declaring it.",
104
+ "body": "Ramesh, supply alert: pull atorvastatin batches AT2024-1102, AT2024-1108 from MfrZ before the next refill sale. Check the 240 repeat/chronic customer context before outreach. You already asked for the list; this is the same action moment. Keep it calm and pharmacist-approved; Confirm YES and I'll draft the affected-customer list plus counter replacement checklist now."
105
+ },
106
+ {
107
+ "trigger_id": "trg_021_unverified_gbp_sunrise",
108
+ "merchant_id": "m_010_sunrisepharm_pharmacy_lucknow",
109
+ "customer_id": null,
110
+ "total": 38,
111
+ "specificity": 7,
112
+ "category_fit": 9,
113
+ "merchant_fit": 8,
114
+ "decision_quality": 8,
115
+ "engagement": 6,
116
+ "hint": "Let the unclaimed fourteen calls echo as a quiet tax on tomorrow's prescriptions.",
117
+ "body": "Vikas, GBP is still unverified via postcard or phone call with 14 recent calls at stake; the context estimates 30% visibility lift. This is a visibility fix, not a promo. Calm, clear, and claim-free. Confirm YES and I'll prepare the exact 3-step verification checklist now."
118
+ },
119
+ {
120
+ "trigger_id": "trg_023_competitor_opened_dentist",
121
+ "merchant_id": "m_001_drmeera_dentist_delhi",
122
+ "customer_id": null,
123
+ "total": 41,
124
+ "specificity": 9,
125
+ "category_fit": 8,
126
+ "merchant_fit": 9,
127
+ "decision_quality": 8,
128
+ "engagement": 7,
129
+ "hint": "Let the ledger speak while the scalpel waits.",
130
+ "body": "Dr. Meera, Smile Studio opened 1.3 km away on 2026-04-08 with Dental Cleaning @ Rs 199. Your hook is Dental Cleaning @ Rs 299. This week, nearby searchers will compare both profiles. Say GO and I'll draft the local listing post that makes your clinic look current before patients compare."
131
+ },
132
+ {
133
+ "trigger_id": "trg_025_dormancy_glamour",
134
+ "merchant_id": "m_004_glamour_salon_pune",
135
+ "customer_id": null,
136
+ "total": 39,
137
+ "specificity": 8,
138
+ "category_fit": 7,
139
+ "merchant_fit": 9,
140
+ "decision_quality": 8,
141
+ "engagement": 7,
142
+ "hint": "Let silence do the lifting: hint at what the last 38 days already cost.",
143
+ "body": "Anjali, customer outreach has been quiet for 38 days since the last subscription expiry conversation; 1200 30d views and 8 calls show the profile still has demand. Before this week's evening slots go cold, make one warm comeback ask. Draft one slot-led comeback note for recent visitors, not a discount blast. Say YES and I'll draft it around your busiest hour now."
144
+ }
145
+ ]
judge_full_release_log_final.json ADDED
@@ -0,0 +1,145 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ [
2
+ {
3
+ "trigger_id": "trg_002_compliance_dci_radiograph",
4
+ "merchant_id": "m_001_drmeera_dentist_delhi",
5
+ "customer_id": null,
6
+ "total": 43,
7
+ "specificity": 9,
8
+ "category_fit": 9,
9
+ "merchant_fit": 8,
10
+ "decision_quality": 9,
11
+ "engagement": 8,
12
+ "hint": "Fold her 22-day stale-posts and sub-median CTR into the compliance narrative to make the audit feel like a reputational reset as well as a regulatory one.",
13
+ "body": "Dr. Meera, immediate action needed: DCI revised radiograph dose limits effective 2026-12-15 from Dental Council of India circular 2026-11-04. Maximum dose per IOPA exposure drops from 1.5 mSv to 1.0 mSv. E-speed film passes at the new limit; D-speed does not. Digital RVG sensors unaffected. For your Lajpat Nagar clinic, audit your X-ray setup before Dec 15; document E-speed or RVG in your SOPs. A missed audit risks staff using the wrong film after the deadline. Say GO and I'll draft the 5-point SOP checklist and patient-safe counter note now."
14
+ },
15
+ {
16
+ "trigger_id": "trg_004_perf_dip_bharat",
17
+ "merchant_id": "m_002_bharat_dentist_mumbai",
18
+ "customer_id": null,
19
+ "total": 43,
20
+ "specificity": 9,
21
+ "category_fit": 9,
22
+ "merchant_fit": 9,
23
+ "decision_quality": 8,
24
+ "engagement": 8,
25
+ "hint": "Let the calendar and the delta speak; keep the script promise tight so the ask feels surgical, not salesy.",
26
+ "body": "Dr. Bharat, calls are 4 vs 12 baseline: 8 calls below baseline before Pro renewal in 12 days. GBP is unverified and there is no live offer, so patients in Andheri West will not see a fresh reason to call back. Say GO and I'll draft the 3-step GBP fix plus missed-call callback script now."
27
+ },
28
+ {
29
+ "trigger_id": "trg_005_renewal_due_bharat",
30
+ "merchant_id": "m_002_bharat_dentist_mumbai",
31
+ "customer_id": null,
32
+ "total": 39,
33
+ "specificity": 8,
34
+ "category_fit": 9,
35
+ "merchant_fit": 7,
36
+ "decision_quality": 8,
37
+ "engagement": 7,
38
+ "hint": "A whisper of peer evidence\u2014how many similar clinics recovered calls within a week\u2014would tip the scale without breaking clinical reserve.",
39
+ "body": "Dr. Bharat, Pro is due in 12 days for \u20b94,999; calls are down with 4 30d calls. Before renewal, fix the patient acquisition gap first. Say GO and I'll prepare the 3-point clinic recovery checklist now."
40
+ },
41
+ {
42
+ "trigger_id": "trg_009_winback_glamour",
43
+ "merchant_id": "m_004_glamour_salon_pune",
44
+ "customer_id": null,
45
+ "total": 38,
46
+ "specificity": 7,
47
+ "category_fit": 8,
48
+ "merchant_fit": 9,
49
+ "decision_quality": 8,
50
+ "engagement": 6,
51
+ "hint": "A quiet suite forgets the last song that kept chairs full.",
52
+ "body": "Anjali, customer outreach has been quiet for 38 days and 24 lapsed customers are waiting for a reason to return; 1200 30d views and 8 calls show the profile still has demand in Aundh. Before this week's evening slots go cold, make one warm comeback ask. Draft one warm hair/spa slot comeback note for recent visitors, not a discount blast. Say YES and I'll draft it around your busiest hour now."
53
+ },
54
+ {
55
+ "trigger_id": "trg_011_review_theme_late_delivery",
56
+ "merchant_id": "m_005_pizzajunction_restaurant_delhi",
57
+ "customer_id": null,
58
+ "total": 41,
59
+ "specificity": 9,
60
+ "category_fit": 8,
61
+ "merchant_fit": 9,
62
+ "decision_quality": 8,
63
+ "engagement": 7,
64
+ "hint": "Let silence on the line do the work\u2014imply the reviews are still live and costing orders right now.",
65
+ "body": "Suresh, 4 reviews in 30d mention delivery late; one says \"took 50 mins for a 15 min ride\". That is a kitchen-dispatch problem before it is a promo problem. Keep Buy 1 Pizza Get 1 Free (Tue-Thu) out of peak-delay windows until dispatch is tighter. Say YES and I'll draft the public reply plus a 3-step prep/rider handoff checklist now."
66
+ },
67
+ {
68
+ "trigger_id": "trg_014_seasonal_acquisition_dip_powerhouse",
69
+ "merchant_id": "m_007_powerhouse_gym_bangalore",
70
+ "customer_id": null,
71
+ "total": 36,
72
+ "specificity": 7,
73
+ "category_fit": 8,
74
+ "merchant_fit": 8,
75
+ "decision_quality": 7,
76
+ "engagement": 6,
77
+ "hint": "Anchor the 245 members as social proof in motion and let the post-resolution window frame the comeback as inevitable, not optional.",
78
+ "body": "Karthik, seasonal perf dip: views dropped 30% in 7d. Calls are also -35%. You still have 245 active members to build proof around. Do not buy cold ads into the April-June dip; make the next 7 days about trial-to-restart conversion. Use 3 FREE Trial Classes only as the hook. No guilt, just the next session. Reply YES. I'll draft the 7-day class comeback post now."
79
+ },
80
+ {
81
+ "trigger_id": "trg_012_milestone_mylari",
82
+ "merchant_id": "m_006_southindiancafe_restaurant_bangalore",
83
+ "customer_id": null,
84
+ "total": 41,
85
+ "specificity": 9,
86
+ "category_fit": 8,
87
+ "merchant_fit": 9,
88
+ "decision_quality": 8,
89
+ "engagement": 7,
90
+ "hint": "A whisper of social momentum beats a shout\u2014let the milestone do the heavy lifting.",
91
+ "body": "Suresh, review count is 145, only 5 away from 150 in Indiranagar. Tie it to Weekday Lunch Thali @ Rs 149 while customers are happy. The clean play is to ask the next happy customers at billing, not create a discount. Say YES and I'll draft the 2-line review ask now."
92
+ },
93
+ {
94
+ "trigger_id": "trg_018_supply_atorvastatin_recall",
95
+ "merchant_id": "m_009_apollo_pharmacy_jaipur",
96
+ "customer_id": null,
97
+ "total": 41,
98
+ "specificity": 9,
99
+ "category_fit": 8,
100
+ "merchant_fit": 9,
101
+ "decision_quality": 8,
102
+ "engagement": 7,
103
+ "hint": "Let the recall timeline whisper the cost of delay without naming it.",
104
+ "body": "Ramesh, supply alert: pull atorvastatin batches AT2024-1102, AT2024-1108 from MfrZ before the next refill sale. Check the 240 repeat/chronic customer context before outreach. You already asked for the list; this is the same action moment. Keep it calm and pharmacist-approved; Confirm YES and I'll draft the affected-customer list plus counter replacement checklist now."
105
+ },
106
+ {
107
+ "trigger_id": "trg_021_unverified_gbp_sunrise",
108
+ "merchant_id": "m_010_sunrisepharm_pharmacy_lucknow",
109
+ "customer_id": null,
110
+ "total": 38,
111
+ "specificity": 7,
112
+ "category_fit": 9,
113
+ "merchant_fit": 8,
114
+ "decision_quality": 8,
115
+ "engagement": 6,
116
+ "hint": "A whisper of local color and a tighter loss frame sharpen response without breaking trust.",
117
+ "body": "Vikas, GBP is still unverified via postcard or phone call with 14 recent calls at stake; the context estimates 30% visibility lift and no active merchant offer. Every refill search that lands before verification sees less trust. This is a visibility fix, not a promo. Calm, clear, and claim-free. Confirm YES and I'll draft the exact 3-step verification checklist now."
118
+ },
119
+ {
120
+ "trigger_id": "trg_023_competitor_opened_dentist",
121
+ "merchant_id": "m_001_drmeera_dentist_delhi",
122
+ "customer_id": null,
123
+ "total": 41,
124
+ "specificity": 9,
125
+ "category_fit": 8,
126
+ "merchant_fit": 9,
127
+ "decision_quality": 8,
128
+ "engagement": 7,
129
+ "hint": "Let proximity sharpen the scalpel.",
130
+ "body": "Dr. Meera, Smile Studio opened 1.3 km away on 2026-04-08 with Dental Cleaning @ Rs 199. Your hook is Dental Cleaning @ Rs 299. This week, nearby searchers will compare both profiles. Say GO and I'll draft the local listing post that makes your clinic look current before patients compare."
131
+ },
132
+ {
133
+ "trigger_id": "trg_025_dormancy_glamour",
134
+ "merchant_id": "m_004_glamour_salon_pune",
135
+ "customer_id": null,
136
+ "total": 39,
137
+ "specificity": 8,
138
+ "category_fit": 7,
139
+ "merchant_fit": 9,
140
+ "decision_quality": 8,
141
+ "engagement": 7,
142
+ "hint": "Evening-slot scarcity plus a whisper of peer uptake can tip hesitation faster than a lone comeback ask.",
143
+ "body": "Anjali, customer outreach has been quiet for 38 days since the last subscription expiry conversation; 1200 30d views and 8 calls show the profile still has demand in Aundh. Before this week's evening slots go cold, make one warm comeback ask. Draft one warm hair/spa slot comeback note for recent visitors, not a discount blast. Say YES and I'll draft it around your busiest hour now."
144
+ }
145
+ ]
judge_short_fallback_log.json ADDED
@@ -0,0 +1,15 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ [
2
+ {
3
+ "trigger_id": "trg_002_compliance_dci_radiograph",
4
+ "merchant_id": "m_001_drmeera_dentist_delhi",
5
+ "customer_id": null,
6
+ "total": 30,
7
+ "specificity": 10,
8
+ "category_fit": 5,
9
+ "merchant_fit": 5,
10
+ "decision_quality": 5,
11
+ "engagement": 5,
12
+ "hint": "LLM scoring failed - using basic heuristics",
13
+ "body": "Dr. Meera, immediate action needed: DCI revised radiograph dose limits effective 2026-12-15 from Dental Council of India circular 2026-11-04. Maximum dose per IOPA exposure drops from 1.5 mSv to 1.0 mSv. E-speed film passes at the new limit; D-speed does not. Digital RVG sensors unaffected. For your Lajpat Nagar clinic, audit your X-ray setup before Dec 15; document E-speed or RVG in your SOPs. A missed audit risks staff using the wrong film after the deadline. Say GO and I'll draft the 5-point SOP checklist and patient-safe counter note now."
14
+ }
15
+ ]
judge_unseen_adaptive_full_log.json ADDED
@@ -0,0 +1,145 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ [
2
+ {
3
+ "trigger_id": "trg_002_compliance_dci_radiograph",
4
+ "merchant_id": "m_001_drmeera_dentist_delhi",
5
+ "customer_id": null,
6
+ "total": 42,
7
+ "specificity": 9,
8
+ "category_fit": 9,
9
+ "merchant_fit": 8,
10
+ "decision_quality": 9,
11
+ "engagement": 7,
12
+ "hint": "A whisper of the \u20b9299 cleaning offer could turn compliance into a recall opportunity without breaking clinical tone.",
13
+ "body": "Dr. Meera, immediate action needed: DCI revised radiograph dose limits effective 2026-12-15 from Dental Council of India circular 2026-11-04. Maximum dose per IOPA exposure drops from 1.5 mSv to 1.0 mSv. E-speed film passes at the new limit; D-speed does not. Digital RVG sensors unaffected. For your Lajpat Nagar clinic, audit your X-ray setup before Dec 15; document E-speed or RVG in your SOPs. A missed audit risks staff using the wrong film after the deadline. Say GO and I'll draft the 5-point SOP checklist and patient-safe counter note now."
14
+ },
15
+ {
16
+ "trigger_id": "trg_004_perf_dip_bharat",
17
+ "merchant_id": "m_002_bharat_dentist_mumbai",
18
+ "customer_id": null,
19
+ "total": 43,
20
+ "specificity": 9,
21
+ "category_fit": 9,
22
+ "merchant_fit": 9,
23
+ "decision_quality": 8,
24
+ "engagement": 8,
25
+ "hint": "A whisper of local authority quietly seals the click when numbers alone hesitate.",
26
+ "body": "Dr. Bharat, calls are 4 vs 12 baseline: 8 calls below baseline before Pro renewal in 12 days. GBP is unverified and there is no live offer, so patients in Andheri West will not see a fresh reason to call back. Say GO and I'll draft the 3-step GBP fix plus missed-call callback script now."
27
+ },
28
+ {
29
+ "trigger_id": "trg_005_renewal_due_bharat",
30
+ "merchant_id": "m_002_bharat_dentist_mumbai",
31
+ "customer_id": null,
32
+ "total": 41,
33
+ "specificity": 8,
34
+ "category_fit": 9,
35
+ "merchant_fit": 9,
36
+ "decision_quality": 8,
37
+ "engagement": 7,
38
+ "hint": "A dormant list plus an unverified GBP quietly starves new patient flow while renewal nears.",
39
+ "body": "Dr. Bharat, Pro is due in 12 days for \u20b94,999; calls are down with 4 30d calls. Before renewal, fix the patient acquisition gap first. Say GO and I'll prepare the 3-point clinic recovery checklist now."
40
+ },
41
+ {
42
+ "trigger_id": "trg_009_winback_glamour",
43
+ "merchant_id": "m_004_glamour_salon_pune",
44
+ "customer_id": null,
45
+ "total": 38,
46
+ "specificity": 7,
47
+ "category_fit": 8,
48
+ "merchant_fit": 9,
49
+ "decision_quality": 8,
50
+ "engagement": 6,
51
+ "hint": "Let silence cost more than words.",
52
+ "body": "Anjali, customer outreach has been quiet for 38 days and 24 lapsed customers are waiting for a reason to return; 1200 30d views and 8 calls show the profile still has demand in Aundh. Before this week's evening slots go cold, make one warm comeback ask. Draft one warm hair/spa slot comeback note for recent visitors, not a discount blast. Say YES and I'll draft it around your busiest hour now."
53
+ },
54
+ {
55
+ "trigger_id": "trg_011_review_theme_late_delivery",
56
+ "merchant_id": "m_005_pizzajunction_restaurant_delhi",
57
+ "customer_id": null,
58
+ "total": 41,
59
+ "specificity": 9,
60
+ "category_fit": 8,
61
+ "merchant_fit": 9,
62
+ "decision_quality": 8,
63
+ "engagement": 7,
64
+ "hint": "A whisper of social proof from nearby tables can tip busy owners from thinking to doing.",
65
+ "body": "Suresh, 4 reviews in 30d mention delivery late; one says \"took 50 mins for a 15 min ride\". That is a kitchen-dispatch problem before it is a promo problem. Keep Buy 1 Pizza Get 1 Free (Tue-Thu) out of peak-delay windows until dispatch is tighter. Say YES and I'll draft the public reply plus a 3-step prep/rider handoff checklist now."
66
+ },
67
+ {
68
+ "trigger_id": "trg_014_seasonal_acquisition_dip_powerhouse",
69
+ "merchant_id": "m_007_powerhouse_gym_bangalore",
70
+ "customer_id": null,
71
+ "total": 35,
72
+ "specificity": 7,
73
+ "category_fit": 8,
74
+ "merchant_fit": 6,
75
+ "decision_quality": 7,
76
+ "engagement": 7,
77
+ "hint": "Anchor claims only to payload fields the merchant can audit; let the calendar and CTR do the heavy lifting.",
78
+ "body": "Karthik, seasonal perf dip: views dropped 30% in 7d. 245 active members are the proof to show, not a discount to shout. April-June is the weak acquisition window in HSR Layout; the next 7 days should look like classes are alive, not like ads are desperate. Use 3 FREE Trial Classes only as the hook. No guilt, just the next session. Reply YES. I'll draft the 7-day trial-to-restart class post now."
79
+ },
80
+ {
81
+ "trigger_id": "trg_012_milestone_mylari",
82
+ "merchant_id": "m_006_southindiancafe_restaurant_bangalore",
83
+ "customer_id": null,
84
+ "total": 44,
85
+ "specificity": 9,
86
+ "category_fit": 8,
87
+ "merchant_fit": 10,
88
+ "decision_quality": 9,
89
+ "engagement": 8,
90
+ "hint": "A milestone so close it almost drafts itself\u2014let the numbers finish the sentence.",
91
+ "body": "Suresh, review count is 145, only 5 away from 150 in Indiranagar. Tie it to Weekday Lunch Thali @ Rs 149 while customers are happy. The clean play is to ask the next happy customers at billing, not create a discount. Say YES and I'll draft the 2-line review ask now."
92
+ },
93
+ {
94
+ "trigger_id": "trg_018_supply_atorvastatin_recall",
95
+ "merchant_id": "m_009_apollo_pharmacy_jaipur",
96
+ "customer_id": null,
97
+ "total": 42,
98
+ "specificity": 9,
99
+ "category_fit": 9,
100
+ "merchant_fit": 8,
101
+ "decision_quality": 9,
102
+ "engagement": 7,
103
+ "hint": "Fold in the 15% senior offer as a counter-script lever without sounding promotional.",
104
+ "body": "Ramesh, supply alert: pull atorvastatin batches AT2024-1102, AT2024-1108 from MfrZ before the next refill sale. Check the 240 repeat/chronic customer context before outreach. You already asked for the list; this is the same action moment. Keep it calm and pharmacist-approved; Confirm YES and I'll draft the affected-customer list plus counter replacement checklist now."
105
+ },
106
+ {
107
+ "trigger_id": "trg_021_unverified_gbp_sunrise",
108
+ "merchant_id": "m_010_sunrisepharm_pharmacy_lucknow",
109
+ "customer_id": null,
110
+ "total": 38,
111
+ "specificity": 7,
112
+ "category_fit": 9,
113
+ "merchant_fit": 8,
114
+ "decision_quality": 8,
115
+ "engagement": 6,
116
+ "hint": "Anchor the 30% uplift to Gomti Nagar refill searches and let the postcard timeline do the silent urgency.",
117
+ "body": "Vikas, GBP is still unverified via postcard or phone call with 14 recent calls at stake; the context estimates 30% visibility lift and no active merchant offer. Every refill search that lands before verification sees less trust. This is a visibility fix, not a promo. Calm, clear, and claim-free. Confirm YES and I'll draft the exact 3-step verification checklist now."
118
+ },
119
+ {
120
+ "trigger_id": "trg_023_competitor_opened_dentist",
121
+ "merchant_id": "m_001_drmeera_dentist_delhi",
122
+ "customer_id": null,
123
+ "total": 41,
124
+ "specificity": 9,
125
+ "category_fit": 9,
126
+ "merchant_fit": 8,
127
+ "decision_quality": 8,
128
+ "engagement": 7,
129
+ "hint": "A whisper of peer scrutiny sharpens faster than a shout of opportunity.",
130
+ "body": "Dr. Meera, Smile Studio opened 1.3 km away on 2026-04-08 with Dental Cleaning @ Rs 199. Your hook is Dental Cleaning @ Rs 299. This week, nearby searchers will compare both profiles. Say GO and I'll draft the local listing post that makes your clinic look current before patients compare."
131
+ },
132
+ {
133
+ "trigger_id": "trg_025_dormancy_glamour",
134
+ "merchant_id": "m_004_glamour_salon_pune",
135
+ "customer_id": null,
136
+ "total": 37,
137
+ "specificity": 8,
138
+ "category_fit": 7,
139
+ "merchant_fit": 9,
140
+ "decision_quality": 7,
141
+ "engagement": 6,
142
+ "hint": "A whispered detail about the last popular stylist or chair can turn a quiet profile into a busy chair without shouting discounts.",
143
+ "body": "Anjali, customer outreach has been quiet for 38 days since the last subscription expiry conversation; 1200 30d views and 8 calls show the profile still has demand in Aundh. Before this week's evening slots go cold, make one warm comeback ask. Draft one warm hair/spa slot comeback note for recent visitors, not a discount blast. Say YES and I'll draft it around your busiest hour now."
144
+ }
145
+ ]
judge_unseen_adaptive_full_log_after_gym.json ADDED
@@ -0,0 +1,145 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ [
2
+ {
3
+ "trigger_id": "trg_002_compliance_dci_radiograph",
4
+ "merchant_id": "m_001_drmeera_dentist_delhi",
5
+ "customer_id": null,
6
+ "total": 42,
7
+ "specificity": 9,
8
+ "category_fit": 9,
9
+ "merchant_fit": 8,
10
+ "decision_quality": 9,
11
+ "engagement": 7,
12
+ "hint": "A whisper of peer compliance rates and a nod to their idle offer calendar would tighten the knot without breaking clinical authority.",
13
+ "body": "Dr. Meera, immediate action needed: DCI revised radiograph dose limits effective 2026-12-15 from Dental Council of India circular 2026-11-04. Maximum dose per IOPA exposure drops from 1.5 mSv to 1.0 mSv. E-speed film passes at the new limit; D-speed does not. Digital RVG sensors unaffected. For your Lajpat Nagar clinic, audit your X-ray setup before Dec 15; document E-speed or RVG in your SOPs. A missed audit risks staff using the wrong film after the deadline. Say GO and I'll draft the 5-point SOP checklist and patient-safe counter note now."
14
+ },
15
+ {
16
+ "trigger_id": "trg_004_perf_dip_bharat",
17
+ "merchant_id": "m_002_bharat_dentist_mumbai",
18
+ "customer_id": null,
19
+ "total": 41,
20
+ "specificity": 9,
21
+ "category_fit": 8,
22
+ "merchant_fit": 9,
23
+ "decision_quality": 8,
24
+ "engagement": 7,
25
+ "hint": "A whisper of local search share at risk sharpens the sting without shouting guarantees.",
26
+ "body": "Dr. Bharat, calls are 4 vs 12 baseline: 8 calls below baseline before Pro renewal in 12 days. GBP is unverified and there is no live offer, so patients in Andheri West will not see a fresh reason to call back. Say GO and I'll draft the 3-step GBP fix plus missed-call callback script now."
27
+ },
28
+ {
29
+ "trigger_id": "trg_005_renewal_due_bharat",
30
+ "merchant_id": "m_002_bharat_dentist_mumbai",
31
+ "customer_id": null,
32
+ "total": 41,
33
+ "specificity": 8,
34
+ "category_fit": 9,
35
+ "merchant_fit": 9,
36
+ "decision_quality": 8,
37
+ "engagement": 7,
38
+ "hint": "Let the 30-day call metric whisper a before/after contrast without ever promising a cure.",
39
+ "body": "Dr. Bharat, Pro is due in 12 days for \u20b94,999; calls are down with 4 30d calls. Before renewal, fix the patient acquisition gap first. Say GO and I'll prepare the 3-point clinic recovery checklist now."
40
+ },
41
+ {
42
+ "trigger_id": "trg_009_winback_glamour",
43
+ "merchant_id": "m_004_glamour_salon_pune",
44
+ "customer_id": null,
45
+ "total": 38,
46
+ "specificity": 7,
47
+ "category_fit": 8,
48
+ "merchant_fit": 9,
49
+ "decision_quality": 8,
50
+ "engagement": 6,
51
+ "hint": "The quiet after expiry holds more weight than the view count when the calendar speaks first.",
52
+ "body": "Anjali, customer outreach has been quiet for 38 days and 24 lapsed customers are waiting for a reason to return; 1200 30d views and 8 calls show the profile still has demand in Aundh. Before this week's evening slots go cold, make one warm comeback ask. Draft one warm hair/spa slot comeback note for recent visitors, not a discount blast. Say YES and I'll draft it around your busiest hour now."
53
+ },
54
+ {
55
+ "trigger_id": "trg_011_review_theme_late_delivery",
56
+ "merchant_id": "m_005_pizzajunction_restaurant_delhi",
57
+ "customer_id": null,
58
+ "total": 41,
59
+ "specificity": 9,
60
+ "category_fit": 8,
61
+ "merchant_fit": 9,
62
+ "decision_quality": 8,
63
+ "engagement": 7,
64
+ "hint": "Let silence do the selling\u2014imply the checklist already knows where the 50-minute bleed hides.",
65
+ "body": "Suresh, 4 reviews in 30d mention delivery late; one says \"took 50 mins for a 15 min ride\". That is a kitchen-dispatch problem before it is a promo problem. Keep Buy 1 Pizza Get 1 Free (Tue-Thu) out of peak-delay windows until dispatch is tighter. Say YES and I'll draft the public reply plus a 3-step prep/rider handoff checklist now."
66
+ },
67
+ {
68
+ "trigger_id": "trg_014_seasonal_acquisition_dip_powerhouse",
69
+ "merchant_id": "m_007_powerhouse_gym_bangalore",
70
+ "customer_id": null,
71
+ "total": 38,
72
+ "specificity": 7,
73
+ "category_fit": 8,
74
+ "merchant_fit": 8,
75
+ "decision_quality": 8,
76
+ "engagement": 7,
77
+ "hint": "Let the 22 recent calls and above-peer CTR do the talking\u2014frame the dip as a missed beat in an otherwise strong rhythm.",
78
+ "body": "Karthik, seasonal perf dip: views dropped 30% in 7d. 245 active members are the proof to show, not a discount to shout. April-June is the weak acquisition window in HSR Layout; the next 7 days should look like classes are alive, not like ads are desperate. Use 3 FREE Trial Classes only as the hook. No guilt, just the next session. Reply YES. I'll draft the 7-day trial-to-restart class post now."
79
+ },
80
+ {
81
+ "trigger_id": "trg_012_milestone_mylari",
82
+ "merchant_id": "m_006_southindiancafe_restaurant_bangalore",
83
+ "customer_id": null,
84
+ "total": 44,
85
+ "specificity": 9,
86
+ "category_fit": 8,
87
+ "merchant_fit": 10,
88
+ "decision_quality": 9,
89
+ "engagement": 8,
90
+ "hint": "A whisper of social proof at the tipping point can tip the scale without breaking taboo.",
91
+ "body": "Suresh, review count is 145, only 5 away from 150 in Indiranagar. Tie it to Weekday Lunch Thali @ Rs 149 while customers are happy. The clean play is to ask the next happy customers at billing, not create a discount. Say YES and I'll draft the 2-line review ask now."
92
+ },
93
+ {
94
+ "trigger_id": "trg_018_supply_atorvastatin_recall",
95
+ "merchant_id": "m_009_apollo_pharmacy_jaipur",
96
+ "customer_id": null,
97
+ "total": 41,
98
+ "specificity": 9,
99
+ "category_fit": 8,
100
+ "merchant_fit": 9,
101
+ "decision_quality": 8,
102
+ "engagement": 7,
103
+ "hint": "Let the recall timeline whisper the cost of delay without naming it.",
104
+ "body": "Ramesh, supply alert: pull atorvastatin batches AT2024-1102, AT2024-1108 from MfrZ before the next refill sale. Check the 240 repeat/chronic customer context before outreach. You already asked for the list; this is the same action moment. Keep it calm and pharmacist-approved; Confirm YES and I'll draft the affected-customer list plus counter replacement checklist now."
105
+ },
106
+ {
107
+ "trigger_id": "trg_021_unverified_gbp_sunrise",
108
+ "merchant_id": "m_010_sunrisepharm_pharmacy_lucknow",
109
+ "customer_id": null,
110
+ "total": 38,
111
+ "specificity": 7,
112
+ "category_fit": 9,
113
+ "merchant_fit": 8,
114
+ "decision_quality": 8,
115
+ "engagement": 6,
116
+ "hint": "A whisper of local search share slipping past competitors can tighten the noose without breaking trust.",
117
+ "body": "Vikas, GBP is still unverified via postcard or phone call with 14 recent calls at stake; the context estimates 30% visibility lift and no active merchant offer. Every refill search that lands before verification sees less trust. This is a visibility fix, not a promo. Calm, clear, and claim-free. Confirm YES and I'll draft the exact 3-step verification checklist now."
118
+ },
119
+ {
120
+ "trigger_id": "trg_023_competitor_opened_dentist",
121
+ "merchant_id": "m_001_drmeera_dentist_delhi",
122
+ "customer_id": null,
123
+ "total": 41,
124
+ "specificity": 9,
125
+ "category_fit": 8,
126
+ "merchant_fit": 9,
127
+ "decision_quality": 8,
128
+ "engagement": 7,
129
+ "hint": "The listing update must visibly precede the comparison moment; signal decay is faster than clinical recall.",
130
+ "body": "Dr. Meera, Smile Studio opened 1.3 km away on 2026-04-08 with Dental Cleaning @ Rs 199. Your hook is Dental Cleaning @ Rs 299. This week, nearby searchers will compare both profiles. Say GO and I'll draft the local listing post that makes your clinic look current before patients compare."
131
+ },
132
+ {
133
+ "trigger_id": "trg_025_dormancy_glamour",
134
+ "merchant_id": "m_004_glamour_salon_pune",
135
+ "customer_id": null,
136
+ "total": 37,
137
+ "specificity": 8,
138
+ "category_fit": 7,
139
+ "merchant_fit": 9,
140
+ "decision_quality": 7,
141
+ "engagement": 6,
142
+ "hint": "Evening silence in Aundh waits for no calendar.",
143
+ "body": "Anjali, customer outreach has been quiet for 38 days since the last subscription expiry conversation; 1200 30d views and 8 calls show the profile still has demand in Aundh. Before this week's evening slots go cold, make one warm comeback ask. Draft one warm hair/spa slot comeback note for recent visitors, not a discount blast. Say YES and I'll draft it around your busiest hour now."
144
+ }
145
+ ]
judge_unseen_adaptive_full_log_final.json ADDED
@@ -0,0 +1,145 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ [
2
+ {
3
+ "trigger_id": "trg_002_compliance_dci_radiograph",
4
+ "merchant_id": "m_001_drmeera_dentist_delhi",
5
+ "customer_id": null,
6
+ "total": 41,
7
+ "specificity": 9,
8
+ "category_fit": 9,
9
+ "merchant_fit": 8,
10
+ "decision_quality": 8,
11
+ "engagement": 7,
12
+ "hint": "Fold her 22-day stale posts and sub-median CTR into the compliance risk to make the audit feel urgent for visibility, not just paperwork.",
13
+ "body": "Dr. Meera, immediate action needed: DCI revised radiograph dose limits effective 2026-12-15 from Dental Council of India circular 2026-11-04. Maximum dose per IOPA exposure drops from 1.5 mSv to 1.0 mSv. E-speed film passes at the new limit; D-speed does not. Digital RVG sensors unaffected. For your Lajpat Nagar clinic, audit your X-ray setup before Dec 15; document E-speed or RVG in your SOPs. A missed audit risks staff using the wrong film after the deadline. Say GO and I'll draft the 5-point SOP checklist and patient-safe counter note now."
14
+ },
15
+ {
16
+ "trigger_id": "trg_004_perf_dip_bharat",
17
+ "merchant_id": "m_002_bharat_dentist_mumbai",
18
+ "customer_id": null,
19
+ "total": 41,
20
+ "specificity": 9,
21
+ "category_fit": 8,
22
+ "merchant_fit": 9,
23
+ "decision_quality": 8,
24
+ "engagement": 7,
25
+ "hint": "A whisper of local search share at risk sharpens the sting without crossing into taboo territory.",
26
+ "body": "Dr. Bharat, calls are 4 vs 12 baseline: 8 calls below baseline before Pro renewal in 12 days. GBP is unverified and there is no live offer, so patients in Andheri West will not see a fresh reason to call back. Say GO and I'll draft the 3-step GBP fix plus missed-call callback script now."
27
+ },
28
+ {
29
+ "trigger_id": "trg_005_renewal_due_bharat",
30
+ "merchant_id": "m_002_bharat_dentist_mumbai",
31
+ "customer_id": null,
32
+ "total": 41,
33
+ "specificity": 8,
34
+ "category_fit": 9,
35
+ "merchant_fit": 9,
36
+ "decision_quality": 8,
37
+ "engagement": 7,
38
+ "hint": "Let the unverified GBP and severe dip speak before the spend ask so the checklist feels like rescue, not upsell.",
39
+ "body": "Dr. Bharat, Pro is due in 12 days for \u20b94,999; calls are down with 4 30d calls. Before renewal, fix the patient acquisition gap first. Say GO and I'll prepare the 3-point clinic recovery checklist now."
40
+ },
41
+ {
42
+ "trigger_id": "trg_009_winback_glamour",
43
+ "merchant_id": "m_004_glamour_salon_pune",
44
+ "customer_id": null,
45
+ "total": 38,
46
+ "specificity": 7,
47
+ "category_fit": 8,
48
+ "merchant_fit": 9,
49
+ "decision_quality": 8,
50
+ "engagement": 6,
51
+ "hint": "A whisper of evening-slot scarcity and a peer nod can tip quiet demand into motion without shouting discounts.",
52
+ "body": "Anjali, customer outreach has been quiet for 38 days and 24 lapsed customers are waiting for a reason to return; 1200 30d views and 8 calls show the profile still has demand in Aundh. Before this week's evening slots go cold, make one warm comeback ask. Draft one warm hair/spa slot comeback note for recent visitors, not a discount blast. Say YES and I'll draft it around your busiest hour now."
53
+ },
54
+ {
55
+ "trigger_id": "trg_011_review_theme_late_delivery",
56
+ "merchant_id": "m_005_pizzajunction_restaurant_delhi",
57
+ "customer_id": null,
58
+ "total": 43,
59
+ "specificity": 9,
60
+ "category_fit": 8,
61
+ "merchant_fit": 9,
62
+ "decision_quality": 9,
63
+ "engagement": 8,
64
+ "hint": "A whisper of social proof from nearby pizzerias could tip urgency without breaking voice.",
65
+ "body": "Suresh, 4 reviews in 30d mention delivery late; one says \"took 50 mins for a 15 min ride\". That is a kitchen-dispatch problem before it is a promo problem. Keep Buy 1 Pizza Get 1 Free (Tue-Thu) out of peak-delay windows until dispatch is tighter. Say YES and I'll draft the public reply plus a 3-step prep/rider handoff checklist now."
66
+ },
67
+ {
68
+ "trigger_id": "trg_014_seasonal_acquisition_dip_powerhouse",
69
+ "merchant_id": "m_007_powerhouse_gym_bangalore",
70
+ "customer_id": null,
71
+ "total": 39,
72
+ "specificity": 7,
73
+ "category_fit": 9,
74
+ "merchant_fit": 8,
75
+ "decision_quality": 8,
76
+ "engagement": 7,
77
+ "hint": "Anchor the 30% slide against last year's HSR Layout April baseline to make the dip feel reversible rather than routine.",
78
+ "body": "Karthik, seasonal perf dip: views dropped 30% in 7d. 245 active members are the proof to show, not a discount to shout. April-June is the weak acquisition window in HSR Layout; the next 7 days should look like classes are alive, not like ads are desperate. Use 3 FREE Trial Classes only as the hook. No guilt, just the next session. Reply YES. I'll draft the 7-day trial-to-restart class post now."
79
+ },
80
+ {
81
+ "trigger_id": "trg_012_milestone_mylari",
82
+ "merchant_id": "m_006_southindiancafe_restaurant_bangalore",
83
+ "customer_id": null,
84
+ "total": 42,
85
+ "specificity": 9,
86
+ "category_fit": 7,
87
+ "merchant_fit": 10,
88
+ "decision_quality": 8,
89
+ "engagement": 8,
90
+ "hint": "Let the milestone breathe by anchoring it to the next table, not the next hour.",
91
+ "body": "Suresh, review count is 145, only 5 away from 150 in Indiranagar. Tie it to Weekday Lunch Thali @ Rs 149 while customers are happy. The clean play is to ask the next happy customers at billing, not create a discount. Say YES and I'll draft the 2-line review ask now."
92
+ },
93
+ {
94
+ "trigger_id": "trg_018_supply_atorvastatin_recall",
95
+ "merchant_id": "m_009_apollo_pharmacy_jaipur",
96
+ "customer_id": null,
97
+ "total": 41,
98
+ "specificity": 9,
99
+ "category_fit": 9,
100
+ "merchant_fit": 8,
101
+ "decision_quality": 8,
102
+ "engagement": 7,
103
+ "hint": "A whisper of regulatory exposure and refill-stock risk would sharpen the compulsion without breaking tone.",
104
+ "body": "Ramesh, supply alert: pull atorvastatin batches AT2024-1102, AT2024-1108 from MfrZ before the next refill sale. Check the 240 repeat/chronic customer context before outreach. You already asked for the list; this is the same action moment. Keep it calm and pharmacist-approved; Confirm YES and I'll draft the affected-customer list plus counter replacement checklist now."
105
+ },
106
+ {
107
+ "trigger_id": "trg_021_unverified_gbp_sunrise",
108
+ "merchant_id": "m_010_sunrisepharm_pharmacy_lucknow",
109
+ "customer_id": null,
110
+ "total": 39,
111
+ "specificity": 7,
112
+ "category_fit": 9,
113
+ "merchant_fit": 8,
114
+ "decision_quality": 8,
115
+ "engagement": 7,
116
+ "hint": "Let silence on the postcard do the persuading.",
117
+ "body": "Vikas, GBP is still unverified via postcard or phone call with 14 recent calls at stake; the context estimates 30% visibility lift and no active merchant offer. Every refill search that lands before verification sees less trust. This is a visibility fix, not a promo. Calm, clear, and claim-free. Confirm YES and I'll draft the exact 3-step verification checklist now."
118
+ },
119
+ {
120
+ "trigger_id": "trg_023_competitor_opened_dentist",
121
+ "merchant_id": "m_001_drmeera_dentist_delhi",
122
+ "customer_id": null,
123
+ "total": 39,
124
+ "specificity": 9,
125
+ "category_fit": 8,
126
+ "merchant_fit": 7,
127
+ "decision_quality": 8,
128
+ "engagement": 7,
129
+ "hint": "The gap between 199 and 299 is the lever; whisper the word 'perception' without saying it.",
130
+ "body": "Dr. Meera, Smile Studio opened 1.3 km away on 2026-04-08 with Dental Cleaning @ Rs 199. Your hook is Dental Cleaning @ Rs 299. This week, nearby searchers will compare both profiles. Say GO and I'll draft the local listing post that makes your clinic look current before patients compare."
131
+ },
132
+ {
133
+ "trigger_id": "trg_025_dormancy_glamour",
134
+ "merchant_id": "m_004_glamour_salon_pune",
135
+ "customer_id": null,
136
+ "total": 37,
137
+ "specificity": 8,
138
+ "category_fit": 7,
139
+ "merchant_fit": 9,
140
+ "decision_quality": 7,
141
+ "engagement": 6,
142
+ "hint": "A whisper of booked-out evenings and peer credibility tightens the noose without a discount.",
143
+ "body": "Anjali, customer outreach has been quiet for 38 days since the last subscription expiry conversation; 1200 30d views and 8 calls show the profile still has demand in Aundh. Before this week's evening slots go cold, make one warm comeback ask. Draft one warm hair/spa slot comeback note for recent visitors, not a discount blast. Say YES and I'll draft it around your busiest hour now."
144
+ }
145
+ ]
judge_unseen_adaptive_log.json ADDED
@@ -0,0 +1 @@
 
 
1
+ []
submission.jsonl CHANGED
The diff for this file is too large to render. See raw diff