rohitsar567 commited on
Commit
9c879c3
·
verified ·
1 Parent(s): 91489ec

Deploy v1 — single-Docker FastAPI + Next.js + RAG + voice + faithfulness

Browse files
This view is limited to 50 files because it contains too many changes.   See raw diff
Files changed (50) hide show
  1. backend/main.py +32 -27
  2. data/corpus_urls.md +5 -5
  3. data/premiums/illustrative_premiums.json +834 -87
  4. data/reviews/hdfc-ergo.json +1 -1
  5. data/reviews/manipalcigna.json +2 -2
  6. data/reviews/niva-bupa.json +4 -4
  7. eval/chunk_diagnostic.json +608 -0
  8. eval/chunk_sweep_results.json +83 -0
  9. frontend/src/app/page.tsx +272 -24
  10. frontend/tsconfig.tsbuildinfo +0 -0
  11. kb/calculations/chunk_sweep_results.md +37 -0
  12. rag/extracted/aditya-birla__activ-one__brochure._raw 2.txt +0 -0
  13. rag/extracted/regulatory__dfs-gst-exemption-insurance-faqs-2025._raw 2.txt +0 -0
  14. rag/extracted/regulatory__irdai-arogya-sanjeevani-policy-attachment-1._raw 2.txt +0 -0
  15. rag/extracted/regulatory__irdai-arogya-sanjeevani-policy._raw 2.txt +0 -0
  16. rag/extracted/regulatory__irdai-consolidated-product-filing-health-2020._raw 2.txt +0 -0
  17. rag/extracted/regulatory__irdai-corona-kavach-press-release._raw 2.txt +0 -0
  18. rag/extracted/regulatory__irdai-grievance-redressal-handbook._raw 2.txt +0 -0
  19. rag/extracted/regulatory__irdai-health-insurance-regulations-2016._raw 2.txt +0 -0
  20. rag/extracted/regulatory__irdai-insurance-act-1938-amended-2021._raw 2.txt +0 -0
  21. rag/extracted/regulatory__irdai-master-circular-health-2024._raw 2.txt +0 -0
  22. rag/extracted/regulatory__irdai-master-circular-health-annexure-2024._raw 2.txt +0 -0
  23. rag/extracted/regulatory__irdai-master-circular-protection-policyholders-2024._raw 2.txt +0 -0
  24. rag/extracted/regulatory__irdai-master-circular-standardisation-health-products-2020._raw 2.txt +0 -0
  25. rag/extracted/regulatory__irdai-modification-standardisation-2020._raw 2.txt +0 -0
  26. rag/extracted/regulatory__irdai-ombudsman-rules-faq-2017._raw 2.txt +0 -0
  27. rag/extracted/regulatory__irdai-protection-policyholders-regulations-2017._raw 2.txt +0 -0
  28. rag/extracted/regulatory__irdai-saral-suraksha-bima-guidelines._raw 2.txt +0 -0
  29. rag/extracted/regulatory__irdai-standardisation-exclusions-amendments-2020._raw 2.txt +0 -0
  30. rag/extracted/regulatory__nha-pmjay-operations-manual._raw 2.txt +0 -0
  31. rag/extracted/star-health__family-health-optima__brochure._raw 2.txt +0 -0
  32. rag/extracted/star-health__family-health-optima__wordings._raw 2.txt +0 -0
  33. rag/extracted/star-health__health-premier__brochure._raw 2.txt +0 -0
  34. rag/extracted/star-health__health-premier__wordings._raw 2.txt +0 -0
  35. rag/extracted/star-health__senior-citizens-red-carpet__brochure._raw 2.txt +0 -0
  36. rag/extracted/star-health__star-assure__wordings._raw 2.txt +0 -0
  37. rag/extracted/star-health__star-cancer-care-platinum__wordings._raw 2.txt +0 -0
  38. rag/extracted/star-health__star-cardiac-care-platinum__wordings._raw 2.txt +0 -0
  39. rag/extracted/star-health__star-cardiac-care__wordings._raw 2.txt +0 -0
  40. rag/extracted/star-health__star-comprehensive__wordings._raw 2.txt +0 -0
  41. rag/extracted/star-health__star-hospital-cash__brochure._raw 2.txt +0 -0
  42. rag/extracted/star-health__star-hospital-cash__brochure._raw.txt +0 -0
  43. rag/vectors/adf11961-3807-4622-8478-cf1d55a10a1b/data_level0.bin +3 -0
  44. rag/vectors/adf11961-3807-4622-8478-cf1d55a10a1b/header.bin +3 -0
  45. rag/vectors/adf11961-3807-4622-8478-cf1d55a10a1b/index_metadata.pickle +3 -0
  46. rag/vectors/adf11961-3807-4622-8478-cf1d55a10a1b/length.bin +3 -0
  47. rag/vectors/adf11961-3807-4622-8478-cf1d55a10a1b/link_lists.bin +3 -0
  48. rag/vectors/chroma.sqlite3 +2 -2
  49. tools/.pdf_etag_state.json +526 -0
  50. tools/CRON_README.md +122 -0
backend/main.py CHANGED
@@ -488,7 +488,7 @@ class MarketplacePolicy(BaseModel):
488
  insurer_slug: str
489
  insurer_name: str
490
  insurer_home_url: str
491
- source_pdf_url: str
492
  grade: str
493
  overall_score: int
494
  one_liner: str
@@ -563,32 +563,37 @@ async def policies_all():
563
  else:
564
  si = []
565
 
566
- out.append(MarketplacePolicy(
567
- policy_id=data.get("policy_id", fp.stem),
568
- policy_name=data.get("policy_name", fp.stem),
569
- insurer_slug=slug,
570
- insurer_name=name,
571
- insurer_home_url=home,
572
- source_pdf_url=data.get("source_pdf_url", ""),
573
- grade=sc.grade,
574
- overall_score=sc.overall_score,
575
- one_liner=sc.one_liner,
576
- data_completeness_pct=sc.data_completeness_pct,
577
- min_entry_age=data.get("min_entry_age"),
578
- max_entry_age=data.get("max_entry_age"),
579
- max_renewal_age=data.get("max_renewal_age"),
580
- sum_insured_options=si,
581
- pre_existing_disease_waiting_months=data.get("pre_existing_disease_waiting_months"),
582
- initial_waiting_period_days=data.get("initial_waiting_period_days"),
583
- maternity_waiting_months=data.get("maternity_waiting_months"),
584
- copayment_pct=data.get("copayment_pct") if isinstance(data.get("copayment_pct"), (int, float)) else None,
585
- network_hospital_count=data.get("network_hospital_count"),
586
- no_claim_bonus_pct=data.get("no_claim_bonus_pct"),
587
- ayush_coverage=_coerce_bool(data.get("ayush_coverage")),
588
- maternity_coverage=_coerce_bool(data.get("maternity_coverage")),
589
- cashless_treatment_supported=_coerce_bool(data.get("cashless_treatment_supported")),
590
- room_rent_capping=data.get("room_rent_capping") if isinstance(data.get("room_rent_capping"), str) else None,
591
- ))
 
 
 
 
 
592
 
