diff --git a/multiplayer-next.md b/multiplayer-next.md index 374af4e5..b30f0e77 100644 --- a/multiplayer-next.md +++ b/multiplayer-next.md @@ -1503,7 +1503,7 @@ proposal cannot create false timeout penalties for its innocent participants. The following Phase 8 slices have local implementation and verification evidence in this document: 8.29 dynamic allocated launch flags and endpoint handling; 8.30 allocator claim/reconciliation including provider-outcome recovery fencing and durable arena identity (migrations 0008–0009); 8.31 signed assignment/roster validation; 8.35 initial-connect no-show and casual bot policy; 8.36 controlled drain and shutdown acknowledgment; 8.39–8.43 client state, assignment, profile, recovery, and idempotent action retry; 8.44 structured observability and content-aware redaction; 8.45 bounded API metrics export plus optional Prometheus scrape/alert rules; 8.46 normal/race/vet/fuzz coverage; 8.47–8.48 offline/testkit/Compose coverage; 8.50 atomic stalled-allocation recovery notifications; 8.51 the 10,000-client API load boundary; 8.52 the opt-in per-replica plus shared PostgreSQL regional allocator quota; and 8.53 the fail-closed promotion validator. Their remaining acceptance text is infrastructure or production dependent where explicitly noted below the corresponding row. -The following are not locally certifiable from this workspace and remain open prerequisites rather than silently “done”: Valve/GodotSteam credentials and hosted SDR (7.1–7.8), live Agones/kind lifecycle (8.30–8.38, 8.49), public-network chaos/load/cost/release gates (8.50–8.53), and real-hardware graphics profiling (0.15b onward). `make verify-kind-agones` is the committed runner for 8.49; its response validator is unit-tested against malformed/ambiguous allocation payloads, but this machine still lacks kind and Helm. `TODO.md`’s AI-training and presentation tasks remain separate from multiplayer and are not marked by this index. +The following are not locally certifiable from this workspace and remain open prerequisites rather than silently “done”: Valve/GodotSteam credentials and hosted SDR (7.1–7.8), live Agones/kind lifecycle (8.30–8.38, 8.49), public-network chaos/load/cost/release gates (8.50–8.53), and real-hardware graphics profiling (0.15b onward). `make verify-kind-agones` is the committed runner for 8.49; its response validator is unit-tested against malformed/ambiguous allocation payloads. On 2026-09-04, kind and Helm were installed and the runner reached its real Agones chart. That run found and repaired the chart's default 10,100 MiB `agones-extensions` ephemeral-storage request, which cannot schedule on a one-node kind cluster. The corrected extensions pod became Ready, but the Agones controller image then could not unpack because this Docker Desktop instance retains 2.71 GB of non-reclaimable BuildKit state and its internal disk filled despite pruning unused volumes, images, and cache. The live gate remains open pending Docker engine capacity; no kind/Agones success is claimed. `TODO.md`’s AI-training and presentation tasks remain separate from multiplayer and are not marked by this index. The live control-plane integration was retried on 2026-09-01 after Docker Desktop became available, but the disposable `postgres:17-alpine` container failed during `initdb` with `No space left on device`; Docker reported 10.2 GB of images and 3.3 GB of volumes. The user approved pruning the disposable volumes on 2026-09-04 (3.3 GB reclaimed), and `scripts/run_postgres_integration.sh` then passed against real PostgreSQL. That run caught and repaired a stalled-allocation outbox CTE without `RETURNING`, an untyped JSON timestamp parameter, a season-rollover scan arity mismatch, lifecycle-incompatible fixtures, and a rollback-test step count that did not actually reach migration 0006. diff --git a/scripts/verify_kind_agones.sh b/scripts/verify_kind_agones.sh index 56e2e6fa..f547f9c4 100755 --- a/scripts/verify_kind_agones.sh +++ b/scripts/verify_kind_agones.sh @@ -45,12 +45,18 @@ kind load docker-image "$game_server_image" --name "$cluster_name" helm repo add agones https://agones.dev/chart/stable >/dev/null helm repo update >/dev/null +# Agones 1.49 otherwise requests 10,100 MiB of ephemeral storage for its +# extensions pod, which exceeds a default single-node kind cluster before the +# Fleet can be exercised. These are smoke-only bounds; production resource +# sizing remains deployment-owned. helm upgrade --install agones agones/agones \ --namespace agones-system --create-namespace \ --version "$agones_version" \ --set agones.crds.cleanup.enabled=true \ --set agones.controller.replicas=1 \ --set agones.extensions.replicas=1 \ + --set agones.extensions.resources.requests.ephemeral-storage=128Mi \ + --set agones.extensions.resources.limits.ephemeral-storage=512Mi \ --set agones.allocator.replicas=1 \ --wait --timeout 5m diff --git a/server/security/test_compose_manifests.py b/server/security/test_compose_manifests.py index cf30f7a9..f72c53c8 100644 --- a/server/security/test_compose_manifests.py +++ b/server/security/test_compose_manifests.py @@ -52,6 +52,11 @@ class ComposeManifestTest(unittest.TestCase): self.assertIn("verify_agones_allocation_response.py", runner) self.assertNotIn("p.get(\"port\", 0) > 0", runner) + def test_kind_runner_bounds_agones_extensions_ephemeral_storage(self): + runner = (ROOT / "scripts/verify_kind_agones.sh").read_text() + self.assertIn("agones.extensions.resources.requests.ephemeral-storage=128Mi", runner) + self.assertIn("agones.extensions.resources.limits.ephemeral-storage=512Mi", runner) + if __name__ == "__main__": unittest.main()