Commit Graph
65 Commits
Author SHA1 Message Date
git_pipelineandClaude Opus 5.5 5c192127f4 test(satisfactory): allow 40 minutes for the SteamCMD install and first start
Validate game templates / validate (push) Successful in 19s
Validate game templates / boot-test (push) Successful in 3m48s
Validate game templates / publish (push) Skipped
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MZxvxViV6QwAtVWT3saGvs
2026-11-07 01:45:59 +00:00
git_pipelineandClaude Opus 5.5 b9d445c57d fix(satisfactory): run the official SteamCMD server instead of wolveix/satisfactory-server
Validate game templates / validate (push) Successful in 45s
Validate game templates / boot-test (push) Successful in 5m57s
Validate game templates / publish (push) Skipped
The wolveix image keeps its game files and saves in /config and /home/steam, outside the server volume, so they were lost on every start and the weekly boot test failed. Now: cm2network/steamcmd with Steam app 1690800, HOME=/server, ports 7777/udp+tcp and 8888/tcp, MaxPlayers in Game.ini, -ExternalReliablePort for the public reliable port.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MZxvxViV6QwAtVWT3saGvs
2026-11-07 01:45:00 +00:00
greg 1fcf05cc27 Merge pull request 'feat(boot-test): CI boot tests use the Steam download cache, updated once a day' (#26) from feat/ci-steam-cache into main
Builder image / publish (push) Successful in 20s
Validate game templates / validate (push) Successful in 23s
Validate game templates / boot-test (push) Skipped
Validate game templates / publish (push) Skipped
2026-10-26 23:28:24 +00:00
gregandClaude Opus 5.5 6baf4796fa feat(boot-test): CI boot tests use the Steam download cache, updated once a day
Validate game templates / validate (push) Successful in 21s
Validate game templates / boot-test (push) Skipped
Validate game templates / publish (push) Skipped
CI deployed every Steam game from scratch on each run, downloading the whole
game from Steam each time. scripts/boot-test.sh now runs the new
`gbrgames boot-test ID`, the builder's own deploy path: the same payload and
node-agent BootTest, but Steam games start from the cache volume
(gbr-steamcache-<app>, kept by RUNNER.md's prune).

The cache is updated at most once a day (a timestamp in the cache volume, not
copied into servers), so a repeat run within a day doesn't ask Steam for an
update at all; the node-agent's own install still checks the files and fetches
anything newer.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-26 19:12:20 -04:00
greg 143a074c7d Merge pull request 'feat(builder): boots as nodes run them, fixed-size model requests, safety check, repairs' (#25) from feat/builder-boot-fidelity-repair into main
Builder image / publish (push) Successful in 24s
Validate game templates / validate (push) Successful in 28s
Validate game templates / boot-test (push) Successful in 1m10s
Validate game templates / publish (push) Successful in 20s
2026-10-26 13:49:26 +00:00
gregandClaude Opus 5.5 f1271341ef feat(builder): repair existing templates, a weekly check that queues repairs, and eval
Validate game templates / validate (push) Successful in 36s
Validate game templates / boot-test (push) Successful in 1m11s
Validate game templates / publish (push) Skipped
The builder could only create games; nothing noticed when a live template
stopped working, and there was no way to tell whether a builder change made
it better or worse.

- repair -id ID: boots an existing template as nodes run it; if it fails,
  the same investigation as for a draft runs and the model changes only what
  the diagnosis says. The worker handles "repair" jobs (gameId from the
  panel) and opens "fix(games): repair ..." on draft/<id>; a template that
  boots as it is reports "nothing to repair" and opens no PR. The boot and
  fix loop is now shared by builds and repairs.
- validate.yml runs weekly and boot-tests every game; failed games are sent
  to the panel (X-GBR-Event: games_boot_failed) to queue repairs.
- eval -ids all: builds games that already have a template from scratch,
  blind, and scores each draft against it (boots, same image and app, ports,
  ready line, settings found) into eval.md and eval.json.
- research skips our own sites, so neither research nor eval reads our
  templates back.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-26 00:42:34 -04:00
gregandClaude Opus 5.5 f11c5eaf2f feat(builder): bounded model requests, a safety check, and a clearer PR summary
- The drafter no longer grows one conversation. Each request is the rules
  and facts, the model's latest template, what is wrong now and one line per
  earlier round, so long builds can't push the facts out of the model's
  32K context (Ollama drops the oldest part silently). The image's scripts
  in the facts are capped at 24000 characters in all, and diagnosis check
  results at 16000.
- Every model call logs its prompt and answer tokens, with a warning near
  the context limit.
- unsafeCommands: a draft whose startup command or installConfig pipes a
  download into a shell, decodes base64, uses eval, raw network tools or
  /dev/tcp, sudo/su, setuid bits, writes /etc, touches cron/systemd/firewall,
  or looks like a miner goes back to the model. AUTHORING.md has the rule.
- The PR summary lists every address nodes would download from under
  "Review carefully", marks the measured checks as measured, and labels the
  research notes as the model's reading, not checked.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-26 00:42:34 -04:00
gregandClaude Opus 5.5 709cdb51e8 fix(builder): don't count Docker's init or the Steam client's own files as lost saves
Every container the node-agent starts gets /usr/sbin/docker-init, and SteamCMD
rewrites its own config.vdf on every run. Counted as files written outside the
volumes, they made every build look like it loses saves. A folder whose only
changes were logs no longer counts either, and a folder followed by a
same-named file (worlds, worlds.bak) is no longer taken for a file.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-26 00:42:34 -04:00
gregandClaude Opus 5.5 d225e49a8a feat(boot-test): test.yaml unboundPorts for ports opened only when a player connects
Some servers open a published port only once a player connects (through a
proxy, for example), so the boot test's port check can't see it after boot.
A template lists those ports as unboundPorts in its test.yaml, with the
reason. The first template that needs it lists one UDP port, until a real
client confirms how players reach it.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-26 00:42:33 -04:00
gregandClaude Opus 5.5 0dc784dfa2 fix(builder): use a local node-agent image when it can't be pulled
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-26 00:01:54 -04:00
gregandClaude Opus 5.5 04967a8a16 feat(builder): every boot through the node-agent, every lost file counted, Steam cache
What a builder boot sees is now what a node does:
- First boots (untouched, or -as-deployed with exactly a new server's
  settings) are deployed by the node-agent's BootTest in keep mode; the
  builder only watches the console and inspects what's left. The Go copy of
  the deploy (its own docker run, mounts and startup prefix) is gone. It had
  drifted: it gave the image's VOLUME folders their own volumes, which nodes
  don't, so saves there looked safe while every start loses them.
- Files written outside /server and /data are counted whatever their type
  (it only counted config-like extensions, so .sav or .db saves went
  unseen), including the image's VOLUME folders; logs, pid and lock files
  and system folders are left out.
- Boot tests ask the server to stay up holdSec (60 s, test.yaml can set it)
  after its ready line and to listen on every published container port
  (needs the node-agent's matching BootTest).
- Steam apps are downloaded once per build into a gbr.cache volume and copied
  into each boot, so later boots only check the files (STEAM_CACHE=off).
- RUNNER.md no longer suggests docker system prune, which deletes the
  gbr-boottest network when nothing is using it.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-26 00:00:50 -04:00
greg e07025f03d Merge pull request 'feat(builder): diagnose a failed boot before changing the template' (#23) from feat/builder-diagnose into main
Builder image / publish (push) Successful in 21s
Validate game templates / validate (push) Successful in 24s
Validate game templates / boot-test (push) Skipped
Validate game templates / publish (push) Skipped
Reviewed-on: #23
2026-10-26 03:21:36 +00:00
gregandClaude Opus 5.5 487dfbdf68 feat(builder): diagnose a failed boot before changing the template
Validate game templates / validate (push) Successful in 21s
Validate game templates / boot-test (push) Skipped
Validate game templates / publish (push) Skipped
A failed boot went straight back to the model as "fix it", so it guessed:
one draft raised its memory three rounds in a row while the real cause, an
empty setting the server can't run without, stayed untouched.

Now a failed boot is investigated first:
- Evidence: the server's distinct error lines (timestamps and repeats
  removed), and a web search on the most telling one, with the top answer
  read through the reader.
- Diagnosis: the model states the cause, the evidence for it, its
  confidence and the exact fix. If unsure, it asks for up to 3 checks: a
  search, a page, the files the server writes (a first boot of the draft),
  or a boot test with settings or the startup command changed. Results go
  back to it, two rounds at most.
- Fix: the model applies exactly the diagnosed fix and nothing unrelated.
- Attempt log: each cause, fix and outcome. A fix that changed nothing
  rules its cause out; if the diagnosis returns to a ruled-out cause, the
  build stops instead of guessing, and the PR lists what the builder found.

Boot rounds go up to 5, since rounds now end on a ruled-out cause rather
than a fixed count.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-25 23:15:33 -04:00
greg 4874868ce6 Merge pull request 'feat(research): one option per way to run a game, SteamCMD recommended' (#22) from feat/builder-image-fallback into main
Builder image / publish (push) Successful in 21s
Validate game templates / validate (push) Successful in 24s
Validate game templates / boot-test (push) Skipped
Validate game templates / publish (push) Skipped
2026-10-26 03:12:15 +00:00
gregandClaude Opus 5.5 f2ffed5c98 feat(research): one option per way to run a game, SteamCMD recommended
Validate game templates / validate (push) Successful in 19s
Validate game templates / boot-test (push) Skipped
Validate game templates / publish (push) Skipped
A draft built on a ready-made image whose files all live outside /server
went round three times and ended as WIP, although research had also
verified the game's Steam app, which SteamCMD installs straight into
/server. The build picked among the variant's images on its own.

- research reads each Steam app's OS list. When it ships a Linux server,
  the SteamCMD route is the recommended option; for Windows-only servers,
  images that bring Proton or Wine come first. The research prompt says
  the same.
- A variant that can run on several images becomes one option per image
  ("... (SteamCMD)", "... (image x/y)"), so the admin picks exactly how the
  server runs.
- build uses exactly the chosen option and never switches to another; if it
  can't be made to work, the PR says so and another option can be picked.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-25 23:10:21 -04:00
greg 274ed68cc5 Merge pull request 'fix(boot-test): exactly what a new server gets, and pinpoint settings it can't start without' (#20) from feat/builder-pinpoint-empty-settings into main
Builder image / publish (push) Successful in 23s
Validate game templates / validate (push) Successful in 26s
Validate game templates / boot-test (push) Skipped
Validate game templates / publish (push) Skipped
2026-10-26 02:08:50 +00:00
gregandClaude Opus 5.5 fe790ad223 fix(boot-test): run every boot test with exactly what a new server gets
Validate game templates / validate (push) Successful in 22s
Validate game templates / boot-test (push) Skipped
Validate game templates / publish (push) Skipped
CI's boot test gave every blank password-like setting a throwaway value. A
real deploy only fills x-generate fields, so a template whose server won't
start without one passed CI and failed for the first owner who deployed it.

boottest-payload now fills only x-generate fields, for CI and the builder
alike. The old behaviour is kept as -fill-blank-passwords, used only by
the builder's second boot to tell whether an empty setting is why a draft
fails. Messages and AUTHORING.md no longer say boot tests fill passwords;
a server that needs a join password gets x-generate.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-25 22:01:16 -04:00
gregandClaude Opus 5.5 98ba043bec feat(builder): pinpoint settings a server can't start without
Validate game templates / validate (push) Successful in 20s
Validate game templates / boot-test (push) Skipped
Validate game templates / publish (push) Skipped
Booting drafts as deployed catches a server that stops when a setting is
empty, but the server's own output rarely says why, so the model guessed
(more memory) for three rounds and the draft ended as WIP.

When a draft fails with its defaults and has blank password-like settings
without x-generate, the builder boots it once more with those filled. If
that boot passes, the cause is certain, and the model is told exactly that:
these settings stop the server when empty; give them x-generate (a password
per server) or a working default.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-25 21:57:16 -04:00
greg cc4a8e357d Merge pull request 'fix(builder): boot drafts with the settings a new server really gets' (#18) from fix/builder-boot-as-deployed into main
Builder image / publish (push) Successful in 21s
Validate game templates / validate (push) Successful in 22s
Validate game templates / boot-test (push) Skipped
Validate game templates / publish (push) Skipped
Reviewed-on: #18
2026-10-26 01:31:14 +00:00
gregandClaude Opus 5.5 72a4280d44 fix(builder): boot drafts with the settings a new server really gets
Validate game templates / validate (push) Successful in 31s
Validate game templates / boot-test (push) Skipped
Validate game templates / publish (push) Skipped
The builder's boot test filled every blank password-like setting with a
throwaway value. A real deploy only fills x-generate fields, so a draft whose
server refuses to run with an empty join password passed the builder and CI,
and then shut down on its first real deploy.

The builder now boots drafts with boottest-payload -as-deployed: only
x-generate fields are filled, everything else exactly as the template's
defaults. A server that won't run with its own defaults fails the build, and
the model is told that empty settings stay empty, so the value must come from
a default or x-generate. CI's boot test is unchanged.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-25 21:14:17 -04:00
greg d1505991e4 Merge pull request 'fix(palworld): announce the published port, don't make it a setting' (#9) from fix/port-palworld into main
Validate game templates / validate (push) Successful in 21s
Validate game templates / boot-test (push) Successful in 3m51s
Validate game templates / publish (push) Successful in 18s
2026-10-26 00:40:34 +00:00
greg b1fb77f284 Merge branch 'main' into fix/port-palworld
Validate game templates / validate (push) Successful in 23s
Validate game templates / boot-test (push) Successful in 3m47s
Validate game templates / publish (push) Skipped
2026-10-26 00:34:58 +00:00
greg dccbaa6d3d Merge pull request 'fix(minecraft-crossplay): Java port is not a setting' (#8) from fix/port-minecraft-crossplay into main
Validate game templates / validate (push) Successful in 22s
Validate game templates / boot-test (push) Successful in 1m10s
Validate game templates / publish (push) Successful in 17s
2026-10-26 00:34:57 +00:00
greg 68c6a9c281 Merge branch 'main' into fix/port-minecraft-crossplay
Validate game templates / validate (push) Successful in 22s
Validate game templates / boot-test (push) Successful in 1m13s
Validate game templates / publish (push) Skipped
2026-10-26 00:26:18 +00:00
greg 2d63e8eb6d Merge pull request 'fix(ark-crossplay): game port is not a setting' (#7) from fix/port-ark-survival-ascended-crossplay into main
Validate game templates / validate (push) Successful in 22s
Validate game templates / boot-test (push) Successful in 6m17s
Validate game templates / publish (push) Successful in 17s
2026-10-26 00:26:17 +00:00
greg edc755fdb8 Merge branch 'main' into fix/port-ark-survival-ascended-crossplay
Validate game templates / validate (push) Successful in 19s
Validate game templates / boot-test (push) Successful in 5m58s
Validate game templates / publish (push) Skipped
2026-10-26 00:19:41 +00:00
openhands ef4d72621d Merge pull request 'fix(build): clear a killed boot test's container and volume first' (#16) from fix/worker-finish-job-on-stop into main
Builder image / publish (push) Successful in 21s
Validate game templates / validate (push) Successful in 24s
Validate game templates / boot-test (push) Skipped
Validate game templates / publish (push) Skipped
Reviewed-on: #16
2026-10-25 22:33:31 +00:00
gregandClaude Opus 5.5 e9e78610d6 fix(build): clear a killed boot test's container and volume first
Validate game templates / validate (push) Successful in 20s
Validate game templates / boot-test (push) Skipped
Validate game templates / publish (push) Skipped
When the worker is restarted mid-build (watchtower updating its image), the
boot test's container and volume are left behind, and the next boot test of
that game deploys under the same name. Remove them before each boot test.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-25 18:32:43 -04:00
openhands ea2c0b1eeb Merge pull request 'feat(worker): one draft per game; a rebuild replaces the earlier one' (#15) from fix/worker-branch-per-run into main
Builder image / publish (push) Successful in 22s
Validate game templates / validate (push) Successful in 24s
Validate game templates / boot-test (push) Skipped
Validate game templates / publish (push) Skipped
Reviewed-on: #15
2026-10-25 22:18:55 +00:00
gregandClaude Opus 5.5 5d7dee3305 feat(worker): one draft per game; a rebuild replaces the earlier one
Validate game templates / validate (push) Successful in 20s
Validate game templates / boot-test (push) Skipped
Validate game templates / publish (push) Skipped
The draft branch was named after the job. Rerunning a build pushed onto the
earlier run's branch, which had review commits, so the push was rejected
and the finished build failed at its last step. Separate branches per run
would pile up open PRs for the same game instead.

A game now has one draft at a time, on draft/<id>. Before pushing, the
worker closes the game's open draft PRs (draft/<id>, and draft/<id>-<job>
as earlier versions named them) and deletes their branches, then
force-pushes draft/<id> and opens the new PR, which says which PR it
replaces. Other games' drafts and anyone's non-draft branches are never
touched.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-25 18:17:28 -04:00
openhands f1d074bb11 Merge pull request 'feat(builder): documented launch options only, and no game-specific code' (#14) from feat/documented-launch-options into main
Builder image / publish (push) Successful in 22s
Validate game templates / validate (push) Successful in 24s
Validate game templates / boot-test (push) Skipped
Validate game templates / publish (push) Skipped
Reviewed-on: #14
2026-10-25 22:01:37 +00:00
gregandClaude Opus 5.5 8623ba2d7b feat(builder): documented launch options only, and no game-specific code
Validate game templates / validate (push) Successful in 20s
Validate game templates / boot-test (push) Skipped
Validate game templates / publish (push) Skipped
Launch options must be documented. A draft passed an option its server
doesn't have; servers ignore unknown options, so it booted and passed every
boot test while its setting did nothing. build now reads the pages research
based the variant on, in full, and the drafter rejects any launch option in
the startup command that none of them, nor the image's own scripts, mention.
Shell tools' options (mkdir -p, [ -n ...]) are skipped; the check is off
without sources.

The builder is game-agnostic:
- AUTHORING.md (the model's rules), the research prompt and the schema
  describe the rules without naming a game.
- The draft prompt no longer includes real templates from the repo. Its
  format example is one invented server (no real command, options, ports or
  app id), checked by TestExampleTemplateFollowsTheRules.
- Comments, help texts, BUILDER.md and test fixtures use invented names and
  values.
- TestBuilderIsGameAgnostic reads every game's name and id from games/ and
  fails if any appears in the builder's code, tests, rules, schemas or docs.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-25 17:58:53 -04:00
greg dd92b6be4c Merge pull request 'fix(worker): start with a repository-only token' (#12) from fix/worker-repo-scope-token into main
Builder image / publish (push) Successful in 22s
Validate game templates / validate (push) Successful in 24s
Validate game templates / boot-test (push) Skipped
Validate game templates / publish (push) Skipped
Reviewed-on: #12
2026-10-25 21:18:40 +00:00
gregandClaude Opus 5.5 0c868f7bac fix(worker): start with a repository-only token
Validate game templates / validate (push) Successful in 20s
Validate game templates / boot-test (push) Skipped
Validate game templates / publish (push) Skipped
The start-up check read the token's account with GET /user, which needs the
read:user scope. A token with only repository scope, which is all the worker
needs, got 403 and the worker exited in a restart loop. On 403 it now
names the commit author from BOT_NAME (default gbr-bot) and still checks
push access on the games repo.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-25 17:18:22 -04:00
greg 425c242ae7 Merge pull request 'fix(worker): commit as the token's account and check it can push' (#11) from fix/worker-bot-identity into main
Builder image / publish (push) Successful in 21s
Validate game templates / validate (push) Successful in 24s
Validate game templates / boot-test (push) Skipped
Validate game templates / publish (push) Skipped
Reviewed-on: #11
2026-10-25 21:07:49 +00:00
gregandClaude Opus 5.5 f3a2a1f099 fix(worker): commit as the token's account and check it can push
Validate game templates / validate (push) Successful in 21s
Validate game templates / boot-test (push) Skipped
Validate game templates / publish (push) Skipped
The worker committed as a hard-coded "gbr-bot", and a token without Write
access only showed up when a build finished and its push failed. On start it
now reads the token's account (GET /user) for the commit author, and
refuses to run if that account can't push to the games repo.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-25 16:28:54 -04:00
greg 929e7d68d0 Merge pull request 'feat(builder): research, build and a worker for the AI builder' (#6) from feat/builder-worker into main
Validate game templates / validate (push) Successful in 31s
Validate game templates / boot-test (push) Skipped
Validate game templates / publish (push) Skipped
Builder image / publish (push) Successful in 42s
Reviewed-on: #6
2026-10-25 20:22:45 +00:00
gregandClaude Opus 5.5 5dfc0cc794 fix(builder): drafts don't use CI secrets, and a missing one is fed back
Validate game templates / validate (push) Successful in 20s
Validate game templates / boot-test (push) Skipped
Validate game templates / publish (push) Skipped
The second Valheim build stopped before its boot test: told that
test.yaml's password "looks like a credential; map it under 'secrets'",
the model mapped it to a CI secret nobody created, and boottest-payload's
missing-secret exit ended the build.

- The validator now says to remove a test password first (boot tests fill
  password settings with a throwaway value); secrets only when the server
  can't start without a real one.
- Drafts with test.yaml 'secrets' fail the draft checks.
- build turns boottest-payload's missing-secret exit into feedback for the
  model instead of an error.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-25 15:52:18 -04:00
gregandClaude Opus 5.5 f6c2bda86a fix(palworld): announce the published port, don't make it a setting
Validate game templates / validate (push) Successful in 31s
Validate game templates / boot-test (push) Successful in 3m45s
Validate game templates / publish (push) Skipped
Nodes always publish container port 8211 and only move the host side. PublicPort (what the community server list announces) is now {PUBLIC_PORT_8211}, written unquoted, and the server binds -port=8211 directly.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-25 15:49:16 -04:00
gregandClaude Opus 5.5 133b78b730 fix(minecraft-crossplay): Java port is not a setting
Validate game templates / validate (push) Successful in 30s
Validate game templates / boot-test (push) Successful in 1m12s
Validate game templates / publish (push) Skipped
Nodes always publish container port 25565, so an owner-set SERVER_PORT made Java Edition unreachable. The image already defaults to 25565; the status ping uses pingPort 25565 instead of reading the setting.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-25 15:49:14 -04:00
gregandClaude Opus 5.5 1951b7e7e9 fix(ark-crossplay): game port is not a setting
Validate game templates / validate (push) Successful in 30s
Validate game templates / boot-test (push) Successful in 5m58s
Validate game templates / publish (push) Skipped
Nodes always publish container port 7777, so an owner-set Port made the server unreachable. The startup command now passes Port=7777 directly.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-25 15:49:12 -04:00
gregandClaude Opus 5.5 c2b22d3955 feat(draft): catch split text settings and owner-editable game ports
Validate game templates / validate (push) Successful in 19s
Validate game templates / boot-test (push) Skipped
Validate game templates / publish (push) Skipped
Two problems a draft can boot fine with but break once an owner changes a
setting, both in the builder's Valheim draft:

- splitSettings: text settings used unquoted on the command line, directly
  or through ARGS="-name ${SERVER_NAME}"; ./server $ARGS, so "GBRHosting -
  My Server" reaches the game as several arguments. Suggests quoting or a
  bash array.
- portSettings: game-port settings whose default isn't in defaultPorts, or
  that owners can change although nodes always publish the same container
  port. Internal ports (RCON, REST) and {PUBLIC_PORT_n} values are left out.

Both run on drafts only; AUTHORING.md gets the matching rules.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-25 15:43:27 -04:00
gregandClaude Opus 5.5 c75190d8c4 feat(builder): research, build and a worker for the AI builder
Validate game templates / validate (push) Successful in 19s
Validate game templates / boot-test (push) Skipped
Validate game templates / publish (push) Skipped
- research: searches SearXNG, reads the best pages through the reader, has the
  model list the server's variants, then checks every Docker image and Steam
  app it named for real before an admin sees it.
- build: first boot of the variant's images (skipping ones that need root),
  a draft by the model, then the draft deployed with the node-agent's
  BootTest like CI does; crashes, error lines and saves outside /server go
  back to the model, three boots at most.
- worker: polls the panel's builder queue (outbound only), runs research or
  build in a fresh clone, streams the output as the job log, and opens the
  result as a pull request from the bot account.
- Dockerfile.builder, a workflow publishing gbr-builder:latest, and
  BUILDER.md. Everything about where it runs comes from environment
  variables; deployment files live outside this public repo.

draft now keeps its conversation in a drafter, so build can send boot
failures back to the same model session. The boot-test runner comment no
longer names its VM.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-25 12:51:29 -04:00
greg 05bfc9b061 Merge pull request 'ci: stop waiting ~9 minutes on an unreachable cache' (#5) from ci/no-go-cache into main
Validate game templates / validate (push) Successful in 19s
Validate game templates / boot-test (push) Skipped
Validate game templates / publish (push) Skipped
2026-10-25 15:24:23 +00:00
greg e8216809d4 Merge branch 'main' into ci/no-go-cache
Validate game templates / validate (push) Successful in 19s
Validate game templates / boot-test (push) Skipped
Validate game templates / publish (push) Skipped
2026-10-25 15:20:41 +00:00
greg 07e8fd93f6 Merge pull request 'feat: draft new game templates with an AI model' (#4) from feat/ai-draft into main
Validate game templates / validate (push) Successful in 9m37s
Validate game templates / boot-test (push) Skipped
Validate game templates / publish (push) Skipped
2026-10-25 15:20:23 +00:00
gregandClaude Opus 5.5 d02ed01d26 ci: stop waiting ~9 minutes on an unreachable cache
Validate game templates / validate (push) Successful in 14s
Validate game templates / boot-test (push) Skipped
Validate game templates / publish (push) Skipped
Validate took ~10 minutes, of which ~10 seconds was work: setup-go's
cache restore and save each waited ~4.7 minutes for a connect timeout,
because the runners' built-in cache server sits on a network job
containers can't reach. Turn off setup-go caching (three small modules
aren't worth it) and the game-test runner's cache server, so any cache
step skips at once.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-25 11:12:55 -04:00
greg 43727f8284 Merge branch 'main' into feat/ai-draft
Validate game templates / validate (push) Successful in 9m41s
Validate game templates / boot-test (push) Skipped
Validate game templates / publish (push) Skipped
2026-10-25 15:10:22 +00:00
greg c23442e8fa Merge pull request 'fix(ark): retry the install; ready when advertising for join' (#3) from fix/ark-install-retry into main
Validate game templates / validate (push) Successful in 9m37s
Validate game templates / boot-test (push) Successful in 15m9s
Validate game templates / publish (push) Successful in 9m32s
2026-10-25 15:10:18 +00:00
greg ba09fe35d7 Merge branch 'main' into fix/ark-install-retry
Validate game templates / validate (push) Successful in 9m33s
Validate game templates / boot-test (push) Successful in 15m20s
Validate game templates / publish (push) Skipped
2026-10-25 07:09:33 +00:00