# MA pbp section b19 model test

`medicare_silver.pbp_section_b19_model_test` · Medicare Advantage, Part D, Medicaid · status partial

Section B19: Model test slot. Net-new base file 2026 (was VBID-only pre-2026). Coverage: 2026-present.

**Grain.** One row per Medicare Advantage plan-segment per benefit year: (contract_id, plan_id, segment_id, report_year). VERIFIED — contract_id||plan_id||segment_id||report_year yields exactly 40,737 distinct = the full 40,737 row_count, with zero duplicate groups. Equivalent shorthand keys: (bid_id, report_year) since bid_id IS exactly contract_id_'_'_plan_id_'_'_segment_id (0 mismatches), and (contract_id, plan_id, segment_id, observed_period) since observed_period = Jan-1 of report_year. quarter is constant (always 1.0) and adds nothing.

**How to use it.** "SELECT report_year, COUNT(*) AS plans, SUM(CASE WHEN pbp_b19a_ssbci_yn='1' THEN 1 ELSE 0 END) AS ssbci_yes, SUM(CASE WHEN pbp_b19a_uf_yn='1' THEN 1 ELSE 0 END) AS uf_yes, SUM(CASE WHEN pbp_b19a_vbd_yn='1' THEN 1 ELSE 0 END) AS vbd_yes FROM medicare_silver.pbp_section_b19_model_test GROUP BY report_year ORDER BY report_year;" answers 'how many MA plan-segments offer SSBCI / MA Uniformity Flexibility / VBID supplemental benefits each year, and how did adoption shift (e.g. VBID going to zero in 2026)?'. Join to pbp_section_a (or pbp_vbid_overlay) on (contract_id, plan_id, segment_id, report_year) to attach plan name/enrollment/region. Always GROUP BY or filter report_year first because field availability is year-dependent."

**Traps.**
- NAME TRAP — '_model_test' is NOT a dev/sample/partial table. It is the literal CMS PBP source section name ('B-19 Model Test', the VBID/MA-Uniformity-Flexibility 'model test' supplemental-benefit section). It carries ~88-95% of all MA contracts for its years (e.g. 2024: 953 of 1,034 contracts vs full pbp_section_a). It IS real production data, just only for plans that file Section B-19.
- GRAIN TRAP — the profiler reports an 11-column SUPERSET key. The true minimal grain is just (contract_id, plan_id, segment_id, report_year) = 40,737 distinct = row_count, zero dupes. bid_id, quarter, observed_period, effective_period_start are all redundant (bid_id = contract_'_'_plan_'_'_segment exactly; quarter is always 1; observed_period/eff_start = Jan-1 of report_year). The extra columns the profiler added (pbp_a_plan_type, max_plan_ben_amt, whp_provid_incent...) are NOT keys — they just happen not to break uniqueness.
- YEAR GAPS — only 2017, 2021, 2022, 2024, 2025, 2026 exist; 2018/2019/2020/2023 are MISSING from silver. Never assume a continuous yearly series. For a continuous VBID index across 2017-2026 use the sibling pbp_vbid_overlay (16 cols, index-only, no benefit fields). Also quarter=1 always, but the source files are mixed quarters per year (see source_url) — don't read quarter as the true release.
- NULL-MEANS-NOT-COLLECTED, varying by year — this is the single biggest analysis trap. 2017 has EVERY B19a/HEP/WHP/B19b field 100% NULL (the section had a totally different shape then; only legacy base cols). HEP fields are populated ONLY in 2024. WHP and VBID fields are populated 2021/2022/2024 and NULL in 2025/2026 (VBID demonstration sunset; CMS restructured ~40 fields CY2024->CY2025). So NULL on vbd_yn/hep_action/whp_* usually means 'field absent that year', NOT 'plan answered No'. Always filter by report_year before interpreting a flag, and read 1/2/NULL as Yes/No/not-applicable.
- ONLY ~90 of 1,181 source columns are extracted (92% of the per-sub-benefit cost-share matrix is NOT in silver). The detailed reduced-cost-share dollar amounts a cost analyst wants (pbp_b19a_coins_16a_min, copay/deductible per sub-benefit) DO NOT EXIST here — only top-level yes/no flags + package counts + a handful of sparse aggregate dollars survive. Whole column families are placeholder-empty in every year: all pbp_b19_c_* Part-C cash-rebate/R&I fields (the live reward data is in pbp_b19_whp_* instead), pbp_b19a_reduct_cost_add_yn, and most pbp_b19c_* hospice cost-share cells (≤10 rows ever). See docs/research/26_pbp_b19_column_ledger.md for the per-column inhabitance-by-year ledger.
- SINGLE SNAPSHOT, no is_current / no dedup needed — there is no is_current column. asserted_at (2026-05-16), cms_vintage_sequence (=1), and parse_revision (=1) are CONSTANT across all rows: the bi-temporal columns are scaffolding for future re-releases but currently carry exactly one vintage. Do NOT write supersession/dedup logic; one row per (bid, year) already. Provenance columns (source_url, sha256_content_hash, parser_artifact_hash) have 6 distinct values = one per report_year.

