Repository navigation
EN Clever Troubleshooting
Français · Type: troubleshooting · 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: none listed on this page
The problems a hosted Studio on Clever Cloud has shown, or is built to show: a 503, connections exhausted, a missing cookie, a slow preview, jobs refused for a clock skew, a daily backup that did not run. Each starts from what you see.
| You see | Section |
|---|---|
A save refused with 503 and Retry-After: 2, "this instance does not serve writes yet; try again", during or right after a deploy |
503 during a deploy |
| "too many connections for role …" in the logs, a 500 on a write during a deploy | Connections exhausted |
| The game's frames empty in one browser (Safari, GNOME Web), or 401 "open the game from the Studio" in the frame | Missing cookie |
| The room view showing an older revision for tens of seconds after a change | Slow preview |
Health and previews failing now and then; the processing worker refused the job (403: the job has expired)
|
Clock skew |
No "event":"backup" line one morning, no new object under backups/
|
Silent cron |
| 503 "the edit cannot be judged now", or "the session is suspended" | A service down: Worker, PostgreSQL or Cellar down |
- A redeploy: two instances overlap for minutes and hand the service lease over.
- The PostgreSQL DEV plan (5 connections) with two instances running.
-
publicUrlandplayUrlon two sites (*.cleverapps.io), or a browser that keeps no cookie in a cross-host frame. - The preview's build on the worker, one at a time, with each revision's files stored.
- The studio app's clock ahead of the worker's (before 4.2.3's fix, a few milliseconds were enough).
- The cron's conditions:
STUDIO_BACKUP_CRON, instance number 0, a login shell, absolute paths.
Keep the logs of both apps while you look (clever logs follows until stopped: run it in the background and stop it by
its process id), and read /readyz:
# on your machine, in the engine repository
clever logs --alias my-game-studio > studio.log 2>&1 &
curl -s https://studio.example.fr/readyzEach section below says which line or answer tells its case apart.
- A 503 with
Retry-After: 2while/readyzsays"writes":"waiting"and the logs show a new instance before itslease-takenline is the redeploy's handoff: it lasts 10 to 16 s after the handoff, about a minute in all, and about 2.5 min for the first deploy onto 4.2.3 or later from an older version. The Studio retries the write with the same operation id and it is applied once. Nothing to fix; tell members before deploying (Redeploys). If it lasts longer than 2.5 min, look at PostgreSQL (Worker, PostgreSQL or Cellar down).
- "too many connections" (
leases-read-failed,reconcile-failed,ship-failed) during a deploy comes from two instances, about 4 connections each, on a plan of 5. Take a PostgreSQL plan with more connections (Apps and add-ons). Outside a deploy, look for connections you opened yourself (psql) on the same add-on.
- The game's frame needs its own session cookie, on
playUrl. Check thatpublicUrlandplayUrlare two subdomains of one domain of yours: two*.cleverapps.ionames are two sites, where only a partitioned cookie (CHIPS) survives. WebKit on Linux (GNOME Web) stores no cookie a frame of another host sets, even on one site: there the game's frames stay empty whatever you do. A real Safari on macOS and iOS has not been checked yet (thestudio-hostedpass). A game frame left idle past its 15-minute session shows nothing new: "Reload view" opens it again (Domains and TLS).
- After each change the worker builds the head; a burst of changes builds its last revision only, and the room view
shows the last ready preview meanwhile, with the revision it is. The
"event":"preview"log line (since 4.4.0) says where the time goes:queuedMs,snapMs,jobMs,storeMs,sinceWriteMs. Upgrade to 4.4.0 or later if you run an older version:
Measure ·
preview-timeFrom the write to the preview ready (sinceWriteMs), ten notes 40 s apart: median 17.8 s and max 26.0 s on the instrumented version, median 5.6 s and max 11.7 s on the optimised one (files stored 8 at a time). On 4.2.3 the preview took p50 34.1 s, p95 43.8 s by the same method, and skipped revisions past one change every 35 s.
- date: 2026-10-22
- version: 4.3.1
- volume: ten revisions per series (436 to 445, then 446 to 455)
- conditions: reference deployment, studio and worker XS, region par; engine at commits a3294282 then b9336a4d, the 4.4.0 work before its tag (package.json said 4.3.1); the 4.2.3 figures measured on 2026-10-19 on the same deployment, revisions 66 to 75
- source: QUALIF-4.2.3-REFERENCE.md §6 and its 4.4.0 note
The worker's job itself stays the main part: it builds the engine cold at each revision.
-
the processing worker refused the job (403: the job has expired)inhealth-failedorpreview-failedlines, for some jobs and not others, came on the reference deployment from the studio app's clock running ahead of the worker's: the Studio sets a job's expiry, the worker checked it to the millisecond. Since 4.2.3 (#192) the worker allows 30 s of skew (CLOCK_SKEW_MS), logsworker-job-refusedwith its reason, and the Studio repeats the reason (200 characters at most). If you still see it: check both apps run the same version, and read the worker'sworker-job-refusedline; a skew past 30 s is the platform's to fix.
Guarantee ·
job-clock-skew· referenced · scope self-checked by the author (AI), not reviewed The worker accepts a job signed by a Studio whose clock runs ahead of its own by up to 30 s.
It still refuses a job that has expired, to the millisecond, or that would live longer than a job plus the skew.
-
The daily backup runs at 03:17 UTC from
clevercloud/cron.json, and its script does nothing, silently, when:- the studio app does not set
STUDIO_BACKUP_CRON=1, or was not redeployed or restarted since it was set; -
INSTANCE_NUMBERis not0(another instance, or Clever did not say which one it is); - the app was installed from the release archives, which do not carry the script: add your own
(Backups), starting with
#!/bin/bash -l(without it, a cron runs with no environment) and using absolute paths ($ROOT).
Run it by hand in
clever ssh(cd "$APP_HOME" && ops/studio/backup-cron.sh): it prints its"event":"backup"line, or the error that stops it. - the studio app does not set
/readyz 200 with rpoMs 0; a save goes through; the game shows in the room view and the Play tab; the next
"event":"preview" line is short; the worker logs no worker-job-refused; the next morning has its "event":"backup"
line.
- 409 on a save: someone wrote the same file since you read it (Write refused: stale base).
- 423 on a save: a span another member holds (Write refused: span locked).
- 503 from the Reality Bridge is the Bridge's own unavailability, another service: see the Bridge's pages (Bridge troubleshooting).
- A worker, database, bucket or provider down: Worker, PostgreSQL or Cellar down.
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