Commit Graph

21 Commits

Author SHA1 Message Date
Cal Corum
9b30d3dfb2 CLAUDE: Implement Discord OAuth authentication and SBA API integration
## Authentication Implementation

### Backend
- Implemented complete Discord OAuth flow in auth.py:
  * POST /api/auth/discord/callback - Exchange code for tokens
  * POST /api/auth/refresh - Refresh JWT tokens
  * GET /api/auth/me - Get authenticated user info
  * GET /api/auth/verify - Verify auth status
- JWT token creation with 7-day expiration
- Refresh token support for session persistence
- Bearer token authentication for Discord API calls

### Frontend
- Created auth/login.vue - Discord OAuth initiation page
- Created auth/callback.vue - OAuth callback handler with states
- Integrated with existing auth store (already implemented)
- LocalStorage persistence for tokens and user data
- Full error handling and loading states

### Configuration
- Updated backend .env with Discord OAuth credentials
- Updated frontend .env with Discord Client ID
- Fixed redirect URI to port 3001

## SBA API Integration

### Backend
- Extended SbaApiClient with get_teams(season, active_only=True)
- Added bearer token auth support (_get_headers method)
- Created /api/teams route with TeamResponse model
- Registered teams router in main.py
- Filters out IL (Injured List) teams automatically
- Returns team data: id, abbrev, names, color, gmid, division

### Integration
- Connected to production SBA API: https://api.sba.manticorum.com
- Bearer token authentication working
- Successfully fetches ~16 active Season 3 teams

## Documentation
- Created SESSION_NOTES.md - Current session accomplishments
- Created NEXT_SESSION.md - Game creation implementation guide
- Updated implementation/NEXT_SESSION.md

## Testing
-  Discord OAuth flow tested end-to-end
-  User authentication and session persistence verified
-  Teams API returns real data from production
-  All services running and communicating

## What Works Now
- User can sign in with Discord
- Sessions persist across reloads
- Backend fetches real teams from SBA API
- Ready for game creation implementation

## Next Steps
See .claude/NEXT_SESSION.md for detailed game creation implementation plan.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-20 16:54:27 -06:00
Cal Corum
eab61ad966 CLAUDE: Phases 3.5, F1-F5 Complete - Statistics & Frontend Components
This commit captures work from multiple sessions building the statistics
system and frontend component library.

Backend - Phase 3.5: Statistics System
- Box score statistics with materialized views
- Play stat calculator for real-time updates
- Stat view refresher service
- Alembic migration for materialized views
- Test coverage: 41 new tests (all passing)

Frontend - Phase F1: Foundation
- Composables: useGameState, useGameActions, useWebSocket
- Type definitions and interfaces
- Store setup with Pinia

Frontend - Phase F2: Game Display
- ScoreBoard, GameBoard, CurrentSituation, PlayByPlay components
- Demo page at /demo

Frontend - Phase F3: Decision Inputs
- DefensiveSetup, OffensiveApproach, StolenBaseInputs components
- DecisionPanel orchestration
- Demo page at /demo-decisions
- Test coverage: 213 tests passing

Frontend - Phase F4: Dice & Manual Outcome
- DiceRoller component
- ManualOutcomeEntry with validation
- PlayResult display
- GameplayPanel orchestration
- Demo page at /demo-gameplay
- Test coverage: 119 tests passing

Frontend - Phase F5: Substitutions
- PinchHitterSelector, DefensiveReplacementSelector, PitchingChangeSelector
- SubstitutionPanel with tab navigation
- Demo page at /demo-substitutions
- Test coverage: 114 tests passing

Documentation:
- PHASE_3_5_HANDOFF.md - Statistics system handoff
- PHASE_F2_COMPLETE.md - Game display completion
- Frontend phase planning docs
- NEXT_SESSION.md updated for Phase F6

Configuration:
- Package updates (Nuxt 4 fixes)
- Tailwind config enhancements
- Game store updates

Test Status:
- Backend: 731/731 passing (100%)
- Frontend: 446/446 passing (100%)
- Total: 1,177 tests passing

