# PBP section c pos oon (cleaned view)

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

Cleaned source-faithful PBP section c pos oon rows: era-normalized, CMS codes decoded, with offered_status/numeric_amount_observability/null_amount_reason/annualization_policy/combined_limit_policy/confidence_tier. The agent reasoning surfa

**Grain.** One row per (MA plan-segment snapshot) x (PBP source section) x (benefit-group cost-share bucket) x (cost-share variant) x (Medicare-covered vs non-Medicare-covered service-category split). Concretely the practical minimal key is contract_id + plan_id + segment_id + report_year + quarter + source_pbp_section + benefit_group_label + cost_share_string + benefit_category_list_mc + benefit_category_list_nmc, which yields 729,119 of the 729,306 rows distinct; the remaining ~63 are genuinely-identical empty residual duplicates (old 2010-2011 C_POS rows where every cost-share field is NULL). No single short column or the profiler's reported "candidate key" is unique. NOTE the grain is at the cost-share GROUP level, not the individual benefit/service-category level: one benefit_group_label row rolls up many CMS service categories (which is why min/max range columns exist and why benefit_category_list_mc/_nmc hold semicolon lists of category codes).

**How to use it.** Get a plan's 2026 out-of-network cost-share buckets (deduped to one snapshot): SELECT benefit_group_label, cost_share_string, copay_amount, coinsurance_pct, source_pbp_section FROM medicare_semantic.vw_pbp_section_c_pos_oon WHERE contract_id='H0028' AND plan_id='016' AND segment_id='0' AND report_year=2026 AND quarter=1 ORDER BY source_pbp_section, benefit_group_label; -- answers 'what does this MA plan charge a member for out-of-network / POS services in 2026, by cost-share group?' Always pin report_year and a single quarter to avoid the quarterly-snapshot duplication, and remember each row is a cost-share GROUP spanning the service-category codes in benefit_category_list_mc/_nmc.

