Skip to content

feat(status-pages): dashboard tab and editor - #1932

Merged
Makisuo merged 7 commits into
status-pages/4-apifrom
status-pages/5-web
Oct 31, 2026
Merged

Makisuo merged 7 commits into
status-pages/4-apifrom
status-pages/5-web

Conversation

@Makisuo

@Makisuo Makisuo commented Oct 28, 2026 •

Copy link
Copy Markdown
Collaborator

Customer status pages, 5/5: dashboard tab and editor

Routes

  • /alerts?tab=status-pages: a new "Status pages" tab in the alerts hub, next to Uptime. Each row shows the name, /s/<slug>, worst component status, component count, open incidents and last published time. An org with no pages gets a "Create a status page" on-ramp.
  • /alerts/status-pages/<stp_id>?tab=components|incidents|settings: the editor for one page.

Editor

  • Components:
    • add or edit name, description, group, linked uptime monitor, manual status override and "show uptime bars";
    • remove, after a confirm;
    • reorder with up and down buttons, applied immediately and re-read on failure.
  • Incidents:
    • open incidents and maintenance, with publish draft, post update, and resolve or complete;
    • recent ones listed below;
    • a composer for an incident (impact, status, components, message, publish now or save as draft) or a maintenance window.
  • Settings:
    • name, address, description, website, logo, brand colour, "powered by" and auto-incidents, behind the save bar;
    • the break-glass token, shown once with copy, plus replace and revoke;
    • delete page.
  • Header: "Publish now" in the editor header, reachable from every tab.
  • Roles: page, component and settings controls are admin-only, matching the API. Incident actions are open to members with write access.

Tests

  • apps/web, vitest run src/page/alerts/status-pages src/page/alerts/shared/status-page-derive.test.ts src/page/alerts/hub src/route/route.test.ts: 7 files, 78 passed. Covers the editor scenes (20), the list tab (8), status derivation (3) and the editor route.
  • bun run --cwd apps/web typecheck: clean.

Screenshots from the preview deploy (pr-1932, driven by a separate verification agent)

Status pages tab Components Incidents

Public page while Maple was healthy, then with the preview database switched off:

Live Break-glass update during the outage Delayed banner after 5 min After recovery

The full step-by-step results are in the preview test comment below.

Stack: #1927 → #1928 → #1929 → #1930 → #1932.

🤖 Generated with Claude Code

@Makisuo
Makisuo added this pull request to stack #1931 October 28, 2026 15:41
@coderabbitai

coderabbitai Bot commented Oct 28, 2026 •

Copy link
Copy Markdown

Review in Change Stack →

Warning

Review limit reached

You've used all free OSS reviews for now. Wait for the free limit to reset to keep reviewing this public repository.

Next included review available in 23 minutes.

Check out review usage here.

View limit details

Limit details: You’ve used all 4 included reviews currently available.

Learn how review limits work.

Review configuration:

Run configuration
  • Source mode: Auto
  • Repository: Unavailable
  • Branch: Unavailable
  • File: No configuration file from this repository applied
  • Commit: Unavailable
  • Layers: defaults
  • Review profile: CHILL
  • Plan: Advanced
  • Run ID: 1c15ebd0-a94e-4cc0-9cf5-ec9714c88b8c
Commits

Reviewing files that changed from the base of the PR and between 90344b5 and d10bce2.

Files selected for processing: 41
  • apps/web/src/page/alerts/hub/derive.ts
  • apps/web/src/page/alerts/hub/message.ts
  • apps/web/src/page/alerts/hub/model.ts
  • apps/web/src/page/alerts/hub/update.ts
  • apps/web/src/page/alerts/hub/view.ts
  • apps/web/src/page/alerts/shared/status-page-commands.ts
  • apps/web/src/page/alerts/shared/status-page-derive.test.ts
  • apps/web/src/page/alerts/shared/status-page-derive.ts
  • apps/web/src/page/alerts/status-pages/editor/command.ts
  • apps/web/src/page/alerts/status-pages/editor/editor.scene.test.ts
  • apps/web/src/page/alerts/status-pages/editor/form.test.ts
  • apps/web/src/page/alerts/status-pages/editor/form.ts
  • apps/web/src/page/alerts/status-pages/editor/index.ts
  • apps/web/src/page/alerts/status-pages/editor/message.ts
  • apps/web/src/page/alerts/status-pages/editor/model.ts
  • apps/web/src/page/alerts/status-pages/editor/reads.ts
  • apps/web/src/page/alerts/status-pages/editor/update-components.ts
  • apps/web/src/page/alerts/status-pages/editor/update-incidents.ts
  • apps/web/src/page/alerts/status-pages/editor/update-settings.ts
  • apps/web/src/page/alerts/status-pages/editor/update.ts
  • apps/web/src/page/alerts/status-pages/editor/view-components.ts
  • apps/web/src/page/alerts/status-pages/editor/view-incidents.ts
  • apps/web/src/page/alerts/status-pages/editor/view-settings.ts
  • apps/web/src/page/alerts/status-pages/editor/view.ts
  • apps/web/src/page/alerts/status-pages/fields.ts
  • apps/web/src/page/alerts/status-pages/list/command.ts
  • apps/web/src/page/alerts/status-pages/list/index.ts
  • apps/web/src/page/alerts/status-pages/list/message.ts
  • apps/web/src/page/alerts/status-pages/list/model.ts
  • apps/web/src/page/alerts/status-pages/list/status-pages-tab.scene.test.ts
  • apps/web/src/page/alerts/status-pages/list/update.ts
  • apps/web/src/page/alerts/status-pages/list/view.ts
  • apps/web/src/page/alerts/status-pages/slug.test.ts
  • apps/web/src/page/alerts/status-pages/slug.ts
  • apps/web/src/page/alerts/status-pages/test-pages.ts
  • apps/web/src/page/registry.ts
  • apps/web/src/route/app-route.ts
  • apps/web/src/route/route.test.ts
  • apps/web/src/route/routers.ts
  • apps/web/src/route/search.ts
  • apps/web/src/view.lazy.test.ts