Next Phase: F6 - Integration (wire all components into game page)

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-14 09:52:30 -06:00
Cal Corum
b5677d0c55 CLAUDE: Phase 3.5 Planning - Code Polish & Statistics System
Completed comprehensive planning for Phase 3.5 with focus on production
readiness through materialized views approach for statistics.

Planning Documents Created:
- STAT_SYSTEM_ANALYSIS.md: Analysis of existing major-domo schema
  * Reviewed legacy BattingStat/PitchingStat tables (deprecated)
  * Analyzed existing /plays/batting and /plays/pitching endpoints
  * Evaluated 3 approaches (legacy port, modern, hybrid)

- STAT_SYSTEM_MATERIALIZED_VIEWS.md: Recommended approach
  * PostgreSQL materialized views (following major-domo pattern)
  * Add stat fields to plays table (18 new columns)
  * 3 views: batting_game_stats, pitching_game_stats, game_stats
  * PlayStatCalculator service (~150 lines vs 400+ for StatTracker)
  * 80% less code, single source of truth, always consistent

- phase-3.5-polish-stats.md: Complete implementation plan
  * Task 1: Game Statistics System (materialized views)
  * Task 2: Authorization Framework (WebSocket security)
  * Task 3: Uncapped Hit Decision Trees
  * Task 4: Code Cleanup (remove TODOs, integrate features)
  * Task 5: Integration Test Infrastructure
  * Estimated: 16-24 hours (2-3 days)

NEXT_SESSION.md Updates:
- Phase 3.5 ready to begin (0% → implementation phase)
- Complete task breakdown with acceptance criteria
- Materialized view approach detailed
- Commit strategy for 3 separate commits
- Files to review before starting

Implementation Status Updates:
- Phase 3: 100% Complete (688 tests passing)
- Phase 3F: Substitution system fully tested
- Phase 3.5: Planning complete, ready for implementation
- Updated component status table with Phase 3 completion

Key Decisions:
- Use materialized views (not separate stat tables)
- Add stat fields to plays table
- Refresh views after game completion + on-demand
- Use legacy field names (pa, ab, run, hit) for compatibility
- Skip experimental fields (bphr, xba, etc.) for MVP

Benefits of Materialized Views:
- 80% less code (~400 lines → ~150 lines)
- Single source of truth (plays table)
- Always consistent (stats derived, not tracked)
- Follows existing major-domo pattern
- PostgreSQL optimized (indexed, cached)

Next Steps:
1. Implement PlayStatCalculator (map PlayOutcome → stats)
2. Add stat fields to plays table (migration 004)
3. Create materialized views (migration 005)
4. Create BoxScoreService (query views)
5. Refresh logic after game completion

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-06 16:08:23 -06:00
Cal Corum
efd38d2580 CLAUDE: Phase 3F - Substitution System Testing Complete
Completed final 20% of substitution system with comprehensive test coverage.
All 640 unit tests passing (100%). Phase 3 now 100% complete.

## Unit Tests (31 tests) - NEW

tests/unit/core/test_substitution_rules.py:
- TestPinchHitterValidation: 6 tests
  * Success case
  * NOT_CURRENT_BATTER validation
  * PLAYER_ALREADY_OUT validation
  * NOT_IN_ROSTER validation
  * ALREADY_ACTIVE validation
  * Bench player edge case

- TestDefensiveReplacementValidation: 9 tests
  * Success case
  * Position change allowed
  * PLAYER_ALREADY_OUT validation
  * NOT_IN_ROSTER validation
  * ALREADY_ACTIVE validation
  * INVALID_POSITION validation
  * All valid positions (P, C, 1B-3B, SS, LF-RF, DH)
  * Mid-inning warning logged
  * allow_mid_inning flag works

- TestPitchingChangeValidation: 7 tests
  * Success case (after min batters)
  * PLAYER_ALREADY_OUT validation
  * NOT_A_PITCHER validation
  * MIN_BATTERS_NOT_MET validation
  * force_change bypasses min batters
  * NOT_IN_ROSTER validation
  * ALREADY_ACTIVE validation

- TestDoubleSwitchValidation: 6 tests
  * Success case with batting order swap
  * First substitution invalid
  * Second substitution invalid
  * INVALID_BATTING_ORDER validation
  * DUPLICATE_BATTING_ORDER validation
  * All valid batting order combinations (1-9)

