dev-deploy: enable Dev Sandbox bootstrap and synthetic-report loader
Tests · UI / test (push) Has been cancelled
Tests · Integration / integration (pull_request) Successful in 1m47s
Tests · Go / test (pull_request) Successful in 2m4s
Tests · UI / test (pull_request) Successful in 2m23s

Two long-standing dev-environment ergonomics had not survived the
move from the bespoke local-dev stack to the CI-driven dev-deploy:

1. `BACKEND_DEV_SANDBOX_EMAIL` defaulted to an empty string in the
   dev-deploy compose, so the auto-provisioned "Dev Sandbox" game
   never appeared on `https://www.galaxy.lan`. Bake `dev@galaxy.lan`
   as the default — matches `.env.example` and lets a developer who
   logs in with that email find a ready-to-play game in the lobby.

2. The lobby's synthetic-report loader was gated on
   `import.meta.env.DEV`, which is true only for `vite dev` (the
   tools/local-dev path). The long-lived dev environment builds
   with `vite build` (production mode), so the section was always
   stripped from its bundle. Gate it on an explicit
   `VITE_GALAXY_DEV_AFFORDANCES` flag instead and set it both in
   `.env.development` (preserves `pnpm dev` behaviour) and in the
   `dev-deploy.yaml` build step. The `prod-build.yaml` build path
   leaves the flag unset, so production stays clean.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
