Skip to content

feat(quetes): quêtes de collection par fascicule - #95

Merged
Lunik merged 3 commits into
developfrom
claude/game-engagement-retention-lyk0n0-collection
Oct 24, 2026
Merged

Lunik merged 3 commits into
developfrom
claude/game-engagement-retention-lyk0n0-collection

Conversation

@Lunik

@Lunik Lunik commented Oct 23, 2026

Copy link
Copy Markdown
Contributor

Closes #90. Piste 2 de pistes-retention.html (EtymoLogique/Design#51).

Les données viennent de EtymoLogique/Content#39. Le champ collections du manifeste a une valeur par défaut : cette PR fonctionne aussi avec un catalogue qui n’en déclare pas encore.

Ce qui change

  • Domaine (quete.rs) :
    • CritereCollection, en liste fermée : préfixes, suffixes, mots communs, peu communs, rares ;
    • Collection : identifiant de palier, critère, encre, sabliers, membres ;
    • progression : les membres au codex, mots découverts et briques connues ; total.
  • Catalogue : Manifeste.collections (avec #[serde(default)]) et Jeu.collections, par fascicule. Jeu::depuis passe par une petite fonction completer pour rester sous la limite de longueur de Clippy.
  • API :
    • Etat.progression_collections (palier_id, fascicule_id, progression, total, avec #[serde(default)]) : uniquement pour les fascicules débloqués, donc aucun total d’un fascicule verrouillé (ADR 0069).
    • POST /palier récupère aussi une collection complète, par la table palier_recupere existante :
      • 403 si le fascicule est verrouillé ou la collection incomplète ;
      • 409 si elle est déjà récupérée ;
      • transaction, idempotence et encre et sabliers crédités côté serveur, comme pour un palier.
  • PWA :
    • quetesDeCollection lit la progression du serveur et les récompenses du manifeste. Une collection récupérable compte dans recompensesARecuperer.
    • Onglet Quêtes › Fascicules : un bloc « Collection » sous les jalons de chaque fascicule débloqué. Il reprend CartePalier, avec l’intitulé de la quête (« Tous les préfixes ») à la place du seuil.
    • Pastilles de l’onglet et du sélecteur de fascicules : elles comptent aussi les collections à récupérer.
  • openapi.json, api.d.ts et .sqlx/ sont régénérés. Le catalogue d’essai déclare deux collections.
  • Roadmap : une ligne ajoutée à la section « Quêtes et récompenses à récupérer ».

Ce qui reste (noté dans la roadmap)

  • ADR « Quêtes de collection par fascicule » : à écrire dans Design. La rareté est retenue plutôt que la difficulté, comme le demande l’issue.
  • Briques reprises d’un fascicule précédent : le filtre du codex par fascicule ne les montre pas encore.
  • Correctif du 3ᵉ jalon, qui compte les mots légendaires : pas fait ici. La recette locale le montre bien : Rosette demande 50 découvertes, alors que ses mots visibles sont moins nombreux. Il demande aussi de corriger les seuils dans Content ; une PR séparée est préférable.

Vérifications

  • cargo fmt --check, cargo clippy -D warnings, cargo test --workspace et cargo sqlx prepare --check : OK.
    • Nouveaux tests : un test du domaine et deux tests d’intégration.
    • Le premier vérifie qu’une collection n’est pas récupérable (403) tant qu’elle est incomplète, puis qu’elle donne 20 gouttes et 1 sablier une fois complète, et 409 la deuxième fois.
    • Le second vérifie qu’un fascicule verrouillé n’expose aucun total.
  • npm run lint, npm run typecheck et npm test : OK, dont 3 nouveaux tests du service. Seul reste l’avertissement de Plis.tsx, qui existait avant cette PR.
  • check_identity sur quetes.css : 0 erreur, 0 avertissement.
  • Recette locale avec le catalogue compilé depuis Content#39, sur un joueur qui a trouvé 46 mots de Rosette :
    • Rosette affiche « Tous les préfixes » complet, et sa récupération crédite 20 gouttes et 1 sablier ;
    • Argile affiche ses 5 quêtes, dont « Tous les mots rares 0 / 3 » ;
    • les fascicules verrouillés n’affichent que leur condition ;
    • téléphone à 390 px et ordinateur à 1440 px, en atelier et en nocturne : pas de débordement, aucune erreur dans la console.

Generated by Claude Code

The manifest may now carry `collections` (Content, App#90): all the
fascicule's prefixes, all its suffixes, all its common, uncommon or
rare words, with their members (never a legendary) and an ink and
hourglass reward.

The server counts each one on the codex and returns
`Etat.progression_collections` (serde default) for unlocked fascicules
only, so a locked fascicule exposes no total (ADR 0069). POST /palier
claims a completed collection like a long-running quest palier, through
`palier_recupere`: 403 when locked or incomplete, 409 when claimed.

The Quêtes › Fascicules tab shows a "Collection" block under each
unlocked fascicule's jalons, reusing CartePalier with the quest title in
place of the threshold; claimable ones count in the tab and nav badges.

Closes #90

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0151stDRaZV3ScbhwvwjrfQ7
…udits

cargo audit flagged RUSTSEC-2026-0381/0382/0383/0385 and npm audit a high
advisory on vite 8.3.1 (and moderate ones on vitest): lockfile-only
updates to the patched versions.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0151stDRaZV3ScbhwvwjrfQ7
(cherry picked from commit a140f55df0d3ce823acc6ff6d9534bce30e72ab8)

Lunik commented Oct 23, 2026

Copy link
Copy Markdown
Contributor Author

L’échec de « API et tâches (Rust) » et « PWA (TypeScript) » sur 1aad0bb ne vient pas de cette PR. Seuls les audits de dépendances échouent, et develop est touché de la même façon :

  • cargo audit remonte RUSTSEC-2026-0381, 0382, 0383 et 0385 ;
  • npm audit remonte une alerte élevée sur vite 8.3.1.

Le commit d795b6f (fix(deps), qui ne change que les fichiers de verrouillage) est déjà poussé sur cette branche ; c’est le même que sur #92, #93 et #94. Sa CI est en cours.


Generated by Claude Code

@Lunik
Lunik marked this pull request as ready for review October 24, 2026 14:09
…ment-retention-lyk0n0-collection

# Conflicts:
#	crates/api/src/progression.rs
#	crates/contrat/src/lib.rs
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.

2 participants