This file is the central source of truth for agent coordination. Update this file when starting work, completing tasks, or encountering blockers.
MVP Target: CLI application that outputs NBA player prop projections with edge scores
Current Priority: P0 - Core functionality (game fetching, odds retrieval, projection models)
| Agent | Status | Current Task | Last Update |
|---|---|---|---|
| Data Engineer | π΄ Not Started | Initialize /data/ modules |
- |
| Quantitative Modeler | π΄ Not Started | Implement statistical distributions | - |
| Logic Architect | π΄ Not Started | Build adjustment algorithms | - |
| Test Engineer | π΄ Not Started | Write test scaffolds | - |
| Integration Specialist | π΄ Not Started | Create main.py entry point |
- |
- π΄ Not Started
- π‘ In Progress
- π’ Complete
- π΅ Blocked
| ID | Agent | Issue | Severity | Resolution | Status |
|---|---|---|---|---|---|
| - | - | No issues reported | - | - | - |
- Critical: Blocks other agents, cannot proceed
- High: Significantly impacts timeline
- Medium: Workaround available
- Low: Minor inconvenience
| Task | Blocked By | Needed From | Status |
|---|---|---|---|
| Model projections | SQLite schema | Data Engineer | β³ Waiting |
| Logic adjustments | Distribution functions | Quantitative Modeler | β³ Waiting |
| CLI output | Edge score calculation | Logic Architect | β³ Waiting |
| Test fixtures | All modules | All agents | β³ Waiting |
- βοΈ Data Engineer must create database schema and populate with team/player data
- βοΈ Data Engineer must implement
nba_client.pyfor game fetching - βοΈ Data Engineer must implement
odds_client.pyfor prop lines - βοΈ Quantitative Modeler must implement 4 stat projection functions (points, rebounds, assists, threes)
- βοΈ Integration Specialist must create CLI entry point
- β¬ Logic Architect must build pace adjustment module
- β¬ Logic Architect must build defensive efficiency loader
- β¬ Logic Architect must implement usage reallocation
- β¬ Logic Architect must calculate ensemble edge scores
- β¬ Integration Specialist adds garbage time filtering
- β¬ Test Engineer adds property-based tests with
hypothesis
- Use
snake_casefor all Python files:nba_client.py,usage_realloc.py - Use
__init__.pyto make directories importable packages - Test files mirror source:
tests/test_models.pytestsmodels/
# β
Good
def calculate_edge_score(model_projection, market_line):
edge = model_projection - market_line
return edge
projected_points = 25.3
pace_factor = 1.02
# β Avoid
def calc(proj, line): # Too abbreviated
return proj - line
projPts = 25.3 # Mixed case# β
Good
class ProjectionEngine:
def __init__(self, config):
self.config = config
# β Avoid
class projection_engine: # Wrong case
pass# β
Good (at top of file or in config.py)
DEFAULT_PACE_FACTOR = 1.0
MIN_EDGE_THRESHOLD = 0.5
MAX_GAMES_SAMPLE = 15
# β Avoid
default_pace_factor = 1.0 # Should be UPPER_CASE if constant- Always plural:
players,games,projections,results - Foreign keys reference singular ID:
player_id,game_id
- Never log API keys - Use
config.pyto load from.env - Always wrap in try/except - Handle network failures gracefully
- Respect rate limits - Add delays between calls; check quota headers
- Return structured data - Use dictionaries or dataclasses, not raw JSON strings
# β
Good
def get_todays_games():
try:
board = scoreboard.ScoreBoard()
return board.get_dict()
except Exception as e:
logger.error(f"Failed to fetch games: {e}")
return {}
# β Avoid
def get_games():
return scoreboard.ScoreBoard() # No error handling- Document math - Every function must explain formula in docstring
- Return variance - Point estimates aren't enough; always return confidence bounds
- Validate distributions - Test mean/variance properties with known parameters
- Handle edge cases - What if player has 0 attempts? What if sample is empty?
# β
Good
def conway_maxwell_poisson_pmf(k, lambda_param, nu_param):
"""
Conway-Maxwell-Poisson PMF for under-dispersed data.
Used for rebounds/assists where variance < mean.
Formula: P(X=k) = (Ξ»^k / (k!)^Ξ½) / Z(Ξ», Ξ½)
Args:
k: Count value
lambda_param: Rate parameter (Ξ»)
nu_param: Dispersion parameter (Ξ½)
Returns:
Probability mass for value k
"""
if lambda_param < 0 or nu_param < 0:
raise ValueError("Parameters must be non-negative")
# ... implementation- Explain adjustments - Document why pace factor is 1.02, not 1.5
- Keep weights configurable - Put thresholds in
config.py, not hardcoded - Log decisions - When usage is reallocated, log which players got what
# β
Good
def apply_pace_adjustment(base_projection, team_pace, league_avg_pace):
"""
Adjust projection based on pace factor.
Pace Factor = Team Pace / League Average Pace
A team playing 105 possessions vs league avg 100 has pace_factor = 1.05
Projection gets multiplied by this factor.
"""
pace_factor = team_pace / league_avg_pace
return base_projection * pace_factor
# β Avoid
def adjust(proj, pace):
return proj * pace * 1.02 # Magic numbers unexplained- Mock all external calls - No network access in tests
- Use fixtures - Create reusable test data
- Test edge cases - Not just happy path
- Assert on math - Verify statistical properties
# β
Good
@pytest.fixture
def mock_nba_api():
with patch('nba_api.stats.endpoints.scoreboard.ScoreBoard') as mock:
mock.return_value.get_dict.return_value = {'games': []}
yield mock
def test_empty_game_day(mock_nba_api):
result = get_todays_games()
assert result == {'games': []}[Agent] Scope: Brief description
- Detailed change 1
- Detailed change 2
Closes #IssueNumber
Example:
[Data Engineer] API: Add error handling to odds client
- Retry logic for 5xx errors
- Rate limit header logging
- Graceful degradation on quota exceeded
Closes #12
data-engineer/api-integrationmodeler/cmp-distributionlogic/pace-adjustmentstest/unit-tests-modelsintegration/cli-entry-point
| Timestamp | Agent | Message |
|---|---|---|
| 2026-03-27 10:00 | System | WHITEBOARD.md initialized |
| - | - | - |
/data/nba_client.py # NBA API wrapper
/data/odds_client.py # The Odds API wrapper
/data/storage.py # SQLite operations
/models/distributions.py # Statistical PDFs/PMFs
/models/projections.py # Projection builders
/logic/adjustments.py # Pace & defensive adjustments
/logic/usage_realloc.py # DNP usage redistribution
/logic/ensemble.py # Edge score calculation
/utils/formatting.py # CLI output tables
/utils/garbage_time.py # Garbage time filter
/main.py # Entry point
/config.py # Environment variables
/.env # API keys (gitignored)
ODDS_API_KEY=your_key_here
DATABASE_PATH=./data/projections.db
EDGE_THRESHOLD=0.5
LOG_LEVEL=INFO# Run all tests
pytest tests/
# Run with coverage
pytest --cov=. tests/
# Run specific test
pytest tests/test_models.py::test_cmp_distribution -vBefore marking any task complete:
- Code follows naming conventions in BLUEPRINT.md
- All functions have docstrings
- No hardcoded API keys or credentials
- Error handling for all external calls
- Unit tests pass locally
- Coverage >80% for modified files
- WHITEBOARD.md updated with completion status
- No blocker comments remaining
Last Updated: 2026-03-27 Next Review: When first agent completes P0 task