Repository navigation
feat: finish 002 backend — Steam display names, structured player entries, rcon.authentication - #635
Conversation
A failed GetPlayerSummaries call (unreachable, 5xx, 429, timeout, netguard block, bad JSON) no longer writes negative cache entries; only ids a successful response omitted are negative-cached (002 data-model §8d-i). The outage warning is rate-limited to once a minute. Adds the T097/T100 resolver and singleflight cases. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Signed-off-by: Claude <noreply@anthropic.com>
GAMEPLANE_STEAM_API_KEY (env only, from api.steam.apiKeySecretRef) turns
on the Steam name resolver; four flag+env knobs tune its in-memory
cache. GET /servers/{name}/players adds displayName to structured
entries within a 1.5s budget and otherwise passes the agent response
through byte for byte. Moderation routes stay keyed on Steam ID.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Signed-off-by: Claude <noreply@anthropic.com>
When the list command returns {"Players":[{"steamId","faction"}]}
(Nuclear Option get-player-list), the snapshot carries entries with
steamId and faction, and players stays the flat list of Steam IDs so
existing clients are unaffected. Other games keep the regex path.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Signed-off-by: Claude <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Signed-off-by: Claude <noreply@anthropic.com>
Nuclear Option's remote-command port has no authentication and is loopback-only, so the per-server password Secret was never read. Exempt it like cli (002 T024). Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Signed-off-by: Claude <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Signed-off-by: Claude <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Signed-off-by: Claude <noreply@anthropic.com>
GameTemplate spec.rcon.authentication (default true) keeps today's behaviour. false means the console has no authentication, so the operator mints no <gs>-rcon Secret, mounts nothing for the agent and injects no password env; a CEL rule rejects false together with passwordSecretRef, passwordEnv or passwordFile. Replaces the protocol-specific nuclearoption exemption with this field. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Signed-off-by: Claude <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Signed-off-by: Claude <noreply@anthropic.com>
pool-e2e-single (one address, autoAssign false) exists only so TestAddressPool_PoolExhausted can exhaust a pool without starving the parallel address-pool tests. The second server must report AddressAssignment False with reason AllocationFailed. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Signed-off-by: Claude <noreply@anthropic.com>
Ticks the 61 tasks that are implemented (36 already on master before this branch, 25 by this branch) with evidence, records the 2026-10-09 maintainer rulings in plan.md Decisions 10 and 11, and writes the T022 display-name decision into spec.md. Join-test, module, design and real-server tasks stay open. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Signed-off-by: Claude <noreply@anthropic.com>
|
Warning Review limit reachedYou've used all free OSS reviews for now. Wait for the free limit to reset to keep reviewing this public repository. Next included review available in 51 minutes. View limit detailsLimit details: You’ve used the included review currently available. Review configuration: ⚙️ Run configuration
📒 Files selected for processing (47)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Signed-off-by: Claude <noreply@anthropic.com>
CI Report - 3643a6frun 37977306202 - attempt 1 0 failed - 26 passed - 0 skipped - 67m47s elapsed Coverage
Changed
Slowest jobs
e2e buckets run
|
|
The proposed fix is to assert that the host is not the pool's only address and that the endpoint Generated by Claude Code |
While allocation has failed the operator reports the Service ClusterIP as endpoint host. Assert the exhausted pool address was not handed out and no pool is stamped, instead of requiring an empty host. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Signed-off-by: Claude <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Signed-off-by: Claude <noreply@anthropic.com>
Before: the Steam display-name resolver (
api/internal/steam/) existed but nothing used it, and it negative-cached every id whenever a call to Steam failed. Nuclear Option player lists were a regex over the JSON body, so faction was lost. Templates had no way to say "this console has no password", so the operator minted an RCON Secret nobody read. Spec 002 had 87 unchecked tasks, many already built.After: with an optional Steam Web API key (
api.steam.apiKeySecretRef),GET /servers/{name}/playersaddsdisplayNameto structured entries, and falls back to raw Steam IDs on any failure. The agent returnsentries: [{steamId, faction}]for JSON player lists whileplayersstays the flat Steam-ID list, so the current dashboard keeps working. GameTemplates can setspec.rcon.authentication: false(defaulttrue) to skip the password Secret. Spec 002 now has 26 open tasks: module repo work, the UDP join tests the maintainer kept open, the Players tab design pass, and real-server checks.How:
fix(api): call-level failures (unreachable, 5xx, 429, timeout, netguard block, bad JSON) no longer write negative cache entries (data-model §8d-i); the warning is rate-limited.feat(api,chart):GAMEPLANE_STEAM_API_KEY(env only) plus four cache knobs; the hydration handler has a 1.5 s budget and otherwise passes the agent's bytes through unchanged. Kick/ban/unban stay keyed on Steam ID.feat(agent): JSON{"Players":[...]}list output is decoded intoentries; other games keep the regex path.feat(operator):RCONSpec.Authentication *bool(default true) with a CEL rule rejectingfalsetogether with a password source;make generate && make manifestsoutput is included (the other CRDs only change their bundle-hash stamp).web/src/types.tsmirrors the field (type only).pool-e2e-single, used only by that test).Not in this PR: the Players tab (T095/T096/T102) waits for the Pencil design pass. The Nuclear Option template changes (
authentication: false, repin to the org image, resources, constraints, actions,specs.md) go to GameplanePanel/module first, followed by a submodule bump. Until then, Nuclear Option servers get an unused password Secret again, which is harmless.Local checks:
go build ./...and compile-onlygo test -cfor every touched package; tests run in CI.🤖 Generated with Claude Code
Generated by Claude Code