Repository navigation
EN Contribute Which Tests Run When
Français · Reference · Published, partly reviewed by a person · Applies from: 4.5.0
Every test suite of the engine repository, the command that runs it, and when CI runs it: on a pull request, on
main, in a candidate, in the release, every night or every week. Read with CI explained, which
says what each workflow and job is.
Audience, context, and the statuses of what this page rests on
Audience: contributor · Context: engine repository
"PR" is an ordinary pull request; "gate" means the job runs only when the plan opens that gate
(CI explained), and always on main, on a tag and on a pull request labelled full-ci.
"Release" is the release workflow on a v* tag. Every command runs in the engine repository.
| Suite | Command | What it runs | PR | main |
Candidate | Release | Nightly | Weekly |
|---|---|---|---|---|---|---|---|---|
| Unit (Node) |
npm test (test:node) |
every tests/**/*.test.ts and the game's games/<GAME>/tests/, but the 9 heavy files and the 2 asset files |
as coverage; on Node 24 (gate node24); on Windows without the POSIX files (gate windows) |
yes | yes (release-check:ci) |
yes (release-check:ci) |
— | — |
| Coverage | npm run test:coverage |
the unit suite and the asset tests under V8 coverage, then the floors of vite.config.ts and the ratchet |
in four shards (unit), merged by coverage, under coverage when product code changed (gate coverage; ratchet warns); otherwise the same shards without coverage (4.5.4) |
yes (ratchet strict) | yes | yes | — | — |
| Assets | npm run test:assets |
tests/pixel.test.ts, tests/studio-assets.test.ts (Python needed) |
in the unit shards, with or without coverage (4.5.4) |
inside coverage | inside coverage | inside coverage | — | — |
| Heavy solver | npm run test:heavy |
9 files one after the other: ownership, audit, canonical, memo, reference-proof, solver-oracle, dominance, partition, checkpoint-matrix
|
— | — | three times, each on a new runner (heavy ×3) |
— | yes (heavy) |
— |
| Quality | npm run quality |
format, code lint, knip, both TypeScript configurations, content lint | yes (check) |
yes | yes | yes | — | — |
| Docs truth | npm run docs:truth |
what the docs claim against the code | yes (check) |
yes | — | — | — | — |
| Wiki | npm run wiki -- check |
the manifest, pages, links, parity, examples; inside the unit suite as tests/wiki-*.test.ts
|
yes | yes | yes (unit suite) |
check --publish (docs-publish) |
— | — |
| Game gates |
npm run build:game (verify:game, the bundle, verify:dist, spoilers, asset audit) |
the sample game | yes (check); the reference chapter and heroes (gate reference); a new game (gate secondGame) |
yes | yes | yes | — | — |
| Baseline | npm run quality:baseline -- --check --dist |
witnesses, proofs, golden saves, public surface, test count, first visit | yes (check) |
yes | — | — | — | — |
| Proof | npm run prove:game |
the exhaustive proof, global and by chapter, and solve:reality
|
yes (check; reference, second-game by gate) |
yes | yes | yes | — | yes (prove) |
| Abstraction audit | npm run solve -- --audit-abstractions |
the sample proved with and without the abstractions | — | — | yes (release-check:ci) |
yes | — | — |
| Corpus | npm run audit:corpus |
the abstractions against the explicit search on random games | — | — | — | — | yes (500 seeds of each kind, four shards) | — |
| Proof matrix | npm run prove:matrix |
the twelve instances of docs/dev/PROOF-MATRIX.md
|
— | — | — | — | yes (matrix) |
— |
| Bench | npm run bench |
a generated 100-room game, timed and proved within a budget | — | — | — | — | — | yes (prove, uploaded) |
| Playtests | npm run playtests |
committed sessions replayed and summed up | inside verify:game
|
yes |
--strict in verify:release
|
--strict in verify:release
|
— |
--strict (prove) |
| e2e, Chromium |
npm run e2e, e2e:weight, e2e:music, e2e:visual, e2e:perf, e2e:studio, e2e:a11y, e2e:pwa, e2e:taps
|
the production build played by touch, at the keyboard, in French, with Canvas | gate e2e, reference, secondGame
|
yes | — | — | — | — |
| e2e, WebKit | the same scripts with E2E_BROWSER=webkit
|
generic and keyboard rows, the reference chapter, e2e:pwa (offline skipped) |
gate e2e, reference
|
yes | — | — | — | — |
| e2e, Firefox |
npm run e2e:pwa, e2e:studio-hosted -- --browser=firefox
|
the PWA scenario; the hosted Studio | gate pwaFirefox, studioHosted
|
yes | — | — | — | — |
| Cross-runtime |
npm run e2e:canonical, e2e:remix, e2e:speedrun, e2e:remix-speedrun
|
the same results in Node, Chromium, WebKit and Firefox | yes (every change) | yes | yes (500 Remix seeds) | — | yes (500 Remix seeds) | — |
| Reality |
npm run e2e:reality, npm run reality:xcheck -- --require-rust, the connectors' tests and fuzz, the Bridge on Postgres |
signals end to end; Biscuit in JS and Rust; connectors | gate reality
|
yes |
reality:xcheck in release-check:ci
|
yes | fuzz, a minute per connector | — |
| Hosted Studio |
npx vitest run tests/studio-server.test.ts …, npm run e2e:studio-hosted, e2e:studio-collab
|
Postgres, S3, Keycloak; Chromium and Firefox | gate studioHosted
|
yes | studio-install-smoke |
— | — | — |
| Packages |
npm run fresh-install, npm run external-consumer, npm run upgrade-check -- --from=previous
|
packed, installed outside the repository, upgraded | gate freshInstall, upgrade
|
yes | yes, on the candidate's own archives | — | — | — |
| Mutation | npm run test:mutation:core -- --set=<set> |
every gated set (Mutation testing) | only with full-ci
|
— | yes | yes | yes (--fresh) |
— |
| Bridge loads |
npm run bridge:load, npm run runs:load
|
SQLite and Postgres | — | — | yes (medians) | — | yes | — |
| Qualification | npm run ops:qualify |
the Bridge's deployment profile on Docker | when ops/, bridge/, scripts/pack.mjs or the dependencies change (qualify) |
same paths | yes (deployment-smoke) |
— | — | — |
| Field passes | npm run field:* |
what only people and real devices can check | — | — | the reports committed for the version are checked | reported in the notes | — | — |
The release workflow does not rebuild what the candidate made: its tests are release-check:ci and the mutation
sets, on the tag's commit (Releasing).
Limit ·
heavy-not-on-prThe heavy solver tests do not run on an ordinary pull request. Thefull-cilabel starts a candidate run, which runs them three times; otherwise a change to the solver that breaks them is seen by the next nightly. Runnpm run test:heavylocally (about 13 minutes on a laptop, one file after the other) before asking for a review of such a change.
Before a pull request gives the order. In short: npm run quality, npm run check,
npm run test:assets, npm run verify:game, npm run quality:baseline -- --check; npm run release-check:local
chains most of it. Run one suite at a time.
One test runs on CI only: the Telnet connector's stress test in tests/connectors-terminal.test.ts (a thousand
connections at once), which macOS's default limits fail on a developer's machine. It is skipped unless CI is set,
as GitHub Actions does on every job; TELNET_STRESS=1 npx vitest run tests/connectors-terminal.test.ts runs it
locally.
-
A command: grep its key in
tests/cmds.test.ts(every key has an example there) andtests/core.test.ts. -
A layer rule:
tests/boundaries.test.ts(Import boundaries). -
The public names:
tests/api-surface.json. -
A browser behaviour: the scripts
scripts/e2e*.mjsandscripts/e2e-*.ts(npm run e2e,e2e:taps,e2e:pwa,e2e:a11y…), run by CI in Chromium and WebKit (and Firefox for the PWA and the hosted Studio). - What a stop of the code walks: each stop of the Code tour names its test.
-
What a mutant judges:
TESTSintools/mutation-sets.tslists, for each set, the test files that judge it (npx tsx tools/mutation-sets.ts --tests=<set>).
To change a command end to end, follow The dev loop.
-
npm test,npm run test:node,npm run test:coverage,npm run test:assets,npm run test:heavy,npm run verify:game,npm run prove:game,npm run prove:matrix,npm run audit:corpus,npm run e2e. - CI explained, The coverage ratchet, The quality baseline, Mutation testing.
Generated publication · publication générée — current documentation · documentation courante: quest'n'click 4.5.6 r1, documentation revision · révision de la documentation b44e7ba85533917f81210fc43e839a86745668d9.
Latest documentation · dernière documentation: https://quest-n-click.cleverapps.io/docs · https://quest-n-click.cleverapps.io/fr/docs; earlier versions · versions précédentes: each release's quest-n-click-docs-<version>.tar.gz · l'archive quest-n-click-docs-<version>.tar.gz de chaque release, https://github.com/Quest-n-Click/quest-n-click/releases
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 (18)
- Requirements
- Install from the release archive
- Install from npm
- 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.5
- 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