A half-complete escalation looks familiar: a short summary, a transcript dump, "can't reproduce" in the labels, and no links to logs or traces. The result is repeated clarification, mis-triage, priority drift, and long lead times for fixes — especially when incidents are intermittent or cross multiple services.
Contents
- [Why an engineering-ready bug report flips triage from guessing to action]
- [The minimal metadata every engineer expects]
- [How to write
repro stepsthat a developer will actually run] - [How to attach logs, traces, and diagnostics engineers will use immediately]
- [Practical application: copyable
bug report templateand post-submission checklist]
Why an engineering-ready bug report flips triage from guessing to action
A ticket that engineers can act on reduces context switching and protects developer focus. Engineers scan the title, the short repro summary, the expected vs actual outcome, and the environment/version information first — those fields decide whether a ticket goes into "fix now", "queue", or "needs more info."
Contrarian point: the fastest way to make a bug low-priority is to force engineers into detective work. When support supplies the minimal inputs that remove obvious unknowns, triage becomes deterministic — severity is backed by evidence, not by tone in a customer's transcript. That clarity shortens feedback loops and accelerates owner assignment.
Important: A ticket that links to a saved log query or contains a
trace_idlets an engineer jump straight to forensic data instead of reconstructing events from memory.
The minimal metadata every engineer expects
Don’t make engineers hunt for the obvious. The table below is the working minimum I expect on escalations I hand to engineering.
| Field | What to include (format) | Why engineers care |
|---|---|---|
| Title / Summary | One-line: [Component] Short verb phrase — symptom e.g., [Payments] Duplicate charge on retry
|
Title sets context for triage and search. Keep it scannable. |
| Environment |
prod / staging / dev, region, cluster, deployment tag/git commit or build number |
Reproduction likelihood and priority depend on env (prod incidents ≠ dev bugs). |
| Version / Build | App version, docker image SHA, package.json version |
Small differences change behavior — always add exact version. |
| User / Account |
user_id (sanitized), example account or test credentials, role |
Allows targeted searches, reproducing with identical perms. |
| Steps to reproduce (short) | One-line summary before full steps: 1–3 bullets |
Engineers read an abbreviated repro before a deep dive. |
| Expected vs Actual | Short explicit statements | Removes ambiguity about what "broken" means. |
| Frequency / Scope | % of users / number of reports / deterministic/intermittent |
Helps calibrate severity and release risk. |
| Timestamps | UTC timestamps when the event occurred (with timezone) | Essential to correlate with logs and traces. |
| Trace/Request ID |
trace_id or request_id value(s) |
Enables immediate log/tracing correlation. High leverage. |
| Log snippets / attachments | 10–30 lines surrounding the error (sanitized), linked saved query | Raw data engineers will parse first. |
| Screenshots / Video / HAR | Timestamped screenshot or short video + HAR for web bugs | Visuals remove ambiguity about UI state. |
| API payloads / SQL | Example request body or DB query that reproduces the state | Repro often requires precise payloads. |
| Impact statement | #affected, business impact (revenue/hour or key flows blocked) | Converts user pain into prioritizable business risk. |
| Links | Saved log query, trace view, alert, support ticket, Slack thread | Direct navigation preserves context and reduces handoffs. |
Engineers rely on this exact set to shorten MTTR. The best teams make many of these fields required by using templates or issue forms so missing information doesn’t block triage.
How to write repro steps that a developer will actually run
Repro steps are the single most valuable thing you can provide. Follow these rules:
- Start with a one-line repro summary (what you clicked and what happened).
- Provide preconditions (account, feature flag, data setup, network conditions).
- Number the steps and make them minimal — stop when the bug appears.
- Provide exact payloads, API calls, or shell commands when possible.
- For intermittent bugs, provide the exact timestamp and one or more
trace_ids so engineers can inspect the observed run.
Bad example (unusable):
1. Log in.
2. Try to checkout.
3. It fails sometimes.
Good example (actionable):
# Preconditions:
# - Use test account: user_id=acct-7542
# - Feature flag: payment_retry=true
# - Environment: prod-us-east, app v2.4.7 (commit 3a1f9c)
# Steps:
1. POST https://api.example.com/v1/checkout
Headers:
Authorization: Bearer <redacted-token>
Content-Type: application/json
Body:
{
"user_id": "acct-7542",
"cart_id": "cart-9a8b",
"payment_method": "card-visa"
}
# Observed response: 500 Internal Server Error at 2025-12-10T18:42:33Z
# trace_id: 4f9b8c2a-6d9e-4e3a-9b6c-2e5f7a1b9c00
2. Repeat the same request 3x; failure reproducible on 2nd attempt.
A curl/HTTP example is priceless — it’s executable and removes guesswork. Provide one or two failing runs (with timestamps) rather than a long customer transcript.
If you cannot reproduce locally, provide a sanitized production session or the exact timestamps and trace_id to enable log hunting rather than forcing developers to simulate the whole environment. That swaps time-consuming reproduction for a precise forensic lookup.
How to attach logs, traces, and diagnostics engineers will use immediately
Engineers want two things from attachments: correlation and context. Give them both.
- Correlation: include
trace_id/request_idand a ready-to-run log query or a URL to the trace/span view in your APM. Example query snippet:service:payments AND trace_id:4f9b8c2a(adjust to your tool). - Context: paste a short log snippet (10–30 lines) that includes the error and the immediately preceding INFO/WARN lines. Surrounding lines often reveal the root cause.
Good JSON log snippet (structured logs preferred):
{
"timestamp": "2025-12-10T18:42:33.123Z",
"service": "payments",
"level": "ERROR",
"message": "charge failed on retry",
"user_id": "acct-7542",
"request_id": "req-9d7f-2",
"trace_id": "4f9b8c2a-6d9e-4e3a-9b6c-2e5f7a1b9c00",
"error": {
"type": "PaymentGatewayTimeout",
"code": "PGT_504"
},
"deploy": {
"version": "2.4.7",
"git_sha": "3a1f9c"
}
}
Include links to:
- The saved log query or dashboard (Datadog, Splunk, ELK, etc.).
- The APM trace (Jaeger/Zipkin/Datadog/Lightstep link containing the
trace_id). - The alert that fired (if applicable).
Security and privacy: sanitize PII before pasting logs into public tickets. For security-sensitive bugs, follow your private disclosure process and mark the ticket confidential. The Mozilla guidelines explain marking security-sensitive bugs and attaching PoCs or debug output when appropriate.
Diagnostics you might attach, depending on the failure mode:
- Browser: HAR file + screenshot/video.
- Backend: stack trace, thread dump (
jstack), heap dump location, SQL slow query sample. - Networking:
tcpdump/pcap for network issues. - Integration: sample webhook payload or third-party response.
Be explicit about where logs live and include a direct query snippet so engineers don’t have to rebuild the query from the transcript. That tiny friction removal often yields disproportionately fast results.
Practical application: copyable bug report template and post-submission checklist
Below is a lean, copyable bug report template you can drop into Jira/GitHub/your ticketing flow. After the template, you’ll find a short post-submission checklist for escalation documentation and triage hygiene.
Bug report template (Markdown)
**Title:** [Component] Short description e.g., [Payments] Duplicate charge on retry
**Environment**
- Environment: prod / staging / dev
- Region/Cluster: e.g., prod-us-east-1
- App version / build / git sha: e.g., v2.4.7 / 3a1f9c
**Severity / Impact**
- Severity: P1 / P2 / P3
- Users affected: e.g., 120 users, checkout flow
- Business impact: e.g., revenue blocked, critical path
**Short repro summary**
One-line summary of the exact action that triggers the problem.
**Full repro steps (exact)**
1. Preconditions: account, flags, test data
2. Step 1 (exact clicks/API call/command)
3. Step 2
4. Observed result (include exact error message)
5. Expected result
**Timestamps & correlation**
- First observed: 2025-12-10T18:42:33Z
- Example trace_id / request_id: 4f9b8c2a-6d9e-4e3a-9b6c-2e5f7a1b9c00
**Logs / Traces / Attachments**
- Saved log query: [link] or query snippet: `service:payments AND trace_id:4f9b8c2a`
- Trace link: [link]
- Attachments: screenshot.png, capture.har, sample_payload.json
**Additional notes**
- Related tickets: #1234, #5678
- Attempts to reproduce: local/staging/prod — results
- Temporary mitigations (if any)
GitHub issue form (example YAML)
name: Bug Report
description: File an engineering-ready bug report
title: "[Bug] "
labels: ["bug", "needs-triage"]
body:
- type: input
id: summary
attributes:
label: Short summary
description: One-line title [Component] Short description
required: true
- type: dropdown
id: environment
attributes:
label: Environment
options:
- prod
- staging
- dev
- type: textarea
id: repro_steps
attributes:
label: Steps to reproduce (exact)
description: Include preconditions, commands, and sample payloads
required: true
- type: input
id: trace_id
attributes:
label: Trace or Request ID
description: Add any trace/request IDs to correlate logs
Post-submission checklist (escalation documentation)
- [ ] Title follows
[Component] short-phrasepattern and contains a verb. - [ ]
Environment,version/git_sha, andregionfields filled. - [ ] At least one
trace_idor a saved log query attached. - [ ] Steps to reproduce are numbered, minimal, and include preconditions.
- [ ] Screenshots/video/HAR attached (and timestamped).
- [ ] Impact statement includes #users / business flow / estimated severity.
- [ ] Sensitive data redacted; security bugs marked per private process.
- [ ] Links to related alerts, dashboards, and support ticket(s) included.
- [ ] Ticket labeled for triage (
needs-triage,severity:P1, etc.) and assigned or escalated to on-call if blocking.
A filled example of the Impact Statement block:
Impact: Since 2025-12-10T18:40Z, ~120 checkout attempts failed in
prod-us-east; this blocks the primary revenue flow (~$4k/hr). Repro is deterministic foruser_id=acct-7542withpayment_retry=true.
Use that text verbatim in the ticket body when the business impact is quantifiable; it gives product and engineering leadership the facts they need to prioritize.
Sources
Bug report template | Jira - Guidance on title, repro steps, expected vs actual, and environment fields commonly used in issue templates.
About issue and pull request templates - GitHub Docs - How to enforce structured inputs using issue templates and forms.
Monitoring systems with advanced analytics - SRE Workbook - Guidance on logs, traces, request_id/trace_id correlation, and why structured logs and saved queries reduce investigation time.
File a bug report or feature request for Mozilla products | Support - Recommendations for what to include when filing bugs and instructions for handling security-sensitive reports.
Reporting Bugs - Bugzilla - Practical advice on writing full and complete bug reports and checking for duplicates.
Top comments (0)