quest'n'click 4.5.0 · r1

Construite pour quest'n'click 4.5.0, révision r1. Si elle est publiée, et laquelle est la courante, est dit par publication.json.

Feuille de route

English · Type : explication · Public : auteur, contributeur · Contexte : dépôt du moteur · Statut : prête · S'applique depuis : 4.4.0

D’où vient quest'n'click, ce qu’on a décidé de laisser dehors, ce que chaque release a laissé ouvert et où en est chacun de ces points à la 4.4.0, et ce qui vient ensuite. L’histoire complète, release par release, est le changelog et la feuille de route telle qu’elle a été écrite, conservée à blob/v4.4.0/docs/fr/ROADMAP.md.

De la v1.3 à la 4.4, en bref

La feuille de route a commencé le 3 octobre 2026 à partir d’un audit externe de la v1.2.1, intitulé « d’un moteur réactif à un moteur de monde (v1.3 → v2.0) ». Chaque release depuis y a ajouté sa section : M1 « World » à M5 « Open » (v1.3 à v2.0), v2.1 « Proof » à v2.5 « Sound », v3 « Trust » à 3.9 « Independence », 4.0 « Stable Platform », la ligne 4.1.x (4.1.0 « Clarity » à 4.1.20 « Last Mile », avec le programme 4.1.8 → 4.1.15 de la D18), la 4.2.0 « Stable World » et ses étapes 4.2.x (le Studio Server), la 4.3.0 « Hero Choice », la 4.3.1, et la 4.4.0 « Author's Desk ». Le projet s’appelait web-scumm jusqu’à la 4.2.5 (Ce qu’est quest'n'click).

Contexte : l’audit de la v1.2.1

L’audit concluait que le moteur savait produire un bon point-and-click court, mais pas confortablement un jeu de 30 à 100 salles, parce qu’il était purement réactif (tap → règle → commandes), sans simulation du monde. Ses 18 affirmations ont été vérifiées dans le code : 12 exactes, 4 partielles, 2 fausses (give / take / room ne sont pas des commandes ; les mini-jeux n’étaient pas dans le cœur, c’était déjà un registre qu’un jeu étend depuis games/<id>/index.ts). Le diagnostic principal tenait.

Le but fixé alors, et qui reste celui du projet : une personne, avec n’importe quelle IA, peut faire un jeu complet (long) avec ce moteur. Le travail est ordonné par ce qui bloque vraiment un jeu long, pas par la fidélité à Day of the Tentacle.

Ce qui était vrai en v1.2.1, et ne l’est plus : un seul hero et un seul inventaire, des acteurs rangés par salle et jamais déplacés par une commande ; aucun script autonome, aucune minuterie, aucun événement (onEnter était le seul déclencheur en dehors d’un tap) ; une scène fixe de 640 × 400 sans caméra, sans animation d’accessoire, sans événement d’image ; des sujets de conversation par salle, les embranchements par choice / if ; des sorties en hotspots avec goto, aucun graphe des salles dans validate ; une seule sauvegarde, une nouvelle version voulant dire une nouvelle partie, aucune migration ; un solveur best-first sans notion de but ni d’invariant ; pas de commande sur mesure, pas de langue, pas de voix, des réglages limités à la musique et aux sons.

Ce qu’on a gardé de l’audit, et ce qu’on a changé

Gardé : un ordonnanceur, des événements et des acteurs du monde comme premier jalon ; pas de réécriture, pas de Phaser ; un solveur par chapitres avec buts et invariants ; des sauvegardes à plusieurs emplacements avec des migrations en données ; un débogueur « pourquoi cette règle n’est pas disponible » ; des animations avec événements d’image ; une porte de sortie dont les effets sont déclarés au solveur.

Changé :

Principes de conception, à chaque jalon

  1. Tout reste des données : de nouvelles commandes dans l’union Cmd, de nouveaux champs typés sur RoomDef / GameDef, jamais de fonctions dans le contenu (sauf le registre custom, qui vit dans index.ts comme les mini-jeux).
  2. Tout est dans GameState : la position des scripts, les acteurs du monde, la caméra, pour qu’une sauvegarde reprenne exactement et que le solveur reste déterministe.
  3. Le solveur traite le temps comme un choix : « laisser le script X finir son tour » est une action du solveur, une attente vaut zéro en simulation, et une commande custom déclare ses effets.
  4. Un jalon, au plus une hausse de saveVersion, avec sa migration.
  5. Le jeu privé suit : le jeu du mainteneur embarquait une copie du moteur et était rejoué à chaque jalon. Il reste en 3.1.0 depuis la D8 ; depuis la 4.0, un jeu indépendant hors du dépôt (The Lighthouse) et les jeux fournis tiennent ce rôle.

Points ouverts : ce que chaque release a laissé, et où il en est

Chaque release a dit ce qu’elle laissait pour plus tard. Vérifié dans le code de la 4.4.0 (23 octobre 2026) : « ouvert » veut dire que le code ou les notes de release montrent que ce n’est toujours pas fait, « fait » nomme la release qui l’a fait.

Les passes humaines. Chaque release depuis la 3.4 a signalé des passes que seule une personne peut faire (un lecteur d’écran, de vrais téléphones, Safari hors ligne, des testeurs qui ne connaissent pas les énigmes, des voix enregistrées écoutées, de vraies sessions OBS et LiveSplit, de vrais connecteurs, un Bridge et un Studio Server déployés). Ouvert : les 21 passes de la fiche 4.4.0 sont toutes à faire (Stabilité et support). Ce sont elles qui font passer une surface « limitée » au stable.