593
  return MarketplaceResponse(
594
  policies=out,
 
488
  insurer_slug: str
489
  insurer_name: str
490
  insurer_home_url: str
491
+ source_pdf_url: Optional[str] = None
492
  grade: str
493
  overall_score: int
494
  one_liner: str
 
563
  else:
564
  si = []
565
 
566
+ try:
567
+ out.append(MarketplacePolicy(
568
+ policy_id=data.get("policy_id", fp.stem),
569
+ policy_name=data.get("policy_name", fp.stem),
570
+ insurer_slug=slug,
571
+ insurer_name=name,
572
+ insurer_home_url=home,
573
+ source_pdf_url=data.get("source_pdf_url") or "",
574
+ grade=sc.grade,
575
+ overall_score=sc.overall_score,
576
+ one_liner=sc.one_liner,
577
+ data_completeness_pct=sc.data_completeness_pct,
578
+ min_entry_age=data.get("min_entry_age"),
579
+ max_entry_age=data.get("max_entry_age"),
580
+ max_renewal_age=data.get("max_renewal_age"),
581
+ sum_insured_options=si,
582
+ pre_existing_disease_waiting_months=data.get("pre_existing_disease_waiting_months"),
583
+ initial_waiting_period_days=data.get("initial_waiting_period_days"),
584
+ maternity_waiting_months=data.get("maternity_waiting_months"),
585
+ copayment_pct=data.get("copayment_pct") if isinstance(data.get("copayment_pct"), (int, float)) else None,
586
+ network_hospital_count=data.get("network_hospital_count"),
587
+ no_claim_bonus_pct=data.get("no_claim_bonus_pct"),
588
+ ayush_coverage=_coerce_bool(data.get("ayush_coverage")),
589
+ maternity_coverage=_coerce_bool(data.get("maternity_coverage")),
590
+ cashless_treatment_supported=_coerce_bool(data.get("cashless_treatment_supported")),
591
+ room_rent_capping=data.get("room_rent_capping") if isinstance(data.get("room_rent_capping"), str) else None,
592
+ ))
593
+ except Exception as e:
594
+ # One malformed extraction should not kill the whole feed
595
+ print(f"[marketplace] skipping {fp.name}: {type(e).__name__}: {str(e)[:120]}")
596
+ continue
597
 
598
  return MarketplaceResponse(
599
  policies=out,
data/corpus_urls.md CHANGED
@@ -60,7 +60,7 @@
60
  | bajaj-allianz | Bajaj Allianz | Health Guard | wordings | https://www.bajajallianz.com/download-documents/health-insurance/health-guard/Health-Guard-Policy-Wordings-print.pdf | flagship |
61
  | bajaj-allianz | Bajaj Allianz | Health Guard Gold (individual) | wordings | https://bajajallianz.com/download-documents/health-insurance/health-guard-individual-policy/HG_Gold_Policy_Wording_&_CIS.pdf | PW + CIS combined |
62
  | bajaj-allianz | Bajaj Allianz | Group Health Guard Gold | wordings | https://www.bajajallianz.com/download-documents/health-insurance/health-guard-group/Group-HG-Gold-Policy-Wordings.pdf | group |
63
- | bajaj-allianz | Bajaj Allianz | Extra Care | wordings | https://www.bajajallianz.com/download-documents/health-insurance/extra-care/Extra-Care-Policy.pdf | top-up |
64
  | bajaj-allianz | Bajaj Allianz | Extra Care Plus | wordings | https://www.bajajallianz.com/download-documents/health-insurance/extra-care-plus/Policy-Wordings-ECP.pdf | super top-up |
65
  | bajaj-allianz | Bajaj Allianz | Global Health Care | wordings | https://www.bajajallianz.com/download-documents/health-insurance/Global-Health-Care/Global-Health-Care-Policy-Wordings.pdf | international |
66
  | bajaj-allianz | Bajaj Allianz | Criti Care | wordings | https://www.bajajallianz.com/download-documents/health-insurance/Criti-Care/Criti-Care_Policy-Wordings.pdf | critical illness |
@@ -72,7 +72,7 @@
72
  | new-india | New India Assurance | New India Mediclaim Policy | brochure | https://www.newindia.co.in/assets/docs/know-more/health/new-india-mediclaim-policy/Prospectus%20New%20India%20Mediclaim%20Policy.pdf | prospectus |
73
  | new-india | New India Assurance | New India Floater Mediclaim Policy | wordings | https://www.newindia.co.in/assets/docs/know-more/health/floater-mediclaim-policy/Policy%20Clause%20New%20India%20Floater%20Mediclaim%20Policy%20wef%2001%2010%202024.pdf | family floater |
74
  | new-india | New India Assurance | Asha Kiran Policy | brochure | https://www.newindia.co.in/assets/docs/know-more/health/asha-kiran-policy/Prospectus%20New%20India%20Asha%20Kiran%20Policy%20wef%2001%2004%202021.pdf | women+family hybrid; prospectus |
75
- | new-india | New India Assurance | Asha Kiran Policy | cis | https://www.newindia.co.in/assets/docs/know-more/health/asha-kiran-policy/Customer%20Information%20Sheet%20NEW%20INDIA%20ASHA%20KIRAN%20POLICY.pdf | CIS |
76
  | new-india | New India Assurance | Yuva Bharat Health Policy | wordings | https://www.newindia.co.in/assets/docs/know-more/health/yuva-bharat-health-policy/Policy%20Clause%20Yuva%20Bharat%20Health%20Policy%20%20wef%2001%2010%202024_1.pdf | 18-45 age group |
77
  | new-india | New India Assurance | Janata Mediclaim Policy | wordings | https://www.newindia.co.in/assets/docs/know-more/health/janata-mediclaim-policy/Policy%20Clause%20Janata%20Mediclaim%20Policy.pdf | mass-market |
78
  | new-india | New India Assurance | Universal Health Insurance | wordings | https://www.newindia.co.in/assets/docs/know-more/health/universal-health-insurance/Policy%20Clause%20Universal%20Health%20Insurance%20Policy.pdf | govt-sponsored |
@@ -91,9 +91,9 @@
91
  | tata-aig | Tata AIG | MediCare Select | brochure | https://www.tataaig.com/s3/medicare_select_prospectus_efd23b0ad6.pdf | prospectus |
92
  | tata-aig | Tata AIG | Wellsurance Family | cis | https://www.tataaig.com/s3/Wellsurance_Family_CIS_96593ef551.PDF | family cash-benefit |
93
  | manipalcigna | ManipalCigna | ProHealth Insurance (all variants) | wordings | https://ditto-partners.s3.ap-south-1.amazonaws.com/Manipal+Cigna/ProHealth+(All+variants)-Policy+wording.pdf | flagship — note hosted on partner S3 |
94
- | manipalcigna | ManipalCigna | ProHealth (IRDAI mirror) | wordings | https://irdai.gov.in/documents/37343/931203/MCIHLIP22211V062122.pdf | official IRDAI copy of UIN MCIHLIP22211V062122 |
95
- | manipalcigna | ManipalCigna | ProHealth Prime | brochure | https://www.manipalcigna.com/documents/20124/3239176/ProHealth-Prime-Brochure-Package-A5-Apr22.pdf/659df7db-5ef7-9ebf-7133-cbf3e7b6139d | prime variant brochure |
96
- | manipalcigna | ManipalCigna | ProHealth Prime | wordings | https://www.manipalcigna.com/documents/20124/0/7-ProHealth-Prime-P-A-Prospectus-April-22-02.pdf/8c1b2d11-4129-e0a3-ad94-1ecc19ecfd58 | prospectus |
97
  | manipalcigna | ManipalCigna | Sarvah Param | brochure | https://www.manipalcigna.com/documents/20124/0/Sarvah-Param-Prospectus/c2543c7b-764d-2157-7f4c-214616f20ff4 | senior citizens prospectus |
98
  | manipalcigna | ManipalCigna | Sarvah Param | wordings | https://www.manipalcigna.com/documents/20124/0/Sarvah-Param-TnC/19341cbc-41ae-b938-feac-cc7e373fbc0d | T&C |
99
  | manipalcigna | ManipalCigna | ProHealth Select | wordings | https://www.manipalcigna.com/documents/20124/350424/17+ProHealthSelect_TnC_Jul19.pdf/9104b961-e417-956b-ab41-1af27c869e0a?t=1611243593613 | select variant |
 
60
  | bajaj-allianz | Bajaj Allianz | Health Guard | wordings | https://www.bajajallianz.com/download-documents/health-insurance/health-guard/Health-Guard-Policy-Wordings-print.pdf | flagship |
61
  | bajaj-allianz | Bajaj Allianz | Health Guard Gold (individual) | wordings | https://bajajallianz.com/download-documents/health-insurance/health-guard-individual-policy/HG_Gold_Policy_Wording_&_CIS.pdf | PW + CIS combined |
62
  | bajaj-allianz | Bajaj Allianz | Group Health Guard Gold | wordings | https://www.bajajallianz.com/download-documents/health-insurance/health-guard-group/Group-HG-Gold-Policy-Wordings.pdf | group |
63
+ | bajaj-allianz | Bajaj Allianz | Extra Care | wordings | https://www.bajajgeneralinsurance.com/download-documents/health-insurance/extra-care-plus/Policy-Wordings-ECP.pdf | top-up |
64
  | bajaj-allianz | Bajaj Allianz | Extra Care Plus | wordings | https://www.bajajallianz.com/download-documents/health-insurance/extra-care-plus/Policy-Wordings-ECP.pdf | super top-up |
65
  | bajaj-allianz | Bajaj Allianz | Global Health Care | wordings | https://www.bajajallianz.com/download-documents/health-insurance/Global-Health-Care/Global-Health-Care-Policy-Wordings.pdf | international |
66
  | bajaj-allianz | Bajaj Allianz | Criti Care | wordings | https://www.bajajallianz.com/download-documents/health-insurance/Criti-Care/Criti-Care_Policy-Wordings.pdf | critical illness |
 
72
  | new-india | New India Assurance | New India Mediclaim Policy | brochure | https://www.newindia.co.in/assets/docs/know-more/health/new-india-mediclaim-policy/Prospectus%20New%20India%20Mediclaim%20Policy.pdf | prospectus |
73
  | new-india | New India Assurance | New India Floater Mediclaim Policy | wordings | https://www.newindia.co.in/assets/docs/know-more/health/floater-mediclaim-policy/Policy%20Clause%20New%20India%20Floater%20Mediclaim%20Policy%20wef%2001%2010%202024.pdf | family floater |
74
  | new-india | New India Assurance | Asha Kiran Policy | brochure | https://www.newindia.co.in/assets/docs/know-more/health/asha-kiran-policy/Prospectus%20New%20India%20Asha%20Kiran%20Policy%20wef%2001%2004%202021.pdf | women+family hybrid; prospectus |
75
+ | new-india | New India Assurance | Asha Kiran Policy | cis | http://www.newindia.co.in/assets/docs/know-more/health/asha-kiran-policy/Customer%20Information%20Sheet%20NEW%20INDIA%20ASHA%20KIRAN%20POLICY.pdf | CIS |
76
  | new-india | New India Assurance | Yuva Bharat Health Policy | wordings | https://www.newindia.co.in/assets/docs/know-more/health/yuva-bharat-health-policy/Policy%20Clause%20Yuva%20Bharat%20Health%20Policy%20%20wef%2001%2010%202024_1.pdf | 18-45 age group |
77
  | new-india | New India Assurance | Janata Mediclaim Policy | wordings | https://www.newindia.co.in/assets/docs/know-more/health/janata-mediclaim-policy/Policy%20Clause%20Janata%20Mediclaim%20Policy.pdf | mass-market |
78
  | new-india | New India Assurance | Universal Health Insurance | wordings | https://www.newindia.co.in/assets/docs/know-more/health/universal-health-insurance/Policy%20Clause%20Universal%20Health%20Insurance%20Policy.pdf | govt-sponsored |
 
91
  | tata-aig | Tata AIG | MediCare Select | brochure | https://www.tataaig.com/s3/medicare_select_prospectus_efd23b0ad6.pdf | prospectus |
92
  | tata-aig | Tata AIG | Wellsurance Family | cis | https://www.tataaig.com/s3/Wellsurance_Family_CIS_96593ef551.PDF | family cash-benefit |
93
  | manipalcigna | ManipalCigna | ProHealth Insurance (all variants) | wordings | https://ditto-partners.s3.ap-south-1.amazonaws.com/Manipal+Cigna/ProHealth+(All+variants)-Policy+wording.pdf | flagship — note hosted on partner S3 |
94
+ | manipalcigna | ManipalCigna | ProHealth (IRDAI mirror) | wordings | https://irdai.gov.in/documents/37343/931203/MCIHLIP22211V062122.pdf/b3a179da-4a2e-b4f2-27db-11779ec9a3cf?version=1.1&t=1668851771621&download=true | official IRDAI copy of UIN MCIHLIP22211V062122 |
95
+ | manipalcigna | ManipalCigna | ProHealth Prime | brochure | https://www.manipalcigna.com/documents/20124/0/ProHealthPrime-Protect-and-Advantage-Accordion/8aa36945-b0a9-1037-e9c4-579b9a44149e | prime variant brochure |
96
+ | manipalcigna | ManipalCigna | ProHealth Prime | wordings | https://www.manipalcigna.com/documents/20124/0/ProHealthPrime-Rider-P-A-Plan-Prospectus/bad30bd2-2394-7a8d-4072-8d73b2b7b3fa | prospectus |
97
  | manipalcigna | ManipalCigna | Sarvah Param | brochure | https://www.manipalcigna.com/documents/20124/0/Sarvah-Param-Prospectus/c2543c7b-764d-2157-7f4c-214616f20ff4 | senior citizens prospectus |
98
  | manipalcigna | ManipalCigna | Sarvah Param | wordings | https://www.manipalcigna.com/documents/20124/0/Sarvah-Param-TnC/19341cbc-41ae-b938-feac-cc7e373fbc0d | T&C |
99
  | manipalcigna | ManipalCigna | ProHealth Select | wordings | https://www.manipalcigna.com/documents/20124/350424/17+ProHealthSelect_TnC_Jul19.pdf/9104b961-e417-956b-ab41-1af27c869e0a?t=1611243593613 | select variant |
data/premiums/illustrative_premiums.json CHANGED
@@ -1,6 +1,6 @@
1
  {
2
  "last_updated": "2026-05-13",
3
- "methodology": "Premium samples pulled from public quote pages on PolicyBazaar, JoinDitto, Beshak, and insurer rate cards (Tata AIG MediCare Premier official rate chart, Star Family Health Optima Annexure-2, Niva Bupa ReAssure 2.0 rate card) on 2026-05-13. Single quotes are illustrative starting premiums for healthy non-smoking lives in Delhi (metro / Zone 1 / Zone A); actual premium varies with underwriting, pin code, family composition, and add-ons. Where a specific (insurer, policy, age, SI) combination did not surface a public number, the closest comparable insurer band was used and the gap was filled with the scaling factors below (derived from the 2-3 anchor points that ARE real). Scaling factors are calibrated against the IRDAI bandings used by most Indian health insurers and are consistent with the visible deltas in the JoinDitto / Beshak premium charts.",
4
  "sources_consulted": [
5
  "https://www.policybazaar.com/insurance-companies/hdfc-ergo-health-insurance/optima-secure-plan/",
6
  "https://www.policybazaar.com/insurance-companies/religare-health-insurance/care-supreme/",
@@ -41,238 +41,977 @@
41
  "policy_id": "hdfc-ergo-optima-secure",
42
  "policy_name": "HDFC ERGO my:Optima Secure",
43
  "samples": [
44
- {"age": 30, "sum_insured_inr": 500000, "city_tier": "metro", "smoker": false, "family_size": 1, "annual_premium_inr": 4800, "source_url": "https://www.policybazaar.com/insurance-companies/hdfc-ergo-health-insurance/optima-secure-plan/", "source_note": "PolicyBazaar tile: Rs 400/month for 30M/29F Delhi no PED, 5L SI"},
45
- {"age": 30, "sum_insured_inr": 1000000, "city_tier": "metro", "smoker": false, "family_size": 1, "annual_premium_inr": 6492, "source_url": "https://www.policybazaar.com/insurance-companies/hdfc-ergo-health-insurance/optima-secure-plan/", "source_note": "PolicyBazaar tile: Rs 541/month for 30M/29F Delhi no PED, 10L SI"},
46
- {"age": 40, "sum_insured_inr": 1000000, "city_tier": "metro", "smoker": false, "family_size": 1, "annual_premium_inr": 9089, "source_url": "derived_from_anchor", "source_note": "anchor 30/10L * age_multiplier(36-45)/age_multiplier(26-35) = 6492 * 1.4"},
47
- {"age": 50, "sum_insured_inr": 1000000, "city_tier": "metro", "smoker": false, "family_size": 2, "annual_premium_inr": 22500, "source_url": "derived_from_anchor", "source_note": "anchor 30/10L * age 1.4-2.1 * floater 1.65"},
48
- {"age": 35, "sum_insured_inr": 2500000, "city_tier": "metro", "smoker": false, "family_size": 4, "annual_premium_inr": 35200, "source_url": "derived_from_anchor", "source_note": "anchor 30/5L=4800 * SI 3.1 * floater 2.4"}
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
49
  ]
50
  },
51
  "hdfc-ergo__optima-restore": {
52
  "policy_id": "hdfc-ergo-optima-restore",
53
  "policy_name": "HDFC ERGO Optima Restore",
54
  "samples": [
55
- {"age": 30, "sum_insured_inr": 500000, "city_tier": "metro", "smoker": false, "family_size": 1, "annual_premium_inr": 6800, "source_url": "derived_from_anchor", "source_note": "Optima Restore typically ~40% higher than Optima Secure entry for same age/SI per Beshak comparison"},
56
- {"age": 30, "sum_insured_inr": 1000000, "city_tier": "metro", "smoker": false, "family_size": 1, "annual_premium_inr": 9100, "source_url": "derived_from_anchor"},
57
- {"age": 40, "sum_insured_inr": 1000000, "city_tier": "metro", "smoker": false, "family_size": 2, "annual_premium_inr": 21000, "source_url": "derived_from_anchor"}
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
58
  ]
59
  },
60
  "hdfc-ergo__optima-plus": {
61
  "policy_id": "hdfc-ergo-optima-plus",
62
  "policy_name": "HDFC ERGO Optima Plus",
63
  "samples": [
64
- {"age": 30, "sum_insured_inr": 500000, "city_tier": "metro", "smoker": false, "family_size": 1, "annual_premium_inr": 7200, "source_url": "https://www.policybazaar.com/insurance-companies/hdfc-ergo-health-insurance/optima-plus-insurance-plan/", "source_note": "starts ~50% higher than Optima Secure tile in PolicyBazaar listing"},
65
- {"age": 35, "sum_insured_inr": 1000000, "city_tier": "metro", "smoker": false, "family_size": 2, "annual_premium_inr": 16000, "source_url": "derived_from_anchor"}
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
66
  ]
67
  },
68
  "hdfc-ergo__energy": {
69
  "policy_id": "hdfc-ergo-energy",
70
  "policy_name": "HDFC ERGO Energy (Diabetes/Hypertension focused)",
71
  "samples": [
72
- {"age": 40, "sum_insured_inr": 500000, "city_tier": "metro", "smoker": false, "family_size": 1, "annual_premium_inr": 12500, "source_url": "callback_only", "source_note": "Energy plan typically loaded ~30-40% over Optima Secure for diabetes-positive profiles; full quote requires medical underwriting"}
73
- ]
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
74
  },
75
  "care-health__care-supreme": {
76
  "policy_id": "care-health-care-supreme",
77
  "policy_name": "Care Health Care Supreme",
78
  "samples": [
79
- {"age": 30, "sum_insured_inr": 500000, "city_tier": "metro", "smoker": false, "family_size": 1, "annual_premium_inr": 4800, "source_url": "https://www.policybazaar.com/insurance-companies/religare-health-insurance/care-supreme/", "source_note": "PolicyBazaar tile: Rs 400/month for 30M/29F Delhi no PED, 5L SI"},
80
- {"age": 30, "sum_insured_inr": 1000000, "city_tier": "metro", "smoker": false, "family_size": 1, "annual_premium_inr": 6492, "source_url": "https://www.policybazaar.com/insurance-companies/religare-health-insurance/care-supreme/", "source_note": "PolicyBazaar tile: Rs 541/month for 30M/29F Delhi no PED, 10L SI"},
81
- {"age": 40, "sum_insured_inr": 1000000, "city_tier": "metro", "smoker": false, "family_size": 1, "annual_premium_inr": 9089, "source_url": "derived_from_anchor"},
82
- {"age": 35, "sum_insured_inr": 2500000, "city_tier": "metro", "smoker": false, "family_size": 4, "annual_premium_inr": 33800, "source_url": "derived_from_anchor"},
83
- {"age": 50, "sum_insured_inr": 2500000, "city_tier": "metro", "smoker": false, "family_size": 2, "annual_premium_inr": 49500, "source_url": "derived_from_anchor"}
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
84
  ]
85
  },
86
  "care-health__care-classic": {
87
  "policy_id": "care-health-care-classic",
88
  "policy_name": "Care Health Care Classic",
89
  "samples": [
90
- {"age": 30, "sum_insured_inr": 500000, "city_tier": "metro", "smoker": false, "family_size": 1, "annual_premium_inr": 5400, "source_url": "https://www.policybazaar.com/insurance-companies/religare-health-insurance/", "source_note": "Care Classic is base variant of Care; ~12% above Supreme entry per Care brochure"},
91
- {"age": 30, "sum_insured_inr": 1000000, "city_tier": "metro", "smoker": false, "family_size": 1, "annual_premium_inr": 7300, "source_url": "derived_from_anchor"}
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
92
  ]
93
  },
94
  "care-health__care-senior": {
95
  "policy_id": "care-health-care-senior",
96
  "policy_name": "Care Health Care Senior",
97
  "samples": [
98
- {"age": 65, "sum_insured_inr": 500000, "city_tier": "metro", "smoker": false, "family_size": 1, "annual_premium_inr": 22500, "source_url": "https://www.policybazaar.com/insurance-companies/religare-health-insurance/care-senior/", "source_note": "Care Senior typical 65-year-old 5L entry per PolicyBazaar listing tier"},
99
- {"age": 65, "sum_insured_inr": 1000000, "city_tier": "metro", "smoker": false, "family_size": 1, "annual_premium_inr": 32500, "source_url": "derived_from_anchor"},
100
- {"age": 70, "sum_insured_inr": 500000, "city_tier": "metro", "smoker": false, "family_size": 1, "annual_premium_inr": 31000, "source_url": "derived_from_anchor"}
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
101
  ]
102
  },
103
  "care-health__care-advantage": {
104
  "policy_id": "care-health-care-advantage",
105
  "policy_name": "Care Health Care Advantage",
106
  "samples": [
107
- {"age": 30, "sum_insured_inr": 500000, "city_tier": "metro", "smoker": false, "family_size": 1, "annual_premium_inr": 5100, "source_url": "https://www.careinsurance.com/product/care-supreme", "source_note": "Advantage variant priced between Classic and Supreme; brochure-indicated entry"}
 
 
 
 
 
 
 
 
 
108
  ]
109
  },
110
  "aditya-birla__activ-assure-diamond": {
111
  "policy_id": "aditya-birla-activ-assure-diamond",
112
  "policy_name": "Aditya Birla Activ Assure Diamond",
113
  "samples": [
114
- {"age": 30, "sum_insured_inr": 500000, "city_tier": "metro", "smoker": false, "family_size": 1, "annual_premium_inr": 8215, "source_url": "https://www.adityabirlacapital.com/healthinsurance/activ-assure-diamond", "source_note": "Aditya Birla official site: 'starts from Rs 8,215/yr for self age 30, SI 5L'"},
115
- {"age": 30, "sum_insured_inr": 1000000, "city_tier": "metro", "smoker": false, "family_size": 1, "annual_premium_inr": 11100, "source_url": "derived_from_anchor", "source_note": "anchor 5L * SI_multiplier 1.0->1.7 attenuated to 1.35 (typical ABHI 5L->10L delta on rate card)"},
116
- {"age": 40, "sum_insured_inr": 1000000, "city_tier": "metro", "smoker": false, "family_size": 1, "annual_premium_inr": 15500, "source_url": "derived_from_anchor"},
117
- {"age": 50, "sum_insured_inr": 1000000, "city_tier": "metro", "smoker": false, "family_size": 2, "annual_premium_inr": 35500, "source_url": "derived_from_anchor"},
118
- {"age": 35, "sum_insured_inr": 2500000, "city_tier": "metro", "smoker": false, "family_size": 4, "annual_premium_inr": 41000, "source_url": "derived_from_anchor"}
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
119
  ]
120
  },
121
  "aditya-birla__group-activ-health": {
122
  "policy_id": "aditya-birla-group-activ-health",
123
  "policy_name": "Aditya Birla Group Activ Health",
124
  "samples": [
125
- {"age": 35, "sum_insured_inr": 500000, "city_tier": "metro", "smoker": false, "family_size": 1, "annual_premium_inr": 7500, "source_url": "callback_only", "source_note": "Group product: priced via corporate underwriting only; illustrative pricing from ABHI group quotes typically ~10% below retail Activ Assure"}
126
- ]
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
127
  },
128
  "bajaj-allianz__health-guard": {
129
  "policy_id": "bajaj-allianz-health-guard",
130
  "policy_name": "Bajaj Allianz Health Guard / Comprehensive Care Plan",
131
  "samples": [
132
- {"age": 30, "sum_insured_inr": 350000, "city_tier": "metro", "smoker": false, "family_size": 1, "annual_premium_inr": 6962, "source_url": "https://www.bajajfinserv.in/insurance/bajaj-general-health-guard-insurance-plan", "source_note": "Bajaj Finserv listing: 'Coverage up to Rs 35 lakh starting at Rs 6,962'"},
133
- {"age": 30, "sum_insured_inr": 500000, "city_tier": "metro", "smoker": false, "family_size": 1, "annual_premium_inr": 8200, "source_url": "derived_from_anchor", "source_note": "anchor 3.5L*1.0 -> 5L * ~1.18 SI delta typical Bajaj rate card"},
134
- {"age": 30, "sum_insured_inr": 1000000, "city_tier": "metro", "smoker": false, "family_size": 1, "annual_premium_inr": 11500, "source_url": "derived_from_anchor"},
135
- {"age": 40, "sum_insured_inr": 1000000, "city_tier": "metro", "smoker": false, "family_size": 2, "annual_premium_inr": 26500, "source_url": "derived_from_anchor"},
136
- {"age": 35, "sum_insured_inr": 2500000, "city_tier": "metro", "smoker": false, "family_size": 4, "annual_premium_inr": 39000, "source_url": "derived_from_anchor"}
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
137
  ]
138
  },
139
  "bajaj-allianz__silver-health": {
140
  "policy_id": "bajaj-allianz-silver-health",
141
  "policy_name": "Bajaj Allianz Silver Health (Senior 46-80)",
142
  "samples": [
143
- {"age": 60, "sum_insured_inr": 500000, "city_tier": "metro", "smoker": false, "family_size": 1, "annual_premium_inr": 19800, "source_url": "https://www.policybazaar.com/insurance-companies/bajaj-allianz-health-insurance/silver-health-plan/", "source_note": "Silver Health entry age 46-80; PolicyBazaar listing tile starting band for 60-year-old"},
144
- {"age": 65, "sum_insured_inr": 500000, "city_tier": "metro", "smoker": false, "family_size": 1, "annual_premium_inr": 24500, "source_url": "derived_from_anchor"},
145
- {"age": 70, "sum_insured_inr": 500000, "city_tier": "metro", "smoker": false, "family_size": 1, "annual_premium_inr": 32000, "source_url": "derived_from_anchor"}
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
146
  ]
147
  },
148
  "bajaj-allianz__tax-gain": {
149
  "policy_id": "bajaj-allianz-tax-gain",
150
  "policy_name": "Bajaj Allianz Tax Gain",
151
  "samples": [
152
- {"age": 35, "sum_insured_inr": 500000, "city_tier": "metro", "smoker": false, "family_size": 4, "annual_premium_inr": 11500, "source_url": "https://www.bajajgeneralinsurance.com/health-insurance-plans/", "source_note": "Tax Gain is a family floater 80D-optimized variant; entry premium per Bajaj catalog"}
 
 
 
 
 
 
 
 
 
153
  ]
154
  },
155
  "icici-lombard__elevate": {
156
  "policy_id": "icici-lombard-elevate",
157
  "policy_name": "ICICI Lombard Elevate",
158
  "samples": [
159
- {"age": 30, "sum_insured_inr": 1000000, "city_tier": "metro", "smoker": false, "family_size": 1, "annual_premium_inr": 9500, "source_url": "https://www.icicilombard.com/health-insurance/elevate-health-policy", "source_note": "ICICI Lombard official: Elevate sample illustration cited for 30M, 10L SI"},
160
- {"age": 30, "sum_insured_inr": 500000, "city_tier": "metro", "smoker": false, "family_size": 1, "annual_premium_inr": 7000, "source_url": "derived_from_anchor"},
161
- {"age": 40, "sum_insured_inr": 1000000, "city_tier": "metro", "smoker": false, "family_size": 2, "annual_premium_inr": 22500, "source_url": "derived_from_anchor"},
162
- {"age": 35, "sum_insured_inr": 2500000, "city_tier": "metro", "smoker": false, "family_size": 4, "annual_premium_inr": 36500, "source_url": "derived_from_anchor"}
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
163
  ]
164
  },
165
  "icici-lombard__health-advantedge": {
166
  "policy_id": "icici-lombard-health-advantedge",
167
  "policy_name": "ICICI Lombard Health AdvantEdge",
168
  "samples": [
169
- {"age": 30, "sum_insured_inr": 500000, "city_tier": "metro", "smoker": false, "family_size": 1, "annual_premium_inr": 6500, "source_url": "https://www.policybazaar.com/insurance-companies/icici-lombard-health-insurance/", "source_note": "AdvantEdge entry tile on PolicyBazaar comparison page"},
170
- {"age": 30, "sum_insured_inr": 1000000, "city_tier": "metro", "smoker": false, "family_size": 1, "annual_premium_inr": 8800, "source_url": "derived_from_anchor"}
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
171
  ]
172
  },
173
  "niva-bupa__reassure": {
174
  "policy_id": "niva-bupa-reassure",
175
  "policy_name": "Niva Bupa ReAssure 2.0",
176
  "samples": [
177
- {"age": 30, "sum_insured_inr": 500000, "city_tier": "metro", "smoker": false, "family_size": 1, "annual_premium_inr": 21047, "source_url": "https://joinditto.in/articles/health-insurance/niva-bupa-reassure-2-0-premium-chart/", "source_note": "JoinDitto chart: Platinum+ 26-30 / 5L SI Zone 1 = Rs 21,047 incl tax"},
178
- {"age": 30, "sum_insured_inr": 500000, "city_tier": "metro", "smoker": false, "family_size": 1, "annual_premium_inr": 21560, "source_url": "https://joinditto.in/articles/health-insurance/niva-bupa-reassure-2-0-premium-chart/", "source_note": "JoinDitto chart: Titanium+ variant 26-30 / 5L SI = Rs 21,560 incl tax", "variant": "Titanium+"},
179
- {"age": 30, "sum_insured_inr": 1000000, "city_tier": "metro", "smoker": false, "family_size": 1, "annual_premium_inr": 26500, "source_url": "derived_from_anchor"},
180
- {"age": 40, "sum_insured_inr": 1000000, "city_tier": "metro", "smoker": false, "family_size": 2, "annual_premium_inr": 58000, "source_url": "derived_from_anchor"}
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
181
  ]
182
  },
183
  "niva-bupa__health-premia": {
184
  "policy_id": "niva-bupa-health-premia",
185
  "policy_name": "Niva Bupa Health Premia",
186
  "samples": [
187
- {"age": 30, "sum_insured_inr": 500000, "city_tier": "metro", "smoker": false, "family_size": 3, "annual_premium_inr": 14000, "source_url": "https://www.nivabupa.com/health-insurance-plan/health-premia", "source_note": "Niva Bupa official: Health Premia floater 2 adults + 1 child, 5L SI base = ~Rs 14,000"},
188
- {"age": 35, "sum_insured_inr": 1000000, "city_tier": "metro", "smoker": false, "family_size": 4, "annual_premium_inr": 24500, "source_url": "derived_from_anchor"},
189
- {"age": 45, "sum_insured_inr": 2500000, "city_tier": "metro", "smoker": false, "family_size": 4, "annual_premium_inr": 52000, "source_url": "derived_from_anchor"}
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
190
  ]
191
  },
192
  "niva-bupa__aspire": {
193
  "policy_id": "niva-bupa-aspire",
194
  "policy_name": "Niva Bupa Aspire",
195
  "samples": [
196
- {"age": 30, "sum_insured_inr": 500000, "city_tier": "metro", "smoker": false, "family_size": 1, "annual_premium_inr": 7200, "source_url": "https://www.nivabupa.com/family-health-insurance-plans/aspire.html", "source_note": "Aspire Titanium+ entry for 30 single adult per Niva Bupa product page sample"},
197
- {"age": 30, "sum_insured_inr": 1000000, "city_tier": "metro", "smoker": false, "family_size": 1, "annual_premium_inr": 9700, "source_url": "derived_from_anchor"},
198
- {"age": 35, "sum_insured_inr": 1000000, "city_tier": "metro", "smoker": false, "family_size": 2, "annual_premium_inr": 16500, "source_url": "derived_from_anchor"}
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
199
  ]
200
  },
201
  "new-india__asha-kiran": {
202
  "policy_id": "new-india-asha-kiran",
203
  "policy_name": "New India Assurance Asha Kiran Policy",
204
  "samples": [
205
- {"age": 30, "sum_insured_inr": 300000, "city_tier": "metro", "smoker": false, "family_size": 1, "annual_premium_inr": 3650, "source_url": "https://www.newindia.co.in/portal/readMore/Pages/Asha-Kiran-Policy", "source_note": "Asha Kiran is single-girl-child focused; base rate per New India product page"},
206
- {"age": 30, "sum_insured_inr": 500000, "city_tier": "metro", "smoker": false, "family_size": 3, "annual_premium_inr": 6800, "source_url": "derived_from_anchor"}
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
207
  ]
208
  },
209
  "new-india__mediclaim": {
210
  "policy_id": "new-india-mediclaim",
211
  "policy_name": "New India Mediclaim",
212
  "samples": [
213
- {"age": 30, "sum_insured_inr": 500000, "city_tier": "metro", "smoker": false, "family_size": 1, "annual_premium_inr": 5400, "source_url": "https://www.newindia.co.in/portal/readMore/Pages/Mediclaim-Policy", "source_note": "New India Mediclaim - PSU pricing typically ~15-20% below private peers per public rate chart"},
214
- {"age": 30, "sum_insured_inr": 1000000, "city_tier": "metro", "smoker": false, "family_size": 1, "annual_premium_inr": 7300, "source_url": "derived_from_anchor"},
215
- {"age": 50, "sum_insured_inr": 500000, "city_tier": "metro", "smoker": false, "family_size": 2, "annual_premium_inr": 18500, "source_url": "derived_from_anchor"}
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
216
  ]
217
  },
218
  "tata-aig__medicare": {
219
  "policy_id": "tata-aig-medicare",
220
  "policy_name": "Tata AIG MediCare",
221
  "samples": [
222
- {"age": 30, "sum_insured_inr": 500000, "city_tier": "metro", "smoker": false, "family_size": 1, "annual_premium_inr": 7100, "source_url": "https://www.axisbank.com/docs/default-source/default-document-library/medicare-rate-chart-06-12-22.pdf", "source_note": "Tata AIG MediCare base variant rate chart - 19-35 / 5L = Rs 7,108 ex-tax"},
223
- {"age": 30, "sum_insured_inr": 1000000, "city_tier": "metro", "smoker": false, "family_size": 1, "annual_premium_inr": 8800, "source_url": "https://www.axisbank.com/docs/default-source/default-document-library/medicare-rate-chart-06-12-22.pdf"},
224
- {"age": 40, "sum_insured_inr": 1000000, "city_tier": "metro", "smoker": false, "family_size": 1, "annual_premium_inr": 10300, "source_url": "derived_from_anchor"}
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
225
  ]
226
  },
227
  "tata-aig__medicare-premier": {
228
  "policy_id": "tata-aig-medicare-premier",
229
  "policy_name": "Tata AIG MediCare Premier",
230
  "samples": [
231
- {"age": 30, "sum_insured_inr": 500000, "city_tier": "metro", "smoker": false, "family_size": 1, "annual_premium_inr": 8362, "source_url": "https://www.axisbank.com/docs/default-source/default-document-library/tata-aig-medicare-premier-rate-chart.pdf", "source_note": "Official Tata AIG MediCare Premier rate chart: 19-35 age band, 5L SI = Rs 8,362 ex-tax"},
232
- {"age": 30, "sum_insured_inr": 1000000, "city_tier": "metro", "smoker": false, "family_size": 1, "annual_premium_inr": 10319, "source_url": "https://www.axisbank.com/docs/default-source/default-document-library/tata-aig-medicare-premier-rate-chart.pdf", "source_note": "Official rate chart: 19-35 / 10L = Rs 10,319 ex-tax"},
233
- {"age": 40, "sum_insured_inr": 500000, "city_tier": "metro", "smoker": false, "family_size": 1, "annual_premium_inr": 9868, "source_url": "https://www.axisbank.com/docs/default-source/default-document-library/tata-aig-medicare-premier-rate-chart.pdf", "source_note": "Official rate chart: 36-45 / 5L = Rs 9,868 ex-tax"},
234
- {"age": 40, "sum_insured_inr": 1000000, "city_tier": "metro", "smoker": false, "family_size": 1, "annual_premium_inr": 12266, "source_url": "https://www.axisbank.com/docs/default-source/default-document-library/tata-aig-medicare-premier-rate-chart.pdf", "source_note": "Official rate chart: 36-45 / 10L = Rs 12,266 ex-tax"},
235
- {"age": 35, "sum_insured_inr": 2500000, "city_tier": "metro", "smoker": false, "family_size": 4, "annual_premium_inr": 38500, "source_url": "derived_from_anchor"}
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
236
  ]
237
  },
238
  "manipalcigna__prohealth-prime-active": {
239
  "policy_id": "manipalcigna-prohealth-prime-active",
240
  "policy_name": "ManipalCigna ProHealth Prime Active",
241
  "samples": [
242
- {"age": 30, "sum_insured_inr": 500000, "city_tier": "metro", "smoker": false, "family_size": 1, "annual_premium_inr": 6200, "source_url": "https://www.manipalcigna.com/hospitalization-cover/prohealth-insurance/prohealthprime-active", "source_note": "ManipalCigna ProHealth Prime Active - product page sample for 30/5L/Zone 1; mandatory 10% co-pay applies"},
243
- {"age": 30, "sum_insured_inr": 1000000, "city_tier": "metro", "smoker": false, "family_size": 1, "annual_premium_inr": 8400, "source_url": "derived_from_anchor"},
244
- {"age": 40, "sum_insured_inr": 1000000, "city_tier": "metro", "smoker": false, "family_size": 2, "annual_premium_inr": 19500, "source_url": "derived_from_anchor"}
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
245
  ]
246
  },
247
  "star-health__family-health-optima": {
248
  "policy_id": "star-health-family-health-optima",
249
  "policy_name": "Star Family Health Optima",
250
  "samples": [
251
- {"age": 30, "sum_insured_inr": 500000, "city_tier": "metro", "smoker": false, "family_size": 3, "annual_premium_inr": 7968, "source_url": "https://www.scribd.com/document/667873826/Annexure-2-Premium-Chart-Family-Health-Optima-Insurance-Plan-Revised", "source_note": "Star Annexure-2 official premium chart: Zone A, 1A+1C floater, age 30-35, 5L SI = Rs 7,968"},
252
- {"age": 40, "sum_insured_inr": 500000, "city_tier": "metro", "smoker": false, "family_size": 4, "annual_premium_inr": 10046, "source_url": "https://www.scribd.com/document/667873826/Annexure-2-Premium-Chart-Family-Health-Optima-Insurance-Plan-Revised", "source_note": "Star Annexure-2: Zone A, age 36-45 = Rs 10,046"},
253
- {"age": 48, "sum_insured_inr": 500000, "city_tier": "metro", "smoker": false, "family_size": 4, "annual_premium_inr": 13669, "source_url": "https://www.scribd.com/document/667873826/Annexure-2-Premium-Chart-Family-Health-Optima-Insurance-Plan-Revised", "source_note": "Star Annexure-2: Zone A, age 46-50 = Rs 13,669"},
254
- {"age": 35, "sum_insured_inr": 1000000, "city_tier": "metro", "smoker": false, "family_size": 4, "annual_premium_inr": 14500, "source_url": "derived_from_anchor"},
255
- {"age": 35, "sum_insured_inr": 2500000, "city_tier": "metro", "smoker": false, "family_size": 4, "annual_premium_inr": 26800, "source_url": "derived_from_anchor"}
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
256
  ]
257
  },
258
  "star-health__comprehensive": {
259
  "policy_id": "star-health-comprehensive",
260
  "policy_name": "Star Comprehensive Health Insurance",
261
  "samples": [
262
- {"age": 30, "sum_insured_inr": 500000, "city_tier": "metro", "smoker": false, "family_size": 1, "annual_premium_inr": 8500, "source_url": "https://www.policybazaar.com/insurance-companies/star-health-insurance/star-comprehensive-insurance-policy/", "source_note": "Star Comprehensive - higher-tier individual variant, PolicyBazaar entry tile"},
263
- {"age": 30, "sum_insured_inr": 1000000, "city_tier": "metro", "smoker": false, "family_size": 1, "annual_premium_inr": 11200, "source_url": "derived_from_anchor"},
264
- {"age": 45, "sum_insured_inr": 1000000, "city_tier": "metro", "smoker": false, "family_size": 2, "annual_premium_inr": 27800, "source_url": "derived_from_anchor"}
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
265
  ]
266
  },
267
  "star-health__senior-citizens-red-carpet": {
268
  "policy_id": "star-health-senior-red-carpet",
269
  "policy_name": "Star Senior Citizens Red Carpet",
270
  "samples": [
271
- {"age": 60, "sum_insured_inr": 100000, "city_tier": "metro", "smoker": false, "family_size": 1, "annual_premium_inr": 6710, "source_url": "https://www.starhealth.in/health-insurance/health-insurance-for-senior-citizens/", "source_note": "Star Senior Red Carpet base entry per official site: Rs 6,710 ex-tax for 1L SI (lowest band)"},
272
- {"age": 60, "sum_insured_inr": 500000, "city_tier": "metro", "smoker": false, "family_size": 1, "annual_premium_inr": 18900, "source_url": "derived_from_anchor"},
273
- {"age": 65, "sum_insured_inr": 500000, "city_tier": "metro", "smoker": false, "family_size": 1, "annual_premium_inr": 24500, "source_url": "derived_from_anchor"},
274
- {"age": 70, "sum_insured_inr": 500000, "city_tier": "metro", "smoker": false, "family_size": 1, "annual_premium_inr": 31200, "source_url": "derived_from_anchor"},
275
- {"age": 75, "sum_insured_inr": 1000000, "city_tier": "metro", "smoker": false, "family_size": 1, "annual_premium_inr": 55000, "source_url": "derived_from_anchor"}
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
276
  ]
277
  }
278
  },
@@ -316,6 +1055,14 @@
316
  },
317
  "_floater_source": "Derived from comparison of individual vs 1A+1C, 2A+0C, 2A+1C, 2A+2C rates in Star Family Health Optima Annexure-2 and Niva Bupa Health Premia rate card. A family floater for 4 is ~2.4x an individual policy of the eldest member at the same SI, not 4x, because the SI is shared.",
318
  "_combined_example": "30-year-old non-smoker in metro, 10L SI, family floater for 4: base ~Rs 5,500 (HDFC anchor) * age 1.0 * SI 1.35 * city 1.0 * smoker 1.0 * floater 2.4 = ~Rs 17,820/year. Cross-check: HDFC Optima Secure family floater 2A+2C 10L in Delhi typically quoted at Rs 16,000-20,000 on PolicyBazaar.",
319
- "rounding": "All computed premiums should be rounded to nearest Rs 100 when surfaced to the user. Use these as a soft estimate; always nudge the user toward a formal quote on the insurer's portal."
 
 
 
 
 
 
 
 
320
  }
321
- }
 
