# CLAUDE.md This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository. ## Project Overview QA Annotation System (qa_annotate) - a FastAPI web application for managing and annotating QA dataset pairs. Supports multi-user annotation workflows with role-based access control (superusers manage projects/datasets, regular users perform annotations). ## Commands ```bash # Run dev server uvicorn qa_annotate.main:app --reload --host 0.0.0.0 --port 8000 # Or via the installed entry point qa # Create superuser python scripts/create_superuser.py # Lint/format (via pre-commit or directly) ruff check --fix . ruff format . ``` Pre-commit hooks run ruff linting + formatting and standard checks (trailing whitespace, YAML/JSON/TOML validation, etc.). ## Architecture ### Backend (Python/FastAPI) Three-layer architecture inside `qa_annotate/`: - **`api/`** - FastAPI routers. Each domain has its own module (auth, user, dataset, annotation, project, seed_question, system_config, analysis). All routes are mounted under `/api` prefix. - **`database/`** - SQLAlchemy ORM models (`models.py`) and CRUD operations (`crud.py`). Models use `from_pydantic()` / `to_pydantic()` conversion methods to bridge between SQLAlchemy and Pydantic. DB sessions are provided via `get_db()` generator dependency. - **`schema/`** - Pydantic models for request/response validation. Separate schemas for create, update, and read operations. Configuration is in `qa_annotate/config.py` using pydantic-settings, reading from `.env` file and environment variables. Key settings: `SECRET_KEY`, `HOST`, `PORT`, `ENVIRONMENT`. ### Frontend (Vanilla JS) - **`qa_annotate/html/`** - One HTML file per page (auth, manager, user, annotation, etc.). Pages are served by a catch-all route in `main.py` that maps `/{path}` to `html/{path}.html`. - **`qa_annotate/static/js/`** - One JS file per HTML page, plus shared utilities (`pagination.js`, `project-api.js`). No frontend framework. - **`qa_annotate/static/css/`** - Component-specific stylesheets. - **`qa_annotate/static/locales/`** - i18n translation files. ### Key Domain Concepts - **Project** → contains **Datasets** → each dataset contains **QA Pairs** (question + answer + optional extra fields) - **AnnotationConfig** defines annotation task settings (type: score/category/text/multi_choice/single_choice/binary, plus optional reason and confidence fields). Configs are linked to datasets or projects via many-to-many association tables. - **AnnotationResult** stores individual annotation values, linked to a specific QA pair, dataset, config, and annotator. - **SeedQuestion** - predefined question templates organized by type/subtype. - **SystemConfig** - key-value store for system-wide settings. ### Database - SQLite only (stored in `data/annotations.db`, configurable via `DB_DIR`/`DB_NAME` settings). - Auto-creates tables on startup via `init_db()`. - Passwords are SHA-256 hashed client-side before storage (see `qa_annotate/utils/password.py`). ### Auth JWT-based authentication. Roles: superuser (full access to management pages) vs regular user (annotation tasks only). Token stored in localStorage on the frontend.