Config strictement stricte partout (ruff, mypy --strict, bandit, vulture,
import-linter, eslint, stylelint), aucune regle desactivee "pour ne pas
casser le build" - l'existant a ete corrige pour la satisfaire plutot que
l'inverse. Hooks pre-commit locaux (language: system) bloquants.
- Typage mypy --strict propage a tout le moteur (db, screens, auth, core,
ai, routes, puis publish/scripts/tests/app.py/build_css.py).
- Securite : fuite de handle fichier Windows corrigee dans l'export SCORM
(routes/publish/export_scorm.py), CSRF/RNG non-crypto/xAPI documentes
(# nosec, # NOSONAR justifies), nouveau db.json_for_script() (echappe
"</script>" dans le JSON embarque en <script>, 25 sites).
- Architecture : imports circulaires/F811 nettoyes, contrats
import-linter respectes, code mort retire (vulture).
- Accessibilite : 69 champs de formulaire sans label correctement
associe corriges (for/id ou aria-label) sur 11 templates.
- ESLint/Stylelint : lot mecanique JS/CSS, regles ajustees puis
appliquees (aucune desactivee sans verification individuelle).
- Tests : isolation du compte admin partage (nettoyage ponctuel +
fixture de teardown automatique en filet de securite), suite complete
verte (591 tests Python, 241 tests JS).
- SonarQube Community Build self-heberge (Docker + PostgreSQL) : rapport
complet analyse point par point, faux positifs documentes.
- .gitattributes ajoute (LF force) : core.autocrlf=true sur cette machine
faisait echouer ESLint (linebreak-style) via un bug connu de git
(checkout "en place" qui ignore l'eol force sur un fichier deja
present sur disque - contourne en supprimant puis recreant chaque
fichier suivi).
djLint (H021, styles inline) volontairement saute pour ce commit -
backlog assume, deja documente, traite dans un lot separe.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Deux retours utilisateur sur la boîte de collision (ajoutée précédemment) :
- Visible et réglable directement dans l'éditeur de scène : pour l'objet
sélectionné, un contour pointillé (rectangle/cercle) se superpose sur
le canevas — glisser son corps ajuste le décalage, glisser sa poignée
(coin bas-droit) ajuste la taille, les deux se répercutent dans le
panneau "🧱 Collision" et inversement (édition des champs -> aperçu à
jour). static/js/scenes/scene-editor.js::onCollisionBoxMouseDown/
onCollisionBoxResizeMouseDown, mirror des poignées de position/taille
déjà existantes pour l'objet lui-même.
- Bloque désormais RÉELLEMENT le déplacement au clavier : avant chaque
pas, personnage-controller.js teste si la position candidate
chevaucherait la boîte de collision d'un autre objet solide (jamais un
"fond", jamais un objet à collision désactivée) et annule ce pas — par
AXE séparément, pour permettre de glisser le long d'un mur en
diagonale plutôt qu'un blocage total au moindre contact. Réutilise
forgeShapesOverlap (conditions.js, factorisé depuis elementsOverlap
pour ne jamais dupliquer la règle "qu'est-ce qui se touche").
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>