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.

Codes et messages d'erreur

English · Type : référence · Public : auteur, administrateur, contributeur · Contexte : dépôt du moteur, projet créé, Studio hébergé, Reality Bridge · Statut : prête · S'applique depuis : 4.4.0

Ce que veut dire un code ou un message d'erreur de quest'n'click : les statuts HTTP de l'API du Studio (le serveur de dev local et le Studio Server hébergé), les codes du Reality Bridge, les statuts du solveur et les codes de sortie des commandes qui vérifient un jeu. Cherchez dans cette page le code exact ou le début du message reçu : un message dont une partie est remplie à l'exécution s'écrit avec … à cet endroit.

Lire cette page

Les sections de « API du Studio » à « Codes de sortie des commandes de vérification » sont générées depuis le code et depuis wiki/data/errors.json (npm run wiki -- generate reference.error-codes, dans le dépôt du moteur) : un statut que le code lève et que le registre ne décrit pas fait échouer npm run wiki -- check.

Les réponses propres du serveur de dev

L'API du Studio local (/__studio/api/*, tools/studio/plugin.ts) répond aussi, en dehors des StudioError listées plus bas :

StatutMessageQuand
404no such endpoint: <path>aucune route n'a ce chemin
405method <METHOD> not allowed on <path>le chemin existe, avec une autre méthode
404no such screenshotGET screenshots/<name>.png d'une capture absente
404no such endpoint: assets<path>, no such fileles routes de l'onglet Assets : une route inconnue, un fichier hors de art/ et audio/
405method <METHOD> not allowed on assets<path>une route Assets avec une autre méthode
413body too largeun corps de requête au-delà de la limite (l'onglet Assets prend jusqu'à 96 Mio)
500le message de l'erreurtoute autre erreur levée : le serveur de dev écrit sa pile dans son terminal

Les autres réponses du Bridge

En plus de ses BridgeError, le serveur du Bridge (bridge/src/server.ts) répond :

StatutCorpsQuand
503{ "error": "busy", "message": "the store is busy: try again in a second" }, avec Retry-After: 1un autre processus a tenu le verrou d'écriture du store plus longtemps que la requête ne pouvait attendre ; rien n'a été écrit, renvoyez-la
503{ "status": "unavailable" }GET /readyz ou /healthz quand le store ne répond pas
500{ "error": "internal" }une erreur inattendue, journalisée en ligne JSON {"event":"error", …} sur sa sortie
404{ "error": "not found" }aucune route n'a cette méthode et ce chemin

API du Studio (serveur de dev et Studio Server)

Chaque refus que le Studio lève en StudioError, par statut HTTP. La réponse est du JSON, { "error": "<message>" } (parfois avec d’autres champs) ; les messages ci-dessous sont ceux du code, en anglais. … tient la place d’une partie remplie à l’exécution.

400

Une requête mal formée : un champ absent ou du mauvais type, un id qui n’en est pas un, un corps qui n’est pas un objet JSON, un en-tête du Studio Server qui n’a pas sa forme. Rien n’a été écrit. Corrigez la requête comme le dit le message, puis renvoyez-la.

Messages :

401

Pas connecté, ou des identifiants non valides : la session d’un Studio hébergé manque ou a expiré (la réponse peut porter login: "/auth/login"), le MCP distant ou les métriques sont arrivés sans leur jeton. Reconnectez-vous (quest-n-click-studio-server login --server <url> pour la CLI et le MCP).

Messages :

403

Connecté, mais pas autorisé : pas membre de ce projet, un rôle trop bas pour l’action (un relecteur n’écrit rien), une requête d’une autre origine, une page du jeu ouverte hors d’une session de navigateur, un commentaire qui n’est pas le vôtre, une tâche lancée par quelqu’un d’autre. Demandez le rôle à un owner.

Messages :

404

Ce que la requête nomme n’existe pas : une salle, une note, une réplique, une révision, un build, une tâche, un fichier, un storyboard ; ou une fonction que ce Studio n’a pas (les builds publiés, les commentaires, la santé des révisions sont ceux d’un Studio hébergé ; préparer les assets, découper une planche ou mettre à jour le moteur demande son application de traitement ; Git demande git dans la configuration).

