Skip to content

feat: lease sizing, Telegram sign-in and four small fixes (2026-11-11 issues) - #848

Merged
fclairamb merged 32 commits into
mainfrom
feat/todos-2026-11-11
Nov 12, 2026
Merged

fclairamb merged 32 commits into
mainfrom
feat/todos-2026-11-11

Conversation

@fclairamb

@fclairamb fclairamb commented Nov 11, 2026 •

Copy link
Copy Markdown
Owner

Closes fclairamb/solidping-business#63
Closes fclairamb/solidping-business#64
Closes fclairamb/solidping-business#65
Closes fclairamb/solidping-business#67
Closes fclairamb/solidping-business#68

What changed

Decided by autopilot

  • Spec 06, lease: size it up front, not extended during the run (recommended answer).
  • Spec 08, Telegram: only users who already linked that account may sign in; worth shipping now behind the default-off switch (recommended answers).

fclairamb and others added 5 commits November 11, 2026 23:18
…an unhandled rejection (fclairamb/solidping-business#65)

Saving a status page with a slug the server rejects (400 VALIDATION_ERROR,
e.g. a UUID-shaped slug) gave no feedback: StatusPageForm.handleSubmit
(web/dash0/src/components/shared/status-page-form.tsx) awaited onSubmit with
no catch, so the ApiError became an unhandled rejection. The form now catches
it, shows the `slug` field message under the field and toasts the error
(silent on a refused demo write, which client.ts already toasts). Covers both
the create and edit routes. status-page-form.test.tsx fails before the fix.

Closes fclairamb/solidping-business#65

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ow (fclairamb/solidping-business#64)

Switching the dashboard header to 7 days or 30 days changed the availability
tile and banner but the "Checks at a glance" strips kept showing the last 24
hourly cells: dashboard-page.tsx hard-coded UPTIME_HOURS = 24 and a 3600 s
bucket. The strips now use glanceStripWindow() (24h: 24 x 1 h, 7d: 28 x 6 h,
30d: 30 x 1 day, aligned like the server's cells), and the cell tooltips show
the date for wider cells. glance-strip-window.test.ts guards the geometry.

Closes fclairamb/solidping-business#64

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ping-business#68)

The Recent Results card on a check page could only be filtered by region, so
finding the one failed run among dozens of successes meant scrolling. A
"Failures" toggle next to the region chips now lists only failed runs, via the
results endpoint's existing `status=down` filter (down, timeout, error). The
choice lives in the URL (`resultStatus=down`) like the region, and an empty
filtered table says no run failed. useResults gained the `status` option;
hooks.results-status.test.tsx fails before the change.

Closes fclairamb/solidping-business#68

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…never carry (fclairamb/solidping-business#63)

An operator with a WhatsApp contact next to a working route got a WARN
"cannot be delivered over this contact type; skipping route" on every
watchdog alert, right next to its "delivered" line (opsnotify/deliver.go
dispatchRoute default branch). The skip is a fixed fact of the
configuration, so it now logs at DEBUG; a recipient whose routes are ALL of
that kind still gets the "undeliverable" WARN, which now names the skipped
contact types. TestDeliverSkippedRouteNextToADeliveredOneIsNotAWarning and
the tightened TestDeliverSkipsWhatsApp fail before the change.

Refs fclairamb/solidping-business#63

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…sign-in

Specs for fclairamb/solidping-business#63 (lease expiry under slow database
round-trips stalling a remote region), #66 (demo sessions end after one hour)
and #67 (Telegram as a sign-in provider).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
fclairamb and others added 8 commits November 11, 2026 23:29
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
…urable margin

A remote region with slow database round-trips could outlive its check-job
lease (period + 30s): a peer re-claimed the job, the check ran twice and the
first worker's release failed with 'job may have been claimed by another
worker' (fclairamb/solidping-business#63).

- The lease is now max(scheduled_at, now) + max(period, check timeout) +
  margin, the clock read per row so a slow claim transaction does not eat it.
  The margin defaults to 30s and is set per deployment with
  SP_CHECKERS_LEASE_MARGIN.
- New metrics by region: solidping_check_lease_held_seconds (claim to
  release) and solidping_check_lease_lost_total. A lost lease logs a WARN
  'Check lease lost' with lease_expires_at, missed_by, period and timeout.
- A claim that times out (driver i/o timeout, context deadline) is a WARN
  'Claim timed out: retrying after back-off' counted under
  solidping_claim_jobs_result_total{outcome="timeout"}, no longer an ERROR.
- Runbook and configuration docs describe the knob.

Closes fclairamb/solidping-business#63

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…he fetcher

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
@codecov

codecov Bot commented Nov 11, 2026 •

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 89.08730% with 55 lines in your changes missing coverage. Please review.
✅ Project coverage is 89.36%. Comparing base (32fd560) to head (e37482d).

Files with missing lines Patch % Lines
server/internal/handlers/auth/telegram_service.go 86.92% 17 Missing ⚠️
server/internal/handlers/auth/telegram.go 86.51% 12 Missing ⚠️
server/internal/checkers/checkerdef/ipfallback.go 88.09% 10 Missing ⚠️
server/internal/app/server.go 58.33% 5 Missing ⚠️
server/internal/egress/happyeyeballs.go 93.22% 4 Missing ⚠️
server/internal/checkworker/worker.go 86.36% 3 Missing ⚠️
server/internal/config/config.go 85.71% 2 Missing ⚠️
.../internal/checkworker/checkjobsvc/lease_metrics.go 96.42% 1 Missing ⚠️
server/internal/handlers/workers/service.go 87.50% 1 Missing ⚠️
Additional details and impacted files
@@           Coverage Diff            @@
##             main     #848    +/-   ##
========================================
  Coverage   89.35%   89.36%            
========================================
  Files        1353     1358     +5     
  Lines      139110   139568   +458     
========================================
+ Hits       124299   124722   +423     
- Misses      14802    14837    +35     
  Partials        9        9            
Files with missing lines Coverage Δ
server/internal/checkers/checkhttp/checker.go 89.15% <100.00%> (+0.07%) ⬆️
...erver/internal/checkers/checkprometheus/checker.go 95.36% <100.00%> (+0.12%) ⬆️
server/internal/checkworker/backend/direct.go 89.26% <100.00%> (+0.29%) ⬆️
server/internal/checkworker/checkjobsvc/service.go 88.27% <100.00%> (+0.62%) ⬆️
server/internal/config/envvars.go 100.00% <100.00%> (ø)
server/internal/db/models/check_job.go 100.00% <ø> (ø)
server/internal/egress/egress.go 95.55% <100.00%> (+0.34%) ⬆️
server/internal/handlers/auth/audit.go 93.82% <100.00%> (+0.15%) ⬆️
...rver/internal/handlers/auth/providers_available.go 76.56% <100.00%> (+1.98%) ⬆️
server/internal/handlers/auth/signup_analytics.go 95.65% <ø> (ø)
... and 12 more

... and 17 files with indirect coverage changes

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

fclairamb and others added 10 commits November 11, 2026 23:55
A rejected refresh on a demo session (server cap of one hour) now signs in
again with the public demo credential and shows a toast, instead of
redirecting to login?session_expired=true. Falls back to the redirect if the
re-login fails.

Closes fclairamb/solidping-business#66

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
GET /api/v1/auth/telegram/login redirects to oauth.telegram.org; the callback
moves the fragment result into the query (hash-pinned bridge page), verifies
the HMAC with the bot token, refuses an auth_date older than 5 minutes and
signs in only the user who linked that Telegram account as a verified
notification contact. No account is created. Off unless
SP_TELEGRAM_LOGIN_ENABLED=true (the bot's domain must be set with @Botfather
/setdomain first). Login audit method: telegram.

Closes fclairamb/solidping-business#67

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Telegram brand icon for the provider grid (data-testid login-oauth-telegram),
a Telegram label for the sessions page, and /register leaves Telegram out:
it signs in linked accounts only and never creates one.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…LED)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
@fclairamb fclairamb changed the title fix: issues of 2026-11-11 (watchdog log, glance windows, status page slug, failures filter) and specs feat: lease sizing, demo session renewal, Telegram sign-in and four small fixes (2026-11-11 issues) Nov 11, 2026
@fclairamb fclairamb added frozen Batch PR under review: takes only its own fixes, new work goes to the next batch implemented Every spec of the PR is implemented and its batch gate was green labels Nov 11, 2026
A demo session should not be renewed more often than any other session, so
the client-side re-login on a rejected demo refresh is removed.

This reverts commit c305ba1.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@fclairamb fclairamb changed the title feat: lease sizing, demo session renewal, Telegram sign-in and four small fixes (2026-11-11 issues) feat: lease sizing, Telegram sign-in and four small fixes (2026-11-11 issues) Nov 12, 2026
@fclairamb
fclairamb enabled auto-merge (squash) November 12, 2026 08:06
fclairamb and others added 3 commits November 12, 2026 09:06
…ls) (#849)

Stacked on #848: merge it first.

Races IPv6 and IPv4 in the enforcing egress dialer (second family starts
after 300 ms or on first failure), so dual-stack targets with a lossy
IPv6 path no longer time out.

Not done (needs a spec): degraded status when only one family fails,
reporting the answering family, v4/v6 sub-probes.

Closes fclairamb/solidping-business#69

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
fclairamb and others added 4 commits November 12, 2026 09:33
…ack family (#852)

Stacked on #848: merge it first.

## What changed
- HTTP and Prometheus checks now return `warning` (rolled up as
degraded) when a dual-stack target only answered on its fallback family,
e.g. IPv6 unreachable but IPv4 up (answers the "which family failed"
part of the issue, the IPv4 fallback itself shipped in #849). The result
carries `output.ip_fallback` and the dashboard shows it. Pinned-family
checks never warn.

## Decided by autopilot
- Spec fclairamb/solidping-business#69 follow-up, Q1: warn only when the
first family failed or was still pending 1 s after its start
(recommended answer).
- Q2: no separate v4/v6 sub-probes (recommended answer).

## Notes
- With the 1 s threshold and the 300 ms race, a silently dropped v6 SYN
with instant v4 will not warn; tune `FamilyFallbackThreshold` if wanted.
- An HTTP check on `localhost` can now warn when `::1` is refused but
`127.0.0.1` answers.
- Batch gate: build, lint, Go tests, e2e typecheck/lint green;
Playwright not run locally (left to CI).

Closes fclairamb/solidping-business#69

---------

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
@fclairamb
fclairamb merged commit 9972dde into main Nov 12, 2026
36 checks passed
@fclairamb
fclairamb deleted the feat/todos-2026-11-11 branch November 12, 2026 09:16
fclairamb added a commit that referenced this pull request Nov 12, 2026
🤖 I have created a release *beep* *boop*
---


##
[0.48.0](v0.47.0...v0.48.0)
(2026-11-12)


### Features

* lease sizing, Telegram sign-in and four small fixes (2026-11-11
issues) ([#848](#848))
([9972dde](9972dde))
* **notifications:** SMS Factor integration
([#846](#846))
([1b68d2a](1b68d2a))


### Bug Fixes

* **deps:** update github.com/dop251/goja digest to f493a2b
([#842](#842))
([dba208b](dba208b))
* **deps:** update go dependencies (non-major)
([#844](#844))
([621d492](621d492))
* **deps:** update go dependencies (non-major)
([#847](#847))
([4bb06f7](4bb06f7))
* **security:** bind JS env and plugin configs, strict re-wrap keys,
replay masking of remaining secret inputs, rewrap list cap, secret
headers on redirects
([#851](#851))
([32fd560](32fd560))
* **security:** bind sealed secrets to their target, verify peer
re-wraps, drop deleted regions' keys, TLS-only agent server URL
([#840](#840))
([4b70e46](4b70e46))
* **security:** keep shown-once secrets out of dash0 session replay
([#839](#839))
([9bb8e8b](9bb8e8b))
* **security:** require a verified email for GitLab sign-in and stop
linking existing accounts by email
([#850](#850))
([1a0cea9](1a0cea9))

---
This PR was generated with [Release
Please](https://github.com/googleapis/release-please). See
[documentation](https://github.com/googleapis/release-please#release-please).
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

automerge autopilot autorelease frozen Batch PR under review: takes only its own fixes, new work goes to the next batch implemented Every spec of the PR is implemented and its batch gate was green

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant