1---2name: flownote3description: FlowNote4---56# FlowNote78## Repo / stack9- `/home/y-note/flownote` ; backend `backend/` (FastAPI async, SQLAlchemy, arq+Redis, Alembic, pgvector), frontend `frontend-admin/` (React/Vite/Mantine, vitest).10- Migrations Alembic **doublées** : `alembic.ini` (→ `flownote_dev`) et `alembic_rag.ini` (→ `rag_dev`).11- Blueprint de référence : `/home/y-note/YNote_AI_Factory/AI_Software_Factory_YNote.md`.1213## Validation14- **Backend** (depuis `backend/`) : `uv run pytest -q`, `uv run ruff check .`, `uv run mypy src`. (`uv` absent de l'hôte → venv `uv` ou conteneur de dev `docker compose -f docker-compose.dev.yml`.)15- **Frontend** (depuis `frontend-admin/`) : `npx tsc --noEmit`, `npm run test`, `npm run lint -- --quiet`, `npm run check:jsx-collisions`.16- **TDD** : écrire le test, le voir échouer, puis implémenter.1718## Conventions (source : `CLAUDE.md`)19- **i18n obligatoire** : aucun texte visible en dur dans le JSX ; passer par `useTranslation()`/`t()` et ajouter la clé dans `frontend-admin/public/locales/{fr,en}/translation.json`.20- **Fixtures** : `backend/tests/conftest.py` (`db_session`, `rag_db_session`, `client`, `admin_token`, `seeded_admin`).21- **Alembic** : au déploiement, appliquer **les deux** `alembic upgrade head` (`alembic.ini` + `alembic_rag.ini`), jamais seulement flownote_dev.22- **RAG** : `rag_client_documents` (pgvector 1536) ; ingestion HMAC `POST /api/v1/rag/ingest`, lecture JWT `POST /api/v1/rag/read`.23- Ne pas dupliquer de fonctions inline anonymes sur une même clé de prop (collision Istanbul/Vitest).2425## Reporting26- Si issu d'un ticket Redmine → suivre le skill **ticket-driver** pour le reporting recette.