- TestValidationResultDataclass: 3 tests
  * Valid result creation
  * Invalid result with error
  * Result with message only

## Integration Tests (10 tests) - NEW

tests/integration/test_substitution_manager.py:
- TestPinchHitIntegration: 2 tests
  * Full flow: validation → DB → state sync
  * Validation failure (ALREADY_ACTIVE)

- TestDefensiveReplacementIntegration: 2 tests
  * Full flow with DB/state verification
  * Position change (SS → 2B)

- TestPitchingChangeIntegration: 3 tests
  * Full flow with current_pitcher update
  * MIN_BATTERS_NOT_MET validation
  * force_change emergency bypass

- TestSubstitutionStateSync: 3 tests
  * Multiple substitutions stay synced
  * Batting order preserved after substitution
  * State cache matches database

Fixtures:
- game_with_lineups: Creates game with 9 active + 3 bench players
- Proper async session management
- Database cleanup handled

## Bug Fixes

app/core/substitution_rules.py:
- Fixed to use new GameState structure
- Changed: state.current_batter_lineup_id → state.current_batter.lineup_id
- Aligns with Phase 3E GameState refactoring

## Test Results

Unit Tests:
- 640/640 passing (100%)
- 31 new substitution tests
- All edge cases covered
- Execution: 1.02s

Integration Tests:
- 10 tests implemented
- Full DB + state sync verification
- Note: Run individually due to known asyncpg connection issues

## Documentation Updates

.claude/implementation/NEXT_SESSION.md:
- Updated Phase 3 progress to 100% complete
- Marked Task 2 (unit tests) completed
- Marked Task 3 (integration tests) completed
- Updated success criteria with completion notes
- Documented test counts and coverage

## Phase 3 Status: 100% COMPLETE 

- Phase 3A-D (X-Check Core): 100%
- Phase 3E-Prep (GameState Refactor): 100%
- Phase 3E-Main (Position Ratings): 100%
- Phase 3E-Final (Redis/WebSocket): 100%
- Phase 3E Testing (Terminal Client): 100%
- Phase 3F (Substitutions): 100%

All core gameplay features implemented and fully tested.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-04 22:34:17 -06:00
Cal Corum
e147ab17f1 CLAUDE: Phase 3F - Substitution System WebSocket Events
Implemented complete WebSocket integration for real-time player substitutions.
System is now 80% complete - only tests remain.

## WebSocket Events Implemented (600 lines)

### Event Handlers (backend/app/websocket/handlers.py):
1. request_pinch_hitter - Pinch hitter substitution
   - Validates: game_id, player_out_lineup_id, player_in_card_id, team_id
   - Executes: SubstitutionManager.pinch_hit()
   - Broadcasts: player_substituted (all clients), substitution_confirmed (requester)
   - Error codes: MISSING_FIELD, INVALID_FORMAT, NOT_CURRENT_BATTER, etc.

2. request_defensive_replacement - Defensive replacement
   - Additional field: new_position (P, C, 1B, 2B, 3B, SS, LF, CF, RF)
   - Executes: SubstitutionManager.defensive_replace()
   - Same broadcast pattern as pinch hitter

3. request_pitching_change - Pitching change
   - Validates minimum batters faced (handled in SubstitutionManager)
   - Executes: SubstitutionManager.change_pitcher()
   - Broadcasts new pitcher to all clients

4. get_lineup - Get active lineup for team
   - Returns: lineup_data with all active players
   - Uses: StateManager cache (O(1)) or database fallback
   - Purpose: UI refresh after substitutions

### Event Pattern (follows existing handlers):
- Validate inputs (UUID format, required fields, game exists)
- Create SubstitutionManager instance with DatabaseOperations
- Execute substitution (validate → DB → state)
- Broadcast player_substituted to game room
- Send substitution_confirmed to requester
- Error handling with specific error codes

### Events Emitted:
- player_substituted (broadcast) - Includes: type, lineup IDs, position, batting_order
- substitution_confirmed (requester) - Success confirmation with new_lineup_id
- substitution_error (requester) - Validation error with error code
- lineup_data (requester) - Active lineup response
- error (requester) - Generic error

