One short probe (--network none, entrypoint bypassed): accounts, home folder owners and modes, tools (java, steamcmd, proton…), the startup scripts, and the variables those scripts read.
Then it checks the template against those facts:
Container user: an image built around its own user (a locked home owned by another uid, or a declared USER) needs a matching containerUser. Only the uid is compared.
Startup variables: the startup command must read settings under the names the node gives them (the agent's toUpperSnakeCase), and must not read unset variables with no default.
-json prints everything for tooling, which is the input the AI builder will use.
Results
The ARK template from the first commit: both bugs boot tests found today, in seconds:
image needs containerUser "25000:25000" … template runs as 1000:1000
startup command reads ${RCON_PORT}, but the setting arrives as RCONPORT
All 5 current templates: no problems (Minecraft, Palworld, Dragonwilds and Satisfactory images all run as uid 1000).
Boot tests now run it before each boot, so such templates fail in seconds instead of after a boot.
Tests
Unit tests (no Docker): env-var naming matches the node-agent, probe parsing, user suggestions (locked home, uid 1000, open home, declared USER), and the template checks, including no false positives for assigned and defaulted variables.
First piece of the self-sufficient game builder: facts from the image itself instead of web search.
## What
`gbrgames inspect-image -game <id>` (or `inspect-image IMAGE`) pulls the image and reads, **without starting the game**:
- Docker metadata: default user, env, exposed ports, volumes, entrypoint.
- One short probe (`--network none`, entrypoint bypassed): accounts, home folder owners and modes, tools (java, steamcmd, proton…), the startup scripts, and the variables those scripts read.
Then it checks the template against those facts:
- **Container user:** an image built around its own user (a locked home owned by another uid, or a declared `USER`) needs a matching `containerUser`. Only the uid is compared.
- **Startup variables:** the startup command must read settings under the names the node gives them (the agent's `toUpperSnakeCase`), and must not read unset variables with no default.
`-json` prints everything for tooling, which is the input the AI builder will use.
## Results
- **The ARK template from the first commit:** both bugs boot tests found today, in seconds:
- `image needs containerUser "25000:25000" … template runs as 1000:1000`
- `startup command reads ${RCON_PORT}, but the setting arrives as RCONPORT`
- **All 5 current templates:** no problems (Minecraft, Palworld, Dragonwilds and Satisfactory images all run as uid 1000).
Boot tests now run it before each boot, so such templates fail in seconds instead of after a boot.
## Tests
Unit tests (no Docker): env-var naming matches the node-agent, probe parsing, user suggestions (locked home, uid 1000, open home, declared USER), and the template checks, including no false positives for assigned and defaulted variables.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
`gbrgames inspect-image -game <id>` pulls the image and reads, without
starting the game (probe runs with --network none and bypasses the
entrypoint): its user, accounts, home folder owners and modes, tools
(java, steamcmd, proton...), startup scripts and the variables they read.
It then checks the template against those facts:
- an image built around its own user (a locked home owned by another uid,
or a declared USER) needs a matching containerUser
- the startup command must read settings under the names the node gives
them (the agent's toUpperSnakeCase), and must not read unset variables
that have no default
On the template from the first commit it reports both ARK bugs found by
boot tests today (uid 25000; ${RCON_PORT} vs RCONPORT); the current five
templates pass. Boot tests now run it first, so such templates fail in
seconds instead of after a boot. -json prints the facts for tooling.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The boot-test.sh change runs inspect-image without -no-pull, so every CI push now performs a docker pull and a registry outage or rate-limit will fail all boot tests for reasons unrelated to the code change.
When the probe shell partially succeeds (e.g. stat missing in a minimal image), runProbe
>_Automated AI Review_
Here's some quick feedback on your PR:
- The `boot-test.sh` change runs `inspect-image` without `-no-pull`, so every CI push now performs a `docker pull` and a registry outage or rate-limit will fail all boot tests for reasons unrelated to the code change.
- When the probe shell partially succeeds (e.g. `stat` missing in a minimal image), `runProbe`
`gbrgames first-boot -game <id>` (or -image for a game with no template)
starts the server once like the node-agent does (same volumes, user,
SteamCMD install and startup prefix) but with none of the template's
settings and no restart policy, in the isolated gbr-boottest network.
It watches the console until the server exits, goes quiet or hits -max,
stops it gracefully (many servers write their settings on shutdown) and
records:
- the console with timings, plus ready and error lines; the last strong
ready line before the stop becomes a readyPattern / readyExample pair
- every file created; config files are copied out and parsed into
settings with their defaults (INI, properties, JSON, YAML, Unreal
OptionSettings=(...) lists); log files are scanned for ready lines too
- files written outside the volumes, which a recreated container loses
Minecraft: ready line `Done \([0-9.]+s\)! For help, type "help"` and 76
settings (69 from server.properties) found with no template input. ARK:
showed its image retries nothing when SteamCMD fails with "Missing
configuration" and starts a server that was never installed.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
First piece of the self-sufficient game builder: facts from the image itself instead of web search.
What
gbrgames inspect-image -game <id>(orinspect-image IMAGE) pulls the image and reads, without starting the game:--network none, entrypoint bypassed): accounts, home folder owners and modes, tools (java, steamcmd, proton…), the startup scripts, and the variables those scripts read.Then it checks the template against those facts:
USER) needs a matchingcontainerUser. Only the uid is compared.toUpperSnakeCase), and must not read unset variables with no default.-jsonprints everything for tooling, which is the input the AI builder will use.Results
image needs containerUser "25000:25000" … template runs as 1000:1000startup command reads ${RCON_PORT}, but the setting arrives as RCONPORTBoot tests now run it before each boot, so such templates fail in seconds instead of after a boot.
Tests
Unit tests (no Docker): env-var naming matches the node-agent, probe parsing, user suggestions (locked home, uid 1000, open home, declared USER), and the template checks, including no false positives for assigned and defaulted variables.
🤖 Generated with Claude Code
`gbrgames inspect-image -game <id>` pulls the image and reads, without starting the game (probe runs with --network none and bypasses the entrypoint): its user, accounts, home folder owners and modes, tools (java, steamcmd, proton...), startup scripts and the variables they read. It then checks the template against those facts: - an image built around its own user (a locked home owned by another uid, or a declared USER) needs a matching containerUser - the startup command must read settings under the names the node gives them (the agent's toUpperSnakeCase), and must not read unset variables that have no default On the template from the first commit it reports both ARK bugs found by boot tests today (uid 25000; ${RCON_PORT} vs RCONPORT); the current five templates pass. Boot tests now run it first, so such templates fail in seconds instead of after a boot. -json prints the facts for tooling. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>Here's some quick feedback on your PR:
boot-test.shchange runsinspect-imagewithout-no-pull, so every CI push now performs adocker pulland a registry outage or rate-limit will fail all boot tests for reasons unrelated to the code change.statmissing in a minimal image),runProbeHere's some quick feedback on your PR: