Convert all `from x import *` to explicit imports in 12 files, resolving
925 F403/F405 ruff violations. Each name traced to its canonical source
module. Also fixes: duplicate Session import (players.py), missing
sample_team_data fixture param, duplicate method name paperdex_cardset_slash,
unused commands import in package __init__ files, and Play type hint in
play_lock.py.
3 pre-existing code bugs remain (F811 duplicate test names, F821 undefined
`question` variable) — these need investigation, not mechanical fixes.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Run Black formatter across 83 files and fix 1514 ruff violations:
- E722: bare except → typed exceptions (17 fixes)
- E711/E712/E721: comparison style fixes with noqa for SQLAlchemy (44 fixes)
- F841: unused variable assignments (70 fixes)
- F541/F401: f-string and import cleanup (1383 auto-fixes)
Remaining 925 errors are all F403/F405 (star imports) — structural,
requires converting to explicit imports in a separate effort.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
The database API only has GET/POST/DELETE for scout_opportunities.
The expires_at update is non-critical — the view timeout controls
the actual scout window.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
The API returns opener_team as a full nested object, not an ID.
No need to fetch it separately.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Adds /resend_scout slash command to manually re-post a scout opportunity
with a custom timeout window. Updates the scout_opportunity's expires_at
in the database before posting. Also adds ruff pre-commit hook for
staged Python files.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>