# leocrm — Task-Graph (v0.1) ## Phasen & Reihenfolge ``` B0 Setup B1 Requirements B2 Architecture B3 Scaffold B4 Auth B5 Companies ───────── ───────────── ────────────── ────────── ────── ────────── repo+git requirements.md architecture.md pyproject+req.txt user-model company-model .env.example design.md (parallel) app/main.py auth_service company_service .gitignore tasks.md Dockerfile /api/auth/* /api/companies/* README docker-compose login-form companies-list init-commit plan-approval commit+pushed logout form+detail → B4 ↓ B6 Contacts ─────────── contact-model contact_service /api/contacts/* contacts-form+detail ↓ B7 Test+Runtime ─────────────── 15+ pytest tests server-start /api/health = 200 test_report.md runtime_report.md ↓ B8 Deploy-Prep ────────────── coolify project compose verified env.md, runbook.md rollback.md quality-reviewer ↓ B9 Deploy ──────── coolify service deploy trigger running:healthy release_auditor user-report ``` ## Tasks (atomar, klein, testbar) | ID | Block | Task | Abhängigkeit | Geschätzter Aufwand | |----|-------|------|--------------|---------------------| | T-01 | B3 | pyproject.toml + requirements.txt mit allen Pinned-Deps | — | 5 min | | T-02 | B3 | app/main.py Skeleton (FastAPI-App, leere Router, Health-Endpoint) | T-01 | 5 min | | T-03 | B3 | Dockerfile + docker-compose.yml + .dockerignore + .env.example | T-01 | 5 min | | T-04 | B3 | README.md + .gitignore + LICENSE | — | 3 min | | T-05 | B3 | Init-Commit + Push zu Forgejo (branch=main) | T-01..T-04 | 2 min | | T-06 | B4 | app/db/models.py (User, Company, Contact) | T-02 | 8 min | | T-07 | B4 | app/db/session.py + app/db/init_db.py (mit seed) | T-06 | 5 min | | T-08 | B4 | app/schemas/auth.py (LoginIn) + app/services/auth_service.py | T-06 | 5 min | | T-09 | B4 | app/routes/api_routes.py: /api/health + /api/auth/login + /api/auth/logout | T-08 | 8 min | | T-10 | B4 | app/routes/html_routes.py: /login + /logout + base.html + login.html | T-09 | 8 min | | T-11 | B4 | Auth-Middleware + current_user-Dependency | T-09, T-10 | 5 min | | T-12 | B4 | Commit B4 + Push + lokaler Server-Test | T-11 | 5 min | | T-13 | B5 | app/schemas/company.py (CompanyIn, CompanyOut) | T-06 | 3 min | | T-14 | B5 | app/services/company_service.py (list, get, create, update, delete, count) | T-13 | 8 min | | T-15 | B5 | app/routes/api_routes.py: /api/companies/* (alle 5 Endpoints) | T-14 | 8 min | | T-16 | B5 | app/routes/html_routes.py: /companies + /companies/new + /companies/{id} + /companies/{id}/edit + /companies/{id}/delete | T-15 | 12 min | | T-17 | B5 | app/templates/companies/*.html + dashboard.html mit Companies-Count | T-16 | 10 min | | T-18 | B5 | Commit B5 + Push | T-17 | 2 min | | T-19 | B6 | app/schemas/contact.py | T-06 | 3 min | | T-20 | B6 | app/services/contact_service.py | T-19 | 8 min | | T-21 | B6 | app/routes/api_routes.py: /api/contacts/* | T-20 | 8 min | | T-22 | B6 | app/routes/html_routes.py: /contacts/* + Cascade-Delete-View | T-21 | 10 min | | T-23 | B6 | app/templates/contacts/*.html + dashboard.html mit Contacts-Count | T-22 | 8 min | | T-24 | B6 | Commit B6 + Push | T-23 | 2 min | | T-25 | B7 | tests/conftest.py (TestClient + in-memory-DB) | T-24 | 5 min | | T-26 | B7 | tests/test_health.py (2 Tests) | T-25 | 3 min | | T-27 | B7 | tests/test_auth.py (3 Tests: happy, wrong-pw, no-creds) | T-25 | 5 min | | T-28 | B7 | tests/test_companies_api.py (5 Tests) | T-25 | 8 min | | T-29 | B7 | tests/test_contacts_api.py (5 Tests + 1 Cascade-Test) | T-25 | 10 min | | T-30 | B7 | tests/test_html_smoke.py (3 Tests: redirect-when-anon, login-form, dashboard-renders) | T-25 | 5 min | | T-31 | B7 | pytest ausführen, alle 18 Tests grün, test_report.md schreiben | T-26..T-30 | 5 min | | T-32 | B7 | uvicorn app.main:app starten, /api/health=200, /api/auth/login, 5 Endpoints testen, runtime_report.md schreiben | T-31 | 5 min | | T-33 | B7 | Commit B7 + Push | T-32 | 2 min | | T-34 | B8 | deploy/env.md (Variablen-Doku) | — | 3 min | | T-35 | B8 | deploy/healthcheck.md (Coolify-Config) | — | 3 min | | T-36 | B8 | deploy/runbook.md (Start/Stop/Logs/Restart/Update) | — | 5 min | | T-37 | B8 | deploy/rollback.md (Schritte + Coolify-Rollback) | — | 5 min | | T-38 | B8 | docker build lokal: Image < 300 MB, Container startet | T-03 | 5 min | | T-39 | B8 | quality_reviewer über alle Artefakte, findings.md | T-33..T-38 | 10 min | | T-40 | B8 | Coolify: Projekt anlegen via coolify_action=projects_create | — | 3 min | | T-41 | B8 | Coolify: Service/Compose-Ressource erstellen via coolify_action=resources_create | T-40 | 5 min | | T-42 | B8 | Commit B8 + Push | T-41 | 2 min | | T-43 | B9 | Coolify: ENV LEOCRM_SECRET_KEY setzen via coolify_action=security_envs_update | T-41 | 2 min | | T-44 | B9 | Coolify: Domain setzen (PATCH application) | T-41 | 2 min | | T-45 | B9 | Coolify: Deploy auslösen POST /api/v1/deploy | T-44 | 3 min | | T-46 | B9 | Polling: Service running:healthy | T-45 | 3 min | | T-47 | B9 | Public-Smoke: GET https://leocrm.media-on.de/api/health → 200 | T-46 | 2 min | | T-48 | B9 | release_auditor: final audit, next-steps.md | T-47 | 5 min | | T-49 | B9 | Final-Commit + User-Report | T-48 | 3 min | ## Quality-Gates (zwischen Blocks) | Gate | Trigger | Aktion | |------|---------|--------| | G1 | B0 → B1 | project_registry.register, orchestrator_state.phase=intake | | G2 | B1 → B2 | quality_reviewer über requirements.md, design.md, tasks.md | | G3 | B2 → B3 | plan_mode_guard set mode=implementation_allowed (nach User-Approval) | | G4 | B3 → B4 | docker build OK, app startet, /api/health=200 | | G5 | B4 → B5 | 3 Auth-Tests grün, Login-HTML rendert | | G6 | B5 → B6 | 5 Company-API-Tests grün, List/Detail-HTML rendert | | G7 | B6 → B7 | 5 Contact-API-Tests grün, Cascade-Delete-Test grün | | G8 | B7 → B8 | 18 Tests grün, Runtime-Report geschrieben, plan_mode=runtime_verification_allowed | | G9 | B8 → B9 | quality_reviewer OK, plan_mode=deployment_preparation_allowed → release_handoff_allowed | | G10 | B9 → Done | release_auditor OK, /api/health public=200 | ## Parallelisierungsmöglichkeiten - B4-T-09 (api) und T-10 (html) parallelisierbar - B5-T-15 (api) und T-16 (html) parallelisierbar - B6-T-21 (api) und T-22 (html) parallelisierbar - B7: alle test_*.py parallel schreibbar - B8: alle deploy/*.md parallel schreibbar