Skip to content

feat(reserve): mémoire des essais, les briques déjà essayées passent en fin de réserve - #94

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

Lunik merged 4 commits into
developfrom
claude/game-engagement-retention-lyk0n0-memoire

Conversation

@Lunik

@Lunik Lunik commented Oct 23, 2026

Copy link
Copy Markdown
Contributor

Closes #89. Piste 1 de la page de travail pistes-retention.html (EtymoLogique/Design#51).

⚠️ Écart avec l’ADR 0027 et le modèle de données (§ 7), qui disent que les propositions de fusion ne sont jamais stockées. Le propriétaire a accepté la piste, oubli à chaque parution compris, mais l’ADR reste à écrire dans Design avant de sortir du brouillon.

API (rétrocompatible)

  • Migration essai : joueur_id, gauche, droite, fascicule_juge. Ni issue, ni date, ni texte du catalogue. Un test vérifie la liste des colonnes.
  • POST /fusion : progression::noter_essai note un échec ou un « presque » quand le joueur connaît les deux briques.
    • Plafond : 3 000 lignes par joueur.
    • Ni ligne commande, ni changement de version_etat : rejoué, l’essai ne fait rien (ON CONFLICT DO NOTHING).
    • La transaction n’est validée que dans ce cas ; les autres propositions sont toujours annulées.
  • Oubli à la parution : un essai garde le dernier fascicule paru au moment où il est fait.
    • Les lignes d’un fascicule plus ancien ne se lisent plus.
    • Elles s’effacent toutes ensemble à l’essai suivant. Un oubli paire par paire désignerait les familles du nouveau fascicule.
  • Etat.essais : les paires { gauche, droite }, triées, avec #[serde(default)].
  • Export et réinitialisation incluent la table. La suppression de la partie l’efface par ON DELETE CASCADE.
  • contrat/openapi.json, web/src/contrat/api.d.ts et .sqlx/ sont régénérés.

PWA

  • raisonEssai(paire, …) (services/jeu.ts) dit pourquoi une paire est déjà connue du joueur :
    • « au codex » : déduit de prevoir, sans rien demander au serveur ;
    • « presque : inversez » ou « aucune recette » : seulement si le serveur a noté cet essai, dans cet ordre de cases ;
    • rien dans les autres cas : une paire jamais essayée ne dit rien.
  • Réserve : quand une brique est sur la table et qu’une case reste libre, les briques déjà essayées avec elle passent en fin de liste, sous « Déjà essayées avec géo- · 3 ».
    • Elles sont grisées : fond Sable, libellé en Encre secondaire, sans ombre.
    • Leur ligne de sens dit pourquoi.
    • Elles restent posables, puisque se tromper ne coûte rien.
  • Animation : les briques glissent vers leur nouvelle place (240 ms) quand la liste se réordonne. Rien sous le mouvement réduit.
  • Roadmap : une ligne ajoutée au jalon J1.

Vérifications

  • cargo fmt --check, cargo clippy -D warnings, cargo test --workspace et cargo sqlx prepare --check : OK.
    • 4 nouveaux tests d’intégration :
      • un échec et un « presque » sont notés ; une découverte, une exclusion et une paire avec une brique absente de la réserve ne le sont pas ;
      • un essai rejoué ne se note qu’une fois ;
      • une parution oublie tout ;
      • le plafond tient.
    • Le test « les essais ratés ne coûtent rien » reste vrai pour tout le reste de l’état.
  • npm run lint, npm run typecheck et npm test : OK. Seul reste l’avertissement de Plis.tsx, qui existait avant cette PR.
  • check_identity sur styles.css : 0 erreur, 0 avertissement.
  • Recette locale (API, PostgreSQL, catalogue d’essai) :
    • un échec « anthropologie + neuro- », puis « anthropologie » posée seule ;
    • la réserve range « neuro- » en fin de liste avec « aucune recette », en atelier et en nocturne ;
    • aucune erreur dans la console.

Generated by Claude Code

…reserve

POST /fusion now notes a failure or a "presque" in a new `essai` table
(player, left brick, right brick, last published fascicule; no outcome,
no date, no catalogue text) when the player knows both bricks, capped at
3,000 rows, without a command row nor a state version bump. Rows judged
under an older fascicule are no longer read and are wiped at the next
note: a release forgets every pair at once. `Etat.essais` (serde default)
carries them; export and reset include them.

With one brick on the table, the reserve sheet moves the bricks already
tried with it, in that order, to the end of the list under "Déjà essayées
avec …", greyed but still playable, each saying why: "aucune recette",
"presque : inversez" or "au codex" (deduced from the fusion rule). The
reordering slides over 240 ms, nothing under reduced motion.

This departs from ADR 0027 / data model §7 ("fusion proposals are never
stored"): an ADR is due in the design repository.

Closes #89

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

Les jobs « API et tâches (Rust) » et « PWA (TypeScript) » échouent, mais pas à cause de cette PR. Tout le reste passe, y compris les tests, la vérification de .sqlx et celle du contrat. 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.

J’ai ajouté à cette branche le commit fix(deps), qui ne change que les fichiers de verrouillage. Il est identique sur #92, #93 et #95.


Generated by Claude Code

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

# Conflicts:
#	web/src/App.tsx
…udit

New advisories (GHSA-4qv8-2p9j-2685 and others) turn npm audit red on
develop too; lockfile-only update to the patched versions.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0151stDRaZV3ScbhwvwjrfQ7
@Lunik
Lunik merged commit 6576e43 into develop Oct 24, 2026
3 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.

2 participants