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