The runner's golangci-lint binary is built with Go 1.24 and refuses
to lint modules targeting a higher Go version ('the Go language
version (go1.24) used to build golangci-lint is lower than the
targeted Go version (1.25)'). 1.24 is current stable and covers
everything the skeleton uses (slog, ServeMux method routing).
Dockerfile pinned to golang:1.24-alpine to match.
Refs: M4.1
act_runner doesn't reliably evaluate hashFiles() at job-level if:
conditions, so the gate skipped the test job even with the Go
sources committed. tenant-registry has Go source from day one — let
test always run.
Refs: M4.1
Minimal Go service so platform/portal has something to resolve in local
dev. Stdlib net/http with Go 1.22 enhanced ServeMux (method+path
patterns); no third-party deps yet.
Layout:
cmd/server/main.go entry point with graceful shutdown
internal/config/ env-driven config (APP_ENV, ADDR, KC issuer)
internal/server/ http handlers + request-logging middleware
internal/store/memory.go in-memory tenant store, seeded with acme
migrations/0001_init.up.sql schema for the M4.1 follow-up (unapplied)
Makefile dev/test/build/lint/docker targets
Dockerfile multi-stage distroless build
Endpoints (under :8080 in dev):
GET /healthz
GET /v1/tenants/by-slug/{slug} 200 acme | 404
GET /v1/tenants/{id} 200 by uuid | 404
JWT validation and the real Postgres-backed store land in the M4.1
follow-up PR — keeping this PR strictly to 'boots, replies, tests pass'.
Refs: M4.1 (skeleton)