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.

Vérifier son jeu

English · Type : procédure · Public : auteur · Contexte : dépôt du moteur, projet créé · Statut : prête · S'applique depuis : 4.3.0

Quatre commandes disent l'essentiel de ce qui ne va pas dans un jeu avant que quiconque y joue : validate vérifie le contenu, solve trouve un chemin jusqu'à la fin, lint lit le graphe de puzzles pour y trouver ce qui ferait trébucher un joueur, et solve --prove prouve qu'aucun joueur ne peut rester bloqué. Ensuite, le jeu est joué pour de vrai : par un parcours scripté, dans un navigateur, sur un téléphone, et par une personne.

Ce que vous obtenez

Un jeu dont toutes les références existent, qui se finit depuis « Nouvelle partie », dont les blocages sont exclus par une preuve exhaustive, et dont vous avez lu les avertissements restants pour les corriger ou les garder exprès. Pour finir, la liste Avant de partager le lien.

Contexte et versions

Prérequis

Où lancer les commandes

Sur votre machine, à la racine du dossier :

VérificationDépôt du moteurProjet créé
Le contenunpm run validatenpx quest-n-click validate
Un chemin jusqu'à la finnpm run solvenpx quest-n-click solve
Ce qui ferait trébucher un joueurnpm run lintnpx quest-n-click lint
Aucun blocagenpm run solve -- --provenpx quest-n-click solve --prove
Tous les garde-fous du jeunpm run verify:gamenpm run verify
Les garde-fous exhaustifsnpm run prove:gameinclus dans npm run release

Dans le dépôt du moteur, les options viennent après -- (npm run solve -- --prove) ; avec npx quest-n-click, elles suivent directement la sous-commande.

Étapes

  1. Validez le contenu.

    # dans le dépôt du moteur
    npm run validate
    # dans un projet créé
    npx quest-n-click validate
    

    Tout ce qui est référencé existe, chaque chose visible a sa ligne Regarder, les textes ne sont ni vides ni trop longs, les flags sont posés et lus. Code 1 sur une erreur. Ce qu'il vérifie est listé dans Ce que regarde chaque vérification.

  1. Trouvez un chemin jusqu'à la fin.

    # dans le dépôt du moteur
    npm run solve
    # dans un projet créé
    npx quest-n-click solve
    

    Il affiche ✔ The game can be finished, le chemin, et trois alertes à lire : impasses, objets obtenus mais jamais utilisés, objets jamais obtenus (les alertes). Un chemin gagnant n'est pas une preuve.

  1. Passez le lint sur le contenu.

    # dans le dépôt du moteur
    npm run lint
    # dans un projet créé
    npx quest-n-click lint
    

    Des conditions que rien ne peut satisfaire, des règles qu'une autre cache, des fausses pistes, des indices qui ne peuvent pas se déclencher, des actions que le solveur n'a jamais jouées. Corrigez chaque remarque, ou gardez-la exprès dans game.ts (lint.ignore, plus bas).

  1. Prouvez qu'il n'y a aucun blocage.

    # dans le dépôt du moteur : la preuve globale, la preuve par chapitres, chaque monde Reality
    npm run prove:game
    # dans un projet créé
    npx quest-n-click solve --prove
    

    Seul un solved obtenu avec --prove exclut les blocages. Un résultat truncated ne prouve rien : augmentez le budget (Options du solveur).

  1. Jouez-y pour de vrai. Un parcours scripté et l'e2e dans le navigateur (Prouver que ça se joue), un vrai téléphone en paysage (Tester sur un téléphone en réseau local), puis une personne qui n'a jamais vu le jeu (Playtests).
  1. Parcourez la liste Avant de partager le lien.

Ce que regarde chaque vérification

Garder une remarque exprès. Une fausse piste voulue, ou un flag décoratif (posé, jamais lu), se fait taire dans game.ts ; la même liste retire flag-never-read:<flag> des avertissements de validate :

lint: { ignore: ['item-red-herring:rubber_chicken', 'rule-shadowed:house/on[4]'] },   // un code, `code:<id>` ou `code:<lieu>/<chemin>`

ui.shareSession nomme la ligne du menu pause qui envoie un playtest depuis un téléphone (Playtests).

Commandes

Chaque commande ci-dessous se lance dans le dépôt du moteur avec npm run. La deuxième colonne donne l'équivalent dans un projet créé quand il existe ; « — » veut dire que le projet créé n'en a pas.

Le contenu du jeu

