Skip to content

fix: status lifecycle improvements and created/running result handling - #5

Merged
fclairamb merged 17 commits into
mainfrom
fix/status-lifecycle-improvements
Apr 5, 2026
Merged

fclairamb merged 17 commits into
mainfrom
fix/status-lifecycle-improvements

Conversation

@fclairamb

Copy link
Copy Markdown
Owner

Summary

  • Reorder result/check status values to follow lifecycle order (created → running → up → down → timeout → error) with database migrations
  • Add ResultStatusCreated so initial check results display as "created" instead of "unknown"
  • Ignore created/running results in availability calculations and graph coloring (they are lifecycle markers, not measurements)
  • Use green calendar icon for resolved incidents in events page
  • Add refresh button to badge preview page
  • Fix deletion of checks with active incidents
  • Mark internal checks with internal=true
  • Reorganize docs into logical subdirectories
  • Add make dev target for non-test development mode

Test plan

  • Verify newly created checks show "created" status instead of "unknown"
  • Verify availability badges exclude created/running results from calculations
  • Verify response time graph shows green (not red) for created/running data points
  • Verify resolved incident events show green calendar icon
  • Run backend tests: make test
  • Run frontend lint: make lint-dash

🤖 Generated with Claude Code

fclairamb and others added 17 commits March 30, 2026 00:57
Defines a checks-per-minute quota per organization (super admin only)
that proportionally scales all check_job periods when exceeded.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Internal checks (checkworker, jobworker) were created with type
"internal:checkworker" but internal=false, causing them to appear
in the default user checks listing. Now they use the internal boolean
flag properly and self-heal existing checks on startup. Also adds
missing Internal field handling in UpdateCheck for both postgres
and sqlite.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Restructure flat docs/ directory into themed subdirectories:
- conventions/ for all project standards
- testing/ for test infrastructure docs
- slack/ for app manifests
- research/ for tool evaluations
- competitors/ for market analysis (renamed from other-services/)

Add docs/CLAUDE.md giving Claude authority to maintain organization.
Add docs/README.md as a full index of all documentation.
Update cross-references in CLAUDE.md and specs.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
… "created" instead of "unknown"

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Major rewrites based on actual codebase analysis:
- api-specification: replace fictional endpoints with all ~150 real routes
- architecture: expand from 5 to 30 check types, 3 to 9 notification
  channels, update directory structure, remove "future" items now implemented
- database-model: add 6 missing tables (check_groups, status_pages,
  maintenance_windows, etc.), fix auth_methods->organization_providers,
  add missing columns (2FA, relapse tracking, etc.)
- checker-config: expand from 11 to all 30 checker types with accurate
  field names from source config.go files
- frontend-urls: rewrite for TanStack Router with all 42 dash0 routes
- CLAUDE.md: update API endpoint summary and error codes list

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Reorganize status integers to reflect the natural lifecycle:
1=created, 2=running, 3=up, 4=down, 5=timeout, 6=error

Status 0 is intentionally unused to avoid confusion with the old
"initial" value. CheckStatus values are also updated to align:
0=unknown, 3=up, 4=down, 7=degraded.

Includes DB migration (002) for both SQLite and PostgreSQL to remap
existing data, and replaces all hardcoded status integers with
model constants.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
New checks now start with CheckStatusCreated (1) instead of
CheckStatusUnknown (0), matching the ResultStatusCreated lifecycle.
Updates DB migration, status page handler, and frontend fallbacks
to use "created" instead of "unknown".

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
The backend always provides an explicit status (starting with "created"),
so "unknown" should never appear. It remains as a safety net only.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…ulations

Created results represent initial check state before any execution — they
should not count as downtime in the response time graph or availability badge.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Instead of blocking deletion, resolve active incidents first and emit a
check.deleted event with active_incidents_count in the payload.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…utton

- Skip both created and running results in availability/uptime calculations
  (consistent with aggregation logic treating them as lifecycle markers)
- Treat created/running as neutral (green) in graph coloring
- Add refresh button to badge preview page

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Tests were using old hardcoded status integers (Up=1, Down=2) instead of
the reordered values (Created=1, Running=2, Up=3, Down=4, Timeout=5, Error=6).

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
@fclairamb
fclairamb merged commit fc64c7d into main Apr 5, 2026
10 checks passed
@fclairamb
fclairamb deleted the fix/status-lifecycle-improvements branch April 5, 2026 23:57
@fclairamb fclairamb mentioned this pull request Apr 5, 2026
fclairamb added a commit that referenced this pull request Jun 23, 2026
🤖 I have created a release *beep* *boop*
---


##
[0.1.0](v0.0.0...v0.1.0)
(2026-06-22)


### Features