**Traps.**
- No is_current / snapshot-dedup column. Years 2018-2020 and 2022-2024 publish 2-4 near-identical QUARTERLY snapshots of the SAME plan year, so naive counts/joins double-to-quadruple-count those years. To get one record per plan-year, filter to a single quarter per report_year (e.g. quarter=1, or MAX(quarter)). 'quarter' is a republication index, not a benefit-change period.
- The profiler's reported candidate key (contract_id, plan_id, segment_id, limit_period_code, benefit_amount_period_code, confidence_tier) is NOT a key here: limit_period_code and benefit_amount_period_code are 100% NULL and confidence_tier is single-valued. The real discriminators are source_pbp_section + benefit_group_label + cost_share_string + the MC/NMC category-list split. Two rows can share contract/plan/segment/year/quarter/benefit_group_label and differ only by Medicare-covered (benefit_category_list_mc) vs non-Medicare-covered (benefit_category_list_nmc).
- Many columns are dead weight in THIS view: ~20 columns are 100% NULL (limit_*, benefit_amount_* and all annualized/pmpm, auth_required, referral_required, max_oop_applies, section_c_sub_benefit, normalization_*, aggregation_policy) and ~9 more are single-valued constants (benefit_category='section_c_pos_oon', network_type='out_of_network', offered_status='offered', numeric_amount_observability, null_amount_reason, annualization_policy, combined_limit_policy, consumer_document_reconciliation_status, confidence_tier, lmi_authorities). Don't infer the schema's promise from column names — benefit_amount is entirely empty here.
- Grain is the cost-share GROUP, not the individual benefit/service. One benefit_group_label rolls up many CMS service-category codes (held as semicolon lists in benefit_category_list_mc/_nmc), and coinsurance_pct/copay_amount are the representative value while *_min/*_max give the range across the collapsed categories (they differ in ~50-63k rows). Do not treat one row as one service.
- report_year is the time axis, NOT quarter (the profiler auto-labeled quarter as the time column — wrong). History runs 2007-2026 annually.
- The 2026 build is a granularity break: ~196k rows / ~50 rows per plan vs ~8.8 rows per plan in 2025 (with FEWER plans: 3,902 vs 4,229). 2026 explodes plans into many fine-grained POS/benefit-group rows (e.g. 'POS Grp 1 [$0;$5000 Max Amt]', per-category 16b/16c codes). Cross-year row counts are not comparable; this is an extraction-method change, not enrollment growth.
- This is the out-of-network/POS slice only (network_type always out_of_network). For in-network MA Section C cost-share use the sibling in-network PBP views, not this one.

| column | type | meaning |
|---|---|---|
| contract_id | string | CMS MA contract id (e.g. 'H0028'). 876 distinct. Part of grain. With plan_id+segment_id identifies the plan-segment. |
| plan_id | string | Plan id within the contract (e.g. '004'), zero-padded 3-char string. 655 distinct. Part of grain. |
| segment_id | string | Plan segment id (e.g. '0','1','2'), string. 25 distinct. A plan can have multiple service-area segments with different benefits. Part of grain. |
| version | double | CMS PBP file submission/version number (double, 1-26). Plan-level attribute, NOT part of grain: each (contract,plan,segment,report_year,quarter) maps to exactly one version. Higher = later submission of that plan year. |
| report_year | double | Contract/benefit year the PBP describes (double, 2007-2026). THIS is the real time axis (the profiler mislabeled 'quarter' as the time column). Part of grain. |
| quarter | double | Quarter of the CMS PBP PUF release within report_year (double, 1-4). NOT a within-year benefit change: it is a republication snapshot. Some years publish only Q1 (2007-2017, 2021, 2025, 2026); others publish 2-4 near-duplicate quarterly snapshots of the SAME plan year (e.g. 2023 has Q1-Q4). Part of grain ONLY because of this duplication; for a deduplicated plan-year view pick one quarter per report_year. |
| benefit_category | string | Constant 'section_c_pos_oon' for every row. A view-tag identifying this dataset; carries no row-level information. |
| cost_share_string | string | Human-readable cost-share for the benefit group, e.g. '20.0%', '$0 copay', '$300.0 copay', '$0 copay + 35.0%', '0.0%'. NULL in 68,948 rows (plan offers the benefit but no parsed numeric cost-share). Part of grain (a plan/group can have multiple distinct cost-share rows). |
| copay_amount | double | Parsed flat-dollar copay (double, $0-$5000, median ~$28). Populated in 323,568 rows; NULL when the benefit is coinsurance-only or unparsed. The representative/primary copay for the group. |
| coinsurance_pct | double | Parsed coinsurance percentage (double, 0-100, median ~26%). Populated in 368,803 rows; NULL when copay-only or unparsed. The representative/primary coinsurance for the group. |
| limit_text | string | 100% NULL in this view. Reserved free-text benefit limit; never populated for Section C OON/POS. |
| auth_required | boolean | 100% NULL in this view. Prior-authorization flag not populated for the OON/POS section. |
| referral_required | boolean | 100% NULL in this view. Referral-required flag not populated. |
| network_type | varchar(17) | Constant 'out_of_network' for every row. Confirms this view is the OON/POS (non-in-network) cost-share slice. Carries no row-level information. |
| max_oop_applies | boolean | 100% NULL in this view. Whether the benefit counts toward MOOP; not populated. |
| limit_quantity | double | 100% NULL in this view. |
| limit_unit | string | 100% NULL in this view. |
| limit_period_code | string | 100% NULL in this view (the profiler listed it as a candidate key but it is entirely null). |
| limit_period_label | string | 100% NULL in this view. |
| limit_quantity_per_year | double | 100% NULL in this view. |
| benefit_amount | double | 100% NULL in this view (0 non-null rows). Reserved for plan-funded benefit allowances (e.g. OTC/flex $); not populated here. |
| benefit_amount_kind | string | 100% NULL in this view. |
| benefit_amount_period_code | string | 100% NULL in this view. |
| benefit_amount_period_label | string | 100% NULL in this view. |
| benefit_amount_annualized | double | 100% NULL in this view. |
| benefit_amount_pmpm | double | 100% NULL in this view. |
| normalization_status | string | 100% NULL in this view. |
| normalization_basis | string | 100% NULL in this view. |
| aggregation_policy | string | 100% NULL in this view. |
| offered_status | varchar(15) | Constant 'offered' for every row. The view only contains benefits the plan offers OON/POS; carries no row-level information. |
| numeric_amount_observability | varchar(31) | Constant 'offered_without_numeric_amounts' for every row. A data-quality tag meaning the benefit is offered but the benefit_amount $ fields are not observed in source. Carries no row-level information. |
| null_amount_reason | varchar(30) | Constant 'unknown_requires_crosswalk' for every row. Explains why benefit_amount is null; carries no row-level information. |
| annualization_policy | varchar(17) | Constant 'not_numeric' for every row. No row-level information. |
| combined_limit_policy | varchar(29) | Constant 'none_detected' for every row. No row-level information. |
| consumer_document_reconciliation_status | varchar(11) | Constant 'not_checked' for every row. These rows have not been reconciled against consumer-facing plan docs (SB/EOC). No row-level information. |
| confidence_tier | varchar(23) | Constant 'source_faithful' for every row (the profiler listed it as a candidate key, but it is single-valued). Means values are taken faithfully from the CMS source with no inference. No row-level information. |
| benefit_categories_list | string | Raw CMS PBP category encoding string, e.g. '' (empty, 628k rows), '01', '10', '11', or a long fixed-width bitmask of 0/1 flags. Low-level source artifact; prefer the parsed _mc/_nmc lists below. |
| benefit_category_list_mc | string | Semicolon-delimited list of CMS PBP Section-C service-category codes that are MEDICARE-COVERED (MC) and share this cost-share group, e.g. '3-1;3-2;5;6;7a;...' or '6;14a;'. Populated in 504,781 rows. Codes reference the CMS PBP service-category taxonomy (see lmi_authorities). Part of grain. NULL when this row is the non-Medicare-covered side. |
| benefit_category_list_nmc | string | Semicolon-delimited list of NON-MEDICARE-COVERED (NMC, i.e. supplemental) service-category codes sharing this cost-share group, e.g. '16b1;16b2;16c1;...'. Populated in 265,211 rows. Part of grain. The MC vs NMC split is what separates two otherwise-identical benefit_group_label rows (e.g. category '7b' appears once MC at 30% and once NMC). 90,000 rows have BOTH mc and nmc lists populated; 49,314 have neither. |
| benefit_group_id | string |  |
| benefit_group_label | string | The plan's own cost-share bucket label and the primary row-level discriminator within a snapshot. 10,189 distinct values; NULL in 123,996 rows. Forms: generic 'Group 1'..'Group N'; semantic '35%','$0','50% coinsurance','OTC','Ambulance','Dental','Vision','Hearing'; raw category codes '17a','10a1','7b'; and the 2026-style 'POS Grp 1 [$0;$5000 Max Amt]' / 'POS_25%'. Part of grain. |
| coinsurance_pct_max | double | Maximum coinsurance % across the service categories rolled into this group (double). Differs from coinsurance_pct in 51,569 rows where the group spans a range (e.g. headline 20% but group spans 20-50%). Use to detect range-valued groups. |
| coinsurance_pct_min | double | Minimum coinsurance % across the rolled-up categories. With _max gives the coinsurance range for the group. |
| copay_amount_max | double | Maximum copay $ across the rolled-up categories (double). Differs from copay_amount in 63,388 rows (range-valued group). |
| copay_amount_min | double | Minimum copay $ across the rolled-up categories. With _max gives the copay range for the group. |
| cost_share_basis | string |  |
| day_interval_count_coinsurance | double |  |
| day_interval_count_copay | double |  |
| group_deductible_amount | double |  |
| has_coinsurance | boolean | Derived boolean: this group has a coinsurance component. True 368,803 / False 346,272 / NULL 14,231 (undeterminable, the empty cost-share rows). |
| has_copay | boolean | Derived boolean: this group has a flat-copay component. True 323,568 / False 391,507 / NULL 14,231. |
| has_deductible | boolean | Derived boolean: a deductible applies. Almost always False (712,487); True only 1,853; NULL 14,966. OON deductibles are rarely encoded in this section. |
| max_plan_benefit_amount | double |  |
| max_plan_benefit_offered | boolean |  |
| max_plan_benefit_period_code | string |  |
| max_plan_benefit_period_description | string |  |
| max_plan_benefit_period_label | string |  |
| original_medicare_amount_kind | string |  |
| original_medicare_amount_resolved | double |  |
| original_medicare_cost_share_charged | boolean |  |
| pos_all_state_licensed_practitioners | boolean |  |
| pos_benefit_type_code | string |  |
| pos_benefit_type_label | string |  |
| pos_inpatient_maximum_1a_period_code | string |  |
| pos_inpatient_maximum_1a_period_description | string |  |
| pos_inpatient_maximum_1a_period_label | string |  |
| pos_inpatient_maximum_1b_period_code | string |  |
| pos_inpatient_maximum_1b_period_description | string |  |
| pos_inpatient_maximum_1b_period_label | string |  |
| pos_inpatient_maximum_acute_amount | double |  |
| pos_inpatient_maximum_combined_amount | double |  |
| pos_inpatient_maximum_offered | boolean |  |
| pos_inpatient_maximum_period_code | string |  |
| pos_inpatient_maximum_period_description | string |  |
| pos_inpatient_maximum_period_label | string |  |
| pos_inpatient_maximum_psych_amount | double |  |
| pos_inpatient_maximum_type_code | string |  |
| pos_inpatient_maximum_type_label | string |  |
| pos_moop_amount | double |  |
| pos_moop_offered | boolean |  |
| pos_moop_period_code | string |  |
| pos_moop_period_description | string |  |
| pos_moop_period_label | string |  |
| pos_plan_maximum_amount | double |  |
| pos_plan_maximum_benefit_types_code | string |  |
| pos_plan_maximum_benefit_types_label | string |  |
| pos_plan_maximum_category_list_legacy | string |  |
| pos_plan_maximum_category_list_mc | string |  |
| pos_plan_maximum_category_list_nmc | string |  |
| pos_plan_maximum_offered | boolean |  |
| pos_plan_maximum_period_code | string |  |
| pos_plan_maximum_period_description | string |  |
| pos_plan_maximum_period_label | string |  |
| section_c_plan_benefit_types_code | string |  |
| section_c_plan_benefit_types_label | string |  |
| section_c_plan_category_list_legacy | string |  |
| section_c_plan_category_list_mc | string |  |
| section_c_plan_category_list_nmc | string |  |
| section_c_plan_group_count | double |  |
| section_c_plan_level_policy | string |  |
| section_c_plan_level_source_status | string |  |
| section_c_sub_benefit | varchar(30) | 100% NULL in this view. Reserved sub-benefit label; never populated. |
| visitor_travel_benefit_type_code | string |  |
| visitor_travel_benefit_type_label | string |  |
| visitor_travel_geographic_area_code | string |  |
| visitor_travel_geographic_area_label | string |  |
| visitor_travel_offered | boolean |  |
| source_pbp_section | varchar(5) | Which CMS PBP source section the row came from: 'C_OON' (Section C out-of-network, 658,957 rows) or 'C_POS' (Section C Point-of-Service, 70,349 rows). The view UNIONs both. Part of grain (the same plan/group/category can appear once per section). |
| source_silver_table | varchar(33) | Underlying medicare_silver table the row was read from: 'medicare_silver.pbp_section_c_oon' or 'medicare_silver.pbp_section_c_pos'. 1:1 with source_pbp_section; lineage. |
| lmi_authorities | string | Constant single URL pointing to the LMI-hosted 'CY 2026 PBP Service Category Descriptions.pdf' (mabenefitsmailbox.lmi.org). The authoritative crosswalk for decoding the service-category codes in benefit_category_list_mc/_nmc. Same value on every row. |
| source_url | string | CMS PBP PUF zip the row was extracted from, e.g. '.../pbp-benefits-2018-q1.zip'. 34 distinct files = one file per (report_year, quarter) snapshot. Provenance. |
| sha256_content_hash | string | SHA-256 of the source file content (34 distinct, 1:1 with source_url). Integrity/provenance fingerprint of the originating CMS file, not a row-level hash. |

Tools that read it: get_pbp_benefit

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