Skip to content

Automation  ·  IT and security

How to build incident to resolution

The incident is over and nobody can reconstruct when it started, who was paged, or what was said to customers. Here is how an incident process that records itself actually works, the prompts that build it, and what running it demands.

Built with Tray Headless

  1. System Datadog
  2. Step Declare
  3. Step Assemble channel
  4. Step Timeline from events
  5. System Statuspage
Also Jira Zendesk

Declaring is one action that creates everything else, and the timeline is assembled from events rather than remembered afterwards.

The short answer

What is an incident to resolution workflow?

There are four parts to incident to resolution: declaring cheaply so nobody hesitates, assembling the channel and roles in one action, building the timeline from system events instead of from memory, and making the postmortem and its actions unavoidable. What sinks most attempts is the timeline. Reconstructing what happened from Slack scrollback a week later produces a story rather than a record, and the times are always wrong in the direction that flatters everybody.

What matters here

  • Make declaring cheap. If declaring feels like a big deal people wait, and the waiting is the expensive part.
  • Build the timeline from events as they happen. Reconstructing it later produces a story, and the times always flatter.
  • Separate detect, acknowledge, mitigate and resolve. One duration hides which part is actually slow.
  • Update customers on a cadence, even when there is nothing new. Silence is read as nothing being done.
  • Track action items to closure. A postmortem whose actions are never done is a document, not a control.

Who this is for

You run engineering operations, SRE or IT. Incidents are handled well and recorded badly, and the postmortem is written from Slack scrollback by whoever has time.

How it works in practice

From something breaking to the record being trustworthy, in order.

  1. 1

    Declaring is one action from anywhere

    A command in chat or a click from an alert. Anything heavier and people wait to see if it recovers.

  2. 2

    The channel, roles and record are created together

    Incident commander, comms lead and scribe assigned from the rota, not volunteered for mid-incident.

  3. 3

    The timeline builds itself from events

    Alerts, deploys, status changes and key messages, timestamped as they happen.

  4. 4

    Customer updates run on a cadence

    Every thirty minutes for a severity one, whether or not there is news, because silence reads as inaction.

  5. 5

    Resolution captures four separate times

    Detected, acknowledged, mitigated, resolved. One number hides which part was slow.

  6. 6

    The postmortem is created automatically with the timeline in it

    Draft populated, owner assigned, due date set, and actions tracked to closure.

What incident response is made of

Four parts, and the third is the one that makes the other three trustworthy.

Cheap declaration

One action, from chat or an alert. Every gate you add is time spent deciding whether this counts.

One-action assembly

Channel, roles, bridge, status page and record created together, from a rota rather than by asking.

An event-built timeline

Assembled as it happens from alerts, deploys and status changes. Memory is not a source.

An unavoidable postmortem

Draft created on resolution with the timeline already in it, an owner, and action items tracked until closed.

The Tray Headless prompts

Paste these into Claude Code or Codex with the Tray Headless plugin installed. Each stage runs on its own. The systems named in them are the worked example rather than a requirement, and every prompt says so.

Once per project, run /tray-workflows:set-workspace to pick the workspace these build in. Point it at a sandbox first.

  1. 1

    First, find the event sources

    The timeline is only as good as the events feeding it.

    Headless skills build-workflow

    Use build-workflow. The systems in play are PagerDuty, Datadog, Slack,
    Statuspage, Jira, Zendesk and GitHub, or whatever we run in those
    seats. Before you plan anything, tell me which of them are already
    authenticated in the workspace, because I do not want a connector
    stubbed that I have not authenticated. I expect PagerDuty, Datadog,
    Slack, Jira and Statuspage.
    
    What I need from each of them: how to read alert fire and acknowledge
    times, how to read deploy events, how to create and update a status
    page incident, and how the on-call rota is queried.
    
    The rota matters most. Roles assigned from a rota happen; roles
    assigned by asking during an incident do not.
  2. 2

    Make declaring one action

    Every gate you add is time spent deciding whether this counts.

    Headless skills build-workflow

    Use build-workflow. Declaring should be a single action: a slash command
    in chat, or one click from an alert.
    
    Ask for exactly two things: a one-line description and a severity. Nothing
    else. Everything else is derived or filled in later.
    
    On declare, in one step:
    
      Create the incident channel, named consistently so it is findable
      Assign incident commander, comms lead and scribe from the on-call rota
      Open the bridge and put the link in the channel topic
      Create the incident record with a stable id
      For severity one and two, open a status page incident in investigating
    
    Do not ask who wants to be commander. Assign from the rota and let people
    swap. Asking wastes the first ten minutes, which are the ones that
    matter.

    Severity can be corrected later and usually is. Making people get it right at declaration time is the most common reason declaring gets delayed.

  3. 3

    Build the timeline from events, not memory

    A reconstructed timeline is a story, and the times always flatter.

    Assemble the timeline continuously, as things happen:
    
      Alerts firing, with their original timestamps
      Who was paged and when they acknowledged
      Deploys and feature flag changes in the window, which is the first
      question anybody asks
      Status page updates
      Messages in the channel marked as significant, by reaction or command
      Severity changes, with who changed it and why
    
    Never rely on somebody scrolling back afterwards. A week later the
    scrollback is incomplete, the timestamps get rounded, and the version
    that gets written is the one everybody remembers instead of the one that
    happened.
  4. 4

    Update customers on a cadence

    Silence is read as nothing being done.

    Headless skills tray-gotchas tray-patterns

    Use tray-gotchas, then run customer communications on a timer:
    
      Severity one: every 30 minutes
      Severity two: every hour
      Regardless of whether there is news. "Still investigating, next update
      at 14:30" is an update.
    
    Prompt the comms lead when an update is due and post it to the status
    page. Do not auto-publish text nobody approved, and do not let the timer
    lapse silently.
    
    Also handle: linking affected support tickets so the volume is visible,
    suppressing routine automated customer email during a severity one, and
    recording exactly what was told to customers and when, because that
    becomes the contractual record.
  5. 5

    Capture four times, and make the postmortem unavoidable

    One duration hides which part was actually slow.

    On resolution, capture detected, acknowledged, mitigated and resolved as
    four separate timestamps. Time to acknowledge and time to mitigate are
    different problems with different fixes, and a single duration hides
    which one you have.
    
    Then create the postmortem automatically for anything at severity two or
    above: the draft with the timeline already in it, an owner, and a due
    date. Do not wait for somebody to volunteer.
    
    Track action items in the tracker the team already uses, with owners and
    dates, and report on them until they close. An overdue postmortem action
    from an incident three months ago is the most useful number in this whole
    workflow, and it is the one nobody produces.
  6. 6

    Test it, then hand the severity matrix over

    Because what counts as a severity one is an operational judgement.

    Run the per-step schema checks and the whole-workflow audit before this
    touches production, and run a game day against it before trusting it in
    anger.
    
    Then open the same workflow in Tray Build so engineering operations can
    adjust the severity matrix, the update cadences and the role assignments
    in the visual canvas.

