Repository navigation
EN Team Upgrade Engine
Français · Type: how-to · Audience: admin · Context: hosted Studio · Status: ready · Applies from: 4.2.3
The Studio Server (hosted team Studio) · contract: experimental · verified by CI (support matrix of 4.4.0, 2026-10-23): Postgres, S3 and Keycloak in CI; Chromium and Firefox (job studio-hosted); WebKit on macOS, by hand only · automated checks: jobs
studio-hosted,studio-install-smoke; CI planstudioHosted; 3 test files · people's passes:studio-hostednot run (#149),studio-collabnot run (#150),studio-previewnot run (#166),studio-assets-hostednot run (#167),studio-mcp-remotenot run (#196),studio-oidc-genericnot run (#197) · known limits:engine-upgrade-scope
A game imported into a team Studio from an older project may still be written for an older engine: authoring schema 2
(a 4.1.x project that never ran quest-n-click migrate), or imports under the former name web-scumm/…. An owner
upgrades it on the server, in one call, judged before anything is written.
This page is about the game's content. Upgrading the server to a new engine version is a redeploy: see Upgrading the server.
The hosted game at the current authoring schema (3, with stable ids), and its imports under the current name, as one or two revisions, or a refusal that leaves the head as it was.
A hosted Studio with its worker, from 4.2.3; the rename of the former name from 4.3.0 (D47). The code is
studio-server/src/server/engine-upgrade.ts. A local Studio has no
such route: run quest-n-click migrate in the project (see Upgrade).
In the 4.2.x line the content format is frozen (D40): the schema migration is for a game made on 4.1.x.
- The
ownerrole. - A backup taken just before, as the way back (see Backups).
- An access token:
npx quest-n-click-studio-server token --server <url>from the release archive, ornpm run studio-server -- token --server <url>in the engine repository. -
defineGame({...})written ingame.ts(a game that defines it elsewhere is refused: migrate it locally).
On any machine where the CLI is logged in to the Studio (see The server's command line). There is no button in the Studio yet: the route is the way in.
- Take a backup and note the revision (the header's "revision N").
-
Call the route as an owner:
curl -X POST -H "Authorization: Bearer $(npx quest-n-click-studio-server token --server https://studio.example)" \ https://studio.example/api/engine/migrate
-
Read the answer.
-
{ "changed": 0, "schema": {…} }: the game was already at schema 3 (and under the current name); nothing was written. -
{ "revision", "changed", "paths", "schema": { "from", "to" } }: the migration was written as one revision,engine upgrade: authoring schema 2 → 3;pathsare the files written. Withrenamed, the imports were renamed first, as a revision of their own. - A 422 with
errors(andskipped,rev, possiblyrenamed): refused, nothing of the migration was written.
-
- Replay the playtests after it: they are neither migrated nor judged (a session recorded at schema 2 may name the old positional keys).
-
Exclusive. It runs under the owner's exclusive lease (
*): nobody else writes meanwhile. Their writes get a 423 with the owner's name, their drafts stay with them, and they write again once it is done. One upgrade at a time (429). -
On the worker. The worker runs the same migration as
quest-n-click migrateon the head's snapshot: the stable ids written intorooms/*.ts,rules.ts,items.tsandgame.ts, the translation tables' keys renamed,ids.migration.jsonandids.paths.json, then the three lines UPGRADING leaves to the author ingame.ts(schemaVersion: 3,saveVersion+ 1,migrations: [..., idsMigration]and its import: all three or none, said inskipped). Nothing is written yet, and nothing but those files: the Studio refuses an answer that names another file, or a file the game does not have (the game's code runs before the migration and could shape it). -
Judged before it is written. The migrated game is judged on the worker as the health judges a revision: the
validator, then the solver from a new game, bounded in time. A game the migration would break (an id the tool could
not write, a list built by code, a game that can no longer be finished), or that the solver cannot judge in time, is
refused with a 422 (
errors,skipped: what the tool could not write), and the head stays as it was. - One revision. Otherwise the changed files are written as one operation, through the validation guard.
Applies from 4.3.0
A game that still imports web-scumm/… does not load on a 4.3.0 Studio or later (the aliases are gone): its health is
not green and the guard refuses its writes (a 422: the game still does not load). The upgrade first renames those
imports itself, in every TypeScript source of the head (no game code involved), as a revision of its own,
engine upgrade: the former name's imports renamed, judged by the validator alone: the game must load after it and,
if it loaded before, gain no error. The solver does not judge it, so a game that cannot be finished yet is never
stuck. The schema's migration follows, judged as above; when it is refused, the answer's body.renamed says the
rename was kept.
The rename is written without an undo (an undo would bring back imports that no longer resolve), so the owner's earlier history stays reachable; a backup taken before is the way back. A worker that refuses, times out or leaves no result while the guard asks never counts as the game not loading: the write fails (503) and the next one asks again.
Guarantee ·
engine-upgrade-judged-first· referenced · scope self-checked by the author (AI), not reviewed A game the migration would break is refused before anything is written, and the head stays intact.
Limit ·
engine-upgrade-scopeThe project'stsconfig.json(baseUrl, whichquest-n-click migratealso fixes) is not part of a hosted game and is left alone. The playtests (playtests/) are neither migrated nor judged. A game whosedefineGameis not ingame.tsis refused: migrate it on a local Studio.
The header shows the new revision(s); the history lists engine upgrade: …; the health turns green for the new head.
A second call answers { "changed": 0 }.
| Symptom | Cause | Fix |
|---|---|---|
422 refused: the migration would break the game (…); nothing was written
|
An id the tool could not write, a list built by code, a game that can no longer be finished | Migrate it on a local Studio (quest-n-click migrate, then npm run ids to see what is left) and import it again, or fix it first |
422 refused: the migrated game cannot be judged (…); nothing was written
|
The solver ran out of time | The same: migrate locally |
422 refused: the game still does not load once its imports are renamed (…)
|
Something else than the name keeps it from loading | Fix the game locally |
422 refused: renaming the imports adds N validation error(s)
|
The rename would add errors | Fix them locally |
429 the engine's upgrade is running: try again when it is done
|
Another upgrade runs | Wait |
| 423 for the others while it runs | The exclusive lease | Expected; they write again once it ends |
404 the engine's upgrade needs a hosted Studio with its processing worker
|
No worker, or a local server | Use quest-n-click migrate locally |
rooms/*.ts, rules.ts, items.ts, game.ts, the translation tables, ids.migration.json, ids.paths.json; for
the former name, every TypeScript source that imported web-scumm/….
- The schema's migration: the owner's Undo takes it back as a new revision (409 if someone wrote one of its files since).
- The rename: not undoable; restore the backup taken before (see Restore drill).
Generated publication · publication générée — current documentation · documentation courante: quest'n'click 4.4.0 r1, documentation revision · révision de la documentation 8dc717c69acb62c4742b69c54a7e7dfb620f75d8.
Earlier versions and permalinks · versions précédentes et liens permanents: https://wanoo.github.io/quest-n-click/docs/
An edit made in this wiki is overwritten at the next publication · une modification faite dans ce wiki est écrasée à la publication suivante.
Edit the source · Modifier la source · Report an error · Signaler une erreur
Index (6)
Start (6)
Play (9)
Install (17)
- Requirements
- Install from the release archive
- Install from npm, once published
- Install from the repository to work on the engine
- doctor: checking your machine
- Image toolchain
- Audio toolchain: ffmpeg, fluidsynth, Furnace, uv
- Upgrade
- Upgrade notes: 4.4
- Upgrade notes: 4.3
- Upgrade notes: 4.2
- Upgrade notes: 4.1
- Upgrade notes: v3
- Upgrade notes: v2 to v3
- Coming from web-scumm
- Package reference
- Install troubleshooting
Create a game (55)
- Your first game
- Layout of a created project and of the engine repository
- The working loop
- Content principles and the identity contract
- Rooms
- Geometry: placement, walk zones, masks, layers, camera
- Something is visible but unreachable
- Reactions
- Game commands
- Conditions
- Flags, variables and events: which to use
- Custom code
- Characters
- Items and inventory
- World map
- Dialogues
- Scripts and events
- Moving characters: patrols and walks
- Exits
- Chapters and objectives
- State and saves: persistent or temporary, renaming an id, migrations
- Staging: wide rooms and animations
- The stage: lights, particles, floors
- Skin and fonts
- Title and credits
- Heroes: several characters and hero choice
- Built-in minigames
- A custom minigame
- Translations
- Music in stems
- Sound effects
- Voices: per language and per hero
- Images: prompts, cutting sheets, transparency, scale
- Asset provenance
- The storyboard, source of truth
- Puzzle design
- Classic mechanics
- Review pages
- DSL reference
- Checking your game
- What the solver proves
- Solver options
- Playtests
- Remix
- Speedrun for authors
- The sealed ending
- Production template
- Example games
- Working with an AI
- Build and release a game
- Publish on GitHub Pages
- The static game on Clever Cloud
- Other static hosts
- Sub-path, cache and service worker, incomplete deploys, going back
- Testing on a phone over the LAN
Local Studio (24)
- The local Studio: overview and launch
- Edit a room
- Placement and stage
- Preview, apply, undo
- Storyboard
- Assets and cutting
- Check: validator, solver, critical path, heat, health, coverage
- Before and after captures
- Semantic diff
- Play and replay a session
- Rule explainer
- Language and objectives
- Voices and the heroes × languages matrix
- Map
- Notes
- Remix in the Studio
- Music
- The Assistant: bring your own key
- Demo mode and studio-apply
- Local and LAN security
- Studio API
- Local MCP: setting up each client
- MCP tools
- Studio troubleshooting
Team Studio (21)
- What runs where
- Concepts: revision, transaction, span, lease, preview, build
- Starting as an invited dev
- Working together day to day
- Roles and actions: the full matrix
- Invitations
- Managing members
- Write refused on the hosted Studio: stale base revision (409)
- Write refused on the hosted Studio: span locked (423)
- Recovering after a lost lease, a disconnection or a stale preview
- Comments
- Map and semantic diff
- Publishing builds
- Remote MCP
- The game in Git
- Upgrading the engine of a hosted game
- Hosted assets
- The server's command line
- Health and metrics routes
- Trying it locally with compose.yml
- Known limits
Clever Cloud (23)
- Clever Cloud: overview, cost and prerequisites
- Apps and add-ons
- Domains and TLS
- Keycloak
- Generic OIDC and GitLab
- Configuration
- First deployment
- Backups
- RPO and RTO
- Restore the Studio on a fresh installation
- Redeploys
- Upgrading the server and checking state after a migration
- Limits of going back
- Monitoring
- Security
- Rotating keys
- Recovering admin access
- Changing domain or OIDC provider
- Worker, PostgreSQL or Cellar down
- Exporting the game and leaving the installation
- Retention
- Clever Cloud troubleshooting
- Costs and teardown
Reality Bridge and connectors (16)
- The Reality Bridge: what it is
- Quick start
- Guarantees
- Install and run the Bridge
- Backup and restore
- Several tenants
- Signals and the manifest
- The Bridge's command line
- Connectors overview
- Email connector
- Telnet connector
- SSH connector
- Open Badges connector
- The connector SDK
- Security: Biscuit and signatures
- Bridge and connector troubleshooting
Contribute (25)
- Welcome
- Developer setup
- The dev loop
- Before a pull request
- Conventions
- Writing documentation
- Architecture
- Code tour
- Import boundaries
- Which tests run when
- Mutation testing
- The coverage ratchet
- The quality baseline
- CI explained
- Field passes
- Benchmarks
- Releasing
- npm packages
- Decisions and ADRs
- Governance
- Bot pull requests
- Contributing with AI agents
- Security policy
- Code of conduct
- Licences and credits