1
  {
2
  "last_updated": "2026-05-13",
3
+ "methodology": "Premium samples pulled from public quote pages on PolicyBazaar, JoinDitto, Beshak, and insurer rate cards (Tata AIG MediCare Premier official rate chart, Star Family Health Optima Annexure-2, Niva Bupa ReAssure 2.0 rate card) on 2026-05-13. Single quotes are illustrative starting premiums for healthy non-smoking lives in Delhi (metro / Zone 1 / Zone A); actual premium varies with underwriting, pin code, family composition, and add-ons. Where a specific (insurer, policy, age, SI) combination did not surface a public number, the closest comparable insurer band was used and the gap was filled with the scaling factors below (derived from the 2-3 anchor points that ARE real). Scaling factors are calibrated against the IRDAI bandings used by most Indian health insurers and are consistent with the visible deltas in the JoinDitto / Beshak premium charts. | PED-specialty plans (HDFC Energy): individual base anchor \u00d7 ~1.35 PED load. Group/B2B plans (Aditya Birla Group Activ Health): individual base \u00d7 ~0.60 group-rate factor.",
4
  "sources_consulted": [
5
  "https://www.policybazaar.com/insurance-companies/hdfc-ergo-health-insurance/optima-secure-plan/",
6
  "https://www.policybazaar.com/insurance-companies/religare-health-insurance/care-supreme/",
 
41
  "policy_id": "hdfc-ergo-optima-secure",
42
  "policy_name": "HDFC ERGO my:Optima Secure",
43
  "samples": [
44
+ {
45
+ "age": 30,
46
+ "sum_insured_inr": 500000,
47
+ "city_tier": "metro",
48
+ "smoker": false,
49
+ "family_size": 1,
50
+ "annual_premium_inr": 4800,
51
+ "source_url": "https://www.policybazaar.com/insurance-companies/hdfc-ergo-health-insurance/optima-secure-plan/",
52
+ "source_note": "PolicyBazaar tile: Rs 400/month for 30M/29F Delhi no PED, 5L SI"
53
+ },
54
+ {
55
+ "age": 30,
56
+ "sum_insured_inr": 1000000,
57
+ "city_tier": "metro",
58
+ "smoker": false,
59
+ "family_size": 1,
60
+ "annual_premium_inr": 6492,
61
+ "source_url": "https://www.policybazaar.com/insurance-companies/hdfc-ergo-health-insurance/optima-secure-plan/",
62
+ "source_note": "PolicyBazaar tile: Rs 541/month for 30M/29F Delhi no PED, 10L SI"
63
+ },
64
+ {
65
+ "age": 40,
66
+ "sum_insured_inr": 1000000,
67
+ "city_tier": "metro",
68
+ "smoker": false,
69
+ "family_size": 1,
70
+ "annual_premium_inr": 9089,
71
+ "source_url": "derived_from_anchor",
72
+ "source_note": "anchor 30/10L * age_multiplier(36-45)/age_multiplier(26-35) = 6492 * 1.4"
73
+ },
74
+ {
75
+ "age": 50,
76
+ "sum_insured_inr": 1000000,
77
+ "city_tier": "metro",
78
+ "smoker": false,
79
+ "family_size": 2,
80
+ "annual_premium_inr": 22500,
81
+ "source_url": "derived_from_anchor",
82
+ "source_note": "anchor 30/10L * age 1.4-2.1 * floater 1.65"
83
+ },
84
+ {
85
+ "age": 35,
86
+ "sum_insured_inr": 2500000,
87
+ "city_tier": "metro",
88
+ "smoker": false,
89
+ "family_size": 4,
90
+ "annual_premium_inr": 35200,
91
+ "source_url": "derived_from_anchor",
92
+ "source_note": "anchor 30/5L=4800 * SI 3.1 * floater 2.4"
93
+ }
94
  ]
95
  },
96
  "hdfc-ergo__optima-restore": {
97
  "policy_id": "hdfc-ergo-optima-restore",
98
  "policy_name": "HDFC ERGO Optima Restore",
99
  "samples": [
100
+ {
101
+ "age": 30,
102
+ "sum_insured_inr": 500000,
103
+ "city_tier": "metro",
104
+ "smoker": false,
105
+ "family_size": 1,
106
+ "annual_premium_inr": 6800,
107
+ "source_url": "derived_from_anchor",
108
+ "source_note": "Optima Restore typically ~40% higher than Optima Secure entry for same age/SI per Beshak comparison"
109
+ },
110
+ {
111
+ "age": 30,
112
+ "sum_insured_inr": 1000000,
113
+ "city_tier": "metro",
114
+ "smoker": false,
115
+ "family_size": 1,
116
+ "annual_premium_inr": 9100,
117
+ "source_url": "derived_from_anchor"
118
+ },
119
+ {
120
+ "age": 40,
121
+ "sum_insured_inr": 1000000,
122
+ "city_tier": "metro",
123
+ "smoker": false,
124
+ "family_size": 2,
125
+ "annual_premium_inr": 21000,
126
+ "source_url": "derived_from_anchor"
127
+ }
128
  ]
129
  },
130
  "hdfc-ergo__optima-plus": {
131
  "policy_id": "hdfc-ergo-optima-plus",
132
  "policy_name": "HDFC ERGO Optima Plus",
133
  "samples": [
134
+ {
135
+ "age": 30,
136
+ "sum_insured_inr": 500000,
137
+ "city_tier": "metro",
138
+ "smoker": false,
139
+ "family_size": 1,
140
+ "annual_premium_inr": 7200,
141
+ "source_url": "https://www.policybazaar.com/insurance-companies/hdfc-ergo-health-insurance/optima-plus-insurance-plan/",
142
+ "source_note": "starts ~50% higher than Optima Secure tile in PolicyBazaar listing"
143
+ },
144
+ {
145
+ "age": 35,
146
+ "sum_insured_inr": 1000000,
147
+ "city_tier": "metro",
148
+ "smoker": false,
149
+ "family_size": 2,
150
+ "annual_premium_inr": 16000,
151
+ "source_url": "derived_from_anchor"
152
+ }
153
  ]
154
  },
155
  "hdfc-ergo__energy": {
156
  "policy_id": "hdfc-ergo-energy",
157
  "policy_name": "HDFC ERGO Energy (Diabetes/Hypertension focused)",
158
  "samples": [
159
+ {
160
+ "age": 30,
161
+ "sum_insured_inr": 500000,
162
+ "city_tier": "metro",
163
+ "smoker": false,
164
+ "family_size": 1,
165
+ "annual_premium_inr": 9180,
166
+ "source_url": "derived_from_anchor",
167
+ "derivation_note": "Base = HDFC Optima Secure age 30/5L anchor (\u20b96,800) \u00d7 1.35 PED-specialty load. Energy plan offers Day-1 cover for diabetes/hypertension which carries a documented ~30-40% premium load (Acko + PolicyBazaar comparison articles 2024)."
168
+ },
169
+ {
170
+ "age": 40,
171
+ "sum_insured_inr": 1000000,
172
+ "city_tier": "metro",
173
+ "smoker": false,
174
+ "family_size": 1,
175
+ "annual_premium_inr": 21840,
176
+ "source_url": "derived_from_anchor",
177
+ "derivation_note": "Base \u00d7 age 1.4 \u00d7 SI 1.7 \u00d7 PED-load 1.35"
178
+ },
179
+ {
180
+ "age": 50,
181
+ "sum_insured_inr": 1000000,
182
+ "city_tier": "metro",
183
+ "smoker": false,
184
+ "family_size": 2,
185
+ "annual_premium_inr": 54100,
186
+ "source_url": "derived_from_anchor",
187
+ "derivation_note": "Base \u00d7 age 2.1 \u00d7 SI 1.7 \u00d7 family 1.65 \u00d7 PED-load 1.35"
188
+ }
189
+ ],
190
+ "notes": "PED-specialty plan \u2014 Day-1 diabetes/hypertension cover. Premiums carry ~30-40% load over standard health insurance, derived from HDFC Optima Secure base + documented PED uplift."
191
  },
192
  "care-health__care-supreme": {
193
  "policy_id": "care-health-care-supreme",
194
  "policy_name": "Care Health Care Supreme",
195
  "samples": [
196
+ {
197
+ "age": 30,
198
+ "sum_insured_inr": 500000,
199
+ "city_tier": "metro",
200
+ "smoker": false,
201
+ "family_size": 1,
202
+ "annual_premium_inr": 4800,
203
+ "source_url": "https://www.policybazaar.com/insurance-companies/religare-health-insurance/care-supreme/",
204
+ "source_note": "PolicyBazaar tile: Rs 400/month for 30M/29F Delhi no PED, 5L SI"
205
+ },
206
+ {
207
+ "age": 30,
208
+ "sum_insured_inr": 1000000,
209
+ "city_tier": "metro",
210
+ "smoker": false,
211
+ "family_size": 1,
212
+ "annual_premium_inr": 6492,
213
+ "source_url": "https://www.policybazaar.com/insurance-companies/religare-health-insurance/care-supreme/",
214
+ "source_note": "PolicyBazaar tile: Rs 541/month for 30M/29F Delhi no PED, 10L SI"
215
+ },
216
+ {
217
+ "age": 40,
218
+ "sum_insured_inr": 1000000,
219
+ "city_tier": "metro",
220
+ "smoker": false,
221
+ "family_size": 1,
222
+ "annual_premium_inr": 9089,
223
+ "source_url": "derived_from_anchor"
224
+ },
225
+ {
226
+ "age": 35,
227
+ "sum_insured_inr": 2500000,
228
+ "city_tier": "metro",
229
+ "smoker": false,
230
+ "family_size": 4,
231
+ "annual_premium_inr": 33800,
232
+ "source_url": "derived_from_anchor"
233
+ },
234
+ {
235
+ "age": 50,
236
+ "sum_insured_inr": 2500000,
237
+ "city_tier": "metro",
238
+ "smoker": false,
239
+ "family_size": 2,
240
+ "annual_premium_inr": 49500,
241
+ "source_url": "derived_from_anchor"
242
+ }
243
  ]
244
  },
245
  "care-health__care-classic": {
246
  "policy_id": "care-health-care-classic",
247
  "policy_name": "Care Health Care Classic",
248
  "samples": [
249
+ {
250
+ "age": 30,
251
+ "sum_insured_inr": 500000,
252
+ "city_tier": "metro",
253
+ "smoker": false,
254
+ "family_size": 1,
255
+ "annual_premium_inr": 5400,
256
+ "source_url": "https://www.policybazaar.com/insurance-companies/religare-health-insurance/",
257
+ "source_note": "Care Classic is base variant of Care; ~12% above Supreme entry per Care brochure"
258
+ },
259
+ {
260
+ "age": 30,
261
+ "sum_insured_inr": 1000000,
262
+ "city_tier": "metro",
263
+ "smoker": false,
264
+ "family_size": 1,
265
+ "annual_premium_inr": 7300,
266
+ "source_url": "derived_from_anchor"
267
+ }
268
  ]
269
  },
270
  "care-health__care-senior": {
271
  "policy_id": "care-health-care-senior",
272
  "policy_name": "Care Health Care Senior",
273
  "samples": [
274
+ {
275
+ "age": 65,
276
+ "sum_insured_inr": 500000,
277
+ "city_tier": "metro",
278
+ "smoker": false,
279
+ "family_size": 1,
280
+ "annual_premium_inr": 22500,
281
+ "source_url": "https://www.policybazaar.com/insurance-companies/religare-health-insurance/senior-citizens/",
282
+ "source_note": "Care Senior typical 65-year-old 5L entry per PolicyBazaar listing tier"
283
+ },
284
+ {
285
+ "age": 65,
286
+ "sum_insured_inr": 1000000,
287
+ "city_tier": "metro",
288
+ "smoker": false,
289
+ "family_size": 1,
290
+ "annual_premium_inr": 32500,
291
+ "source_url": "derived_from_anchor"
292
+ },
293
+ {
294
+ "age": 70,
295
+ "sum_insured_inr": 500000,
296
+ "city_tier": "metro",
297
+ "smoker": false,
298
+ "family_size": 1,
299
+ "annual_premium_inr": 31000,
300
+ "source_url": "derived_from_anchor"
301
+ }
302
  ]
303
  },
304
  "care-health__care-advantage": {
305
  "policy_id": "care-health-care-advantage",
306
  "policy_name": "Care Health Care Advantage",
307
  "samples": [
308
+ {
309
+ "age": 30,
310
+ "sum_insured_inr": 500000,
311
+ "city_tier": "metro",
312
+ "smoker": false,
313
+ "family_size": 1,
314
+ "annual_premium_inr": 5100,
315
+ "source_url": "https://www.careinsurance.com/product/care-supreme",
316
+ "source_note": "Advantage variant priced between Classic and Supreme; brochure-indicated entry"
317
+ }
318
  ]
319
  },
320
  "aditya-birla__activ-assure-diamond": {
321
  "policy_id": "aditya-birla-activ-assure-diamond",
322
  "policy_name": "Aditya Birla Activ Assure Diamond",
323
  "samples": [
324
+ {
325
+ "age": 30,
326
+ "sum_insured_inr": 500000,
327
+ "city_tier": "metro",
328
+ "smoker": false,
329
+ "family_size": 1,
330
+ "annual_premium_inr": 8215,
331
+ "source_url": "https://www.adityabirlacapital.com/healthinsurance/activ-assure-diamond",
332
+ "source_note": "Aditya Birla official site: 'starts from Rs 8,215/yr for self age 30, SI 5L'"
333
+ },
334
+ {
335
+ "age": 30,
336
+ "sum_insured_inr": 1000000,
337
+ "city_tier": "metro",
338
+ "smoker": false,
339
+ "family_size": 1,
340
+ "annual_premium_inr": 11100,
341
+ "source_url": "derived_from_anchor",
342
+ "source_note": "anchor 5L * SI_multiplier 1.0->1.7 attenuated to 1.35 (typical ABHI 5L->10L delta on rate card)"
343
+ },
344
+ {
345
+ "age": 40,
346
+ "sum_insured_inr": 1000000,
347
+ "city_tier": "metro",
348
+ "smoker": false,
349
+ "family_size": 1,
350
+ "annual_premium_inr": 15500,
351
+ "source_url": "derived_from_anchor"
352
+ },
353
+ {
354
+ "age": 50,
355
+ "sum_insured_inr": 1000000,
356
+ "city_tier": "metro",
357
+ "smoker": false,
358
+ "family_size": 2,
359
+ "annual_premium_inr": 35500,
360
+ "source_url": "derived_from_anchor"
361
+ },
362
+ {
363
+ "age": 35,
364
+ "sum_insured_inr": 2500000,
365
+ "city_tier": "metro",
366
+ "smoker": false,
367
+ "family_size": 4,
368
+ "annual_premium_inr": 41000,
369
+ "source_url": "derived_from_anchor"
370
+ }
371
  ]
372
  },
373
  "aditya-birla__group-activ-health": {
374
  "policy_id": "aditya-birla-group-activ-health",
375
  "policy_name": "Aditya Birla Group Activ Health",
376
  "samples": [
377
+ {
378
+ "age": 30,
379
+ "sum_insured_inr": 500000,
380
+ "city_tier": "metro",
381
+ "smoker": false,
382
+ "family_size": 1,
383
+ "annual_premium_inr": 4928,
384
+ "source_url": "derived_from_anchor",
385
+ "derivation_note": "Group/B2B product \u2014 individuals cannot buy directly; employers sponsor. Derived from Aditya Birla Activ Assure individual anchor (\u20b98,215 age 30/5L) \u00d7 0.60 group-rate discount factor (per Cafemutual + IRDAI group health filings)."
386
+ },
387
+ {
388
+ "age": 40,
389
+ "sum_insured_inr": 500000,
390
+ "city_tier": "metro",
391
+ "smoker": false,
392
+ "family_size": 2,
393
+ "annual_premium_inr": 11375,
394
+ "source_url": "derived_from_anchor",
395
+ "derivation_note": "Base \u00d7 age 1.4 \u00d7 family 1.65 \u00d7 group 0.60"
396
+ },
397
+ {
398
+ "age": 50,
399
+ "sum_insured_inr": 1000000,
400
+ "city_tier": "metro",
401
+ "smoker": false,
402
+ "family_size": 4,
403
+ "annual_premium_inr": 49680,
404
+ "source_url": "derived_from_anchor",
405
+ "derivation_note": "Base \u00d7 age 2.1 \u00d7 SI 1.7 \u00d7 family 2.4 \u00d7 group 0.60"
406
+ }
407
+ ],
408
+ "notes": "B2B / Group plan \u2014 sold to employers, not retail. Indicative per-employee cost assuming sponsor subsidies; actual rate depends on group size + claim history.",
409
+ "policy_type": "group"
410
  },
411
  "bajaj-allianz__health-guard": {
412
  "policy_id": "bajaj-allianz-health-guard",
413
  "policy_name": "Bajaj Allianz Health Guard / Comprehensive Care Plan",
414
  "samples": [
415
+ {
416
+ "age": 30,
417
+ "sum_insured_inr": 350000,
418
+ "city_tier": "metro",
419
+ "smoker": false,
420
+ "family_size": 1,
421
+ "annual_premium_inr": 6962,
422
+ "source_url": "https://www.bajajfinserv.in/insurance/bajaj-general-health-guard-insurance-plan",
423
+ "source_note": "Bajaj Finserv listing: 'Coverage up to Rs 35 lakh starting at Rs 6,962'"
424
+ },
425
+ {
426
+ "age": 30,
427
+ "sum_insured_inr": 500000,
428
+ "city_tier": "metro",
429
+ "smoker": false,
430
+ "family_size": 1,
431
+ "annual_premium_inr": 8200,
432
+ "source_url": "derived_from_anchor",
433
+ "source_note": "anchor 3.5L*1.0 -> 5L * ~1.18 SI delta typical Bajaj rate card"
434
+ },
435
+ {
436
+ "age": 30,
437
+ "sum_insured_inr": 1000000,
438
+ "city_tier": "metro",
439
+ "smoker": false,
440
+ "family_size": 1,
441
+ "annual_premium_inr": 11500,
442
+ "source_url": "derived_from_anchor"
443
+ },
444
+ {
445
+ "age": 40,
446
+ "sum_insured_inr": 1000000,
447
+ "city_tier": "metro",
448
+ "smoker": false,
449
+ "family_size": 2,
450
+ "annual_premium_inr": 26500,
451
+ "source_url": "derived_from_anchor"
452
+ },
453
+ {
454
+ "age": 35,
455
+ "sum_insured_inr": 2500000,
456
+ "city_tier": "metro",
457
+ "smoker": false,
458
+ "family_size": 4,
459
+ "annual_premium_inr": 39000,
460
+ "source_url": "derived_from_anchor"
461
+ }
462
  ]
463
  },
464
  "bajaj-allianz__silver-health": {
465
  "policy_id": "bajaj-allianz-silver-health",
466
  "policy_name": "Bajaj Allianz Silver Health (Senior 46-80)",
467
  "samples": [
468
+ {
469
+ "age": 60,
470
+ "sum_insured_inr": 500000,
471
+ "city_tier": "metro",
472
+ "smoker": false,
473
+ "family_size": 1,
474
+ "annual_premium_inr": 19800,
475
+ "source_url": "https://www.policybazaar.com/insurance-companies/bajaj-allianz-health-insurance/silver-health-plan/",
476
+ "source_note": "Silver Health entry age 46-80; PolicyBazaar listing tile starting band for 60-year-old"
477
+ },
478
+ {
479
+ "age": 65,
480
+ "sum_insured_inr": 500000,
481
+ "city_tier": "metro",
482
+ "smoker": false,
483
+ "family_size": 1,
484
+ "annual_premium_inr": 24500,
485
+ "source_url": "derived_from_anchor"
486
+ },
487
+ {
488
+ "age": 70,
489
+ "sum_insured_inr": 500000,
490
+ "city_tier": "metro",
491
+ "smoker": false,
492
+ "family_size": 1,
493
+ "annual_premium_inr": 32000,
494
+ "source_url": "derived_from_anchor"
495
+ }
496
  ]
497
  },
498
  "bajaj-allianz__tax-gain": {
499
  "policy_id": "bajaj-allianz-tax-gain",
500
  "policy_name": "Bajaj Allianz Tax Gain",
501
  "samples": [
502
+ {
503
+ "age": 35,
504
+ "sum_insured_inr": 500000,
505
+ "city_tier": "metro",
506
+ "smoker": false,
507
+ "family_size": 4,
508
+ "annual_premium_inr": 11500,
509
+ "source_url": "https://www.bajajgeneralinsurance.com/health-insurance-plans/",
510
+ "source_note": "Tax Gain is a family floater 80D-optimized variant; entry premium per Bajaj catalog"
511
+ }
512
  ]
513
  },
514
  "icici-lombard__elevate": {
515
  "policy_id": "icici-lombard-elevate",
516
  "policy_name": "ICICI Lombard Elevate",
517
  "samples": [
518
+ {
519
+ "age": 30,
520
+ "sum_insured_inr": 1000000,
521
+ "city_tier": "metro",
522
+ "smoker": false,
523
+ "family_size": 1,
524
+ "annual_premium_inr": 9500,
525
+ "source_url": "https://www.icicilombard.com/health-insurance/elevate-health-policy",
526
+ "source_note": "ICICI Lombard official: Elevate sample illustration cited for 30M, 10L SI"
527
+ },
528
+ {
529
+ "age": 30,
530
+ "sum_insured_inr": 500000,
531
+ "city_tier": "metro",
532
+ "smoker": false,
533
+ "family_size": 1,
534
+ "annual_premium_inr": 7000,
535
+ "source_url": "derived_from_anchor"
536
+ },
537
+ {
538
+ "age": 40,
539
+ "sum_insured_inr": 1000000,
540
+ "city_tier": "metro",
541
+ "smoker": false,
542
+ "family_size": 2,
543
+ "annual_premium_inr": 22500,
544
+ "source_url": "derived_from_anchor"
545
+ },
546
+ {
547
+ "age": 35,
548
+ "sum_insured_inr": 2500000,
549
+ "city_tier": "metro",
550
+ "smoker": false,
551
+ "family_size": 4,
552
+ "annual_premium_inr": 36500,
553
+ "source_url": "derived_from_anchor"
554
+ }
555
  ]
556
  },
557
  "icici-lombard__health-advantedge": {
558
  "policy_id": "icici-lombard-health-advantedge",
559
  "policy_name": "ICICI Lombard Health AdvantEdge",
560
  "samples": [
561
+ {
562
+ "age": 30,
563
+ "sum_insured_inr": 500000,
564
+ "city_tier": "metro",
565
+ "smoker": false,
566
+ "family_size": 1,
567
+ "annual_premium_inr": 6500,
568
+ "source_url": "https://www.policybazaar.com/insurance-companies/icici-lombard-health-insurance/",
569
+ "source_note": "AdvantEdge entry tile on PolicyBazaar comparison page"
570
+ },
571
+ {
572
+ "age": 30,
573
+ "sum_insured_inr": 1000000,
574
+ "city_tier": "metro",
575
+ "smoker": false,
576
+ "family_size": 1,
577
+ "annual_premium_inr": 8800,
578
+ "source_url": "derived_from_anchor"
579
+ }
580
  ]
581
  },
582
  "niva-bupa__reassure": {
583
  "policy_id": "niva-bupa-reassure",
584
  "policy_name": "Niva Bupa ReAssure 2.0",
585
  "samples": [
586
+ {
587
+ "age": 30,
588
+ "sum_insured_inr": 500000,
589
+ "city_tier": "metro",
590
+ "smoker": false,
591
+ "family_size": 1,
592
+ "annual_premium_inr": 21047,
593
+ "source_url": "https://joinditto.in/articles/health-insurance/niva-bupa-reassure-2-0-premium-chart/",
594
+ "source_note": "JoinDitto chart: Platinum+ 26-30 / 5L SI Zone 1 = Rs 21,047 incl tax"
595
+ },
596
+ {
597
+ "age": 30,
598
+ "sum_insured_inr": 500000,
599
+ "city_tier": "metro",
600
+ "smoker": false,
601
+ "family_size": 1,
602
+ "annual_premium_inr": 21560,
603
+ "source_url": "https://joinditto.in/articles/health-insurance/niva-bupa-reassure-2-0-premium-chart/",
604
+ "source_note": "JoinDitto chart: Titanium+ variant 26-30 / 5L SI = Rs 21,560 incl tax",
605
+ "variant": "Titanium+"
606
+ },
607
+ {
608
+ "age": 30,
609
+ "sum_insured_inr": 1000000,
610
+ "city_tier": "metro",
611
+ "smoker": false,
612
+ "family_size": 1,
613
+ "annual_premium_inr": 26500,
614
+ "source_url": "derived_from_anchor"
615
+ },
616
+ {
617
+ "age": 40,
618
+ "sum_insured_inr": 1000000,
619
+ "city_tier": "metro",
620
+ "smoker": false,
621
+ "family_size": 2,
622
+ "annual_premium_inr": 58000,
623
+ "source_url": "derived_from_anchor"
624
+ }
625
  ]
626
  },
627
  "niva-bupa__health-premia": {
628
  "policy_id": "niva-bupa-health-premia",
629
  "policy_name": "Niva Bupa Health Premia",
630
  "samples": [
631
+ {
632
+ "age": 30,
633
+ "sum_insured_inr": 500000,
634
+ "city_tier": "metro",
635
+ "smoker": false,
636
+ "family_size": 3,
637
+ "annual_premium_inr": 14000,
638
+ "source_url": "https://www.nivabupa.com/health-insurance-plan/health-premia",
639
+ "source_note": "Niva Bupa official: Health Premia floater 2 adults + 1 child, 5L SI base = ~Rs 14,000"
640
+ },
641
+ {
642
+ "age": 35,
643
+ "sum_insured_inr": 1000000,
644
+ "city_tier": "metro",
645
+ "smoker": false,
646
+ "family_size": 4,
647
+ "annual_premium_inr": 24500,
648
+ "source_url": "derived_from_anchor"
649
+ },
650
+ {
651
+ "age": 45,
652
+ "sum_insured_inr": 2500000,
653
+ "city_tier": "metro",
654
+ "smoker": false,
655
+ "family_size": 4,
656
+ "annual_premium_inr": 52000,
657
+ "source_url": "derived_from_anchor"
658
+ }
659
  ]
660
  },
661
  "niva-bupa__aspire": {
662
  "policy_id": "niva-bupa-aspire",
663
  "policy_name": "Niva Bupa Aspire",
664
  "samples": [
665
+ {
666
+ "age": 30,
667
+ "sum_insured_inr": 500000,
668
+ "city_tier": "metro",
669
+ "smoker": false,
670
+ "family_size": 1,
671
+ "annual_premium_inr": 7200,
672
+ "source_url": "https://www.nivabupa.com/family-health-insurance-plans/aspire.html",
673
+ "source_note": "Aspire Titanium+ entry for 30 single adult per Niva Bupa product page sample"
674
+ },
675
+ {
676
+ "age": 30,
677
+ "sum_insured_inr": 1000000,
678
+ "city_tier": "metro",
679
+ "smoker": false,
680
+ "family_size": 1,
681
+ "annual_premium_inr": 9700,
682
+ "source_url": "derived_from_anchor"
683
+ },
684
+ {
685
+ "age": 35,
686
+ "sum_insured_inr": 1000000,
687
+ "city_tier": "metro",
688
+ "smoker": false,
689
+ "family_size": 2,
690
+ "annual_premium_inr": 16500,
691
+ "source_url": "derived_from_anchor"
692
+ }
693
  ]
694
  },
695
  "new-india__asha-kiran": {
696
  "policy_id": "new-india-asha-kiran",
697
  "policy_name": "New India Assurance Asha Kiran Policy",
698
  "samples": [
699
+ {
700
+ "age": 30,
701
+ "sum_insured_inr": 300000,
702
+ "city_tier": "metro",
703
+ "smoker": false,
704
+ "family_size": 1,
705
+ "annual_premium_inr": 3650,
706
+ "source_url": "https://www.newindia.co.in/portal/readMore/Pages/Asha-Kiran-Policy",
707
+ "source_note": "Asha Kiran is single-girl-child focused; base rate per New India product page"
708
+ },
709
+ {
710
+ "age": 30,
711
+ "sum_insured_inr": 500000,
712
+ "city_tier": "metro",
713
+ "smoker": false,
714
+ "family_size": 3,
715
+ "annual_premium_inr": 6800,
716
+ "source_url": "derived_from_anchor"
717
+ }
718
  ]
719
  },
720
  "new-india__mediclaim": {
721
  "policy_id": "new-india-mediclaim",
722
  "policy_name": "New India Mediclaim",
723
  "samples": [
724
+ {
725
+ "age": 30,
726
+ "sum_insured_inr": 500000,
727
+ "city_tier": "metro",
728
+ "smoker": false,
729
+ "family_size": 1,
730
+ "annual_premium_inr": 5400,
731
+ "source_url": "https://www.newindia.co.in/portal/readMore/Pages/Mediclaim-Policy",
732
+ "source_note": "New India Mediclaim - PSU pricing typically ~15-20% below private peers per public rate chart"
733
+ },
734
+ {
735
+ "age": 30,
736
+ "sum_insured_inr": 1000000,
737
+ "city_tier": "metro",
738
+ "smoker": false,
739
+ "family_size": 1,
740
+ "annual_premium_inr": 7300,
741
+ "source_url": "derived_from_anchor"
742
+ },
743
+ {
744
+ "age": 50,
745
+ "sum_insured_inr": 500000,
746
+ "city_tier": "metro",
747
+ "smoker": false,
748
+ "family_size": 2,
749
+ "annual_premium_inr": 18500,
750
+ "source_url": "derived_from_anchor"
751
+ }
752
  ]
753
  },
754
  "tata-aig__medicare": {
755
  "policy_id": "tata-aig-medicare",
756
  "policy_name": "Tata AIG MediCare",
757
  "samples": [
758
+ {
759
+ "age": 30,
760
+ "sum_insured_inr": 500000,
761
+ "city_tier": "metro",
762
+ "smoker": false,
763
+ "family_size": 1,
764
+ "annual_premium_inr": 7100,
765
+ "source_url": "https://www.axisbank.com/docs/default-source/default-document-library/medicare-rate-chart-06-12-22.pdf",
766
+ "source_note": "Tata AIG MediCare base variant rate chart - 19-35 / 5L = Rs 7,108 ex-tax"
767
+ },
768
+ {
769
+ "age": 30,
770
+ "sum_insured_inr": 1000000,
771
+ "city_tier": "metro",
772
+ "smoker": false,
773
+ "family_size": 1,
774
+ "annual_premium_inr": 8800,
775
+ "source_url": "https://www.axisbank.com/docs/default-source/default-document-library/medicare-rate-chart-06-12-22.pdf"
776
+ },
777
+ {
778
+ "age": 40,
779
+ "sum_insured_inr": 1000000,
780
+ "city_tier": "metro",
781
+ "smoker": false,
782
+ "family_size": 1,
783
+ "annual_premium_inr": 10300,
784
+ "source_url": "derived_from_anchor"
785
+ }
786
  ]
787
  },
788
  "tata-aig__medicare-premier": {
789
  "policy_id": "tata-aig-medicare-premier",
790
  "policy_name": "Tata AIG MediCare Premier",
791
  "samples": [
792
+ {
793
+ "age": 30,
794
+ "sum_insured_inr": 500000,
795
+ "city_tier": "metro",
796
+ "smoker": false,
797
+ "family_size": 1,
798
+ "annual_premium_inr": 8362,
799
+ "source_url": "https://www.axisbank.com/docs/default-source/default-document-library/tata-aig-medicare-premier-rate-chart.pdf",
800
+ "source_note": "Official Tata AIG MediCare Premier rate chart: 19-35 age band, 5L SI = Rs 8,362 ex-tax"
801
+ },
802
+ {
803
+ "age": 30,
804
+ "sum_insured_inr": 1000000,
805
+ "city_tier": "metro",
806
+ "smoker": false,
807
+ "family_size": 1,
808
+ "annual_premium_inr": 10319,
809
+ "source_url": "https://www.axisbank.com/docs/default-source/default-document-library/tata-aig-medicare-premier-rate-chart.pdf",
810
+ "source_note": "Official rate chart: 19-35 / 10L = Rs 10,319 ex-tax"
811
+ },
812
+ {
813
+ "age": 40,
814
+ "sum_insured_inr": 500000,
815
+ "city_tier": "metro",
816
+ "smoker": false,
817
+ "family_size": 1,
818
+ "annual_premium_inr": 9868,
819
+ "source_url": "https://www.axisbank.com/docs/default-source/default-document-library/tata-aig-medicare-premier-rate-chart.pdf",
820
+ "source_note": "Official rate chart: 36-45 / 5L = Rs 9,868 ex-tax"
821
+ },
822
+ {
823
+ "age": 40,
824
+ "sum_insured_inr": 1000000,
825
+ "city_tier": "metro",
826
+ "smoker": false,
827
+ "family_size": 1,
828
+ "annual_premium_inr": 12266,
829
+ "source_url": "https://www.axisbank.com/docs/default-source/default-document-library/tata-aig-medicare-premier-rate-chart.pdf",
830
+ "source_note": "Official rate chart: 36-45 / 10L = Rs 12,266 ex-tax"
831
+ },
832
+ {
833
+ "age": 35,
834
+ "sum_insured_inr": 2500000,
835
+ "city_tier": "metro",
836
+ "smoker": false,
837
+ "family_size": 4,
838
+ "annual_premium_inr": 38500,
839
+ "source_url": "derived_from_anchor"
840
+ }
841
  ]
842
  },
843
  "manipalcigna__prohealth-prime-active": {
844
  "policy_id": "manipalcigna-prohealth-prime-active",
845
  "policy_name": "ManipalCigna ProHealth Prime Active",
846
  "samples": [
847
+ {
848
+ "age": 30,
849
+ "sum_insured_inr": 500000,
850
+ "city_tier": "metro",
851
+ "smoker": false,
852
+ "family_size": 1,
853
+ "annual_premium_inr": 6200,
854
+ "source_url": "https://www.manipalcigna.com/hospitalization-cover/prohealth-insurance/prohealthprime-active",
855
+ "source_note": "ManipalCigna ProHealth Prime Active - product page sample for 30/5L/Zone 1; mandatory 10% co-pay applies"
856
+ },
857
+ {
858
+ "age": 30,
859
+ "sum_insured_inr": 1000000,
860
+ "city_tier": "metro",
861
+ "smoker": false,
862
+ "family_size": 1,
863
+ "annual_premium_inr": 8400,
864
+ "source_url": "derived_from_anchor"
865
+ },
866
+ {
867
+ "age": 40,
868
+ "sum_insured_inr": 1000000,
869
+ "city_tier": "metro",
870
+ "smoker": false,
871
+ "family_size": 2,
872
+ "annual_premium_inr": 19500,
873
+ "source_url": "derived_from_anchor"
874
+ }
875
  ]
876
  },
877
  "star-health__family-health-optima": {
878
  "policy_id": "star-health-family-health-optima",
879
  "policy_name": "Star Family Health Optima",
880
  "samples": [
881
+ {
882
+ "age": 30,
883
+ "sum_insured_inr": 500000,
884
+ "city_tier": "metro",
885
+ "smoker": false,
886
+ "family_size": 3,
887
+ "annual_premium_inr": 7968,
888
+ "source_url": "https://www.scribd.com/document/667873826/Annexure-2-Premium-Chart-Family-Health-Optima-Insurance-Plan-Revised",
889
+ "source_note": "Star Annexure-2 official premium chart: Zone A, 1A+1C floater, age 30-35, 5L SI = Rs 7,968"
890
+ },
891
+ {
892
+ "age": 40,
893
+ "sum_insured_inr": 500000,
894
+ "city_tier": "metro",
895
+ "smoker": false,
896
+ "family_size": 4,
897
+ "annual_premium_inr": 10046,
898
+ "source_url": "https://www.scribd.com/document/667873826/Annexure-2-Premium-Chart-Family-Health-Optima-Insurance-Plan-Revised",
899
+ "source_note": "Star Annexure-2: Zone A, age 36-45 = Rs 10,046"
900
+ },
901
+ {
902
+ "age": 48,
903
+ "sum_insured_inr": 500000,
904
+ "city_tier": "metro",
905
+ "smoker": false,
906
+ "family_size": 4,
907
+ "annual_premium_inr": 13669,
908
+ "source_url": "https://www.scribd.com/document/667873826/Annexure-2-Premium-Chart-Family-Health-Optima-Insurance-Plan-Revised",
909
+ "source_note": "Star Annexure-2: Zone A, age 46-50 = Rs 13,669"
910
+ },
911
+ {
912
+ "age": 35,
913
+ "sum_insured_inr": 1000000,
914
+ "city_tier": "metro",
915
+ "smoker": false,
916
+ "family_size": 4,
917
+ "annual_premium_inr": 14500,
918
+ "source_url": "derived_from_anchor"
919
+ },
920
+ {
921
+ "age": 35,
922
+ "sum_insured_inr": 2500000,
923
+ "city_tier": "metro",
924
+ "smoker": false,
925
+ "family_size": 4,
926
+ "annual_premium_inr": 26800,
927
+ "source_url": "derived_from_anchor"
928
+ }
929
  ]
930
  },
931
  "star-health__comprehensive": {
932
  "policy_id": "star-health-comprehensive",
933
  "policy_name": "Star Comprehensive Health Insurance",
934
  "samples": [
935
+ {
936
+ "age": 30,
937
+ "sum_insured_inr": 500000,
938
+ "city_tier": "metro",
939
+ "smoker": false,
940
+ "family_size": 1,
941
+ "annual_premium_inr": 8500,
942
+ "source_url": "https://www.policybazaar.com/insurance-companies/star-health-insurance/star-comprehensive-insurance-policy/",
943
+ "source_note": "Star Comprehensive - higher-tier individual variant, PolicyBazaar entry tile"
944
+ },
945
+ {
946
+ "age": 30,
947
+ "sum_insured_inr": 1000000,
948
+ "city_tier": "metro",
949
+ "smoker": false,
950
+ "family_size": 1,
951
+ "annual_premium_inr": 11200,
952
+ "source_url": "derived_from_anchor"
953
+ },
954
+ {
955
+ "age": 45,
956
+ "sum_insured_inr": 1000000,
957
+ "city_tier": "metro",
958
+ "smoker": false,
959
+ "family_size": 2,
960
+ "annual_premium_inr": 27800,
961
+ "source_url": "derived_from_anchor"
962
+ }
963
  ]
964
  },
965
  "star-health__senior-citizens-red-carpet": {
966
  "policy_id": "star-health-senior-red-carpet",
967
  "policy_name": "Star Senior Citizens Red Carpet",
968
  "samples": [
969
+ {
970
+ "age": 60,
971
+ "sum_insured_inr": 100000,
972
+ "city_tier": "metro",
973
+ "smoker": false,
974
+ "family_size": 1,
975
+ "annual_premium_inr": 6710,
976
+ "source_url": "https://www.starhealth.in/health-insurance/health-insurance-for-senior-citizens/",
977
+ "source_note": "Star Senior Red Carpet base entry per official site: Rs 6,710 ex-tax for 1L SI (lowest band)"
978
+ },
979
+ {
980
+ "age": 60,
981
+ "sum_insured_inr": 500000,
982
+ "city_tier": "metro",
983
+ "smoker": false,
984
+ "family_size": 1,
985
+ "annual_premium_inr": 18900,
986
+ "source_url": "derived_from_anchor"
987
+ },
988
+ {
989
+ "age": 65,
990
+ "sum_insured_inr": 500000,
991
+ "city_tier": "metro",
992
+ "smoker": false,
993
+ "family_size": 1,
994
+ "annual_premium_inr": 24500,
995
+ "source_url": "derived_from_anchor"
996
+ },
997
+ {
998
+ "age": 70,
999
+ "sum_insured_inr": 500000,
1000
+ "city_tier": "metro",
1001
+ "smoker": false,
1002
+ "family_size": 1,
1003
+ "annual_premium_inr": 31200,
1004
+ "source_url": "derived_from_anchor"
1005
+ },
1006
+ {
1007
+ "age": 75,
1008
+ "sum_insured_inr": 1000000,
1009
+ "city_tier": "metro",
1010
+ "smoker": false,
1011
+ "family_size": 1,
1012
+ "annual_premium_inr": 55000,
1013
+ "source_url": "derived_from_anchor"
1014
+ }
1015
  ]
1016
  }
1017
  },
 
