# Changelog - FlowDeck ## v7.3.9 (2026-10-01) — Audit : A26, A33, A34, A35, A36, A43 ### Fixed - **A26** — champ `standalone` mort supprimé (0 lecteur) ; `sqlite:////data/…` ne produit plus un chemin UNC sous Windows ; `.env.example` ne promet plus PostgreSQL (non supporté) ; **raise au boot** si `APP_SECRET_KEY` vaut encore la valeur par défaut (il signe les sessions) - **A33** — rate limit : préfixes manquants ajoutés (`/scim/v2/`, `/workspace/`, `/db/`, plus le non-GET sur `/s/` et `/f/` sans pénaliser la lecture) ; la limite vient de `settings.rate_limit_requests` (60 annoncés, 100 codés en dur) ; clé = `X-Forwarded-For` uniquement derrière un proxy local ; `_store` épuré (croissance mémoire bornée) - **A34** — helper `_spawn()` pour les 10 schedulers : exception loggée + redémarrage après 10 s (ils mouraient en silence) ; 2 `logger.debug` de scheduler passés en `warning` - **A35** — OpenAPI régénéré : 439 → **511 chemins**, `info.version 7.3.9` ; README à jour (était v6.7.0) ; compteur de `API_GUIDE_V6.md` à jour ; titre dupliqué retiré du ROADMAP - **A36** — 4 dépendances mortes purgées de `requirements.txt` (`aiosqlite`, `slowapi`, `loguru`, `packaging` = 0 import) - **A43** — 15 `datetime.utcnow()` dépréciés → `now(UTC).replace(tzinfo=None)` (format ISO naïf identique, zéro changement de comportement) ### Notes - Le drift Python (Docker/CI/README 3.12 vs venv local 3.13) reste ouvert : l'alignement à 3.13 implique un rebuild d'image à valider ## v7.3.8 (2026-10-01) — Audit : A25 (exceptions muettes) + A21 partiel ### Fixed - **A25** — 84 `except Exception: pass/…` deviennent `logger.exception(fn)` (19 fichiers, 63 dans des handlers `async`) : les échecs du pipeline d'événements/webhooks et des écritures sont enfin visibles dans les logs - **A25 (critique)** — plus de `try` autour de `materialize_properties` dans `create_collection_v2` et `apply_db_template_v2` : un échec annule la transaction au lieu de commiter une collection sans schéma - **A21 (partiel)** — `PRAGMA busy_timeout=5000` dans `get_conn()` (le seul point d'entrée des connexions) ; le wrapper async + les 510 call sites synchrones sur l'event loop restent à migrer ### Tests - `test_collection_rollback_when_materialize_fails` → suite **1028/1028** ## v7.3.7 (2026-09-30) — Audit sécurité : A14 (fallback admin agent) ### Fixed - **A14** — `_current_user_id` et `_current_admin` ne retombent plus sur la row `admin` : 401 sans session (les 24 sites de `_current_user_id` + `PATCH/POST /api/agent/providers`) — un anonymous ne pouvait plus orienter le `ping()` du serveur vers un `api_base` interne - `_check_api_base()` sur les 2 routes provider : scheme `http(s)` obligatoire, identifiants dans l'URL refusés (400). Les hôtes privés restent acceptés — le provider par défaut du produit est Ollama `http://localhost:11434/v1` ( commentaire `ponytail:` : fermeture possible via allowlist provider local) - Test `test_agent_providers_require_admin_and_valid_api_base` → suite **1027/1027** ## v7.3.6 (2026-09-30) — Audit sécurité : A19 terminé (aucun préfixe cookie-auth exempt) ### Fixed - **A19 (fin)** — les 46 appels non-GET restants des 5 derniers préfixes (`/api/agent`, `/api/settings`, `/api/local-workspace`, `/api/gitea`, `/api/workspace` + `/api/workspaces`) reçoivent `X-CSRF-Token` (expression cookie en ligne, portée indifférente fonction/Alpine/attribut) ; les 5 préfixes sortent d'`EXCLUDED_PATHS` - Vérification syntaxe : les `