Some checks failed
CI / lint-and-test (pull_request) Has been cancelled
- 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>
340 lines
11 KiB
Markdown
340 lines
11 KiB
Markdown
# 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.**
|
|
|
|
1. **CHECK EVERYTHING** - Search ALL locations before saying "no" (cache, installed, source directories)
|
|
2. **BELIEVE THE USER** - Investigate thoroughly before disagreeing; user instincts are often right
|
|
3. **VERIFY BEFORE "DONE"** - Run commands, show output; "done" means verified working
|
|
4. **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
|
|
|
|
```bash
|
|
# 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
|
|
|
|
1. Create feature branch FROM `development`: `git checkout -b feature/{sprint}-{description}`
|
|
2. Work and commit on feature branch
|
|
3. Merge INTO `development` when complete
|
|
4. `development` -> `staging` -> `main` for 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`:
|
|
|
|
```bash
|
|
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*
|