Skip to content

chore(release): v1.0.0 - #2

Closed
fclairamb wants to merge 1 commit into
mainfrom
release-please--branches--main
Closed

fclairamb wants to merge 1 commit into
mainfrom
release-please--branches--main

Conversation

@fclairamb

Copy link
Copy Markdown
Owner

🤖 I have created a release beep boop

1.0.0 (2026-03-24)

Features

  • custom user-agent, refresh checks, vite plugin switch, CI updates (#1) (cc00858)
  • SolidPing — distributed uptime monitoring platform (eef4383)

This PR was generated with Release Please. See documentation.

@fclairamb fclairamb closed this Mar 24, 2026
fclairamb added a commit that referenced this pull request Jun 22, 2026
Co-locates the docs in this repo (`web/docs/`, Docusaurus) and serves
them from the binary at the **`/docs`** path on every host (like
`/dash0`, `/status0`), so `solidping.io/docs` works with no extra infra.
`docs.solidping.io` redirects into `/docs` (`server.docs_host`).

## Highlights
- `web/docs/`: Docusaurus 3.10.1; API reference generated at build from
`server/internal/app/openapi/openapi.yaml` (can't drift).
- Go: `//go:embed all:docsres` + `/docs` routes + docs-host redirect;
Swagger explorer moved `/docs` → `/openapi`.
- Makefile / CI / Dockerfile: docs build + embed wiring.
- Rename internal wiki `docs/` → `wiki/` (ends the docs/ vs web/docs/
collision).
- `deploy/docs-ingress.yaml`: optional ingress template for the
docs.solidping.io subdomain.

Marketing site moved to the `solidping-website` repo (PRs #2, #3 there).
Implements
`specs/done/2026/06/2026-06-22-01-docs-site-from-code-repo.md`.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

---------

Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
fclairamb added a commit that referenced this pull request Jul 5, 2026
)

## Summary

Eight specs implemented via `/implement-todos`, each independently
audited (a fresh, skeptical, read-only agent verifying the actual code
and tests against every requirement — not the implementing subagent's
own self-report) before being archived. Two subagent crashes occurred
mid-batch (API connection errors) and were recovered from partial state
rather than restarted from scratch.

1. **Sidebar live-connection status dot (green/gray/red)** — a small
indicator in the sidebar footer showing real-time WebSocket connection
health; four-state registry
(`connecting`/`live`/`reconnecting`/`disabled`), single-flight-safe.
2. **Multi-region check jobs: durable phase leveling and bounded
claim-ahead parking** — production incident fix. Region-staggered
scheduling now survives restarts and late runs via phase-locked
rescheduling (no more lockstep herding); claim-ahead parking is bounded
per job instead of consuming the whole worker pool for minutes.
3. **DB connection pool: role-aware sizing and headroom under the
Postgres role limit** — found while diagnosing #2 on the dev cluster
(role connection limit was silently exhausted by idle connections).
Per-node-role pool defaults, idle-connection reaping, and a startup
warning when the pool can't fit the role's connection limit.
4. **Email rework: unified design, dashboard links, per-check
unsubscribe** — kills the hand-built HTML string-builder path for
incident emails in favor of the same templated/premailer pipeline auth
emails already use; redesigned base layout; dashboard/incident links in
every email; a full per-recipient unsubscribe subsystem (purpose-tagged
signed tokens, RFC 8058 one-click, suppression table, dashboard
management UI).
5. **Auth session continuity: silent access-token refresh, sliding
sessions, and a Sessions vs API tokens UI** — fixes users being logged
out mid-session (the backend already had a refresh flow the frontend
never called). Single-flight proactive + reactive refresh, sliding
session expiry, JWT claims bound to their issuing session, a session
cap, and a new Sessions page distinct from the API-tokens page
(device/browser/OS, current-session badge, sign-out-other-sessions).
6. **Heartbeat pings: capture caller metadata** — records
User-Agent/source IP/HTTP method on every heartbeat ping (the one check
type where SolidPing is the callee, not the caller), surfaced as a
"Caller" card on the result detail page. Shares the IP-extraction helper
with auth instead of adding a third hand-rolled copy.
7. **Check detail: one chart line per region + Recent Results region
filter with duration stats** — the "All regions" chart view was still a
single merged (sawtooth) series; now renders one colored line per region
with a matching legend. Recent Results gains a server-side region filter
and a tier-aware min/avg/max/p95 stats strip (exact over raw windows,
weighted-combined with a `~` prefix over rollup windows, verified to
match the aggregation job's own weighting math).
8. **Check result detail: previous / next result navigation** — chevron
buttons to step chronologically through a check's results without
bouncing back to the check page each time; scoped to the same periodType
as the (possibly rolled-up) row being viewed, with a stable
same-timestamp tie-break.

## Test plan

- [x] Each spec independently audited by a fresh read-only agent against
the merged code (not the implementing subagent's own self-report) before
being archived — see individual spec files under `specs/done/2026/07/`.
- [x] One spec (email rework) had a narrow gap surface after its first
"clean" audit — a coordinator spot-check found one acceptance
criterion's "both directions" test coverage was at the wrong layer for
one direction; a follow-up fix subagent closed it before archiving.
- [x] Two subagent crashes (multi-region chart series; auth session
continuity) were recovered from partial/uncommitted state on the same
branch rather than restarted, with the recovered work independently
re-verified.
- [x] Backend: `make build-backend lint-back test` green throughout,
including dual-backend (SQLite + real embedded-Postgres) coverage for
the DB-pool, multi-region scheduling, and result-neighbor specs.
- [x] Frontend: `make build-dash0` + `bun run lint` green with zero new
ESLint errors introduced (pre-existing ~45-error baseline unchanged);
Playwright E2E added for the sidebar dot, per-region chart/filter/stats,
and result prev/next navigation.
- [x] Manually built for `linux/amd64` and deployed to the k8xp dev
cluster (all three `solidping-dev` deployments) for live testing;
`/api/mgmt/version` confirmed the deployed commit.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

---------

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
fclairamb added a commit that referenced this pull request Sep 14, 2026
Three bumps close every open Dependabot alert on the repo.

- kin-openapi 0.142.0 -> 0.144.0 (alerts #6 critical, #7 medium):
  ValidationHandler.Load() fail-open auth bypass via the default
  NoopAuthenticationFunc, and an unauthenticated nil-pointer panic in
  openapi3filter when validating a `content` parameter whose media type
  carries no schema. Indirect, pulled by oapi-codegen.

- goxmldsig 1.4.0 -> 1.6.0 (alert #1 high): loop-variable capture in
  validateSignature let a crafted document bypass signature validation.
  Indirect, pulled by crewjam/saml.

- github.com/docker/docker -> github.com/moby/moby/{client,api}
  (alerts #2, #3, #4, #5): docker/docker stopped publishing Go modules
  at v28.5.2 — Docker 29 split the Go client into
  github.com/moby/moby/client and the API types into
  github.com/moby/moby/api. There is no patched v28, so the only way off
  the vulnerable module is the migration.

The moby migration is mechanical but not a pure import rewrite, because
the split client reshaped its call signatures:

- every call takes an options struct and returns a result struct
  (ContainerInspect/List/Start/Remove/Logs, CopyTo/FromContainer,
  ImagePull, Ping);
- InspectResponse is flat — the ContainerJSONBase embedding is gone;
- Summary.State is container.ContainerState and Health.Status is
  container.HealthStatus, both typed strings now;
- container.Port is container.PortSummary;
- port sets/maps moved to the network package with a real Port type
  (network.MustParsePort) and netip.Addr host IPs, replacing
  docker/go-connections/nat — which drops to indirect;
- EndpointSettings.Gateway is a netip.Addr, not a string.

Behaviour is unchanged for the docker check and container discovery. The
one compatibility note: the split client's floor is Docker API 1.40
(Docker 19.03, 2019), up from 1.24. API-version negotiation still runs,
so Podman and older-but-supported daemons are unaffected.

go mod tidy also promotes chromedp/cdproto to a direct requirement — it
is directly imported by internal/checkers/checkbrowser and was mislabeled
indirect.

Verified: make lint-back, go vet ./... , go vet -tags slowtests ./... ,
and the full `make test` suite all green; oapi-codegen still builds
against kin-openapi 0.144.0.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
fclairamb added a commit that referenced this pull request Sep 14, 2026
Three bumps close every open Dependabot alert on the repo.

- kin-openapi 0.142.0 -> 0.144.0 (alerts #6 critical, #7 medium):
  ValidationHandler.Load() fail-open auth bypass via the default
  NoopAuthenticationFunc, and an unauthenticated nil-pointer panic in
  openapi3filter when validating a `content` parameter whose media type
  carries no schema. Indirect, pulled by oapi-codegen.

- goxmldsig 1.4.0 -> 1.6.0 (alert #1 high): loop-variable capture in
  validateSignature let a crafted document bypass signature validation.
  Indirect, pulled by crewjam/saml.

- github.com/docker/docker -> github.com/moby/moby/{client,api}
  (alerts #2, #3, #4, #5): docker/docker stopped publishing Go modules
  at v28.5.2 — Docker 29 split the Go client into
  github.com/moby/moby/client and the API types into
  github.com/moby/moby/api. There is no patched v28, so the only way off
  the vulnerable module is the migration.

The moby migration is mechanical but not a pure import rewrite, because
the split client reshaped its call signatures:

- every call takes an options struct and returns a result struct
  (ContainerInspect/List/Start/Remove/Logs, CopyTo/FromContainer,
  ImagePull, Ping);
- InspectResponse is flat — the ContainerJSONBase embedding is gone;
- Summary.State is container.ContainerState and Health.Status is
  container.HealthStatus, both typed strings now;
- container.Port is container.PortSummary;
- port sets/maps moved to the network package with a real Port type
  (network.MustParsePort) and netip.Addr host IPs, replacing
  docker/go-connections/nat — which drops to indirect;
- EndpointSettings.Gateway is a netip.Addr, not a string.

Behaviour is unchanged for the docker check and container discovery. The
one compatibility note: the split client's floor is Docker API 1.40
(Docker 19.03, 2019), up from 1.24. API-version negotiation still runs,
so Podman and older-but-supported daemons are unaffected.

go mod tidy also promotes chromedp/cdproto to a direct requirement — it
is directly imported by internal/checkers/checkbrowser and was mislabeled
indirect.

Verified: make lint-back, go vet ./... , go vet -tags slowtests ./... ,
and the full `make test` suite all green; oapi-codegen still builds
against kin-openapi 0.144.0.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant