ProductHow it worksPricingBlogDocsLoginFind Your First Bug
A test closure report checklist where most fields are checked in muted grey, one exit-criteria row is highlighted in lime with a fully filled waiver card beside it, and a faint hollow ghost copy of the same row behind it stands empty with none of its fields filled
TestingTest Closure ReportTest Reporting

Test Closure Report: 5 Criteria, 2 Waivers

Tom Piaggio
Tom PiaggioCo-Founder at Autonoma

A test closure report is the sign-off document that formally ends a release's testing and records whether the evidence supports shipping. A complete test closure report has six sections: scope covered and excluded, execution summary, defect summary by severity, traceability coverage, exit criteria with waivers, and residual risk with sign-off. It exists to answer one question after the fact: does the evidence support releasing, and for anything that fell short, who accepted that and on what basis.

If an auditor, a client, or a release manager ever asked your team for one of these and what you handed back was "testing is done, ship it," this article gives you the fields that actually satisfy that ask, filled in with real numbers rather than a blank skeleton. It's for the QA engineer or SDET who has to produce this document, who's onboarding a junior and needs something more concrete than a definition, or who's being asked in an interview to name what belongs in one.

It is not for the QA lead deciding how much process a whole test strategy needs, an allocation question covered in our piece on test entry and exit criteria, and it's not for a team wondering whether the tests an AI assistant generated are testing anything real. This one is narrower: you ran a suite against a real release, and now you have to write down, in a way an auditor can reconstruct months later, what happened and what you decided to accept.

Test closure report template: the six sections

A closure report isn't the software testing life cycle's six phases restated with a form stapled on. It's the artifact that phase produces: six recurring fields, each a specific claim, not a heading to decorate with adjectives.

SectionWhat belongs in it
ScopeWhat was tested, and explicitly what wasn't
Execution summaryPlanned, executed, passed, and failed case counts
Defect summaryDefects found, fixed, and deferred, by severity
Traceability coverageShare of requirements the executed tests reach
Exit criteria and waiversWhich criteria passed, which were waived, and why
Residual risk and sign-offWhat risk remains, and who approved the release

A test summary report covers one cycle, sprint, or phase; a test closure report covers the whole release, adding sign-off, waivers, and residual risk. IEEE 829, the software test documentation standard, formalized reports like these as named deliverables long before anyone called them closure reports. Several summary reports typically feed one closure report.

Four test summary reports arriving one cycle at a time on the left, each with its own counts: sprint 41 with 46 cases and 8 defects, sprint 42 with 52 cases and 9 defects, sprint 43 with 28 cases and 7 defects, and a shared-path regression pass with 12 cases and 3 defects. Their connectors join a single trunk into one lime-outlined closure report card for release 4.12.0, whose evidence rows appear only once all four have landed: 138 of 138 executed, 27 found with 20 fixed and 7 deferred, and 36 of 40 requirements traced. A dashed divider and the rows headed what only closure adds, exit criteria met or waived, two waivers with named owners, and residual risk with sign-off, appear last of all

The counts on the right are just the four cycles added up. The three rows underneath the divider are the only part that could not have been carried over from a summary report.

Here's what all six look like filled in, as a worked test closure report example.

A filled test closure report example

Take a release we'll call 4.12.0, "Notification Preferences Rework." Three feature epics: per-channel digest frequency controls, an SMS opt-out flow with double confirmation, and pagination for the in-app notification center. 138 test cases were planned across the three epics, and all 138 were executed.

In scope: those three epics, plus regression across the existing email and push paths sharing delivery infrastructure with the new work. Explicitly not covered: legacy digest templates deprecated in this same release, and delivery under peak send volume, a load characteristic that belongs to the team's own load-testing pass, not this suite.

The six closure-report sections split into generated and judged halvesA dashed vertical line divides one closure report for release 4.12.0 into two columns. The left column, generated from a run, holds four muted grey rows: scope covered (three epics plus shared regression), execution summary (138 of 138 executed), defect counts by severity (27 found, 20 fixed, 7 deferred), and traceability coverage (36 of 40 requirements, 90 percent). The right column, written by a person, holds four lime rows: scope not covered (legacy templates and peak-volume load), waiver rationale (2 waivers with a named accepting owner), residual risk (deferred defect and waived latency), and sign-off (attributed to a named role rather than the report).One closure report, two halvesGenerated from a runOutputs of a runWritten by a personDecisions a person acceptsScope coveredThree epics plus shared regressionExecution summary138 of 138 executedDefect counts by severity27 found, 20 fixed, 7 deferredTraceability coverage36 of 40 requirements, 90%Scope not coveredLegacy templates, peak-volume loadWaiver rationale2 waivers, named accepting ownerResidual riskDeferred defect and waived latencySign-offNamed role, not the report

Left column: counts a run produced. Right column: judgments with a name on them.

Twenty-seven defects surfaced during execution. Here's how they split by severity and by outcome:

SeverityFoundFixedDeferred
Critical220
High651
Medium1192
Low844
Total27207

