# PBP clinical diagnostic therapeutic (cleaned view)

`medicare_semantic.vw_pbp_clinical_diagnostic_therapeutic` · Medicare Advantage, Part D, Medicaid · status live

Cleaned source-faithful PBP clinical diagnostic therapeutic rows: era-normalized, CMS codes decoded, with offered_status/numeric_amount_observability/null_amount_reason/annualization_policy/combined_limit_policy/confidence_tier. The agent r

**Grain.** One row per MA plan SEGMENT per benefit YEAR per quarterly SNAPSHOT per diagnostic/therapeutic SUB-BENEFIT. Verified-unique on contract_id × plan_id × segment_id × report_year × quarter × cdt_sub_benefit = 738,390 distinct = 738,390 total rows (max rows per that key = 1, zero duplicate groups). Each of the 5 sub-benefits appears exactly 147,678 times (738,390 / 5), perfectly balanced — every plan-snapshot emits all 5 B8 sub-sections. NOTE: a single plan-year is NOT one row; it appears once per quarter CMS republished the PBP (1–4 quarters) and once per sub-benefit, so one plan-year = up to 20 rows (4 quarters × 5 sub-benefits).

**How to use it.** To get the current in-network cost share an MA plan charges for MRI/CT (complex imaging) in 2026: SELECT contract_id, plan_id, segment_id, cost_share_string, copay_amount_min, copay_amount_max, coinsurance_pct, auth_required FROM medicare_semantic.vw_pbp_clinical_diagnostic_therapeutic WHERE report_year=2026 AND cdt_sub_benefit='complex_imaging'. Because 2026 has only Q1 this is already the latest snapshot; for years with multiple quarters add a MAX(quarter)-per-plan filter to avoid counting the same plan-year 2–4 times. Answers 'what does plan H0028-007 charge a member for complex imaging, and does it need prior auth?'

**Traps.**
- report_year is the benefit year; quarter is a QUARTERLY SNAPSHOT of the SAME annual filing, not a distinct benefit period. The same plan-year appears once per released quarter (1–4) AND once per sub-benefit, so a plan-year = up to 20 rows. To dedupe to one view-of-record per plan-year, take MAX(quarter) per report_year (e.g. 2026 only has Q1; 2021/2025 Q1 only; 2020 missing Q3). There is NO is_current column.
- copay_amount and coinsurance_pct are the MINIMUM, not a single true value: copay_amount = copay_amount_min and coinsurance_pct = coinsurance_pct_min in 100% of non-null rows. A single row bundles multiple service lines under one sub-benefit, so the _max column often differs (copay max differs from min in 165K rows; e.g. '$0 copay' point but max=$65). Read min AND max to see the real spread; the point column understates the high end.
- NULL ≠ zero and NULL ≠ false. 35,490 rows have has_copay/has_coinsurance/cost_share_string/copay/coinsurance all NULL = benefit offered but cost share unknown/unparsed (null_amount_reason='unknown_requires_crosswalk'), NOT free. auth_required/referral_required are NULL in 39,745 rows (NULL ≠ not-required). Also has_copay=true does NOT guarantee a numeric copay_amount (flag is true in 434K rows but the amount is populated in only 355K).
- This is a COST-SHARE / benefit-design table (what the member pays per the plan filing), NOT prices, allowed amounts, or paid claims. The entire benefit_amount_* and limit_* dollar/quantity families are 100% NULL here; network_type is constant 'in_network' (no out-of-network); has_deductible is constant false and max_oop_applies constant true. confidence_tier='source_faithful' means as-filed, never reconciled to consumer EOC/SB (consumer_document_reconciliation_status='not_checked').
- Identity requires ALL of contract_id + plan_id + segment_id — plan_id is only unique within a contract, and segment_id ('0' for 91%, but 1–16 for segmented plans) is part of the grain. cdt_sub_benefit (5 values) is 1:1 with source_pbp_section and is a required grain axis: each plan-snapshot has exactly 5 rows (one per B8 sub-section, each balanced at 147,678), so cost share for, say, complex_imaging vs diagnostic_lab lives in different rows of the same plan.

