Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
160 commits
Select commit Hold shift + click to select a range
1568e48
feat(alerts): acknowledge alert incidents (core, API, MCP)
Makisuo Nov 6, 2026
5a66d2b
fix(alerts): clear an ack on escalation in the claimed write, decided…
Makisuo Nov 6, 2026
090cbf6
Merge remote-tracking branch 'origin/main' into feat/alert-ack-core
Makisuo Nov 6, 2026
836f27a
chore(ios): regenerate the OpenAPI spec for the incident acknowledgem…
Makisuo Nov 6, 2026
7ec39de
fix(alerts): keep the acknowledged filter on the incident list's next…
Makisuo Nov 6, 2026
9eaf37e
chore(domain): regenerate anticipated errors for AlertIncidentResolve…
Makisuo Nov 6, 2026
6577df5
fix(alerts): leave the internal incident id out of the resolved-incid…
Makisuo Nov 6, 2026
5abdc40
fix(alerts): attribute MCP acks like the audit log, stamp ack_cleared…
Makisuo Nov 6, 2026
d4b37ee
chore(alerts): yield before the call
Makisuo Nov 6, 2026
6a09658
Merge remote-tracking branch 'origin/main' into feat/alert-ack-core
Makisuo Nov 6, 2026
f93853b
Merge remote-tracking branch 'origin/main' into feat/alert-ack-core
Makisuo Nov 6, 2026
a929a95
feat(alerts): escalation chains that page step by step until someone …
Makisuo Nov 6, 2026
0a0e10a
test(mcp): acknowledge by inc_ id and assert the rendered text
Makisuo Nov 6, 2026
eac5819
test(alerts): escalation chains walk, repeat, stop on ack and resolve…
Makisuo Nov 6, 2026
17b8598
feat(alerts): escalation chains in the v2 API and MCP, and rule tiers…
Makisuo Nov 6, 2026
dcc44b1
Merge remote-tracking branch 'origin/feat/alert-ack-core' into feat/a…
Makisuo Nov 6, 2026
1598b16
feat(alerts): pure on-call schedule resolver
Makisuo Nov 6, 2026
3924399
fix(alerts): use Arr.findFirst for the delivery log's connector lookup
Makisuo Nov 6, 2026
9416058
feat(alerts): v2 alert incidents carry their latest escalation run
Makisuo Nov 6, 2026
16ae390
fix(alerts): escalation runs survive flapping, stop on de-escalation,…
Makisuo Nov 6, 2026
327bcce
feat(alerts): on-call schedules with layers, rotations and overrides
Makisuo Nov 6, 2026
5a8f016
feat(alerts): on-call schedules in the v2 API and MCP
Makisuo Nov 6, 2026
a697395
Merge branch 'feat/alert-escalation-chains' into feat/alert-oncall-sc…
Makisuo Nov 6, 2026
2e030b1
fix(web): a tier routed only by its escalation chain saves from the r…
Makisuo Nov 6, 2026
f8a2a0c
feat(alerts): escalation chains in the Routing tab, with a dialog to …
Makisuo Nov 6, 2026
909b57c
feat(alerts): pick an escalation chain on each rule tier
Makisuo Nov 6, 2026
e57fbf5
feat(alerts): the incident rail shows its escalation: escalating, pau…
Makisuo Nov 6, 2026
e98730c
feat(lab): /lab/escalation for chains, the chain dialog, the tier pic…
Makisuo Nov 6, 2026
21f887c
test(web): a stored tier's escalation chain survives ruleToFormState …
Makisuo Nov 6, 2026
3f7e164
Merge branch 'feat/alert-escalation-chains' into feat/alert-escalatio…
Makisuo Nov 6, 2026
71737b0
test(web): drop the tier routing test the chains branch already covers
Makisuo Nov 6, 2026
c255bab
fix(web): the last step's wait label reads the parsed repeat count an…
Makisuo Nov 6, 2026
bdf9704
feat(alerts): page the on-call by email and chat direct message
Makisuo Nov 6, 2026
bd44ecb
Merge branch 'feat/alert-escalation-chains' into feat/alert-oncall-sc…
Makisuo Nov 6, 2026
37b2bca
Merge branch 'feat/alert-oncall-schedules' into feat/alert-escalation…
Makisuo Nov 6, 2026
8168fa5
fix(web): the chain delete conflict reads well when the cached chain …
Makisuo Nov 6, 2026
46dd4da
fix(lint): effect/Array.findFirst for the delivery log's connector lo…
Makisuo Nov 6, 2026
db88c86
Merge remote-tracking branch 'origin/feat/alert-ack-core' into feat/a…
Makisuo Nov 6, 2026
2d08f9b
fix(web): editing an escalation chain keeps each step's member and sc…
Makisuo Nov 6, 2026
375d9dc
fix(web): the incident rail dates a next page due on another day and …
Makisuo Nov 6, 2026
9439738
fix(web): the incident rail adds no escalation section while the read…
Makisuo Nov 6, 2026
f84d141
Merge remote-tracking branch 'origin/main' into feat/alert-escalation…
Makisuo Nov 6, 2026
b8defc3
chore(mcp): regenerate tool descriptors after merging main
Makisuo Nov 6, 2026
9ffa299
fix(api): a pre-1970 on-call timestamp is a 400, not a thrown constru…
Makisuo Nov 6, 2026
eef6186
fix(chat): connectors declare direct messages, and a rate limit retri…
Makisuo Nov 6, 2026
0b0094d
fix(alerts): member pages try every linked workspace, skip departed m…
Makisuo Nov 6, 2026
1af08d9
fix(alerts): schedules without a member directory, names without emai…
Makisuo Nov 6, 2026
d301b1b
Merge branch 'feat/alert-escalation-chains' into feat/alert-oncall-sc…
Makisuo Nov 6, 2026
f6c33ca
Merge branch 'feat/alert-oncall-schedules' into feat/alert-escalation…
Makisuo Nov 6, 2026
0a6a76b
fix(alerts): an escalation step re-reads its incident before sending;…
Makisuo Nov 6, 2026
2893824
refactor(alerts): pages read in their own service, so acknowledging n…
Makisuo Nov 6, 2026
4221fa8
Merge branch 'feat/alert-escalation-chains' into feat/alert-oncall-sc…
Makisuo Nov 6, 2026
ab96cb0
fix(mcp): delete_escalation_chain's description says a chain-only tie…
Makisuo Nov 6, 2026
81bd621
fix(alerts): escalation spans record the org as orgId; the detach hin…
Makisuo Nov 6, 2026
9bff7e5
Merge branch 'feat/alert-escalation-chains' into feat/alert-oncall-sc…
Makisuo Nov 6, 2026
51df5b2
feat(views): ShiftTimeline, PersonAvatar, PickList and FormScrollArea…
Makisuo Nov 6, 2026
2f97969
feat(alerts): on-call schedules in the hub, with a schedule form, a c…
Makisuo Nov 6, 2026
0f0e372
feat(alerts): the incident timeline shows who an escalation paged, an…
Makisuo Nov 6, 2026
27e54c2
feat(lab): /lab/oncall for schedules, their form and calendar, chain …
Makisuo Nov 6, 2026
5483d7c
fix(alerts): the escalation chain dialog locks its form while a save …
Makisuo Nov 6, 2026
849d6a5
fix(alerts): the escalation dialog's wait and repeat ranges come from…
Makisuo Nov 6, 2026
18b5f85
fix(lab): the escalation lab keeps an allowlist of local commands
Makisuo Nov 6, 2026
3c3f45f
fix(alerts): stale escalation steps are dropped from chat digests too…
Makisuo Nov 6, 2026
3c8d438
Merge branch 'feat/alert-escalation-chains' into feat/alert-oncall-sc…
Makisuo Nov 6, 2026
b8595a9
Merge branch 'feat/alert-oncall-schedules' into feat/alert-escalation…
Makisuo Nov 6, 2026
6d46111
Merge branch 'feat/alert-escalation-chains-ui' into feat/alert-oncall…
Makisuo Nov 6, 2026
fb84b4c
fix(alerts): a destination a running escalation still pages cannot be…
Makisuo Nov 6, 2026
2cf0bc9
Merge branch 'feat/alert-oncall-schedules' into feat/alert-escalation…
Makisuo Nov 6, 2026
493a25e
Merge branch 'feat/alert-escalation-chains' into feat/alert-oncall-sc…
Makisuo Nov 6, 2026
dfaa392
Merge branch 'feat/alert-escalation-chains-ui' into feat/alert-oncall…
Makisuo Nov 6, 2026
fc45bd8
fix(web): each tier's escalation chain picker has its own accessible …
Makisuo Nov 6, 2026
7085053
fix(alerts): the pages read cap drops the oldest pages, never the newest
Makisuo Nov 6, 2026
a1dc739
Merge branch 'feat/alert-oncall-schedules' into feat/alert-escalation…
Makisuo Nov 6, 2026
2e585cf
fix(web): each step's wait input is named by its step; an unacknowled…
Makisuo Nov 6, 2026
0e314e9
fix(views): shift timeline bars reach the keyboard, stay hittable, an…
Makisuo Nov 6, 2026
da700a9
fix(alerts): on-call pickers read every member page, and an unloaded …
Makisuo Nov 6, 2026
25a5e17
fix(alerts): schedule overrides cover whole shifts, ask before deleti…
Makisuo Nov 6, 2026
a441386
fix(alerts): schedule form draws layers top first and sends saved sta…
Makisuo Nov 6, 2026
772d968
fix(alerts): hub names schedules neutrally until they load, reads mem…
Makisuo Nov 6, 2026
767214d
fix(alerts): an unnamed page reads as a member, and a malformed one i…
Makisuo Nov 6, 2026
f83e7d0
test(web): sample URLs for the on-call schedule pages
Makisuo Nov 6, 2026
71d3a3e
Merge remote-tracking branch 'origin/feat/alert-escalation-chains-ui'…
Makisuo Nov 6, 2026
45143a8
fix(web): a failed or skipped page reads as such in the incident time…
Makisuo Nov 6, 2026
7227c4b
feat(lab): /lab/oncall shows the override delete confirmation
Makisuo Nov 6, 2026
2f60269
Merge branch 'feat/alert-oncall-schedules' into feat/alert-escalation…
Makisuo Nov 6, 2026
a9d2cab
Merge remote-tracking branch 'origin/feat/alert-escalation-chains-ui'…
Makisuo Nov 6, 2026
29a7171
fix(alerts): on-call bounds are the real handoffs, not the lookaround…
Makisuo Nov 6, 2026
b5b7237
fix(api): on-call 400s name the wire field and what is wrong with it
Makisuo Nov 6, 2026
e1ebead
fix(alerts): incident timelines say why a page failed and read a queu…
Makisuo Nov 6, 2026
aa10819
fix(alerts): a page stopped by an ack after failed attempts says it s…
Makisuo Nov 6, 2026
2ce204b
test(mcp): import the shift document type the on-call tool stub uses
Makisuo Nov 6, 2026
02876c9
fix(alerts): an email page fails at once where the deployment cannot …
Makisuo Nov 6, 2026
671937b
Merge branch 'feat/alert-oncall-schedules' into feat/alert-escalation…
Makisuo Nov 6, 2026
dc0ed2b
Merge branch 'feat/alert-escalation-chains-ui' into feat/alert-oncall…
Makisuo Nov 6, 2026
b833937
fix(views): override bars and their legend swatch read clearly in dar…
Makisuo Nov 6, 2026
690f087
fix(alerts): an ended shift cannot open an override; a running one is…
Makisuo Nov 6, 2026
7f1a1e6
fix(web): a refused chain delete counts rules it cannot name instead …
Makisuo Nov 6, 2026
ad18c5e
Merge branch 'feat/alert-escalation-chains-ui' into feat/alert-oncall…
Makisuo Nov 6, 2026
8321668
test(web): a chain's rule count reads before the rules list loads
Makisuo Nov 6, 2026
de6959d
fix(api): v2 escalation chain step errors say what is wrong in wire t…
Makisuo Nov 6, 2026
254950e
fix(alerts): destination in-use conflict names escalation chains too
Makisuo Nov 6, 2026
74158df
fix(mcp): escalation chain tools report bad fields on their parameter…
Makisuo Nov 6, 2026
e721c66
Merge branch 'feat/alert-escalation-chains' into feat/alert-oncall-sc…
Makisuo Nov 6, 2026
72e7b2e
Merge branch 'feat/alert-oncall-schedules' into feat/alert-escalation…
Makisuo Nov 6, 2026
2c1ffc6
fix(mcp): update_escalation_chain clears notes with description "none"
Makisuo Nov 6, 2026
7b80706
Merge branch 'feat/alert-escalation-chains' into feat/alert-oncall-sc…
Makisuo Nov 6, 2026
d09a2db
Merge branch 'feat/alert-oncall-schedules' into feat/alert-escalation…
Makisuo Nov 6, 2026
66d2375
Merge remote-tracking branch 'origin/main' into feat/alert-escalation…
Makisuo Nov 6, 2026
1352903
feat(alerts): a silence holds an escalation's due step until it ends
Makisuo Nov 6, 2026
bb0d6ea
Merge branch 'feat/alert-escalation-chains-ui' into feat/alert-oncall…
Makisuo Nov 6, 2026
2880947
Merge branch 'feat/alert-escalation-chains' into feat/alert-oncall-sc…
Makisuo Nov 6, 2026
e801830
Merge branch 'feat/alert-oncall-schedules' into feat/alert-escalation…
Makisuo Nov 6, 2026
035c319
Merge branch 'feat/alert-escalation-chains-ui' into feat/alert-oncall…
Makisuo Nov 6, 2026
2cd8b77
fix(alerts): a held step skips a destination the silence's renotify c…
Makisuo Nov 6, 2026
7af3d92
Merge branch 'feat/alert-escalation-chains' into feat/alert-oncall-sc…
Makisuo Nov 6, 2026
89a3704
Merge branch 'feat/alert-oncall-schedules' into feat/alert-escalation…
Makisuo Nov 6, 2026
0ff95bc
Merge branch 'feat/alert-escalation-chains-ui' into feat/alert-oncall…
Makisuo Nov 6, 2026
3b0ba95
fix(web): schedule form offers UTC, keeps the shown start across a zo…
Makisuo Nov 6, 2026
ba9b5fa
fix(web): a window with equal From and To shows only its error, no mi…
Makisuo Nov 6, 2026
af53c7c
fix(web): a lane with no shift in range says so; move buttons name th…
Makisuo Nov 6, 2026
a99c2ad
Merge remote-tracking branch 'origin/main' into feat/alert-escalation…
Makisuo Nov 6, 2026
9bf3fb1
Merge branch 'feat/alert-escalation-chains' into feat/alert-oncall-sc…
Makisuo Nov 6, 2026
64c91c6
Merge branch 'feat/alert-oncall-schedules' into feat/alert-escalation…
Makisuo Nov 6, 2026
261f542
Merge branch 'feat/alert-escalation-chains-ui' into feat/alert-oncall…
Makisuo Nov 6, 2026
26e332d
fix(web): a failed chain read keeps the tier's chain instead of calli…
Makisuo Nov 6, 2026
a765ffb
Merge branch 'feat/alert-escalation-chains-ui' into feat/alert-oncall…
Makisuo Nov 6, 2026
5bf5828
fix(web): the rule editor rereads chains on returning to the tab; cha…
Makisuo Nov 6, 2026
3441401
Merge branch 'feat/alert-escalation-chains-ui' into feat/alert-oncall…
Makisuo Nov 6, 2026
c51738f
Merge remote-tracking branch 'origin/main' into feat/alert-escalation…
Makisuo Nov 6, 2026
2a3582f
Merge branch 'feat/alert-escalation-chains' into feat/alert-oncall-sc…
Makisuo Nov 6, 2026
eb4330e
Merge branch 'feat/alert-oncall-schedules' into feat/alert-escalation…
Makisuo Nov 6, 2026
895fd04
Merge branch 'feat/alert-escalation-chains-ui' into feat/alert-oncall…
Makisuo Nov 6, 2026
62aeecf
Merge remote-tracking branch 'origin/main' into feat/alert-escalation…
Makisuo Nov 6, 2026
a5a2302
Merge branch 'feat/alert-escalation-chains' into feat/alert-oncall-sc…
Makisuo Nov 6, 2026
7f4c928
Merge branch 'feat/alert-oncall-schedules' into feat/alert-escalation…
Makisuo Nov 6, 2026
bca2d64
Merge branch 'feat/alert-escalation-chains-ui' into feat/alert-oncall…
Makisuo Nov 6, 2026
77eab5a
fix(web): a superseded run reads as a severity change; a failed chain…
Makisuo Nov 6, 2026
b5e6b97
Merge branch 'feat/alert-escalation-chains-ui' into feat/alert-oncall…
Makisuo Nov 6, 2026
9d364af
fix(web): a window with equal From and To saves as a full day, as the…
Makisuo Nov 6, 2026
7354b65
Merge remote-tracking branch 'origin/main' into feat/alert-escalation…
Makisuo Nov 7, 2026
4c4b98a
Merge remote-tracking branch 'origin/feat/alert-escalation-chains-ui'…
Makisuo Nov 7, 2026
b466b1c
fix(web): an anomaly rule's unrouted tier shows no routing error
Makisuo Nov 7, 2026
6b5a57c
Merge branch 'feat/alert-escalation-chains-ui' into feat/alert-oncall…
Makisuo Nov 7, 2026
daec1ef
fix(web): on-call strip survives a failed refresh and an empty inbox;…
Makisuo Nov 7, 2026
4cfbd48
fix(alerts): an acked run reads paused at once; the incident rail rer…
Makisuo Nov 7, 2026
3d2859d
Merge branch 'feat/alert-escalation-chains-ui' into feat/alert-oncall…
Makisuo Nov 7, 2026
80a4d96
fix(web): a failed members read is asked again on the next route change
Makisuo Nov 7, 2026
548b0f7
fix(web): a refused chain delete rereads the chains and counts its bl…
Makisuo Nov 7, 2026
352f406
Merge branch 'feat/alert-escalation-chains-ui' into feat/alert-oncall…
Makisuo Nov 7, 2026
fbba600
fix(web): the chain picker is described by and marked invalid with it…
Makisuo Nov 7, 2026
72c1866
Merge branch 'feat/alert-escalation-chains-ui' into feat/alert-oncall…
Makisuo Nov 7, 2026
c12d4b2
fix(web): the schedule form's add, remove and window buttons name the…
Makisuo Nov 7, 2026
f92b112
fix(web): a refused chain delete's message is rebuilt from the chains…
Makisuo Nov 7, 2026
5dcb206
Merge branch 'feat/alert-escalation-chains-ui' into feat/alert-oncall…
Makisuo Nov 7, 2026
8b77935
fix(web): a failing schedules read is retried on the five-minute cloc…
Makisuo Nov 7, 2026
c5f4930
fix(web): the schedule header keeps re-reading after a failed refresh…
Makisuo Nov 7, 2026
e9a5f1d
Merge remote-tracking branch 'origin/main' into feat/alert-oncall-sch…
Makisuo Nov 7, 2026
bf8f6fe
fix(web): the incident activity follows pages; labs allow only local …
Makisuo Nov 7, 2026
b9733a8
fix(web): overrides follow every page; the activity re-read supersede…
Makisuo Nov 7, 2026
e0f7481
fix(web): the activity poll refreshes, only a new step supersedes a r…
Makisuo Nov 7, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 16 additions & 0 deletions apps/web/src/lab/entries/oncall.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
import { defineShellLab } from "../shell-lab"
import { breadcrumbs, Flags, flags, init, Message, Model, update, view } from "../oncall-lab"

