Split the status board: two rows for users, every monitor for ops #183

Merged
cruelacid merged 1 commit from worktree-nec-121-kuma-status-split into main 2026-09-26 09:14:28 +01:00
Owner

Task: NEC-121

status.nectenda.com showed every ops monitor, 13 rows in total, including certificates, egress, GlitchTip and placement. Each monitor also sent its alerts to both email and Signal. This PR splits that into two boards:

Page URL Shows Alerts
ops (new) https://uptime.nectenda.com/status/ops Every monitor, deploy heartbeats included Every one of them, on Signal only
nectenda https://status.nectenda.com Sync — Europe and Sign-in & accounts None: silent public … probes, because their ops twins already page
  • Same look. status-page styles both pages from deploy/ops/. The ops page also copies the public page's theme and display settings, so the title is the only thing that differs.
  • Same messages. The deploy banner (maintenance) is attached to both pages, and maintenance re-applies its monitors and pages on every run. Incidents fan out to both pages via KUMA_STATUS_PAGE=nectenda,ops.
  • Email. notification --detach takes the email channel off every monitor and unmarks it as default. Its settings are kept.
  • New subcommands in kuma-monitor.mjs.
    • pages [--dry-run] builds both pages from the monitor list. It replaces the rows rather than appending, and it refuses to empty the public page.
    • notification --detach <name> [--dry-run].

Verification

  • Unit tests. New deploy/test/kuma-pages.test.ts, plus the incident fan-out in kuma-maintenance.test.ts. I mutation-checked five rules (the public-group rule, swapping the two pages, first slug only, no Other group, no look mirroring), and each made the tests fail.
  • Compatibility probes. kuma-compat.mjs has new probes for everything this relies on. All 16 pass against production 2.5.5, using scratch objects that were removed afterwards.
  • Full rehearsal on a local 2.5.5. I seeded it to production's shape with the old script, then ran the new rollout. The end state had:
    • the two public rows;
    • all 15 of 15 ops monitors on the ops page;
    • identical CSS, header, footer, logo bytes and theme on both pages;
    • email on no monitor, with Signal on every alerting monitor;
    • push tokens intact;
    • an incident posted to and cleared from both pages;
    • the public row going blue (maintenance) within 20 s of the banner going up.
  • pnpm test, pnpm -r typecheck and pnpm lint all pass. The only lint warnings are existing ones in the plugin.

Not yet done (after merge, with confirmation)

Production Kuma is untouched. The rollout steps are in the NEC-121 card and in deploy/SETUP.md ("Two status pages"). Two of them are ssh writes: a snapshot.sh first, and KUMA_STATUS_PAGE=nectenda,ops plus the rebuilt kuma-maintenance.cjs on eu1 and accounts.

Changelog

The public status page now shows just two things: whether sync is working and whether sign-in is working.

🤖 Generated with Claude Code

https://claude.ai/code/session_014NVM8p1gfhNJibsZCP43Ti

