Problem
Local pre-commit can be bypassed; CI is the non-bypassable gate. Without CI from day one, broken changes land on develop and main.
Proposed solution
Port .github/workflows/ci.yml jobs: Lint+Format (ruff check + ruff format --check), Type Check (mypy --strict src/ tests/), Unit tests (pytest -m "not integration"), Integration tests (placeholder until a domain DB layer exists), Coverage (pytest with --cov-fail-under=75), Architecture (lint-imports), Pre-commit (run --all-files), Frontend Build (npm run build), Frontend Quality (eslint --max-warnings 0 + prettier --check + tsc --noEmit + vitest).
Acceptance criteria
Priority rationale
Critical: this is the gate that defines the template's quality floor.
Depends on
#2, #3
Problem
Local pre-commit can be bypassed; CI is the non-bypassable gate. Without CI from day one, broken changes land on
developandmain.Proposed solution
Port
.github/workflows/ci.ymljobs: Lint+Format (ruff check+ruff format --check), Type Check (mypy --strict src/ tests/), Unit tests (pytest -m "not integration"), Integration tests (placeholder until a domain DB layer exists), Coverage (pytest with--cov-fail-under=75), Architecture (lint-imports), Pre-commit (run --all-files), Frontend Build (npm run build), Frontend Quality (eslint --max-warnings 0 + prettier --check + tsc --noEmit + vitest).Acceptance criteria
frontend/existing (skip cleanly if absent before feat: frontend scaffold (Vite + React 19.2 + TS strict, eslint flat + prettier + vitest) #21).Priority rationale
Critical: this is the gate that defines the template's quality floor.
Depends on
#2, #3