No description
The ratecard summary tab now includes: - Tier row (showing client_tier A/B/C per asset column) below the header - Match Summary row (per-match caveat text) — split from combined caveats - GMAL Standard Caveats row — split from combined caveats Match summary and GMAL standard caveats were previously merged into a single row, which made it hard to tell what came from the AI match vs the standard GMAL clause. Splitting them surfaces both clearly. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> |
||
|---|---|---|
| .claude | ||
| backend | ||
| frontend | ||
| .env.example | ||
| .gitignore | ||
| CLAUDE.md | ||
| deploy.sh | ||
| docker-compose.yml | ||
| README.md | ||
GMAL Scope Builder
A Dockerized web application for scoping new client ratecards and team shapes against the GMAL master asset database. Uses AI (Claude Opus 4.6) to match client briefs to standardized GMAL assets, build ratecards with hours per role, and calculate team FTE headcount.
Tech Stack
- Docker with docker-compose (3 services)
- PostgreSQL 16 - persistent data store
- Python / FastAPI - backend API
- React + Vite + TypeScript - frontend
- Claude API (Opus 4.6) - AI matching and document parsing
Quick Start (Local Development)
# 1. Clone
git clone git@bitbucket.org:zlalani/gmal-scope-builder.git
cd gmal-scope-builder
# 2. Create .env
cp .env.example .env
# Edit .env and add your ANTHROPIC_API_KEY
# 3. Add the GMAL Excel file
# Place "U-Studio GMAL Asset Job Routes Apr25 ForFranky.xlsx" in the data/ directory
# 4. Build and start
docker compose build
docker compose up -d
# 5. Wait for services to be ready (~30 seconds)
docker compose logs backend --tail 5
# Look for "Application startup complete"
# 6. Ingest GMAL data
curl -X POST http://localhost:8001/api/gmal/ingest
# 7. Open the app
open http://localhost:3010
Deploying to a Server
1. Get the code on the server
git clone git@bitbucket.org:zlalani/gmal-scope-builder.git
cd gmal-scope-builder
2. Copy data files from your local machine
# From your local machine:
scp backups/scope_builder_deploy.sql user@server:/path/to/gmal-scope-builder/backups/
scp "data/U-Studio GMAL Asset Job Routes Apr25 ForFranky.xlsx" user@server:/path/to/gmal-scope-builder/data/
3. Create the .env file
cp .env.example .env
nano .env
POSTGRES_PASSWORD=scope_pass_2024
ANTHROPIC_API_KEY=sk-ant-api03-your-key-here
4. Update ports (if needed)
Edit docker-compose.yml to change the exposed ports. Defaults:
- 5433 - PostgreSQL
- 8001 - Backend API
- 3010 - Frontend
5. Build and start
docker compose build
docker compose up -d
6. Import the database
Wait for containers to be healthy, then import the dump (includes all GMAL data + AI descriptions):
# Wait for DB
docker compose logs db --tail 5
# Import (the -T flag is important for piped input)
docker compose exec -T db psql -U scope_user -d scope_builder < backups/scope_builder_deploy.sql
7. Verify
# Check data
docker compose exec db psql -U scope_user -d scope_builder -c "SELECT COUNT(*) FROM gmal_assets;"
# Expected: 390
docker compose exec db psql -U scope_user -d scope_builder -c "SELECT COUNT(*) FROM gmal_assets WHERE ai_enhanced_description IS NOT NULL;"
# Expected: 135+
# Check API
curl http://localhost:8001/api/health
curl http://localhost:8001/api/gmal/stats
# Open frontend
# http://your-server:3010
Creating a Fresh Database Backup
cd gmal-scope-builder
docker compose exec db pg_dump -U scope_user -d scope_builder > backups/scope_builder_$(date +%Y%m%d).sql
Restoring a Database Backup
docker compose exec -T db psql -U scope_user -d scope_builder < backups/scope_builder_YYYYMMDD.sql
Features
Core Workflow
- Create Project - name, client, select model type (Current O+, AI O+, Current Local, AI Local, Asset Factory)
- Upload Client Brief - Word (.docx) or Excel (.xlsx), AI extracts assets with descriptions and volumes
- AI Matching - matches each client asset to the closest GMAL equivalent with confidence scores and caveats
- Build Ratecard - hours per role per asset, multiplied by volume
- Team Shape - FTE headcount per role (hours / 1,800)
- AI Efficiency - model 10/25/50/75/90% efficiency reductions on delivery roles
- Export - Excel (ratecard + asset detail + team shape + efficiency tabs) and PDF (caveats report)
Additional
- GMAL Browser - search/filter all 390 assets with full detail view
- GMAL Editor - inline editing of assets, hours per role per model type
- AI Descriptions - batch-generate rich brief-friendly descriptions for better matching
- AI Cost Tracking - real-time token usage and cost per project
- Debug Panel - inspect every AI call (prompt, response, tokens, cost)
- Help Page - full user guide with model type explanations
Project Structure
gmal-scope-builder/
docker-compose.yml
.env / .env.example
data/ # GMAL Excel file (gitignored)
backups/ # Database dumps (gitignored)
backend/
Dockerfile
requirements.txt
start.sh # DB init + uvicorn
app/
main.py # FastAPI app
config.py # Settings from env
database.py # SQLAlchemy async engine
models/ # SQLAlchemy models
schemas/ # Pydantic schemas
api/ # Route handlers
services/ # Business logic
excel_parser.py # GMAL Excel ingestion
doc_parser.py # Client document parsing
ai_matching.py # Claude matching engine
ai_descriptions.py # AI description generator
ratecard_builder.py # Ratecard from matches
team_shape.py # FTE calculator
export_excel.py # Excel export
export_pdf.py # PDF caveats export
utils/
claude_client.py # Anthropic SDK wrapper + cost tracking
frontend/
Dockerfile
src/
pages/ # Dashboard, ProjectView, GmalBrowser, GmalEditor, Help
components/
api/client.ts
types/index.ts
API Pricing
Claude Opus 4.6: $3/M input tokens, $15/M output tokens
Typical costs per project:
- Document parsing: ~$0.05-0.15
- Matching (per asset): ~$0.02-0.05
- Full project (50 assets): ~$1-3
- AI description generation (one-off): ~$1-2 for all 243 assets