Replace the commit-pinned golangci-lint install refs in Dockerfile and
script/bootstrap with the v2.12.2 version pin, and replace .golangci.yml
with the canonical v2-schema config (lint settings now live under
linters.settings, so the lll/funlen/cyclop/dupl thresholds are actually
applied).
Fix all findings surfaced by the newly-applied config:
- goconst: introduce shared constants for repeated status, priority,
and DNS fixture strings in watcher.go and the notify, state, and
watcher tests
- dupl: consolidate duplicated ntfy/slack HTTP-error tests and
SendNotification endpoint-error tests behind shared helpers
- lll: wrap long test table entries and comments; shorten one inline
nolint justification
- Replace convoluted CI workflow (setup-go, install golangci-lint, install
goimports, make check) with simple 'docker build .' per repo policy
- Pin Docker base images by SHA256 hash instead of mutable tags
- Pin golangci-lint and goimports by commit hash instead of @latest
- Add binutils-gold for linker compatibility on alpine
- Run on all pushes, not just main/PR branches
Full project structure following upaas conventions: uber/fx DI, go-chi
routing, slog logging, Viper config. State persisted as JSON file with
per-nameserver record tracking for inconsistency detection. Stub
implementations for resolver, portcheck, tlscheck, and watcher.