Finishing Touches
📝 Generate docstrings
  • Commit to this branch
  • Create a new PR
🧪 Generate unit tests (beta)
  • Commit to this branch
  • Create a new PR
  • Autofix · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@maple-review-bot

This comment has been minimized.

@Makisuo Makisuo changed the title feat(status-pages): dashboard tab and editor for pages, components and incidents feat(status-pages): dashboard tab and editor Oct 28, 2026
@Makisuo Makisuo added the preview:web Deploy a Workers-only PR preview (no ingest/Electric); see docs/pr-previews.md label Oct 28, 2026

@maple-review-bot maple-review-bot Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

3 inline notes from Maple's review. The score and summary are in the review comment above.

@Makisuo
Makisuo force-pushed the status-pages/5-web branch from 089c3f9 to 310d255 Compare October 28, 2026 15:45
@github-actions

github-actions Bot commented Oct 28, 2026 •

Copy link
Copy Markdown
Contributor

🍁 Maple PR preview

Warning

Preview cleanup could not be confirmed. The Alchemy teardown outcome was failure.

Final commit 03e6159 · View workflow run

@maple-review-bot

This comment has been minimized.

@maple-review-bot

This comment has been minimized.

@maple-review-bot maple-review-bot Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

1 inline note from Maple's review. The score and summary are in the review comment above.

@Makisuo
Makisuo force-pushed the status-pages/5-web branch from 94b7e0d to faa8099 Compare October 30, 2026 23:35
@maple-review-bot

This comment has been minimized.

@maple-review-bot maple-review-bot Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

1 inline note from Maple's review. The score and summary are in the review comment above.

@Makisuo
Makisuo force-pushed the status-pages/5-web branch from faa8099 to 1a0781b Compare October 31, 2026 00:20
@maple-review-bot

This comment has been minimized.

@Makisuo

Makisuo commented Oct 31, 2026

Copy link
Copy Markdown
Collaborator Author

@maple-review-bot F12 and F15 are won't fix in this layer: this stack merges as one, and #1950 deletes both files (alerts/status-pages/list/* and alerts/shared/status-page-commands.ts). Their replacements carry the fixes: the page builder's slugError shows the address issue once the name is touched (F12), and status-pages/shared/commands.ts follows next_cursor for pages, components and open incidents, with a test, in #1972 (F15). Please dismiss them here.

@maple-review-bot

Copy link
Copy Markdown

Checked #1950 and #1972 on the stack rather than taking the reasoning on trust. Both dismissals hold, with one correction about where each fix lives.

