webstatus-maintenance
This skill provides guidance for updating the core toolchain versions across the webstatus.dev repository.
Architecture
For a technical overview of synchronized upgrades and infrastructure maintenance, see references/architecture.md.
General Guidelines
- DO cross-reference all infrastructure/scripts against the official Google Style Guides (e.g. for Shell Scripts, YAML). If you are unsure about a specific style rule, DO NOT assume; you MUST ask the user for clarification.
Synchronized Upgrades
When asked to update a specific language or tool, you must update it in all of its respective locations to prevent environment drift.
Upgrading Go
The Go version must be kept in sync across:
.devcontainer/devcontainer.json(features -> go -> version).github/workflows/ci.yml(GO_VERSIONenvironment variable).github/workflows/devcontainer.yml(GO_VERSIONenvironment variable)images/go_service.Dockerfile(FROM golang:X.Y.Z-alpine...)
After updating the files, you should run make go-update && make go-tidy to ensure the go.mod dependencies are compatible with the new version.
Upgrading Go Workspace & Tools Dependencies (tools/go.mod vs go.work)
Because webstatus.dev uses a multi-module workspace (go.work), tools/go.mod (oapi-codegen, wrench, addlicense) is included right inside the active workspace when make go-workspace-setup runs:
- Synchronized
toolsUpgrades: When upgrading shared libraries (likegithub.com/getkin/kin-openapiorruntime), you MUST also updatetools/go.mod(github.com/oapi-codegen/oapi-codegen/v2) to a compatible version. Otherwise, Go's Minimal Version Selection (MVS) will compiletoolsagainst the upgradedkin-openapimodels and cause type mismatch errors (mismatched types openapi3.MappingRef and string). - Makefile
@latestFlags: Ensure targets likego-update-toolsusego get -u ...@latestfor all tools so they do not lag behind when running updates. golangci-lintConfiguration: When bumpinggolangci-lintversions across v2 config format, ensuregoconst.ignore-tests: trueis preserved so table-driven test fixtures are not flagged. Note that we do NOT use brittleignore-string-valueswhitelists for Spanner query parameter keys (startAt,pageSize, etc.); instead, we excludegoconstspecifically forlib/gcpspanner/.*\.gounderlinters.exclusions.rules(path: lib/gcpspanner/.*\.go), because parameter keys naturally repeat across dozens of independent query methods matching raw SQL@parambindings.
Upgrading Node.js
The Node.js version must be kept in sync across:
.devcontainer/devcontainer.json(features -> node -> version).devcontainer/Dockerfile(FROM mcr.microsoft.com/devcontainers/typescript-node:X-22).github/workflows/ci.yml(NODE_VERSIONenvironment variable).github/workflows/devcontainer.yml(NODE_VERSIONenvironment variable)images/nodejs_service.Dockerfile(FROM node:X.Y.Z-alpine...)
After updating, run make node-update and test the frontend build.
Upgrading Playwright
Playwright requires its NPM package and OS-level dependencies to stay in sync:
- Update
playwrightand@web/test-runner-playwrightinfrontend/package.json. - Update the system dependencies in
.github/workflows/ci.yml(thenpx playwright install --with-depsstep).
Upgrading DevContainer Features
Other DevContainer tools (Terraform, Skaffold, Shellcheck, GitHub CLI) are managed within .devcontainer/devcontainer.json.
- Find the relevant feature under the
featuresobject and update its"version". - If modifying Terraform, also ensure the
.terraform-versionfile (if one exists) or CI checks match the new version. - Lockfile Synchronization (
devcontainer-lock.json):.devcontainer/devcontainer-lock.jsonis committed to version control to guarantee deterministic container builds across developers and CI (.github/workflows/devcontainer.yml) by locking exact OCI feature digests (@sha256:...) and resolved versions. Whenever you modify features or version constraints in.devcontainer/devcontainer.json, you MUST ensure.devcontainer/devcontainer-lock.jsonis updated and committed alongsidedevcontainer.json.- To regenerate or update the lockfile locally, run
devcontainer up/devcontainer buildordevcontainer features upgrade --workspace-folder .using the DevContainer CLI. - Always stage both files:
git add .devcontainer/devcontainer.json .devcontainer/devcontainer-lock.json.
- To regenerate or update the lockfile locally, run
Documentation Updates
If you change how versions are managed or introduce a new critical dependency:
- Update
docs/maintenance.mdto reflect the new update path. - Trigger the "Updating the Knowledge Base" prompt in
GEMINI.mdto ensure I am aware of the changes.