For trending counts like these release over release, see defect density and leakage. Against the requirements traceability matrix for this release, the 138 executed cases trace to 36 of 40 in-scope requirements, 90%, and that gap matches the two items already named as out of scope: proof the gap is a decision, not an oversight. For what that percentage can hide, see test coverage metrics.

Exit criteria for this release, and whether each was met outright or waived:

CriterionTargetMeasuredStatus
Planned cases executed100%138 of 138Met
Critical defects open00Met
High-severity defects open01 deferredWaived
p95 latency, peak send volume≤400ms620msWaived
Traceability coverage≥90%36 of 40 (90%)Met

Three of five criteria closed clean. The other two are why the next section exists.

What a waiver in a test closure report must record

The exit criteria table is where an auditor's eye lands first, but what separates a real closure report from theater is what a waived row actually says. "Deferred" by itself isn't a waiver, it's an unresolved question wearing a status label. An auditor can't reconstruct from that single word what was actually measured, who decided the gap was acceptable, whether the decision covers this release only or every release after it, or when someone is supposed to look again.

A single waiver record with all six required fields filled inOne card outlined in lime, headed waived exit criterion for release 4.12.0, holding six numbered fields. Field one, criterion, reads p95 latency at peak send volume. Field two, measured versus target, reads 620 milliseconds against a 400 millisecond target. Field three, accepted by, reads VP of Engineering. Field four, scope of acceptance, reads this release only. Field five, revisit condition, reads re-measured before next release. Field six, tracking ticket, reads NOTIF-2291.One waiver, six required fieldsEvery field filled, none optionalWaived exit criterionRelease 4.12.01Criterionp95 latency, peak send volume2Measured vs target620ms against a 400ms target3Accepted byVP of Engineering4Scope of acceptanceThis release only5Revisit conditionRe-measured before next release6Tracking ticketNOTIF-2291

The waived latency row, written out so an auditor can reconstruct the decision.

The good version carries six fields, and none of them are optional:

FieldRecorded as "deferred"Recorded as a real waiver
CriterionNot statedp95 latency, peak send volume
Measured vs. targetNot stated620ms against a 400ms target
Accepted byNot statedVP of Engineering
Scope of acceptanceNot statedThis release only
Revisit conditionNot statedRe-measured before next release
Tracking ticketNot statedNOTIF-2291

p95 latency under peak send volume is a load-testing measurement, not a functional one, and it isn't something Autonoma or any behavioral end-to-end tool measures. That number came from the team's own load-testing pass, run with a tool built for exactly that job, such as k6 or Gatling, and it belongs in the waiver because it's an exit criterion for this release, not because an E2E suite produced it.

A deferred defect is a waiver by another name: it's an admission that a known problem is shipping anyway, and it deserves the same six fields. The high-severity deferred defect here follows them with a different owner: duplicate SMS opt-out confirmations sent when a user toggles the preference twice within two seconds, accepted by the Engineering Manager for Notifications for this release only, revisited at the next sprint's triage, tracked as NOTIF-2214.

How Autonoma supplies the evidence half

Everything above the waiver table is evidence: scope, execution counts, defect counts by severity, coverage against the matrix. It's the half of the report that used to take someone most of a day to assemble by hand, running the suite, counting outcomes, cross-referencing a spreadsheet, and typing all of it up before anyone got to the interesting question, which is what to do about the rows that didn't pass cleanly.

That's the layer we built Autonoma to remove for the web end-to-end portion of a suite. Our agents read your codebase to plan test cases directly against your routes, components, and flows, run them against a live preview environment, and classify each result as a real defect, an agent error, or a plan mismatch as the run finishes rather than days later when someone gets around to triage. Every run publishes its own pass and fail counts and a coverage view against the cases it planned. Point that output at the traceability matrix your team already maintains, or at a results dashboard or an automated reporting pipeline that already ingests structured run data, and the top half of a closure report gets close to generated rather than typed, the moment a run finishes.

This is additive, not a replacement. Autonoma doesn't run the load-testing pass that produced the 620ms number above, doesn't own unit-level structural coverage, and doesn't write the sentence that says a high-severity defect is acceptable for one release. It supplies fresh, structured evidence for the behavioral end-to-end portion of the suite. The judgment calls in the bottom half of the report stay a human's to make and sign, same as they always were.

Which test closure report sections are generated and which are judged

Once evidence generates itself, the honest split in a closure report isn't "sections filled in" versus "sections left blank." It's generated versus judged. Scope covered, the execution summary, the defect counts by severity, and traceability coverage are all outputs of a run, and a dashboard or a reporting pipeline can produce every one of them the moment a suite finishes. Scope explicitly not covered, the waiver rationale for anything that missed its criterion, and the residual risk statement are not outputs of a run. They're a decision about what a team is choosing to accept, made by someone with the authority to accept it, and no amount of dashboard automation changes whose name goes on that call.

This artifact existed in the first place because summarizing results by hand was expensive: someone had to run the suite, count what happened, and write it down before anyone could decide anything. Running the suite and counting what happened stopped being the expensive part. What's left, the part actually worth a person's time, is the part that says what the answer should be: which risk is acceptable, whose name is on that decision, and when it gets revisited. That's the judgment half, and it was the only half that was ever the real point of a closure report.