What it connects to

Incidents touch monitoring, people, customers and the record, all at once.

ServiceNow

Open the incident, keep status and assignment group current, and append work notes so the timeline survives the call.

Reads and writes

PagerDuty

Read who was paged and when they acknowledged, and page the roles the severity requires.

Reads and writes

Datadog

Read the alert that fired and its timestamp, which is where time to detect actually comes from.

Reads

Slack

Create the channel, assign roles, and capture messages marked as significant into the timeline.

Reads and writes

Statuspage

Publish and update customer-facing status on a cadence, and record exactly what was said and when.

Reads and writes

Jira

Create the postmortem and its action items where the team already works, and track them to closure.

Reads and writes

Zendesk

Link the tickets the incident generated, which is the honest measure of customer impact.

Reads

GitHub

Read deploys and flag changes in the window, because that is the first question anybody asks.

Reads

Same build, other stacks

The design does not change if you run something else in one of these seats. The same prompts build it against Microsoft Teams, Jira Service Desk, Google Chat or Freshservice.

Named systems are the ones most teams run, not the only ones that work. Each is an authentication in your Tray workspace, referenced by name, so the workflow never holds a credential. Where we have a connector page, the name links to it.

Running it in production

This runs at the worst possible moment, when nobody has attention to spare for tooling.

It runs on the platform, not on your laptop

Declaration, assembly and the update timer run on the same engine, at 3am, when the person who built it is asleep.

The timeline is evidence

Built from system events with original timestamps, not reconstructed. That distinction is what makes a postmortem worth reading and an incident report defensible.

Managed credentials, not secrets in a config file

Publishing to a customer status page is a public act. That credential lives in your workspace, scoped to status only, and separately revocable.

Engineering ops owns the matrix

Severity definitions, update cadences and role assignments open in Tray Build, adjusted after the game day rather than during the incident.

Action items are chased until closed

Overdue postmortem actions reported continuously. A postmortem whose actions never happen is a document, not a control.

Questions people ask

Why make declaring so cheap?

Because if declaring feels like a big deal people wait to see whether it recovers, and that waiting is the expensive part. Ask for a line of description and a severity, and let severity be corrected later.

Why build the timeline from events?

Because reconstructing it from chat scrollback a week later produces a story rather than a record. The timestamps get rounded and the version written is the one everybody remembers.

Why four timestamps, not one duration?

Because time to acknowledge and time to mitigate are different problems with different fixes. A single incident duration hides which one you actually have.

Should customer updates go out when there is no news?

Yes. "Still investigating, next update at 14:30" is an update. Silence during an outage is read as nothing being done, and it generates the support volume you least want.

What is the most useful number this produces?

Overdue postmortem action items from incidents months ago. It is the clearest signal that the process is a document instead of a control, and almost nobody produces it.

Vibe-coding app guides

Vibe-code an entire app with Helix

This moves the data between systems. It does not give anybody a screen to work in. Build that app in Claude Code, Codex or Cursor, then deploy and run it governed on Tray Helix. Same kind of guide, same kind of prompts.

How to build an incident and postmortem tracker (opens helix.tray.ai in a new tab)

Further reading

Background on the same subject, for the case rather than the build.

Last reviewed September 2026.