Task: NEC-121 status.nectenda.com showed every ops monitor, 13 rows in total, including certificates, egress, GlitchTip and placement. Each monitor also sent its alerts to both email and Signal. This PR splits that into two boards: | Page | URL | Shows | Alerts | |---|---|---|---| | `ops` (new) | https://uptime.nectenda.com/status/ops | Every monitor, deploy heartbeats included | Every one of them, on **Signal only** | | `nectenda` | https://status.nectenda.com | **Sync — Europe** and **Sign-in & accounts** | None: silent `public …` probes, because their ops twins already page | - **Same look.** `status-page` styles both pages from `deploy/ops/`. The ops page also copies the public page's theme and display settings, so the title is the only thing that differs. - **Same messages.** The deploy banner (maintenance) is attached to both pages, and `maintenance` re-applies its monitors and pages on every run. Incidents fan out to both pages via `KUMA_STATUS_PAGE=nectenda,ops`. - **Email.** `notification --detach` takes the email channel off every monitor and unmarks it as default. Its settings are kept. - **New subcommands in `kuma-monitor.mjs`.** - `pages [--dry-run]` builds both pages from the monitor list. It replaces the rows rather than appending, and it refuses to empty the public page. - `notification --detach <name> [--dry-run]`. ## Verification - **Unit tests.** New `deploy/test/kuma-pages.test.ts`, plus the incident fan-out in `kuma-maintenance.test.ts`. I mutation-checked five rules (the public-group rule, swapping the two pages, first slug only, no Other group, no look mirroring), and each made the tests fail. - **Compatibility probes.** `kuma-compat.mjs` has new probes for everything this relies on. All 16 pass against production 2.5.5, using scratch objects that were removed afterwards. - **Full rehearsal on a local 2.5.5.** I seeded it to production's shape with the *old* script, then ran the new rollout. The end state had: - the two public rows; - all 15 of 15 ops monitors on the ops page; - identical CSS, header, footer, logo bytes and theme on both pages; - email on no monitor, with Signal on every alerting monitor; - push tokens intact; - an incident posted to and cleared from both pages; - the public row going blue (maintenance) within 20 s of the banner going up. - `pnpm test`, `pnpm -r typecheck` and `pnpm lint` all pass. The only lint warnings are existing ones in the plugin. ## Not yet done (after merge, with confirmation) Production Kuma is untouched. The rollout steps are in the NEC-121 card and in `deploy/SETUP.md` ("Two status pages"). Two of them are ssh writes: a `snapshot.sh` first, and `KUMA_STATUS_PAGE=nectenda,ops` plus the rebuilt `kuma-maintenance.cjs` on eu1 and accounts. ## Changelog The public status page now shows just two things: whether sync is working and whether sign-in is working. 🤖 Generated with [Claude Code](https://claude.com/claude-code) https://claude.ai/code/session_014NVM8p1gfhNJibsZCP43Ti
Split the status board: two rows for users, every monitor for ops
All checks were successful
Release note / release-note (pull_request) Successful in 14s
CI / build (pull_request) Successful in 4m39s
CI / e2e (pull_request) Successful in 5m14s
CI / promote (pull_request) Has been skipped
CI / build (push) Successful in 4m53s
CI / e2e (push) Successful in 5m14s
CI / promote (push) Successful in 30s
6d436ec1d2
status.nectenda.com showed all 15 ops monitors: certificates, egress,
GlitchTip, placement. A plugin user could not read it, and it went red for
things they never feel. Every monitor also paged on both email and Signal.

- The ops board is a second Kuma page (slug `ops`), served at
  uptime.nectenda.com/status/ops. It shows every monitor, deploy heartbeats
  included, and every alert still comes from those monitors.
- status.nectenda.com now shows two rows, "Sync — Europe" and
  "Sign-in & accounts". They are group monitors over silent `public …`
  probes of the same /api/ready, because the ops twin already pages.
- `pages` lays out both pages from the monitor list. It replaces the rows
  rather than appending, which is how the public page came to carry
  everything, and it refuses to empty the public page.
- Both pages look the same: `status-page` styles both, and ops copies the
  public page's theme and display settings.
- Both pages show the same messages. The maintenance is attached to both
  pages, and `maintenance` reconciles its monitors and pages on every run.
  Incidents fan out: KUMA_STATUS_PAGE=nectenda,ops posts one per page and
  reports a partial failure.
- `notification --detach` takes the email channel off every monitor and
  unmarks it as default, keeping its settings.

kuma-compat.mjs gains probes for everything this relies on: both
maintenance calls replace, a group monitor renders as a row, and
editMonitor drops a notification. All 16 pass on production 2.5.5.

Rehearsed end to end on a local 2.5.5 seeded to production's shape by the
old script: two public rows, 15 of 15 ops monitors on ops, identical
CSS/header/footer/logo/theme, email on no monitor, push tokens intact,
incident posted to and cleared from both, and the public row blue within
20 s of the banner.

Task: NEC-121

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014NVM8p1gfhNJibsZCP43Ti
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
Nectenda/nectenda!183
No description provided.