La publication npm. Annoncée pour « une 4.2.x après la 4.2.0 » (D38), répétée en 4.3.0. Ouvert : les packages ne sont pas sur le registre npm (vérifié le 23 octobre 2026) ; le moteur s’installe depuis l’archive d’une release. The Lighthouse dans un dépôt public : ouvert.

Le solveur à l’échelle (v2.4, v3.3, v3.5, v3.6, 4.1.13) :

Son et voix (v2.5, v3.4) : la musique adaptative, « pas faite exprès » en v2.5, faite en 3.5 et 3.6 (le directeur musical : des pistes séparées qui suivent l’état du jeu à la mesure suivante, des transitions sur un temps, une mesure, une phrase ou un repère). Les repères de synchronisation labiale dans la table des voix : ouvert. Furnace est téléchargé par npm run audio -- setup, jamais embarqué (GPL), et la CI ne fait aucun rendu audio (les fichiers sont commités) : voulu, pas prévu.

La structure du moteur (4.1.5, 4.1.6, 4.1.8) :

Documentation (4.1.7) : un exemple par nom dans la référence de l’API : pas revérifié ; un vérificateur de liens externes : ouvert, prévu en 4.5 comme wiki -- check --network.

Connecteurs (4.1.9) : les réponses par email (aucune n’est envoyée), DKIM et SPF, STARTTLS et IDLE en IMAP (le client parle TLS dès le premier octet) : ouvert ; un plancher de couverture pour connectors/ : ouvert (la mesure de couverture porte sur src/, bridge/ et studio-server/) ; un seuil de mutation pour les connecteurs : fait (connectors-pure en 4.1.18, connectors-edge en 4.1.20).

Le Bridge (4.1.10) : la rétention sur un stockage SQL : ouvert (compact refuse un stockage SQL, « no retention yet ») ; la sécurité par ligne et par locataire dans Postgres : ouvert ; les chiffres de charge sous Postgres et une limite de débit par connecteur partagée entre instances : pas revérifiés ici ; un vrai déploiement à plusieurs instances derrière HTTPS : la passe bridge-postgres-https, ouverte.

Le rendu (4.1.11) : e2e:perf sur les deux peintres : fait (la CI le lance avec --renderer=canvas et --renderer=dom) ; l’essai WebGL : ouvert (ADR 0012 : WebGL seulement sur un gain mesuré, non mesuré) ; un vrai téléphone : la passe phone-both-renderers, ouverte.

Le langage (4.1.12) : e2e:canonical en CI : fait (depuis la 4.1.16) ; le mode démo du Studio qui écrit des objectifs : ouvert.

Speedrun (4.1.14 à 4.1.16) : un stockage SQL des runs et le montage de /v1/runs, e2e:speedrun en CI, les jeux de mutation remix et speedrun bloquants, le parcours Mystère du joueur : fait (4.1.16 et 4.1.17) ; le niveau server-witnessed : ouvert (réservé, pas implémenté) ; rejouer un ancien run avec sa propre version du moteur (le rejeu à version épinglée) : ouvert (le vérificateur répond unsupported-version) ; isoler le worker de vérification au niveau du système : ouvert (ses refus réseau sont dans le processus, « pas un bac à sable »).

Remix (4.1.15) : e2e:remix en CI, le module du défi du jour monté sur le serveur du Bridge, le monde dans l’enveloppe .wsrun, le résultat de la roue à code dans la session : fait (4.1.16) ; les cinq graines humaines : une passe humaine, ouverte ; e2e:a11y sur la roue et la fin story de la roue : pas revérifiés ici.

Le Studio hébergé (la liste de la 4.2.3, reportée en 4.3) :

La 4.0 demandait « un jeu fait par quelqu’un d’autre » : un contributeur extérieur, Horacio (LostInBrittany), a fait son jeu « Jack cherche un taf » avec le moteur et a apporté ce qu’il lui fallait (4.2.4, 4.3.0, 4.4.0) ; la « relecture par quelqu’un qui n’a pas construit le moteur » de la 4.1.0 a été faite par les lectures extérieures de la 4.3 (4.3.1, 4.4.0).

Après la 4.0 : ce qui reste sans plan

Hors plan, par décision

La liste complète de ce que le projet ne fait pas, avec les raisons : Ce que quest'n'click ne fait pas.

Ce qui vient après la 4.4

Vérification à chaque jalon

Ce que chaque jalon de la feuille de route devait passer :

  1. npm run validate && npm run solve && npm test && npm run build au vert, la CI au vert, l’audit des assets au vert.
  2. Le jeu d’exemple utilise chaque nouvelle primitive au moins une fois et le parcours de bout en bout passe par elle (captures en 844 × 390).
  3. Une sauvegarde faite avec la version précédente du jeu d’exemple se charge après migration (un test unitaire sur un JSON figé par jalon ; depuis la 3.0.0, une sauvegarde de référence par release).
  4. Le moteur copié dans le jeu privé : ses tests, son solveur et son parcours de bout en bout inchangés (jusqu’à ce que la D8 fige ce jeu en 3.1.0).
  5. Le MCP liste les outils à jour ; une nouvelle session d’IA ajoute un script ou un événement au jeu d’exemple en ne suivant que le guide du contenu.
  6. Une release taguée avec ses notes, et le tableau des releases du README mis à jour.

La liste d’aujourd’hui pour un changement : Avant une pull request.

Références


Modifier la source de cette page · Signaler une erreur