Skip to content

feat(alerts): on-call schedules, and escalation steps that page whoever is on call - #2306

Merged
Makisuo merged 71 commits into
mainfrom
feat/alert-oncall-schedules
Nov 7, 2026
Merged

Makisuo merged 71 commits into
mainfrom
feat/alert-oncall-schedules

Conversation

@Makisuo

@Makisuo Makisuo commented Nov 6, 2026 •

Copy link
Copy Markdown
Collaborator

On-call schedules, and escalation steps that page "whoever is on call" by email and chat direct message.

Stack (merge in order): #2287 (ack) → #2304 → #2306 (this PR) → #2305 → #2307 (schedule UI).

What changed

  • Schedules (oncall_schedules, oncall_overrides):
    • a schedule has a time zone and up to 5 layers, and later layers sit on top;
    • each layer rotates its participants daily, weekly (handoff weekday and time) or every N hours, with optional weekly windows such as weekends only or 22:00-06:00;
    • overrides beat every layer, and the newest override wins.
  • Resolver (onCallAt, renderOnCall in @maple/alerting-core):
    • pure, with handoffs at local wall-clock time;
    • DST uses Temporal's "compatible" rule, so the Berlin handoff stays at 09:00 and the shifts around the clock change are 167h and 169h;
    • renders are capped at 90 days.
  • Paging people: a chain step can now target a destination, a member, or "whoever is on call on schedule X".
    • Schedules resolve when the step is sent, and people are deduped across targets.
    • The member-notification rows commit in the step's own transaction (the step's compare-and-set, with the incident locked).
    • A schedule with nobody on call logs a warning and sets maple.escalation.oncall_gap; the run still advances.
  • Delivery (alert_member_notifications, drained by AlertMemberNotifier after the destination drain):
    • Email: sent to the member's address.
    • Slack DM: chat.postMessage with the user id as channel; chat:write is enough, so no new scope.
    • Discord DM: create a DM channel, then post to it. Error codes 50007 and 50278 are permanent.
    • Hazel: refused with a clear message.
    • Rules for every page: a page queued before an ack or resolve is skipped. Retries back off with the shared alert-delivery helpers. Emails and chat ids never reach spans, logs or API output.
  • Timeline: a new paged incident event ("Paged Ben Brook by Slack DM") in v2 /incidents/{id}/events and get_incident_timeline, showing names only.
  • v2: /v2/alerts/oncall_schedules (CRUD, GET /{id}/oncall?at=, GET /{id}/shifts?from=&to=, overrides), with onc_ and ovr_ ids. Chain steps take user_id and schedule_id targets. Deleting a schedule a chain targets is a 409.
  • MCP: list_oncall_schedules, who_is_on_call, create_oncall_schedule, update_oncall_schedule, delete_oncall_schedule, create_oncall_override and delete_oncall_override. The chain tools accept user_ids and schedule_ids.
  • Self-hosted without Clerk: member checks are skipped when no member directory is configured.

Verification

  • Resolver: 21 tests, including:

    • weekly rotation across the 2026-03-29 and 2026-10-25 clock changes;
    • daily and 12h rotations;
    • weekend layers and windows that cross midnight;
    • override precedence and gaps;
    • render and onCallAt agreeing every 37 minutes over 60 days.
  • AlertsService.oncall-paging.test.ts:

    • Ben is paged by email and Slack DM through an override, and Ana gets nothing;
    • the timeline names Ben without his address;
    • a gap pages nobody;
    • pages queued before an ack are skipped;
    • a permanent DM failure is tried once, and a transient one is retried;
    • unknown targets are refused, and a targeted schedule can't be deleted.
  • Suites:

    Suite Result
    backend alerts and org 739/739
    chat-platform Slack, Discord and Hazel outbound 91/91
    v2 alerts HTTP 26/26
    MCP tools and registry contract 345/345
    domain v2, anticipated errors and audit actions 131/131
    schema parity pass
  • Typecheck: backend, db, domain, chat-platform, api, ai, web, chat-bot and alerting are clean.

  • Lint: oxlint -c .oxlintrc.effect.json is clean.

  • Migrations: additive only (three new tables).

  • An independent review pass is in progress; its fixes will land as follow-up commits on this PR.

🤖 Generated with Claude Code


Autofix with [code]smith
Open in [code]smith · Need help on this PR? Tag @codesmith-bot with what you need.