Messages :

409

Un conflit, rien d’écrasé : un fichier modifié depuis la révision que vous avez lue (la base périmée du Studio hébergé), un fichier modifié pendant que l’édition se préparait ou se vérifiait (réessayez), une annulation dont le fichier a changé depuis, un id qui existe déjà, des cases d’une planche qui existent déjà, une tâche déjà finie, un build d’une autre histoire du jeu, une branche Git qui a bougé, l’annulation sur un Studio partagé.

Messages :

413

Trop gros : un corps de requête au-delà de la limite de la route (body too large), un envoi au-delà de la taille du Studio hébergé, un import de plus de fichiers ou d’octets que le Studio n’en prend. Envoyez moins, ou découpez.

Messages :

415

Le mauvais type de contenu : une écriture qui n’est pas envoyée en JSON, un son sur un Studio hébergé qui n’est pas un fichier .ogg, .mp3 ou .wav, ou dont les octets disent autre chose.

Messages :

422

Compris et refusé : l’édition ajouterait des erreurs de validation (la réponse les liste, avec le diff ; rien n’est écrit depuis la 4.2.1), un commit Git qui ne contient pas de jeu, ou un lien, ou un sous-module, des assets préparés qui perdraient des fichiers que le jeu avait, une découpe, une migration ou une mise à jour du moteur refusée par l’application de traitement.

Messages :

423

Un pan (une salle, une langue, le jeu…) est tenu par un autre membre d’un Studio hébergé, ou votre propre bail dessus a pris fin : la réponse nomme le pan et qui le tient ; votre brouillon est gardé.

Messages :

429

Trop à la fois, réessayez plus tard : un build ou une préparation des assets est déjà en cours, la mise à jour du moteur tourne, trop de tâches attendent, trop de commentaires ouverts.

Messages :

500

Le jeu ou le Studio lui-même a échoué : le jeu ne se charge pas (une erreur de syntaxe, un ancien import web-scumm/…), un fichier JSON du jeu n’est pas valide, une édition casserait le fichier qu’elle écrit (refusée, rien d’écrit), une écriture sur un Studio partagé sans son auteur. Le serveur de dev écrit la pile dans son terminal.

Messages :

501

Pas disponible ici : une capture ou les captures d’un diff sans Playwright ou son Chromium, ou sur un Studio hébergé (la réponse porte unavailable: true et reason) ; une politique Reality résolue sur un Studio hébergé (en local seulement).

Messages :

502

Un service derrière le Studio Server a échoué : une commande git ou un push vers le dépôt du jeu.

Messages :

503

Pas maintenant, rien de perdu : un autre processus écrit ce jeu, l’édition ne peut pas être jugée maintenant (la validation n’a pas pu tourner), ou le fournisseur d’identité d’un Studio hébergé ne répond pas (la session est suspendue). Réessayez.

Messages :

504

L’application de traitement d’un Studio hébergé n’a pas répondu à temps (une préparation, une découpe, un diagnostic) : réessayez, ou faites-le sur un Studio local.

Messages :

Reality Bridge

Chaque refus que le Bridge lève en BridgeError, par statut HTTP et code. La réponse est du JSON, { "error": "<code>", "message": "<message>" }.

400 shape

La requête n’est pas ce que la route lit : pas du JSON, un champ absent ou mal formé, un through que le Bridge n’a jamais envoyé, un id de révocation qui n’est pas hexadécimal, une livraison de webhook sans son id.

Messages :

401 admin

Une route d’opérateur (/v1/admin/…, comme l’appelle quest-n-click-bridge revoke) sans le jeton de l’opérateur (admin-token dans le dossier du Bridge).

Messages :

401 capability

Le lien du joueur avec le Bridge (sa capacité) est inconnu, révoqué, expiré ou trop vieux : le joueur s’apparie de nouveau.

Messages :

401 revoked

Le jeton du connecteur a été révoqué pendant que son signal était proposé : accordez-en un nouveau (quest-n-click-bridge grant).

Messages :