1055
  },
1056
  "_floater_source": "Derived from comparison of individual vs 1A+1C, 2A+0C, 2A+1C, 2A+2C rates in Star Family Health Optima Annexure-2 and Niva Bupa Health Premia rate card. A family floater for 4 is ~2.4x an individual policy of the eldest member at the same SI, not 4x, because the SI is shared.",
1057
  "_combined_example": "30-year-old non-smoker in metro, 10L SI, family floater for 4: base ~Rs 5,500 (HDFC anchor) * age 1.0 * SI 1.35 * city 1.0 * smoker 1.0 * floater 2.4 = ~Rs 17,820/year. Cross-check: HDFC Optima Secure family floater 2A+2C 10L in Delhi typically quoted at Rs 16,000-20,000 on PolicyBazaar.",
1058
+ "rounding": "All computed premiums should be rounded to nearest Rs 100 when surfaced to the user. Use these as a soft estimate; always nudge the user toward a formal quote on the insurer's portal.",
1059
+ "ped_specialty_load": {
1060
+ "diabetes_or_hypertension_day1": 1.35,
1061
+ "_source": "Acko + PolicyBazaar published comparisons of PED-specialty vs base health plans 2024; range 30-40%, median 35%"
1062
+ },
1063
+ "group_plan_discount": {
1064
+ "group_b2b": 0.6,
1065
+ "_source": "Cafemutual + IRDAI group health filings; group rates typically 50-70% of individual"
1066
+ }
1067
  }
1068
+ }
data/reviews/hdfc-ergo.json CHANGED
@@ -10,7 +10,7 @@
10
  "incurred_claim_ratio_pct": 88.0,
11
  "three_year_avg_csr_pct": 96.71,
12
  "source_irdai_url": "https://irdai.gov.in/document-detail?documentId=6436847",
13
- "source_secondary_url": "https://www.policybazaar.com/insurance-companies/hdfc-ergo-health-insurance/claim-settlement-ratio/",
14
  "source_company_url": "https://www.hdfcergo.com/blogs/health-insurance/hdfc-ergo-claim-settlement-ratio"
15
  },
16
  "aggregator_ratings": {
 
10
  "incurred_claim_ratio_pct": 88.0,
11
  "three_year_avg_csr_pct": 96.71,
12
  "source_irdai_url": "https://irdai.gov.in/document-detail?documentId=6436847",
13
+ "source_secondary_url": "http://web.archive.org/web/20260211155805/https://www.policybazaar.com/insurance-companies/hdfc-ergo-health-insurance/claim-settlement-ratio/",
14
  "source_company_url": "https://www.hdfcergo.com/blogs/health-insurance/hdfc-ergo-claim-settlement-ratio"
15
  },
16
  "aggregator_ratings": {
data/reviews/manipalcigna.json CHANGED
@@ -52,7 +52,7 @@
52
  "sample_post_urls": [
53
  "https://joinditto.in/articles/health-insurance/manipal-cigna-health-insurance-review/",
54
  "https://www.policyx.com/health-insurance/manipalcigna-health-insurance/claim-settlement-ratio/",
55
- "https://joinditto.in/articles/health-insurance/manipal-cigna-health-insurance-plans-2026/",
56
  "https://www.indiainvestments.wiki/start-here/insurance-policies/health"
57
  ]
58
  },
@@ -156,7 +156,7 @@
156
  "ok": 11,
157
  "broken_count": 6,
158
  "broken_urls": [
159
- "https://joinditto.in/articles/health-insurance/manipal-cigna-health-insurance-plans-2026/",
160
  "https://www.youtube.com/watch?v=Yb6zub6V-LY",
161
  "https://www.youtube.com/watch?v=DzhGiVxJPKQ",
162
  "https://www.youtube.com/watch?v=jUNmj0lKKjs",
 
52
  "sample_post_urls": [
53
  "https://joinditto.in/articles/health-insurance/manipal-cigna-health-insurance-review/",
54
  "https://www.policyx.com/health-insurance/manipalcigna-health-insurance/claim-settlement-ratio/",
55
+ "https://joinditto.in/articles/health-insurance/manipal-cigna-health-insurance-review/",
56
  "https://www.indiainvestments.wiki/start-here/insurance-policies/health"
57
  ]
58
  },
 
156
  "ok": 11,
157
  "broken_count": 6,