* add check type registry, sample configs, notification senders, and
observability integrations
([eea049e](eea049e))
* batch — Warning/Degraded statuses, SSL/Docker check upgrades, MCP
OAuth 2.1, config-as-code
([#85](#85))
([936d830](936d830))
* batch spec implementations (dashboard UI, jobs, notifications, SaaS,
perf) ([#78](#78))
([fe003e4](fe003e4))
* bulk feature integration (discovery, web push, badges, webhooks, and
more) ([#73](#73))
([a976856](a976856))
* custom user-agent, refresh checks, vite plugin switch, CI updates
([#1](#1))
([cc00858](cc00858))
* documentation site served at /docs (co-located in web/docs)
([#88](#88))
([27d9ccd](27d9ccd))
* email check frontend (spec 03)
([#30](#30))
([aebd106](aebd106))
* email inbox foundation via JMAP (spec 01)
([#24](#24))
([0f3b0c1](0f3b0c1))
* email passive checks (spec 02)
([#27](#27))
([ba5536f](ba5536f))
* **entitlements:** trim to MaxSSOUsers + MaxChecksPerMinute + status
page history fixes
([#50](#50))
([a007de0](a007de0))
* **entitlements:** trim to MaxSSOUsers + MaxChecksPerMinute, enforce
both ([#49](#49))
([d25cc5f](d25cc5f))
* group incident correlation (spec 04 backend v1)
([#31](#31))
([1883986](1883986))
* **observability:** instrument hot path + add bench harness
([#60](#60))
([c6604cc](c6604cc))
* **oncall:** searchable timezone dropdown + sidebar logo polish
([#46](#46))
([4396898](4396898))
* per-IP HTTP rate limiting and concurrency limiting
([#59](#59))
([f9cc273](f9cc273))
* soften HTTP rate limits with bounded queues + request timeout
([#63](#63))
([025501b](025501b))
* SolidPing — distributed uptime monitoring platform
([eef4383](eef4383))
* **statuspages:** drag-and-drop resource reordering + dash conventions
([#41](#41))
([cf910d4](cf910d4))


### Bug Fixes

* **deps:** update dependency i18next to v26
([#26](#26))
([d5d1b7e](d5d1b7e))
* **deps:** update dependency lucide-react to v1
([#28](#28))
([cdc8e8c](cdc8e8c))
* **deps:** update dependency react-i18next to v17
([#29](#29))
([13135d8](13135d8))
* **deps:** update dependency recharts to v3.8.1
([#14](#14))
([5d95a3b](5d95a3b))
* **deps:** update go dependencies (non-major)
([#16](#16))
([2450f13](2450f13))
* **deps:** update go dependencies (non-major)
([#19](#19))
([f842310](f842310))
* **deps:** update go dependencies (non-major)
([#37](#37))
([c020eca](c020eca))
* **deps:** update go dependencies (non-major)
([#44](#44))
([ff0bcd0](ff0bcd0))
* **deps:** update go dependencies (non-major)
([#52](#52))
([2e3bc28](2e3bc28))
* **deps:** update go dependencies (non-major)
([#69](#69))
([a65ed4c](a65ed4c))
* **deps:** update go dependencies (non-major)
([#77](#77))
([a0920ff](a0920ff))
* **deps:** update go dependencies (non-major) to v1.4.2
([#86](#86))
([1eb7504](1eb7504))
* **deps:** update module github.com/aws/aws-sdk-go-v2/config to
v1.32.18 ([#72](#72))
([6406537](6406537))
* **deps:** update module github.com/aws/aws-sdk-go-v2/service/s3 to
v1.101.0 ([#39](#39))
([f9c9563](f9c9563))
* **deps:** update module github.com/go-webauthn/webauthn to v0.17.3
([#45](#45))
([593931a](593931a))
* **deps:** update module github.com/go-webauthn/webauthn to v0.17.4
([#70](#70))
([fca1c97](fca1c97))
* **deps:** update module github.com/ibm/sarama to v1.48.1
([#47](#47))
([93ccf3a](93ccf3a))
* **deps:** update module github.com/ibm/sarama to v1.48.2
([#54](#54))
([e84d868](e84d868))
* **deps:** update module github.com/ibm/sarama to v1.49.0
([#64](#64))
([fd61bd7](fd61bd7))
* **deps:** update module github.com/oapi-codegen/runtime to v1.4.1
([#65](#65))
([a3a3e9f](a3a3e9f))
* **deps:** update module github.com/prometheus/common to v0.67.5
([#61](#61))
([095dd6f](095dd6f))
* **deps:** update module github.com/slack-go/slack to v0.24.0
([#75](#75))
([6e86d5b](6e86d5b))
* **deps:** update module golang.org/x/sys to v0.44.0
([#42](#42))
([a245730](a245730))
* **deps:** update module golang.org/x/sys to v0.45.0
([#67](#67))
([49c3d90](49c3d90))
* **deps:** update module golang.org/x/term to v0.43.0
([#43](#43))
([4a934f1](4a934f1))
* **deps:** update module google.golang.org/grpc to v1.81.0
([#36](#36))
([1be183a](1be183a))
* **deps:** update module google.golang.org/grpc to v1.81.1
([#55](#55))
([6bfac2d](6bfac2d))
* status lifecycle improvements and created/running result handling
([#5](#5))
([fc64c7d](fc64c7d))
* **status0:** white page header and de-duplicated footer
([#48](#48))
([77506a7](77506a7))

---
This PR was generated with [Release
Please](https://github.com/googleapis/release-please). See
[documentation](https://github.com/googleapis/release-please#release-please).
This was referenced Sep 8, 2026
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

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant