Skip to content

Promotion env/staging → main (#458, #459) - #460

Merged
Oasis35 merged 27 commits into
mainfrom
env/staging
Oct 29, 2026
Merged

Oasis35 merged 27 commits into
mainfrom
env/staging

Conversation

@Oasis35

@Oasis35 Oasis35 commented Oct 29, 2026

Copy link
Copy Markdown
Owner

Requested by Clément · project thread

Contenu

PR mergées dans env/staging depuis la dernière promotion (#457) :

Migration EF

  • 20261028162254_DropPlayerDeletedAt : supprime la colonne players.players.deleted_at. Appliquée par --migrate-only dans deploy.sh, rien à faire à la main. Suppression de colonne non réversible sans perte, mais 0 ligne renseignée en prod (vérifié par Clément le 28/10).

Déploiement

  • Aucun changement d'API publique, de réglage ni de configuration de prod.
  • deploy/ : seulement des commentaires (scripts identiques à l'exécution). Rien à redéployer à la main côté deploy/infra ou deploy/caddy.

Au merge

  • Merge commit, jamais squash.
  • Vérifier ensuite qu'env/staging existe toujours.

Generated by Claude Code

Hooks (.claude/hooks, branchés dans .claude/settings.json) :
- protected-branches : pas de commit ni de push direct sur main ou env/staging
- commit-identity : author et committer = Clément, aucune ligne Co-Authored-By
- lint-before-commit : git diff --check, dotnet format whitespace, npm run lint:arch
- no-em-dash : aucun tiret cadratin dans ce que Claude écrit
- grafana-reminder : rappel quand un texte lu par un tableau Grafana disparaît

Sous-agents (.claude/agents) : relecteur-pr, gardien-code (architecture
et SOLID), gardien-da, gardien-rgpd.

Tests : node --test .claude/hooks/tests/hooks.test.mjs (25 tests).
EfCatalogueQueries.cs reformaté (seul fichier du back que dotnet format
whitespace signalait). CLAUDE.md et .gitignore à jour.
Comme en prod et au staging : le journal d'un shard E2E faisait environ
29 000 lignes de SQL, et l'erreur utile s'y perdait.
Play/, Stats/, Archive/, Admin/ et Jobs/ ; le transverse (options, règles,
erreurs, réponses, métriques, ports de lecture) reste à la racine. L'espace
de noms ne change pas : le code Wolverine généré est identique.
Le store (écritures, agrégats suivis) est dans Domain, les ports de lecture
(I…Queries, IDailyTrackUsage, IRunAccess) dans Application, les politiques
du domaine dans Domain. Vérifiée sur tous les modules : aucun port ne fait
exception.
Pages, fenêtres et composants de admin, account, gameplay, daily/feature et
runs/feature passent chacun dans un dossier à leur nom, avec leur .html,
.scss et .spec.ts. L'admin range ses composants par onglet (dashboard,
challenges, pool, players, actions), sous le même nom dans feature et ui.
account/testing/dom.ts rejoint account/feature/testing, seule couche qui
s'en sert. Déplacements par git mv et imports corrigés, sans changement
de comportement.
…routes

app.config.ts importait les jetons d'adresse des clients Daily, Catalogue
et Admin, ce qui embarquait les fichiers générés entiers au démarrage
(501,35 kB pour un budget de 500 kB). Seul Players reste à la racine.

- provideDailyApi() fournit adresse, DailyClient et DailyApi sur une route
  parente de DAILY_ROUTES (garde de l'archive comprise) ;
- provideAdminApi() regroupe les clients admin, catalogue, daily et runs,
  leurs adresses, JOBS_DASHBOARD_URL et les adaptateurs, sur ADMIN_ROUTES
  (remplace catalogue.providers et admin-runs-api.providers) ;
- provideGameplay() redonne CatalogueClient avec son adresse ;
- les clients sont redonnés avec leur jeton : un client généré pris à la
  racine n'y trouverait pas l'adresse et appellerait le domaine du front ;
- les adaptateurs passent en @Injectable() sans providedIn : hors de leur
  route, ils lèvent « No provider » au lieu d'utiliser un client sans adresse.

Bundle initial : 501,35 kB -> 464,77 kB (budget inchangé).
…hread-y8y30y

# Conflicts:
#	src/front/InSeconds.Client/src/app/admin/feature/actions/actions.page.spec.ts
#	src/front/InSeconds.Client/src/app/admin/feature/admin.routes.ts
#	src/front/InSeconds.Client/src/app/daily/feature/daily.routes.ts
…dit au dossier Infrastructure de dépendre des modules

Le cookie du joueur, sa validation, la pose du cookie, la télémétrie du joueur, les origines de confiance du lien magique et la reprise des anciens cookies quittent Infrastructure/Auth pour Modules/Players/Auth. Restent transverses : DataProtectionSetup et les noms de policy et de rôle (AuthorizationPolicies, Roles).

Nouveau test d'architecture InfrastructureDependencyTests : InSeconds.Api.Infrastructure ne dépend d'aucun module, sauf la composition et les points d'entrée nommés (ApiComposition, WolverineSetup, PlayerDataCommand, FreezeDayStatsCommand). Code Wolverine régénéré.
…té, genres de l'album)

- Tests OpenAPI : base OpenApiDocumentTests (document sauvegardé à jour, aucun document en prod, lectures du document), les cinq classes n'y ajoutent que leurs vérifications.
- UniqueViolationExceptionHandler (Infrastructure/Persistence) : la reconnaissance d'une violation d'unicité PostgreSQL et l'écriture du 409, partagées par TrackConflictExceptionHandler et AccountConflictExceptionHandler.
- TrackMapping.RecordAlbumGenresAsync : les genres de l'album lu, communs à l'ajout et à l'actualisation d'un morceau.
Un joueur effacé disparaît pour de bon (AccountErasure) : la suppression
logique n'était plus posée par le code. Retire Player.DeletedAt, ses
filtres dans Players (requêtes, sessions, annuaire, AccountLookup et
AccountUnavailable) et la jointure SQL de Daily sur players.players :
les statistiques lisent daily.sessions en LINQ (ChallengeAnswers).

Tests : les joueurs « supprimés » des tests Daily passent par le vrai
effacement (GameApi.ErasePlayerAsync) ; les trois tests Players qui
posaient deleted_at à la main sont retirés, leurs cas étant couverts par
PlayerDataTests et les tests de jeton ou de cookie inconnus.

Migration DropPlayerDeletedAt.
Les quatre toasts de série (invité, série perdue, gel utilisé, gel gagné)
répétaient le même cadre en style en ligne : il passe dans
<app-toast-frame>, avec le liseré orange (série) ou cyan (gel) en entrée
et l'animation d'entrée propre à chaque toast. Opacité du fond unifiée à
0,94 (le toast invité était à 0,92), styles en ligne remplacés par des
classes Tailwind à variables.
appButton gagne la taille lg (60 px, bouton principal d'un écran), la variante
neutral (contour --border-neutral) et l'option glow ; une seule valeur par
propriété, celle du bouton principal de l'accueil (hauteur par taille,
capitales à 0,06 em, enfoncement à 95 %). Les 15 composants du jeu du jour, du
gameplay et de Platines qui recopiaient ses classes l'utilisent désormais.
Erreur de lecture : Réessayer et Passer l'un sous l'autre.
… d'étapes de la refonte

Back (code, tests, props), E2E, config Playwright et Sheriff, deploy/ et .github/ : chaque commentaire garde sa raison technique sans référence historique. Code des anciens cookies décrit comme tel. Identifiants, titres de tests, messages de journal et valeurs (version OpenAPI, nom de projet Compose) inchangés.

Doc : dernier merge env/staging vers main (#450, 28/10/2026), src/back/CLAUDE.md sans renvois R/§, découpage en PR du proto 1 Platines déplacé dans docs/historique/runs-proto1-decoupage.md (plan.md garde la feuille de route).
…à S16 définies

src/ du front (hors clients générés) et src/front/CLAUDE.md : plus de v1/v2, de renvois au plan ni d'étapes ; la valeur v2-launch reste, expliquée comme clé historique lue par l'app. Titres E2E et Vitest qui citaient la v1 ou la v2 renommés (le découpage E2E ne lit que les noms de fichiers).

src/back/CLAUDE.md : section « Règles de sécurité (S1 à S16) », une ligne par code utilisé, pour que les tests S1_…, S11_… et le test de fumée ne renvoient plus à un document d'archive.
Nettoyage du code : bundle, deleted_at, rangement, boutons, commentaires au présent
@Oasis35 Oasis35 self-assigned this Oct 29, 2026
@sonarqubecloud

Copy link
Copy Markdown

@Oasis35
Oasis35 merged commit 5ea0486 into main Oct 29, 2026
14 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant