strat-gameplay-webapp/.claude/implementation/NEXT_SESSION.md
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

16 KiB

Next Session Plan - Phase 3 Gateway

Current Status: Phase 2 - Week 6 Complete (100%) Last Commit: Not yet committed - "CLAUDE: Complete Week 6 - granular PlayOutcome integration and metadata support" Date: 2025-10-29 Next Milestone: Phase 3 - Complete Game Features


Quick Start for Next AI Agent

🎯 Where to Begin

  1. First: Commit the completed Week 6 work (see Verification Steps below)
  2. Then: Read Phase 3 plan at @.claude/implementation/03-gameplay-features.md
  3. Review: Test with terminal client to verify all systems working
  4. Start: Phase 3 planning - strategic decisions and full result charts

📍 Current Context

Week 6 is 100% complete! We've successfully integrated the granular PlayOutcome enum system throughout the codebase, updated the dice system with the chaos_d20 naming, and added metadata support for uncapped hits. The game engine now has a solid foundation for Phase 3's advanced features including full card-based resolution, strategic decisions, and uncapped hit decision trees.


What We Just Completed

1. Dice System Update - chaos_d20 Rename

  • app/core/roll_types.py - Renamed check_d20chaos_d20 in AbRoll dataclass
  • app/core/dice.py - Updated DiceSystem.roll_ab() to use chaos_d20
  • app/core/play_resolver.py - Updated SimplifiedResultChart to reference chaos_d20
  • Updated docstrings: "chaos die (1=WP check, 2=PB check, 3+=normal)"
  • Cleaned up string output: Only displays resolution_d20, not chaos_d20
  • Tests: 34/35 dice tests passing (1 pre-existing timing issue)
  • Tests: 27/27 roll_types tests passing

2. PlayOutcome Enum - Granular Variants

  • app/config/result_charts.py - Expanded PlayOutcome with granular variants:
    • Groundballs: GROUNDBALL_A (DP opportunity), GROUNDBALL_B, GROUNDBALL_C
    • Flyouts: FLYOUT_A, FLYOUT_B, FLYOUT_C
    • Singles: SINGLE_1 (standard), SINGLE_2 (enhanced), SINGLE_UNCAPPED
    • Doubles: DOUBLE_2 (to 2nd), DOUBLE_3 (to 3rd), DOUBLE_UNCAPPED
  • Removed old enums: GROUNDOUT, FLYOUT, DOUBLE_PLAY, SINGLE, DOUBLE
  • Updated helper methods: is_hit(), is_out(), is_extra_base_hit(), get_bases_advanced()
  • Tests: 30/30 config tests passing

3. PlayResolver Integration

  • app/core/play_resolver.py - Removed local PlayOutcome enum, imported from app.config
  • Updated SimplifiedResultChart.get_outcome() with new roll distribution:
    • Rolls 6-8: GROUNDBALL_A/B/C
    • Rolls 9-11: FLYOUT_A/B/C
    • Rolls 12-13: WALK
    • Rolls 14-15: SINGLE_1/2
    • Rolls 16-17: DOUBLE_2/3
    • Roll 18: LINEOUT
    • Roll 19: TRIPLE
    • Roll 20: HOMERUN
  • Added handlers for all new outcome variants in _resolve_outcome()
  • SINGLE_UNCAPPED → treated as SINGLE_1 (TODO Phase 3: decision tree)
  • DOUBLE_UNCAPPED → treated as DOUBLE_2 (TODO Phase 3: decision tree)
  • GROUNDBALL_A → includes TODO for double play logic (Phase 3)
  • Tests: 19/19 play resolver tests passing

4. Play.metadata Support

  • app/core/game_engine.py - Added metadata tracking in _save_play_to_db():
    play_metadata = {}
    if result.outcome in [PlayOutcome.SINGLE_UNCAPPED, PlayOutcome.DOUBLE_UNCAPPED]:
        play_metadata["uncapped"] = True
        play_metadata["outcome_type"] = result.outcome.value
    play_data["play_metadata"] = play_metadata
    
  • Verified Play model already has play_metadata field (JSON, default=dict)
  • Ready for Phase 3 runner advancement decision tracking
  • Tests: All core tests passing

