- Update dbt model references to use new schema naming (stg_toronto, int_toronto, mart_toronto) - Refactor figure factories to use consistent column naming from new schema - Update callbacks to work with refactored data structures - Add centralized design tokens module for consistent styling - Streamline CLAUDE.md documentation Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
11 KiB
CLAUDE.md
⛔ MANDATORY BEHAVIOR RULES - READ FIRST
These rules are NON-NEGOTIABLE. Violating them wastes the user's time and money.
1. WHEN USER ASKS YOU TO CHECK SOMETHING - CHECK EVERYTHING
- Search ALL locations, not just where you think it is
- Check cache directories:
~/.claude/plugins/cache/ - Check installed:
~/.claude/plugins/marketplaces/ - Check source directories
- NEVER say "no" or "that's not the issue" without exhaustive verification
2. WHEN USER SAYS SOMETHING IS WRONG - BELIEVE THEM
- The user knows their system better than you
- Investigate thoroughly before disagreeing
- Your confidence is often wrong. User's instincts are often right.
3. NEVER SAY "DONE" WITHOUT VERIFICATION
- Run the actual command/script to verify
- Show the output to the user
- "Done" means VERIFIED WORKING, not "I made changes"
4. SHOW EXACTLY WHAT USER ASKS FOR
- If user asks for messages, show the MESSAGES
- If user asks for code, show the CODE
- Do not interpret or summarize unless asked
FAILURE TO FOLLOW THESE RULES = WASTED USER TIME = UNACCEPTABLE
Mandatory Behavior Rules
These rules are NON-NEGOTIABLE. Violating them wastes the user's time and money.
- CHECK EVERYTHING - Search ALL locations before saying "no" (cache, installed, source directories)
- BELIEVE THE USER - Investigate thoroughly before disagreeing; user instincts are often right
- VERIFY BEFORE "DONE" - Run commands, show output; "done" means verified working
- SHOW EXACTLY WHAT'S ASKED - Do not interpret or summarize unless requested
Working context for Claude Code on the Analytics Portfolio project.
Project Status
Last Completed Sprint: 9 (Neighbourhood Dashboard Transition)
Current State: Ready for deployment sprint or new features
Branch: development (feature branches merge here)
Quick Reference
Run Commands
# Setup & Database
make setup # Install deps, create .env, init pre-commit
make docker-up # Start PostgreSQL + PostGIS (auto-detects x86/ARM)
make docker-down # Stop containers
make db-init # Initialize database schema
make db-reset # Drop and recreate database (DESTRUCTIVE)
# Data Loading
make load-data # Load all project data (currently: Toronto)
make load-toronto # Load Toronto data from APIs
# Application
make run # Start Dash dev server
# Testing & Quality
make test # Run pytest
make lint # Run ruff linter
make format # Run ruff formatter
make typecheck # Run mypy type checker
make ci # Run all checks (lint, typecheck, test)
# dbt
make dbt-run # Run dbt models
make dbt-test # Run dbt tests
make dbt-docs # Generate and serve dbt documentation
# Run `make help` for full target list
Branch Workflow
- Create feature branch FROM
development:git checkout -b feature/{sprint}-{description} - Work and commit on feature branch
- Merge INTO
developmentwhen complete development->staging->mainfor releases
Code Conventions
Import Style
| Context | Style | Example |
|---|---|---|
| Same directory | Single dot | from .neighbourhood import NeighbourhoodRecord |
| Sibling directory | Double dot | from ..schemas.neighbourhood import CensusRecord |
| External packages | Absolute | import pandas as pd |
Module Responsibilities
| Directory | Purpose |
|---|---|
schemas/ |
Pydantic models for data validation |
models/ |
SQLAlchemy ORM for database persistence |
parsers/ |
API/CSV extraction for raw data ingestion |
loaders/ |
Database operations for data loading |
services/ |
Query functions for dbt mart queries |
figures/ |
Chart factories for Plotly figure generation |
errors/ |
Custom exception classes (see errors/exceptions.py) |
Code Standards
- Python 3.10+ type hints:
list[str],dict[str, int] | None - Single responsibility functions with verb naming
- Early returns over deep nesting
- Google-style docstrings only for non-obvious behavior
Application Structure
Entry Point: portfolio_app/app.py (Dash app factory with Pages routing)
| Directory | Purpose |
|---|---|
pages/ |
Dash Pages (file-based routing) |
pages/toronto/ |
Toronto Dashboard (tabs/ for layouts, callbacks/ for interactions) |
components/ |
Shared UI components |
figures/toronto/ |
Toronto chart factories |
toronto/ |
Toronto data logic (parsers, loaders, schemas, models) |
Key URLs: / (home), /toronto (dashboard), /blog (listing), /blog/{slug} (articles), /health (status)
Multi-Dashboard Architecture
- figures/: Domain-namespaced (
figures/toronto/, future:figures/football/) - dbt models: Domain subdirectories (
staging/toronto/,marts/toronto/) - Database schemas: Domain-specific raw data (
raw_toronto, future:raw_football)
Tech Stack (Locked)
| Layer | Technology | Version |
|---|---|---|
| Database | PostgreSQL + PostGIS | 16.x |
| Validation | Pydantic | >=2.0 |
| ORM | SQLAlchemy | >=2.0 (2.0-style API only) |
| Transformation | dbt-postgres | >=1.7 |
| Visualization | Dash + Plotly + dash-mantine-components | >=2.14 |
| Geospatial | GeoPandas + Shapely | >=0.14 |
| Python | 3.11+ | Via pyenv |
Notes: SQLAlchemy 2.0 + Pydantic 2.0 only. Docker Compose V2 format (no version field).
Data Model Overview
Database Schemas
| Schema | Purpose |
|---|---|
public |
Shared dimensions (dim_time) |
raw_toronto |
Toronto-specific raw/dimension tables |
stg_toronto |
Toronto dbt staging views |
int_toronto |
Toronto dbt intermediate views |
mart_toronto |
Toronto dbt mart tables |
dbt Project: portfolio
| Layer | Naming | Purpose |
|---|---|---|
| Shared | stg_dimensions__* |
Cross-domain dimensions |
| Staging | stg_{source}__{entity} |
1:1 source, cleaned, typed |
| Intermediate | int_{domain}__{transform} |
Business logic |
| Marts | mart_{domain} |
Final analytical tables |
Deferred Features
Stop and flag if a task requires these:
| Feature | Reason |
|---|---|
| Historical boundary reconciliation (140->158) | 2021+ data only for V1 |
| ML prediction models | Energy project scope (future phase) |
Environment Variables
Required in .env:
DATABASE_URL=postgresql://user:pass@localhost:5432/portfolio
POSTGRES_USER=portfolio
POSTGRES_PASSWORD=<secure>
POSTGRES_DB=portfolio
DASH_DEBUG=true
SECRET_KEY=<random>
LOG_LEVEL=INFO
Reference Documents
| Document | Location | Use When |
|---|---|---|
| Project reference | docs/PROJECT_REFERENCE.md |
Architecture decisions |
| Developer guide | docs/CONTRIBUTING.md |
How to add pages, tabs |
| Lessons learned | docs/project-lessons-learned/INDEX.md |
Past issues and solutions |
| Deployment runbook | docs/runbooks/deployment.md |
Deploying to environments |
Plugin Reference
Sprint Management: projman
CRITICAL: Always use projman for sprint and task management.
| Skill | Trigger | Purpose |
|---|---|---|
/projman:sprint-plan |
New sprint/feature | Architecture analysis + Gitea issue creation |
/projman:sprint-start |
Begin implementation | Load lessons learned, start execution |
/projman:sprint-status |
Check progress | Review blockers and completion |
/projman:sprint-close |
Sprint completion | Capture lessons learned |
Default workflow: /projman:sprint-plan before code -> create issues -> /projman:sprint-start -> track via Gitea -> /projman:sprint-close
Gitea: personal-projects/personal-portfolio at gitea.hotserv.cloud
Data Platform: data-platform
Use for dbt, PostgreSQL, and PostGIS operations.
| Skill | Purpose |
|---|---|
/data-platform:data-review |
Audit data integrity, schema validity, dbt compliance |
/data-platform:data-gate |
CI/CD data quality gate (pass/fail) |
When to use: Schema changes, dbt model development, data loading, before merging data PRs.
MCP tools available: pg_connect, pg_query, pg_tables, pg_columns, pg_schemas, st_* (PostGIS), dbt_* operations.
Visualization: viz-platform
Use for Dash/Mantine component validation and chart creation.
| Skill | Purpose |
|---|---|
/viz-platform:component |
Inspect DMC component props and validation |
/viz-platform:chart |
Create themed Plotly charts |
/viz-platform:theme |
Apply/validate themes |
/viz-platform:dashboard |
Create dashboard layouts |
When to use: Dashboard development, new visualizations, component prop lookup.
Code Quality: code-sentinel
Use for security scanning and refactoring analysis.
| Skill | Purpose |
|---|---|
/code-sentinel:security-scan |
Full security audit of codebase |
/code-sentinel:refactor |
Apply refactoring patterns |
/code-sentinel:refactor-dry |
Preview refactoring without applying |
When to use: Before major releases, after adding auth/data handling code, periodic audits.
Documentation: doc-guardian
Use for documentation drift detection and synchronization.
| Skill | Purpose |
|---|---|
/doc-guardian:doc-audit |
Scan project for documentation drift |
/doc-guardian:doc-sync |
Synchronize pending documentation updates |
When to use: After significant code changes, before releases.
Pull Requests: pr-review
Use for comprehensive PR review with multiple analysis perspectives.
| Skill | Purpose |
|---|---|
/pr-review:initial-setup |
Configure PR review for project |
| Triggered automatically | Security, performance, maintainability, test analysis |
When to use: Before merging significant PRs to development or main.
Requirement Clarification: clarity-assist
Use when requirements are ambiguous or need decomposition.
When to use: Unclear specifications, complex feature requests, conflicting requirements.
Contract Validation: contract-validator
Use for plugin interface validation.
| Skill | Purpose |
|---|---|
/contract-validator:agent-check |
Quick agent definition validation |
/contract-validator:full-validation |
Full plugin contract validation |
When to use: When modifying plugin integrations or agent definitions.
Git Workflow: git-flow
Use for standardized git operations.
| Skill | Purpose |
|---|---|
/git-flow:commit |
Auto-generated conventional commit |
/git-flow:branch-start |
Create feature/fix/chore branch |
/git-flow:git-status |
Comprehensive status with recommendations |
When to use: Complex merge scenarios, branch management, standardized commits.
Last Updated: February 2026