Automating Post Incident Review Summaries with GPT-4

canva · Tech · 2023 · source Agentic: no · promotional bias: low · source-backed · extracted with prompt 0.5.4 (schema v2)

Generated from extraction.json — do not edit by hand. Every claim cites verbatim source evidence; stated means the quote directly asserts the claim, implied means it supports it indirectly.

Problem

Domain: Incident management documentation

Canva needed to reduce reliability-engineer toil and improve consistency in Post Incident Review summaries stored in Confluence.

Constraints:

Architecture

Canva built a pipeline that fetches PIRs from Confluence, parses HTML into raw text, sanitizes sensitive data, prompts GPT-4-chat with a structured blameless-summary prompt and two example PIR/summary pairs, archives generated summaries to a data warehouse, places summaries on Jira tickets, and uses Jira webhooks to capture manual edits for quality monitoring.

Diagram confidence: explicit (topology described by the source).

flowchart LR
  confluence-pir-store[Confluence PIR store] --> html-parser[HTML parser]
  html-parser --> sensitive-data-sanitizer[Sensitive data sanitizer]
  sensitive-data-sanitizer --> gpt-4-chat-summarizer[GPT-4 chat summarizer]
  gpt-4-chat-summarizer --> summary-archive[Summary archive]
  summary-archive --> jira-ticket-sync[Jira ticket sync]
  jira-ticket-sync --> summary-archive
Drag to pan · scroll or use +/− to zoom · reconstructed from the source's described component topology

Components

Component Role Interacts with
Confluence PIR store Stores raw Post Incident Reports. HTML parser
HTML parser Extracts raw text from PIR HTML. Confluence PIR store, Sensitive data sanitizer
Sensitive data sanitizer Removes links, emails, and Slack channel names before model calls. HTML parser, GPT-4 chat summarizer
GPT-4 chat summarizer Generates blameless PIR summaries using structured prompts and examples. Sensitive data sanitizer, Summary archive
Summary archive Stores generated summaries and incident metadata for reporting. GPT-4 chat summarizer, Jira ticket sync
Jira ticket sync Shows summaries on Jira tickets and sends human edits back through webhooks. Summary archive

Data flow

Raw PIRs are fetched from Confluence and parsed from HTML to text. Sanitization removes sensitive links, emails, and Slack names. GPT-4-chat generates the summary using a system prompt plus few-shot examples. The generated summary is archived with metadata and copied to Jira, where human edits are captured back to the warehouse through webhooks.

4 supporting quotes
“We start by fetching the report from Confluence and parsing the HTML to extract the content of the PIR as raw text.”article, stated
“We then remove sensitive data, including links, emails, and Slack channel names, to avoid exposing internal information to public models and ensure blameless summaries.”article, stated
“We then send the text version of the report to GPT-4 chat completion⁠(opens in a new tab or window)”article, stated
“We also include the summary on the Jira tickets for the incident, so any manual changes are recorded to the warehouse using Jira webhooks.”article, stated

Why this architecture

Canva chose GPT-4-chat because the chat API could use system messages and role-labeled examples to produce a more consistent summary structure than completion, while fine-tuning lacked enough high-quality examples. Sanitization protects internal data before public-model calls, and Jira/webhook tracking turns human edits into a lightweight quality-monitoring loop.

3 supporting quotes
“allows system messages to guide the structure of the expected summary elements.”article, stated
“around 1500 examples of varied quality. This quantity is insufficient for cultivating a fine-tuned model”article, stated
“This allows us to compare the AI-generated and human-modified summaries to monitor the data quality. ## Choosing GPT-4-Chat as our LLM”article, stated

Models used: GPT-4-chat · GPT completion gpt-4-32k evaluated · GPT fine tune davinci-002 evaluated

Scale

Alternatives considered (roads not taken)

Fine-tuned davinci-002

Rejected because: The available examples were too few and varied in quality for the detail extraction Canva wanted.

“This quantity is insufficient for cultivating a fine-tuned model capable of discerning the specific details we want to extract”article, stated

GPT completion API

Rejected because: Completion performed well but was less structurally consistent than chat messages with system guidance and labeled examples.