F12 — dismiss. The old suppression I flagged (model.slug === "" ? null : slugIssue(...) in alerts/status-pages/list/view.ts's createDialog) is deleted by #1950, and the replacement checks the address once the name has been touched:

// #1950 apps/web/src/page/status-pages/builder/update.ts:69-74
export const slugError = (model: Model): string | null =>
	model.takenSlug !== null && model.takenSlug === model.slug
		? "That address is taken. Pick another."
		: model.slug === "" && !model.isNameTouched
			? null
			: slugIssue(model.slug)

slugIssue("") is "Add an address." (status-pages/shared/slug.ts:23-28, renamed unchanged from the copy I read), and canSubmit requires slugIssue(model.slug) === null (builder/update.ts:82), so a name that yields an empty address — 日本, as in my finding — now shows an error under the field and disables both buttons instead of silently allowing a submit. One nuance, not a blocker: isNameTouched is only set by BlurredName (builder/update.ts:201, wired as onBlur in builder/view.ts:51), so a name typed and never blurred keeps the message hidden until blur — ordinary form behaviour.

F15 — dismiss, but it is fixed in #1972, not #1950. At #1950's head the renamed shared/commands.ts still reads one page:

// #1950 shared/commands.ts:41
return (yield* client.statusPageIncidents.list({ query: { state: "open", limit: LIST_LIMIT } })).data

The cursor-following arrives in #1972 (8a02013, "list reads follow next_cursor instead of summarising the first 100 rows"): readAll wraps all three reads and shared/commands.test.ts asserts two pages [null, "page-2"] are requested. #1972 sits above #1950 (its diff imports ./derive, which #1950 adds), so the stack does carry both fixes.

F13 and F14 also fall away with the deleted dialog: status-pages/list/update.ts has no slug state left at all, and the builder's ChangedSlug hands an emptied address back to the name (slugFromName(model.name), builder/update.ts:207). I'll close those on #1950 when I re-review it; F12 and F15 can be dismissed here.

…d incidents

A Status pages tab in the alerts hub lists each page with its address, the
worst component status, open incidents and last publish, and creates one
from a dialog. /alerts/status-pages/<id> edits a page: components (add,
edit, link a monitor, override, reorder, remove), incidents and maintenance
(compose, post updates, resolve, publish drafts) and settings (fields behind
a save bar, publish now, break-glass token, delete).
@Makisuo
Makisuo force-pushed the status-pages/5-web branch from 1a0781b to d10bce2 Compare October 31, 2026 00:52
@maple-review-bot

maple-review-bot Bot commented Oct 31, 2026 •

Copy link
Copy Markdown

Maple review

🟡 Confidence 6/10 · needs attention. Held at 6 because a correctness warning is open.
2 warnings −2 · 7 notes · tests covered · risk medium · 8 defects fixed in earlier rounds

Adds the Status pages tab to the alerts hub and the /alerts/status-pages/<id> editor with components, incidents and settings tabs. Safe to merge apart from the nine findings carried over from earlier reviews, none of which this head fixes. The pre-existing McpQueryError issues surfacing through apps/web/src/page/registry.ts are untouched: the diff only registers one more lazy page there.

  • /alerts?tab=status-pages lists pages with worst status, open incidents and publish state
  • /alerts/status-pages/<id> editor with components, incidents and settings tabs
  • Incidents composer, post-update and resolve flows; maintenance windows read in the viewer's zone
  • Break-glass token issue, replace and revoke, plus settings save bar and page delete

Still open from earlier reviews

Production impact

Open errors in the changed files (2)
Issue Service Occurrences File
@maple/mcp/errors/McpQueryError (6 issues) maple-chat 1.3k apps/web/src/page/registry.ts
@maple/mcp/errors/McpQueryError (4 issues) maple-ai 349 apps/web/src/page/registry.ts

After this merges, Maple checks whether they stop.

d10bce2 · What was checked, coverage and telemetry details are on the Maple / review check. Reply "won't fix" to dismiss a finding, or mention @maple-review-bot to ask about one.

@Makisuo
Makisuo merged commit b3e9a05 into main Oct 31, 2026
32 of 48 checks passed
@Makisuo
Makisuo deleted the status-pages/5-web branch October 31, 2026 01:32
@maple-review-bot

Copy link
Copy Markdown

Maple: after this shipped

✅ Shipped clean. Nothing this change touches got worse in the hour after it deployed.

Deployed to maple-ai (pr-2012) at 2026-10-31 09:51 UTC as 8cd64a8, the first version after the merge (the merge commit itself never reported). Compared the 60 minutes before and after.

Errors in the changed files:

  • ➖ @maple/mcp/errors/McpQueryError: 0/h → 0/h
  • ➖ @maple/mcp/errors/McpQueryError: 0/h → 0/h
  • ➖ @maple/mcp/errors/McpQueryError: 0/h → 0/h
  • ➖ @maple/mcp/errors/McpQueryError: 0/h → 0/h
  • ➖ @maple/mcp/errors/McpQueryError: 0/h → 0/h
  • ➖ @maple/mcp/errors/McpQueryError: 0/h → 0/h
  • ➖ @maple/mcp/errors/McpQueryError: 0/h → 0/h
  • ➖ @maple/mcp/errors/McpQueryError: 0/h → 0/h
  • ➖ @maple/mcp/errors/McpQueryError: 0/h → 0/h
  • ➖ @maple/mcp/errors/McpQueryError: 0/h → 0/h

Maple looks once, an hour after the first deploy that carries the merge.

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