# Test Plan And Closure

> Produce the two artefacts a test manager signs - a test plan derived from what the pipeline actually produced, and a closure report stating what was covered, what was not, and what remains open at delivery. Use before starting a campaign, at its end, or when someone above the tester asks what the testing effort covered.

- Skill: `qaia-project/test-plan-and-closure` (Agent Skill)
- Install (CLI): `npx skillmds@latest add qaia-project/test-plan-and-closure`
- Raw SKILL.md: https://api.skillmd.com/api/skills/qaia-project/test-plan-and-closure/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Marketing & Growth
- Author: QAIA-Project (https://skillmd.com/u/qaia-project)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/qaia-project/test-plan-and-closure

---


# test-plan-and-closure — the two documents someone above the tester reads

Every other artefact QAIA produces is consumed by a tester: a test book, a suite, a score, a defect
report. The two ends of the ISTQB test process — **planning** and **closure** — produce the
documents a *manager* reads, and QAIA produced neither.

That is not only a conformance gap. A project whose every output is read by testers alone speaks to
nobody who decides.

## The rule that keeps these two documents from being wallpaper

**Nothing in a plan or a closure report may be written that is not derivable from an artefact.**

A test plan generated by a language model is, by default, template-filling: it will happily produce
"risks: integration issues, tight deadlines" for any project on earth, because it read the shape of
a plan and not this project. Such a document costs a signature and returns nothing.

So every section below names **where its content comes from**. If the source artefact does not
exist, the section says so — *"no risk analysis available: `prioritize` was not run"* is a useful
sentence. An invented risk is not.

## The plan

Written before or at the start of a campaign, from what the pipeline already holds.

| Section | Derived from | If missing |
|---|---|---|
| Scope — what is under test | the ingested requirement (`us-ingest`, `openapi-ingest`) | there is no plan to write |
| Out of scope | the requirement's silences and [ADR 0004](https://github.com/QAIA-Project/QAIA/blob/main/docs/adr/0004-test-level-boundary.md), the declared level boundary | state that nothing was excluded deliberately |
| Test conditions and their priority | `istqb-design` + `prioritize` | say the campaign is unprioritised — that is a finding |
| Techniques applied, and why | `istqb-design`, which already justifies each choice | — |
| Entry criteria | the requirement's open questions: which must be resolved before starting | — |
| Exit criteria | the gate in force ([ADR 0001](https://github.com/QAIA-Project/QAIA/blob/main/docs/adr/0001-negative-coverage-gate.md), the refusal-path coverage gate) and `aptitude-gate` | — |
| Environments and data | `dataset-generate`, the run configuration | say the environment is undocumented |
| Risks | `prioritize`'s probability × impact scores — **these and no others** | say no risk analysis exists |

**Entry and exit criteria are the two sections that make a plan worth signing.** A plan without them
is a description of intent. With them, it is a commitment that can be checked later — which is
exactly what the closure report does.

## The closure report

Written at the end, and its value is proportional to how much it admits.

| Section | Derived from |
|---|---|
| What was covered | the traceability matrix: requirement → scenario → test → result |
| **What was not covered, and why** | the difference between the conditions designed and the tests run |
| Exit criteria: met or not | the plan's criteria, checked one by one against the run |
| Defects still open at delivery | `defect-report` outputs not closed by `confirm-fix` |
| Questions never resolved | every `# open: Qn` still carrying no answer |
| What the numbers do not say | the stated limits of each measurement |

The second and the last rows are the ones nobody writes and everybody needs. A closure report that
only lists what went well is a press release.

## Steps

1. **Inventory the artefacts** the campaign actually produced. This is the plan's raw material and
   its limit.
2. **Write each section from its source**, naming the source.
3. **Leave a hole where a hole exists**, with the sentence saying which skill was not run.
4. **For the closure report, check each exit criterion of the plan** — one by one, against the run,
   with the file that proves it.
5. **List what remains open** before what was achieved. A reader who stops after two paragraphs
   should have read the bad news.

## What this skill must refuse

- **Inventing a risk, a criterion or a scope.** If it is not derivable, it is not written.
- **Declaring an exit criterion met without the file that proves it.**
- **Aggregating away a failure.** "48 tests, 94 % pass rate" hides which three failed and why; the
  closure report names them.
- **Writing a plan for a campaign that has not been designed.** Without `istqb-design`'s conditions,
  a plan has no content — only a shape.
- **Presenting a self-administered measurement as external validation.** A judge panel run by this
  project on its own output is a hostile reading, not an audit.

## Applied for real

**Only the closure half has been applied for real.** It was produced for the json-server campaign
— a campaign that had *already finished*, so nothing could be tailored to make it look good:
[the closure report](https://github.com/QAIA-Project/QAIA/blob/main/eval/external-application-2026-08-08/closure-report.md).

**The plan half has never been used.** No plan was written before that campaign, which is why its
closure report has to state that there were no exit criteria to check. The half of this skill that
carries entry and exit criteria is therefore specified and unexercised — say so rather than let the
example imply otherwise.

The closure report states, among other things, that **three of the four failures on the current
version were the test book's fault and not the code's**, that one finding was **counted as
contested** because the test extrapolated, and that the campaign's central question — is any of
this useful to a human doing this job — **was not answered and could not be**.