5. Config Import Compatibility

  • app/config/__init__.py - Added backward compatibility for Settings/get_settings
  • Allows imports from both app.config package and app.config.py module
  • No breaking changes to existing code

Key Architecture Decisions Made

1. Granular Outcome Variants

Decision: Break SINGLE into SINGLE_1/2/UNCAPPED, DOUBLE into DOUBLE_2/3/UNCAPPED, etc.

Rationale:

  • Different advancement rules per variant (e.g., DOUBLE_3 = batter to 3rd instead of 2nd)
  • Groundball variants for future DP logic (GROUNDBALL_A checks for DP opportunity)
  • Flyout variants for different trajectories/depths
  • Uncapped variants clearly distinguished for metadata tracking

Impact:

  • More detailed outcome tracking in database
  • Easier to implement Phase 3 advancement decisions
  • Play-by-play logs more descriptive

2. Chaos Die Naming

Decision: Rename check_d20chaos_d20

Rationale:

  • More descriptive of its purpose (5% chance chaos events)
  • Distinguishes from resolution_d20 (split resolution)
  • Clearer intent in code and logs

Impact:

  • More understandable codebase
  • Better self-documenting code
  • Clearer for future contributors

3. Metadata for Uncapped Hits

Decision: Use play_metadata JSON field for uncapped hit tracking

Rationale:

  • Flexible schema for Phase 3 decision tree data
  • No database migrations needed
  • Easy to query and filter uncapped plays

Impact:

  • Ready for Phase 3 runner advancement tracking
  • Can store complex decision data without schema changes
  • Analytics-friendly structure

4. Simplified for MVP, TODOs for Phase 3

Decision: Treat uncapped hits as standard hits for now, add TODOs for full implementation

Rationale:

  • Completes Week 6 foundation without blocking
  • Clear markers for Phase 3 work
  • Test coverage proves integration works

Impact:

  • Can proceed to Phase 3 immediately
  • No broken functionality
  • Clear roadmap for next steps

Blockers Encountered 🚧

None - Development proceeded smoothly. All planned tasks completed successfully.


Outstanding Questions

1. Phase 3 Priority Order

Question: Should we implement full card-based resolution first, or strategic decisions first?

Context: Both are major Phase 3 components. Card resolution unlocks PD league auto-resolve. Strategic decisions unlock defensive shifts and offensive tactics.

Recommendation: Start with strategic decisions (simpler), then card resolution (more complex).

2. Double Play Logic Complexity

Question: How complex should the DP logic be for GROUNDBALL_A?

Context: Real Strat-O-Matic has situational DP chances based on speed, position, outs. Do we implement full complexity or simplified version for MVP?

Recommendation: Simplified for MVP (basic speed check), full complexity post-MVP.

3. Terminal Client Enhancement

Question: Should we add a "quick game" mode to terminal client for faster testing?

Context: Currently need to manually select decisions for each play. Auto-resolve mode would speed up testing.

Recommendation: Add in Phase 3 alongside AI opponent work.


Tasks for Next Session

Task 1: Commit Week 6 Completion (10 min)

Goal: Create git commit for completed Week 6 work

Acceptance Criteria:

  • All tests passing (139/140 - 1 pre-existing timing test)
  • Git status clean except expected changes
  • Commit message follows convention
  • Pushed to implement-phase-2 branch

Commands:

# Verify tests
python -m pytest tests/unit/config/ tests/unit/core/ -v

# Stage changes
git add backend/app/config/ backend/app/core/ backend/tests/

# Commit
git commit -m "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"

# Optional: Push to remote
git push origin implement-phase-2

Task 2: Update Implementation Index (15 min)

File: .claude/implementation/00-index.md

Goal: Mark Week 6 complete, update status table