Dépôt du moteurProjet crééCe qu'elle fait
npm run validatenpx quest-n-click validateRéférences cassées, textes vides ou trop longs, Regarder manquants, flags jamais posés ou jamais lus. Code 1 sur une erreur.
npm run validate -- --reportnpx quest-n-click validate --reportLe profileur de contenu (Markdown) : lieux, objets, personnages, ce qui est maigre.
npm run validate -- --releasenpx quest-n-click validate --releaseAussi la provenance, les placeholders, et un id stable sur chaque ligne d'un jeu livré dans une autre langue que la sienne ou doublé.
npm run validate -- --commercial --errorsnpx quest-n-click validate --commercial --errorsUne release qu'on peut vendre : aucune exception, aucun placeholder, aucune licence non commerciale, chaque source vérifiable ; --errors n'affiche que les erreurs.
npm run solve …npx quest-n-click solve …Le solveur : Options du solveur.
npm run lint [-- --prove | --static | --json]npx quest-n-click lint …Le lint du contenu, plus haut. lint:content est la même commande (alias depuis la 4.1.0).
npm run i18n -- extract [--lang xx]npx quest-n-click i18n extract …Les tables de traduction (locales/<xx>.json) ; status pour la couverture. Traductions.
npm run playtests …npx quest-n-click playtests …Les sessions des joueurs rejouées et résumées : Playtests.
npm run page:world—La carte du monde en page : sorties, gotos, lieux inatteignables, source DOT.
npm run page:puzzles—Le graphe de puzzles en page : ce dont chaque règle a besoin et ce qu'elle change, une carte par objet et par flag.
npm run replay -- session.json— (l'onglet Play du Studio)Une session jouée sur le vrai moteur : Les sessions.

Les garde-fous du jeu

Dépôt du moteurProjet crééCe qu'elle fait
npm run verify:gamenpm run verifyDépôt du moteur : validate, le témoin, le témoin par chapitres, les variantes (verify:variants), l'état des traductions, le lint, les playtests. Projet créé : validate, solve, i18n status, lint, playtests.
npm run prove:game— (npm run release lance solve --prove et solve-reality)La preuve globale, la preuve par chapitres et chaque monde Reality ; échoue sur un blocage ou une troncature.
npm run build:gamenpm run buildLes garde-fous du jeu, le bundle, verify:dist, puis (dépôt du moteur) le contrôle des spoilers et l'audit des assets. Pas de vérification de types, pas de suite unitaire.
npm run buildnpm run buildDépôt du moteur : check (types et tests Node), puis build:game.
npm run verify:releaseinclus dans npm run releasevalidate --release, weight --release, i18n status, voices check --release, playtests stricts.
npm run verify:commercialnpm run release -- --commercialverify:release, puis aucune exception, aucun placeholder, aucune licence NC ou ND, chaque source vérifiable, puis verify:dist.
npm run verify:distinclus dans buildChaque fichier de dist/ justifié : code, assets verrouillés (leurs octets relus), données nommées, polices, icônes, licenses/.
npm run verify:field—verify:commercial, puis les quotas de playtests d'une version testée par des joueurs (pas une étape de release-check, D12).
npm run provenance [-- --lock]npx quest-n-click provenance [--lock]Les assets livrés par licence, ce qui a changé depuis le verrou relu ; --lock enregistre les fichiers après une relecture. Provenance des assets.
npm run weight [-- --release --json --stems]npx quest-n-click weight …Ce qu'un téléphone télécharge avant le premier lieu, par lieu et par chapitre, contre assetBudgets.
npm run voices -- status | export | import | checknpx quest-n-click voices …Les répliques enregistrées par langue. status [--lang xx] : les répliques avec un id par statut (draft, record, recorded, approved), les clips, les orphelins ; une réplique à changements de texte a une ligne par valeur, <id>~form=f. export --lang xx [--json] > t.csv : la table des comédiens (id, qui, texte, statut, fichier, comédien, note). import t.csv --lang xx : statuts, comédiens et notes ramenés dans voices.json (répliques inconnues refusées). check [--lang xx] [--release] : chaque clip mesuré avec ffmpeg (codec, fréquence, durée pour son texte, volume vers −16 LUFS, crête) ; --release : une réplique approuvée exige son clip. Voix.
npm run i18n -- voicesnpx quest-n-click i18n voicesLes répliques avec un id et sans clip, les clips qu'aucune réplique ne réclame.
npm run ids [-- --write --map], npm run ids -- --linesnpx quest-n-click ids …Les ids stables (schéma 3) écrits dans les sources, les locales renommées, l'étape de migration des sauvegardes. --lines : un id sur chaque say, toast, objet guide, ligne de liste, indice et réaction de sorte (--lines=all : les chaînes simples aussi, exigé pour une release traduite ou doublée) ; traductions et voix s'y rattachent. État et sauvegardes.

Les vérifications propres au dépôt du moteur

CommandeCe qu'elle fait
npm testLes tests Node du moteur, des outils et du jeu sélectionné, sans les tests lourds du solveur.
npm run test:heavyLes tests du solveur gourmands en CPU : chaque nuit, des minutes chacun (Options du solveur).
npm run test:coverageLa suite sous couverture V8 contre les planchers de vite.config.ts ; puis npx tsx tools/coverage-ratchet.ts --strict échoue sur un plancher d'au moins trois points sous ce qu'atteignent les tests (Le cliquet de couverture).
npm run test:assetsLes tests des images et du pipeline d'assets, qui s'appuient sur Python.
npm run checkVérification des types et tests Node.
npm run tsc -- …Le compilateur TypeScript 7 lui-même ; check et quality l'appellent.
npm run qualityFormatage et lint Biome, knip, tsconfig.json et tsconfig.strictest.json, puis le lint du contenu.
npm run quality:baseline -- --check [--dist]Le comportement de la 4.0.0 conservé : témoins, preuves, sauvegardes de référence, surface publique, première visite (La base de qualité).
npm run doctor [-- --release]Node, modules Python, ffmpeg, navigateurs Playwright (doctor).
npm run release-checkCe que lance la CI, d'un coup : doctor --release, quality, build, la couverture et son cliquet strict, verify:release, prove:game, solve --audit-abstractions, la contre-vérification Rust, la mutation du cœur, les paquets avec npm publish --dry-run, les audits des dépendances. release-check:ci est le même sans les jeux de mutation (Publier une release).
npm run field:init, field:check, field:report, field:bundle, field:verify-bundle, field:carryLe Field Kit : les passes des personnes en rapports JSON liés à un run candidat (Passes de terrain).

Dans un navigateur (dépôt du moteur ; le serveur de dev ou une build de production qui répond déjà à <url>)

CommandeCe qu'elle fait
npm run e2e -- <url>Une partie dans Chromium, téléphone en paysage, le long du chemin du solveur (Prouver que ça se joue).
npm run e2e -- <url> --renderer canvasTout le jeu dessiné par le peintre Canvas.
npm run e2e -- <url> --lang frTout le jeu dans cette langue ; échoue sur tout texte anglais par défaut du moteur resté visible.
npm run e2e:visual -- <url> [--update]Chaque lieu, à l'arrêt, contre tests/visual/<jeu>/*.png (0,5 % des pixels au plus).
npm run e2e:a11y -- <url> [--only=axe,keys,storage] [--allow-skip]axe sur la conversation, la carte, les emplacements, les confirmations et chaque mini-jeu ; chaque mini-jeu gagné au clavier ; une ancienne sauvegarde mise à niveau (E2E_BROWSER=chromium|webkit ; code 3 : une vérification que le navigateur ne sait pas automatiser).
npm run e2e:perf -- <url> [--renderer=canvas|dom --cpu=4 --min=30 --room=<id>]Images par seconde pendant que le héros marche, CPU ralenti (pour imiter un téléphone).
npm run e2e:music -- <url> [--only=offline|live|game|reference …]Le directeur musical : 30 min hors ligne sans dérive, 100 changements sans clic, la gigue en temps réel (--live=chromium|webkit), les stems du thème dans le jeu ; --only=reference [--browser=webkit] avec GAME=reference : deux partitions, des ponts, une reprise et un arrêt en pleine transition, la crête décodée (Musique).

Documentation et outillage du dépôt (dépôt du moteur)

CommandeCe qu'elle fait
npm run docs:screenshots [-- --only=game|studio --keep-png]Les images du README depuis le bundle de production et le Studio, en WebP (demande Python avec Pillow).
npm run docs:truthCe que disent les docs contre le code : les schémas de sauvegarde et de .wsrun, chaque script npm et fichier de tools/ ou scripts/ cités, aucun lien de release plus récent que la version. Le job check de la CI.
npm run docs:links [-- --timeout=10000]Chaque lien externe des docs demandé une fois ; une personne le lance avant une release, jamais la CI.
npm run changes -- --check | --assembleLes fragments de CHANGELOG et de LOG d'une branche (Conventions).
npm run ci:plan [-- --base=origin/main | --files=a,b | --all]Quels jobs lourds de la CI un changement demande, sur une ligne de JSON ; depuis la 4.5.0 aussi docs et docsPages, les pages du wiki dont le changement touche les sources (La CI expliquée).
npx tsx tools/api-doc.ts [--check], npx tsx tools/dsl-doc.ts [--check]Les références générées de l'API et du DSL (API publique, Référence du DSL).

Prouver que ça se joue

Dans le dépôt du moteur, npm test lance les tests du moteur et le parcours du jeu : une partie complète scriptée sur le vrai moteur (tests/demo-walkthrough.test.ts pour la démo). npm run e2e joue tout le jeu au toucher dans un Chromium à la taille d'un téléphone et enregistre une capture de chaque étape : regardez-les, ou faites-les regarder par votre assistant, pour attraper ce que le solveur ne voit pas (un personnage debout sur une table, une ligne coupée par le bord de l'écran).