An open incident can now be acknowledged ("someone is on it") and
unacknowledged. The ack is a sub-state of `open`, like the telemetry hold:
four nullable columns on alert_incidents (who, when, name, source), so every
open/resolved consumer keeps working. alert_incident_events keeps the history
(acknowledged, unacknowledged, ack_cleared) for the timeline and for on-call
escalation to read.

The lifecycle planner holds reminders and de-escalation notices while an
incident is acknowledged. An escalation to a higher severity still pages and
clears the ack. Resolve still sends the all-clear and clears it.

Surfaces: POST /v2/alerts/incidents/:id/acknowledge and /unacknowledge
(alerts:write, 409 on a resolved incident), GET /:id/events, an
acknowledged=true|false list filter, and the acknowledge_alert_incident MCP
tool (approval-gated in chat like the other mutating tools).
… in SQL

The escalation cleared the ack from the tick's prefetch and wrote ack_cleared
after the claimed update, outside it. A failed event insert could then lose
the escalation page, and a human ack or unack during the evaluation got the
wrong outcome. Every escalation now clears whatever ack stands when it
commits, with a guarded update in the same claimed write, and writes
ack_cleared only when one was cleared. The planner no longer carries the
flag.

Also: an API-key ack records no user (the key is not a person), the
unacknowledge docs say an overdue reminder goes out on the next check, and
the MCP incident list takes an acknowledged filter.
# Conflicts:
#	apps/ai/src/mcp/tool-descriptors.generated.ts
# Conflicts:
#	packages/domain/src/mcp-outputs/catalog.ts
…lert-escalation-chains

# Conflicts:
#	packages/backend/src/services/alerts/AlertsService.ts
Domain schemas for on-call schedules (layers, rotations, restrictions, overrides) and a pure resolver: onCallAt and renderOnCall with DST-aware local handoffs.
Same change as #2302, so CI's effect lint passes on this stack before it lands.
… and lose to a resolve or ack

- the scheduler reads only runs with a decision to make, so standing acks cannot crowd out due steps
- a step locks its incident and the drain drops a step whose incident closed or was acknowledged
- a flap-suppressed re-open starts the chain past step 1 instead of dropping it
- de-escalation stops the critical tier's chain; escalation refreshes a running chain's payload
- v2 PATCH tiers without escalation_chain_id keep the stored chain; MCP "none" detaches every tier
Schedules and overrides as org-scoped tables, and OnCallSchedulesService: CRUD, overrides, who is on call at an instant and rendered shifts. Participants and override users must be workspace members; 50 schedules per org, 500 upcoming overrides per schedule, overrides at most 90 days and not over already.
/v2/alerts/oncall_schedules CRUD with onc_ ids, who is on call at an instant, rendered shifts and ovr_ overrides, audited. MCP tools list_oncall_schedules, who_is_on_call, create/update/delete_oncall_schedule and create/delete_oncall_override, naming people by display name.
Escalation steps can now target a member or an on-call schedule next to
destinations. At step time the schedule's on-call person is resolved (a
gap pages nobody and is logged and marked on the span), users are
deduped, and one email row plus one row per linked chat account is
queued in alert_member_notifications in the step's transaction.

A new AlertMemberNotifier drains that outbox in the standard lane after
the destination queue: lease claims, skip once the incident is acked or
resolved, bounded retries for transient failures. Chat transports gain
directMessage (Slack posts to the user id, Discord opens a DM channel,
Hazel refuses). Chains are validated against members and schedules, a
paged schedule cannot be deleted, schedule documents list their chains,
and the incident timeline (v2 events, get_incident_timeline) shows who
was paged on which channel without the address.
@maple-review-bot

This comment has been minimized.

@coderabbitai

coderabbitai Bot commented Nov 6, 2026 •

Copy link
Copy Markdown

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 21 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: 0b0e4b2d-16ab-4f87-a6f3-8390d56c53da
Commits

Reviewing files that changed from the base of the PR and between 5e48478 and 3ef14dc.

