track file sizes for all documents in system * feature complete needs dev testing
7.5 KiB
CLAUDE.md
This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
General rules DO NOT VIOLATE
NEVER code additional features that I did not explicitly ask for without asking permission. NEVER create mock data or simplified components unless explicitly told to do so NEVER replace existing complex components with simplified versions - always fix the actual problem or the feature that was requested. Never just bypass tests that have regressed. Stop and find out why they are failing and fix them. ALWAYS work with the existing codebase - do not create new simplified alternatives ALWAYS find and fix the root cause of issues instead of creating workarounds When debugging issues, focus on fixing the existing implementation, not replacing it When something doesn't work, debug and fix it - don't start over with a simple version Don’t build things I am not specifically asking for unless its required to build the thing I am asking for. When asked to make unit tests avoid mocks and use the actual thing that is being tested when reasonable. For commands that read such as grep or cat there is no need to ask for permission. Do not assume that we need backward compatibilty when implementing new features. If there is a decision to make that will affect this ask. Do not guess.
IDE related
Always use ide diagnostics to validate code changes when running with ide integration (goland, vscode)
linting all edits after every change
Always run task lint once you think you are done with edits to verify your changes have not caused other issues.
When running task lint output should always be clean. 0 errors.
Warnings about variable not set are ok.
Lint output output must contain ‘Linting passed, A perfect score! well done!’ or you must fix an issue to resume.
Use task go:lint -- --fix to fix go (file not formmatted) types of errors from lint. Always run this before running task fullsuite:ci
Essential Commands
Development Setup
devbox shell- Enter development environment (Nix-based) I will start you already in the devbox shell for the project if there is one.touch .env- Create environment variables filetask fullsuite:ci- Complete development workflow (generate, build, lint, test) This must pass clean or its not working. If its output has the wordFAILthen investigate what the issue is before calling the change complete.- when running fullsuite:ci make sure that you have stopped the containers that run from a previous `task compose:refresh' if this applies. (use task compose:down to clean those up first)
Core Development Tasks
task generate- Generate all code (DB queries via SQLC, OpenAPI clients/servers, mocks, docs)task build- Build Docker imagetask lint- Run all linting (Go, YAML, JSON, Docker, OpenAPI)
task go:lint -- --fix- Fix automatically fixable linting issues in Go codetask test:functional- Run full test suite with 80% coverage thresholdtask precommit- Pre-commit checks for CI/CD readiness
Testing Commands
task test:unit:short- Quick unit teststask test:race- Race condition detectiontask test:perf- Performance analysis with slowest test reportingtask test:mem- Memory usage profilingtask test:bench- Benchmark execution- full suite of tests is
task fullsuit:ciand it must have this statement at the end of its output 'All coverage checks passed!'
Architecture Overview
System Design
This is a document processing and query orchestration platform with microservices architecture using:
- Event-driven processing via AWS SQS queues
- RESTful API (queryAPI on port 8080) for external interactions
- Runner services (ports 8081-8090) as queue consumers
- PostgreSQL with migration-driven schema management
- AWS services (S3, SQS, Textract, Cognito) for cloud functionality
Document Processing Pipeline
- Upload → S3 storage → storeEventRunner
- Init → Validation/deduplication → docInitRunner
- Sync → Client eligibility → docSyncRunner
- Clean → Content processing → docCleanRunner
- Text Extraction → AWS Textract OCR → docTextRunner
- Query Processing → Custom queries → queryRunner
- Export → Result generation
Core Entities
- Client: Customer configurations with document sets and permissions
- Collector: Query collection specifications per client
- Query: Data processing blocks with dependency chains
- Document: Uploaded files with processing state tracking
- Export: Manual result output processes
Service Architecture
- queryAPI (8080): Main REST API with OpenAPI-generated handlers
- Runners (8081-8090): Queue-based processing services implementing
Controllerinterface- Each runner consumes from specific SQS queues
- Stateless processing with database persistence
- Prometheus metrics integration
Development Patterns
Code Generation
All code generation happens via task generate:
- SQLC: Database queries from
internal/database/queries/*.sql - OpenAPI: API clients/servers from
serviceAPIs/*.yaml - Mockery: Test mocks for interfaces
- gomarkdoc: Documentation generation
Testing Strategy
- Testcontainers: Docker-based integration testing for database/queue interactions
- 80% coverage threshold (60% function coverage) enforced
- Private test files: Use
*private_test.gofor internal testing - Mock interfaces: Auto-generated in
mocks/directory
Project Structure
Follows Go Standard Project Layout:
cmd/: Application entry points (main.go files)internal/: Private application codeapi/: Generated API server implementationspkg/: Generated API client librariesmocks/: Auto-generated test mocks
Naming Conventions
- Service: Commands deployed as APIs (e.g., queryAPI)
- Runner: Commands deployed as queue consumers (e.g., docTextRunner)
- API naming:
<functionality>APIformat - Runner naming:
<functionality>Runnerformat
Environment Configuration
Environment variable hierarchy (first overrides subsequent):
devbox.json"env" sectiondevbox.json"init_hook" exports.envfile variables
Authentication & Authorization
- AWS Cognito: JWT-based authentication
- Permit.io: RBAC integration for fine-grained permissions
- Middleware handles token validation and permission checking
Key Dependencies
Core Technologies
- Go 1.24: Primary language
- PostgreSQL: Database with pgx driver
- Echo v4: HTTP framework with middleware
- Testcontainers: Integration testing
- AWS SDK v2: Cloud service integration
Code Quality Tools
- golangci-lint: Go linting
- yamllint: YAML validation
- Task: Build automation
- devbox: Development environment
Quick Start for New Features
Adding New API Endpoint
- Modify
serviceAPIs/queryAPI.yamlOpenAPI specification - Run
task generateto regenerate API code - Implement handlers in
api/queryAPI/ - Add tests following existing patterns
Adding New Queue Consumer
- Create
api/<runnerName>/runner.goimplementingControllerinterface - Create
cmd/<runnerName>/main.goentry point - Add queue configuration in
internal/serviceconfig/queue/ - Add to docker-compose and deployment configurations
Database Changes
- Add migration files in
internal/database/migrations/ - Add queries in
internal/database/queries/ - Run
task db:generateto regenerate Go code - Update repository layer as needed