## Documentation Updates (350 lines)

### backend/app/websocket/CLAUDE.md:
- Complete handler documentation with examples
- Event data structures and response formats
- Error code reference (MISSING_FIELD, INVALID_FORMAT, NOT_CURRENT_BATTER, etc.)
- Client integration examples (JavaScript)
- Complete workflow diagrams
- Updated event summary table (+8 events)
- Updated Common Imports section

### .claude/implementation/ updates:
- NEXT_SESSION.md: Marked Task 1 complete, updated to 80% done
- SUBSTITUTION_SYSTEM_SUMMARY.md: Added WebSocket section, updated status
- GAMESTATE_REFACTOR_PLAN.md: Marked complete
- PHASE_3_OVERVIEW.md: Updated all phases to reflect completion
- phase-3e-COMPLETED.md: Created comprehensive completion doc

## Architecture

### DB-First Pattern (maintained):
```
Client Request → WebSocket Handler
    ↓
SubstitutionManager
    ├─ SubstitutionRules.validate_*()
    ├─ DatabaseOperations.create_substitution() (DB first!)
    ├─ StateManager.update_lineup_cache()
    └─ Update GameState if applicable
    ↓
Success Responses
    ├─ player_substituted (broadcast to room)
    └─ substitution_confirmed (to requester)
```

### Error Handling:
- Three-tier: ValidationError, GameValidationError, Exception
- Specific error codes for each failure type
- User-friendly error messages
- Comprehensive logging at each step

## Status Update

**Phase 3F Substitution System**: 80% Complete
-  Core logic (SubstitutionRules, SubstitutionManager) - 1,027 lines
-  Database operations (create_substitution, get_eligible_substitutes)
-  WebSocket events (4 handlers) - 600 lines
-  Documentation (350 lines)
-  Unit tests (20% remaining) - ~300 lines needed
-  Integration tests - ~400 lines needed

**Phase 3 Overall**: ~97% Complete
- Phase 3A-D (X-Check Core): 100%
- Phase 3E (GameState, Ratings, Redis, Testing): 100%
- Phase 3F (Substitutions): 80%

## Files Modified

backend/app/websocket/handlers.py (+600 lines)
backend/app/websocket/CLAUDE.md (+350 lines)
.claude/implementation/NEXT_SESSION.md (updated progress)
.claude/implementation/SUBSTITUTION_SYSTEM_SUMMARY.md (added WebSocket section)
.claude/implementation/GAMESTATE_REFACTOR_PLAN.md (marked complete)
.claude/implementation/PHASE_3_OVERVIEW.md (updated all phases)
.claude/implementation/phase-3e-COMPLETED.md (new file, 400+ lines)

## Next Steps

Remaining work (2-3 hours):
1. Unit tests for SubstitutionRules (~300 lines)
   - 15+ pinch hitter tests
   - 12+ defensive replacement tests
   - 10+ pitching change tests
2. Integration tests for SubstitutionManager (~400 lines)
   - Full DB + state sync flow
   - State recovery verification
   - Error handling and rollback

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-04 21:24:43 -06:00
Cal Corum
5ebbd9ebda CLAUDE: Update project plan for next session - Substitution system completion
Generated comprehensive NEXT_SESSION.md with:
- Complete analysis of Phase 3E-Final and Substitution core logic
- 4 detailed tasks with code examples and acceptance criteria
- Outstanding questions and architecture decisions documented
- 6-7 hour estimate to complete remaining 40%

Next session will complete:
- WebSocket substitution events (2-3 hrs)
- Validation unit tests (2 hrs)
- Manager integration tests (2 hrs)
- API documentation (1 hr)

Phase 3 will be ~99% complete after next session.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-04 00:08:53 -06:00
Cal Corum
7d150183d4 CLAUDE: Update documentation for Phase 3E-Main completion
Updated NEXT_SESSION.md to reflect Phase 3E-Main completion:
- Marked Phase 3E-Main as 100% complete (position ratings integration)
- Overall Phase 3E progress now 90%
- Updated Phase 3 overall progress to ~95%
- Documented all accomplishments and live test results
- Outlined remaining Phase 3E-Final tasks (10%):
  * WebSocket event handlers for X-Check UI
  * Redis caching upgrade from in-memory
  * Full defensive lineup evaluation
  * Manual vs Auto mode workflows