Changes:

  1. Update status table:
    • PlayResolver Integration: Complete
    • PlayOutcome Enum: Complete
    • Dice System: Complete
  2. Update "Decisions Made" section with Week 6 completion date
  3. Update "Last Updated" footer
  4. Update "Current Work" to "Phase 3 Planning"

Acceptance Criteria:

  • Status table accurate
  • Week 6 marked 100% complete
  • Next phase clearly indicated

Task 3: Review Phase 3 Scope (30 min)

Files to Read:

  • @.claude/implementation/03-gameplay-features.md
  • @prd-web-scorecard-1.1.md (sections on strategic decisions)

Goal: Understand Phase 3 requirements and create task breakdown

Tasks:

  1. Read Phase 3 documentation
  2. List all strategic decision types needed:
    • Defensive: Alignment, depth, hold runners, shifts
    • Offensive: Steal attempts, bunts, hit-and-run
  3. Identify card resolution requirements:
    • PD: Parse batting/pitching ratings into result charts
    • SBA: Manual entry validation
  4. Map uncapped hit decision tree requirements
  5. Create initial Phase 3 task list

Output: Create PHASE_3_PLAN.md with task breakdown


Task 4: Terminal Client Smoke Test (20 min)

Goal: Verify all Week 6 changes work end-to-end

Test Procedure:

cd backend
source venv/bin/activate
python -m terminal_client

# In REPL:
> new_game
> defensive normal
> offensive normal
> resolve

# Repeat 20 times to see different outcomes
> quick_play 20

# Check for:
# - SINGLE_1, SINGLE_2, DOUBLE_2, DOUBLE_3 outcomes
# - GROUNDBALL_A/B/C, FLYOUT_A/B/C outcomes
# - Clean play descriptions
# - No errors

> status
> quit

Acceptance Criteria:

  • All outcome types appear in play results
  • No crashes or errors
  • Play descriptions accurate
  • Scores update correctly

Task 5: Database Metadata Verification (Optional, 15 min)

Goal: Verify play_metadata saves correctly for uncapped hits

Prerequisites: Modify SimplifiedResultChart to occasionally return SINGLE_UNCAPPED/DOUBLE_UNCAPPED for testing

Test Procedure:

# Add temporary test code to force uncapped outcome
# In play_resolver.py SimplifiedResultChart.get_outcome():
# if roll == 14: return PlayOutcome.SINGLE_UNCAPPED

# Run terminal client, get a few plays
python -m terminal_client
> new_game
> quick_play 50

# Check database
psql postgresql://paperdynasty:PASSWORD@10.10.0.42:5432/paperdynasty_dev
SELECT id, hit_type, play_metadata FROM plays WHERE play_metadata != '{}';

# Expected: Rows with play_metadata = {"uncapped": true, "outcome_type": "single_uncapped"}

Acceptance Criteria:

  • play_metadata saves non-empty for uncapped hits
  • JSON structure correct
  • outcome_type matches hit_type

Files to Review Before Starting Phase 3

  1. @.claude/implementation/03-gameplay-features.md - Phase 3 scope and requirements
  2. @prd-web-scorecard-1.1.md:780-846 - League config system requirements
  3. @prd-web-scorecard-1.1.md:630-669 - WebSocket event specifications
  4. backend/app/models/game_models.py:45-120 - DefensiveDecision and OffensiveDecision models
  5. backend/app/config/base_config.py - League config structure
  6. backend/app/models/player_models.py:254-495 - PdPlayer with batting/pitching ratings

Verification Steps

After Task 1 (commit):

  1. Verify clean git state:

    git status
    # Should show: nothing to commit, working tree clean
    
  2. Verify all tests pass:

    pytest tests/unit/config/ tests/unit/core/ -v
    # Expected: 139/140 passing (1 pre-existing timing test fails)
    
  3. Verify terminal client works:

    python -m terminal_client
    # Should start without errors
    # > new_game should work
    # > resolve should produce varied outcomes
    

Success Criteria