For release 4.12.0: the execution summary (138 of 138), the defect table, and the 90% traceability figure could all have been produced the moment the suite finished, no different from a build log. The judgment side is what's left, and it's short and specific rather than a general assurance: a residual risk statement naming the one known duplicate-confirmation defect deferred to next sprint's triage, the peak-send-volume behavior accepted pending a separate load-testing result, and the decision to leave legacy digest templates out of scope. None of that generates itself, because generating it would mean generating the judgment, and judgment isn't a category of automation.

If you're producing one of these today, start from the six-section table above and fill in real values rather than shipping the blank skeleton most templates hand you; a filled report with a two-line waiver beats a clean skeleton every time someone actually reads it during an audit. If your suite already runs against a live preview environment, wiring that run's output straight into the evidence half of the report is worth doing before your next release, whether that's through Autonoma or whatever already produces your structured results today. Either way, the judgment half is where your attention belongs, because it's the one part nothing generates for you.

Frequently Asked Questions

A test closure report is the document that formally ends a test cycle or release's testing activity. It records what was covered and what was explicitly not covered, how many defects were found, fixed, and deferred, how much of the requirements traceability matrix the executed tests reached, which exit criteria were met or waived, and the residual risk the team is accepting by releasing. It exists so someone reviewing the release later, an auditor, a new team member, or the team itself, can reconstruct exactly what the evidence supported and what was a judgment call.

At minimum: the scope tested and the scope explicitly excluded, a test execution summary with planned, run, passed, and failed counts, a defect summary broken down by severity and by outcome (fixed versus deferred), coverage against the requirements traceability matrix, the status of each exit criterion including any that were waived, a rationale for each waiver naming the accepted gap, who accepted it, the scope and duration of that acceptance, and the tracking ticket, and a residual risk statement summarizing what could still go wrong after release.

A test summary report is typically produced at the end of a test cycle, sprint, or phase, and describes what happened during that specific window: cases run, defects logged, and current status. A test closure report is produced at the end of a release or project's testing and is a formal sign-off document: it states whether exit criteria were met, documents any waivers with their rationale, and records residual risk before the release ships. In practice, several test summary reports across a release's life often feed into the one closure report that ends it.

It varies by organization, but the pattern is consistent: the QA lead or test manager confirms the evidence is accurate and complete, the accepting owner named in each waiver signs off on that specific accepted gap, and a release manager or engineering leader gives final approval to ship given everything documented. On smaller teams, one person may hold more than one of those roles, but the waiver-level acceptance should still be attributed to a specific named role rather than the report as a whole.

Residual risk is the risk that remains after testing and defect triage decisions are made, and it's what a test closure report's final section should state plainly rather than imply. It comes from three sources: functionality explicitly not tested, defects found but deferred rather than fixed, and exit criteria that were waived rather than met. A residual risk statement names these specifically, rather than asserting the release is low-risk in general, because a vague reassurance is exactly what a real incident later proves wrong.

Yes, for the behavioral end-to-end portion of a suite, and it produces them the moment a run finishes rather than after someone spends a day collating them. Autonoma's agents plan test cases from your codebase, run them against a live preview environment, and classify each result as a real defect, an agent error, or a plan mismatch, which is exactly what the execution summary, the defect counts by severity, and the coverage view are assembled from. Point that output at a results dashboard or a reporting pipeline and the top half of the report arrives close to written. The bottom half stays deliberately human: the scope you chose not to cover, the rationale behind each waiver, the residual risk, and the name on the sign-off. Load and performance criteria, like the p95 latency target in this example, come from a dedicated load-testing tool, which is the right source for them.

Related articles

A CI pipeline diagram showing a test run producing a JUnit XML artifact that fans out into a PR comment, a Slack message, and a dashboard

Automated Test Reporting: How to Wire It into CI

Automated test reporting in CI: configure a JUnit or Allure reporter, upload it as an artifact, and route results to Slack, PR comments, and dashboards.

A horizontal agent trajectory diagram showing a tool call passing a right-tool checkpoint but failing an argument-accuracy checkpoint

How to Test AI Agents That Take Actions (Tool Calls)

A runnable guide to testing tool-calling agents: right tool, right order, right arguments, mocked vs live calls, failure handling, and non-determinism.

A chatbot test pipeline moving from manual QA through scripted and semantic assertions into an automated CI gate that samples the model N times before allowing a merge

Chatbot Automation Testing: Why Assertions Fail

Chatbot automation testing that survives non-deterministic replies: the migration to a CI gate, n-run sampling, threshold gating, and real GitHub Actions YAML.

Sealed tenant data capsules being sorted into fully partitioned vault compartments, each isolated from the others, illustrating multi-tenant test data isolation

Multi-Tenant Test Data Isolation

What multi-tenant test data isolation means, why it matters for testing, and the four isolation patterns (schema, row-level, database, per-run) with tradeoffs.