# PBP home health (cleaned view)

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

Cleaned source-faithful PBP home health 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 surface for

**Grain.** One row per MA plan-benefit-package per PBP filing snapshot for the home-health benefit, i.e. one row per (contract_id, plan_id, segment_id, report_year, quarter). All 5 columns are load-bearing and minimal: dropping any one breaks uniqueness (drop_segment -> 191,793; drop_year -> 59,740; drop_quarter -> 114,175 distinct, vs total). Verified: COUNT(DISTINCT those 5) = 201,488 = row_count exactly. home_health_sub_benefit, network_type, benefit_category and version are all functionally dependent (version never splits a snapshot: 0 plan-year-quarters have >1 version) and add nothing to the key.

**How to use it.** To get the current-year in-network home-health cost-share for every MA plan, deduping the redundant quarterly snapshots: SELECT contract_id, plan_id, segment_id, copay_amount, has_copay, has_coinsurance, auth_required, referral_required FROM medicare_semantic.vw_pbp_home_health WHERE report_year = 2026 (2026 has a single annual snapshot = 7,420 plan rows; of these 3,455 specify a copay - 3,447 of them $0 - and 1,295 use coinsurance). For multi-snapshot years (e.g. 2023) add a quarter filter such as AND quarter = 1, or wrap in ROW_NUMBER() OVER (PARTITION BY contract_id,plan_id,segment_id ORDER BY quarter DESC, version DESC) = 1, to avoid double-counting plans. Answers: 'what does each MA plan charge a member for home health, and does it require prior auth/referral, for a given year?'

**Traps.**
- GRAIN TRAP - quarter is a re-release index, not a calendar quarter, and snapshots are REDUNDANT: for 2018-2020/2022-2024 a plan appears under 2-4 quarterly snapshots whose copay never drifts (0 of 38,598 multi-quarter plan-years differ). Querying without deduping inflates plan counts ~2x for those years. To get one row per plan-year, filter to one quarter (e.g. WHERE quarter = 1) or qualify by ROW_NUMBER over quarter DESC. There is NO is_current / latest flag — you must pick the snapshot yourself.
- COINSURANCE IS A DEAD END FOR NUMBERS: coinsurance_pct is 100% NULL even though has_coinsurance=TRUE on 39,227 rows. You can tell a plan USES coinsurance but you cannot get the percent from this table. Likewise benefit_amount and its entire annualized/pmpm/period family are 100% NULL (home health carries no $-allowance), as are all limit_* columns.
- COPAY COVERAGE IS PARTIAL AND $0-DOMINATED: copay_amount is populated on only 79,807/201,488 rows (40%); 96% of those are $0 (home health is $0 under Original Medicare). A NULL copay does NOT mean $0 - it means either a coinsurance plan or cost-share-not-captured. Do not impute 0 for nulls.
- MANY 'POLICY' COLUMNS ARE DEGENERATE/MISLEADING IN THIS VIEW: numeric_amount_observability ('offered_without_numeric_amounts'), null_amount_reason, annualization_policy, combined_limit_policy, consumer_document_reconciliation_status ('not_checked'), confidence_tier ('source_faithful'), offered_status, benefit_category, network_type, home_health_sub_benefit, source_pbp_section, source_silver_table, lmi_authorities each have exactly ONE value across all rows. In particular numeric_amount_observability='offered_without_numeric_amounts' is self-contradictory here (40% have copay numbers) - it describes the benefit_amount family, not copay. Never filter on these expecting variety.
- NULLS ENCODE VINTAGE, NOT ABSENCE: auth_required is ~100% NULL for report_year 2001-2017 then populated 2018+; has_copay/has_coinsurance are NULL on 10,175 older rows. A NULL flag means 'CMS PBP of that year did not capture this field', not 'no auth / no cost-share'. Cohort your analysis by report_year. Also consumer_document_reconciliation_status='not_checked' everywhere: these are raw PBP design values, NOT validated against published Summary-of-Benefits/EOC docs.
- NOT A PAID-CLAIMS / FEE-SCHEDULE TABLE: this is MA plan BENEFIT-DESIGN member cost-share (copays/coinsurance flags) from CMS PBP filings - it is not what Medicare or the plan PAYS providers and is not a fee schedule. For provider-paid home-health amounts use the Medicare fee-schedule / claims sources, not this view.

