662ccecb26
build_viz.py was resolving officials to counties without the place→county crosswalk, so only FL's 67 counties had rosters. Factor the resolver out of build.py into a shared build.place_resolver() and use it in both, so the Board and the tree agree by construction. - scripts/build.py — extract place_resolver(); main() now calls it (tree output byte-identical, refactor is behavior-preserving) - scripts/build_viz.py — resolve via the shared resolver - viz/county_data.json, viz/county_detail.json — regenerated County drill-downs: 67 → 1049 counties with rosters; officials mapped 5184/5226 (42 county-unresolvable, tree-only). Deterministic. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>