401 signature

Une livraison de webhook dont la signature HMAC ne correspond pas au secret du webhook.

Messages :

401 token

Un jeton de connecteur illisible, ou révoqué, sur une confirmation d’appariement ou un signal.

Messages :

403 denied

Le jeton du connecteur est valide et ne permet pas ceci : il ne peut pas apparier (accordé sans --pair), ou son Biscuit ne permet pas ce signal, cette source ou ce joueur.

Messages :

404 game

Un appariement demandé pour un jeu que ce Bridge ne sert pas (son gameId est un autre).

Messages :

404 hook

Aucun webhook de ce nom dans la configuration du Bridge.

Messages :

404 pairing

Le code d’appariement est inconnu ou expiré : le joueur lance un nouvel appariement.

Messages :

404 player

Le joueur est inconnu de ce Bridge, ou a été révoqué (quest-n-click-bridge revoke --player=…, ou le joueur s’est délié).

Messages :

404 tenant

Un Bridge qui sert plusieurs tenants n’en trouve aucun pour cette requête.

Messages :

409 pairing

Le code d’appariement a déjà été confirmé, par ce connecteur ou un autre : le joueur est apparié, rien à refaire.

Messages :

410 pairing

L’appariement a déjà été réclamé : la capacité du joueur a été remise une fois et ne le sera plus ; appariez de nouveau depuis le jeu.

Messages :

413 size

Le corps de la requête dépasse la limite du Bridge.

Messages :

422 event

Le webhook n’associe pas cet événement à un signal (sa configuration liste les événements qu’il connaît).

Messages :

422 signal

Le signal n’est pas dans le manifeste Reality du jeu.

Messages :

422 source

Le signal est déclaré pour une autre source que le connecteur qui l’envoie.

Messages :

429 pairings

Trop de codes d’appariement attendent une confirmation : réessayez dans une minute.

Messages :

429 pending

Le joueur a trop de signaux en attente de livraison.

Messages :

429 quota

Trop de signaux cette minute pour le joueur (le quota par minute du Bridge).

Messages :

429 rate

Trop de requêtes depuis cette adresse : la réponse porte Retry-After: 60.

Messages :

429 streams

Trop de flux d’événements ouverts : pour ce joueur, ou pour cette instance du Bridge.

Messages :

Statuts du solveur

Le statut unique d’une recherche du solveur ou d’une preuve par chapitres (src/engine/tools/status.ts) : la ligne de commande, son --json, l’onglet Vérifier du Studio et l’outil MCP solve le lisent tous.

StatutCode de sortieSignifie
solved0La fin (ou le but) est atteinte : sur un chemin pour une recherche de témoin, depuis chaque état atteignable avec --prove.
softlocks1Certains états atteignables ne peuvent plus atteindre la fin : la sortie les liste avec le chemin vers chacun.
unsolved1La fin n’est atteinte depuis aucun des états explorés.
truncated2La recherche s’est arrêtée sur son budget (états --max, temps --time, mémoire --mem) : rien n’est prouvé ; augmentez le budget ou reprenez depuis le point de reprise.
broken1Un invariant du jeu est devenu vrai sur un état atteignable.
error1Le moteur a levé des erreurs pendant l’exploration.
checkpoint_mismatch1Une preuve par chapitres (--prove --chapters) : chaque chapitre est prouvé, mais un checkpoint écrit à la main n’est aucun des états frontières atteignables de son chapitre.

Codes de sortie des commandes de vérification

Ce qu’un script ou un job de CI lit après la commande.

npm run validate

tools/validate.ts.

CodeSignifie
0Aucune erreur (des avertissements peuvent s’afficher) ; --report sort toujours avec 0.
1Au moins une erreur, listée après ✖.

npm run solve

tools/solve.ts.

CodeSignifie
0solved ; aussi --prove --chapters sur un jeu qui ne déclare aucun chapitre.
1Tout autre statut que truncated (softlocks, unsolved, broken, error, checkpoint_mismatch) ; avec --audit-abstractions, les deux recherches divergent.
2truncated : rien de prouvé (avec --audit-abstractions, la recherche explicite a été tronquée) ; ou un --goal refusé (seulement --goal=100%, et seulement sur un jeu qui a un objectif non facultatif).