“requires details in a single paragraph, resulting in a more flexible but potentially inconsistent response format”article, stated

Manual reliability-engineer summaries

Rejected because: Manual summaries consumed engineer time and became inconsistent.

“Previously, our reliability engineers wrote the incident summaries at the end of incidents. Over time, we noticed that reviewers often needed more context to review the summary quickly and effectively and that the summaries were becoming inconsistent.”article, stated
“Over time, we noticed that reviewers often needed more context to review the summary quickly and effectively and that the summaries were becoming inconsistent.”article, stated

Patterns

privacy-preserving-processing (governance)

Canva removes internal links, emails, and Slack channel names before sending PIR text to GPT-4.

“remove sensitive data, including links, emails, and Slack channel names”article, stated

prompt-versioning (prompting)

The summary prompt defines goals, desired components, constraints, and few-shot examples.

“Goals: Summarising reliability reports in a blameless manner”article, stated
“We offer two sets of PIR samples along with their summaries.”article, stated

human-in-the-loop-gate (workflow)

Engineer edits on Jira tickets are captured and compared with generated summaries.

“manual changes are recorded to the warehouse using Jira webhooks.”article, stated

eval-driven-development (evaluation)

Canva compared fine-tune, completion, and chat outputs manually before choosing GPT-4-chat.

“Manual comparison of about 40 summaries generated by the fine-tune method against the other two methods”article, stated

cost-aware-routing (operations)

Canva explicitly evaluated per-report token cost and judged GPT-4 cost manageable.

“Each service incurs a linear cost per report, the most expensive being GPT-4 at $0.06 per 1K tokens.”article, stated

Tradeoffs

Use GPT-4-chat

Chose chat API with system messages and role-labeled examples over fine-tuned davinci-002 or GPT completion.

Rationale: Chat gave better structure and critical-detail handling than the alternatives.

“Given these advantages, we chose GPT-4-chat as the Large Language Model (LLM) for creating summaries.”article, stated

Prompt for target length

Chose 600-character target in prompt over hard API response length limit.

Rationale: Prompted length avoids truncation while still discouraging overly long summaries.

“we request the model in the prompt to target a 600-character limit.”article, stated

Use two example pairs

Chose two PIR/summary few-shot examples over one example summary.

Rationale: Multiple examples avoid rigidly mirroring a single summary structure.

“Using multiple examples prevents GPT from rigidly mirroring the structure of a single given summary.”article, stated

Gotchas (what bit them)

Fine-tuning was not viable with limited noisy examples.

Root cause: The 1,500 available examples were varied in quality and insufficient for detailed extraction.

Resolution: Canva selected GPT-4-chat with prompt examples instead.

“around 1500 examples of varied quality. This quantity is insufficient”article, stated

Direct API response limits can truncate summaries.

Root cause: Hard output limits can lead to unfinished responses.

Resolution: Canva prompts for a 600-character target and resubmits overly long summaries for condensing.

“Directly limiting the API response can lead to truncated or unfinished outputs.”article, stated
“If a summary exceeds the desired length, we resubmit it to GPT-4 chat for further condensing.”article, stated

Blameless incident writing needs prompt-level guardrails.

Root cause: Incident reports can mention individuals, but summaries should avoid blame.

Resolution: The system prompt directs blameless summaries and uses temperature 0.

“Direct it to adopt a blameless approach. This aims to make sure the model doesn't blame any individual.”article, stated
“By setting the temperature to 0 when interfacing with the chat API endpoint”article, stated

Evaluation

Canva manually compared about 40 summaries across model options and then monitored human edits after production launch.

Metrics: manual comparison quality · impact duration accuracy · incident phase correlation · human edit rate · per-summary cost

“Manual comparison of about 40 summaries generated by the fine-tune method against the other two methods”article, stated
“most of the AI-generated PIR summaries remain unaltered by engineers.”article, stated

Outcomes

The system supports incident reporting at Canva scale: 150M+ monthly active users, 17B+ designs, and 100+ languages.

“reduced the operational toil of reliability engineers and produced higher-quality summaries”article, stated
“allowing us to integrate it with additional incident metadata”article, stated