Ilia Denisov
2026-05-16 21:46:24 +02:00
parent 859b157a59
commit 81917acc3e
5 changed files with 26 additions and 4 deletions
+5
View File
@@ -69,6 +69,11 @@ jobs:
working-directory: ui/frontend working-directory: ui/frontend
env: env:
VITE_GATEWAY_BASE_URL: https://api.galaxy.lan VITE_GATEWAY_BASE_URL: https://api.galaxy.lan
# Surface the synthetic-report loader and similar dev-only
# affordances in the long-lived dev bundle. The prod build
# path (`prod-build.yaml`) leaves this flag unset so the
# production bundle keeps the same affordances stripped.
VITE_GALAXY_DEV_AFFORDANCES: "true"
run: | run: |
# The response-signing public key is committed in # The response-signing public key is committed in
# `.env.development` alongside its private counterpart in # `.env.development` alongside its private counterpart in
+1
View File
@@ -62,6 +62,7 @@ seed-ui:
@echo "building UI (vite build)…" @echo "building UI (vite build)…"
(cd $(REPO_ROOT)/ui/frontend && \ (cd $(REPO_ROOT)/ui/frontend && \
VITE_GATEWAY_BASE_URL=https://api.galaxy.lan \ VITE_GATEWAY_BASE_URL=https://api.galaxy.lan \
VITE_GALAXY_DEV_AFFORDANCES=true \
VITE_GATEWAY_RESPONSE_PUBLIC_KEY=$$(cat $(REPO_ROOT)/ui/frontend/.env.development \ VITE_GATEWAY_RESPONSE_PUBLIC_KEY=$$(cat $(REPO_ROOT)/ui/frontend/.env.development \
| sed -n 's/^VITE_GATEWAY_RESPONSE_PUBLIC_KEY=//p') \ | sed -n 's/^VITE_GATEWAY_RESPONSE_PUBLIC_KEY=//p') \
pnpm build) pnpm build)
+6 -1
View File
@@ -107,7 +107,12 @@ services:
# bcrypt-hashed code is single-use). Set the var to an empty # bcrypt-hashed code is single-use). Set the var to an empty
# string in `.env` to disable. # string in `.env` to disable.
BACKEND_AUTH_DEV_FIXED_CODE: ${BACKEND_AUTH_DEV_FIXED_CODE:-123456} BACKEND_AUTH_DEV_FIXED_CODE: ${BACKEND_AUTH_DEV_FIXED_CODE:-123456}
BACKEND_DEV_SANDBOX_EMAIL: ${BACKEND_DEV_SANDBOX_EMAIL:-} # Long-lived dev environment always bootstraps the "Dev Sandbox"
# game owned by this email so a freshly redeployed stack already
# has one ready-to-play game in the lobby. Set the variable to an
# empty string in `.env` to disable the bootstrap (e.g. for a
# cold-start QA pass).
BACKEND_DEV_SANDBOX_EMAIL: ${BACKEND_DEV_SANDBOX_EMAIL:-dev@galaxy.lan}
BACKEND_DEV_SANDBOX_ENGINE_IMAGE: ${BACKEND_DEV_SANDBOX_ENGINE_IMAGE:-galaxy-engine:dev} BACKEND_DEV_SANDBOX_ENGINE_IMAGE: ${BACKEND_DEV_SANDBOX_ENGINE_IMAGE:-galaxy-engine:dev}
BACKEND_DEV_SANDBOX_ENGINE_VERSION: ${BACKEND_DEV_SANDBOX_ENGINE_VERSION:-0.1.0} BACKEND_DEV_SANDBOX_ENGINE_VERSION: ${BACKEND_DEV_SANDBOX_ENGINE_VERSION:-0.1.0}
BACKEND_DEV_SANDBOX_PLAYER_COUNT: ${BACKEND_DEV_SANDBOX_PLAYER_COUNT:-20} BACKEND_DEV_SANDBOX_PLAYER_COUNT: ${BACKEND_DEV_SANDBOX_PLAYER_COUNT:-20}
+6
View File
@@ -16,3 +16,9 @@ VITE_GATEWAY_BASE_URL=http://localhost:5173
# key. Pairs with `tools/local-dev/keys/gateway-response.pem`. The pair # key. Pairs with `tools/local-dev/keys/gateway-response.pem`. The pair
# is dev-only — see `tools/local-dev/keys/README.md` before rotating. # is dev-only — see `tools/local-dev/keys/README.md` before rotating.
VITE_GATEWAY_RESPONSE_PUBLIC_KEY=nIG54tCuNiIKrazt8Hh7YxmmU/BhpseGhIIgj164Chw= VITE_GATEWAY_RESPONSE_PUBLIC_KEY=nIG54tCuNiIKrazt8Hh7YxmmU/BhpseGhIIgj164Chw=
# Opt in to dev-time UI affordances that should never reach a
# production bundle — currently the synthetic-report loader in the
# lobby. Mirror this flag in any long-lived dev build (e.g.
# `dev-deploy.yaml`); the prod build path leaves it unset.
VITE_GALAXY_DEV_AFFORDANCES=true
+8 -3
View File
@@ -375,13 +375,18 @@
{/if} {/if}
</section> </section>
{#if import.meta.env.DEV} {#if import.meta.env.VITE_GALAXY_DEV_AFFORDANCES === "true"}
<!-- <!--
Synthetic-report loader. DEV-only affordance for visual testing Synthetic-report loader. Dev-only affordance for visual testing
against rich game states without playing many turns. The JSON against rich game states without playing many turns. The JSON
is produced offline by the Go CLI in is produced offline by the Go CLI in
`tools/local-dev/legacy-report/`; see `tools/local-dev/legacy-report/`; see
`ui/docs/testing.md#synthetic-reports` for the workflow. `ui/docs/testing.md#synthetic-reports` for the workflow. Gated
on `VITE_GALAXY_DEV_AFFORDANCES` (set in `.env.development` and
mirrored by `dev-deploy.yaml`) rather than `import.meta.env.DEV`
so the long-lived dev environment can also surface it from a
production-mode bundle. The prod build path leaves the flag
unset, so the section is stripped from prod chunks.
--> -->
<section data-testid="lobby-synthetic-section"> <section data-testid="lobby-synthetic-section">
<h2>Synthetic test reports (DEV)</h2> <h2>Synthetic test reports (DEV)</h2>