npm run solve:reality

tools/solve-reality.ts.

CodeSignifie
0Chaque monde prouvé (fermé, chaque scénario et replay, adversarial), ou un jeu sans reality.
1Un monde échoue ; une recherche tronquée compte comme un échec.

npm run lint

tools/lint.ts.

CodeSignifie
0Aucun constat de gravité error, et la recherche du solveur n’a pas été tronquée.
1Au moins un constat de gravité error.

npm run doctor

tools/doctor.ts.

CodeSignifie
0Chaque prérequis obligatoire est là (des optionnels peuvent manquer).
1Un prérequis obligatoire manque ; avec --release, chaque prérequis de npm run release-check est obligatoire.

npm run speedrun:verify

tools/speedrun/verify.ts.

CodeSignifie
0Le verdict est valid ou valid-unranked.
1Tout autre verdict, inconclusive compris : jamais valide.
2Aucun fichier .wsrun nommé : la ligne d’usage s’affiche.

npm run e2e:canonical

scripts/e2e-canonical.mjs.

CodeSignifie
0Chaque navigateur écrit chaque valeur comme Node (ou un navigateur sauté avec --allow-skip, dit dans la sortie).
1Un navigateur écrit une valeur autrement.
3Un navigateur que Playwright ne peut pas lancer ici, sans --allow-skip.

npm run e2e:remix

scripts/e2e-remix.mjs.

CodeSignifie
0Chaque environnement fait les mêmes mondes (ou un navigateur sauté avec --allow-skip, dit).
1Une différence, la graine nommée.
3Un navigateur que Playwright ne peut pas lancer, sans --allow-skip.

npm run e2e:speedrun

scripts/e2e-speedrun.mjs.

CodeSignifie
0Déterminisme prouvé dans chaque navigateur lancé (ou --bundle-only, ou un navigateur sauté avec --allow-skip).
1Une vérification a échoué.
3Un navigateur que Playwright ne peut pas lancer, sans --allow-skip.

npm run e2e:pwa

scripts/e2e-pwa.mjs.

CodeSignifie
0Prouvé ; ou sauté avec --allow-skip (une ligne « skipped » explicite, jamais une preuve).
1Échec.
3Sauté : le navigateur ne sait pas naviguer hors ligne sous automatisation (WebKit), sans --allow-skip.

npm run e2e:remix-speedrun

scripts/e2e-remix-speedrun.ts.

CodeSignifie
0Chaque politique de monde a enregistré la même partie dans chaque environnement, vérifiée (ou un navigateur sauté avec --allow-skip).
1Une vérification a échoué.
3Un navigateur que Playwright ne peut pas lancer, sans --allow-skip.

npm run lint : code de sortie 2

En plus de 0 et 1 ci-dessus, npm run lint sort avec 2 quand il n'a trouvé aucune erreur mais que la recherche du solveur qu'il lance d'abord a été tronquée : « jamais exécuté » et « jamais atteint » sont alors des informations, pas des verdicts. Augmentez --max, ou prouvez par chapitres (tools/lint.ts).

Limite · register-scope Le registre liste ce que le code lève avec une structure : new StudioError(<message>, <status>) dans studio-server/src/ et tools/studio/, new BridgeError(<status>, '<code>', <message>) dans bridge/src/, les statuts du solveur et les codes de sortie nommés dans les données. Il ne liste pas les réponses qu'une route envoie directement (les 429 too many requests et 429 too many refused attempts du Studio Server, avec Retry-After: 60 ; les routes speedrun et quotidiennes du Bridge, /v1/runs et /v1/daily, avec leurs propres corps d'erreur), un refus dont le statut est calculé (la vérification d'un signal par le Bridge répond 401 ou 403 avec le code de la vérification Biscuit), ni le texte d'un message construit à l'exécution (compté sous son statut). Les verdicts et les codes du vérificateur de speedrun relèvent des pages speedrun.


Modifier la source de cette page · Signaler une erreur