# MA pbp section b3 corf

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

Section B3: Comprehensive Outpatient Rehab Facility (CORF) cost-share. Pre-2020; superseded by cardiac_rehab. Coverage: 2001-2019.

**Grain.** There is NO valid business grain — the table never populated. Intended: one row per MA plan benefit package (contract_id × plan_id × segment_id) per quarterly PUF release for CORF Section B-3; but all plan-identifying columns are NULL. Empirically the 13,408 rows are hollow byte-identical duplicates within each (quarter × segment_id × version) group, collapsing to only 234 distinct full rows that contain no benefit data. Best treated as 3 quarterly snapshots (2018 Q2/Q3/Q4) of a failed extract.

**How to use it.** Operationally the only correct use today is a data-quality / provenance check, e.g. `SELECT quarter, source_url, COUNT(*) rows, COUNT(contract_id) populated_plans FROM medicare_silver.pbp_section_b3_corf GROUP BY quarter, source_url` — this returns rows>0 but populated_plans=0 for all 3 quarterly 2018 PUF files, confirming the CORF Section B-3 extract failed and must be re-run. For actual MA outpatient-rehab benefit/cost-sharing data, use the populated sibling medicare_silver.pbp_section_b3_cardiac_rehab instead.

**Traps.**
- DO NOT USE FOR ANALYSIS — the table is an empty parse shell. All 78 benefit/plan columns (bid_id, contract_id, plan_id, orgtype, and every copay/coinsurance/deductible/auth/max/bendesc field) are 100% NULL across all 13,408 rows. Only 13 provenance columns are populated. There is zero cost or benefit data here.
- Row count (13,408) is meaningless duplication, NOT plan coverage. Within every (quarter, segment_id, version) group the rows are byte-identical (e.g. 598 rows in q4/v1/seg0 = exactly 1 distinct full row). The entire table holds only 234 distinct full rows, and those carry no benefit info. Counting rows here over-counts ~57x.
- There is NO grain key and NO way to identify a plan: bid_id/contract_id/plan_id are all null, so you cannot join this table to any plan, contract, or bid dimension. 'segment_id' and 'version' look key-ish but only ever combine into 234 hollow tuples.
- 'version' (1-18) is a CMS file-revision tag, NOT a snapshot/is_current flag and NOT a plan attribute. 'quarter' (2/3/4) and sha256_content_hash are the real snapshot dimension: the SAME 2018 benefit year was re-published across 3 quarterly PUFs (2018 Q2/Q3/Q4). If you ever need a single snapshot, pick max cms_vintage_sequence (=4, the Q4 file).
- Coverage is far narrower than the source family suggests: only report_year 2018 and only 3 quarterly files exist. By contrast its ONLY sibling, medicare_silver.pbp_section_b3_cardiac_rehab, IS fully populated (113,962 rows, contract_id/bid_id 100% non-null, spanning 2019-2026). So this CORF table is specifically broken — prefer the cardiac_rehab table as the working B-3 example, and treat pbp_section_b3_corf as needing re-extraction.
- asserted_at (2026-05-20) is the Vlada load date and report_year/observed_period (2018) is the benefit year — bitemporal. Never mistake asserted_at for the data's effective date.