Included comprehensive session handoff:
- Live API test results with player 8807 (7 positions)
- Performance metrics (16,601x cache speedup)
- All files created/modified
- Quick start guide for next session
- Technical architecture notes

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-03 21:40:09 -06:00
Cal Corum
a55b31d7af CLAUDE: Update documentation for Phase 3E-Prep completion
**Documentation Updates**:

NEXT_SESSION.md:
- Updated status: Phase 3 now 85% complete (was 80%)
- Added Phase 3E-Prep section documenting GameState refactor
- Updated current context with new approach
- Added Architecture Decision #6: Unified Player References
- Updated Tasks for Next Session to reflect simplified Phase 3E-Main
- Last commit: d560844
- Date: 2025-11-03

**Key Changes Documented**:
1. GameState refactor complete (all player refs now full objects)
2. Foundation ready for Phase 3E-Main (add position ratings)
3. Simplified approach: just add field, load at game start
4. X-Check resolution gets direct access: state.current_batter.position_rating

**Next Steps**: Phase 3E-Main tasks updated to reflect new architecture

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-03 14:19:07 -06:00
Cal Corum
7417a3f450 Offline catchup 2025-11-03 12:43:54 -06:00
Cal Corum
0b6076d5b8 CLAUDE: Implement Phase 3B - X-Check league config tables
Complete X-Check resolution table system for defensive play outcomes.

Components:
- Defense range tables (20×5) for infield, outfield, catcher
- Error charts for LF/RF and CF (ratings 0-25)
- Placeholder error charts for P, C, 1B, 2B, 3B, SS (awaiting data)
- get_fielders_holding_runners() - Complete implementation
- get_error_chart_for_position() - Maps all 9 positions
- 6 X-Check placeholder advancement functions (g1-g3, f1-f3)

League Config Integration:
- Both SbaConfig and PdConfig include X-Check tables
- Shared common tables via league_configs.py
- Attributes: x_check_defense_tables, x_check_error_charts, x_check_holding_runners

Testing:
- 36 tests for X-Check tables (all passing)
- 9 tests for X-Check placeholders (all passing)
- Total: 45/45 tests passing

Documentation:
- Updated backend/CLAUDE.md with Phase 3B section
- Updated app/config/CLAUDE.md with X-Check tables documentation
- Updated app/core/CLAUDE.md with X-Check placeholder functions
- Updated tests/CLAUDE.md with new test counts (519 unit tests)
- Updated phase-3b-league-config-tables.md (marked complete)
- Updated NEXT_SESSION.md with Phase 3B completion

What's Pending:
- 6 infield error charts need actual data (P, C, 1B, 2B, 3B, SS)
- Phase 3C will implement full X-Check resolution logic

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-01 19:50:55 -05:00
Cal Corum
0b56b89a0b Update NEXT_SESSION.md
Context includes completing week 7 work and planning week 8 work.
2025-11-01 01:17:45 -05:00
Cal Corum
119f169474 CLAUDE: Prepare NEXT_SESSION.md for Week 8
Comprehensive update for next session:

Week 7 Summary (100% Complete):
- All 8 tasks completed with full descriptions
- 126 new tests (all passing)
- 180/181 core tests passing
- Manual testing verified (8/8 scenarios)

Week 8 Preview:
- Task 1: Substitution system (pinch hitters, runners, defensive)
- Task 2: Pitching changes (relief, fatigue, bullpen)
- Task 3: Advanced rules (steals, pickoffs, balks)
- Task 4: Game state persistence (save/load/replay)
- Task 5: Enhanced terminal client

Quick Start Guide:
- Clear entry point for next agent
- Key files and architecture diagrams
- Testing strategy
- Important patterns and conventions

Architectural Reference:
- Outcome-first PlayResolver design
- Auto mode configuration
- Hit location tracking
- Manual vs auto mode flows

