Repository navigation
EN Bridge Troubleshooting
Français · Type: troubleshooting · Audience: admin · Context: Reality Bridge · Status: ready · Applies from: 4.1.20
The Reality Bridge,
localprofile (SQLite) · contract: stable · verified by CI (support matrix of 4.4.0, 2026-10-23): Node 22.13+ with node:sqlite, on Ubuntu; Chromium and WebKit end to end · automated checks: jobsreality,reality-xcheck; CI planreality; 2 test files · people's passes: none · known limits: none listed on this pageThe Reality Bridge,
distributedprofile (Postgres) · contract: experimental · verified by CI (support matrix of 4.4.0, 2026-10-23): Postgres 16 in CI; The qualification profile: HTTPS, three instances (ops/qualify/) · automated checks: jobsbridge-postgres,deployment-smoke; CI planreality; 1 test file · people's passes:bridge-postgres-httpsnot run (#77) · known limits: none listed on this pageThe connectors (email, Telnet, SSH, Open Badges) · contract: experimental · verified by CI (support matrix of 4.4.0, 2026-10-23): Node 22 on Ubuntu (Telnet and SSH not on Windows) · automated checks: jobs
connectors,connector-archive-e2e; CI planreality; 3 test files · people's passes:connectors-real-securitynot run (#79) · known limits: none listed on this page
What a Reality Bridge's error codes mean, and what to do about them. The Bridge is the server that carries signals from the real world (an email, a badge, a terminal) to a player's game; its connectors send those signals. This page covers the Bridge's own answers, not the hosted Studio's, which has codes of the same numbers.
A Bridge's 409 means "this was already done", never "your copy is stale":
-
{"error": "pairing", "message": "already confirmed"}onPOST /v1/pairings/<code>/confirm: the pairing code was confirmed already, by this connector or another one. Two connectors confirming one code at once: one wins, the other gets this 409. The player is paired; nothing to redo. -
{"error": "duplicate", …"this run was submitted already (the first submitter keeps it)"}onPOST /v1/runs: the same speedrun run was sent twice, and the second is refused as it would join the queue. The first submission keeps its place in the queue; it is ranked only once the speedrun worker finds it valid. -
{"error": "trust", …"only a run the worker found valid can be moderated"}: a moderator tried to verify a run the speedrun worker did not find valid.
None of them loses data: the first action stands. To check it, read the Bridge's log (JSON lines on its standard
output): "event":"pairing.confirmed" with the playerId for the pairing, "event":"run.submitted" (then
run.verified) for the run. The Bridge has no operator route that reads a pairing's state. Never call
GET /v1/pairings/<code> to check one: that is the player's one-time claim, and calling it hands out, and uses up, the
player's capability.
-
{"error": "busy", "message": "the store is busy: try again in a second"}, withRetry-After: 1: another process held the store's write lock longer than the request could wait (SQLite). Nothing was written; send it again. -
GET /readyzanswers 503{"status": "unavailable"}: the store does not answer. Look at the database first. - From 4.1.20, a Bridge whose maintenance lease is lost (not renewed, or the database connection that holds its lock
dropped) holds its writes, which answer 503, and fails
/readyzuntil it takes a lease again (its log linemaintenance.lease.lostsays why).
A connector may send the same signal twice (a retry after a timeout, a restart). The Bridge accepts it once: POST /v1/signals answers 202 the first time, and 200 with duplicate for a dedupeKey it already accepted. The player's
save keeps the sequence of signals it applied, so a signal is never applied twice in the game.
- The game plays on: a player offline, or without a signal, keeps playing; what arrives later is applied when it arrives.
- A connector started with a
healthport answersGET /healthwith 200 when it is well, 503 otherwise, with adetail;GET /metricson the same port gives its counters. - An email connector leaves a message unseen when the Bridge refused it for a reason that may pass (the Bridge away or busy, a quota): it is read again at the next poll. A message refused for good is marked seen and flagged, for you to look at. Over a quota the Bridge answers 429: the connector sees it, nothing is dropped in silence.
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