Le workflow CI lancait `doctrine:schema:update --force` (ajoute par ERP-67
pour aligner sur le mapping ORM avant `app:apply-column-comments`) sans
recreer ensuite l'index partiel `uq_category_name_type_active`. Doctrine
ORM 3 ne sait pas exprimer un index fonctionnel + partiel (LOWER(name)
WHERE deleted_at IS NULL), le considere donc comme orphelin et le DROP
silencieusement. Resultat en CI : les tests RG-1.07 (CategoryUniqueTest)
attendent 409 sur un doublon (name, type) mais recoivent 201 car la
contrainte SQL n'existe plus.
La cible `make test-db-setup` (ligne 222 du makefile) recreait deja l'index
via `dbal:run-sql` ; on aligne le workflow CI sur le meme pas, et on ajoute
un commentaire pointant vers la cause-racine pour eviter le drift au
prochain refactor du workflow.
- Migration retrofit Version20260528120000 : pose COMMENT ON TABLE/COLUMN sur
les 11 tables metier existantes (53 colonnes) via le catalogue partage
ColumnCommentsCatalog (Shared/Infrastructure/Database).
- Commande app:apply-column-comments : rejoue le catalogue apres
doctrine:schema:update --force (sinon l'ORM drop les commentaires absents
du mapping PHP). Branchee dans makefile test-db-setup et workflow CI Gitea.
- Test architecture tests/Architecture/ColumnsHaveSqlCommentTest : echoue si
une colonne public n'a pas de col_description (hors doctrine_migration_versions
et fake_site_aware_entity). Whitelist metier vide.
- Convention documentee dans CLAUDE.md (regle ABSOLUE n°12) et
.claude/rules/backend.md (section Migrations Doctrine) avec exemples et
helper standardise pour les colonnes Timestampable/Blamable.