Files ignored due to path filters: 2

  • apps/ai/src/mcp/tool-descriptors.generated.ts is excluded by !**/*.generated.*
  • packages/domain/src/generated/anticipated-error-identifiers.ts is excluded by !**/generated/**
Files selected for processing: 98

  • apps/ai/src/mcp/dispatcher.ts
  • apps/ai/src/mcp/lib/escalation-chains.ts
  • apps/ai/src/mcp/lib/oncall-schedules.ts
  • apps/ai/src/mcp/lib/params.ts
  • apps/ai/src/mcp/resources/instructions.ts
  • apps/ai/src/mcp/tools/__tests__/alert-silence-tools.test.ts
  • apps/ai/src/mcp/tools/__tests__/alert-tools.test.ts
  • apps/ai/src/mcp/tools/__tests__/escalation-chain-tools.test.ts
  • apps/ai/src/mcp/tools/__tests__/oncall-schedule-tools.test.ts
  • apps/ai/src/mcp/tools/create-escalation-chain.ts
  • apps/ai/src/mcp/tools/create-oncall-override.ts
  • apps/ai/src/mcp/tools/create-oncall-schedule.ts
  • apps/ai/src/mcp/tools/delete-oncall-override.ts
  • apps/ai/src/mcp/tools/delete-oncall-schedule.ts
  • apps/ai/src/mcp/tools/get-incident-timeline.ts
  • apps/ai/src/mcp/tools/list-escalation-chains.ts
  • apps/ai/src/mcp/tools/list-oncall-schedules.ts
  • apps/ai/src/mcp/tools/mutating.ts
  • apps/ai/src/mcp/tools/registry.ts
  • apps/ai/src/mcp/tools/runtime-requirements.ts
  • apps/ai/src/mcp/tools/update-escalation-chain.ts
  • apps/ai/src/mcp/tools/update-oncall-schedule.ts
  • apps/ai/src/mcp/tools/who-is-on-call.ts
  • apps/ai/test/mcp/unimplemented-tool-services.ts
  • apps/api/src/routes/v2/alchemy-provider.integration.test.ts
  • apps/api/src/routes/v2/alert-incidents.http.ts
  • apps/api/src/routes/v2/alerts.http.test.ts
  • apps/api/src/routes/v2/escalation-chains.http.ts
  • apps/api/src/routes/v2/oncall-schedules.http.ts
  • apps/api/src/routes/v2/v2-test-support.ts
  • apps/api/src/runtime/http-graph.ts
  • apps/api/src/runtime/service-graph.ts
  • apps/chat-bot/src/relay/settle.test.ts
  • apps/chat-bot/src/relay/turn.test.ts
  • apps/ios/Packages/MapleAPI/Sources/MapleAPI/openapi.json
  • apps/landing/src/content/docs/reference/mcp.md
  • apps/web/src/page/investigations/conversation/kit/tool-metadata.ts
  • packages/alerting-core/src/index.ts
  • packages/alerting-core/src/oncall.test.ts
  • packages/alerting-core/src/oncall.ts
  • packages/backend/src/services/alerts/AlertIncidentAck.chat.test.ts
  • packages/backend/src/services/alerts/AlertIncidentAckService.test.ts
  • packages/backend/src/services/alerts/AlertIncidentPagesService.test.ts
  • packages/backend/src/services/alerts/AlertIncidentPagesService.ts
  • packages/backend/src/services/alerts/AlertMemberNotifier.ts
  • packages/backend/src/services/alerts/AlertsService.delivery.test.ts
  • packages/backend/src/services/alerts/AlertsService.escalation.test.ts
  • packages/backend/src/services/alerts/AlertsService.oncall-paging.test.ts
  • packages/backend/src/services/alerts/AlertsService.rules.test.ts
  • packages/backend/src/services/alerts/AlertsService.ts
  • packages/backend/src/services/alerts/ChatAlertPoster.test.ts
  • packages/backend/src/services/alerts/ChatAlertPoster.ts
  • packages/backend/src/services/alerts/EscalationChainsService.ts
  • packages/backend/src/services/alerts/OnCallSchedulesService.test.ts
  • packages/backend/src/services/alerts/OnCallSchedulesService.ts
  • packages/backend/src/services/alerts/alert-escalation-runs.ts
  • packages/backend/src/services/alerts/alerts-service-test-support.ts
  • packages/backend/src/services/alerts/delivery/transports/chat.test.ts
  • packages/backend/src/services/alerts/delivery/transports/chat.ts
  • packages/backend/src/services/integrations/ChatWorkspaceService.test.ts
  • packages/backend/src/services/integrations/ChatWorkspaceService.ts
  • packages/backend/src/services/org/OrganizationService.ts
  • packages/chat-platform/src/connectors/discord/outbound.test.ts
  • packages/chat-platform/src/connectors/discord/outbound.ts
  • packages/chat-platform/src/connectors/hazel/outbound.test.ts
  • packages/chat-platform/src/connectors/hazel/outbound.ts
  • packages/chat-platform/src/connectors/slack/outbound.test.ts
  • packages/chat-platform/src/connectors/slack/outbound.ts
  • packages/chat-platform/src/driver.test.ts
  • packages/chat-platform/src/outbound.ts
  • packages/db/drizzle/20261106232100_oncall_schedules/migration.sql
  • packages/db/drizzle/20261106232100_oncall_schedules/snapshot.json
  • packages/db/src/tables/escalation-chains.ts
  • packages/db/src/tables/index.ts
  • packages/db/src/tables/oncall-schedules.ts
  • packages/domain/src/audit-actions.ts
  • packages/domain/src/http/alerts.ts
  • packages/domain/src/http/escalation-chains.ts
  • packages/domain/src/http/index.ts
  • packages/domain/src/http/oncall-schedules.ts
  • packages/domain/src/http/v2/alert-incidents.ts
  • packages/domain/src/http/v2/api.ts
  • packages/domain/src/http/v2/escalation-chains.ts
  • packages/domain/src/http/v2/index.ts
  • packages/domain/src/http/v2/oncall-schedules.ts
  • packages/domain/src/http/v2/openapi.test.ts
  • packages/domain/src/http/v2/public-id.ts
  • packages/domain/src/http/v2/resource-ids.ts
  • packages/domain/src/http/v2/timestamp.ts
  • packages/domain/src/http/v2/v2-contract.test.ts
  • packages/domain/src/mcp-outputs/alerts.ts
  • packages/domain/src/mcp-outputs/catalog.ts
  • packages/domain/src/mcp-outputs/escalation-chains.ts
  • packages/domain/src/mcp-outputs/index.ts
  • packages/domain/src/mcp-outputs/oncall-schedules.ts
  • packages/primitives/src/index.ts
  • packages/web-data/src/alerts/incident-timeline.test.ts
  • packages/web-data/src/alerts/incident-timeline.ts
  • Autofix · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

Tip

🎯 Customize your risk assessments

Guide how CodeRabbit assesses merge risk and security architecture risk. Highlight sensitive changes and explain your security boundaries using Merge Risk Instructions and Security Risk Instructions in your review settings. Security architecture risk assessments require the Advanced plan or above.

✅ Automatic approvals, with your rules

Let CodeRabbit approve pull requests once required threads are resolved, pre-merge checks pass, and your risk limits are met. Enable Automatic approvals in review settings, with overrides for teams or file paths.

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

@Makisuo
Makisuo deployed to pr-preview November 6, 2026 15:21 — with GitHub Actions Active
@maple-review-bot

This comment has been minimized.

@Makisuo
Makisuo deployed to pr-preview November 6, 2026 15:24 — with GitHub Actions Active
@Makisuo Makisuo removed the preview:web Deploy a Workers-only PR preview (no ingest/Electric); see docs/pr-previews.md label Nov 6, 2026
@Makisuo
Makisuo deployed to pr-preview November 6, 2026 18:02 — with GitHub Actions Active
…-chains

# Conflicts:
#	apps/api/src/routes/v2/alerts.http.test.ts
#	apps/api/src/routes/v2/v2-test-support.ts
#	apps/api/src/runtime/http-graph.ts
#	apps/api/src/runtime/service-graph.ts
#	apps/ios/Packages/MapleAPI/Sources/MapleAPI/openapi.json
#	packages/backend/src/services/alerts/AlertsService.ts
#	packages/domain/src/audit-actions.ts
#	packages/domain/src/http/index.ts
#	packages/domain/src/http/v2/api.ts
#	packages/domain/src/http/v2/public-id.ts
A due step first asks whether a silence covers the incident (one rule read,
only when a step would go out) and defers under one, rechecking every minute.
An incident that opens under a silence still starts its chain; step 1 waits.
When the silence ends, the catch-up page re-keys the chain's due step to its
own time, so a destination in both the tier and the step is paged once.
…hedules

# Conflicts:
#	apps/api/src/routes/v2/v2-test-support.ts
#	apps/api/src/runtime/http-graph.ts
#	apps/api/src/runtime/service-graph.ts
#	apps/ios/Packages/MapleAPI/Sources/MapleAPI/openapi.json
#	packages/backend/src/services/alerts/AlertsService.ts
#	packages/backend/src/services/alerts/alert-escalation-runs.ts
#	packages/domain/src/audit-actions.ts
#	packages/domain/src/http/index.ts
#	packages/domain/src/http/v2/api.ts
#	packages/domain/src/http/v2/public-id.ts
@maple-review-bot

This comment has been minimized.

Makisuo and others added 2 commits November 6, 2026 19:28
…atch-up already paged

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

# Conflicts:
#	packages/backend/src/services/alerts/alert-escalation-runs.ts
@maple-review-bot

This comment has been minimized.

…-chains

# Conflicts:
#	apps/ai/src/mcp/dispatcher.ts
#	apps/ai/src/mcp/lib/params.ts
#	apps/ai/src/mcp/resources/instructions.ts
#	apps/ai/src/mcp/tool-descriptors.generated.ts
#	apps/ai/src/mcp/tools/runtime-requirements.ts
#	apps/ai/test/mcp/unimplemented-tool-services.ts
#	apps/landing/src/content/docs/reference/mcp.md
#	packages/domain/src/mcp-outputs/catalog.ts
#	packages/domain/src/mcp-outputs/index.ts
…hedules

# Conflicts:
#	apps/ai/src/mcp/dispatcher.ts
#	apps/ai/src/mcp/lib/params.ts
#	apps/ai/src/mcp/resources/instructions.ts
#	apps/ai/src/mcp/tool-descriptors.generated.ts
#	apps/ai/src/mcp/tools/get-incident-timeline.ts
#	apps/ai/src/mcp/tools/runtime-requirements.ts
#	apps/ai/test/mcp/unimplemented-tool-services.ts
#	apps/landing/src/content/docs/reference/mcp.md
#	packages/domain/src/mcp-outputs/catalog.ts
#	packages/domain/src/mcp-outputs/index.ts
@maple-review-bot

This comment has been minimized.

…-chains

# Conflicts:
#	apps/ai/src/mcp/tool-descriptors.generated.ts
#	apps/ai/src/mcp/tools/get-alert-rule.ts
#	packages/backend/src/services/alerts/AlertRulesService.ts
#	packages/backend/src/services/alerts/AlertsService.ts
…hedules

# Conflicts:
#	apps/ai/src/mcp/tool-descriptors.generated.ts
#	apps/ai/src/mcp/tools/get-incident-timeline.ts
@maple-review-bot

This comment has been minimized.

…-chains

# Conflicts:
#	apps/ai/src/mcp/tool-descriptors.generated.ts
…hedules

# Conflicts:
#	apps/ai/src/mcp/tool-descriptors.generated.ts
#	apps/ai/src/mcp/tools/get-incident-timeline.ts
@maple-review-bot

This comment has been minimized.

Base automatically changed from feat/alert-escalation-chains to main November 6, 2026 23:44
…edules

# Conflicts:
#	apps/ai/src/mcp/dispatcher.ts
#	apps/ai/src/mcp/lib/escalation-chains.ts
#	apps/ai/src/mcp/lib/params.ts
#	apps/ai/src/mcp/resources/instructions.ts
#	apps/ai/src/mcp/tool-descriptors.generated.ts
#	apps/ai/src/mcp/tools/__tests__/alert-tools.test.ts
#	apps/ai/src/mcp/tools/__tests__/escalation-chain-tools.test.ts
#	apps/ai/src/mcp/tools/create-escalation-chain.ts
#	apps/ai/src/mcp/tools/list-escalation-chains.ts
#	apps/ai/src/mcp/tools/mutating.ts
#	apps/ai/src/mcp/tools/registry.ts
#	apps/ai/src/mcp/tools/runtime-requirements.ts
#	apps/ai/src/mcp/tools/update-escalation-chain.ts
#	apps/ai/test/mcp/unimplemented-tool-services.ts
#	apps/api/src/routes/v2/alerts.http.test.ts
#	apps/api/src/routes/v2/escalation-chains.http.ts
#	apps/api/src/routes/v2/v2-test-support.ts
#	apps/api/src/runtime/http-graph.ts
#	apps/api/src/runtime/service-graph.ts
#	apps/ios/Packages/MapleAPI/Sources/MapleAPI/openapi.json
#	apps/landing/src/content/docs/reference/mcp.md
#	apps/web/src/page/investigations/conversation/kit/tool-metadata.ts
#	packages/alerting-core/src/index.ts
#	packages/backend/src/services/alerts/AlertsService.escalation.test.ts
#	packages/backend/src/services/alerts/AlertsService.ts
#	packages/backend/src/services/alerts/EscalationChainsService.ts
#	packages/backend/src/services/alerts/alert-escalation-runs.ts
#	packages/backend/src/services/org/OrganizationService.ts
#	packages/db/src/tables/escalation-chains.ts
#	packages/db/src/tables/index.ts
#	packages/domain/src/audit-actions.ts
#	packages/domain/src/http/escalation-chains.ts
#	packages/domain/src/http/index.ts
#	packages/domain/src/http/v2/api.ts
#	packages/domain/src/http/v2/escalation-chains.ts
#	packages/domain/src/http/v2/index.ts
#	packages/domain/src/http/v2/openapi.test.ts
#	packages/domain/src/http/v2/public-id.ts
#	packages/domain/src/http/v2/resource-ids.ts
#	packages/domain/src/http/v2/v2-contract.test.ts
#	packages/domain/src/mcp-outputs/catalog.ts
#	packages/domain/src/mcp-outputs/escalation-chains.ts
#	packages/domain/src/mcp-outputs/index.ts
#	packages/primitives/src/index.ts
@maple-review-bot

maple-review-bot Bot commented Nov 6, 2026 •

Copy link
Copy Markdown

Maple review

🟢 Confidence 10/10 · safe to merge. Resolver, paging transaction and notifier were read and are pinned by new tests; the v2 schedule schemas and some wiring modules were only partly read.
no findings · tests covered · risk high · 4/4 new units observable

Adds on-call schedules with a layered rotation resolver, escalation steps that page a member or whoever is on call, an email/chat-DM notifier, and v2 REST plus MCP surfaces. Reading the resolver, the paging transaction and delivery found no defect. The open McpQueryError and VcsWebhookEnqueueFailure issues are untouched by this diff.

  • onCallAt/renderOnCall resolve layered rotations, weekly windows and overrides in a schedule's time zone
  • Escalation steps take user and schedule targets, queued as alert_member_notifications in the step's transaction
  • AlertMemberNotifier drains member pages to email, Slack DM and Discord DM, skipping those queued before an ack
  • New v2 /v2/alerts/oncall_schedules CRUD, overrides, oncall/shifts reads, and seven MCP tools

Before merge

Production impact

Open errors in the changed files (3)
Issue Service Occurrences File
@maple/mcp/errors/McpQueryError (4 issues) maple-chat 30 apps/ai/src/mcp/tools/registry.ts
@maple/api/routes/VcsWebhookEnqueueFailure (2 issues) maple-api 9 apps/api/src/runtime/http-graph.ts
@maple/mcp/errors/McpQueryError (4 issues) maple-ai 12 apps/ai/src/mcp/tools/registry.ts

After this merges, Maple checks whether they stop.

3ef14dc · 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 018c522 into main Nov 7, 2026
41 checks passed
@Makisuo
Makisuo deleted the feat/alert-oncall-schedules branch November 7, 2026 00:05
@maple-review-bot

Copy link
Copy Markdown

Merged with 1 step from "Before merge" still open. If it is done, tick it on the review comment; if not, now is the time.

  • Migration · Check it is safe on production data and with the code still deployed

@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-api (production) at 2026-11-07 00:19 UTC as 018c522. Compared the 60 minutes before and after.

Errors in the changed files:

  • ➖ @maple/mcp/errors/McpQueryError: 0/h → 0/h
  • ➖ @maple/api/routes/VcsWebhookEnqueueFailure: 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/api/routes/VcsWebhookEnqueueFailure: 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
Operation Calls/h Errors p95
AlertMemberNotifier.drain 7 → 122 0.0% → 0.0% 47 → 15 ms
AlertDelivery.chat 0 → 0 0.0% → 0.0% 0 → 0 ms
EscalationChainsService.list 0 → 0 0.0% → 0.0% 0 → 0 ms

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