| column | type | meaning |
|---|---|---|
| contract_id | string | CMS MA contract ID (e.g. H0028, H0022). 1,270 distinct. First piece of the plan identity. Format H####/R####/etc. |
| plan_id | string | Plan ID within the contract (e.g. 001, 007), zero-padded string. 656 distinct values; only unique WITHIN a contract. |
| segment_id | string | Plan segment (regional sub-division of a plan offering different benefits by area). String '0' for 91% of rows (non-segmented); '1'..'16' for segmented plans. Part of the grain — do not drop. |
| version | double | CMS PBP submission/version number for that plan-year (double 1.0–~12.0). Exactly one value per grain row (already deduped to the filed version); higher = later resubmission within the year. Not part of the grain. |
| report_year | double | The benefit/plan year the cost-sharing applies to. Ranges 2018–2026. This is the real time dimension for 'what does the plan charge in year X'. |
| quarter | double | Quarterly snapshot (1–4) of the PBP within report_year — the same annual filing republished by CMS each quarter. NOT a different benefit period. Coverage is uneven (e.g. 2021/2025/2026 only have Q1; 2020 missing Q3). To get the definitive view of a year, pick MAX(quarter) per report_year. Part of grain. |
| benefit_category | string | Constant = 'clinical_diagnostic_therapeutic' for all 738,390 rows. Identifies which sibling PBP view this is; carries no row-level signal. |
| cost_share_string | string | Human-readable cost share as filed, e.g. '20.0%', '$0 copay', '$0 copay + 20.0%', '$60.0 copay'. ~12% NULL (90,416 rows = cost share unknown/unparsed). A plan can carry BOTH a copay and a coinsurance ('$0 copay + 20.0%'). |
| copay_amount | double | Member copay in $ — but this is the MINIMUM/representative value: copay_amount = copay_amount_min in 100% of non-null cases. Non-null in 355,289 rows (48%); range $0–$450, avg ~$20.5. NULL ≠ $0 — NULL means no copay parsed (could be coinsurance-based or unknown). |
| coinsurance_pct | double | Member coinsurance percent — the MINIMUM/representative value (= coinsurance_pct_min in 100% of non-null cases). Non-null in 317,560 rows (43%); range 0–50%. NULL ≠ 0% (means coinsurance not the basis / unknown). |
| limit_text | string |  |
| auth_required | boolean | Prior authorization required (boolean), NULLABLE. true in 622,099, NULL in 39,745 (NULL ≠ false). Most diagnostic/therapeutic services require auth. Non-null in 698,645 rows. |
| referral_required | boolean | Referral required (boolean), NULLABLE. true in 193,310, NULL in 39,745 (same null rows as auth). Non-null 698,645. |
| network_type | varchar(10) | CONSTANT 'in_network' for all rows — this view contains only the in-network cost share. (Out-of-network B8 terms are not represented here.) |
| max_oop_applies | boolean | Whether this benefit counts toward the plan MOOP — CONSTANT true across all 738,390 rows. No row-level signal for this category. |
| limit_quantity | double |  |
| limit_unit | string |  |
| limit_period_code | string |  |
| limit_period_label | string |  |
| limit_quantity_per_year | double |  |
| benefit_amount | double |  |
| benefit_amount_kind | string |  |
| benefit_amount_period_code | string |  |
| benefit_amount_period_label | string |  |
| benefit_amount_annualized | double |  |
| benefit_amount_pmpm | double |  |
| normalization_status | string |  |
| normalization_basis | string |  |
| aggregation_policy | string |  |
| offered_status | varchar(15) | CONSTANT 'offered' — this view holds only the offered universe (every plan-snapshot emits all 5 sub-benefits as 'offered'). |
| numeric_amount_observability | varchar(31) | CONSTANT 'offered_without_numeric_amounts' — declares that B8 is captured as offered/cost-share but without dollar benefit amounts (consistent with the all-null benefit_amount family). |
| null_amount_reason | varchar(30) | CONSTANT 'unknown_requires_crosswalk' — the documented reason benefit_amount is null (B8 has no dollar amount; needs a service-category crosswalk to interpret). |
| annualization_policy | varchar(17) | CONSTANT 'not_numeric' — no annualization performed (no numeric benefit amount to annualize). |
| combined_limit_policy | varchar(29) | CONSTANT 'none_detected' — no combined/shared limit detected for this category. |
| consumer_document_reconciliation_status | varchar(11) | CONSTANT 'not_checked' — these rows have not been reconciled against consumer-facing plan documents (EOC/SB). |
| confidence_tier | varchar(23) | CONSTANT 'source_faithful' — values reflect the raw CMS PBP filing as-is (faithful to source, not adjudicated/enriched). |
| benefit_layer | string |  |
| cdt_sub_benefit | varchar(26) | The diagnostic/therapeutic service sub-type. EXACTLY 5 values, 1:1 with source_pbp_section: complex_imaging (B8B_CMC = MRI/CT/PET etc.), therapeutic_radiation (B8B_TMC), diagnostic_radiology_basic (B8B_DRS), diagnostic_imaging_basic (B8A_DMC), diagnostic_lab (B8A_LAB). This is the second axis of the grain — cost share differs per sub-benefit. |
| cms_service_name | varchar(71) |  |
| coinsurance_pct_max | double | Maximum coinsurance % across bundled service lines. Differs from min in 12,852 rows. |
| coinsurance_pct_min | double | Minimum coinsurance % across bundled service lines. Equals coinsurance_pct. |
| copay_amount_max | double | Maximum copay across the bundled service lines. DIFFERS from min in 165,129 rows — the single row spans a RANGE of copays (e.g. point/min=$0 but max=$65). Use min/max together to see the spread; copay_amount alone understates the high end. |
| copay_amount_min | double | Minimum copay across the multiple service lines bundled under this sub-benefit in the PBP. Equals copay_amount. Non-null 355,289. |
| deductible_basis | string |  |
| has_coinsurance | boolean | BOOLEAN, NULLABLE. true=436,689, false=266,211, NULL=35,490 (same unknown rows). Like has_copay, the flag is broader than the parsed numeric value. |
| has_copay | boolean | BOOLEAN flag, NULLABLE. true=434,174, false=268,726, NULL=35,490. Caveat: has_copay=true does NOT guarantee a numeric copay_amount (true in 434K rows but copay_amount populated in only 355K). NULL = cost share unknown (the 'requires_crosswalk' rows). |
| has_deductible | boolean | BOOLEAN, but CONSTANT false across all 738,390 rows for this category. Carries no signal here. |
| has_max_enrollee_oop | boolean |  |
| label_note | string |  |
| max_enrollee_oop_amount | double |  |
| max_enrollee_oop_period_code | string |  |
| max_enrollee_oop_period_label | string |  |
| max_enrollee_oop_period_text | string |  |
| registry_l2_id | string |  |
| same_day_max_copay_only | boolean |  |
| service_key | string |  |
| source_pbp_section | varchar(7) | The CMS PBP section code the row came from. 5 values, 1:1 with cdt_sub_benefit: B8B_CMC, B8B_TMC, B8B_DRS, B8A_DMC, B8A_LAB. Provenance of the sub-benefit. |
| source_silver_table | varchar(45) | CONSTANT 'medicare_silver.pbp_section_b8_clin_diag_ther' — the upstream silver table this semantic view is built from. |
| lmi_authorities | string | CONSTANT — a single URL to the LMI 'CY 2026 PBP Service Category Descriptions' PDF (the authoritative definitions for these benefit categories). Documentation/definitions pointer, same for every row. |
| source_url | string | CMS PBP benefits ZIP the data was extracted from (e.g. https://www.cms.gov/files/zip/pbp-benefits-2021-updated-08022021.zip). One per grain row; multiple distinct URLs per report_year correspond to the quarterly refreshes. |
| sha256_content_hash | string | Content hash of the source PBP file for provenance/integrity. One per grain row; tracks 1:1 with source_url within a report_year. |
| limit_quantity / limit_unit / limit_period_code / limit_period_label / limit_quantity_per_year / limit_text |  | Quantity-limit family. 100% NULL for this category — PBP B8 diagnostic/therapeutic benefits carry no parsed quantity limits in this view. Do not rely on these here. |
| benefit_amount / benefit_amount_kind / benefit_amount_period_code / benefit_amount_period_label / benefit_amount_annualized / benefit_amount_pmpm |  | Dollar-benefit-allowance family. 100% NULL for this category. These services are cost-share (copay/coinsurance) only, not dollar-allowance benefits, so this whole family is unused. |
| normalization_status / normalization_basis / aggregation_policy |  | Pipeline normalization metadata — 100% NULL for this category (not applied to B8). |

Tools that read it: get_pbp_benefit

Query it: `query_substrate` with `SELECT ... FROM medicare_semantic.vw_pbp_clinical_diagnostic_therapeutic WHERE ... LIMIT 100`; read `describe_data_source("medicare_semantic.vw_pbp_clinical_diagnostic_therapeutic")` first.