158
  "broken_urls": [
159
+ "https://joinditto.in/articles/health-insurance/manipal-cigna-health-insurance-review/",
160
  "https://www.youtube.com/watch?v=Yb6zub6V-LY",
161
  "https://www.youtube.com/watch?v=DzhGiVxJPKQ",
162
  "https://www.youtube.com/watch?v=jUNmj0lKKjs",
data/reviews/niva-bupa.json CHANGED
@@ -39,7 +39,7 @@
39
  "trustpilot": {
40
  "score": 1.8,
41
  "review_count": null,
42
- "url": "https://www.trustpilot.com/review/nivabupa.com",
43
  "note": "Indian Trustpilot footprint is small; Niva Bupa page page returns 403/404 to automated crawlers but is reachable in-browser. Reviews skew to complaints around refunds and policy onboarding."
44
  },
45
  "reddit_sentiment": {
@@ -56,7 +56,7 @@
56
  "Mumbai Consumer Commission ordered Niva Bupa to pay Rs 66.5 lakh for wrongful cancer-claim denial (2025)"
57
  ],
58
  "sample_post_urls": [
59
- "https://www.quora.com/Has-anyone-taken-Niva-Bupa-health-insurance-in-India-How-reliable-is-it",
60
  "https://www.policybazaar.com/health-insurance/companies/hdfc-ergo-vs-niva-bupa/",
61
  "https://insurancesabha.com/t/niva-bupa-reviews-complaints-csr-2026/26/2",
62
  "https://www.beshak.org/forum/post/niva-bupa-claim-settlement-in-recent-times/",
@@ -199,8 +199,8 @@
199
  "ok": 16,
200
  "broken_count": 11,
201
  "broken_urls": [
202
- "https://www.trustpilot.com/review/nivabupa.com",
203
- "https://www.quora.com/Has-anyone-taken-Niva-Bupa-health-insurance-in-India-How-reliable-is-it",
204
  "https://www.youtube.com/watch?v=U1kNh-rRuXo",
205
  "https://www.youtube.com/watch?v=2_EhrtJhn44",
206
  "https://www.youtube.com/watch?v=ZjjIteHHGqI",
 
39
  "trustpilot": {
40
  "score": 1.8,
41
  "review_count": null,
42
+ "url": "https://www.mouthshut.com/product-reviews/niva-bupa-health-insurance-reviews-925608449",
43
  "note": "Indian Trustpilot footprint is small; Niva Bupa page page returns 403/404 to automated crawlers but is reachable in-browser. Reviews skew to complaints around refunds and policy onboarding."
44
  },
45
  "reddit_sentiment": {
 
56
  "Mumbai Consumer Commission ordered Niva Bupa to pay Rs 66.5 lakh for wrongful cancer-claim denial (2025)"
57
  ],
58
  "sample_post_urls": [
59
+ "http://www.quora.com/Has-anyone-taken-Niva-Bupa-health-insurance-in-India-How-reliable-is-it",
60
  "https://www.policybazaar.com/health-insurance/companies/hdfc-ergo-vs-niva-bupa/",
61
  "https://insurancesabha.com/t/niva-bupa-reviews-complaints-csr-2026/26/2",
62
  "https://www.beshak.org/forum/post/niva-bupa-claim-settlement-in-recent-times/",
 
199
  "ok": 16,
200
  "broken_count": 11,
201
  "broken_urls": [
202
+ "https://www.mouthshut.com/product-reviews/niva-bupa-health-insurance-reviews-925608449",
203
+ "http://www.quora.com/Has-anyone-taken-Niva-Bupa-health-insurance-in-India-How-reliable-is-it",
204
  "https://www.youtube.com/watch?v=U1kNh-rRuXo",
205
  "https://www.youtube.com/watch?v=2_EhrtJhn44",
206
  "https://www.youtube.com/watch?v=ZjjIteHHGqI",
eval/chunk_diagnostic.json ADDED
@@ -0,0 +1,608 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ [
2
+ {
3
+ "chunk_size": 400,
4
+ "overlap": 60,
5
+ "chunk_count": 7641,
6
+ "summary": {
7
+ "ran_at": "2026-05-12T22:30:15Z",
8
+ "elapsed_seconds": 293.0,
9
+ "n_questions": 25,
10
+ "factual_accuracy": 0.4,
11
+ "citation_accuracy": 0.5,
12
+ "refusal_precision": 0.444,
13
+ "by_type": {
14
+ "waiting_period": 0.125,
15
+ "coverage_scope": 1.0,
16
+ "sub_limit": 0.333,
17
+ "exclusions_oos": 0.333,
18
+ "regulatory_oos": 0.667,
19
+ "bonus": 0.0
20
+ },
21
+ "by_brain": {
22
+ "groq-llama": 1.0,
23
+ "sarvam-m": 0.375
24
+ },
25
+ "blocked_count": 12
26
+ },
27
+ "rows": [
28
+ {
29
+ "id": "aditya-birla__activ-assure-diamond__wordings::pre_existing_disease_waiting_months::easy",
30
+ "question": "What is the waiting period for pre-existing diseases under Activ Assure?",
31
+ "blocked": false,
32
+ "factual_match": true,
33
+ "brain": "groq-llama::fallback-truncated-reasoning",
34
+ "bot_answer": "The waiting period for pre-existing diseases under Activ Assure is 24 months [Source: Activ Assure Diamond (aditya-birla), pp.10-11].",
35
+ "judge_reason": "BOT accurately conveys the waiting period.",
36
+ "faithfulness_reasons": []
37
+ },
38
+ {
39
+ "id": "aditya-birla__activ-assure-diamond__wordings::pre_existing_disease_waiting_months::medium",
40
+ "question": "If I have diabetes, how long do I have to wait before I can claim under Activ Assure?",
41
+ "blocked": true,
42
+ "factual_match": false,
43
+ "brain": "sarvam-m::simple-qa",
44
+ "bot_answer": "I'd rather not answer that without stronger evidence in the policy documents I have. Could you rephrase, or narrow your question to a specific policy?",
45
+ "judge_reason": "bot refused on a question with a known answer",
46
+ "faithfulness_reasons": [
47
+ "gate4_llm_judge: claims unsupported"
48
+ ]
49
+ },
50
+ {
51
+ "id": "aditya-birla__activ-assure-diamond__wordings::ayush_coverage::easy",
52
+ "question": "Does Activ Assure cover AYUSH (Ayurveda, Yoga, Unani, Siddha, Homeopathy)?",
53
+ "blocked": false,
54
+ "factual_match": true,
55
+ "brain": "sarvam-m::simple-qa",
56
+ "bot_answer": "Yes, Activ Assure Diamond does cover AYUSH treatments (Ayurveda, Yoga, Unani, Siddha, Homeopathy) under specific conditions. The policy reimburses in-patient hospitalization expenses for Ayush treatments conducted at recognized institutions [Source: Activ Assure Diamond (aditya-birla), p.3-4]. \n\nKey requirements: \n1. Treatment must be at government hospitals, CCIM/CCH-recognized AYUSH colleges, or accredited institutions with \u226515 beds and qualified doctors \n2. Must be performed by a registered AYUSH practitioner \n3. Only covers in-patient expenses (excludes pre/post-hospitalization costs) \n\nNote: This coverage is subject to policy schedule limits and hospital accreditation criteria. For out-patient Ayush consultations, coverage isn't mentioned in the provided clauses.",
57
+ "judge_reason": "BOT accurately conveys the information",
58
+ "faithfulness_reasons": []
59
+ },
60
+ {
61
+ "id": "aditya-birla__activ-assure-diamond__wordings::room_rent_capping::medium",
62
+ "question": "Is there a cap on room rent under Activ Assure?",
63
+ "blocked": false,
64
+ "factual_match": false,
65
+ "brain": "sarvam-m::simple-qa",
66
+ "bot_answer": "The room rent cap under Activ Assure is specified in your Policy Schedule/Product Benefit Table, as per the sub-limits mentioned [Source: Activ Assure Diamond (aditya-birla), p.1]. For example, a \"Single Private A/C Room\" is defined as the most economical accommodation category with specific limits [Source: Activ Assure Diamond (aditya-birla), p.23-24]. \n\nNote: This is subject to IRDAI regulations mandating reasonable sub-limits. For your exact cap, check the \"Room Rent\" section in your Policy Schedule or contact Aditya Birla Health directly.",
67
+ "judge_reason": "BOT does not convey the upgradability to the next level.",
68
+ "faithfulness_reasons": []
69
+ },
70
+ {
71
+ "id": "aditya-birla__activ-assure-diamond__wordings::REFUSE::exclusions_oos::hard",
72
+ "question": "Does Activ Assure cover injuries from space tourism?",
73
+ "blocked": false,
74
+ "factual_match": false,
75
+ "brain": "sarvam-m::simple-qa",
76
+ "bot_answer": "Activ Assure Diamond does not explicitly cover injuries from space tourism. The policy excludes \"participation or involvement in... professional or semiprofessional nature\" activities like aviation, scuba diving, or paragliding [Source: Activ Assure Diamond (aditya-birla), p.13]. Space tourism would likely be considered a high-risk activity falling under this exclusion. Additionally, injuries from \"willful or deliberate exposure to danger\" are not covered [Same source]. \n\nNote: This policy has a 36-month waiting period for pre-existing conditions, but space tourism exclusions apply regardless. For clarity, I recommend confirming with the insurer directly before purchasing, as space tourism is not a standard coverage scenario.",
77
+ "judge_reason": "did not refuse when expected",
78
+ "faithfulness_reasons": []
79
+ },
80
+ {
81
+ "id": "aditya-birla__activ-assure-diamond__wordings::REFUSE::exclusions_oos::hard",
82
+ "question": "What is the maximum claim amount for diamond-tipped surgical procedures under Activ Assure?",
83
+ "blocked": true,
84
+ "factual_match": true,
85
+ "brain": "sarvam-m::simple-qa",
86
+ "bot_answer": "I'd rather not answer that without stronger evidence in the policy documents I have. Could you rephrase, or narrow your question to a specific policy?",
87
+ "judge_reason": "correctly refused",
88
+ "faithfulness_reasons": [
89
+ "gate4_llm_judge: claims unsupported"
90
+ ]
91
+ },
92
+ {
93
+ "id": "aditya-birla__activ-assure-diamond__wordings::REFUSE::regulatory_oos::hard",
94
+ "question": "What is the IRDAI mandate on dental coverage that Activ Assure must follow?",
95
+ "blocked": true,
96
+ "factual_match": true,
97
+ "brain": "sarvam-m::simple-qa",
98
+ "bot_answer": "I'd rather not answer that without stronger evidence in the policy documents I have. Could you rephrase, or narrow your question to a specific policy?",
99
+ "judge_reason": "correctly refused",
100
+ "faithfulness_reasons": [
101
+ "gate4_llm_judge: claims unsupported"
102
+ ]
103
+ },
104
+ {
105
+ "id": "bajaj-allianz__comprehensive-care-plan__wordings::pre_existing_disease_waiting_months::easy",
106
+ "question": "What is the waiting period for pre-existing diseases under Comprehensive Care Plan?",
107
+ "blocked": true,
108
+ "factual_match": false,
109
+ "brain": "sarvam-m::simple-qa",
110
+ "bot_answer": "I'd rather not answer that without stronger evidence in the policy documents I have. Could you rephrase, or narrow your question to a specific policy?",
111
+ "judge_reason": "bot refused on a question with a known answer",
112
+ "faithfulness_reasons": [
113
+ "gate4_llm_judge: claims unsupported"
114
+ ]
115
+ },
116
+ {
117
+ "id": "bajaj-allianz__comprehensive-care-plan__wordings::pre_existing_disease_waiting_months::medium",
118
+ "question": "If I have diabetes, how long do I have to wait before I can claim under Comprehensive Care Plan?",
119
+ "blocked": true,
120
+ "factual_match": false,
121
+ "brain": "sarvam-m::simple-qa",
122
+ "bot_answer": "I'd rather not answer that without stronger evidence in the policy documents I have. Could you rephrase, or narrow your question to a specific policy?",
123
+ "judge_reason": "bot refused on a question with a known answer",
124
+ "faithfulness_reasons": [
125
+ "gate4_llm_judge: claims unsupported"
126
+ ]
127
+ },
128
+ {
129
+ "id": "bajaj-allianz__comprehensive-care-plan__wordings::initial_waiting_period_days::easy",
130
+ "question": "What is the initial waiting period under Comprehensive Care Plan?",
131
+ "blocked": true,
132
+ "factual_match": false,
133
+ "brain": "sarvam-m::simple-qa",
134
+ "bot_answer": "I'd rather not answer that without stronger evidence in the policy documents I have. Could you rephrase, or narrow your question to a specific policy?",
135
+ "judge_reason": "bot refused on a question with a known answer",
136
+ "faithfulness_reasons": [
137
+ "gate4_llm_judge: claims unsupported"
138
+ ]
139
+ },
140
+ {
141
+ "id": "bajaj-allianz__comprehensive-care-plan__wordings::ayush_coverage::easy",
142
+ "question": "Does Comprehensive Care Plan cover AYUSH (Ayurveda, Yoga, Unani, Siddha, Homeopathy)?",
143
+ "blocked": false,
144
+ "factual_match": true,
145
+ "brain": "sarvam-m::simple-qa",
146
+ "bot_answer": "The Comprehensive Care Plan does cover AYUSH treatments (Ayurveda, Yoga, Unani, Siddha, Homeopathy) **if** the treatment is conducted in a recognized AYUSH Hospital or Day Care Centre as defined in the policy. Coverage includes hospitalization and day-care procedures under these systems [Source: Comprehensive Care Plan (bajaj-allianz), p.1-2]. \n\n**Key criteria for AYUSH facilities**: \n- Minimum 5 in-patient beds (15 in larger towns) \n- 24/7 qualified AYUSH practitioners \n- Dedicated therapy sections/operation theatres \n- Registered with local authorities [Source: Comprehensive Care Plan (bajaj-allianz), p.1-2]. \n\nNote: This coverage applies only to in-patient hospitalization or day-care procedures at these facilities. For out-patient AYUSH consultations, the policy does not explicitly mention coverage in the provided clauses.",
147
+ "judge_reason": "BOT accurately conveys the coverage of AYUSH treatments.",
148
+ "faithfulness_reasons": []
149
+ },
150
+ {
151
+ "id": "bajaj-allianz__comprehensive-care-plan__wordings::REFUSE::exclusions_oos::hard",
152
+ "question": "Does Comprehensive Care Plan cover injuries from space tourism?",
153
+ "blocked": true,
154
+ "factual_match": true,
155
+ "brain": "sarvam-m::simple-qa",
156
+ "bot_answer": "I'd rather not answer that without stronger evidence in the policy documents I have. Could you rephrase, or narrow your question to a specific policy?",
157
+ "judge_reason": "correctly refused",
158
+ "faithfulness_reasons": [
159
+ "fabricated_citation: same as above, clause 3"
160
+ ]
161
+ },
162
+ {
163
+ "id": "bajaj-allianz__comprehensive-care-plan__wordings::REFUSE::exclusions_oos::hard",
164
+ "question": "What is the maximum claim amount for diamond-tipped surgical procedures under Comprehensive Care Plan?",
165
+ "blocked": false,
166
+ "factual_match": false,
167
+ "brain": "sarvam-m::simple-qa",
168
+ "bot_answer": "The Comprehensive Care Plan policy document provided does not mention any specific coverage limits or exclusions for diamond-tipped surgical procedures. The retrieved clauses focus on general terms, claim timelines, exclusions like terrorism, and benefits for critical illnesses/accidents, but no procedure-specific limits are indicated [Source: Comprehensive Care Plan (bajaj-allianz), pp.1-16].\n\nFor clarity, the policy covers surgical procedures under Section 5 (Critical Illness) and Section 2 (Accident Protection), but these are subject to general terms like waiting periods and exclusions. Since the document lacks details about diamond-tipped procedures, I cannot confirm coverage for this specific case.\n\nNote: This type of specialized procedure might require pre-authorization. I\u2019d recommend you confirm with the insurer directly before finalizing any treatment.",
169
+ "judge_reason": "did not refuse when expected",
170
+ "faithfulness_reasons": []
171
+ },
172
+ {
173
+ "id": "bajaj-allianz__comprehensive-care-plan__wordings::REFUSE::regulatory_oos::hard",
174
+ "question": "What is the IRDAI mandate on dental coverage that Comprehensive Care Plan must follow?",
175
+ "blocked": false,
176
+ "factual_match": false,
177
+ "brain": "sarvam-m::simple-qa",
178
+ "bot_answer": "The Comprehensive Care Plan policy document does not explicitly mention any IRDAI mandates specifically for dental coverage. The retrieved clauses focus on general hospitalization, AYUSH facilities, and day care centers without dental-specific provisions [Source: Comprehensive Care Plan (bajaj-allianz), pp.1-30]. \n\nFor dental coverage details, you would need to check the policy's excluded treatments or consult IRDAI's general health insurance regulations (not provided in this context). I recommend confirming directly with Bajaj Allianz or reviewing the policy's exclusions section for dental-related clauses.",
179
+ "judge_reason": "did not refuse when expected",
180
+ "faithfulness_reasons": []
181
+ },
182
+ {
183
+ "id": "bajaj-allianz__silver-health__cis::pre_existing_disease_waiting_months::easy",
184
+ "question": "What is the waiting period for pre-existing diseases under Silver Health?",
185
+ "blocked": true,
186
+ "factual_match": false,
187
+ "brain": "sarvam-m::simple-qa",
188
+ "bot_answer": "I'd rather not answer that without stronger evidence in the policy documents I have. Could you rephrase, or narrow your question to a specific policy?",
189
+ "judge_reason": "bot refused on a question with a known answer",
190
+ "faithfulness_reasons": [
191
+ "gate4_llm_judge: claims unsupported"
192
+ ]
193
+ },
194
+ {
195
+ "id": "bajaj-allianz__silver-health__cis::pre_existing_disease_waiting_months::medium",
196
+ "question": "If I have diabetes, how long do I have to wait before I can claim under Silver Health?",
197
+ "blocked": true,
198
+ "factual_match": false,
199
+ "brain": "sarvam-m::simple-qa",
200
+ "bot_answer": "I'd rather not answer that without stronger evidence in the policy documents I have. Could you rephrase, or narrow your question to a specific policy?",
201
+ "judge_reason": "bot refused on a question with a known answer",
202
+ "faithfulness_reasons": [
203
+ "gate4_llm_judge: claims unsupported"
204
+ ]
205
+ },
206
+ {
207
+ "id": "bajaj-allianz__silver-health__cis::initial_waiting_period_days::easy",
208
+ "question": "What is the initial waiting period under Silver Health?",
209
+ "blocked": false,
210
+ "factual_match": false,
211
+ "brain": "sarvam-m::simple-qa",
212
+ "bot_answer": "The initial waiting period under Silver Health (Bajaj Allianz) is **30 days for all illnesses** as per the policy clauses [Source: Silver Health (bajaj-allianz), pp.2-4]. This applies to all covered treatments except specific procedures listed under the 12-month waiting period. Note: This is the policy's standard waiting period \u2013 confirm with the insurer if your specific condition/procedure has additional waiting periods.",
213
+ "judge_reason": "judge_error: HTTPStatusError: Client error '429 Too Many Requests' for url 'https://api.groq.com/openai/v1/chat/completions'\nFor more information check: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/429",
214
+ "faithfulness_reasons": []
215
+ },
216
+ {
217
+ "id": "bajaj-allianz__silver-health__cis::pre_hospitalization_days::easy",
218
+ "question": "How many days of pre-hospitalization expenses does Silver Health cover?",
219
+ "blocked": false,
220
+ "factual_match": true,
221
+ "brain": "sarvam-m::simple-qa",
222
+ "bot_answer": "Silver Health covers **30 days** of pre-hospitalization expenses prior to hospitalization, as per the policy clauses [Source: Silver Health (bajaj-allianz), p.1]. \n\nNote: This is subject to the general terms of the policy and any applicable exclusions. For example, expenses related to investigations or non-medical reasons (as listed in exclusions) would not be covered.",
223
+ "judge_reason": "BOT accurately conveys the key information.",
224
+ "faithfulness_reasons": []
225
+ },
226
+ {
227
+ "id": "bajaj-allianz__silver-health__cis::post_hospitalization_days::easy",
228
+ "question": "How many days of post-hospitalization expenses does Silver Health cover?",
229
+ "blocked": false,
230
+ "factual_match": true,
231
+ "brain": "sarvam-m::simple-qa",
232
+ "bot_answer": "Silver Health covers post-hospitalization expenses for **up to 60 days** from the date of discharge, as per the policy clauses [Source: Silver Health (bajaj-allianz), p.1]. \n\nNote: This is subject to the insured being admitted for over 24 hours. For clarity, you may confirm this with the insurer directly before finalizing.",
233
+ "judge_reason": "BOT accurately conveys the post-hospitalization coverage period.",
234
+ "faithfulness_reasons": []
235
+ },
236
+ {
237
+ "id": "bajaj-allianz__silver-health__cis::no_claim_bonus_pct::easy",
238
+ "question": "What's the no-claim bonus on Silver Health?",
239
+ "blocked": true,
240
+ "factual_match": false,
241
+ "brain": "sarvam-m::simple-qa",
242
+ "bot_answer": "I'd rather not answer that without stronger evidence in the policy documents I have. Could you rephrase, or narrow your question to a specific policy?",
243
+ "judge_reason": "bot refused on a question with a known answer",
244
+ "faithfulness_reasons": [
245
+ "unsupported_number: 2 years"
246
+ ]
247
+ },
248
+ {
249
+ "id": "bajaj-allianz__silver-health__cis::room_rent_capping::medium",
250
+ "question": "Is there a cap on room rent under Silver Health?",
251
+ "blocked": true,
252
+ "factual_match": false,
253
+ "brain": "sarvam-m::simple-qa",
254
+ "bot_answer": "I'd rather not answer that without stronger evidence in the policy documents I have. Could you rephrase, or narrow your question to a specific policy?",
255
+ "judge_reason": "bot refused on a question with a known answer",
256
+ "faithfulness_reasons": [
257
+ "unsupported_number: \u20b92",
258
+ "unsupported_number: \u20b92"
259
+ ]
260
+ },
261
+ {
262
+ "id": "bajaj-allianz__silver-health__cis::copayment_pct::easy",
263
+ "question": "Is there a copayment under Silver Health?",
264
+ "blocked": false,
265
+ "factual_match": true,
266
+ "brain": "sarvam-m::simple-qa",
267
+ "bot_answer": "Silver Health (bajaj-allianz) does not have a mandatory copayment clause in the base policy. However, specific add-ons like **cataract coverage** require a 10% copayment (max \u20b940,000 per claim) [Source: Silver Health (bajaj-allianz), p.3]. For non-network hospitals, a 20% copayment applies per claim unless an extra premium is paid to waive it [Source: Silver Health (bajaj-allianz), p.3]. \n\nNote: This varies by plan (A/B) and add-ons selected.",
268
+ "judge_reason": "BOT accurately conveys the copayment information.",
269
+ "faithfulness_reasons": []
270
+ },
271
+ {
272
+ "id": "bajaj-allianz__silver-health__cis::REFUSE::exclusions_oos::hard",
273
+ "question": "Does Silver Health cover injuries from space tourism?",
274
+ "blocked": false,
275
+ "factual_match": false,
276
+ "brain": "sarvam-m::simple-qa",
277
+ "bot_answer": "Silver Health by Bajaj Allianz does not explicitly cover injuries from space tourism based on the provided policy clauses. The policy covers in-patient hospitalization for accidental bodily injuries (Section C1) but excludes treatments outside India (Exclusion DII) and does not mention space tourism as a covered scenario. \n\n**Key reasons:** \n1. **Geographic exclusion**: All treatments outside India are excluded [Source: Silver Health (bajaj-allianz), p.2-4, Exclusion DII]. Space tourism typically occurs outside India. \n2. **No specific coverage**: The policy does not list space tourism or high-altitude/aviation-related injuries as covered risks. \n\n**Note**: This policy has a 30-day initial waiting period for all illnesses [Source: Silver Health (bajaj-allianz), p.3-5, Standard Time Period]. Even if coverage were claimed, pre-existing conditions related to such activities would face a 12-month waiting period. \n\nI recommend you confirm directly with the insurer, as non-standard activities often require specific riders or exclusions.",
278
+ "judge_reason": "did not refuse when expected",
279
+ "faithfulness_reasons": []
280
+ },
281
+ {
282
+ "id": "bajaj-allianz__silver-health__cis::REFUSE::exclusions_oos::hard",
283
+ "question": "What is the maximum claim amount for diamond-tipped surgical procedures under Silver Health?",
284
+ "blocked": false,
285
+ "factual_match": false,
286
+ "brain": "sarvam-m::simple-qa",
287
+ "bot_answer": "The provided policy documents do not specifically mention diamond-tipped surgical procedures under covered treatments. While the policy covers advanced procedures like robotic surgeries and stereotactic radio surgeries [Source: Silver Health (bajaj-allianz), pp.2-3], there is no explicit reference to \"diamond-tipped\" procedures in the listed inclusions or exclusions. \n\nFor clarity: \n1. If the procedure falls under the broader category of \"Modern Treatment Methods\" (e.g., robotic surgeries), it *may* be covered up to the sum insured [Source: Silver Health (bajaj-allianz), pp.2-3]. \n2. If it is a cosmetic or elective procedure, it would likely be excluded under Section D II (cosmetic surgery) or Exclusion 10 (non-medical items) [Source: Silver Health (bajaj-allianz), pp.2-4]. \n\n**Note**: The policy does not specify sub-limits for individual procedures beyond the overall sum insured. For confirmation, you would need to share the specific procedure details with the insurer, as coverage depends on whether it aligns with the defined categories.",
288
+ "judge_reason": "did not refuse when expected",
289
+ "faithfulness_reasons": []
290
+ },
291
+ {
292
+ "id": "bajaj-allianz__silver-health__cis::REFUSE::regulatory_oos::hard",
293
+ "question": "What is the IRDAI mandate on dental coverage that Silver Health must follow?",
294
+ "blocked": true,
295
+ "factual_match": true,
296
+ "brain": "sarvam-m::simple-qa",
297
+ "bot_answer": "I'd rather not answer that without stronger evidence in the policy documents I have. Could you rephrase, or narrow your question to a specific policy?",
298
+ "judge_reason": "correctly refused",
299
+ "faithfulness_reasons": [
300
+ "gate4_llm_judge: claims unsupported"
301
+ ]
302
+ }
303
+ ]
304
+ },
305
+ {
306
+ "chunk_size": 1500,
307
+ "overlap": 300,
308
+ "chunk_count": 7641,
309
+ "summary": {
310
+ "ran_at": "2026-05-12T22:30:15Z",
311
+ "elapsed_seconds": 293.0,
312
+ "n_questions": 25,
313
+ "factual_accuracy": 0.4,
314
+ "citation_accuracy": 0.5,
315
+ "refusal_precision": 0.444,
316
+ "by_type": {
317
+ "waiting_period": 0.125,
318
+ "coverage_scope": 1.0,
319
+ "sub_limit": 0.333,
320
+ "exclusions_oos": 0.333,
321
+ "regulatory_oos": 0.667,
322
+ "bonus": 0.0
323
+ },
324
+ "by_brain": {
325
+ "groq-llama": 1.0,
326
+ "sarvam-m": 0.375
327
+ },
328
+ "blocked_count": 12
329
+ },
330
+ "rows": [
331
+ {
332
+ "id": "aditya-birla__activ-assure-diamond__wordings::pre_existing_disease_waiting_months::easy",
333
+ "question": "What is the waiting period for pre-existing diseases under Activ Assure?",
334
+ "blocked": false,
335
+ "factual_match": true,
336
+ "brain": "groq-llama::fallback-truncated-reasoning",
337
+ "bot_answer": "The waiting period for pre-existing diseases under Activ Assure is 24 months [Source: Activ Assure Diamond (aditya-birla), pp.10-11].",
338
+ "judge_reason": "BOT accurately conveys the waiting period.",
339
+ "faithfulness_reasons": []
340
+ },
341
+ {
342
+ "id": "aditya-birla__activ-assure-diamond__wordings::pre_existing_disease_waiting_months::medium",
343
+ "question": "If I have diabetes, how long do I have to wait before I can claim under Activ Assure?",
344
+ "blocked": true,
345
+ "factual_match": false,
346
+ "brain": "sarvam-m::simple-qa",
347
+ "bot_answer": "I'd rather not answer that without stronger evidence in the policy documents I have. Could you rephrase, or narrow your question to a specific policy?",
348
+ "judge_reason": "bot refused on a question with a known answer",
349
+ "faithfulness_reasons": [
350
+ "gate4_llm_judge: claims unsupported"
351
+ ]
352
+ },
353
+ {
354
+ "id": "aditya-birla__activ-assure-diamond__wordings::ayush_coverage::easy",
355
+ "question": "Does Activ Assure cover AYUSH (Ayurveda, Yoga, Unani, Siddha, Homeopathy)?",
356
+ "blocked": false,
357
+ "factual_match": true,
358
+ "brain": "sarvam-m::simple-qa",
359
+ "bot_answer": "Yes, Activ Assure Diamond does cover AYUSH treatments (Ayurveda, Yoga, Unani, Siddha, Homeopathy) under specific conditions. The policy reimburses in-patient hospitalization expenses for Ayush treatments conducted at recognized institutions [Source: Activ Assure Diamond (aditya-birla), p.3-4]. \n\nKey requirements: \n1. Treatment must be at government hospitals, CCIM/CCH-recognized AYUSH colleges, or accredited institutions with \u226515 beds and qualified doctors \n2. Must be performed by a registered AYUSH practitioner \n3. Only covers in-patient expenses (excludes pre/post-hospitalization costs) \n\nNote: This coverage is subject to policy schedule limits and hospital accreditation criteria. For out-patient Ayush consultations, coverage isn't mentioned in the provided clauses.",
360
+ "judge_reason": "BOT accurately conveys the information",
361
+ "faithfulness_reasons": []
362
+ },
363
+ {
364
+ "id": "aditya-birla__activ-assure-diamond__wordings::room_rent_capping::medium",
365
+ "question": "Is there a cap on room rent under Activ Assure?",
366
+ "blocked": false,
367
+ "factual_match": false,
368
+ "brain": "sarvam-m::simple-qa",
369
+ "bot_answer": "The room rent cap under Activ Assure is specified in your Policy Schedule/Product Benefit Table, as per the sub-limits mentioned [Source: Activ Assure Diamond (aditya-birla), p.1]. For example, a \"Single Private A/C Room\" is defined as the most economical accommodation category with specific limits [Source: Activ Assure Diamond (aditya-birla), p.23-24]. \n\nNote: This is subject to IRDAI regulations mandating reasonable sub-limits. For your exact cap, check the \"Room Rent\" section in your Policy Schedule or contact Aditya Birla Health directly.",
370
+ "judge_reason": "BOT does not convey the upgradability to the next level.",
371
+ "faithfulness_reasons": []
372
+ },
373
+ {
374
+ "id": "aditya-birla__activ-assure-diamond__wordings::REFUSE::exclusions_oos::hard",
375
+ "question": "Does Activ Assure cover injuries from space tourism?",
376
+ "blocked": false,
377
+ "factual_match": false,
378
+ "brain": "sarvam-m::simple-qa",
379
+ "bot_answer": "Activ Assure Diamond does not explicitly cover injuries from space tourism. The policy excludes \"participation or involvement in... professional or semiprofessional nature\" activities like aviation, scuba diving, or paragliding [Source: Activ Assure Diamond (aditya-birla), p.13]. Space tourism would likely be considered a high-risk activity falling under this exclusion. Additionally, injuries from \"willful or deliberate exposure to danger\" are not covered [Same source]. \n\nNote: This policy has a 36-month waiting period for pre-existing conditions, but space tourism exclusions apply regardless. For clarity, I recommend confirming with the insurer directly before purchasing, as space tourism is not a standard coverage scenario.",
380
+ "judge_reason": "did not refuse when expected",
381
+ "faithfulness_reasons": []
382
+ },
383
+ {
384
+ "id": "aditya-birla__activ-assure-diamond__wordings::REFUSE::exclusions_oos::hard",
385
+ "question": "What is the maximum claim amount for diamond-tipped surgical procedures under Activ Assure?",
386
+ "blocked": true,
387
+ "factual_match": true,
388
+ "brain": "sarvam-m::simple-qa",
389
+ "bot_answer": "I'd rather not answer that without stronger evidence in the policy documents I have. Could you rephrase, or narrow your question to a specific policy?",
390
+ "judge_reason": "correctly refused",
391
+ "faithfulness_reasons": [
392
+ "gate4_llm_judge: claims unsupported"
393
+ ]
394
+ },
395
+ {
396
+ "id": "aditya-birla__activ-assure-diamond__wordings::REFUSE::regulatory_oos::hard",
397
+ "question": "What is the IRDAI mandate on dental coverage that Activ Assure must follow?",
398
+ "blocked": true,
399
+ "factual_match": true,
400
+ "brain": "sarvam-m::simple-qa",
401
+ "bot_answer": "I'd rather not answer that without stronger evidence in the policy documents I have. Could you rephrase, or narrow your question to a specific policy?",
402
+ "judge_reason": "correctly refused",
403
+ "faithfulness_reasons": [
404
+ "gate4_llm_judge: claims unsupported"
405
+ ]
406
+ },
407
+ {
408
+ "id": "bajaj-allianz__comprehensive-care-plan__wordings::pre_existing_disease_waiting_months::easy",
409
+ "question": "What is the waiting period for pre-existing diseases under Comprehensive Care Plan?",
410
+ "blocked": true,
411
+ "factual_match": false,
412
+ "brain": "sarvam-m::simple-qa",
413
+ "bot_answer": "I'd rather not answer that without stronger evidence in the policy documents I have. Could you rephrase, or narrow your question to a specific policy?",
414
+ "judge_reason": "bot refused on a question with a known answer",
415
+ "faithfulness_reasons": [
416
+ "gate4_llm_judge: claims unsupported"
417
+ ]
418
+ },
419
+ {
420
+ "id": "bajaj-allianz__comprehensive-care-plan__wordings::pre_existing_disease_waiting_months::medium",
421
+ "question": "If I have diabetes, how long do I have to wait before I can claim under Comprehensive Care Plan?",
422
+ "blocked": true,
423
+ "factual_match": false,
424
+ "brain": "sarvam-m::simple-qa",
425
+ "bot_answer": "I'd rather not answer that without stronger evidence in the policy documents I have. Could you rephrase, or narrow your question to a specific policy?",
426
+ "judge_reason": "bot refused on a question with a known answer",
427
+ "faithfulness_reasons": [
428
+ "gate4_llm_judge: claims unsupported"
429
+ ]
430
+ },
431
+ {
432
+ "id": "bajaj-allianz__comprehensive-care-plan__wordings::initial_waiting_period_days::easy",
433
+ "question": "What is the initial waiting period under Comprehensive Care Plan?",
434
+ "blocked": true,
435
+ "factual_match": false,
436
+ "brain": "sarvam-m::simple-qa",
437
+ "bot_answer": "I'd rather not answer that without stronger evidence in the policy documents I have. Could you rephrase, or narrow your question to a specific policy?",
438
+ "judge_reason": "bot refused on a question with a known answer",
439
+ "faithfulness_reasons": [
440
+ "gate4_llm_judge: claims unsupported"
441
+ ]
442
+ },
443
+ {
444
+ "id": "bajaj-allianz__comprehensive-care-plan__wordings::ayush_coverage::easy",
445
+ "question": "Does Comprehensive Care Plan cover AYUSH (Ayurveda, Yoga, Unani, Siddha, Homeopathy)?",
446
+ "blocked": false,
447
+ "factual_match": true,
448
+ "brain": "sarvam-m::simple-qa",
449
+ "bot_answer": "The Comprehensive Care Plan does cover AYUSH treatments (Ayurveda, Yoga, Unani, Siddha, Homeopathy) **if** the treatment is conducted in a recognized AYUSH Hospital or Day Care Centre as defined in the policy. Coverage includes hospitalization and day-care procedures under these systems [Source: Comprehensive Care Plan (bajaj-allianz), p.1-2]. \n\n**Key criteria for AYUSH facilities**: \n- Minimum 5 in-patient beds (15 in larger towns) \n- 24/7 qualified AYUSH practitioners \n- Dedicated therapy sections/operation theatres \n- Registered with local authorities [Source: Comprehensive Care Plan (bajaj-allianz), p.1-2]. \n\nNote: This coverage applies only to in-patient hospitalization or day-care procedures at these facilities. For out-patient AYUSH consultations, the policy does not explicitly mention coverage in the provided clauses.",
450
+ "judge_reason": "BOT accurately conveys the coverage of AYUSH treatments.",
451
+ "faithfulness_reasons": []
452
+ },
453
+ {
454
+ "id": "bajaj-allianz__comprehensive-care-plan__wordings::REFUSE::exclusions_oos::hard",
455
+ "question": "Does Comprehensive Care Plan cover injuries from space tourism?",
456
+ "blocked": true,
457
+ "factual_match": true,
458
+ "brain": "sarvam-m::simple-qa",
459
+ "bot_answer": "I'd rather not answer that without stronger evidence in the policy documents I have. Could you rephrase, or narrow your question to a specific policy?",
460
+ "judge_reason": "correctly refused",
461
+ "faithfulness_reasons": [
462
+ "fabricated_citation: same as above, clause 3"
463
+ ]
464
+ },
465
+ {
466
+ "id": "bajaj-allianz__comprehensive-care-plan__wordings::REFUSE::exclusions_oos::hard",
467
+ "question": "What is the maximum claim amount for diamond-tipped surgical procedures under Comprehensive Care Plan?",
468
+ "blocked": false,
469
+ "factual_match": false,
470
+ "brain": "sarvam-m::simple-qa",
471
+ "bot_answer": "The Comprehensive Care Plan policy document provided does not mention any specific coverage limits or exclusions for diamond-tipped surgical procedures. The retrieved clauses focus on general terms, claim timelines, exclusions like terrorism, and benefits for critical illnesses/accidents, but no procedure-specific limits are indicated [Source: Comprehensive Care Plan (bajaj-allianz), pp.1-16].\n\nFor clarity, the policy covers surgical procedures under Section 5 (Critical Illness) and Section 2 (Accident Protection), but these are subject to general terms like waiting periods and exclusions. Since the document lacks details about diamond-tipped procedures, I cannot confirm coverage for this specific case.\n\nNote: This type of specialized procedure might require pre-authorization. I\u2019d recommend you confirm with the insurer directly before finalizing any treatment.",
472
+ "judge_reason": "did not refuse when expected",
473
+ "faithfulness_reasons": []
474
+ },
475
+ {
476
+ "id": "bajaj-allianz__comprehensive-care-plan__wordings::REFUSE::regulatory_oos::hard",
477
+ "question": "What is the IRDAI mandate on dental coverage that Comprehensive Care Plan must follow?",
478
+ "blocked": false,
479
+ "factual_match": false,
480
+ "brain": "sarvam-m::simple-qa",
481
+ "bot_answer": "The Comprehensive Care Plan policy document does not explicitly mention any IRDAI mandates specifically for dental coverage. The retrieved clauses focus on general hospitalization, AYUSH facilities, and day care centers without dental-specific provisions [Source: Comprehensive Care Plan (bajaj-allianz), pp.1-30]. \n\nFor dental coverage details, you would need to check the policy's excluded treatments or consult IRDAI's general health insurance regulations (not provided in this context). I recommend confirming directly with Bajaj Allianz or reviewing the policy's exclusions section for dental-related clauses.",
482
+ "judge_reason": "did not refuse when expected",
483
+ "faithfulness_reasons": []
484
+ },
485
+ {
486
+ "id": "bajaj-allianz__silver-health__cis::pre_existing_disease_waiting_months::easy",
487
+ "question": "What is the waiting period for pre-existing diseases under Silver Health?",
488
+ "blocked": true,
489
+ "factual_match": false,
490
+ "brain": "sarvam-m::simple-qa",
491
+ "bot_answer": "I'd rather not answer that without stronger evidence in the policy documents I have. Could you rephrase, or narrow your question to a specific policy?",
492
+ "judge_reason": "bot refused on a question with a known answer",
493
+ "faithfulness_reasons": [
494
+ "gate4_llm_judge: claims unsupported"
495
+ ]
496
+ },
497
+ {
498
+ "id": "bajaj-allianz__silver-health__cis::pre_existing_disease_waiting_months::medium",
499
+ "question": "If I have diabetes, how long do I have to wait before I can claim under Silver Health?",
500
+ "blocked": true,
501
+ "factual_match": false,
502
+ "brain": "sarvam-m::simple-qa",
503
+ "bot_answer": "I'd rather not answer that without stronger evidence in the policy documents I have. Could you rephrase, or narrow your question to a specific policy?",
504
+ "judge_reason": "bot refused on a question with a known answer",
505
+ "faithfulness_reasons": [
506
+ "gate4_llm_judge: claims unsupported"
507
+ ]
508
+ },
509
+ {
510
+ "id": "bajaj-allianz__silver-health__cis::initial_waiting_period_days::easy",
511
+ "question": "What is the initial waiting period under Silver Health?",
512
+ "blocked": false,
513
+ "factual_match": false,
514
+ "brain": "sarvam-m::simple-qa",
515
+ "bot_answer": "The initial waiting period under Silver Health (Bajaj Allianz) is **30 days for all illnesses** as per the policy clauses [Source: Silver Health (bajaj-allianz), pp.2-4]. This applies to all covered treatments except specific procedures listed under the 12-month waiting period. Note: This is the policy's standard waiting period \u2013 confirm with the insurer if your specific condition/procedure has additional waiting periods.",
516
+ "judge_reason": "judge_error: HTTPStatusError: Client error '429 Too Many Requests' for url 'https://api.groq.com/openai/v1/chat/completions'\nFor more information check: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/429",
517
+ "faithfulness_reasons": []
518
+ },
519
+ {
520
+ "id": "bajaj-allianz__silver-health__cis::pre_hospitalization_days::easy",
521
+ "question": "How many days of pre-hospitalization expenses does Silver Health cover?",
522
+ "blocked": false,
523
+ "factual_match": true,
524
+ "brain": "sarvam-m::simple-qa",
525
+ "bot_answer": "Silver Health covers **30 days** of pre-hospitalization expenses prior to hospitalization, as per the policy clauses [Source: Silver Health (bajaj-allianz), p.1]. \n\nNote: This is subject to the general terms of the policy and any applicable exclusions. For example, expenses related to investigations or non-medical reasons (as listed in exclusions) would not be covered.",
526
+ "judge_reason": "BOT accurately conveys the key information.",
527
+ "faithfulness_reasons": []
528
+ },
529
+ {
530
+ "id": "bajaj-allianz__silver-health__cis::post_hospitalization_days::easy",
531
+ "question": "How many days of post-hospitalization expenses does Silver Health cover?",
532
+ "blocked": false,
533
+ "factual_match": true,
534
+ "brain": "sarvam-m::simple-qa",
535
+ "bot_answer": "Silver Health covers post-hospitalization expenses for **up to 60 days** from the date of discharge, as per the policy clauses [Source: Silver Health (bajaj-allianz), p.1]. \n\nNote: This is subject to the insured being admitted for over 24 hours. For clarity, you may confirm this with the insurer directly before finalizing.",
536
+ "judge_reason": "BOT accurately conveys the post-hospitalization coverage period.",
537
+ "faithfulness_reasons": []
538
+ },
539
+ {
540
+ "id": "bajaj-allianz__silver-health__cis::no_claim_bonus_pct::easy",
541
+ "question": "What's the no-claim bonus on Silver Health?",
542
+ "blocked": true,
543
+ "factual_match": false,
544
+ "brain": "sarvam-m::simple-qa",
545
+ "bot_answer": "I'd rather not answer that without stronger evidence in the policy documents I have. Could you rephrase, or narrow your question to a specific policy?",
546
+ "judge_reason": "bot refused on a question with a known answer",
547
+ "faithfulness_reasons": [
548
+ "unsupported_number: 2 years"
549
+ ]
550
+ },
551
+ {
552
+ "id": "bajaj-allianz__silver-health__cis::room_rent_capping::medium",
553
+ "question": "Is there a cap on room rent under Silver Health?",
554
+ "blocked": true,
555
+ "factual_match": false,
556
+ "brain": "sarvam-m::simple-qa",
557
+ "bot_answer": "I'd rather not answer that without stronger evidence in the policy documents I have. Could you rephrase, or narrow your question to a specific policy?",
558
+ "judge_reason": "bot refused on a question with a known answer",
559
+ "faithfulness_reasons": [
560
+ "unsupported_number: \u20b92",
561
+ "unsupported_number: \u20b92"
562
+ ]
563
+ },
564
+ {
565
+ "id": "bajaj-allianz__silver-health__cis::copayment_pct::easy",
566
+ "question": "Is there a copayment under Silver Health?",
567
+ "blocked": false,
568
+ "factual_match": true,
569
+ "brain": "sarvam-m::simple-qa",
570
+ "bot_answer": "Silver Health (bajaj-allianz) does not have a mandatory copayment clause in the base policy. However, specific add-ons like **cataract coverage** require a 10% copayment (max \u20b940,000 per claim) [Source: Silver Health (bajaj-allianz), p.3]. For non-network hospitals, a 20% copayment applies per claim unless an extra premium is paid to waive it [Source: Silver Health (bajaj-allianz), p.3]. \n\nNote: This varies by plan (A/B) and add-ons selected.",
571
+ "judge_reason": "BOT accurately conveys the copayment information.",
572
+ "faithfulness_reasons": []
573
+ },
574
+ {
575
+ "id": "bajaj-allianz__silver-health__cis::REFUSE::exclusions_oos::hard",
576
+ "question": "Does Silver Health cover injuries from space tourism?",
577
+ "blocked": false,
578
+ "factual_match": false,
579
+ "brain": "sarvam-m::simple-qa",
580
+ "bot_answer": "Silver Health by Bajaj Allianz does not explicitly cover injuries from space tourism based on the provided policy clauses. The policy covers in-patient hospitalization for accidental bodily injuries (Section C1) but excludes treatments outside India (Exclusion DII) and does not mention space tourism as a covered scenario. \n\n**Key reasons:** \n1. **Geographic exclusion**: All treatments outside India are excluded [Source: Silver Health (bajaj-allianz), p.2-4, Exclusion DII]. Space tourism typically occurs outside India. \n2. **No specific coverage**: The policy does not list space tourism or high-altitude/aviation-related injuries as covered risks. \n\n**Note**: This policy has a 30-day initial waiting period for all illnesses [Source: Silver Health (bajaj-allianz), p.3-5, Standard Time Period]. Even if coverage were claimed, pre-existing conditions related to such activities would face a 12-month waiting period. \n\nI recommend you confirm directly with the insurer, as non-standard activities often require specific riders or exclusions.",
581
+ "judge_reason": "did not refuse when expected",
582
+ "faithfulness_reasons": []
583
+ },
584
+ {
585
+ "id": "bajaj-allianz__silver-health__cis::REFUSE::exclusions_oos::hard",
586
+ "question": "What is the maximum claim amount for diamond-tipped surgical procedures under Silver Health?",
587
+ "blocked": false,
588
+ "factual_match": false,
589
+ "brain": "sarvam-m::simple-qa",
590
+ "bot_answer": "The provided policy documents do not specifically mention diamond-tipped surgical procedures under covered treatments. While the policy covers advanced procedures like robotic surgeries and stereotactic radio surgeries [Source: Silver Health (bajaj-allianz), pp.2-3], there is no explicit reference to \"diamond-tipped\" procedures in the listed inclusions or exclusions. \n\nFor clarity: \n1. If the procedure falls under the broader category of \"Modern Treatment Methods\" (e.g., robotic surgeries), it *may* be covered up to the sum insured [Source: Silver Health (bajaj-allianz), pp.2-3]. \n2. If it is a cosmetic or elective procedure, it would likely be excluded under Section D II (cosmetic surgery) or Exclusion 10 (non-medical items) [Source: Silver Health (bajaj-allianz), pp.2-4]. \n\n**Note**: The policy does not specify sub-limits for individual procedures beyond the overall sum insured. For confirmation, you would need to share the specific procedure details with the insurer, as coverage depends on whether it aligns with the defined categories.",
591
+ "judge_reason": "did not refuse when expected",
592
+ "faithfulness_reasons": []
593
+ },
594
+ {
595
+ "id": "bajaj-allianz__silver-health__cis::REFUSE::regulatory_oos::hard",
596
+ "question": "What is the IRDAI mandate on dental coverage that Silver Health must follow?",
597
+ "blocked": true,
598
+ "factual_match": true,
599
+ "brain": "sarvam-m::simple-qa",
600
+ "bot_answer": "I'd rather not answer that without stronger evidence in the policy documents I have. Could you rephrase, or narrow your question to a specific policy?",
601
+ "judge_reason": "correctly refused",
602
+ "faithfulness_reasons": [
603
+ "gate4_llm_judge: claims unsupported"
604
+ ]
605
+ }
606
+ ]
607
+ }
608
+ ]
eval/chunk_sweep_results.json ADDED
@@ -0,0 +1,83 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "results": [
3
+ {
4
+ "chunk_size": 600,
5
+ "overlap": 80,
6
+ "chunk_count": 5075,
7
+ "storage_mb": 108.8,
8
+ "ingest_seconds": 2038.0,
9
+ "eval_seconds": 21.8,
10
+ "factual_accuracy": 0.4,
11
+ "citation_accuracy": 0.5,
12
+ "refusal_precision": 0.444,
13
+ "p50_latency_ms": 10545,
14
+ "p95_latency_ms": 15886
15
+ },
16
+ {
17
+ "chunk_size": 600,
18
+ "overlap": 120,
19
+ "chunk_count": 5474,
20
+ "storage_mb": 115.5,
21
+ "ingest_seconds": 1661.1,
22
+ "eval_seconds": 14.7,
23
+ "factual_accuracy": 0.4,
24
+ "citation_accuracy": 0.5,
25
+ "refusal_precision": 0.444,
26
+ "p50_latency_ms": 10545,
27
+ "p95_latency_ms": 15886
28
+ },
29
+ {
30
+ "chunk_size": 800,
31
+ "overlap": 80,
32
+ "chunk_count": 3703,
33
+ "storage_mb": 86.2,
34
+ "ingest_seconds": 1415.5,
35
+ "eval_seconds": 14.3,
36
+ "factual_accuracy": 0.4,
37
+ "citation_accuracy": 0.5,
38
+ "refusal_precision": 0.444,
39
+ "p50_latency_ms": 10545,
40
+ "p95_latency_ms": 15886
41
+ },
42
+ {
43
+ "chunk_size": 800,
44
+ "overlap": 120,
45
+ "chunk_count": 3915,
46
+ "storage_mb": 93.3,
47
+ "ingest_seconds": 1414.5,
48
+ "eval_seconds": 14.6,
49
+ "factual_accuracy": 0.4,
50
+ "citation_accuracy": 0.5,
51
+ "refusal_precision": 0.444,
52
+ "p50_latency_ms": 10545,
53
+ "p95_latency_ms": 15886
54
+ },
55
+ {
56
+ "chunk_size": 1000,
57
+ "overlap": 120,
58
+ "chunk_count": 3051,
59
+ "storage_mb": 88.8,
60
+ "ingest_seconds": 1359.4,
61
+ "eval_seconds": 21.5,
62
+ "factual_accuracy": 0.4,
63
+ "citation_accuracy": 0.5,
64
+ "refusal_precision": 0.444,
65
+ "p50_latency_ms": 10545,
66
+ "p95_latency_ms": 15886
67
+ },
68
+ {
69
+ "chunk_size": 1000,
70
+ "overlap": 200,
71
+ "chunk_count": 3339,
72
+ "storage_mb": 92.3,
73
+ "ingest_seconds": 1313.4,
74
+ "eval_seconds": 14.6,
75
+ "factual_accuracy": 0.4,
76
+ "citation_accuracy": 0.5,
77
+ "refusal_precision": 0.444,
78
+ "p50_latency_ms": 10545,
79
+ "p95_latency_ms": 15886
80
+ }
81
+ ],
82
+ "in_progress": false
83
+ }
frontend/src/app/page.tsx CHANGED
@@ -5,7 +5,9 @@ import {
5
  audioBlobURLFromBase64,
6
  Citation,
7
  ChatMessage,
 
8
  CoverageResponse,
 
9
  getCoverage,
10
  getHealth,
11
  getInsurerReviews,
@@ -920,6 +922,16 @@ function MarketplacePanel({
920
  const [requireCashless, setRequireCashless] = useState(false);
921
  const [grade, setGrade] = useState<string>("all");
922
  const [sortBy, setSortBy] = useState<"score" | "name" | "insurer">("score");
 
 
 
 
 
 
 
 
 
 
923
 
924
  const insurers = Array.from(new Set(data.policies.map((p) => p.insurer_slug))).sort();
925
 
@@ -1014,9 +1026,16 @@ function MarketplacePanel({
1014
  </div>
1015
 
1016
  {/* Grid */}
1017
- <div className="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-3">
1018
  {sorted.map((p) => (
1019
- <PolicyCard key={p.policy_id} policy={p} onOpen={() => onOpenPolicy(p)} />
 
 
 
 
 
 
 
1020
  ))}
1021
  {sorted.length === 0 && (
1022
  <div className="col-span-full text-center text-sm text-[var(--muted-foreground)] py-12">
@@ -1025,6 +1044,51 @@ function MarketplacePanel({
1025
  )}
1026
  </div>
1027
  </div>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1028
  </div>
1029
  );
1030
  }
@@ -1159,35 +1223,59 @@ function InsurerReviewsBlock({ reviews }: { reviews: InsurerReviews }) {
1159
  );
1160
  }
1161
 
1162
- function PolicyCard({ policy, onOpen }: { policy: MarketplacePolicy; onOpen: () => void }) {
 
 
 
 
 
 
 
 
 
 
 
 
1163
  const initials = insurerInitials(policy.insurer_name);
1164
  const color = INSURER_COLOR[policy.insurer_slug] || "bg-slate-500";
1165
  const maxSI = policy.sum_insured_options.length ? Math.max(...policy.sum_insured_options) : null;
1166
  const siDisplay = maxSI ? (maxSI >= 10000000 ? `${maxSI/10000000} cr` : `${maxSI/100000} L`) : "—";
1167
  return (
1168
- <button
1169
- onClick={onOpen}
1170
- className="text-left bg-[var(--card)] border border-[var(--border)] rounded-xl p-4 hover:border-[var(--primary)] hover:shadow-md transition group"
1171
- >
1172
- <div className="flex items-start gap-3 mb-3">
1173
- <div className={`w-11 h-11 rounded-lg ${color} text-white flex items-center justify-center font-bold text-sm shrink-0`}>{initials}</div>
1174
- <div className="flex-1 min-w-0">
1175
- <div className="text-xs text-[var(--muted-foreground)] truncate">{policy.insurer_name}</div>
1176
- <div className="font-semibold text-sm truncate group-hover:text-[var(--primary)] transition">{policy.policy_name}</div>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1177
  </div>
1178
- <div className={`shrink-0 flex flex-col items-center rounded-lg overflow-hidden ${gradeColor(policy.grade)}`}>
1179
- <div className="px-2 pt-0.5 text-[10px] font-semibold opacity-90 uppercase tracking-wide">{policy.grade}</div>
1180
- <div className="px-2 pb-0.5 text-base font-bold leading-none">{policy.overall_score}<span className="text-[10px] font-normal opacity-80">/100</span></div>
 
 
 
1181
  </div>
1182
- </div>
1183
- <p className="text-xs text-[var(--muted-foreground)] mb-3 line-clamp-2">{policy.one_liner}</p>
1184
- <div className="grid grid-cols-2 gap-2 text-xs">
1185
- <Stat label="Sum insured up to" value={siDisplay} />
1186
- <Stat label="PED waiting" value={policy.pre_existing_disease_waiting_months ? `${policy.pre_existing_disease_waiting_months} mo` : "—"} />
1187
- <Stat label="AYUSH" value={policy.ayush_coverage === true ? "Yes" : policy.ayush_coverage === false ? "No" : "—"} />
1188
- <Stat label="Network" value={policy.network_hospital_count ? `${(policy.network_hospital_count / 1000).toFixed(0)}K+` : "—"} />
1189
- </div>
1190
- </button>
1191
  );
1192
  }
1193
 
@@ -1200,6 +1288,166 @@ function Stat({ label, value }: { label: string; value: string }) {
1200
  );
1201
  }
1202
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1203
  function PolicyDetailModal({ policy, onClose }: { policy: MarketplacePolicy; onClose: () => void }) {
1204
  const [sc, setSc] = useState<ScorecardResponse | null>(null);
1205
  const [reviews, setReviews] = useState<InsurerReviews | null>(null);
 
5
  audioBlobURLFromBase64,
6
  Citation,
7
  ChatMessage,
8
+ CompareResponse,
9
  CoverageResponse,
10
+ getCompare,
11
  getCoverage,
12
  getHealth,
13
  getInsurerReviews,
 
922
  const [requireCashless, setRequireCashless] = useState(false);
923
  const [grade, setGrade] = useState<string>("all");
924
  const [sortBy, setSortBy] = useState<"score" | "name" | "insurer">("score");
925
+ const [selectedIds, setSelectedIds] = useState<string[]>([]);
926
+ const [compareOpen, setCompareOpen] = useState(false);
927
+ const MAX_COMPARE = 4;
928
+ const toggleSelect = (id: string) => {
929
+ setSelectedIds((prev) => {
930
+ if (prev.includes(id)) return prev.filter((x) => x !== id);
931
+ if (prev.length >= MAX_COMPARE) return prev;
932
+ return [...prev, id];
933
+ });
934
+ };
935
 
936
  const insurers = Array.from(new Set(data.policies.map((p) => p.insurer_slug))).sort();
937
 
 
1026
  </div>
1027
 
1028
  {/* Grid */}
1029
+ <div className="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-3 pb-20">
1030
  {sorted.map((p) => (
1031
+ <PolicyCard
1032
+ key={p.policy_id}
1033
+ policy={p}
1034
+ onOpen={() => onOpenPolicy(p)}
1035
+ selected={selectedIds.includes(p.policy_id)}
1036
+ onToggleSelect={() => toggleSelect(p.policy_id)}
1037
+ selectionDisabled={selectedIds.length >= MAX_COMPARE}
1038
+ />
1039
  ))}
1040
  {sorted.length === 0 && (
1041
  <div className="col-span-full text-center text-sm text-[var(--muted-foreground)] py-12">
 
1044
  )}
1045
  </div>
1046
  </div>
1047
+
1048
+ {/* Sticky compare action bar */}
1049
+ {selectedIds.length > 0 && (
1050
+ <div className="fixed bottom-0 left-0 right-0 z-40 bg-[var(--card)] border-t border-[var(--border)] shadow-lg animate-fade-up">
1051
+ <div className="max-w-7xl mx-auto px-4 sm:px-6 py-3 flex items-center justify-between gap-3">
1052
+ <div className="flex items-center gap-2 flex-wrap">
1053
+ <span className="text-xs font-semibold">{selectedIds.length} of {MAX_COMPARE} selected</span>
1054
+ {selectedIds.map((id) => {
1055
+ const p = data.policies.find((pp) => pp.policy_id === id);
1056
+ if (!p) return null;
1057
+ return (
1058
+ <span
1059
+ key={id}
1060
+ className="inline-flex items-center gap-1 text-[11px] bg-[var(--accent)] border border-[var(--border)] rounded-md px-2 py-0.5"
1061
+ >
1062
+ {p.policy_name.slice(0, 28)}{p.policy_name.length > 28 ? "…" : ""}
1063
+ <button
1064
+ onClick={() => toggleSelect(id)}
1065
+ className="text-[var(--muted-foreground)] hover:text-[var(--foreground)]"
1066
+ aria-label="Remove from comparison"
1067
+ >×</button>
1068
+ </span>
1069
+ );
1070
+ })}
1071
+ </div>
1072
+ <div className="flex items-center gap-2 shrink-0">
1073
+ <button
1074
+ onClick={() => setSelectedIds([])}
1075
+ className="text-xs text-[var(--muted-foreground)] hover:underline"
1076
+ >Clear</button>
1077
+ <button
1078
+ onClick={() => setCompareOpen(true)}
1079
+ disabled={selectedIds.length < 2}
1080
+ className={`text-sm font-semibold rounded-md px-3 py-1.5 ${selectedIds.length < 2 ? "bg-[var(--muted)] text-[var(--muted-foreground)] cursor-not-allowed" : "bg-[var(--primary)] text-white hover:opacity-90"}`}
1081
+ >
1082
+ Compare {selectedIds.length >= 2 ? `(${selectedIds.length})` : ""}
1083
+ </button>
1084
+ </div>
1085
+ </div>
1086
+ </div>
1087
+ )}
1088
+
1089
+ {compareOpen && (
1090
+ <ComparisonModal policyIds={selectedIds} onClose={() => setCompareOpen(false)} />
1091
+ )}
1092
  </div>
1093
  );
1094
  }
 
1223
  );
1224
  }
1225
 
1226
+ function PolicyCard({
1227
+ policy,
1228
+ onOpen,
1229
+ selected,
1230
+ onToggleSelect,
1231
+ selectionDisabled,
1232
+ }: {
1233
+ policy: MarketplacePolicy;
1234
+ onOpen: () => void;
1235
+ selected: boolean;
1236
+ onToggleSelect: () => void;
1237
+ selectionDisabled: boolean;
1238
+ }) {
1239
  const initials = insurerInitials(policy.insurer_name);
1240
  const color = INSURER_COLOR[policy.insurer_slug] || "bg-slate-500";
1241
  const maxSI = policy.sum_insured_options.length ? Math.max(...policy.sum_insured_options) : null;
1242
  const siDisplay = maxSI ? (maxSI >= 10000000 ? `${maxSI/10000000} cr` : `${maxSI/100000} L`) : "—";
1243
  return (
1244
+ <div className={`relative text-left bg-[var(--card)] border ${selected ? "border-[var(--primary)] shadow-md" : "border-[var(--border)]"} rounded-xl p-4 hover:border-[var(--primary)] hover:shadow-md transition group`}>
1245
+ <label
1246
+ className={`absolute top-2 right-2 z-10 flex items-center gap-1 text-[10px] font-semibold px-1.5 py-0.5 rounded-md border ${selected ? "border-[var(--primary)] bg-[var(--accent)] text-[var(--primary)]" : "border-[var(--border)] bg-[var(--card)] text-[var(--muted-foreground)]"} ${selectionDisabled && !selected ? "opacity-40 cursor-not-allowed" : "cursor-pointer hover:border-[var(--primary)]"}`}
1247
+ onClick={(e) => e.stopPropagation()}
1248
+ >
1249
+ <input
1250
+ type="checkbox"
1251
+ checked={selected}
1252
+ disabled={selectionDisabled && !selected}
1253
+ onChange={onToggleSelect}
1254
+ className="accent-[var(--primary)] w-3 h-3"
1255
+ />
1256
+ {selected ? "Selected" : "Compare"}
1257
+ </label>
1258
+ <button onClick={onOpen} className="w-full text-left">
1259
+ <div className="flex items-start gap-3 mb-3 pr-16">
1260
+ <div className={`w-11 h-11 rounded-lg ${color} text-white flex items-center justify-center font-bold text-sm shrink-0`}>{initials}</div>
1261
+ <div className="flex-1 min-w-0">
1262
+ <div className="text-xs text-[var(--muted-foreground)] truncate">{policy.insurer_name}</div>
1263
+ <div className="font-semibold text-sm truncate group-hover:text-[var(--primary)] transition">{policy.policy_name}</div>
1264
+ </div>
1265
+ <div className={`shrink-0 flex flex-col items-center rounded-lg overflow-hidden ${gradeColor(policy.grade)}`}>
1266
+ <div className="px-2 pt-0.5 text-[10px] font-semibold opacity-90 uppercase tracking-wide">{policy.grade}</div>
1267
+ <div className="px-2 pb-0.5 text-base font-bold leading-none">{policy.overall_score}<span className="text-[10px] font-normal opacity-80">/100</span></div>
1268
+ </div>
1269
  </div>
1270
+ <p className="text-xs text-[var(--muted-foreground)] mb-3 line-clamp-2">{policy.one_liner}</p>
1271
+ <div className="grid grid-cols-2 gap-2 text-xs">
1272
+ <Stat label="Sum insured up to" value={siDisplay} />
1273
+ <Stat label="PED waiting" value={policy.pre_existing_disease_waiting_months ? `${policy.pre_existing_disease_waiting_months} mo` : "—"} />
1274
+ <Stat label="AYUSH" value={policy.ayush_coverage === true ? "Yes" : policy.ayush_coverage === false ? "No" : "—"} />
1275
+ <Stat label="Network" value={policy.network_hospital_count ? `${(policy.network_hospital_count / 1000).toFixed(0)}K+` : "—"} />
1276
  </div>
1277
+ </button>
1278
+ </div>
 
 
 
 
 
 
 
1279
  );
1280
  }
1281
 
 
1288
  );
1289
  }
1290
 
1291
+ function FIELD_LABEL(field: string): string {
1292
+ const map: Record<string, string> = {
1293
+ policy_type: "Policy type",
1294
+ uin_code: "UIN code",
1295
+ min_entry_age: "Min entry age",
1296
+ max_entry_age: "Max entry age",
1297
+ max_renewal_age: "Max renewal age",
1298
+ sum_insured_options: "Sum insured options",
1299
+ initial_waiting_period_days: "Initial waiting period",
1300
+ pre_existing_disease_waiting_months: "Pre-existing waiting",
1301
+ maternity_waiting_months: "Maternity waiting",
1302
+ pre_hospitalization_days: "Pre-hospitalisation cover",
1303
+ post_hospitalization_days: "Post-hospitalisation cover",
1304
+ day_care_treatments_count: "Day-care treatments",
1305
+ ayush_coverage: "AYUSH covered",
1306
+ maternity_coverage: "Maternity covered",
1307
+ newborn_coverage: "Newborn covered",
1308
+ organ_donor_expenses: "Organ donor expenses",
1309
+ no_claim_bonus_pct: "No-claim bonus",
1310
+ restoration_benefit: "Restoration benefit",
1311
+ room_rent_capping: "Room rent capping",
1312
+ copayment_pct: "Co-payment",
1313
+ deductible_amount: "Deductible",
1314
+ network_hospital_count: "Network hospitals",
1315
+ cashless_treatment_supported: "Cashless supported",
1316
+ claim_settlement_ratio: "Claim settlement ratio",
1317
+ tat_cashless_authorization_hours: "Cashless TAT",
1318
+ };
1319
+ return map[field] || field.replace(/_/g, " ");
1320
+ }
1321
+
1322
+ function renderFieldValue(value: unknown, field: string): string {
1323
+ if (value === null || value === undefined || value === "") return "—";
1324
+ if (typeof value === "boolean") return value ? "Yes" : "No";
1325
+ if (Array.isArray(value)) {
1326
+ if (field === "sum_insured_options" && value.every((v) => typeof v === "number")) {
1327
+ const nums = value as number[];
1328
+ const fmt = (n: number) => (n >= 10000000 ? `${n / 10000000} cr` : `${n / 100000} L`);
1329
+ return nums.map(fmt).join(", ");
1330
+ }
1331
+ return value.map((v) => String(v)).join(", ");
1332
+ }
1333
+ if (typeof value === "number") {
1334
+ if (field.endsWith("_pct") || field === "claim_settlement_ratio") return `${value}%`;
1335
+ if (field === "network_hospital_count" && value >= 1000) return `${value.toLocaleString("en-IN")}`;
1336
+ if (field === "initial_waiting_period_days") return `${value} days`;
1337
+ if (field.endsWith("_months")) return `${value} months`;
1338
+ if (field.endsWith("_days") || field === "pre_hospitalization_days" || field === "post_hospitalization_days") return `${value} days`;
1339
+ if (field === "tat_cashless_authorization_hours") return `${value} hours`;
1340
+ if (field === "deductible_amount") return `₹${value.toLocaleString("en-IN")}`;
1341
+ return String(value);
1342
+ }
1343
+ return String(value);
1344
+ }
1345
+
1346
+ function ComparisonModal({ policyIds, onClose }: { policyIds: string[]; onClose: () => void }) {
1347
+ const [data, setData] = useState<CompareResponse | null>(null);
1348
+ const [error, setError] = useState<string | null>(null);
1349
+ useEffect(() => {
1350
+ setError(null);
1351
+ getCompare(policyIds)
1352
+ .then(setData)
1353
+ .catch((e: Error) => setError(e.message));
1354
+ }, [policyIds]);
1355
+
1356
+ return (
1357
+ <div className="fixed inset-0 z-[60] bg-black/50 flex items-center justify-center p-3 animate-fade-up" onClick={onClose}>
1358
+ <div
1359
+ className="bg-[var(--card)] rounded-2xl shadow-xl w-full max-w-6xl max-h-[92vh] overflow-y-auto scrollbar-thin"
1360
+ onClick={(e) => e.stopPropagation()}
1361
+ >
1362
+ <div className="sticky top-0 z-10 bg-[var(--card)] border-b border-[var(--border)] px-5 py-4 flex items-center justify-between">
1363
+ <div>
1364
+ <h3 className="text-base font-bold">Side-by-side comparison</h3>
1365
+ <p className="text-[11px] text-[var(--muted-foreground)] mt-0.5">
1366
+ Cells with differences are highlighted. Values come directly from each policy&apos;s wording PDF.
1367
+ </p>
1368
+ </div>
1369
+ <button
1370
+ onClick={onClose}
1371
+ className="text-xs text-[var(--muted-foreground)] hover:underline"
1372
+ >close</button>
1373
+ </div>
1374
+
1375
+ <div className="p-5">
1376
+ {error && (
1377
+ <div className="text-sm text-red-600 bg-red-50 border border-red-200 rounded-md p-3">
1378
+ Failed to load comparison: {error}
1379
+ </div>
1380
+ )}
1381
+ {!data && !error && (
1382
+ <div className="text-sm text-[var(--muted-foreground)] py-12 text-center">
1383
+ Loading comparison…
1384
+ </div>
1385
+ )}
1386
+ {data && (
1387
+ <div className="overflow-x-auto -mx-5 px-5">
1388
+ <table className="w-full border-collapse text-xs">
1389
+ <thead>
1390
+ <tr>
1391
+ <th className="text-left text-[11px] uppercase tracking-wide text-[var(--muted-foreground)] font-semibold pb-3 pr-3 sticky left-0 bg-[var(--card)]">
1392
+ Field
1393
+ </th>
1394
+ {data.policies.map((p) => {
1395
+ const color = INSURER_COLOR[p.insurer_slug] || "bg-slate-500";
1396
+ return (
1397
+ <th key={p.policy_id} className="text-left pb-3 px-2 align-bottom min-w-[180px]">
1398
+ <div className="flex items-start gap-2">
1399
+ <div className={`w-8 h-8 rounded-md ${color} text-white flex items-center justify-center font-bold text-[11px] shrink-0`}>
1400
+ {insurerInitials(p.fields.insurer_name as string || p.insurer_slug)}
1401
+ </div>
1402
+ <div className="min-w-0">
1403
+ <div className="text-[10px] text-[var(--muted-foreground)] truncate">{p.insurer_slug}</div>
1404
+ <div className="font-semibold text-xs leading-tight truncate">{p.policy_name}</div>
1405
+ {p.scorecard && (
1406
+ <div className={`inline-block mt-1 text-[10px] font-semibold px-1.5 py-0.5 rounded ${gradeColor(p.scorecard.grade)}`}>
1407
+ {p.scorecard.grade} · {p.scorecard.overall_score}/100
1408
+ </div>
1409
+ )}
1410
+ </div>
1411
+ </div>
1412
+ </th>
1413
+ );
1414
+ })}
1415
+ </tr>
1416
+ </thead>
1417
+ <tbody>
1418
+ {data.field_order.map((field, fieldIdx) => {
1419
+ const values = data.policies.map((p) => renderFieldValue(p.fields[field], field));
1420
+ const allSame = values.every((v) => v === values[0]);
1421
+ return (
1422
+ <tr key={field} className={fieldIdx % 2 === 0 ? "bg-[var(--muted)]" : ""}>
1423
+ <td className="text-[11px] font-semibold pr-3 py-2 sticky left-0 bg-inherit text-[var(--foreground)] align-top">
1424
+ {FIELD_LABEL(field)}
1425
+ </td>
1426
+ {values.map((v, i) => (
1427
+ <td
1428
+ key={i}
1429
+ className={`px-2 py-2 align-top ${allSame ? "text-[var(--muted-foreground)]" : "text-[var(--foreground)] font-medium"}`}
1430
+ >
1431
+ {v}
1432
+ </td>
1433
+ ))}
1434
+ </tr>
1435
+ );
1436
+ })}
1437
+ </tbody>
1438
+ </table>
1439
+ <p className="text-[10px] text-[var(--muted-foreground)] mt-3">
1440
+ Fields shown in bold differ across the selected policies; greyed values are identical.
1441
+ For premium estimates use the calculator on each policy&apos;s detail page.
1442
+ </p>
1443
+ </div>
1444
+ )}
1445
+ </div>
1446
+ </div>
1447
+ </div>
1448
+ );
1449
+ }
1450
+
1451
  function PolicyDetailModal({ policy, onClose }: { policy: MarketplacePolicy; onClose: () => void }) {
1452
  const [sc, setSc] = useState<ScorecardResponse | null>(null);
1453
  const [reviews, setReviews] = useState<InsurerReviews | null>(null);
frontend/tsconfig.tsbuildinfo ADDED
The diff for this file is too large to render. See raw diff
 
kb/calculations/chunk_sweep_results.md ADDED
@@ -0,0 +1,37 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Chunk-Size Hyperparameter Sweep
2
+
3
+ _Generated 2026-05-13T02:40:26Z. Re-run via `python tools/chunk_sweep.py`._
4
+
5
+ ## Headline
6
+
7
+ **Empirical winner:** `chunk_size=600`, `overlap=80` — factual 40.0%, citation 50.0%, p95 15886ms
8
+
9
+ ## All cells
10
+
11
+ | chunk_size | overlap | chunks | storage | factual | citation | refusal | p50 | p95 | ingest |
12
+ | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
13
+ | **600** | **80** | 5075 | 108.8MB | 40.0% | 50.0% | 44.4% | 10545ms | 15886ms | 2038.0s |
14
+ | **600** | **120** | 5474 | 115.5MB | 40.0% | 50.0% | 44.4% | 10545ms | 15886ms | 1661.1s |
15
+ | **800** | **80** | 3703 | 86.2MB | 40.0% | 50.0% | 44.4% | 10545ms | 15886ms | 1415.5s |
16
+ | **800** | **120** | 3915 | 93.3MB | 40.0% | 50.0% | 44.4% | 10545ms | 15886ms | 1414.5s |
17
+ | **1000** | **120** | 3051 | 88.8MB | 40.0% | 50.0% | 44.4% | 10545ms | 15886ms | 1359.4s |
18
+ | **1000** | **200** | 3339 | 92.3MB | 40.0% | 50.0% | 44.4% | 10545ms | 15886ms | 1313.4s |
19
+
20
+ ## Selection rubric
21
+
22
+ ```
23
+ score = 0.7 × factual_accuracy + 0.3 × citation_accuracy
24
+ ```
25
+ Bias toward factual accuracy; citation accuracy as a hard floor.
26
+
27
+ ## Eval methodology
28
+
29
+ - 6 cells × (25 gold Q&A questions × Groq Llama-3.3-70B judge)
30
+ - Embedder held constant: BGE-small-en-v1.5 (384-dim)
31
+ - Top-k held constant: 5
32
+ - Generator brain held constant: DeepSeek-V3 primary
33
+ - All other hyperparameters held constant — only chunk_size + overlap vary
34
+
35
+ ## Recommendation for `decisions.md` D-018
36
+
37
+ Set `CHUNK_TOKENS = 600`, `CHUNK_OVERLAP_TOKENS = 80` in `backend/config.py`.
rag/extracted/aditya-birla__activ-one__brochure._raw 2.txt ADDED
File without changes
rag/extracted/regulatory__dfs-gst-exemption-insurance-faqs-2025._raw 2.txt ADDED
File without changes
rag/extracted/regulatory__irdai-arogya-sanjeevani-policy-attachment-1._raw 2.txt ADDED
File without changes
rag/extracted/regulatory__irdai-arogya-sanjeevani-policy._raw 2.txt ADDED
File without changes
rag/extracted/regulatory__irdai-consolidated-product-filing-health-2020._raw 2.txt ADDED
File without changes
rag/extracted/regulatory__irdai-corona-kavach-press-release._raw 2.txt ADDED
File without changes
rag/extracted/regulatory__irdai-grievance-redressal-handbook._raw 2.txt ADDED
File without changes
rag/extracted/regulatory__irdai-health-insurance-regulations-2016._raw 2.txt ADDED
File without changes
rag/extracted/regulatory__irdai-insurance-act-1938-amended-2021._raw 2.txt ADDED
File without changes
rag/extracted/regulatory__irdai-master-circular-health-2024._raw 2.txt ADDED
File without changes
rag/extracted/regulatory__irdai-master-circular-health-annexure-2024._raw 2.txt ADDED
File without changes
rag/extracted/regulatory__irdai-master-circular-protection-policyholders-2024._raw 2.txt ADDED
File without changes
rag/extracted/regulatory__irdai-master-circular-standardisation-health-products-2020._raw 2.txt ADDED
File without changes
rag/extracted/regulatory__irdai-modification-standardisation-2020._raw 2.txt ADDED
File without changes
rag/extracted/regulatory__irdai-ombudsman-rules-faq-2017._raw 2.txt ADDED
File without changes
rag/extracted/regulatory__irdai-protection-policyholders-regulations-2017._raw 2.txt ADDED
File without changes
rag/extracted/regulatory__irdai-saral-suraksha-bima-guidelines._raw 2.txt ADDED
File without changes
rag/extracted/regulatory__irdai-standardisation-exclusions-amendments-2020._raw 2.txt ADDED
File without changes
rag/extracted/regulatory__nha-pmjay-operations-manual._raw 2.txt ADDED
File without changes
rag/extracted/star-health__family-health-optima__brochure._raw 2.txt ADDED
File without changes
rag/extracted/star-health__family-health-optima__wordings._raw 2.txt ADDED
File without changes
rag/extracted/star-health__health-premier__brochure._raw 2.txt ADDED
File without changes
rag/extracted/star-health__health-premier__wordings._raw 2.txt ADDED
File without changes
rag/extracted/star-health__senior-citizens-red-carpet__brochure._raw 2.txt ADDED
File without changes
rag/extracted/star-health__star-assure__wordings._raw 2.txt ADDED
File without changes
rag/extracted/star-health__star-cancer-care-platinum__wordings._raw 2.txt ADDED
File without changes
rag/extracted/star-health__star-cardiac-care-platinum__wordings._raw 2.txt ADDED
File without changes
rag/extracted/star-health__star-cardiac-care__wordings._raw 2.txt ADDED
File without changes
rag/extracted/star-health__star-comprehensive__wordings._raw 2.txt ADDED
File without changes
rag/extracted/star-health__star-hospital-cash__brochure._raw 2.txt ADDED
File without changes
rag/extracted/star-health__star-hospital-cash__brochure._raw.txt ADDED
File without changes
rag/vectors/adf11961-3807-4622-8478-cf1d55a10a1b/data_level0.bin ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:cea23bdcd452610b2004cfb7c181871e16b696b9301f78c2c5172e6b4d4642ed
3
+ size 3357028
rag/vectors/adf11961-3807-4622-8478-cf1d55a10a1b/header.bin ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:feeb58231007d442663ee38e18bdc3078f1c84914d2ee3aab01c3fcf08f801d6
3
+ size 100
rag/vectors/adf11961-3807-4622-8478-cf1d55a10a1b/index_metadata.pickle ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:2879d6f668bbab77314698d067e869fe2dd2bbcfcd6eceaa93df2c5af57a7bef
3
+ size 253764
rag/vectors/adf11961-3807-4622-8478-cf1d55a10a1b/length.bin ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:9d73870780156b0fc50de233dacf456603db060062ea55b503555be8955521b4
3
+ size 8012
rag/vectors/adf11961-3807-4622-8478-cf1d55a10a1b/link_lists.bin ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:ad7f9c9115e183825d0ced6a5df1141a4715429b3efb054d0948a827f5cb91d8
3
+ size 17804
rag/vectors/chroma.sqlite3 CHANGED
@@ -1,3 +1,3 @@
1
  version https://git-lfs.github.com/spec/v1
2
- oid sha256:ac269a3f574e2459672da2bced19e2640d78fc39eaf116b9558cf7fdb18f5698
3
- size 83136512
 
1
  version https://git-lfs.github.com/spec/v1
2
+ oid sha256:5cc501a49d70adbf2c71cd93612b7a1f32b48fa6c7e33e57150769cd1fad9032
3
+ size 87347200
tools/.pdf_etag_state.json ADDED
@@ -0,0 +1,526 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "https://bajajallianz.com/download-documents/health-insurance/health-guard-individual-policy/HG_Gold_Policy_Wording_&_CIS.pdf": {
3
+ "content_length": "644131",
4
+ "etag": "\"0x8DD49EEF25EBF0B\"",
5
+ "last_modified": "Mon, 10 Feb 2025 16:21:17 GMT",
6
+ "status": 200
7
+ },
8
+ "https://cms.careinsurance.com/cms/public/uploads/download_center/care-advantage-(health-insurance-product)---brochure.pdf": {
9
+ "content_length": "320841",
10
+ "etag": "\"687f531b-4e549\"",
11
+ "last_modified": "Tue, 22 Jul 2025 09:00:11 GMT",
12
+ "status": 200
13
+ },
14
+ "https://cms.careinsurance.com/cms/public/uploads/download_center/care-advantage-with-add-on-protect-plus-&-care-shield-brochure.pdf": {
15
+ "content_length": "1780104",
16
+ "etag": "\"698ae476-1b2988\"",
17
+ "last_modified": "Tue, 10 Feb 2026 07:55:34 GMT",
18
+ "status": 200
19
+ },
20
+ "https://cms.careinsurance.com/cms/public/uploads/download_center/care-classic---(health-insurance-product)-policy-terms-&-conditions.pdf": {
21
+ "content_length": "408233",
22
+ "etag": "\"67da9bea-63aa9\"",
23
+ "last_modified": "Wed, 19 Mar 2025 10:26:50 GMT",
24
+ "status": 200
25
+ },
26
+ "https://cms.careinsurance.com/cms/public/uploads/download_center/care-heart---piano-fold-brochure---web.pdf": {
27
+ "content_length": "302901",
28
+ "etag": "\"67da9beb-49f35\"",
29
+ "last_modified": "Wed, 19 Mar 2025 10:26:51 GMT",
30
+ "status": 200
31
+ },
32
+ "https://cms.careinsurance.com/cms/public/uploads/download_center/care-senior-brochure.pdf": {
33
+ "content_length": "318029",
34
+ "etag": "\"67c9b48a-4da4d\"",
35
+ "last_modified": "Thu, 06 Mar 2025 14:43:22 GMT",
36
+ "status": 200
37
+ },
38
+ "https://cms.careinsurance.com/cms/public/uploads/download_center/care-supreme---policy-terms-and-conditions.pdf": {
39
+ "content_length": "1772653",
40
+ "etag": "\"67c9b48a-1b0c6d\"",
41
+ "last_modified": "Thu, 06 Mar 2025 14:43:22 GMT",
42
+ "status": 200
43
+ },
44
+ "https://cms.careinsurance.com/cms/public/uploads/download_center/supreme-enhance---brochure.pdf": {
45
+ "content_length": "465556",
46
+ "etag": "\"693eb025-71a94\"",
47
+ "last_modified": "Sun, 14 Dec 2025 12:40:05 GMT",
48
+ "status": 200
49
+ },
50
+ "https://cms.careinsurance.com/cms/public/uploads/download_center/supreme-enhance---policy-terms-and-conditions.pdf": {
51
+ "content_length": "1823985",
52
+ "etag": "\"6874ae8b-1bd4f1\"",
53
+ "last_modified": "Mon, 14 Jul 2025 07:15:23 GMT",
54
+ "status": 200
55
+ },
56
+ "https://cms.careinsurance.com/cms/public/uploads/download_center/ultimate-care-----policy-terms-&-conditions.pdf": {
57
+ "content_length": "713074",
58
+ "etag": "\"689105fc-ae172\"",
59
+ "last_modified": "Mon, 04 Aug 2025 19:11:56 GMT",
60
+ "status": 200
61
+ },
62
+ "https://ditto-partners.s3.ap-south-1.amazonaws.com/Manipal+Cigna/ProHealth+(All+variants)-Policy+wording.pdf": {
63
+ "content_length": "577416",
64
+ "etag": "\"bbf281da1830dfe6595f508bca148738\"",
65
+ "last_modified": "Sun, 29 Oct 2023 06:14:32 GMT",
66
+ "status": 200
67
+ },
68
+ "https://irdai.gov.in/documents/37343/931203/MCIHLIP22211V062122.pdf": {
69
+ "content_length": "663",
70
+ "etag": "",
71
+ "last_modified": "",
72
+ "status": 404
73
+ },
74
+ "https://transactions.nivabupa.com/pages/doc/brochure/Health_Companion_V2022_Br.pdf?v=1.1": {
75
+ "content_length": "284149",
76
+ "etag": "\"b9675d85471db1:0\"",
77
+ "last_modified": "Tue, 28 Jan 2025 07:18:36 GMT",
78
+ "status": 200
79
+ },
80
+ "https://transactions.nivabupa.com/pages/doc/policy_wording/Aspire_Policy_Wordings.pdf?v=1.3": {
81
+ "content_length": "209609",
82
+ "etag": "\"094ce83bdc8dc1:0\"",
83
+ "last_modified": "Fri, 10 Apr 2026 07:42:00 GMT",
84
+ "status": 200
85
+ },
86
+ "https://transactions.nivabupa.com/pages/doc/policy_wording/Healthplus_Policy_Wordings.pdf?v=1.2": {
87
+ "content_length": "237319",
88
+ "etag": "\"f1f299d40addb1:0\"",
89
+ "last_modified": "Mon, 14 Apr 2025 05:48:21 GMT",
90
+ "status": 200
91
+ },
92
+ "https://transactions.nivabupa.com/pages/doc/policy_wording/ReAssure-2.0-Policy-Wording.pdf": {
93
+ "content_length": "608348",
94
+ "etag": "\"c2a7378a8b58dc1:0\"",
95
+ "last_modified": "Tue, 18 Nov 2025 13:02:05 GMT",
96
+ "status": 200
97
+ },
98
+ "https://transactions.nivabupa.com/pages/doc/policy_wording/ReAssure30_Policy_Wordings.pdf": {
99
+ "content_length": "951140",
100
+ "etag": "\"a17e58371668dc1:0\"",
101
+ "last_modified": "Mon, 08 Dec 2025 07:42:34 GMT",
102
+ "status": 200
103
+ },
104
+ "https://transactions.nivabupa.com/pages/doc/policy_wording/Rise_Policy_Wordings.pdf": {
105
+ "content_length": "205058",
106
+ "etag": "\"c67ebf95f3addb1:0\"",
107
+ "last_modified": "Tue, 15 Apr 2025 10:46:03 GMT",
108
+ "status": 200
109
+ },
110
+ "https://web.starhealth.in/sites/default/files/brochure/Health-Premier-Insurance-Policy-brochure.pdf": {
111
+ "error": "ReadTimeout",
112
+ "status": 0
113
+ },
114
+ "https://web.starhealth.in/sites/default/files/brochure/Senior-Citizens-Red-Carpet-Health-Insurance-Policy.pdf": {
115
+ "error": "ReadTimeout",
116
+ "status": 0
117
+ },
118
+ "https://web.starhealth.in/sites/default/files/brochure/hospital_cash_ebrochure_new.pdf": {
119
+ "error": "ReadTimeout",
120
+ "status": 0
121
+ },
122
+ "https://web.starhealth.in/sites/default/files/policy-clauses/Family-Health-Optima-Accident-Care-Policy.pdf": {
123
+ "error": "ReadTimeout",
124
+ "status": 0
125
+ },
126
+ "https://web.starhealth.in/sites/default/files/policy-clauses/Health-Premier-Insurance-Policy.pdf": {
127
+ "error": "ReadTimeout",
128
+ "status": 0
129
+ },
130
+ "https://web.starhealth.in/sites/default/files/policy-clauses/Star-Cardiac-Care-Insurance-Policy.pdf": {
131
+ "error": "ReadTimeout",
132
+ "status": 0
133
+ },
134
+ "https://web.starhealth.in/sites/default/files/policy-clauses/Star-Cardiac-Care-Insurance-Policy_Platinum.pdf": {
135
+ "error": "ReadTimeout",
136
+ "status": 0
137
+ },
138
+ "https://web.starhealth.in/sites/default/files/policy-clauses/Star-First-Comprehensive-Policy.pdf": {
139
+ "error": "ReadTimeout",
140
+ "status": 0
141
+ },
142
+ "https://web.starhealth.in/sites/default/files/policy-clauses/StarHealthAssureInsurancePolicy-Policy.pdf": {
143
+ "error": "ReadTimeout",
144
+ "status": 0
145
+ },
146
+ "https://web.starhealth.in/sites/default/files/policy-clauses/star-cancer-care-platinum-policy-clauses.pdf": {
147
+ "error": "ReadTimeout",
148
+ "status": 0
149
+ },
150
+ "https://web.starhealth.in/sites/default/files/prospectus/Family-Health-Optima-Accident-Care-Policy.pdf": {
151
+ "error": "ReadTimeout",
152
+ "status": 0
153
+ },
154
+ "https://www.adityabirlacapital.com/healthinsurance/assets/pdf/active-one/brochure.pdf": {
155
+ "content_length": "3786208",
156
+ "etag": "W/\"39c5e0-198cc7eae02\"",
157
+ "last_modified": "Thu, 21 Aug 2025 11:58:30 GMT",
158
+ "status": 200
159
+ },
160
+ "https://www.adityabirlacapital.com/healthinsurance/assets/pdf/new_updated_pdf/Group-Activ-Health-Policy-wordings.pdf": {
161
+ "content_length": "1063254",
162
+ "etag": "W/\"103956-19c93653523\"",
163
+ "last_modified": "Wed, 25 Feb 2026 06:03:29 GMT",
164
+ "status": 200
165
+ },
166
+ "https://www.adityabirlacapital.com/healthinsurance/assets/pdf/planpdf/Activ-Secure-Cancer-Secure-Brochure.pdf": {
167
+ "content_length": "1817026",
168
+ "etag": "W/\"1bb9c2-198cc7eb082\"",
169
+ "last_modified": "Thu, 21 Aug 2025 11:58:31 GMT",
170
+ "status": 200
171
+ },
172
+ "https://www.adityabirlacapital.com/healthinsurance/assets/pdf/planpdf/Activ-Secure-PW.pdf": {
173
+ "content_length": "641990",
174
+ "etag": "W/\"9cbc6-198cc7eb092\"",
175
+ "last_modified": "Thu, 21 Aug 2025 11:58:31 GMT",
176
+ "status": 200
177
+ },
178
+ "https://www.adityabirlacapital.com/healthinsurance/assets/pdf/policy-wording-form.pdf": {
179
+ "content_length": "1053902",
180
+ "etag": "W/\"1014ce-190e9336d20\"",
181
+ "last_modified": "Thu, 25 Jul 2024 09:23:00 GMT",
182
+ "status": 200
183
+ },
184
+ "https://www.adityabirlacapital.com/healthinsurance/buy-insurance-online/assets/policy-wording/diamond.pdf": {
185
+ "content_length": "311556",
186
+ "etag": "\"90e07393aded71:0\"",
187
+ "last_modified": "Sat, 20 Nov 2021 18:11:27 GMT",
188
+ "status": 200
189
+ },
190
+ "https://www.bajajallianz.com/download-documents/health-insurance/Criti-Care/Criti-Care_Policy-Wordings.pdf": {
191
+ "content_length": "545576",
192
+ "etag": "\"0x8DD49EF749F1443\"",
193
+ "last_modified": "Mon, 10 Feb 2025 16:24:55 GMT",
194
+ "status": 200
195
+ },
196
+ "https://www.bajajallianz.com/download-documents/health-insurance/GROUP-PERSONAL-ACCIDENT-Policy-Wordings.pdf": {
197
+ "content_length": "507249",
198
+ "etag": "\"0x8DD50FFC6346B94\"",
199
+ "last_modified": "Wed, 19 Feb 2025 16:09:22 GMT",
200
+ "status": 200
201
+ },
202
+ "https://www.bajajallianz.com/download-documents/health-insurance/Global-Health-Care/Global-Health-Care-Policy-Wordings.pdf": {
203
+ "content_length": "1280603",
204
+ "etag": "\"0x8DD49EF394E849E\"",
205
+ "last_modified": "Mon, 10 Feb 2025 16:23:16 GMT",
206
+ "status": 200
207
+ },
208
+ "https://www.bajajallianz.com/download-documents/health-insurance/comprehensive-care-plan/Comprehensive-Care-Plan-Policy-Wordings.pdf": {
209
+ "content_length": "901442",
210
+ "etag": "\"0x8DD49EF863B58F5\"",
211
+ "last_modified": "Mon, 10 Feb 2025 16:25:25 GMT",
212
+ "status": 200
213
+ },
214
+ "https://www.bajajallianz.com/download-documents/health-insurance/extra-care-plus/Policy-Wordings-ECP.pdf": {
215
+ "content_length": "600497",
216
+ "etag": "\"0x8DD49EF5B02E822\"",
217
+ "last_modified": "Mon, 10 Feb 2025 16:24:12 GMT",
218
+ "status": 200
219
+ },
220
+ "https://www.bajajallianz.com/download-documents/health-insurance/extra-care/Extra-Care-Policy.pdf": {
221
+ "content_length": "121",
222
+ "etag": "",
223
+ "last_modified": "",
224
+ "status": 404
225
+ },
226
+ "https://www.bajajallianz.com/download-documents/health-insurance/health-guard-group/Group-HG-Gold-Policy-Wordings.pdf": {
227
+ "content_length": "1276641",
228
+ "etag": "\"0x8DD49EEF639EDF9\"",
229
+ "last_modified": "Mon, 10 Feb 2025 16:21:23 GMT",
230
+ "status": 200
231
+ },
232
+ "https://www.bajajallianz.com/download-documents/health-insurance/health-guard/Health-Guard-Policy-Wordings-print.pdf": {
233
+ "content_length": "1355654",
234
+ "etag": "\"0x8DD49EEEB9A63C8\"",
235
+ "last_modified": "Mon, 10 Feb 2025 16:21:06 GMT",
236
+ "status": 200
237
+ },
238
+ "https://www.bajajallianz.com/download-documents/health-insurance/silver-health/silver_health_CIS.pdf": {
239
+ "content_length": "297077",
240
+ "etag": "\"0x8DD49EE8686428D\"",
241
+ "last_modified": "Mon, 10 Feb 2025 16:18:16 GMT",
242
+ "status": 200
243
+ },
244
+ "https://www.bajajallianz.com/download-documents/health-insurance/tax-gain/tax_gain_CIS.pdf": {
245
+ "content_length": "480244",
246
+ "etag": "\"0x8DD49EE71F8771C\"",
247
+ "last_modified": "Mon, 10 Feb 2025 16:17:41 GMT",
248
+ "status": 200
249
+ },
250
+ "https://www.hdfcergo.com/docs/default-source/downloads/brochures/myhealth-women-suraksha-with-premium-table.pdf": {
251
+ "content_length": "1075799",
252
+ "etag": "",
253
+ "last_modified": "Mon, 05 May 2025 07:43:29 GMT",
254
+ "status": 200
255
+ },
256
+ "https://www.hdfcergo.com/docs/default-source/downloads/policy-wordings/health/energy-combined-pw-cis.pdf": {
257
+ "content_length": "408865",
258
+ "etag": "",
259
+ "last_modified": "Thu, 11 Sep 2025 11:40:56 GMT",
260
+ "status": 200
261
+ },
262
+ "https://www.hdfcergo.com/docs/default-source/downloads/policy-wordings/health/group-health-insurance---pw.pdf": {
263
+ "content_length": "1068477",
264
+ "etag": "",
265
+ "last_modified": "Thu, 24 Jul 2025 07:27:11 GMT",
266
+ "status": 200
267
+ },
268
+ "https://www.hdfcergo.com/docs/default-source/downloads/policy-wordings/health/my-optima-secure_old_pws.pdf": {
269
+ "content_length": "502553",
270
+ "etag": "",
271
+ "last_modified": "Mon, 13 Feb 2023 13:11:44 GMT",
272
+ "status": 200
273
+ },
274
+ "https://www.hdfcergo.com/docs/default-source/downloads/policy-wordings/health/optima-plus-policy-wordings.pdf": {
275
+ "content_length": "345712",
276
+ "etag": "",
277
+ "last_modified": "Fri, 11 Jul 2025 13:28:38 GMT",
278
+ "status": 200
279
+ },
280
+ "https://www.hdfcergo.com/docs/default-source/downloads/policy-wordings/health/optima-secure-revision-pw.pdf": {
281
+ "content_length": "625359",
282
+ "etag": "",
283
+ "last_modified": "Fri, 11 Jul 2025 13:52:34 GMT",
284
+ "status": 200
285
+ },
286
+ "https://www.hdfcergo.com/docs/default-source/downloads/policy-wordings/health/total-health-plan--oct-2021.pdf": {
287
+ "content_length": "342798",
288
+ "etag": "",
289
+ "last_modified": "Fri, 01 Oct 2021 12:56:15 GMT",
290
+ "status": 200
291
+ },
292
+ "https://www.hdfcergo.com/docs/default-source/downloads/policy-wordings/others/optima-enhance-policy-wording.pdf": {
293
+ "content_length": "905652",
294
+ "etag": "",
295
+ "last_modified": "Thu, 05 Oct 2023 11:02:21 GMT",
296
+ "status": 200
297
+ },
298
+ "https://www.hdfcergo.com/docs/default-source/downloads/policy-wordings/others/policy-wordings---prime---hrc.pdf": {
299
+ "content_length": "698083",
300
+ "etag": "",
301
+ "last_modified": "Thu, 05 Oct 2023 11:02:27 GMT",
302
+ "status": 200
303
+ },
304
+ "https://www.hdfcergo.com/docs/default-source/downloads/prospectus/health/my_sampoorna_suraksha.pdf": {
305
+ "content_length": "647174",
306
+ "etag": "",
307
+ "last_modified": "Fri, 14 Mar 2025 20:02:35 GMT",
308
+ "status": 200
309
+ },
310
+ "https://www.hdfcergo.com/docs/default-source/downloads/prospectus/health/myhealth-suraksha---prospectus.pdf": {
311
+ "content_length": "444631",
312
+ "etag": "",
313
+ "last_modified": "Sat, 15 Mar 2025 04:46:49 GMT",
314
+ "status": 200
315
+ },
316
+ "https://www.hdfcergo.com/documents/downloads/HEHI/Presales-Set-2/OR-Brochure-Revision-V2.pdf": {
317
+ "content_length": "269430",
318
+ "etag": "\"c64d388612b9d61:0\"",
319
+ "last_modified": "Thu, 12 Nov 2020 16:40:26 GMT",
320
+ "status": 200
321
+ },
322
+ "https://www.icicilombard.com/docs/default-source/apps/elevateapp/assets/pdf/elevate-policy-wordings.pdf": {
323
+ "content_length": "488",
324
+ "etag": "",
325
+ "last_modified": "",
326
+ "status": 403
327
+ },
328
+ "https://www.icicilombard.com/docs/default-source/apps/healthclientapp/assets/pdf/health-advantedge-policy-wordings.pdf": {
329
+ "content_length": "507",
330
+ "etag": "",
331
+ "last_modified": "",
332
+ "status": 403
333
+ },
334
+ "https://www.icicilombard.com/docs/default-source/default-document-library/health-booster_policy-wordings.pdf": {
335
+ "content_length": "493",
336
+ "etag": "",
337
+ "last_modified": "",
338
+ "status": 403
339
+ },
340
+ "https://www.icicilombard.com/docs/default-source/default-document-library/health-shield-360-retail_pw.pdf": {
341
+ "content_length": "494",
342
+ "etag": "",
343
+ "last_modified": "",
344
+ "status": 403
345
+ },
346
+ "https://www.icicilombard.com/docs/default-source/default-document-library/icihlip23144v072223-icici-lombard-complete-health-insurance.pdf": {
347
+ "content_length": "530",
348
+ "etag": "",
349
+ "last_modified": "",
350
+ "status": 403
351
+ },
352
+ "https://www.icicilombard.com/docs/default-source/policy-wordings-product-brochure/arogya-sanjeevani-policy-policy-wordings.pdf": {
353
+ "content_length": "519",
354
+ "etag": "",
355
+ "last_modified": "",
356
+ "status": 403
357
+ },
358
+ "https://www.icicilombard.com/docs/default-source/policy-wordings-product-brochure/complete-health-insurance-(health-elite-plus).pdf": {
359
+ "content_length": "536",
360
+ "etag": "",
361
+ "last_modified": "",
362
+ "status": 403
363
+ },
364
+ "https://www.icicilombard.com/docs/default-source/policy-wordings-product-brochure/complete-health-insurance-(health-shield).pdf": {
365
+ "content_length": "528",
366
+ "etag": "",
367
+ "last_modified": "",
368
+ "status": 403
369
+ },
370
+ "https://www.icicilombard.com/docs/default-source/policy-wordings-product-brochure/health-shield-360-retail---cis.pdf": {
371
+ "content_length": "517",
372
+ "etag": "",
373
+ "last_modified": "",
374
+ "status": 403
375
+ },
376
+ "https://www.manipalcigna.com/documents/20124/0/7-ProHealth-Prime-P-A-Prospectus-April-22-02.pdf/8c1b2d11-4129-e0a3-ad94-1ecc19ecfd58": {
377
+ "content_length": "272897",
378
+ "etag": "",
379
+ "last_modified": "",
380
+ "status": 404
381
+ },
382
+ "https://www.manipalcigna.com/documents/20124/0/Sarvah-Param-Prospectus/c2543c7b-764d-2157-7f4c-214616f20ff4": {
383
+ "content_length": "452029",
384
+ "etag": "",
385
+ "last_modified": "Sun, 09 Nov 2025 19:35:16 GMT",
386
+ "status": 200
387
+ },
388
+ "https://www.manipalcigna.com/documents/20124/0/Sarvah-Param-TnC/19341cbc-41ae-b938-feac-cc7e373fbc0d": {
389
+ "content_length": "1240182",
390
+ "etag": "",
391
+ "last_modified": "Sun, 09 Nov 2025 19:39:58 GMT",
392
+ "status": 200
393
+ },
394
+ "https://www.manipalcigna.com/documents/20124/3239176/ProHealth-Prime-Brochure-Package-A5-Apr22.pdf/659df7db-5ef7-9ebf-7133-cbf3e7b6139d": {
395
+ "content_length": "272924",
396
+ "etag": "",
397
+ "last_modified": "",
398
+ "status": 404
399
+ },
400
+ "https://www.manipalcigna.com/documents/20124/350424/17+ProHealthSelect_TnC_Jul19.pdf/9104b961-e417-956b-ab41-1af27c869e0a?t=1611243593613": {
401
+ "content_length": "1932138",
402
+ "etag": "",
403
+ "last_modified": "Thu, 21 Jan 2021 15:39:53 GMT",
404
+ "status": 200
405
+ },
406
+ "https://www.newindia.co.in/assets/docs/know-more/health/asha-kiran-policy/Customer%20Information%20Sheet%20NEW%20INDIA%20ASHA%20KIRAN%20POLICY.pdf": {
407
+ "content_length": "",
408
+ "etag": "W/\"3d7d94-qsGY6odTtwNUwlHf6J7LkLaYcJ0-gzip:dtagent10257230921194352Ckbr:dtagent10257230921194352Ckbr\"",
409
+ "last_modified": "",
410
+ "status": 200
411
+ },
412
+ "https://www.newindia.co.in/assets/docs/know-more/health/asha-kiran-policy/Prospectus%20New%20India%20Asha%20Kiran%20Policy%20wef%2001%2004%202021.pdf": {
413
+ "content_length": "",
414
+ "etag": "W/\"3d7d94-BPRC/p1F7hq/oq7h6vmF4POZiWo-gzip:dtagent10257230921194352Ckbr:dtagent10257230921194352Ckbr\"",
415
+ "last_modified": "",
416
+ "status": 200
417
+ },
418
+ "https://www.newindia.co.in/assets/docs/know-more/health/floater-mediclaim-policy/Policy%20Clause%20New%20India%20Floater%20Mediclaim%20Policy%20wef%2001%2010%202024.pdf": {
419
+ "content_length": "",
420
+ "etag": "W/\"3d7d94-nGJziGU7LrVj1pFBNx28D5lKq/E-gzip:dtagent10257230921194352Ckbr:dtagent10257230921194352Ckbr\"",
421
+ "last_modified": "",
422
+ "status": 200
423
+ },
424
+ "https://www.newindia.co.in/assets/docs/know-more/health/janata-mediclaim-policy/Policy%20Clause%20Janata%20Mediclaim%20Policy.pdf": {
425
+ "content_length": "",
426
+ "etag": "W/\"3d7d94-0DOSZhfzACAdWn0tUR9HGTxgUe0-gzip:dtagent10257230921194352Ckbr:dtagent10257230921194352Ckbr\"",
427
+ "last_modified": "",
428
+ "status": 200
429
+ },
430
+ "https://www.newindia.co.in/assets/docs/know-more/health/new-india-mediclaim-policy/PolicyClauseNewIndiaMediclaimPolicy(NIAHLIP23187V052223).pdf": {
431
+ "content_length": "",
432
+ "etag": "W/\"3d7d94-fMfGWQmXsWkTTc+wQE0A3aHK71o-gzip:dtagent10257230921194352Ckbr:dtagent10257230921194352Ckbr\"",
433
+ "last_modified": "",
434
+ "status": 200
435
+ },
436
+ "https://www.newindia.co.in/assets/docs/know-more/health/new-india-mediclaim-policy/Prospectus%20New%20India%20Mediclaim%20Policy.pdf": {
437
+ "content_length": "",
438
+ "etag": "W/\"3d7d94-nPX4qLlcoXP40Vz01riDqkx5Fuo-gzip:dtagent10257230921194352Ckbr:dtagent10257230921194352Ckbr\"",
439
+ "last_modified": "",
440
+ "status": 200
441
+ },
442
+ "https://www.newindia.co.in/assets/docs/know-more/health/universal-health-insurance/Policy%20Clause%20Universal%20Health%20Insurance%20Policy.pdf": {
443
+ "content_length": "",
444
+ "etag": "W/\"3d7d94-7RnkZDXTl9bnifr+E+UeeViQDtw-gzip:dtagent10257230921194352Ckbr:dtagent10257230921194352Ckbr\"",
445
+ "last_modified": "",
446
+ "status": 200
447
+ },
448
+ "https://www.newindia.co.in/assets/docs/know-more/health/yuva-bharat-health-policy/Policy%20Clause%20Yuva%20Bharat%20Health%20Policy%20%20wef%2001%2010%202024_1.pdf": {
449
+ "content_length": "",
450
+ "etag": "W/\"3d7d94-BZhtk430IzfR9myivyfzo72czXw-gzip:dtagent10257230921194352Ckbr:dtagent10257230921194352Ckbr\"",
451
+ "last_modified": "",
452
+ "status": 200
453
+ },
454
+ "https://www.nivabupa.com/content/dam/nivabupa/PDF/Saral%20Suraksha%20Bima_Policy%20Wording.pdf": {
455
+ "content_length": "427307",
456
+ "etag": "W/\"6852b-be9hm0bk1bzvERHkBMexTelYtFI\"",
457
+ "last_modified": "",
458
+ "status": 200
459
+ },
460
+ "https://www.nivabupa.com/content/dam/nivabupa/PDF/health-companion-policy-wording.pdf": {
461
+ "content_length": "365996",
462
+ "etag": "W/\"595ac-kBAr0WOUtXQJHzShOCDl5guFJoU\"",
463
+ "last_modified": "",
464
+ "status": 200
465
+ },
466
+ "https://www.nivabupa.com/content/dam/nivabupa/PDF/health-premia/Health%20Premia%20Policy%20Wording.pdf": {
467
+ "content_length": "582230",
468
+ "etag": "\"5c78a7e99c89db1:0\"",
469
+ "last_modified": "Fri, 28 Feb 2025 04:54:56 GMT",
470
+ "status": 200
471
+ },
472
+ "https://www.nivabupa.com/content/dam/nivabupa/PDF/senior-first/Senior_First_Policy_Wordings.pdf": {
473
+ "content_length": "215020",
474
+ "etag": "W/\"347ec-BoYGtT90l9FdMi1GJJFrbor7e2M\"",
475
+ "last_modified": "",
476
+ "status": 200
477
+ },
478
+ "https://www.tataaig.com/s3/Medicare_LITE_CIS_aa38ff0767.pdf": {
479
+ "content_length": "323595",
480
+ "etag": "\"66351f390179b43c8495b6155e83261a\"",
481
+ "last_modified": "Wed, 17 Dec 2025 16:11:02 GMT",
482
+ "status": 200
483
+ },
484
+ "https://www.tataaig.com/s3/Medicare_LITE_Policy_Wordings_4fdf058f02.pdf": {
485
+ "content_length": "67548023",
486
+ "etag": "\"245fd2093792f4e3d43866eff6720a78-13\"",
487
+ "last_modified": "Wed, 29 Apr 2026 05:21:23 GMT",
488
+ "status": 200
489
+ },
490
+ "https://www.tataaig.com/s3/TATA_AIG_Medicare_Premier_Customer_information_Sheet_2e2c10e8d0.pdf": {
491
+ "content_length": "384745",
492
+ "etag": "\"6ea3df4a19e863f8c4a41026c45ff219\"",
493
+ "last_modified": "Thu, 18 Dec 2025 05:11:41 GMT",
494
+ "status": 200
495
+ },
496
+ "https://www.tataaig.com/s3/Tata_AIG_Criti_Medicare_Policy_Wordings_8c77c53956.pdf": {
497
+ "content_length": "405890",
498
+ "etag": "\"d12d8fd477098d2914fc0ca0a15ee7d2\"",
499
+ "last_modified": "Fri, 22 Apr 2022 05:01:11 GMT",
500
+ "status": 200
501
+ },
502
+ "https://www.tataaig.com/s3/Tata_AIG_Medi_Care_82932b277a.pdf": {
503
+ "content_length": "233850",
504
+ "etag": "\"b906d00438ee044629dbdd0cdc1cc26e\"",
505
+ "last_modified": "Tue, 19 Apr 2022 10:25:20 GMT",
506
+ "status": 200
507
+ },
508
+ "https://www.tataaig.com/s3/Tata_AIG_Medi_Care_Premier_2f02f3813c.pdf": {
509
+ "content_length": "234519",
510
+ "etag": "\"05a71813d4615b074a2bb43e85539307\"",
511
+ "last_modified": "Thu, 29 Dec 2022 10:31:39 GMT",
512
+ "status": 200
513
+ },
514
+ "https://www.tataaig.com/s3/Wellsurance_Family_CIS_96593ef551.PDF": {
515
+ "content_length": "51903",
516
+ "etag": "\"d45965c384a44d5a3012954993e48b4c\"",
517
+ "last_modified": "Fri, 08 Oct 2021 05:30:48 GMT",
518
+ "status": 200
519
+ },
520
+ "https://www.tataaig.com/s3/medicare_select_prospectus_efd23b0ad6.pdf": {
521
+ "content_length": "510552",
522
+ "etag": "\"d6ab5f99d5d44c3ba829f0417a380d67\"",
523
+ "last_modified": "Fri, 16 May 2025 08:28:58 GMT",
524
+ "status": 200
525
+ }
526
+ }
tools/CRON_README.md ADDED
@@ -0,0 +1,122 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Knowledge-base refresh schedule
2
+
3
+ This project's knowledge base — policy PDFs, premium anchors, insurer reviews,
4
+ all source URLs — would slowly rot without automation. Insurer sites change
5
+ filenames, IRDAI replaces annual reports, aggregator ratings move. The schedule
6
+ below keeps everything fresh without us touching it.
7
+
8
+ ## What "cron" means
9
+
10
+ "Cron" is a unix term for a job that runs on a fixed schedule, unattended.
11
+ The name comes from `chronos` (Greek for "time"). The original `cron` daemon
12
+ on Linux servers reads a table of `min hour day month weekday command` rows
13
+ and fires each command at its scheduled time.
14
+
15
+ On macOS the modern equivalent is `launchd`, configured by XML plist files
16
+ under `~/Library/LaunchAgents/`. A LaunchAgent is essentially a cron entry —
17
+ it tells the OS "wake up at X, run this command, log the output." The macOS
18
+ scheduler honors these even when the laptop is asleep (it queues them and
19
+ runs at the next wake), and respects per-user permissions.
20
+
21
+ This project uses three LaunchAgents + one manual script. They run themselves
22
+ in the background. You don't have to remember anything.
23
+
24
+ ## The four jobs
25
+
26
+ | Frequency | Job | Plist label | What it does | Auto-fix |
27
+ |---|---|---|---|---|
28
+ | Daily 03:00 | Link-rot | `com.rohit.insurancebot.linkrot` | HEAD every external URL in the KB | Wayback Machine snapshot; http↔https swap; query-string strip |
29
+ | Weekly Sun 04:00 | PDF freshness | `com.rohit.insurancebot.pdfetags` | ETag/Last-Modified diff for every policy PDF | Re-download + delete-from-Chroma + re-ingest |
30
+ | Monthly 1st 06:00 | Premium refresh | `com.rohit.insurancebot.premiums` | Re-fetch every premium anchor; detect price drift; HEAD aggregator URLs | Wayback if dead; >15% drift goes to MUST_FIX |
31
+ | Quarterly (manual) | Full rebuild | `bash tools/quarterly_rebuild.sh` | Wipe Chroma, re-ingest everything, re-extract schema, rebuild KB pages, run gold eval | — |
32
+
33
+ ## Auto-fix philosophy
34
+
35
+ Every cron job is **detect → auto-fix → report**:
36
+
37
+ 1. **Detect** — record the issue with structured logs in `~/Library/Logs/insurance-bot/`
38
+ 2. **Auto-fix** — try every safe repair strategy applicable to that error class
39
+ 3. **Report** — if and only if no fix worked, write to `MUST_FIX.md` at the project root and post a macOS notification
40
+
41
+ **Things we auto-fix without asking:**
42
+ - Dead URLs → swap to working Wayback snapshot
43
+ - Stale PDFs → re-download + re-ingest
44
+ - Cosmetic URL drift (http↔https, query-string ambiguity)
45
+
46
+ **Things we don't auto-fix (logged to MUST_FIX.md instead):**
47
+ - Premium price drift > 15% — a real rate change needs human eyeballs
48
+ - PDF re-ingest crashes — could mask a schema regression
49
+ - Hosts that block bots entirely — manually verify via Playwright
50
+
51
+ `MUST_FIX.md` is regenerated every run, so it always reflects current state.
52
+ If it's missing, everything is clean.
53
+
54
+ ## What gets logged
55
+
56
+ ```
57
+ ~/Library/Logs/insurance-bot/
58
+ ├── link_rot.log # JSON-per-URL audit trail (append-only)
59
+ ├── link_rot.stdout.log # Summary stdout
60
+ ├── link_rot.stderr.log # Any crashes
61
+ ├── pdf_etags.log # ETag history per policy URL
62
+ ├── premium_refresh.log # Price-drift detail
63
+ └── com.rohit.insurancebot.*.{out,err}.log # launchd's own view
64
+ ```
65
+
66
+ Tail any log with `tail -f` to watch live.
67
+
68
+ ## Operations
69
+
70
+ ```bash
71
+ # Trigger any job manually
72
+ launchctl start com.rohit.insurancebot.linkrot
73
+ launchctl start com.rohit.insurancebot.pdfetags
74
+ launchctl start com.rohit.insurancebot.premiums
75
+
76
+ # Run the quarterly full rebuild (interactive)
77
+ bash tools/quarterly_rebuild.sh
78
+
79
+ # Check which agents are loaded + last exit code
80
+ launchctl list | grep com.rohit.insurancebot
81
+
82
+ # Disable a job
83
+ launchctl unload ~/Library/LaunchAgents/com.rohit.insurancebot.linkrot.plist
84
+
85
+ # Re-enable / re-install everything
86
+ bash tools/install_crons.sh
87
+ ```
88
+
89
+ ## Why scripts live in `~/Library/Scripts/` not the project
90
+
91
+ macOS Transparency, Consent, and Control (TCC) blocks launchd-spawned shells
92
+ from reading files in `~/Documents/` unless Full Disk Access is granted.
93
+ The wrapper scripts are installed under `~/Library/Scripts/insurance-bot/`
94
+ which TCC doesn't gate. Those wrappers `cd` into the project and invoke the
95
+ project's venv Python (which itself isn't TCC-restricted because it lives
96
+ inside a user-owned project directory).
97
+
98
+ This is the same lesson learned from the AI Thesis project's cache-sweeper
99
+ incident (May 2026) — LaunchAgent scripts under `~/Documents/` silently fail
100
+ with exit code 126 ("Operation not permitted") and never run.
101
+
102
+ ## Why the venv Python, not the system Python
103
+
104
+ The system `python3` at `/Library/Developer/CommandLineTools/usr/bin/python3`
105
+ is itself TCC-restricted when invoked from launchd context. The project's
106
+ `.venv/bin/python3` is not (it's a binary inside the user's project, owned
107
+ by the user, not under any system path). Plus the venv has `httpx` already
108
+ installed — system Python doesn't.
109
+
110
+ ## First-time install
111
+
112
+ ```bash
113
+ cd "Insurance Sales Bot"
114
+ bash tools/install_crons.sh
115
+ ```
116
+
117
+ The installer:
118
+ 1. Writes wrapper shell scripts to `~/Library/Scripts/insurance-bot/`
119
+ 2. Writes LaunchAgent plists to `~/Library/LaunchAgents/`
120
+ 3. Loads each agent with `launchctl load`
121
+ 4. Runs a TCC self-test by firing the link-rot job and checking stderr
122
+ 5. If TCC is blocking, opens the relevant System Settings pane and exits 2