dashboard(7): consolidate xmin horizon panels — merge blockers row into overview
## Summary On Dashboard 7 (`07. Autovacuum and xmin horizon`), the xmin horizon information is currently split into two separate row sections: 1. **xmin horizon overview (experimental)** — contains 1 panel: - *xmin horizon age by source* 2. **xmin horizon blockers (experimental)** — contains 2 panels: - *Longest non-idle transaction age, > 1 min* - *Current blocker counts* These two sections cover the same operator question — *"who is holding xmin horizon back?"* — and reading the dashboard top-to-bottom requires jumping over a redundant section header. The blockers panels are direct context for the overview chart and should sit underneath it. ## Proposed change Merge the two **xmin horizon blockers (experimental)** panels into the **xmin horizon overview (experimental)** section by deleting the separate `xmin horizon blockers` row header and stacking its two panels directly under *xmin horizon age by source*. Resulting Dashboard 7 sections: 1. Wraparound risk — top-N tables (drill down to specific tables) 2. **xmin horizon overview (experimental)** — `xmin horizon age by source`, `Longest non-idle transaction age, > 1 min`, `Current blocker counts` 3. Autovacuum mechanics No metric, query, or panel-content changes — purely a layout consolidation. ## Files - `config/grafana/dashboards/Dashboard_7_Autovacuum_and_xmin_horizon.json` ## Acceptance criteria - The `xmin horizon blockers (experimental)` row is removed from Dashboard 7. - The two panels (`Longest non-idle transaction age, > 1 min`, `Current blocker counts`) appear directly under `xmin horizon age by source` inside the `xmin horizon overview (experimental)` row. - Panel queries, descriptions, units, and IDs are unchanged. - `gridPos.y` values are recomputed so panel ordering is preserved and there is no visual gap. - Dashboard JSON validates (`jq empty …`) and existing tests pass: - `python3 -m pytest tests/xmin_horizon/test_metrics_sql_static.py -q` - `bun test cli/test/config-consistency.test.ts`
issue