| column | type | meaning |
|---|---|---|
| segment_id | string | PBP plan segment id ('0'-'9', 10 distinct). '0' = the base/non-segmented plan; 1-9 = geographic segments of a segmented plan. POPULATED. One of only 3 columns with any analytic differentiation (the rest are pure provenance). Higher segment numbers have far fewer rows (most plans are segment 0). |
| version | double | PUF section/file version number (1-18, 17 distinct; value 16 absent). Identifies the CMS PBP file revision the row came from. POPULATED. NOT a plan attribute and NOT a snapshot/is_current flag — purely a source-file version tag. |
| report_year | double | PUF reporting/benefit year. Always 2018.0 for every row — the only year this CORF extract covers. |
| quarter | double | Calendar quarter of the CMS PUF release the row was extracted from: 2.0, 3.0, or 4.0 (2018 Q2/Q3/Q4). This is the snapshot/release dimension, NOT a plan attribute. Same 2018 benefit year re-published across 3 quarterly PUFs. |
| observed_period | date | Date the data describes; always 2018-01-01. Single value across the whole table. |
| asserted_at | date | Pipeline ingestion/assertion date; always 2026-05-20. When Vlada parsed and loaded these rows (bitemporal 'system time'), unrelated to the 2018 benefit content. |
| effective_period_start | date | Benefit-year start; always 2018-01-01. |
| effective_period_end | date | Benefit-year end; always 2018-12-31. |
| cms_vintage_sequence | int | Integer ordering the CMS source vintages: 2 for the Q2 file, 3 for Q3, 4 for Q4 (1:1 with quarter here). Lets you pick the latest release. |
| parse_revision | int | Vlada parser revision that produced the row; constant = 2 across all rows. |
| parser_artifact_hash | string | SHA-256 of the parser artifact/output; one distinct value per source file (3 total). Provenance of the code that did the (failed) extraction. |
| source_url | string | CMS download URL of the source zip. 3 distinct values: pbp-benefits-2018-q2.zip, -q3.zip, -q4.zip under cms.gov/.../pbp-pufs/. Confirms this is the public CMS MA-PD PBP PUF. |
| sha256_content_hash | string | SHA-256 of the raw source file content; 3 distinct values (one per quarterly zip). The cleanest snapshot/file discriminator. |
| bid_id | string | INTENDED: CMS bid id of the plan benefit package. 100% NULL — not populated. This is the field that would normally join to bid/plan tables; its absence is why the table has no grain. |
| contract_id | string | INTENDED: MA contract id (Hxxxx/Rxxxx). 100% NULL. Cannot identify which plan/organization any row belongs to. |
| orgtype | string | INTENDED: organization type (HMO/PPO/etc). 100% NULL. |
| pbp_a_ben_cov | string | INTENDED: Section A benefit-coverage indicator carried onto the B-3 row. 100% NULL. |
| pbp_a_plan_type | string | INTENDED: plan type code. 100% NULL. |
| pbp_b3_auth | string |  |
| pbp_b3_auth_pos | string |  |
| pbp_b3_coins_cov_mc | string |  |
| pbp_b3_coins_cov_pos | string |  |
| pbp_b3_coins_yesno | string |  |
| pbp_b3_coins_yesno_pos | string |  |
| pbp_b3_coins_yn | string |  |
| pbp_b3_copay_yesno | string |  |
| pbp_b3_copay_yesno_pos | string |  |
| pbp_b3_copay_yn | string |  |
| pbp_b3_ded_yesno_pos | string |  |
| pbp_b3_ded_yn | string |  |
| pbp_b3_maxenr_per | string |  |
| pbp_b3_maxenr_yesno | string |  |
| pbp_b3_maxenr_yn | string |  |
| pbp_b3_maxenr_yn_pos | string |  |
| pbp_b3_maxplan_yesno_pos | string |  |
| pbp_b3_maxpln_cov_pos | string |  |
| pbp_b3_maxpln_per_pos | string |  |
| pbp_b3_refer_yn | string | INTENDED: referral-required yes/no for CORF. 100% NULL. |
| pbp_b_3_ded_yesno | string |  |
| plan_id | string | INTENDED: 3-digit plan id within the contract (PBP id). 100% NULL — the other half of the missing plan key. |
| pbp_b3_auth_yn | string |  |
| pbp_b3_bendesc_amo_crs | string |  |
| pbp_b3_bendesc_amo_icrs | string |  |
| pbp_b3_bendesc_amo_prs | string |  |
| pbp_b3_bendesc_ehc | string |  |
| pbp_b3_bendesc_lim_crs | string |  |
| pbp_b3_bendesc_lim_icrs | string |  |
| pbp_b3_bendesc_lim_prs | string |  |
| pbp_b3_bendesc_numv_crs | double |  |
| pbp_b3_bendesc_numv_icrs | double |  |
| pbp_b3_bendesc_numv_prs | double |  |
| pbp_b3_bendesc_per_crs | string |  |
| pbp_b3_bendesc_per_icrs | string |  |
| pbp_b3_bendesc_per_prs | string |  |
| pbp_b3_bendesc_yn | string |  |
| pbp_b3_coins_ehc | string |  |
| pbp_b3_coins_pct_max_crs | double |  |
| pbp_b3_coins_pct_max_icrs | double |  |
| pbp_b3_coins_pct_max_prs | double |  |
| pbp_b3_coins_pct_mc | double |  |
| pbp_b3_coins_pct_mc_max_crs | double |  |
| pbp_b3_coins_pct_mc_max_icrs | double |  |
| pbp_b3_coins_pct_mc_max_prs | double |  |
| pbp_b3_coins_pct_mc_min_crs | double |  |
| pbp_b3_coins_pct_mc_min_icrs | double |  |
| pbp_b3_coins_pct_mc_min_prs | double |  |
| pbp_b3_coins_pct_min_crs | double |  |
| pbp_b3_coins_pct_min_icrs | double |  |
| pbp_b3_coins_pct_min_prs | double |  |
| pbp_b3_coins_pct_pos | double |  |
| pbp_b3_copay_amt | double |  |
| pbp_b3_copay_amt_max_crs | double |  |
| pbp_b3_copay_amt_max_icrs | double |  |
| pbp_b3_copay_amt_max_prs | double |  |
| pbp_b3_copay_amt_mc_max_crs | double |  |
| pbp_b3_copay_amt_mc_max_icrs | double |  |
| pbp_b3_copay_amt_mc_max_prs | double |  |
| pbp_b3_copay_amt_mc_min_crs | double |  |
| pbp_b3_copay_amt_mc_min_icrs | double |  |
| pbp_b3_copay_amt_mc_min_prs | double |  |
| pbp_b3_copay_amt_min_crs | double |  |
| pbp_b3_copay_amt_min_icrs | double |  |
| pbp_b3_copay_amt_min_prs | double |  |
| pbp_b3_copay_amtv_pos | double |  |
| pbp_b3_copay_ehc | string |  |
| pbp_b3_ded_amt | double |  |
| pbp_b3_ded_amt_pos | double |  |
| pbp_b3_maxenr_amt | double |  |
| pbp_b3_maxenr_amt_pos | double |  |
| pbp_b3_maxpln_amt_pos | double |  |
| pbp_b_3_ded_amt | double |  |
| pbp_b3_auth / pbp_b3_auth_yn / pbp_b3_auth_pos |  | INTENDED: prior-authorization required flags for CORF services (overall and at point-of-service/POS). All 100% NULL. |
| pbp_b3_coins_* (coins_yn, coins_yesno[_pos], coins_cov_mc/pos, coins_ehc, coins_pct_mc[_min/max], coins_pct_min/max_{crs,icrs,prs}, coins_pct_mc_min/max_{crs,icrs,prs}, coins_pct_pos) |  | INTENDED: the full coinsurance block for CORF cost-sharing — whether coinsurance applies, Medicare-covered flags, and percent values (min/max) broken out by the three CORF sub-benefits crs/icrs/prs and by enhanced (ehc) and POS variants. ALL 100% NULL. This is the core cost-sharing payload that is missing. |
| pbp_b3_copay_* (copay_yn, copay_yesno[_pos], copay_ehc, copay_amt, copay_amtv_pos, copay_amt_min/max_{crs,icrs,prs}, copay_amt_mc_min/max_{crs,icrs,prs}) |  | INTENDED: the full copay block — whether a copay applies and the dollar copay amounts (min/max, Medicare-covered mc variants) for the crs/icrs/prs CORF sub-benefits plus POS/enhanced variants. ALL 100% NULL. |
| pbp_b3_ded_* (ded_yn, ded_yesno_pos, pbp_b_3_ded_yesno, ded_amt, ded_amt_pos, pbp_b_3_ded_amt) |  | INTENDED: deductible flags and dollar amounts for CORF (note duplicate spellings ded_* and b_3_ded_*). ALL 100% NULL. |
| pbp_b3_maxenr_* (maxenr_yn, maxenr_yesno, maxenr_yn_pos, maxenr_per, maxenr_amt, maxenr_amt_pos) |  | INTENDED: per-enrollee maximum (cap) flags, period, and dollar amounts. ALL 100% NULL. |
| pbp_b3_maxpln_/maxplan_* (maxplan_yesno_pos, maxpln_cov_pos, maxpln_per_pos, maxpln_amt_pos) |  | INTENDED: plan-level maximum/cap coverage, period, and amount fields. ALL 100% NULL. |
| pbp_b3_bendesc_* (bendesc_yn, bendesc_ehc, bendesc_amo_{crs,icrs,prs}, bendesc_lim_{crs,icrs,prs}, bendesc_numv_{crs,icrs,prs}, bendesc_per_{crs,icrs,prs}) |  | INTENDED: benefit-description / limitation block — whether limits exist, amount/limit text, number-of-visits (numv) and the limit period for each CORF sub-benefit (crs = cardiac/comprehensive rehab service, icrs/prs = intensive & pulmonary rehab service variants). ALL 100% NULL. |

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