Week 6 is 100% complete when:

  • chaos_d20 renamed throughout codebase
  • PlayOutcome enum has granular variants (SINGLE_1/2, DOUBLE_2/3, GROUNDBALL_A/B/C, etc.)
  • PlayResolver uses universal PlayOutcome from app.config
  • play_metadata supports uncapped hit tracking
  • 139/140 tests passing (1 pre-existing timing issue)
  • Terminal client demonstrates all new outcomes
  • Git commit created
  • Documentation updated (Task 2)
  • Phase 3 planned (Task 3)

Phase 3 will begin when:

  • Week 6 committed and documented
  • Phase 3 tasks identified and prioritized
  • Strategic decision implementation plan created

Quick Reference

Current Test Count: 139/140 passing

  • Config tests: 30/30
  • Play resolver tests: 19/19
  • Dice tests: 34/35 (1 pre-existing)
  • Roll types tests: 27/27
  • Core/State tests: passing
  • Player model tests: 10/14 (pre-existing failures unrelated to Week 6)

Last Test Run: All passing (2025-10-29) Branch: implement-phase-2 Python: 3.13.3 Virtual Env: backend/venv/ Database: PostgreSQL @ 10.10.0.42:5432 (paperdynasty_dev)

Key Imports for Phase 3:

from app.config import get_league_config, PlayOutcome
from app.core.dice import AbRoll
from app.models.game_models import DefensiveDecision, OffensiveDecision
from app.models.player_models import BasePlayer, PdPlayer, SbaPlayer

Recent Commit History (Last 10):

64aa800 - CLAUDE: Update implementation plans for next session (21 hours ago)
5d5c13f - CLAUDE: Implement Week 6 league configuration and play outcome systems (22 hours ago)
a014622 - CLAUDE: Update documentation with session improvements (30 hours ago)
1c32787 - CLAUDE: Refactor game models and modularize terminal client (30 hours ago)
aabb90f - CLAUDE: Implement player models and optimize database queries (30 hours ago)
05fc037 - CLAUDE: Fix game recovery and add required field validation for plays (3 days ago)
918bead - CLAUDE: Add interactive terminal client for game engine testing (3 days ago)
f9aa653 - CLAUDE: Reorganize Week 6 documentation and separate player model specifications (4 days ago)
f3238c4 - CLAUDE: Complete Week 5 testing and update documentation (4 days ago)
54092a8 - CLAUDE: Add refactor planning and session documentation (4 days ago)

Context for AI Agent Resume

If the next agent needs to understand the bigger picture:

  • Overall project: See @prd-web-scorecard-1.1.md and @CLAUDE.md
  • Architecture: See @.claude/implementation/00-index.md
  • Backend guide: See @backend/CLAUDE.md
  • Phase 2 completion: See @.claude/implementation/02-week6-league-features.md
  • Next phase details: See @.claude/implementation/03-gameplay-features.md

Critical files for Phase 3 planning:

  1. app/core/game_engine.py - Main orchestration
  2. app/core/play_resolver.py - Outcome resolution
  3. app/models/game_models.py - DefensiveDecision/OffensiveDecision models
  4. app/models/player_models.py - Player ratings for card resolution
  5. app/config/league_configs.py - League-specific settings

What NOT to do:

  • Don't modify database schema without migration
  • Don't use Python's datetime module (use Pendulum)
  • Don't return Optional unless required (Raise or Return pattern)
  • Don't disable type checking globally (use targeted # type: ignore)
  • Don't create new files unless necessary (prefer editing existing)
  • Don't commit without "CLAUDE: " prefix

Patterns we're using:

  • Pydantic dataclasses for models
  • Async/await for all database operations
  • Frozen configs for immutability
  • Factory methods for polymorphic players
  • Metadata JSON for extensibility
  • TODO comments for Phase 3 work

Estimated Time for Next Session: 2-3 hours Priority: Medium (planning phase before major development) Blocking Other Work: No (Phase 2 complete, can proceed independently) Next Milestone After This: Phase 3 Task 1 - Strategic Decision System