feat(builder): repair existing templates, a weekly check that queues repairs, and eval
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>
This commit is contained in:
1 parent
00cc61aba2
commit
17f6477b71
12 files changed
+535
-20
No files matched your search
@@ -79,3 +79,32 @@ configSchema:
|
||||
t.Errorf("message: %s", msg)
|
||||
}
|
||||
}
|
||||
|
||||
func TestScoreDraftAgainstTheRealTemplate(t *testing.T) {
|
||||
real := map[string]any{"defaultDockerImage": "cm2network/steamcmd", "installMethod": "STEAMCMD",
|
||||
"installConfig": map[string]any{"appId": "1000000"}, "defaultPorts": []any{"30000/udp", "30001/udp"},
|
||||
"configSchema": map[string]any{"properties": map[string]any{"ServerName": map[string]any{}, "MaxPlayers": map[string]any{}}}}
|
||||
draft := map[string]any{"defaultDockerImage": "cm2network/steamcmd", "installMethod": "STEAMCMD",
|
||||
"installConfig": map[string]any{"appId": "1000000"}, "defaultPorts": []any{"30000/udp", "30002/tcp"},
|
||||
"readyPattern": `Server is ready`,
|
||||
"configSchema": map[string]any{"properties": map[string]any{"SERVER_NAME": map[string]any{}, "WorldName": map[string]any{}}}}
|
||||
var s evalScore
|
||||
scoreDraft(&s, real, map[string]any{"readyExample": "12:00:01 Server is ready for players"}, draft)
|
||||
if !s.SameRoute || s.PortsSame || !s.ReadyMatch || s.SettingsHit != 1 || s.RealSetting != 2 || s.Settings != 2 {
|
||||
t.Errorf("score %+v", s)
|
||||
}
|
||||
if strings.Join(s.PortsDiff, ",") != "extra 30002/tcp,missing 30001/udp" {
|
||||
t.Errorf("ports diff %v", s.PortsDiff)
|
||||
}
|
||||
}
|
||||
|
||||
func TestPRTextForBuildsAndRepairs(t *testing.T) {
|
||||
_, title := prText("Example", "job1", &buildResult{Passed: true})
|
||||
if title != "feat(games): add Example" {
|
||||
t.Errorf("build title %q", title)
|
||||
}
|
||||
commit, title := prText("Example", "job1", &buildResult{Repair: true})
|
||||
if title != "WIP: fix(games): repair Example (did not boot yet)" || !strings.HasPrefix(commit, "fix(games): repair Example") {
|
||||
t.Errorf("repair %q / %q", title, commit)
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user