Ready for Week 8 implementation!

🎯 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-31 08:37:59 -05:00
Cal Corum
4cf349a2df CLAUDE: Update NEXT_SESSION.md - Week 7 complete at 100%
All 8 tasks complete:
 Task 1: Strategic Decision Integration
 Task 2: Decision Validators (54 tests)
 Task 3: Result Charts + PD Auto Mode (21 tests)
 Task 4: Runner Advancement Logic (30 tests)
 Task 5: Double Play Mechanics
 Task 6: PlayResolver Integration (9 tests)
 Task 7: WebSocket Manual Outcome Handlers (12 tests)
 Task 8: Terminal Client Enhancement

Total: 126 new tests, all passing
Core tests: 180/181 passing (1 pre-existing failure)

Week 8 ready to begin!

🎯 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-31 08:22:13 -05:00
Cal Corum
5b88b11ea0 CLAUDE: Update NEXT_SESSION.md - Tasks 4 & 5 complete, Week 7 at 87%
Updated documentation to reflect completion of runner advancement logic
and double play mechanics:

Status Changes:
- Week 7 progress: 62% → 87% complete
- Tasks complete: 7 of 8 (only Task 6 remaining)
- Test count: 489 → 519 tests passing (94% of target)

Completed Tasks:
- Task 4: Runner advancement logic (30 tests)
  - GroundballResultType IntEnum with 13 result constants
  - Infield Back and Infield In chart implementations
  - Corners In hybrid positioning support
  - DECIDE mechanic foundation
- Task 5: Double play mechanics (integrated into Task 4)
  - Probability-based DP calculation (45% base)
  - Positioning and hit location modifiers
  - Integrated into results 2, 10, and 13

Documentation Updates:
- Added comprehensive Task 4 & 5 completion summary
- Updated "What We Just Completed" with full implementation details
- Resolved outstanding questions (TOOTBLAN/FARTSLAM deprecated)
- Updated Quick Reference with new test counts
- Streamlined "Tasks for Next Session" to focus on Task 6
- Updated commit history and progress metrics

Next Steps:
- Task 6: PlayResolver Integration (final task, 3-4 hours)
- Integrate RunnerAdvancement into play_resolver.py
- Update all existing tests
- Week 7 completion at 100%

Related: #week7 #task4 #task5 #runner-advancement #documentation
2025-10-30 23:38:34 -05:00
Cal Corum
69782f54c9 CLAUDE: Update NEXT_SESSION.md with latest commit hash
🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-30 22:53:19 -05:00
Cal Corum
9cae63ac43 CLAUDE: Implement Week 7 Task 7 - WebSocket manual outcome handlers
Complete manual outcome workflow for SBA and PD manual mode gameplay:

**WebSocket Event Handlers** (app/websocket/handlers.py):
- roll_dice: Server rolls dice, stores in state, broadcasts to players
- submit_manual_outcome: Validates and processes player submissions
- Events: dice_rolled, outcome_accepted, outcome_rejected, play_resolved

**Game Engine Integration** (app/core/game_engine.py):
- resolve_manual_play(): Processes manual outcomes with server dice
- Uses ab_roll for audit trail, player outcome for resolution
- Same orchestration as resolve_play() (save, update, advance inning)

**Data Model** (app/models/game_models.py):
- pending_manual_roll: Stores server dice between roll and submission

**Terminal Client** (terminal_client/):
- roll_dice command: Roll dice and display results
- manual_outcome command: Submit outcomes from physical cards
- Both integrated into REPL for testing

**Tests** (tests/unit/websocket/test_manual_outcome_handlers.py):
- 12 comprehensive tests covering all validation paths
- All tests passing (roll_dice: 4, submit_manual_outcome: 8)

**Key Decisions**:
- Server rolls dice for fairness (not players!)
- One-time roll usage (cleared after submission)
- Early validation (check pending roll before accepting)
- Field-level error messages for clear feedback

