Skip to content

fix(status-pages): close a grouped check's entry when it recovers - #615

Merged
fclairamb merged 4 commits into
mainfrom
fix/stale-group-publications
Oct 19, 2026
Merged

fclairamb merged 4 commits into
mainfrom
fix/stale-group-publications

Conversation

@fclairamb

Copy link
Copy Markdown
Owner

Problem

The checks list said "12 status-page incidents are open on Live demo status while every linked check is up". Clicking "Review it" opened the status page, which has nothing to review.

Two bugs:

  1. Entries never closed. When a grouped check recovers, OnIncidentResolved kept its entry open if any other group member was down. A member had been down since 2026-09-07 with no entry of its own, so for six weeks no other member's entry could close. Deleting that member did not help either: the delete resolves the incident after the soft delete, GetCheck no longer found the check, and the group lookup came back empty.
  2. Nothing to review. With more than one stale entry, the banner linked to the status page. dash0 has no list of a page's entries, so the link went nowhere useful.

Fix

  • An entry now waits only for the members it covers: the incident it is attached to, or a member that failed after that incident and has no entry of its own on the page (what consolidation produces). If a lookup fails, the entry stays open.
  • incidentGroupUID reads the check with GetCheckIncludingDeleted.
  • The background incidents service (demo cleanup sweep, private-location monitor deletes) gets the publication hook. It has no subscriber notifier, because the egress guard is built later.
  • With several stale entries, the banner lists each one with a link to its edit page.

Tests

  • TestLongDownSiblingDoesNotHoldAnotherMembersEntryOpen
  • TestDeletingTheLastMemberClosesTheConsolidatedEntry
  • The existing tests for "closes only with the last member" and the hand-published group entry still pass.
  • stale-publications-banner.test.tsx: one link when there is one entry, one link per entry when there are several.

go test -short ./..., golangci-lint, tsc and the vitest suites pass locally.

The 12 entries already open in prod will not close on their own after deploy, because their resolve already ran. They need to be closed once by hand.

🤖 Generated with Claude Code

A status-page entry for a grouped check stayed open after recovery
whenever any other member of the group was down. One member down for
weeks with no entry of its own kept every other member's entry open:
12 of them sat on a page whose checks were all up.

- An entry now waits only for the members it covers: its own incident,
  or a member that failed after it and has no entry of its own.
- Deleting a check still finds its group, so the entries waiting on it
  close.
- Check deletions from background jobs (demo cleanup, private-location
  monitors) now close status-page entries too.
- The stale-entry banner links each entry when there are several,
  instead of linking to the status page, which has no list of them.

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

codecov Bot commented Oct 19, 2026 •

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 93.10345% with 2 lines in your changes missing coverage. Please review.
✅ Project coverage is 83.37%. Comparing base (b84af78) to head (befdb9b).

Files with missing lines Patch % Lines
...er/internal/handlers/incidentpublications/group.go 90.00% 2 Missing ⚠️
Additional details and impacted files
@@            Coverage Diff             @@
##             main     #615      +/-   ##
==========================================
+ Coverage   83.32%   83.37%   +0.05%     
==========================================
  Files        1238     1238              
  Lines      127041   127064      +23     
==========================================
+ Hits       105854   105945      +91     
+ Misses      21178    21110      -68     
  Partials        9        9              
Files with missing lines Coverage Δ
server/internal/app/server.go 81.79% <100.00%> (+0.02%) ⬆️
...r/internal/handlers/incidentpublications/policy.go 77.33% <100.00%> (+0.22%) ⬆️
...er/internal/handlers/incidentpublications/group.go 82.60% <90.00%> (+3.22%) ⬆️

... and 15 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

Copy link
Copy Markdown
Owner Author

Added TestSiblingWithItsOwnEntryDoesNotHoldTheGroupEntryOpen, which covers the owner lookup and the "sibling has its own entry" branches of publicationCoversActiveSibling (90.9% of the function now; only the two DB-error branches are left).

🤖 Addressed by Claude Code

@fclairamb
fclairamb merged commit d4d9b21 into main Oct 19, 2026
33 checks passed
@fclairamb
fclairamb deleted the fix/stale-group-publications branch October 19, 2026 22:57
fclairamb added a commit that referenced this pull request Oct 20, 2026
Specs for the open findings of the daily security scan. Specs only, no
code change.

## Specs

| Spec | Severity | Finding | Summary |
|---|---|---|---|
| `specs/todos/2026-10-20-01-sender-response-body-caps.md` | medium | K1
(2026-10-20) | The Google Chat, Gotify, Matrix, Mattermost, MS Teams,
ntfy, Slack webhook and Zulip senders, and the RabbitMQ checker, read
response bodies from a host the user chooses with no size cap. Only the
timeout bounds them. A member pointing one at their own server can
exhaust the server's memory, through the integration test endpoint, the
notification jobs or the check workers. Same class as J1 (A2A), fixed in
#608. Fix: one capped-read helper. |

Scan of 2026-10-20 covered:
- the grouped-check status-page fix (#615): the sibling lookups stay
within the org;
- the rate-limit borrowing (#609): the debt is bounded and cannot be
triggered by a tenant or an agent;
- the dash0 chart changes and the dependency bumps.

It also verified the A2A response cap of #608 (J1). No other new
finding.

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

---------

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
fclairamb added a commit that referenced this pull request Oct 22, 2026
🤖 I have created a release *beep* *boop*
---


##
[0.41.0](v0.40.1...v0.41.0)
(2026-10-22)


### Features

* **email:** calmer emails that say why a check is down
([#623](#623))
([8dd68d3](8dd68d3))
* run crawl and discovery as worker tasks from private locations
([#633](#633))
([062fd99](062fd99))


### Bug Fixes

* **aichecks:** hold AI runs with real secrets to a runtime host
allowlist ([#631](#631))
([c09fdd1](c09fdd1))
* **checkdns:** stub the resolver in TestDNSChecker_Execute
([#630](#630))
([cca1d88](cca1d88))
* **dash0:** drag-to-zoom on the Timing chart
([#617](#617))
([931816c](931816c))
* **deps:** update github.com/dop251/goja digest to 07c4b9d
([#637](#637))
([0170643](0170643))
* **deps:** update github.com/dop251/goja digest to 64adc8b
([#626](#626))
([1efd502](1efd502))
* **deps:** update github.com/dop251/goja digest to 7b1a022
([#619](#619))
([d3adde9](d3adde9))
* **deps:** update go dependencies (non-major)
([#622](#622))
([adb622c](adb622c))
* **deps:** update go dependencies (non-major)
([#627](#627))
([dee2fd0](dee2fd0))
* **deps:** update go dependencies (non-major)
([#635](#635))
([da717a5](da717a5))
* **deps:** update module github.com/a2aproject/a2a-go/v2 to v2.7.0
([#625](#625))
([bb8c7ae](bb8c7ae))
* **deps:** update module github.com/anthropics/anthropic-sdk-go to v2
([#628](#628))
([90f70c2](90f70c2))
* **deps:** update module github.com/fergusstrange/embedded-postgres to
v2 ([#614](#614))
([913ece9](913ece9))
* **email:** usage-cap email links to the platform upgrade page, not
billing ([#632](#632))
([abf3a68](abf3a68))
* **status-pages:** close a grouped check's entry when it recovers
([#615](#615))
([d4d9b21](d4d9b21))

---
This PR was generated with [Release
Please](https://github.com/googleapis/release-please). See
[documentation](https://github.com/googleapis/release-please#release-please).

---------

Co-authored-by: Claude Sonnet 5.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