| column | type | meaning |
|---|---|---|
| contract_id | string | CMS MA contract ID (e.g. H0022, H0028); 1,296 distinct. First component of bid_id. Part of grain. |
| plan_id | string | Plan ID within the contract (3-char, e.g. 001, 014); 655 distinct values. Second component of bid_id. Part of grain. |
| segment_id | string | Plan segment (regional split). Mostly '0' (36,975 rows = non-segmented); 1-7 are regional segments of PPO/regional plans (segment 1=1,264 ... 7=40 rows). Third component of bid_id. Part of grain. |
| version | double | CMS PBP software submission/version number of the bid filing (range 1-27, 25 distinct). Metadata of the bid, NOT a grain or dedup key — there is exactly one row per bid per year, no version stacking. |
| report_year | double | Contract/benefit year the PBP describes (double). Six values present: 2017, 2021, 2022, 2024, 2025, 2026. GAPPED — 2018/2019/2020/2023 are absent. Part of grain. |
| quarter | double | CMS PBP release quarter. CONSTANT = 1.0 for every row. Not part of grain; do not rely on it to distinguish releases (the underlying source files are actually mixed quarters Q1/Q2 per year — see source_url). |
| bid_id | string | Composite plan key = contract_id // '_' // plan_id // '_' // segment_id (verified 0 mismatches). 13,953 distinct = distinct (contract,plan,segment). Fully redundant with those three columns; a convenience join key, not extra grain. |
| orgtype | string | CMS organization type code. 01=Local MA (37,402, dominant), 08=Cost plan (1,896), 11=Regional MA/RPPO (541), 06=MSA (390), 05/04/02 small. (Code meanings per docs/kbs/pbp/CY2024.md.) |
| pbp_a_ben_cov | string | Plan benefit-coverage type from Section A. 1=most plans (39,836), 2=822, NULL=79. Carried over from Section A as a join/context attribute. |
| pbp_a_plan_type | string | Plan type code (from Section A). 01=HMO (18,951), 04=Local PPO (13,123), 02=HMO-POS (5,328), 20=Cost (1,896), 31=Regional PPO (541), 18=MSA (390). (Meanings per CY2024 KB; '[INFERRED]' there.) |
| pbp_b19_c_cash_rebate_max_amt | double |  |
| pbp_b19_c_cash_rebate_mnt_amt | double |  |
| pbp_b19_c_cash_rebate_other | string |  |
| pbp_b19_c_cash_rebate_type | string |  |
| pbp_b19_c_ri_amt_1 | double |  |
| pbp_b19_c_ri_amt_2 | double |  |
| pbp_b19_c_ri_amt_3 | double |  |
| pbp_b19_c_ri_cnt | string |  |
| pbp_b19_c_ri_freq_1 | string |  |
| pbp_b19_c_ri_freq_2 | string |  |
| pbp_b19_c_ri_freq_3 | string |  |
| pbp_b19_c_ri_freq_desc_1 | string |  |
| pbp_b19_c_ri_freq_desc_2 | string |  |
| pbp_b19_c_ri_freq_desc_3 | string |  |
| pbp_b19_c_ri_max_1 | double |  |
| pbp_b19_c_ri_max_2 | double |  |
| pbp_b19_c_ri_max_3 | double |  |
| pbp_b19_c_ri_type_1 | string |  |
| pbp_b19_c_ri_type_2 | string |  |
| pbp_b19_c_ri_type_3 | string |  |
| pbp_b19_c_ri_type_note_1 | string |  |
| pbp_b19_c_ri_type_note_2 | string |  |
| pbp_b19_c_ri_type_note_3 | string |  |
| pbp_b19_hep_action | string |  |
| pbp_b19_hep_action_desc | string |  |
| pbp_b19_hep_data_source | string |  |
| pbp_b19_hep_data_source_desc | string |  |
| pbp_b19_hep_tool | string |  |
| pbp_b19_hep_tool_desc | string |  |
| pbp_b19_whp_ben_eng_ann_amt | double |  |
| pbp_b19_whp_eligibil_crit | string |  |
| pbp_b19_whp_freq_rew | string |  |
| pbp_b19_whp_mode_of_eng | string |  |
| pbp_b19_whp_partc_rew_inc_yn | string |  |
| pbp_b19_whp_prog_connectedness | string |  |
| pbp_b19_whp_prog_type | string |  |
| pbp_b19_whp_prog_type_other | string |  |
| pbp_b19_whp_provid_incent | string |  |
| pbp_b19_whp_rew_inc_amt | double |  |
| pbp_b19_whp_type_partc_rew | string |  |
| pbp_b19a_attestation | string | VBID attestation flag. 1=3,049 rows, else NULL. Populated 2021/2022/2024 only (VBID-participating plans). |
| pbp_b19a_reduct_cost_add_yn | string | Variant 'Part-C reductions in cost OR additional benefits' flag. Truly empty in silver across all years (0 populated) — present in schema but never filled. |
| pbp_b19a_reduct_cost_yn | string | Does the VBID/UF/SSBCI benefit offer Part-C reductions in cost-sharing? 1=Yes (3,084), 2=No (20,467), NULL=17,186 (all-2017 + 2021/2022 where the field was barely collected). |
| pbp_b19a_reduct_package_num | double | Number of 19a Reduction-in-Cost-Sharing packages the plan files (double, e.g. 1.0, 2.0). Populated where reduct_cost_yn=Yes; NULL otherwise. |
| pbp_b19a_ssbci_bendesc | string | Type/category of benefit the SSBCI includes (coded string, e.g. '11'). Populated 2021+ where SSBCI=Yes; NULL otherwise. |
| pbp_b19a_ssbci_yn | string | Does the plan offer Special Supplemental Benefits for the Chronically Ill (SSBCI)? 1=Yes (7,567), 2=No (27,082), NULL=6,088. NULL is concentrated in 2017 (field did not exist) plus a few hundred 'not answered' per later year. |
| pbp_b19a_uf_yn | string | Does the plan include MA Uniformity Flexibility (reductions in cost-share/added benefits for targeted enrollees)? 1=Yes (3,029), 2=No (31,903), NULL=5,805 (all-2017 + a few hundred/year). |
| pbp_b19a_vbd_hospice_ben_yn | string | Does the plan offer VBID Hospice benefits? Yes/No, sparsely populated 2021-2025, ZERO in 2026 (demonstration ended). |
| pbp_b19a_vbd_type | string | Which additional VBID interventions (beyond wellness/care-planning) the plan offers (coded string, e.g. '01','010'). Populated only 2021/2022/2024; NULL in 38,641 rows. |
| pbp_b19a_vbd_yn | string | Does the plan offer Value-Based Insurance Design flexibilities (by condition / socioeconomic status)? 1=Yes (2,998), 2=No (949), NULL=36,790. NULL dominates: VBID was only collected 2021/2022/2024 (and ZERO in 2026 — VBID demonstration sunset). Treat NULL as 'not in scope that year', not 'No'. |
| pbp_b19b_add_cost_yn | string | Does the VBID/UF/SSBCI benefit offer ADDITIONAL Part-C benefits (b19b)? 1=Yes (10,499), 2=No (14,566), NULL=15,672 (2017 absent + ~half of 2021/2022). |
| pbp_b19b_add_package_num | double | Number of additional-benefit packages (1-15) the plan files in b19b (double). The most-populated b19b dollar/count field across 2021-2026. |
| pbp_b19c_coins_pct2_maxov | double |  |
| pbp_b19c_coins_pct2_minov | double |  |
| pbp_b19c_coins_pct_maxov | double |  |
| pbp_b19c_coins_pct_minov | double |  |
| pbp_b19c_coins_pct_resp2_max | double |  |
| pbp_b19c_coins_pct_resp2_min | double |  |
| pbp_b19c_coins_pct_resp_max | double |  |
| pbp_b19c_coins_pct_resp_min | double |  |
| pbp_b19c_conins_enrol2_yn | string |  |
| pbp_b19c_conins_enrol_yn | string |  |
| pbp_b19c_conins_resp_enrol2_yn | string |  |
| pbp_b19c_conins_resp_enrol_yn | string |  |
| pbp_b19c_copay_amt2_maxov | double |  |
| pbp_b19c_copay_amt2_minov | double |  |
| pbp_b19c_copay_amt_maxov | double |  |
| pbp_b19c_copay_amt_minov | double |  |
| pbp_b19c_copay_amt_resp2_max | double |  |
| pbp_b19c_copay_amt_resp2_min | double |  |
| pbp_b19c_copay_amt_resp_max | double |  |
| pbp_b19c_copay_amt_resp_min | double |  |
| pbp_b19c_copay_enrol2_yn | string |  |
| pbp_b19c_copay_enrol_yn | string |  |
| pbp_b19c_copay_resp_enrol2_yn | string |  |
| pbp_b19c_copay_resp_enrol_yn | string |  |
| pbp_b19c_cov_hlth_rltd | string |  |
| pbp_b19c_cov_hlth_rltd_yn | string |  |
| pbp_b19c_hosp_supp_ben_cont_yn | string |  |
| pbp_b19c_mand_supp_ben_yn | string |  |
| pbp_b19c_max_plan_ben_amt | double |  |
| pbp_b19c_max_plan_ben_yn | string |  |
| pbp_b19c_oth_man_supp_ben | string |  |
| pbp_b19c_oth_man_supp_ben_yn | string |  |
| pbp_b19c_pres_drug2_max | double |  |
| pbp_b19c_pres_drug_max | double |  |
| pbp_b19c_red_cost_shar_yn | string |  |
| pbp_b19c_resp_care2_max | double |  |
| pbp_b19c_resp_care_max | double |  |
| pbp_b19c_tmp_cov_res_fac_yn | string |  |
| observed_period | date | Bi-temporal: the period the data describes = Jan-1 of report_year (date). Derivable from report_year; equals effective_period_start. Constant within a (bid, year). |
| asserted_at | date | Bi-temporal: when this fact was loaded/asserted. CONSTANT = 2026-05-16 for every row — single load. No supersession history. |
| effective_period_start | date |  |
| effective_period_end | date |  |
| cms_vintage_sequence | int | Bi-temporal vintage ordinal for superseding CMS re-releases. CONSTANT = 1 for every row (only one vintage loaded). Scaffolding for future versioning; nothing to filter today. |
| parse_revision | int | Parser revision ordinal. CONSTANT = 1 everywhere. Scaffolding; not a dedup key in current data. |
| parser_artifact_hash | string | SHA-256 of the parser build that produced the row. 6 distinct values (one per report_year's extraction run). Provenance. |
| source_url | string | CMS download URL of the PBP ZIP this row came from. 6 distinct (one per year). Reveals the real release quarter despite quarter=1: 2021=updated-07012021, 2022=quarter-2, 2024=quarter-1, etc. Provenance. |
| sha256_content_hash | string | SHA-256 of the source file content. 6 distinct (one per year). Provenance / integrity. |
| pbp_b19_hep_action / pbp_b19_hep_action_desc / pbp_b19_hep_data_source / pbp_b19_hep_data_source_desc / pbp_b19_hep_tool / pbp_b19_hep_tool_desc |  | VBID Health Equity Plan (HEP) fields: actions, disparity data-sources, screening tool, and free-text descriptions. CODED multi-select strings (e.g. action='0111111', tool='0110'). POPULATED ONLY IN 2024 (118 rows); NULL in every other year — a one-year CMS data collection. Major NULL-means-'not-collected' trap. |
| pbp_b19_whp_* (ben_eng_ann_amt, mode_of_eng, partc_rew_inc_yn, prog_connectedness, prog_type, prog_type_other, provid_incent, freq_rew, rew_inc_amt, type_partc_rew, eligibil_crit) |  | Wellness & Health-Planning (WHP) program fields: expected beneficiaries engaged annually (ben_eng_ann_amt, $/count 0-389,061), mode of engagement, program type/connectedness (coded strings like '111','11111'), provider-incentive and reward flags, reward amount/type/frequency, and a free-text 'other program' description. Populated 2021/2022/2024 only; NULL in 2025/2026 (field retired). eligibil_crit is empty in all years. |
| pbp_b19_c_cash_rebate_* and pbp_b19_c_ri_* (amt_1..3, max_1..3, freq_1..3, type_1..3, type_note_1..3, freq_desc_1..3, cnt) |  | Part-C cash/monetary rebate and Rewards-and-Incentives package fields (max annual rebate, monthly amount, R&I amounts/maxes/frequencies/types/notes for up to 3 packages). In THIS silver table they are ENTIRELY EMPTY (0 populated in every year) — placeholder columns the silver writer never filled. The live R&I/reward data that IS populated lives in the pbp_b19_whp_* family instead. |
| pbp_b19c_* hospice cost-share block (mand_supp_ben_yn, oth_man_supp_ben(_yn), red_cost_shar_yn, cov_hlth_rltd(_yn), hosp_supp_ben_cont_yn, tmp_cov_res_fac_yn, max_plan_ben_yn, max_plan_ben_amt, conins_enrol(2)_yn, conins_resp_enrol(2)_yn, copay_enrol(2)_yn, copay_resp_enrol(2)_yn, coins_pct*_min/max(ov), copay_amt*_min/max(ov), resp_care(2)_max, pres_drug(2)_max) |  | VBID Hospice supplemental-benefit cost-share matrix: yes/no toggles for hospice supplemental benefits and a min/max copay/coinsurance grid (INN/OON, respite, prescription). EXTREMELY SPARSE — at most ~10 rows populated (2022) and many sub-fields (coins_pct*ov, copay_amt_resp*, pres_drug*) are 0 across all years. max_plan_ben_amt populated for only 102 rows (range $0-$500). Treat this whole block as near-empty in the current extract. |
| effective_period_start / effective_period_end |  | The benefit year window: Jan-1 to Dec-31 of report_year (dates). Fully derivable from report_year; the profiler's reported time axis (2017-01-01 .. 2026-01-01). |

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