# dans le dépôt du moteur : lancez le serveur de dev, puis dans un autre terminal
npm run dev
npm run e2e -- http://localhost:5173/

npm run e2e prend le chemin du solveur (npm run solve -- --json, ses steps) et le tapote. Il ne passe que si l'exécution du solveur est solved (son code de sortie, son statut et ses pas sont vérifiés) et que le moteur lui-même signale la fin (state.done) : un jeu tronqué ou non résolu est un échec, jamais « le meilleur chemin rejoué quand même ». games/demo/e2e.mjs est l'exemple d'un script e2e propre à un jeu : il part de l'écran titre, joue pour de vrai les mini-jeux des tuyaux et de la cueillette et le ticket à gratter de la fin scellée au lieu de les passer, puis vérifie la carte finale.

Limite · created-project-no-e2e Un projet créé n'a pas de commande test ni e2e : ses vérifications sont verify, build et release. L'e2e dans le navigateur et les vérifications visuelles, d'accessibilité, de performance et de musique tournent dans le dépôt du moteur.

En CI (le .github/workflows/ci.yml du dépôt du moteur) : chaque push sur main, chaque tag et chaque pull request lancent npm run build:game (les garde-fous du jeu, le bundle, les audits des spoilers et des assets) et npm run prove:game sur le jeu d'exemple ; les jobs plus lourds (l'e2e de production dans plusieurs navigateurs, les parties au clavier et en français, un second jeu fait depuis le modèle…) tournent quand ci:plan dit que le changement en a besoin. main se déploie sur Pages ; un tag publie une release. Le workflow hebdomadaire prove (le lundi, ou à la main) lance prove:game, les playtests stricts et le bench sur un jeu généré de 100 lieux. Dependabot propose les mises à jour npm et Actions chaque semaine, pip chaque mois (PR des bots).