**Impact**:
- Complete manual mode workflow ready
- Frontend WebSocket integration supported
- Terminal testing commands available
- Audit trail with server-rolled dice maintained

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-30 22:51:31 -05:00
Cal Corum
16ba30b351 CLAUDE: Update NEXT_SESSION.md with Week 7 Task 3 completion status
Update session planning document to reflect Task 3 completion:
- Result chart abstraction implemented
- PD auto mode with rating-based outcome generation
- Manual outcome submission model for human players
- 21 new tests passing

Week 7 now 50% complete (3 of 7 tasks done).

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-30 15:30:50 -05:00
Cal Corum
f07d8ca043 CLAUDE: Update NEXT_SESSION.md - Task 2 complete
- Updated current status to 33% complete (2 of 6 tasks done)
- Added comprehensive Task 2 completion details
- Updated success criteria to show 24/85 new tests passing
- Set next task to Task 3: Complete Result Charts - Part A
2025-10-30 06:43:13 -05:00
Cal Corum
0a21edad5c CLAUDE: Update project plan for Week 7 continuation
Project Plan Updates:
- Updated NEXT_SESSION.md with comprehensive Week 7 status
- Current status: Phase 3 Week 7 at 17% complete (1 of 6 tasks done)
- Documented Task 1 completion (Strategic Decision Integration)
- Created detailed task breakdown for Tasks 2-7
- Added architectural decision documentation
- Included outstanding questions and verification steps

Session Accomplishments:
- Task 1: Strategic Decision Integration (100% complete)
  - GameState: Added decision phase tracking and AI helper methods
  - StateManager: Implemented asyncio.Future decision queue
  - GameEngine: Added await_defensive/offensive_decision methods
  - AI Opponent: Created stub with default decisions
- Bonus: Manual outcome testing feature for terminal client
- Planning: Complete Week 7 plan document (25 pages)

Next Session Tasks:
1. Task 2: Decision Validators (3-4h)
2. Task 3: Result Charts Part A (4-5h)
3. Task 4: Result Charts Part B (4-5h)
4. Task 5: Double Play Mechanics (2-3h)
5. Task 6: WebSocket Handlers (3-4h)
6. Task 7: Terminal Client Enhancement (2-3h)

Slash Commands:
- Added save-project-plan.md command definition

Test Status: 200/201 passing
Target: 285+ after Week 7 complete

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-30 01:24:51 -05:00
Cal Corum
6880b6d5ad CLAUDE: Complete Week 6 - granular PlayOutcome integration and metadata support
- Renamed check_d20 → chaos_d20 throughout dice system
- Expanded PlayOutcome enum with granular variants (SINGLE_1/2, DOUBLE_2/3, GROUNDBALL_A/B/C, etc.)
- Integrated PlayOutcome from app.config into PlayResolver
- Added play_metadata support for uncapped hit tracking
- Updated all tests (139/140 passing)

Week 6: 100% Complete - Ready for Phase 3

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-29 20:29:06 -05:00
Cal Corum
64aa800672 CLAUDE: Update implementation plans for next session
Updated week 6 status and created comprehensive next session plan.

## Changes

### Implementation Status Updates
- Updated 00-index.md with Week 6 progress (75% complete)
- Updated 02-week6-league-features.md status and goals
- Added new components to status table:
  - League Configs:  Complete
  - PlayOutcome Enum:  Complete
  - PlayResolver Integration: 🟡 Partial

### Next Session Plan (NEW)
Created NEXT_SESSION.md with detailed task breakdown:

**Task 1: Update Dice System** (30 min)
- Rename check_d20 → chaos_d20
- Update docstrings for chaos die purpose
- Update all references

**Task 2: Integrate PlayOutcome** (60 min)
- Replace old local enum with universal enum
- Update SimplifiedResultChart
- Add uncapped hit handling
- Update all outcome references

**Task 3: Add Play.metadata** (30 min)
- Add JSONB metadata field to Play model
- Log uncapped hits in metadata
- Update game_engine._save_play_to_db()

## Quick Context for Next Session

**What's Complete**: Config system, PlayOutcome enum, 58 tests passing
**What's Remaining**: Dice system update, PlayResolver integration, metadata support
**Estimated Time**: 2 hours
**Success Criteria**: All tests passing, uncapped hits tracked, terminal client works

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-28 22:58:56 -05:00