// `/lab/oncall`: on-call schedules, their form and calendar, chain targets and paged events (`?state=`).

export const lab = defineShellLab("On-call schedules", {
Model,
Message,
Flags,
flags,
init,
update,
view,
currentPath: "/lab/oncall",
breadcrumbs,
})
27 changes: 1 addition & 26 deletions apps/web/src/lab/escalation-lab.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,13 +5,8 @@ import { Effect, Option, Result, Schema, Array as Arr, String as Str } from "eff
import { Command, type Update } from "foldkit"
import type { Html, HtmlBuilder } from "foldkit/html"
import { defineMessageUnion } from "foldkit/message"
import * as Animation from "@foldkit/ui/animation"
import { LoadChartRuntime } from "@maple/views/charts/chart-runtime"
import * as Dialog from "@maple/views/ui/dialog"
import * as Menu from "@maple/views/ui/menu"
import * as Popover from "@maple/views/ui/popover"
import * as Select from "@maple/views/ui/select"
import * as Tooltip from "@maple/views/ui/tooltip"
import * as ChainDialog from "../page/alerts/escalation-dialog/dialog"
import * as EditorMessage from "../page/alerts/editor/message"
import * as EditorModel from "../page/alerts/editor/model"
Expand All @@ -36,6 +31,7 @@ import {
import { incidentRow, INCIDENT_ID, NOW, ORG, ruleId, ruleRow } from "../page/alerts/shared/test-rows"
import type { PageContext } from "../page/contract"
import type { Resources } from "../platform/resources"
import { keepLocal } from "./local-commands"

// `/lab/escalation`: escalation chains in the Routing tab, their dialog, a rule tier's chain picker
// and the incident rail, over fixtures. `?state=` picks one.
Expand Down Expand Up @@ -90,27 +86,6 @@ const RULES = [
ruleRow(3, { name: "Payments webhook failures" }),
]

/** The kit's own UI commands and the chart runtime; every page read and write is dropped. */
const LOCAL_COMMANDS: ReadonlySet<string> = new Set([
LoadChartRuntime.name,
Animation.WaitForPaint.name,
Animation.WaitForAnimationSettled.name,
Dialog.WaitForDialogTransition.name,
Menu.FocusMenuItem.name,
Menu.WaitSubmenuDelay.name,
Menu.WaitForMenuExit.name,
Select.FocusSelectItem.name,
Select.WaitForSelectExit.name,
Popover.WaitHoverDelay.name,
Popover.WaitForPopoverExit.name,
Tooltip.WaitOpenDelay.name,
Tooltip.CheckFocusVisible.name,
])

/** An allowlist, not a denylist: a new API command stays off the real API with fixture ids. */
const keepLocal = <M>(commands: ReadonlyArray<Command.Command<M, never, Resources>> | undefined) =>
Arr.filter(commands ?? [], (command) => LOCAL_COMMANDS.has(command.name))

/** Runs messages through a page's update, keeping the local commands (a dialog's open animation). */
const fold = <PM, PS>(
start: Step<PM, PS>,
Expand Down
31 changes: 31 additions & 0 deletions apps/web/src/lab/local-commands.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
import { Array as Arr } from "effect"
import type { Command } from "foldkit"
import * as Animation from "@foldkit/ui/animation"
import { LoadChartRuntime } from "@maple/views/charts/chart-runtime"
import * as Dialog from "@maple/views/ui/dialog"
import * as Menu from "@maple/views/ui/menu"
import * as Popover from "@maple/views/ui/popover"
import * as Select from "@maple/views/ui/select"
import * as Tooltip from "@maple/views/ui/tooltip"
import type { Resources } from "../platform/resources"

/** The kit's own UI commands and the chart runtime; every page read and write is dropped. */
const LOCAL_COMMANDS: ReadonlySet<string> = new Set([
LoadChartRuntime.name,
Animation.WaitForPaint.name,
Animation.WaitForAnimationSettled.name,
Dialog.WaitForDialogTransition.name,
Menu.FocusMenuItem.name,
Menu.WaitSubmenuDelay.name,
Menu.WaitForMenuExit.name,
Select.FocusSelectItem.name,
Select.WaitForSelectExit.name,
Popover.WaitHoverDelay.name,
Popover.WaitForPopoverExit.name,
Tooltip.WaitOpenDelay.name,
Tooltip.CheckFocusVisible.name,
])

/** An allowlist, not a denylist: a new API command stays off the real API with fixture ids. */
export const keepLocal = <M>(commands: ReadonlyArray<Command.Command<M, never, Resources>> | undefined) =>
Arr.filter(commands ?? [], (command) => LOCAL_COMMANDS.has(command.name))
16 changes: 16 additions & 0 deletions apps/web/src/lab/oncall-lab.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
import { Array as Arr } from "effect"
import { describe, expect, it } from "vitest"
import * as IncidentMessage from "../page/alerts/incident/message"
import { init, Message, update } from "./oncall-lab"

const names = (commands: ReadonlyArray<{ readonly name: string }> | undefined) =>
Arr.map(commands ?? [], ({ name }) => name)

describe("on-call lab", () => {
it("drops page writes so fixture ids never reach the API", () => {
const { model } = init({ state: "incident-paged" })
const incident = (message: IncidentMessage.Message) =>
names(update(model, Message.GotIncidentMessage({ message })).commands)
expect(incident(IncidentMessage.Message.ClickedAcknowledge({ acknowledged: true }))).toEqual([])
})
})
Loading
Loading