diff --git a/Makefile b/Makefile index 607fbb3f..a11a8552 100644 --- a/Makefile +++ b/Makefile @@ -1,4 +1,7 @@ -.PHONY: verify-phase6 verify-enet-integration verify-steam-templates verify-supply-chain +.PHONY: verify-phase6 verify-enet-integration verify-steam-templates verify-supply-chain verify-multiplayer-local + +verify-multiplayer-local: + bash scripts/verify_multiplayer_local.sh verify-phase6: bash scripts/verify_phase6.sh diff --git a/multiplayer-next.md b/multiplayer-next.md index 54604fa6..33665b1a 100644 --- a/multiplayer-next.md +++ b/multiplayer-next.md @@ -1444,3 +1444,5 @@ The Godot control-plane client now retains the exact last idempotent mutation an The matchmaking UI now exposes that retained replay through its existing action button as `Retry Request` while a heartbeat, cancellation, or proposal action has a retryable failure. Terminal, authentication, and revision-conflict paths remain ineligible, so the button cannot issue a stale blind command. The control plane now exports bounded Prometheus-compatible API request counters and latency summaries at `GET /metrics`, with fixed operation/status labels and no event-stream wrapping. Production and testkit services wire the collector; adversarial tests verify unknown paths cannot inject label cardinality or leak URL secrets, and full Go/race/vet checks pass. Durable SLO dashboards and alert routing remain operational work. + +`make verify-multiplayer-local` now provides one cloud-free regression gate for the current implementation: the complete Go suite, the Godot harness, OpenAPI parsing, and the migration/Fleet/Kubernetes/supply-chain checks. It fails clearly when the configured Godot executable is unavailable and does not weaken or replace the existing Phase 6/ENet gates; PostgreSQL, Redis, Steam, Agones, and multi-process Internet gates remain separate. diff --git a/scripts/verify_multiplayer_local.sh b/scripts/verify_multiplayer_local.sh new file mode 100755 index 00000000..8da8bf72 --- /dev/null +++ b/scripts/verify_multiplayer_local.sh @@ -0,0 +1,25 @@ +#!/usr/bin/env bash +set -euo pipefail + +root_dir="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" +godot_bin="${GODOT_BIN:-/Applications/Godot.app/Contents/MacOS/Godot}" + +if [[ ! -x "$godot_bin" ]]; then + echo "local multiplayer gate: Godot executable not found: $godot_bin" >&2 + exit 2 +fi + +echo "local multiplayer gate: Go tests" +(cd "$root_dir/server" && go test ./...) + +echo "local multiplayer gate: Godot harness" +"$godot_bin" --headless --path "$root_dir/Game" res://tests/test_runner.tscn + +echo "local multiplayer gate: contracts and manifests" +python3 -m json.tool "$root_dir/server/contracts/v1/openapi.json" >/dev/null +python3 "$root_dir/server/migrations/test_migration.py" +python3 "$root_dir/server/security/test_fleet_manifests.py" +python3 "$root_dir/server/security/test_kubernetes_policies.py" +python3 "$root_dir/server/security/test_supply_chain.py" + +echo "LOCAL MULTIPLAYER GATE PASS"