Avant de partager le lien

Ensuite, construisez et livrez : Construire et publier un jeu.

Résultat attendu, et comment le vérifier

Le code de sortie est le verdict : 0 réussi, 1 un problème à corriger, 2 la recherche a été tronquée et rien n'est prouvé.

Erreurs fréquentes

SymptômeCauseCorrection
solve sort avec 2, truncated: the search stopped at N states, nothing is proved (raise --max)Le budget est trop petit pour le jeuAugmentez --max, --time ou --mem, prouvez par chapitres, lisez le profil (Options du solveur).
softlocks: N reachable state(s) can no longer reach the endingUn objet consommé, un flag qui ferme, un indice cachéLisez les causes et rejouez leur chemin (Ce que prouve le solveur).
Dead ends (n): …Un état où aucune action ne change rienRendez l'objet, ou assouplissez la condition (les alertes).
broken: N invariant(s) broken on a reachable stateUn bug « plus jamais » est revenuLe chemin est affiché ; corrigez la règle qu'il nomme.
lint sort avec 1 avec cond-never-true ou hint-stuckUne condition ou un indice attend quelque chose que rien ne posePosez-le quelque part, ou changez la condition ; ou ignorez-le dans lint.ignore si c'est voulu.
fallback-unplayedLe fallback d'un signal requis est déclaré sur une règle que le témoin du monde fermé ne joue jamaisUn jeu relié au monde extérieur.
Le résultat dit (from the proof cache, key …) et vous en doutezLe cache a répondu parce que rien n'a changé--no-cache ou PROOF_CACHE=0 relance le calcul (le cache de preuves).

Fichiers ou données modifiés

Les vérifications ne font que lire votre jeu. Ce qu'elles écrivent : .cache/proofs/ (le cache de preuves), et les dossiers que vous nommez avec --out. npm run e2e écrit ses captures dans E2E_OUT (par défaut /tmp/e2e). validate --report écrit dans le terminal ; page:world et page:puzzles écrivent leur page sous dist-pages/ (ou --out <dossier|fichier.html>). ids --write et provenance --lock sont les exceptions qui changent des fichiers que vous commitez : ce ne sont pas des vérifications, et elles le disent.

Revenir en arrière

Rien à défaire : une vérification ne change pas le jeu. Pour repartir de zéro, supprimez .cache/proofs/.

Références


Modifier la source de cette page · Signaler une erreur