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>
This commit is contained in:
parent
5d5c13f2b8
commit
64aa800672
@ -68,15 +68,18 @@
|
|||||||
| Frontend Foundation | 🔲 Not Started | 1 | Nuxt 3 apps pending |
|
| Frontend Foundation | 🔲 Not Started | 1 | Nuxt 3 apps pending |
|
||||||
| Discord OAuth | 🔲 Not Started | 1 | Auth system pending |
|
| Discord OAuth | 🔲 Not Started | 1 | Auth system pending |
|
||||||
| WebSocket Server | 🟡 Partial | 1 | Connection manager exists, handlers pending |
|
| WebSocket Server | 🟡 Partial | 1 | Connection manager exists, handlers pending |
|
||||||
| Game Engine Core | ✅ Complete | 2 | GameEngine with forward-looking snapshots, missing some tests |
|
| Game Engine Core | ✅ Complete | 2 | GameEngine with forward-looking snapshots |
|
||||||
| Database Schema | ✅ Complete | 2 | All tables created, polymorphic models working |
|
| Database Schema | ✅ Complete | 2 | All tables created, polymorphic models working |
|
||||||
| Player Models | ✅ Complete | 2 | Polymorphic Lineup & RosterLink for PD/SBA |
|
| Player Models | ✅ Complete | 2 | BasePlayer, SbaPlayer, PdPlayer with ratings |
|
||||||
|
| League Configs | ✅ Complete | 2 | SbaConfig, PdConfig with immutable settings (Week 6) |
|
||||||
|
| PlayOutcome Enum | ✅ Complete | 2 | Universal enum for both leagues (Week 6) |
|
||||||
|
| PlayResolver Integration | 🟡 Partial | 2 | Needs PlayOutcome migration (Week 6 - 75% done) |
|
||||||
| Strategic Decisions | 🔲 Not Started | 3 | Basic framework exists in decisions models |
|
| Strategic Decisions | 🔲 Not Started | 3 | Basic framework exists in decisions models |
|
||||||
| Substitutions | 🔲 Not Started | 3 | Lineup model supports, logic pending |
|
| Substitutions | 🔲 Not Started | 3 | Lineup model supports, logic pending |
|
||||||
| AI Opponent | 🔲 Not Started | 3 | - |
|
| AI Opponent | 🔲 Not Started | 3 | - |
|
||||||
| Spectator Mode | 🔲 Not Started | 4 | - |
|
| Spectator Mode | 🔲 Not Started | 4 | - |
|
||||||
| UI Polish | 🔲 Not Started | 4 | - |
|
| UI Polish | 🔲 Not Started | 4 | - |
|
||||||
| Testing Suite | 🟡 Partial | 5 | Unit tests for dice/state, integration tests missing |
|
| Testing Suite | 🟡 Partial | 5 | 58 config tests + existing core/state tests |
|
||||||
| Deployment | 🔲 Not Started | 5 | - |
|
| Deployment | 🔲 Not Started | 5 | - |
|
||||||
|
|
||||||
## Quick Start
|
## Quick Start
|
||||||
@ -160,9 +163,16 @@ Track important decisions and open questions here as implementation progresses.
|
|||||||
- **2025-10-22**: Week 4 complete - State management and persistence working
|
- **2025-10-22**: Week 4 complete - State management and persistence working
|
||||||
- **2025-10-24**: Week 5 complete - Game engine core with AbRoll dice system
|
- **2025-10-24**: Week 5 complete - Game engine core with AbRoll dice system
|
||||||
- **2025-10-25**: GameEngine refactored to forward-looking play tracking pattern
|
- **2025-10-25**: GameEngine refactored to forward-looking play tracking pattern
|
||||||
|
- **2025-10-28**: Week 6 - 75% complete - Config system and PlayOutcome enum implemented
|
||||||
|
- Both SBA and PD use same card-based resolution mechanics
|
||||||
|
- Universal PlayOutcome enum with helper methods
|
||||||
|
- Immutable league configs with singleton registry
|
||||||
|
- 58 config tests, all passing
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
**Last Updated**: 2025-10-25
|
**Last Updated**: 2025-10-28
|
||||||
**Phase**: Phase 2 - Week 5 Complete (Game Logic)
|
**Phase**: Phase 2 - Week 6 (75% Complete)
|
||||||
**Next Milestone**: Phase 2 - Week 6 (League Features & Integration) OR Phase 3 (Complete Game Features)
|
**Current Work**: League configuration and play outcome system
|
||||||
|
**Next Session**: Complete Week 6 - dice system update and PlayResolver integration
|
||||||
|
**Next Milestone**: Phase 3 (Complete Game Features) after Week 6 finished
|
||||||
|
|||||||
@ -3,7 +3,9 @@
|
|||||||
**Duration**: Week 6 of Phase 2
|
**Duration**: Week 6 of Phase 2
|
||||||
**Prerequisites**: Week 5 Complete (Game engine working)
|
**Prerequisites**: Week 5 Complete (Game engine working)
|
||||||
**Focus**: League-specific features, configurations, and API integration
|
**Focus**: League-specific features, configurations, and API integration
|
||||||
**Status**: Planning Complete (2025-10-25)
|
**Status**: 75% Complete (2025-10-28)
|
||||||
|
**Last Session**: Config system and PlayOutcome implemented
|
||||||
|
**Next Session**: Dice system update and PlayResolver integration
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
@ -34,12 +36,13 @@ Complete Phase 2 by implementing:
|
|||||||
## Goals
|
## Goals
|
||||||
|
|
||||||
By end of Week 6:
|
By end of Week 6:
|
||||||
- ✅ Player models (API + Game layers) - **See separate docs**
|
- ✅ Player models (polymorphic with factory methods) - **COMPLETE 2025-10-28**
|
||||||
- ✅ League configuration framework (BaseConfig → SbaConfig/PdConfig)
|
- ✅ League configuration framework (BaseConfig → SbaConfig/PdConfig) - **COMPLETE 2025-10-28**
|
||||||
- ✅ Result chart system for both leagues
|
- ✅ PlayOutcome enum (universal for both leagues) - **COMPLETE 2025-10-28**
|
||||||
- ✅ PlayResolver updated to use configs and PD ratings
|
- ⏳ Dice system update (check_d20 → chaos_d20) - **PENDING**
|
||||||
- ✅ Complete end-to-end at-bat for both SBA and PD
|
- ⏳ PlayResolver updated to use PlayOutcome and configs - **PENDING**
|
||||||
- ✅ Full test coverage
|
- ⏳ Play.metadata support for uncapped hits - **PENDING**
|
||||||
|
- ⏳ Full test coverage for integration - **PENDING**
|
||||||
|
|
||||||
## Architecture
|
## Architecture
|
||||||
|
|
||||||
|
|||||||
234
.claude/implementation/NEXT_SESSION.md
Normal file
234
.claude/implementation/NEXT_SESSION.md
Normal file
@ -0,0 +1,234 @@
|
|||||||
|
# Next Session Plan - Week 6 Completion
|
||||||
|
|
||||||
|
**Current Status**: Week 6 - 75% Complete
|
||||||
|
**Last Commit**: `5d5c13f` - "CLAUDE: Implement Week 6 league configuration and play outcome systems"
|
||||||
|
**Date**: 2025-10-28
|
||||||
|
**Remaining Work**: 25% (3 tasks)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Quick Context
|
||||||
|
|
||||||
|
### What We Just Completed ✅
|
||||||
|
|
||||||
|
1. **League Configuration System**
|
||||||
|
- `app/config/base_config.py` - Abstract base
|
||||||
|
- `app/config/league_configs.py` - SBA and PD configs
|
||||||
|
- Immutable configs with singleton registry
|
||||||
|
- 28 tests passing
|
||||||
|
|
||||||
|
2. **PlayOutcome Enum**
|
||||||
|
- `app/config/result_charts.py` - Universal outcome enum
|
||||||
|
- Helper methods: `is_hit()`, `is_out()`, `is_uncapped()`, etc.
|
||||||
|
- Supports standard hits, uncapped hits, interrupt plays
|
||||||
|
- 30 tests passing
|
||||||
|
|
||||||
|
3. **Player Model Refinements**
|
||||||
|
- Fixed PdPlayer.id field mapping
|
||||||
|
- Improved docstrings for image fields
|
||||||
|
- Fixed position checking in SBA helpers
|
||||||
|
|
||||||
|
### Key Architecture Decisions Made
|
||||||
|
|
||||||
|
1. **Card-Based Resolution** (Both SBA and PD):
|
||||||
|
- 1d6 (column: 1-3 batter, 4-6 pitcher)
|
||||||
|
- 2d6 (row: 2-12 on card)
|
||||||
|
- 1d20 (split resolution)
|
||||||
|
- Outcome = PlayOutcome enum value
|
||||||
|
|
||||||
|
2. **League Differences**:
|
||||||
|
- **PD**: Card data digitized (can auto-resolve)
|
||||||
|
- **SBA**: Physical cards (manual entry only)
|
||||||
|
|
||||||
|
3. **Uncapped Hits**:
|
||||||
|
- `PlayOutcome.SINGLE_UNCAPPED` / `DOUBLE_UNCAPPED`
|
||||||
|
- Only on pitching cards
|
||||||
|
- Triggers advancement decision tree when `on_base_code > 0`
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Tasks for Next Session
|
||||||
|
|
||||||
|
### Task 1: Update Dice System (30 min)
|
||||||
|
|
||||||
|
**File**: `backend/app/core/dice.py`
|
||||||
|
|
||||||
|
**Changes**:
|
||||||
|
1. Rename `check_d20` → `chaos_d20` in `AbRoll` dataclass
|
||||||
|
2. Update docstring to explain chaos die purpose:
|
||||||
|
- 5% chance (roll 1) = check wild pitch
|
||||||
|
- 5% chance (roll 2) = check passed ball
|
||||||
|
3. Update `DiceSystem.roll_ab()` to use `chaos_d20`
|
||||||
|
|
||||||
|
**Files to Update**:
|
||||||
|
- `app/core/dice.py` - Rename field
|
||||||
|
- `app/core/roll_types.py` - Update AbRoll dataclass
|
||||||
|
- `app/core/play_resolver.py` - Use `chaos_d20` instead of `check_d20`
|
||||||
|
- `tests/unit/core/test_dice.py` - Update test assertions
|
||||||
|
|
||||||
|
**Test**: Run `pytest tests/unit/core/test_dice.py -v`
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### Task 2: Integrate PlayOutcome into PlayResolver (60 min)
|
||||||
|
|
||||||
|
**File**: `backend/app/core/play_resolver.py`
|
||||||
|
|
||||||
|
**Changes**:
|
||||||
|
|
||||||
|
1. **Import new PlayOutcome**:
|
||||||
|
```python
|
||||||
|
from app.config import PlayOutcome # Replace old enum
|
||||||
|
```
|
||||||
|
|
||||||
|
2. **Remove old PlayOutcome enum** (lines 22-43):
|
||||||
|
- Delete the old local enum definition
|
||||||
|
- Now using universal enum from `app.config`
|
||||||
|
|
||||||
|
3. **Update SimplifiedResultChart**:
|
||||||
|
- Return `PlayOutcome` values (new enum)
|
||||||
|
- Keep simplified for now (full card resolution in Phase 3)
|
||||||
|
|
||||||
|
4. **Add uncapped hit handling**:
|
||||||
|
```python
|
||||||
|
def _resolve_outcome(self, outcome: PlayOutcome, state: GameState, ab_roll: AbRoll):
|
||||||
|
# ... existing code ...
|
||||||
|
|
||||||
|
# Handle uncapped hits
|
||||||
|
if outcome == PlayOutcome.SINGLE_UNCAPPED:
|
||||||
|
# Log in metadata (Task 3)
|
||||||
|
# For now, treat as normal single
|
||||||
|
return self._resolve_single(state, ab_roll, uncapped=True)
|
||||||
|
```
|
||||||
|
|
||||||
|
5. **Update all outcome references**:
|
||||||
|
- `PlayOutcome.STRIKEOUT` (capital O)
|
||||||
|
- `PlayOutcome.SINGLE` (not lowercase)
|
||||||
|
- etc.
|
||||||
|
|
||||||
|
**Test**: Run `pytest tests/unit/core/test_play_resolver.py -v`
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### Task 3: Add Play.metadata Support (30 min)
|
||||||
|
|
||||||
|
**Files**:
|
||||||
|
- `backend/app/models/db_models.py`
|
||||||
|
- `backend/app/database/operations.py`
|
||||||
|
- `backend/app/core/game_engine.py`
|
||||||
|
|
||||||
|
**Changes**:
|
||||||
|
|
||||||
|
1. **Check if Play model already has metadata field**:
|
||||||
|
```bash
|
||||||
|
grep -n "metadata" backend/app/models/db_models.py
|
||||||
|
```
|
||||||
|
|
||||||
|
2. **If missing, add to Play model**:
|
||||||
|
```python
|
||||||
|
from sqlalchemy.dialects.postgresql import JSONB
|
||||||
|
|
||||||
|
class Play(Base):
|
||||||
|
# ... existing fields ...
|
||||||
|
metadata = Column(JSONB, default=dict) # Add this
|
||||||
|
```
|
||||||
|
|
||||||
|
3. **Update `game_engine._save_play_to_db()`**:
|
||||||
|
```python
|
||||||
|
play_data = {
|
||||||
|
# ... existing fields ...
|
||||||
|
"metadata": {} # Add empty dict by default
|
||||||
|
}
|
||||||
|
|
||||||
|
# If uncapped hit
|
||||||
|
if result.outcome in [PlayOutcome.SINGLE_UNCAPPED, PlayOutcome.DOUBLE_UNCAPPED]:
|
||||||
|
play_data["metadata"] = {"uncapped": True}
|
||||||
|
```
|
||||||
|
|
||||||
|
4. **Update database operations**:
|
||||||
|
- `save_play()` to handle metadata field
|
||||||
|
- Ensure JSONB column works with SQLAlchemy
|
||||||
|
|
||||||
|
**Test**:
|
||||||
|
```bash
|
||||||
|
pytest tests/integration/test_game_engine.py::test_play_persistence -v
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Verification Steps
|
||||||
|
|
||||||
|
After completing all 3 tasks:
|
||||||
|
|
||||||
|
1. **Run all tests**:
|
||||||
|
```bash
|
||||||
|
pytest tests/unit/config/ -v
|
||||||
|
pytest tests/unit/core/ -v
|
||||||
|
pytest tests/integration/ -v
|
||||||
|
```
|
||||||
|
|
||||||
|
2. **Test with terminal client**:
|
||||||
|
```bash
|
||||||
|
python -m terminal_client
|
||||||
|
> new_game
|
||||||
|
> defensive normal
|
||||||
|
> offensive normal
|
||||||
|
> resolve
|
||||||
|
```
|
||||||
|
|
||||||
|
3. **Check database**:
|
||||||
|
```sql
|
||||||
|
SELECT id, outcome, metadata FROM plays LIMIT 5;
|
||||||
|
```
|
||||||
|
|
||||||
|
4. **Commit**:
|
||||||
|
```bash
|
||||||
|
git add backend/
|
||||||
|
git commit -m "CLAUDE: Complete Week 6 - integrate PlayOutcome and add metadata support"
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Files to Review Before Starting
|
||||||
|
|
||||||
|
1. `backend/app/core/dice.py:45-65` - AbRoll dataclass
|
||||||
|
2. `backend/app/core/play_resolver.py:22-43` - Old PlayOutcome enum (delete)
|
||||||
|
3. `backend/app/core/play_resolver.py:119-367` - PlayResolver class
|
||||||
|
4. `backend/app/models/db_models.py` - Play model (check for metadata)
|
||||||
|
5. `backend/app/core/game_engine.py:520-580` - `_save_play_to_db()` method
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Success Criteria
|
||||||
|
|
||||||
|
Week 6 will be **100% complete** when:
|
||||||
|
|
||||||
|
- ✅ All tests passing (58 config + existing core tests)
|
||||||
|
- ✅ PlayOutcome enum used throughout PlayResolver
|
||||||
|
- ✅ Chaos die properly named and documented
|
||||||
|
- ✅ Uncapped hits logged with metadata
|
||||||
|
- ✅ Terminal client works with new system
|
||||||
|
- ✅ Documentation updated
|
||||||
|
- ✅ Git commit created
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Quick Reference
|
||||||
|
|
||||||
|
**Current Test Count**: 58 tests (config), ~100+ total
|
||||||
|
**Last Test Run**: All passing (2025-10-28)
|
||||||
|
**Branch**: `implement-phase-2`
|
||||||
|
**Python**: 3.13.3
|
||||||
|
**Virtual Env**: `backend/venv/`
|
||||||
|
|
||||||
|
**Key Imports for Next Session**:
|
||||||
|
```python
|
||||||
|
from app.config import get_league_config, PlayOutcome
|
||||||
|
from app.core.dice import AbRoll
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
**Estimated Time**: 2 hours
|
||||||
|
**Priority**: Medium (completes Week 6 foundation)
|
||||||
|
**Blocking**: No (can proceed to Phase 3 after, or do in parallel)
|
||||||
Loading…
Reference in New Issue
Block a user