| column | type | meaning |
|---|---|---|
| contract_id | string | CMS MA contract ID (e.g. H0046, E5088). 1,972 distinct. Part of the grain key. 'H' = local MA/MA-PD, 'E'/'R' = employer/regional plans. |
| plan_id | string | Plan ID within the contract (3-char, e.g. '001','801'). 656 distinct values. Part of the grain key. NOT unique by itself. |
| segment_id | string | Plan segment ID (e.g. '0'; 27 distinct). Distinguishes service-area segments of the same plan. Required for uniqueness — without it 9,695 rows collapse. |
| version | double | PBP file submission/version number for that snapshot (1-27). 0 for vintages 2001-2006 where CMS did not record a version. Functionally dependent on the grain (one value per snapshot row); MAX(version) is the final restatement but it is NOT needed for uniqueness. |
| report_year | double | Contract/benefit year the plan design applies to (2001-2026). This is the TRUE time axis of the table; periodicity is annual. |
| quarter | double | PBP PUF quarterly RE-RELEASE index within report_year (1-4), NOT a calendar quarter of service. Most years = quarter 1 only; CMS published multiple quarterly snapshots for 2018-2020, 2022-2024. Load-bearing for row uniqueness but see gotcha: snapshots are redundant (copay never drifts across quarters), so it inflates plan counts ~2x for those years. |
| benefit_category | string | Constant 'home_health' for all 201,488 rows. Degenerate in this view. |
| cost_share_string | string | Human-readable cost-share, e.g. '$0 copay', '$10.0 copay'. NULL for 121,681 rows (60%) where no copay figure was captured (coinsurance plans + cost-share-unspecified rows). When present it mirrors copay_amount exactly. |
| copay_amount | double | In-network home-health copay in dollars. Populated for only 79,807 rows (40%); the rest NULL. Heavily dominated by $0 (76,559 of 79,807 = 96%) because home health is $0 under Original Medicare and most MA plans mirror that; nonzero values 1-65. avg ~$0.69. |
| coinsurance_pct | double | 100% NULL across the entire table. CRITICAL: even the 39,227 rows flagged has_coinsurance=TRUE have NO percent here — the actual coinsurance rate is NOT recoverable from this view. |
| limit_text | string | Free-text benefit limit. 100% NULL in this view. |
| auth_required | boolean | Boolean: prior authorization required. NULL for 49,700 rows — and the NULLs are almost entirely vintages 2001-2017 (those years are ~100% NULL); 2018+ is mostly populated. So NULL means 'field not captured in that PBP vintage', not 'no auth'. Where populated: TRUE 120,706, FALSE 19,082. |
| referral_required | boolean | Boolean: referral required. Better populated than auth (NULL only 12,531). TRUE 53,884, FALSE 134,573 where known. |
| network_type | varchar(10) | Constant 'in_network' for all rows. This view carries only the in-network cost-share; out-of-network is not represented. |
| max_oop_applies | boolean | Boolean intended to flag max-OOP applicability. 100% NULL in this view — uninformative. |
| limit_quantity | double | Numeric benefit limit quantity. 100% NULL in this view. |
| limit_unit | string | Unit of the limit (e.g. visits). 100% NULL in this view. |
| limit_period_code | string | Coded limit period. 100% NULL. (Was offered as a candidate key column by the profiler but is entirely null — a non-key.) |
| limit_period_label | string | Human label for the limit period. 100% NULL in this view. |
| limit_quantity_per_year | double | Annualized limit quantity. 100% NULL in this view. |
| benefit_amount | double | Plan-provided benefit dollar allowance. 100% NULL in this view (home health has no $-allowance, unlike OTC/dental sibling views that share this schema). |
| benefit_amount_kind | string | Kind/semantics of benefit_amount. 100% NULL here. |
| benefit_amount_period_code | string | Coded period for benefit_amount. 100% NULL. (Profiler listed it as a candidate key column, but it is entirely null — not a real key.) |
| benefit_amount_period_label | string | Human period label for benefit_amount. 100% NULL here. |
| benefit_amount_annualized | double | Benefit allowance annualized. 100% NULL here. |
| benefit_amount_pmpm | double | Benefit allowance per-member-per-month. 100% NULL here. |
| normalization_status | string | Status of $-amount normalization. 100% NULL in this view (no numeric benefit amounts to normalize). |
| normalization_basis | string | Basis used for normalization. 100% NULL here. |
| aggregation_policy | string | How multiple amounts were aggregated. 100% NULL here. |
| offered_status | varchar(15) | Constant 'offered' for all rows — every row is a plan that offers home health (the view does not carry 'not_offered' rows). |
| numeric_amount_observability | varchar(31) | Constant 'offered_without_numeric_amounts' for ALL rows. MISLEADING: it refers to the benefit_amount ($-allowance) family (all null), NOT copay — 40% of rows DO have a numeric copay_amount. Treat as a degenerate/contradictory label in this view. |
| null_amount_reason | varchar(30) | Constant 'unknown_requires_crosswalk' for all rows — the stated reason benefit_amount is null (needs an external crosswalk). Degenerate (single value). |
| annualization_policy | varchar(17) | Constant 'not_numeric' for all rows (no $-amount to annualize). Degenerate. |
| combined_limit_policy | varchar(29) | Constant 'none_detected' for all rows. Degenerate. |
| consumer_document_reconciliation_status | varchar(11) | Constant 'not_checked' for all rows — these values have NOT been reconciled against consumer-facing plan docs (SB/EOC). Degenerate but a real caveat: this is raw PBP, unverified vs. published documents. |
| confidence_tier | varchar(23) | Constant 'source_faithful' for all rows — values are faithful to the source PBP file (not derived/imputed). Degenerate. |
| coinsurance_pct_max | double |  |
| copay_amount_max | double | Upper bound of copay range (e.g. up to $20). Populated only where copay exists (79,807); avg ~0.98, so most plans have a single-value (min=max) copay. |
| copay_amount_min | double | Lower bound of copay when a range is present; equals copay_amount in the simple case. Populated only where copay_amount is (79,807). avg ~0.69. |
| has_coinsurance | boolean | Boolean: coinsurance applies. TRUE 39,227. But the % itself is always NULL (see coinsurance_pct) — this is a presence flag only. |
| has_copay | boolean | Boolean: a copay is specified. TRUE 79,803 / FALSE 111,510 / NULL 10,175 (older vintages where flags weren't derived). Aligns with copay_amount being non-null (only 4 anomalous mismatches). |
| has_deductible | boolean | Boolean: benefit subject to a deductible. TRUE for only 3 rows in the whole table — effectively always FALSE. |
| has_max_enrollee_oop | boolean | Boolean: benefit counts toward the plan max-OOP. TRUE for only 16 rows — effectively always FALSE/uninformative here. |
| home_health_sub_benefit | string | Sub-benefit label, constant 'home_health' for all rows. Degenerate here (the view does not split home health into visit sub-types). |
| source_pbp_section | varchar(2) | Constant 'B6' — the CMS PBP form section for home health. Confirms provenance. |
| source_silver_table | varchar(42) | Constant 'medicare_silver.pbp_section_b6_home_health' — the upstream silver table this view normalizes. |
| lmi_authorities | string | Constant single value (pipe-delimited URLs to the CY2026 LMI MA-benefits reference PDFs: Service Category Descriptions + Part C Bid Review Memorandum). A static documentation pointer, identical on every row. |
| source_url | string | CMS download URL for the originating PBP PUF zip (e.g. .../pbp-benefits-2026.zip, or .../pbp-benefits-2024-quarter-1.zip for quarterly years). 40 distinct values = 40 source files (one per report_year, or per year-quarter for 2018-2020/2022-2024). 1:1 with sha256_content_hash. |
| sha256_content_hash | string | SHA-256 of the source file content for provenance/integrity. 40 distinct values, 1:1 with source_url (one hash per source PBP file release). |

Tools that read it: get_pbp_benefit

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