Add `asset_bucket_ban_set` and `asset_bucket_assignments` kwargs to
AlphaAssetSelector.__init__ (both default None → BLUE unchanged).
When active, assets whose KMeans bucket is in the ban set are skipped
inside rank_assets() so the next-ranked asset takes the slot — capital
is preserved rather than wasted by a 0× sizer multiplier.
Plan ref: Task 9 — ban ≠ 0× is the critical caveat from the sprint plan.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>