Skip to content

Fix benefit-card timeouts: scalar subquery instead of CROSS JOIN totals (MFB-867)#101

Merged
catonph merged 1 commit into
mainfrom
caton/mfb-867-fix-card-nested-loop
Jun 2, 2026
Merged

Fix benefit-card timeouts: scalar subquery instead of CROSS JOIN totals (MFB-867)#101
catonph merged 1 commit into
mainfrom
caton/mfb-867-fix-card-nested-loop

Conversation

@catonph

@catonph catonph commented Jun 2, 2026

Copy link
Copy Markdown
Collaborator

Problem

The 'qualified_benefits' and 'immediate_needs' dashboard cards timed out (minutes / never loaded) even after the COALESCE join fix (#99) and the RLS-function-inlining fix (#100).

Root cause

The 'CROSS JOIN totals t' (where 'totals' counts filtered 'mart_screener_data') confused the planner's row estimation for the multi-column COALESCE join. It estimated the join at rows=1 and chose a Nested Loop — which exploded over the ~19k actual joined rows. 'EXPLAIN' showed a cheap plan; real execution timed out. (This is why every isolated test looked fine but the card died.)

Fix

Drop 'totals' / 'CROSS JOIN totals t'; compute the denominator as an inline scalar subquery in the '% of Screeners' expression. Identical result, but the planner now picks a Hash Join.

Verification

  • Raw 'EXPLAIN ANALYZE' (real data, date filter): 96 ms, Hash Join (was: timeout / Nested Loop).
  • Ran through the real Metabase RLS path (editor, date filter applied): returns fast. This is the validation the earlier fixes never actually passed.

Scope

Applied to all 3 benefit/needs cards. 'current_benefits' already worked (#98 indexed 'screen_id' join) but carried the same 'CROSS JOIN' pattern → same treatment to remove latent risk.

Audited all other cards: remaining 'CROSS JOIN totals' usages are single-table (no join) or join on an indexed single 'screener_id' key with a tiny aggregated cross join — not the at-risk shape. No change needed.

Card SQL only — no mart/model change, no dbt run. Deploys via Terraform on merge.

Concludes the MFB-867 dashboard perf saga (#96#97#98#99#100 → this).

🤖 Generated with Claude Code

Summary by CodeRabbit

  • Refactor
    • Enhanced dashboard query performance by optimizing calculation structures in benefit screening reports.

…uery (MFB-867)

The qualified_benefits / immediate_needs cards timed out on the dashboard even
after the join (#99) and RLS-function-inlining (#100) fixes. Root cause: the
`CROSS JOIN totals t` (where `totals` is a count over filtered mart_screener_data)
confused the planner's row estimation for the multi-column COALESCE join, so it
estimated the join at rows=1 and chose a Nested Loop — which exploded over the
~19k actual joined rows. EXPLAIN looked cheap; real execution timed out.

Fix: drop `totals`/`CROSS JOIN totals t` and compute the denominator as an inline
scalar subquery in the `% of Screeners` expression. Same result, but the planner
now picks a Hash Join. Verified through the real Metabase RLS path (date filter
applied): qualified_benefits returns fast; raw EXPLAIN ANALYZE = 96ms (Hash Join,
not Nested Loop), down from timeout.

Applied to all three benefit/needs cards for consistency. current_benefits
already worked (indexed screen_id join, #98) but carried the same CROSS JOIN
pattern, so it gets the same treatment to remove the latent risk.

Audited the other dashboard cards: the remaining CROSS JOIN totals usages are
either single-table (no join) or join on an indexed single screener_id key with a
tiny aggregated cross join — not the at-risk shape. No change needed there.

Card SQL only — no mart/model change, no dbt run. Deploys via Terraform on merge.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@coderabbitai

coderabbitai Bot commented Jun 2, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

Caution

Review failed

Pull request was closed or merged during review

Note

.coderabbit.yaml has unrecognized properties

CodeRabbit is using all valid settings from your configuration. Unrecognized properties (listed below) have been ignored and may indicate typos or deprecated fields that can be removed.

⚠️ Parsing warnings (1)
Validation error: Unrecognized key: "base_branches"
⚙️ Configuration instructions
  • Please see the configuration documentation for more information.
  • You can also validate your configuration using the online YAML validator.
  • If your editor has YAML language server enabled, you can add the path at the top of this file to enable auto-completion and validation: # yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json
📝 Walkthrough

Walkthrough

Three SQL dashboard queries are refactored to compute percentage-of-screeners denominators inline instead of using a shared totals CTE. The totals CTE and its CROSS JOIN are removed from each query, and the percentage calculations now use filtered count(*) subqueries with nullif(..., 0) guards.

Changes

Percentage-of-screeners calculation refactoring

Layer / File(s) Summary
Replace totals CTE with inline subqueries across all three queries
dashboards/sql/current_benefits.sql, dashboards/sql/immediate_needs.sql, dashboards/sql/qualified_benefits.sql
The totals CTE is removed from the WITH clause in all three files. Percentage-of-screeners calculations are updated to use inline count(*) subqueries with the same dynamic filters. CROSS JOIN clauses referencing totals are removed. Division by zero is guarded with nullif(..., 0).

Estimated code review effort

🎯 2 (Simple) | ⏱️ ~12 minutes

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Title check ✅ Passed The title clearly and specifically describes the main change: replacing CROSS JOIN totals with scalar subqueries to fix dashboard timeouts, with the issue reference.
Description check ✅ Passed The description comprehensively covers the problem, root cause analysis, the fix applied, verification steps including EXPLAIN ANALYZE results, and deployment scope.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch caton/mfb-867-fix-card-nested-loop

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@github-actions

github-actions Bot commented Jun 2, 2026

Copy link
Copy Markdown

Terraform Plan 📖

Show Plan
data.external.metabase_ids: Reading...
metabase_database.postgres: Refreshing state... [name=MFB PostgreSQL Analytics]
metabase_permissions_group.global: Refreshing state... [name=Global Viewers]
metabase_permissions_group.tenant["nc"]: Refreshing state... [name=North Carolina Viewers]
metabase_permissions_group.tenant["co"]: Refreshing state... [name=Colorado Viewers]
metabase_database.bigquery[0]: Refreshing state... [name=MFB BigQuery Analytics]
metabase_permissions_group.tenant["ma"]: Refreshing state... [name=Massachusetts Viewers]
metabase_permissions_group.tenant["wa"]: Refreshing state... [name=Washington Viewers]
metabase_permissions_group.tenant["cesn"]: Refreshing state... [name=CESN Viewers]
metabase_permissions_group.tenant["il"]: Refreshing state... [name=Illinois Viewers]
metabase_permissions_group.tenant["tx"]: Refreshing state... [name=Texas Viewers]
metabase_permissions_group.tenant["co_tax_calculator"]: Refreshing state... [name=CO Tax Calculator Viewers]
metabase_permissions_group.tenant_editor["ma"]: Refreshing state... [name=Massachusetts Editors]
metabase_permissions_group.tenant_editor["co"]: Refreshing state... [name=Colorado Editors]
metabase_permissions_group.tenant_editor["nc"]: Refreshing state... [name=North Carolina Editors]
metabase_permissions_group.tenant_editor["tx"]: Refreshing state... [name=Texas Editors]
metabase_permissions_group.tenant_editor["co_tax_calculator"]: Refreshing state... [name=CO Tax Calculator Editors]
metabase_permissions_group.tenant_editor["cesn"]: Refreshing state... [name=CESN Editors]
metabase_permissions_group.tenant_editor["il"]: Refreshing state... [name=Illinois Editors]
metabase_permissions_group.tenant_editor["wa"]: Refreshing state... [name=Washington Editors]
metabase_database.tenant_postgres["ma"]: Refreshing state... [name=MFB PostgreSQL Massachusetts]
metabase_database.tenant_postgres["il"]: Refreshing state... [name=MFB PostgreSQL Illinois]
metabase_database.tenant_postgres["co"]: Refreshing state... [name=MFB PostgreSQL Colorado]
metabase_database.tenant_postgres["nc"]: Refreshing state... [name=MFB PostgreSQL North Carolina]
metabase_database.tenant_postgres["cesn"]: Refreshing state... [name=MFB PostgreSQL CESN]
metabase_database.tenant_postgres["wa"]: Refreshing state... [name=MFB PostgreSQL Washington]
metabase_database.tenant_postgres["tx"]: Refreshing state... [name=MFB PostgreSQL Texas]
metabase_database.tenant_postgres["co_tax_calculator"]: Refreshing state... [name=MFB PostgreSQL CO Tax Calculator]
time_sleep.wait_for_database_sync: Refreshing state... [id=2026-03-20T21:10:50Z]
data.metabase_table.tenant_screen_summary_tables["wa"]: Reading...
data.external.filter_field_ids: Reading...
data.metabase_table.tenant_screen_summary_tables["cesn"]: Reading...
data.metabase_table.screen_summary_table: Reading...
data.metabase_table.tenant_screen_summary_tables["co"]: Reading...
data.metabase_table.tenant_screen_summary_tables["il"]: Reading...
data.metabase_table.tenant_screen_summary_tables["co_tax_calculator"]: Reading...
metabase_collection.global: Refreshing state... [id=5]
data.metabase_table.tenant_screen_summary_tables["tx"]: Reading...
data.metabase_table.tenant_screen_summary_tables["ma"]: Reading...
data.external.metabase_ids: Read complete after 0s [id=-]
data.metabase_table.tenant_screen_summary_tables["nc"]: Reading...
data.metabase_table.tenant_screen_summary_tables["il"]: Read complete after 1s [name=mart_screener_data]
data.metabase_table.tenant_screen_summary_tables["cesn"]: Read complete after 1s [name=mart_screener_data]
metabase_collection.tenant_collection_nc: Refreshing state... [id=6]
metabase_card.global_household_assets_distribution: Refreshing state...
data.metabase_table.tenant_screen_summary_tables["wa"]: Read complete after 1s [name=mart_screener_data]
metabase_card.global_income_streams: Refreshing state...
data.metabase_table.tenant_screen_summary_tables["co_tax_calculator"]: Read complete after 1s [name=mart_screener_data]
metabase_card.global_completed_screeners: Refreshing state...
data.metabase_table.tenant_screen_summary_tables["tx"]: Read complete after 1s [name=mart_screener_data]
metabase_card.global_top_counties: Refreshing state...
data.metabase_table.tenant_screen_summary_tables["co"]: Read complete after 1s [name=mart_screener_data]
metabase_card.global_median_monthly_benefits: Refreshing state...
metabase_card.global_median_annual_benefits: Refreshing state...
data.metabase_table.tenant_screen_summary_tables["ma"]: Read complete after 1s [name=mart_screener_data]
metabase_card.global_median_household_size: Refreshing state...
data.metabase_table.screen_summary_table: Read complete after 1s [name=mart_screener_data]
metabase_card.global_head_of_household_ages: Refreshing state...
metabase_card.global_immediate_needs_table: Refreshing state...
metabase_card.global_current_benefits_table: Refreshing state...
metabase_card.global_median_monthly_income: Refreshing state...
metabase_card.global_household_income_distribution: Refreshing state...
metabase_card.global_daily_screeners_7d: Refreshing state...
metabase_card.global_median_household_assets: Refreshing state...
metabase_card.global_common_expenses: Refreshing state...
metabase_card.global_median_monthly_expenses: Refreshing state...
metabase_card.global_household_member_ages: Refreshing state...
metabase_card.global_household_languages: Refreshing state...
metabase_card.global_household_sizes: Refreshing state...
metabase_card.global_median_annual_tax_credits: Refreshing state...
data.metabase_table.tenant_screen_summary_tables["nc"]: Read complete after 1s [name=mart_screener_data]
metabase_card.global_qualified_benefits_table: Refreshing state...
metabase_card.global_top_partners: Refreshing state...
metabase_card.global_qualified_for_benefits_pct: Refreshing state...
metabase_card.global_already_had_benefits_pct: Refreshing state...
metabase_card.global_qualified_for_tax_creds_pct: Refreshing state...
metabase_card.global_median_annual_income: Refreshing state...
metabase_collection.tenant_collection_co: Refreshing state... [id=7]
metabase_card.screen_count: Refreshing state...
metabase_collection.tenant_collection_tx: Refreshing state... [id=8]
metabase_dashboard.analytics: Refreshing state... [name=MFB Analytics Dashboard]
metabase_collection.tenant_collection_wa: Refreshing state... [id=273]
metabase_permissions_graph.graph: Refreshing state...
metabase_collection.tenant_collection_il: Refreshing state... [id=9]
metabase_collection.tenant_collection_ma: Refreshing state... [id=10]
metabase_collection.tenant_collection_cesn: Refreshing state... [id=11]
metabase_collection.tenant_collection_co_tax_calculator: Refreshing state... [id=12]
metabase_card.tenant_partner_values["ma"]: Refreshing state...
metabase_card.tenant_partner_values["co_tax_calculator"]: Refreshing state...
metabase_card.tenant_partner_values["co"]: Refreshing state...
metabase_card.tenant_partner_values["nc"]: Refreshing state...
metabase_card.tenant_partner_values["wa"]: Refreshing state...
metabase_card.tenant_partner_values["cesn"]: Refreshing state...
metabase_card.tenant_partner_values["il"]: Refreshing state...
metabase_collection_graph.graph: Refreshing state...
metabase_card.tenant_partner_values["tx"]: Refreshing state...
metabase_card.tenant_county_values["nc"]: Refreshing state...
metabase_card.tenant_county_values["tx"]: Refreshing state...
metabase_card.tenant_county_values["wa"]: Refreshing state...
metabase_card.tenant_county_values["co_tax_calculator"]: Refreshing state...
metabase_card.ga_conversion_funnel["tx"]: Refreshing state...
metabase_card.ga_conversion_funnel["wa"]: Refreshing state...
metabase_card.tenant_county_values["ma"]: Refreshing state...
metabase_card.ga_conversion_funnel["cesn"]: Refreshing state...
metabase_card.ga_conversion_funnel["co"]: Refreshing state...
metabase_card.ga_conversion_funnel["il"]: Refreshing state...
metabase_card.ga_conversion_funnel["ma"]: Refreshing state...
metabase_card.ga_conversion_funnel["nc"]: Refreshing state...
metabase_card.tenant_county_values["cesn"]: Refreshing state...
metabase_card.tenant_county_values["co"]: Refreshing state...
metabase_card.tenant_county_values["il"]: Refreshing state...
metabase_card.tenant_screen_count["cesn"]: Refreshing state...
metabase_card.ga_completed_to_click_rate["nc"]: Refreshing state...
metabase_card.tenant_screen_count["ma"]: Refreshing state...
metabase_card.tenant_screen_count["co"]: Refreshing state...
metabase_card.tenant_screen_count["co_tax_calculator"]: Refreshing state...
metabase_card.tenant_screen_count["il"]: Refreshing state...
metabase_card.ga_completed_to_click_rate["wa"]: Refreshing state...
metabase_card.ga_completed_to_click_rate["cesn"]: Refreshing state...
metabase_card.tenant_screen_count["nc"]: Refreshing state...
metabase_card.ga_completed_to_click_rate["co"]: Refreshing state...
metabase_card.tenant_screen_count["tx"]: Refreshing state...
metabase_card.ga_completed_to_click_rate["il"]: Refreshing state...
metabase_card.ga_completed_to_click_rate["tx"]: Refreshing state...
metabase_card.ga_completed_to_click_rate["ma"]: Refreshing state...
metabase_card.ga_clicked_links_bar["wa"]: Refreshing state...
metabase_card.ga_clicked_links_bar["tx"]: Refreshing state...
metabase_card.ga_clicked_links_bar["nc"]: Refreshing state...
metabase_card.ga_clicked_links_bar["cesn"]: Refreshing state...
metabase_card.ga_clicked_links_bar["co"]: Refreshing state...
metabase_card.ga_clicked_links_bar["il"]: Refreshing state...
metabase_card.ga_median_completion_time["wa"]: Refreshing state...
metabase_card.ga_clicked_links_bar["ma"]: Refreshing state...
metabase_card.ga_median_completion_time["co"]: Refreshing state...
metabase_card.ga_median_completion_time["cesn"]: Refreshing state...
metabase_card.ga_median_completion_time["ma"]: Refreshing state...
metabase_card.ga_median_completion_time["il"]: Refreshing state...
metabase_card.ga_median_completion_time["nc"]: Refreshing state...
metabase_card.ga_median_completion_time["tx"]: Refreshing state...
metabase_card.ga_conversion_funnel_table["ma"]: Refreshing state...
metabase_card.tenant_utm_campaign_values["nc"]: Refreshing state...
metabase_card.ga_conversion_funnel_table["nc"]: Refreshing state...
metabase_card.ga_conversion_funnel_table["tx"]: Refreshing state...
metabase_card.ga_conversion_funnel_table["wa"]: Refreshing state...
metabase_card.ga_conversion_funnel_table["cesn"]: Refreshing state...
metabase_card.ga_conversion_funnel_table["co"]: Refreshing state...
metabase_card.ga_conversion_funnel_table["il"]: Refreshing state...
metabase_card.ga_traffic_mediums_table["wa"]: Refreshing state...
metabase_card.ga_traffic_mediums_table["cesn"]: Refreshing state...
metabase_card.ga_traffic_mediums_table["co"]: Refreshing state...
metabase_card.ga_traffic_mediums_table["il"]: Refreshing state...
metabase_card.ga_traffic_mediums_table["ma"]: Refreshing state...
metabase_card.ga_traffic_mediums_table["nc"]: Refreshing state...
metabase_card.ga_traffic_mediums_table["tx"]: Refreshing state...
metabase_card.ga_total_visitors["nc"]: Refreshing state...
metabase_card.ga_total_visitors["wa"]: Refreshing state...
metabase_card.ga_total_visitors["tx"]: Refreshing state...
metabase_card.ga_total_visitors["co"]: Refreshing state...
metabase_card.ga_total_visitors["cesn"]: Refreshing state...
metabase_card.ga_total_visitors["il"]: Refreshing state...
metabase_card.ga_total_visitors["ma"]: Refreshing state...
metabase_card.ga_clicked_links_table["ma"]: Refreshing state...
metabase_card.ga_clicked_links_table["wa"]: Refreshing state...
metabase_card.ga_clicked_links_table["nc"]: Refreshing state...
metabase_card.ga_clicked_links_table["tx"]: Refreshing state...
metabase_card.ga_clicked_links_table["cesn"]: Refreshing state...
metabase_card.ga_clicked_links_table["co"]: Refreshing state...
metabase_card.ga_clicked_links_table["il"]: Refreshing state...
metabase_card.ga_traffic_mediums_bar["cesn"]: Refreshing state...
metabase_card.ga_traffic_mediums_bar["ma"]: Refreshing state...
metabase_card.ga_traffic_mediums_bar["nc"]: Refreshing state...
metabase_card.ga_traffic_mediums_bar["tx"]: Refreshing state...
metabase_card.ga_traffic_mediums_bar["wa"]: Refreshing state...
metabase_card.ga_traffic_mediums_bar["co"]: Refreshing state...
metabase_card.ga_traffic_mediums_bar["il"]: Refreshing state...
metabase_card.ga_started_screener_pct["nc"]: Refreshing state...
metabase_card.ga_started_screener_pct["tx"]: Refreshing state...
metabase_card.ga_started_screener_pct["wa"]: Refreshing state...
metabase_card.ga_started_screener_pct["co"]: Refreshing state...
metabase_card.ga_started_screener_pct["cesn"]: Refreshing state...
metabase_card.ga_started_screener_pct["il"]: Refreshing state...
metabase_card.ga_started_screener_pct["ma"]: Refreshing state...
metabase_card.ga_users_in_week["ma"]: Refreshing state...
metabase_card.ga_users_in_week["nc"]: Refreshing state...
metabase_card.ga_users_in_week["co"]: Refreshing state...
metabase_card.ga_users_in_week["il"]: Refreshing state...
metabase_card.ga_users_in_week["tx"]: Refreshing state...
metabase_card.ga_users_in_week["wa"]: Refreshing state...
metabase_card.ga_users_in_week["cesn"]: Refreshing state...
metabase_card.tenant_utm_medium_values["nc"]: Refreshing state...
metabase_card.tenant_monthly_active_users["nc"]: Refreshing state...
metabase_card.tenant_utm_source_values["nc"]: Refreshing state...
metabase_card.tenant_monthly_active_users["wa"]: Refreshing state...
metabase_card.tenant_monthly_active_users["co"]: Refreshing state...
metabase_card.tenant_monthly_active_users["cesn"]: Refreshing state...
metabase_card.tenant_monthly_active_users["tx"]: Refreshing state...
data.external.filter_field_ids: Read complete after 3s [id=-]
metabase_card.tenant_monthly_active_users["il"]: Refreshing state...
metabase_card.tenant_monthly_active_users["ma"]: Refreshing state...
metabase_card.tenant_head_of_household_ages["tx"]: Refreshing state...
metabase_card.tenant_head_of_household_ages["co"]: Refreshing state...
metabase_card.tenant_head_of_household_ages["nc"]: Refreshing state...
metabase_card.tenant_head_of_household_ages["cesn"]: Refreshing state...
metabase_card.tenant_head_of_household_ages["il"]: Refreshing state...
metabase_card.tenant_head_of_household_ages["co_tax_calculator"]: Refreshing state...
metabase_card.tenant_head_of_household_ages["ma"]: Refreshing state...
metabase_card.cesn_homeowners_daily_screeners["co_tax_calculator"]: Refreshing state...
metabase_card.cesn_homeowners_daily_screeners["il"]: Refreshing state...
metabase_card.cesn_homeowners_daily_screeners["co"]: Refreshing state...
metabase_card.cesn_homeowners_daily_screeners["ma"]: Refreshing state...
metabase_card.cesn_homeowners_daily_screeners["cesn"]: Refreshing state...
metabase_card.cesn_homeowners_daily_screeners["nc"]: Refreshing state...
metabase_card.cesn_homeowners_daily_screeners["tx"]: Refreshing state...
metabase_card.tenant_household_assets_distribution["ma"]: Refreshing state...
metabase_card.tenant_household_assets_distribution["co_tax_calculator"]: Refreshing state...
metabase_card.tenant_household_assets_distribution["tx"]: Refreshing state...
metabase_card.tenant_household_assets_distribution["cesn"]: Refreshing state...
metabase_card.tenant_household_assets_distribution["co"]: Refreshing state...
metabase_card.tenant_household_assets_distribution["il"]: Refreshing state...
metabase_card.tenant_household_assets_distribution["nc"]: Refreshing state...
metabase_card.tenant_immediate_needs_table["co"]: Refreshing state...
metabase_card.tenant_immediate_needs_table["nc"]: Refreshing state...
metabase_card.tenant_immediate_needs_table["il"]: Refreshing state...
metabase_card.tenant_immediate_needs_table["tx"]: Refreshing state...
metabase_card.tenant_immediate_needs_table["cesn"]: Refreshing state...
metabase_card.tenant_immediate_needs_table["co_tax_calculator"]: Refreshing state...
metabase_card.tenant_immediate_needs_table["ma"]: Refreshing state...
metabase_card.cesn_needs_water_heater["tx"]: Refreshing state...
metabase_card.cesn_needs_water_heater["cesn"]: Refreshing state...
metabase_card.cesn_needs_water_heater["co_tax_calculator"]: Refreshing state...
metabase_card.tenant_median_household_size["cesn"]: Refreshing state...
metabase_card.cesn_needs_water_heater["ma"]: Refreshing state...
metabase_card.cesn_needs_water_heater["nc"]: Refreshing state...
metabase_card.cesn_needs_water_heater["co"]: Refreshing state...
metabase_card.cesn_needs_water_heater["il"]: Refreshing state...
metabase_card.tenant_median_household_size["co"]: Refreshing state...
metabase_card.tenant_median_household_size["co_tax_calculator"]: Refreshing state...
metabase_card.tenant_median_household_size["il"]: Refreshing state...
metabase_card.tenant_median_household_size["nc"]: Refreshing state...
metabase_card.tenant_median_household_size["tx"]: Refreshing state...
metabase_card.tenant_median_household_size["ma"]: Refreshing state...
metabase_card.tenant_median_annual_income["ma"]: Refreshing state...
metabase_card.tenant_median_monthly_income["co"]: Refreshing state...
metabase_card.cesn_renters_daily_screeners["co_tax_calculator"]: Refreshing state...
metabase_card.tenant_household_sizes["tx"]: Refreshing state...
metabase_card.cesn_renters_completed["co"]: Refreshing state...
metabase_card.cesn_renters_daily_screeners["il"]: Refreshing state...
metabase_card.cesn_renters_daily_screeners["nc"]: Refreshing state...
metabase_card.cesn_renters_daily_screeners["cesn"]: Refreshing state...
metabase_card.cesn_renters_daily_screeners["tx"]: Refreshing state...
metabase_card.cesn_renters_daily_screeners["co"]: Refreshing state...
metabase_card.cesn_renters_daily_screeners["ma"]: Refreshing state...
metabase_card.cesn_needs_stove["il"]: Refreshing state...
metabase_card.cesn_needs_stove["ma"]: Refreshing state...
metabase_card.cesn_needs_stove["cesn"]: Refreshing state...
metabase_card.cesn_needs_stove["tx"]: Refreshing state...
metabase_card.cesn_needs_stove["co"]: Refreshing state...
metabase_card.cesn_needs_stove["nc"]: Refreshing state...
metabase_card.cesn_needs_stove["co_tax_calculator"]: Refreshing state...
metabase_card.cesn_homeowners_completed["nc"]: Refreshing state...
metabase_card.tenant_household_sizes["il"]: Refreshing state...
metabase_card.tenant_household_sizes["cesn"]: Refreshing state...
metabase_card.tenant_household_sizes["co"]: Refreshing state...
metabase_card.tenant_household_sizes["ma"]: Refreshing state...
metabase_card.tenant_household_sizes["co_tax_calculator"]: Refreshing state...
metabase_card.tenant_median_annual_income["co"]: Refreshing state...
metabase_card.tenant_median_annual_income["cesn"]: Refreshing state...
metabase_card.tenant_median_annual_income["il"]: Refreshing state...
metabase_card.tenant_median_annual_income["nc"]: Refreshing state...
metabase_card.tenant_median_annual_income["tx"]: Refreshing state...
metabase_card.tenant_median_annual_income["co_tax_calculator"]: Refreshing state...
metabase_card.tenant_median_monthly_income["co_tax_calculator"]: Refreshing state...
metabase_card.tenant_median_monthly_income["il"]: Refreshing state...
metabase_card.tenant_median_monthly_income["tx"]: Refreshing state...
metabase_card.tenant_median_monthly_income["cesn"]: Refreshing state...
metabase_card.cesn_renters_completed["ma"]: Refreshing state...
metabase_card.tenant_household_sizes["nc"]: Refreshing state...
metabase_card.cesn_renters_completed["co_tax_calculator"]: Refreshing state...
metabase_card.cesn_renters_completed["cesn"]: Refreshing state...
metabase_card.cesn_renters_completed["tx"]: Refreshing state...
metabase_card.cesn_renters_completed["il"]: Refreshing state...
metabase_card.cesn_homeowners_completed["tx"]: Refreshing state...
metabase_card.cesn_renters_completed["nc"]: Refreshing state...
metabase_card.cesn_homeowners_completed["ma"]: Refreshing state...
metabase_card.tenant_median_monthly_income["nc"]: Refreshing state...
metabase_card.tenant_median_monthly_income["ma"]: Refreshing state...
metabase_card.cesn_homeowners_completed["cesn"]: Refreshing state...
metabase_card.cesn_homeowners_completed["co"]: Refreshing state...
metabase_card.cesn_homeowners_completed["il"]: Refreshing state...
metabase_card.cesn_homeowners_completed["co_tax_calculator"]: Refreshing state...
metabase_card.tenant_top_partners["co"]: Refreshing state...
metabase_card.tenant_top_partners["cesn"]: Refreshing state...
metabase_card.tenant_top_partners["nc"]: Refreshing state...
metabase_card.tenant_top_partners["ma"]: Refreshing state...
metabase_card.tenant_top_partners["il"]: Refreshing state...
metabase_card.tenant_top_partners["co_tax_calculator"]: Refreshing state...
metabase_card.tenant_top_partners["tx"]: Refreshing state...
metabase_card.cesn_homeowners_old_car["il"]: Refreshing state...
metabase_card.cesn_homeowners_old_car["cesn"]: Refreshing state...
metabase_card.cesn_homeowners_old_car["co"]: Refreshing state...
metabase_card.cesn_homeowners_old_car["tx"]: Refreshing state...
metabase_card.cesn_homeowners_old_car["ma"]: Refreshing state...
metabase_card.tenant_median_household_assets["cesn"]: Refreshing state...
metabase_card.cesn_homeowners_old_car["co_tax_calculator"]: Refreshing state...
metabase_card.cesn_homeowners_old_car["nc"]: Refreshing state...
metabase_card.tenant_median_household_assets["il"]: Refreshing state...
metabase_card.tenant_median_household_assets["co"]: Refreshing state...
metabase_card.tenant_median_household_assets["nc"]: Refreshing state...
metabase_card.tenant_median_household_assets["co_tax_calculator"]: Refreshing state...
metabase_card.tenant_median_household_assets["ma"]: Refreshing state...
metabase_card.tenant_median_household_assets["tx"]: Refreshing state...
metabase_card.cesn_renters_disconnected["co_tax_calculator"]: Refreshing state...
metabase_card.cesn_renters_disconnected["co"]: Refreshing state...
metabase_card.cesn_renters_disconnected["nc"]: Refreshing state...
metabase_card.cesn_renters_disconnected["il"]: Refreshing state...
metabase_card.cesn_renters_disconnected["ma"]: Refreshing state...
metabase_card.cesn_renters_disconnected["tx"]: Refreshing state...
metabase_card.cesn_renters_disconnected["cesn"]: Refreshing state...
metabase_card.tenant_total_tax_benefits["co_tax_calculator"]: Refreshing state...
metabase_card.tenant_total_tax_benefits["il"]: Refreshing state...
metabase_card.tenant_total_tax_benefits["ma"]: Refreshing state...
metabase_card.tenant_total_tax_benefits["co"]: Refreshing state...
metabase_card.tenant_total_tax_benefits["nc"]: Refreshing state...
metabase_card.tenant_total_tax_benefits["tx"]: Refreshing state...
metabase_card.tenant_total_tax_benefits["cesn"]: Refreshing state...
metabase_card.tenant_income_streams["co"]: Refreshing state...
metabase_card.tenant_income_streams["tx"]: Refreshing state...
metabase_card.tenant_income_streams["co_tax_calculator"]: Refreshing state...
metabase_card.tenant_income_streams["il"]: Refreshing state...
metabase_card.cesn_renters_past_due["nc"]: Refreshing state...
metabase_card.cesn_renters_past_due["co"]: Refreshing state...
metabase_card.tenant_income_streams["ma"]: Refreshing state...
metabase_card.cesn_renters_past_due["tx"]: Refreshing state...
metabase_card.cesn_renters_past_due["ma"]: Refreshing state...
metabase_card.tenant_income_streams["nc"]: Refreshing state...
metabase_card.tenant_income_streams["cesn"]: Refreshing state...
metabase_card.cesn_renters_past_due["co_tax_calculator"]: Refreshing state...
metabase_card.cesn_renters_past_due["cesn"]: Refreshing state...
metabase_card.cesn_renters_past_due["il"]: Refreshing state...
metabase_card.tenant_total_benefits["cesn"]: Refreshing state...
metabase_card.tenant_total_benefits["nc"]: Refreshing state...
metabase_card.tenant_total_benefits["il"]: Refreshing state...
metabase_card.tenant_total_benefits["ma"]: Refreshing state...
metabase_card.tenant_total_benefits["tx"]: Refreshing state...
metabase_card.tenant_total_benefits["co"]: Refreshing state...
metabase_card.tenant_total_benefits["co_tax_calculator"]: Refreshing state...
metabase_card.cesn_homeowners_gas_provider["co_tax_calculator"]: Refreshing state...
metabase_card.cesn_homeowners_gas_provider["nc"]: Refreshing state...
metabase_card.cesn_homeowners_gas_provider["cesn"]: Refreshing state...
metabase_card.cesn_homeowners_gas_provider["tx"]: Refreshing state...
metabase_card.cesn_homeowners_gas_provider["il"]: Refreshing state...
metabase_card.cesn_homeowners_gas_provider["ma"]: Refreshing state...
metabase_card.cesn_homeowners_gas_provider["co"]: Refreshing state...
metabase_card.cesn_renters_electric_provider["co"]: Refreshing state...
metabase_card.cesn_renters_electric_provider["cesn"]: Refreshing state...
metabase_card.cesn_renters_electric_provider["il"]: Refreshing state...
metabase_card.cesn_renters_electric_provider["tx"]: Refreshing state...
metabase_card.cesn_renters_electric_provider["co_tax_calculator"]: Refreshing state...
metabase_card.cesn_renters_electric_provider["ma"]: Refreshing state...
metabase_card.tenant_total_non_tax_benefits["co"]: Refreshing state...
metabase_card.cesn_renters_electric_provider["nc"]: Refreshing state...
metabase_card.tenant_total_non_tax_benefits["tx"]: Refreshing state...
metabase_card.cesn_homeowners_electric_provider["tx"]: Refreshing state...
metabase_card.tenant_total_non_tax_benefits["il"]: Refreshing state...
metabase_card.tenant_total_non_tax_benefits["ma"]: Refreshing state...
metabase_card.tenant_total_non_tax_benefits["cesn"]: Refreshing state...
metabase_card.tenant_total_non_tax_benefits["co_tax_calculator"]: Refreshing state...
metabase_card.tenant_total_non_tax_benefits["nc"]: Refreshing state...
metabase_card.tenant_median_monthly_expenses["nc"]: Refreshing state...
metabase_card.cesn_homeowners_electric_provider["cesn"]: Refreshing state...
metabase_card.cesn_homeowners_electric_provider["co"]: Refreshing state...
metabase_card.cesn_homeowners_electric_provider["ma"]: Refreshing state...
metabase_card.cesn_homeowners_electric_provider["nc"]: Refreshing state...
metabase_card.cesn_homeowners_electric_provider["co_tax_calculator"]: Refreshing state...
metabase_card.cesn_homeowners_electric_provider["il"]: Refreshing state...
metabase_card.tenant_median_monthly_expenses["cesn"]: Refreshing state...
metabase_card.tenant_median_monthly_expenses["ma"]: Refreshing state...
metabase_card.tenant_median_monthly_expenses["il"]: Refreshing state...
metabase_card.tenant_median_monthly_expenses["tx"]: Refreshing state...
metabase_card.tenant_median_monthly_expenses["co_tax_calculator"]: Refreshing state...
metabase_card.tenant_median_monthly_expenses["co"]: Refreshing state...
metabase_card.tenant_household_languages["co"]: Refreshing state...
metabase_card.tenant_household_languages["cesn"]: Refreshing state...
metabase_card.tenant_completed_screeners["nc"]: Refreshing state...
metabase_card.tenant_household_languages["nc"]: Refreshing state...
metabase_card.tenant_household_languages["ma"]: Refreshing state...
metabase_card.tenant_completed_screeners["co_tax_calculator"]: Refreshing state...
metabase_card.tenant_completed_screeners["tx"]: Refreshing state...
metabase_card.tenant_completed_screeners["il"]: Refreshing state...
metabase_card.tenant_household_languages["co_tax_calculator"]: Refreshing state...
metabase_card.tenant_household_languages["il"]: Refreshing state...
metabase_card.tenant_completed_screeners["ma"]: Refreshing state...
metabase_card.tenant_completed_screeners["cesn"]: Refreshing state...
metabase_card.tenant_household_languages["tx"]: Refreshing state...
metabase_card.tenant_completed_screeners["co"]: Refreshing state...
metabase_card.tenant_daily_screeners_7d["ma"]: Refreshing state...
metabase_card.tenant_daily_screeners_7d["co"]: Refreshing state...
metabase_card.tenant_daily_screeners_7d["nc"]: Refreshing state...
metabase_card.tenant_daily_screeners_7d["co_tax_calculator"]: Refreshing state...
metabase_card.tenant_daily_screeners_7d["tx"]: Refreshing state...
metabase_card.tenant_daily_screeners_7d["cesn"]: Refreshing state...
metabase_card.tenant_daily_screeners_7d["il"]: Refreshing state...
metabase_card.tenant_household_member_ages["tx"]: Refreshing state...
metabase_card.tenant_household_member_ages["co_tax_calculator"]: Refreshing state...
metabase_card.tenant_household_member_ages["co"]: Refreshing state...
metabase_card.tenant_household_member_ages["ma"]: Refreshing state...
metabase_card.tenant_household_member_ages["il"]: Refreshing state...
metabase_card.tenant_household_member_ages["nc"]: Refreshing state...
metabase_card.tenant_household_member_ages["cesn"]: Refreshing state...
metabase_card.tenant_common_expenses["nc"]: Refreshing state...
metabase_card.tenant_common_expenses["co"]: Refreshing state...
metabase_card.tenant_common_expenses["tx"]: Refreshing state...
metabase_card.tenant_common_expenses["cesn"]: Refreshing state...
metabase_card.tenant_common_expenses["il"]: Refreshing state...
metabase_card.tenant_common_expenses["ma"]: Refreshing state...
metabase_card.tenant_common_expenses["co_tax_calculator"]: Refreshing state...
metabase_card.tenant_median_annual_tax_credits["co"]: Refreshing state...
metabase_card.tenant_median_annual_tax_credits["co_tax_calculator"]: Refreshing state...
metabase_card.tenant_median_annual_tax_credits["nc"]: Refreshing state...
metabase_card.tenant_median_annual_tax_credits["cesn"]: Refreshing state...
metabase_card.tenant_median_annual_tax_credits["tx"]: Refreshing state...
metabase_card.tenant_median_annual_tax_credits["ma"]: Refreshing state...
metabase_card.tenant_median_annual_tax_credits["il"]: Refreshing state...
metabase_card.cesn_needs_hvac["co_tax_calculator"]: Refreshing state...
metabase_card.cesn_needs_hvac["ma"]: Refreshing state...
metabase_card.cesn_needs_hvac["cesn"]: Refreshing state...
metabase_card.cesn_needs_hvac["nc"]: Refreshing state...
metabase_card.cesn_needs_hvac["tx"]: Refreshing state...
metabase_card.cesn_needs_hvac["il"]: Refreshing state...
metabase_card.cesn_needs_hvac["co"]: Refreshing state...
metabase_card.tenant_median_annual_benefits["ma"]: Refreshing state...
metabase_card.tenant_median_annual_benefits["tx"]: Refreshing state...
metabase_card.tenant_median_annual_benefits["nc"]: Refreshing state...
metabase_card.tenant_median_annual_benefits["cesn"]: Refreshing state...
metabase_card.tenant_median_annual_benefits["co_tax_calculator"]: Refreshing state...
metabase_card.tenant_median_annual_benefits["co"]: Refreshing state...
metabase_card.tenant_median_annual_benefits["il"]: Refreshing state...
metabase_card.tenant_median_monthly_benefits["co_tax_calculator"]: Refreshing state...
metabase_card.tenant_median_monthly_benefits["il"]: Refreshing state...
metabase_card.tenant_median_monthly_benefits["tx"]: Refreshing state...
metabase_card.tenant_median_monthly_benefits["nc"]: Refreshing state...
metabase_card.tenant_median_monthly_benefits["cesn"]: Refreshing state...
metabase_card.tenant_median_monthly_benefits["co"]: Refreshing state...
metabase_card.tenant_median_monthly_benefits["ma"]: Refreshing state...
metabase_card.cesn_renters_gas_provider["co_tax_calculator"]: Refreshing state...
metabase_card.cesn_renters_gas_provider["nc"]: Refreshing state...
metabase_card.cesn_renters_gas_provider["tx"]: Refreshing state...
metabase_card.cesn_renters_gas_provider["ma"]: Refreshing state...
metabase_card.cesn_renters_gas_provider["co"]: Refreshing state...
metabase_card.cesn_renters_gas_provider["il"]: Refreshing state...
metabase_card.cesn_renters_gas_provider["cesn"]: Refreshing state...
metabase_card.tenant_already_had_benefits_pct["cesn"]: Refreshing state...
metabase_card.tenant_already_had_benefits_pct["tx"]: Refreshing state...
metabase_card.tenant_already_had_benefits_pct["co"]: Refreshing state...
metabase_card.tenant_already_had_benefits_pct["ma"]: Refreshing state...
metabase_card.tenant_already_had_benefits_pct["nc"]: Refreshing state...
metabase_card.tenant_already_had_benefits_pct["il"]: Refreshing state...
metabase_card.tenant_already_had_benefits_pct["co_tax_calculator"]: Refreshing state...
metabase_card.cesn_homeowners_qualified_pct["co"]: Refreshing state...
metabase_card.cesn_homeowners_qualified_pct["il"]: Refreshing state...
metabase_card.cesn_homeowners_qualified_pct["nc"]: Refreshing state...
metabase_card.cesn_homeowners_qualified_pct["tx"]: Refreshing state...
metabase_card.cesn_homeowners_qualified_pct["ma"]: Refreshing state...
metabase_card.cesn_homeowners_qualified_pct["cesn"]: Refreshing state...
metabase_card.cesn_homeowners_qualified_pct["co_tax_calculator"]: Refreshing state...
metabase_card.cesn_homeowners_past_due["nc"]: Refreshing state...
metabase_card.cesn_homeowners_past_due["tx"]: Refreshing state...
metabase_card.cesn_homeowners_past_due["il"]: Refreshing state...
metabase_card.cesn_homeowners_past_due["cesn"]: Refreshing state...
metabase_card.cesn_homeowners_past_due["co_tax_calculator"]: Refreshing state...
metabase_card.cesn_homeowners_past_due["co"]: Refreshing state...
metabase_card.cesn_homeowners_past_due["ma"]: Refreshing state...
metabase_card.tenant_qualified_benefits_table["co"]: Refreshing state...
metabase_card.tenant_qualified_benefits_table["co_tax_calculator"]: Refreshing state...
metabase_card.tenant_qualified_benefits_table["nc"]: Refreshing state...
metabase_card.tenant_qualified_benefits_table["tx"]: Refreshing state...
metabase_card.tenant_qualified_benefits_table["ma"]: Refreshing state...
metabase_card.tenant_qualified_benefits_table["cesn"]: Refreshing state...
metabase_card.tenant_qualified_benefits_table["il"]: Refreshing state...
metabase_card.cesn_renters_qualified_pct["co_tax_calculator"]: Refreshing state...
metabase_card.cesn_renters_qualified_pct["tx"]: Refreshing state...
metabase_card.cesn_renters_qualified_pct["co"]: Refreshing state...
metabase_card.cesn_renters_qualified_pct["il"]: Refreshing state...
metabase_card.cesn_renters_qualified_pct["nc"]: Refreshing state...
metabase_card.cesn_renters_qualified_pct["ma"]: Refreshing state...
metabase_card.cesn_renters_qualified_pct["cesn"]: Refreshing state...
metabase_card.tenant_top_counties["cesn"]: Refreshing state...
metabase_card.tenant_top_counties["tx"]: Refreshing state...
metabase_card.tenant_top_counties["co"]: Refreshing state...
metabase_card.tenant_top_counties["il"]: Refreshing state...
metabase_card.tenant_top_counties["ma"]: Refreshing state...
metabase_card.tenant_top_counties["nc"]: Refreshing state...
metabase_card.tenant_top_counties["co_tax_calculator"]: Refreshing state...
metabase_card.tenant_qualified_for_benefits_pct["co"]: Refreshing state...
metabase_card.tenant_qualified_for_benefits_pct["ma"]: Refreshing state...
metabase_card.tenant_qualified_for_benefits_pct["nc"]: Refreshing state...
metabase_card.tenant_qualified_for_benefits_pct["tx"]: Refreshing state...
metabase_card.tenant_qualified_for_benefits_pct["co_tax_calculator"]: Refreshing state...
metabase_card.tenant_qualified_for_benefits_pct["il"]: Refreshing state...
metabase_card.tenant_qualified_for_benefits_pct["cesn"]: Refreshing state...
metabase_card.tenant_current_benefits_table["il"]: Refreshing state...
metabase_card.tenant_current_benefits_table["co_tax_calculator"]: Refreshing state...
metabase_card.tenant_current_benefits_table["nc"]: Refreshing state...
metabase_card.tenant_current_benefits_table["ma"]: Refreshing state...
metabase_card.tenant_current_benefits_table["cesn"]: Refreshing state...
metabase_card.tenant_current_benefits_table["tx"]: Refreshing state...
metabase_card.tenant_current_benefits_table["co"]: Refreshing state...
metabase_card.tenant_qualified_for_tax_creds_pct["ma"]: Refreshing state...
metabase_card.tenant_qualified_for_tax_creds_pct["tx"]: Refreshing state...
metabase_card.tenant_qualified_for_tax_creds_pct["co"]: Refreshing state...
metabase_card.tenant_qualified_for_tax_creds_pct["cesn"]: Refreshing state...
metabase_card.tenant_qualified_for_tax_creds_pct["nc"]: Refreshing state...
metabase_card.tenant_qualified_for_tax_creds_pct["il"]: Refreshing state...
metabase_card.tenant_qualified_for_tax_creds_pct["co_tax_calculator"]: Refreshing state...
metabase_card.cesn_homeowners_disconnected["co"]: Refreshing state...
metabase_card.cesn_homeowners_disconnected["ma"]: Refreshing state...
metabase_card.cesn_homeowners_disconnected["cesn"]: Refreshing state...
metabase_card.cesn_homeowners_disconnected["il"]: Refreshing state...
metabase_card.cesn_homeowners_disconnected["nc"]: Refreshing state...
metabase_card.cesn_homeowners_disconnected["tx"]: Refreshing state...
metabase_card.cesn_homeowners_disconnected["co_tax_calculator"]: Refreshing state...
metabase_card.tenant_total_individuals["co_tax_calculator"]: Refreshing state...
metabase_card.tenant_total_individuals["il"]: Refreshing state...
metabase_card.tenant_total_individuals["nc"]: Refreshing state...
metabase_card.tenant_total_individuals["co"]: Refreshing state...
metabase_card.tenant_total_individuals["cesn"]: Refreshing state...
metabase_card.tenant_total_individuals["tx"]: Refreshing state...
metabase_card.tenant_total_individuals["ma"]: Refreshing state...
metabase_card.cesn_renters_old_car["il"]: Refreshing state...
metabase_card.cesn_renters_old_car["cesn"]: Refreshing state...
metabase_card.cesn_renters_old_car["ma"]: Refreshing state...
metabase_card.cesn_renters_old_car["tx"]: Refreshing state...
metabase_card.cesn_renters_old_car["co"]: Refreshing state...
metabase_card.cesn_renters_old_car["co_tax_calculator"]: Refreshing state...
metabase_card.cesn_renters_old_car["nc"]: Refreshing state...
metabase_card.tenant_household_income_distribution["tx"]: Refreshing state...
metabase_card.tenant_household_income_distribution["co"]: Refreshing state...
metabase_card.tenant_household_income_distribution["ma"]: Refreshing state...
metabase_card.tenant_household_income_distribution["cesn"]: Refreshing state...
metabase_card.tenant_household_income_distribution["co_tax_calculator"]: Refreshing state...
metabase_card.tenant_household_income_distribution["il"]: Refreshing state...
metabase_card.tenant_household_income_distribution["nc"]: Refreshing state...
metabase_dashboard.tenant_analytics["ma"]: Refreshing state... [name=Massachusetts Dashboard]
metabase_dashboard.tenant_analytics["tx"]: Refreshing state... [name=Texas Dashboard]
metabase_dashboard.tenant_analytics["co"]: Refreshing state... [name=Colorado Dashboard]
metabase_dashboard.tenant_analytics["cesn"]: Refreshing state... [name=CESN Dashboard]
metabase_dashboard.tenant_analytics["co_tax_calculator"]: Refreshing state... [name=CO Tax Calculator Dashboard]
metabase_dashboard.tenant_analytics["il"]: Refreshing state... [name=Illinois Dashboard]
metabase_dashboard.tenant_analytics["nc"]: Refreshing state... [name=North Carolina Dashboard]

Terraform used the selected providers to generate the following execution
plan. Resource actions are indicated with the following symbols:
  + create
  ~ update in-place

Terraform planned the following actions, but then encountered a problem:

  # metabase_card.cesn_homeowners_completed["wa"] will be created
  + resource "metabase_card" "cesn_homeowners_completed" {
      + id   = (known after apply)
      + json = jsonencode(
            {
              + cache_ttl              = null
              + collection_id          = 273
              + collection_position    = null
              + dataset_query          = {
                  + database = 34
                  + native   = {
                      + query         = "SELECT count(*) AS count FROM analytics.mart_screener_data WHERE is_home_owner = true [[AND {{submission_date}}]] [[AND {{partner}}]] [[AND {{county}}]]"
                      + template-tags = {
                          + county          = {
                              + dimension    = [
                                  + "field",
                                  + 57992,
                                  + null,
                                ]
                              + display-name = "County"
                              + id           = "county_filter"
                              + name         = "county"
                              + type         = "dimension"
                              + widget-type  = "string/="
                            }
                          + partner         = {
                              + dimension    = [
                                  + "field",
                                  + 58029,
                                  + null,
                                ]
                              + display-name = "Partner"
                              + id           = "partner_filter"
                              + name         = "partner"
                              + type         = "dimension"
                              + widget-type  = "string/="
                            }
                          + submission_date = {
                              + dimension    = [
                                  + "field",
                                  + 58032,
                                  + null,
                                ]
                              + display-name = "Submission Date"
                              + id           = "date_range_filter"
                              + name         = "submission_date"
                              + type         = "dimension"
                              + widget-type  = "date/all-options"
                            }
                          + utm_campaign    = {
                              + dimension    = [
                                  + "field",
                                  + 58050,
                                  + null,
                                ]
                              + display-name = "UTM Campaign"
                              + id           = "utm_campaign_filter"
                              + name         = "utm_campaign"
                              + type         = "dimension"
                              + widget-type  = "string/="
                            }
                          + utm_medium      = {
                              + dimension    = [
                                  + "field",
                                  + 58053,
                                  + null,
                                ]
                              + display-name = "UTM Medium"
                              + id           = "utm_medium_filter"
                              + name         = "utm_medium"
                              + type         = "dimension"
                              + widget-type  = "string/="
                            }
                          + utm_source      = {
                              + dimension    = [
                                  + "field",
                                  + 57963,
                                  + null,
                                ]
                              + display-name = "UTM Source"
                              + id           = "utm_source_filter"
                              + name         = "utm_source"
                              + type         = "dimension"
                              + widget-type  = "string/="
                            }
                        }
                    }
                  + type     = "native"
                }
              + description            = null
              + display                = "scalar"
              + name                   = "Homeowners – Completed Screeners"
              + parameter_mappings     = []
              + parameters             = []
              + query_type             = "native"
              + visualization_settings = {
                  + "scalar.field" = "count"
                }
            }
        )
    }

  # metabase_card.cesn_homeowners_daily_screeners["wa"] will be created
  + resource "metabase_card" "cesn_homeowners_daily_screeners" {
      + id   = (known after apply)
      + json = jsonencode(
            {
              + cache_ttl              = null
              + collection_id          = 273
              + collection_position    = null
              + dataset_query          = {
                  + database = 34
                  + native   = {
                      + query         = <<-EOT
                            SELECT submission_date, count(*) AS "Screeners"
                            FROM analytics.mart_screener_data
                            WHERE is_home_owner = true
                              [[AND {{submission_date}}]]
                              [[AND {{partner}}]]
                              [[AND {{county}}]]
                            GROUP BY submission_date ORDER BY submission_date
                        EOT
                      + template-tags = {
                          + county          = {
                              + dimension    = [
                                  + "field",
                                  + 57992,
                                  + null,
                                ]
                              + display-name = "County"
                              + id           = "county_filter"
                              + name         = "county"
                              + type         = "dimension"
                              + widget-type  = "string/="
                            }
                          + partner         = {
                              + dimension    = [
                                  + "field",
                                  + 58029,
                                  + null,
                                ]
                              + display-name = "Partner"
                              + id           = "partner_filter"
                              + name         = "partner"
                              + type         = "dimension"
                              + widget-type  = "string/="
                            }
                          + submission_date = {
                              + default      = "past7days"
                              + dimension    = [
                                  + "field",
                                  + 58032,
                                  + null,
                                ]
                              + display-name = "Submission Date"
                              + id           = "date_range_filter"
                              + name         = "submission_date"
                              + type         = "dimension"
                              + widget-type  = "date/all-options"
                            }
                          + utm_campaign    = {
                              + dimension    = [
                                  + "field",
                                  + 58050,
                                  + null,
                                ]
                              + display-name = "UTM Campaign"
                              + id           = "utm_campaign_filter"
                              + name         = "utm_campaign"
                              + type         = "dimension"
                              + widget-type  = "string/="
                            }
                          + utm_medium      = {
                              + dimension    = [
                                  + "field",
                                  + 58053,
                                  + null,
                                ]
                              + display-name = "UTM Medium"
                              + id           = "utm_medium_filter"
                              + name         = "utm_medium"
                              + type         = "dimension"
                              + widget-type  = "string/="
                            }
                          + utm_source      = {
                              + dimension    = [
                                  + "field",
                                  + 57963,
                                  + null,
                                ]
                              + display-name = "UTM Source"
                              + id           = "utm_source_filter"
                              + name         = "utm_source"
                              + type         = "dimension"
                              + widget-type  = "string/="
                            }
                        }
                    }
                  + type     = "native"
                }
              + description            = null
              + display                = "bar"
              + name                   = "Homeowners – Daily Screeners"
              + parameter_mappings     = []
              + parameters             = []
              + query_type             = "native"
              + visualization_settings = {
                  + "graph.dimensions"        = [
                      + "SUBMISSION_DATE",
                    ]
                  + "graph.metrics"           = [
                      + "Screeners",
                    ]
                  + "graph.show_values"       = true
                  + "graph.x_axis.title_text" = "Date"
                  + "graph.y_axis.title_text" = "Screeners Completed"
                }
            }
        )
    }

  # metabase_card.cesn_homeowners_disconnected["wa"] will be created
  + resource "metabase_card" "cesn_homeowners_disconnected" {
      + id   = (known after apply)
      + json = jsonencode(
            {
              + cache_ttl              = null
              + collection_id          = 273
              + collection_position    = null
              + dataset_query          = {
                  + database = 34
                  + native   = {
                      + query         = <<-EOT
                            SELECT
                              CASE WHEN electricity_is_disconnected THEN 'Yes' ELSE 'No' END AS "Answer",
                              count(*) AS "# of Screeners"
                            FROM analytics.mart_screener_data
                            WHERE is_home_owner = true
                              AND electricity_is_disconnected IS NOT NULL
                              [[AND {{submission_date}}]]
                              [[AND {{partner}}]]
                              [[AND {{county}}]]
                            GROUP BY 1
                            ORDER BY 1
                        EOT
                      + template-tags = {
                          + county          = {
                              + dimension    = [
                                  + "field",
                                  + 57992,
                                  + null,
                                ]
                              + display-name = "County"
                              + id           = "county_filter"
                              + name         = "county"
                              + type         = "dimension"
                              + widget-type  = "string/="
                            }
                          + partner         = {
                              + dimension    = [
                                  + "field",
                                  + 58029,
                                  + null,
                                ]
                              + display-name = "Partner"
                              + id           = "partner_filter"
                              + name         = "partner"
                              + type         = "dimension"
                              + widget-type  = "string/="
                            }
                          + submission_date = {
                              + dimension    = [
                                  + "field",
                                  + 58032,
                                  + null,
                                ]
                              + display-name = "Submission Date"
                              + id           = "date_range_filter"
                              + name         = "submission_date"
                              + type         = "dimension"
                              + widget-type  = "date/all-options"
                            }
                          + utm_campaign    = {
                              + dimension    = [
                                  + "field",
                                  + 58050,
                                  + null,
                                ]
                              + display-name = "UTM Campaign"
                              + id           = "utm_campaign_filter"
                              + name         = "utm_campaign"
                              + type         = "dimension"
                              + widget-type  = "string/="
                            }
                          + utm_medium      = {
                              + dimension    = [
                                  + "field",
                                  + 58053,
                                  + null,
                                ]
                              + display-name = "UTM Medium"
                              + id           = "utm_medium_filter"
                              + name         = "utm_medium"
                              + type         = "dimension"
                              + widget-type  = "string/="
                            }
                          + utm_source      = {
                              + dimension    = [
                                  + "field",
                                  + 57963,
                                  + null,
                                ]
                              + display-name = "UTM Source"
                              + id           = "utm_source_filter"
                              + name         = "utm_source"
                              + type         = "dimension"
                              + widget-type  = "string/="
                            }
                        }
                    }
                  + type     = "native"
                }
              + description            = null
              + display                = "bar"
              + name                   = "Homeowners – Utility Currently Disconnected?"
              + parameter_mappings     = []
              + parameters             = []
              + query_type             = "native"
              + visualization_settings = {
                  + "graph.dimensions"  = [
                      + "Answer",
                    ]
                  + "graph.metrics"     = [
                      + "# of Screeners",
                    ]
                  + "graph.show_values" = true
                  + series_settings     = {
                      + "# of Screeners" = {
                          + color = "#509EE3"
                        }
                    }
                }
            }
        )
    }

  # metabase_card.cesn_homeowners_electric_provider["wa"] will be created
  + resource "metabase_card" "cesn_homeowners_electric_provider" {
      + id   = (known after apply)
      + json = jsonencode(
            {
              + cache_ttl              = null
              + collection_id          = 273
              + collection_position    = null
              + dataset_query          = {
                  + database = 34
                  + native   = {
                      + query         = <<-EOT
                            SELECT
                              COALESCE(electric_provider_name, electric_provider, '(Unknown)') AS "Provider",
                              count(*) AS "# of Screeners"
                            FROM analytics.mart_screener_data
                            WHERE is_home_owner = true
                              AND electric_provider IS NOT NULL
                              [[AND {{submission_date}}]]
                              [[AND {{partner}}]]
                              [[AND {{county}}]]
                            GROUP BY 1
                            ORDER BY 2 DESC
                            LIMIT 20
                        EOT
                      + template-tags = {
                          + county          = {
                              + dimension    = [
                                  + "field",
                                  + 57992,
                                  + null,
                                ]
                              + display-name = "County"
                              + id           = "county_filter"
                              + name         = "county"
                              + type         = "dimension"
                              + widget-type  = "string/="
                            }
                          + partner         = {
                              + dimension    = [
                                  + "field",
                                  + 58029,
                                  + null,
                                ]
                              + display-name = "Partner"
                              + id           = "partner_filter"
                              + name         = "partner"
                              + type         = "dimension"
                              + widget-type  = "string/="
                            }
                          + submission_date = {
                              + dimension    = [
                                  + "field",
                                  + 58032,
                                  + null,
                                ]
                              + display-name = "Submission Date"
                              + id           = "date_range_filter"
                              + name         = "submission_date"
                              + type         = "dimension"
                              + widget-type  = "date/all-options"
                            }
                          + utm_campaign    = {
                              + dimension    = [
                                  + "field",
                                  + 58050,
                                  + null,
                                ]
                              + display-name = "UTM Campaign"
                              + id           = "utm_campaign_filter"
                              + name         = "utm_campaign"
                              + type         = "dimension"
                              + widget-type  = "string/="
                            }
                          + utm_medium      = {
                              + dimension    = [
                                  + "field",
                                  + 58053,
                                  + null,
                                ]
                              + display-name = "UTM Medium"
                              + id           = "utm_medium_filter"
                              + name         = "utm_medium"
                              + type         = "dimension"
                              + widget-type  = "string/="
                            }
                          + utm_source      = {
                              + dimension    = [
                                  + "field",
                                  + 57963,
                                  + null,
                                ]
                              + display-name = "UTM Source"
                              + id           = "utm_source_filter"
                              + name         = "utm_source"
                              + type         = "dimension"

... (truncated — full plan is 411732 bytes)

Pusher: @catonph, Action: pull_request, Environment: production

@catonph catonph merged commit 4b1f6f8 into main Jun 2, 2026
1 of 2 checks passed
catonph added a commit that referenced this pull request Jun 2, 2026
The WA (Washington) tenant Terraform config was merged to main before the
tenant was deploy-ready, causing terraform-apply on main to fail while
provisioning ~51 WA resources. Because Terraform applies all-or-nothing per
run, this blocked ALL main deploys to Metabase — including the benefit-card
perf fix (#101), which is correct but stuck behind the failing apply.

Reverting the WA config restores main to a cleanly-applyable state so #101 and
future changes deploy. WA dashboard work should land via its own branch once the
WA tenant (Metabase DB, permission groups, secrets) is fully set up and the
apply is verified.

Also removes stray .DS_Store files committed with that change.

Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
catonph added a commit that referenced this pull request Jun 2, 2026
…marshal

terraform-apply on main started failing today at metabase_permissions_graph.graph:

  Error: Unexpected error while calling the Metabase API for 'get permissions graph'.
  json: cannot unmarshal object into Go struct field
  PermissionsGraphDatabasePermissions.groups.create-queries

Provider 0.14.1 only modeled `create-queries` as a scalar string, but Metabase
returns it as an OBJECT once a group is granted granular (per-schema/per-table)
create-query permissions via the Admin Permissions UI. So a UI permissions change
(not a repo change) made the provider fail on state refresh, blocking ALL prod
deploys — including the already-merged benefit-card perf fix (#101).

Provider 0.14.2 fixes exactly this (changelog: "Handle create_queries as either a
simple string or a serialized JSON object"). The `~> 0.14` constraint already
allowed it; the lockfile was pinned to 0.14.1. Bumped constraint to
`>= 0.14.2, ~> 0.14` and refreshed the lock for linux_amd64 (CI) + darwin_arm64.

Unblocks deploys; no permissions.tf change needed (the granular UI perms are now
parsed correctly rather than reverted).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
catonph added a commit that referenced this pull request Jun 2, 2026
…block deploys) (#104)

* Revert "wa progress" (46663bd) to unblock prod deploys

The WA (Washington) tenant Terraform config was merged to main before the
tenant was deploy-ready, causing terraform-apply on main to fail while
provisioning ~51 WA resources. Because Terraform applies all-or-nothing per
run, this blocked ALL main deploys to Metabase — including the benefit-card
perf fix (#101), which is correct but stuck behind the failing apply.

Reverting the WA config restores main to a cleanly-applyable state so #101 and
future changes deploy. WA dashboard work should land via its own branch once the
WA tenant (Metabase DB, permission groups, secrets) is fully set up and the
apply is verified.

Also removes stray .DS_Store files committed with that change.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* Bump flovouin/metabase provider to 0.14.2 to fix permissions_graph unmarshal

terraform-apply on main started failing today at metabase_permissions_graph.graph:

  Error: Unexpected error while calling the Metabase API for 'get permissions graph'.
  json: cannot unmarshal object into Go struct field
  PermissionsGraphDatabasePermissions.groups.create-queries

Provider 0.14.1 only modeled `create-queries` as a scalar string, but Metabase
returns it as an OBJECT once a group is granted granular (per-schema/per-table)
create-query permissions via the Admin Permissions UI. So a UI permissions change
(not a repo change) made the provider fail on state refresh, blocking ALL prod
deploys — including the already-merged benefit-card perf fix (#101).

Provider 0.14.2 fixes exactly this (changelog: "Handle create_queries as either a
simple string or a serialized JSON object"). The `~> 0.14` constraint already
allowed it; the lockfile was pinned to 0.14.1. Bumped constraint to
`>= 0.14.2, ~> 0.14` and refreshed the lock for linux_amd64 (CI) + darwin_arm64.

Unblocks deploys; no permissions.tf change needed (the granular UI perms are now
parsed correctly rather than reverted).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant