feat(game): model qualifications, eliminations and tie-breaks (#7) #31

Merged
Reliodas merged 1 commit from feat/7-qualifications-eliminations into develop 2026-06-24 02:55:42 +00:00
Owner

Closes #7.

Le serveur (et non le client) décide désormais des qualifications, éliminations et égalités.

Changements

  • Format 6–12 : room:join refuse un candidat au-delà de CANDIDATES_MAX.
  • Qualifiés manche 2 configurables par le MJ : nouvelle action set-round2-qualifiers (entier borné [3, 12]), diffusée via round2Qualifiers, défaut 6, clampée au nombre de candidats à l'application.
  • Coupures serveur (qualification.ts) : manche 1 → 2 garde le quota configuré ; manche 2 → finale garde FINALIST_COUNT (3). Les non-qualifiés passent eliminated = true et deviennent spectateurs (exclus de la manche suivante).
  • Départage déterministe (pas de barrage) : coupure manche 1 par ordre d'arrivée ; coupure finale par score manche 1, puis rang du déchiffrage, puis ordre d'arrivée → quota toujours exact.
  • game:eliminate manuel pose aussi le drapeau eliminated ; eliminated exposé dans PlayerSummary.

Décision produit

Le départage est automatique et déterministe (validé avec le mainteneur), remplaçant la notion de « barrage » de la doc. docs/Regles.md et docs/Implémentation.md mises à jour.

Tests

  • Unitaires qualification.test.ts : coupures, seuil inclusif → exact, départages par ordre d'arrivée et rang codebreaker.
  • Intégration Socket.IO : plafond de candidats, configuration des qualifiés (valeur hors borne rejetée).
  • Suites complètes vertes : node:test 134/1 skip, Jest 13, Vitest 42 ; couverture serveur/clients au-dessus des planchers (qualification.ts 100 %) ; typecheck + builds OK.

Critères d'acceptation

  • Définir le nombre de qualifiés pour chaque manche
  • Enregistrer explicitement qualifié/éliminé
  • Implémenter une règle de départage
  • Empêcher un non-qualifié de participer à la manche suivante
  • Afficher les décisions serveur sur tous les clients (champ eliminated/round2Qualifiers diffusé ; surfaçage visuel enrichi en #12)
  • Couvrir les égalités et cas limites par des tests

🤖 Generated with Claude Code

Closes #7. Le serveur (et non le client) décide désormais des qualifications, éliminations et égalités. ## Changements - **Format 6–12** : `room:join` refuse un candidat au-delà de `CANDIDATES_MAX`. - **Qualifiés manche 2 configurables par le MJ** : nouvelle action `set-round2-qualifiers` (entier borné `[3, 12]`), diffusée via `round2Qualifiers`, défaut 6, clampée au nombre de candidats à l'application. - **Coupures serveur** (`qualification.ts`) : manche 1 → 2 garde le quota configuré ; manche 2 → finale garde `FINALIST_COUNT` (3). Les non-qualifiés passent `eliminated = true` et deviennent spectateurs (exclus de la manche suivante). - **Départage déterministe (pas de barrage)** : coupure manche 1 par ordre d'arrivée ; coupure finale par score manche 1, puis rang du déchiffrage, puis ordre d'arrivée → quota toujours exact. - `game:eliminate` manuel pose aussi le drapeau `eliminated` ; `eliminated` exposé dans `PlayerSummary`. ## Décision produit Le départage est **automatique et déterministe** (validé avec le mainteneur), remplaçant la notion de « barrage » de la doc. `docs/Regles.md` et `docs/Implémentation.md` mises à jour. ## Tests - Unitaires `qualification.test.ts` : coupures, seuil inclusif → exact, départages par ordre d'arrivée et rang codebreaker. - Intégration Socket.IO : plafond de candidats, configuration des qualifiés (valeur hors borne rejetée). - Suites complètes vertes : node:test 134/1 skip, Jest 13, Vitest 42 ; couverture serveur/clients au-dessus des planchers (qualification.ts 100 %) ; typecheck + builds OK. ## Critères d'acceptation - [x] Définir le nombre de qualifiés pour chaque manche - [x] Enregistrer explicitement qualifié/éliminé - [x] Implémenter une règle de départage - [x] Empêcher un non-qualifié de participer à la manche suivante - [x] Afficher les décisions serveur sur tous les clients (champ `eliminated`/`round2Qualifiers` diffusé ; surfaçage visuel enrichi en #12) - [x] Couvrir les égalités et cas limites par des tests 🤖 Generated with [Claude Code](https://claude.com/claude-code)
feat(game): model qualifications, eliminations and tie-breaks
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful
ci/woodpecker/pr/woodpecker Pipeline was successful
ci/woodpecker/pull_request_closed/woodpecker Pipeline was successful
b1790f4123
Make the server, not the client, decide who advances between rounds (#7).

- Enforce the 6-12 candidate format: room:join refuses a candidate past
  CANDIDATES_MAX.
- Host-configurable second-round qualifiers via a new set-round2-qualifiers
  action, bounded to [ROUND2_MIN_QUALIFIERS, CANDIDATES_MAX] and broadcast as
  round2Qualifiers; clamped to the candidate count when applied.
- New qualification module performs the cuts: round 1 -> round 2 keeps the
  configured top scorers, round 2 -> final keeps FINALIST_COUNT. Non-qualified
  players are flagged eliminated and become spectators, excluding them from the
  next round.
- Deterministic tie-break (no barrage): round-1 cut breaks ties by join order;
  the final cut breaks ties by round-1 score, then codebreaker rank, then join
  order, so the quota stays exact.
- Manual game:eliminate now also sets the eliminated flag; eliminated is exposed
  in PlayerSummary.

Add unit tests for the cut/tie-break logic and integration tests for the
candidate cap and qualifier configuration. Update Regles.md and
Implémentation.md.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Reliodas merged commit d3ba948688 into develop 2026-06-24 02:55:42 +00:00
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference: jeux/le-grand-concours#31
No description provided.