# Close Ticket

> Prove a ticket is done (acceptance evidence, tests, dual-pass review, PR, ticket update). Use when the user says a ticket is done, asks to open a PR, or the agent is about to claim the work is complete.

- Skill: `reebeecka/close-ticket` (Agent Skill)
- Install (CLI): `npx skillmds@latest add reebeecka/close-ticket`
- Raw SKILL.md: https://api.skillmd.com/api/skills/reebeecka/close-ticket/raw
- Safety review: pending (external: skill-scanner PASS, skillspector PASS)
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: AI & ML
- Author: Reebeecka (https://skillmd.com/u/reebeecka)
- Updated: 2026-09-22
- Page: https://skillmd.com/skills/reebeecka/close-ticket

---


# close-ticket

Prove the ticket is done, then open a PR and update the ticket. Do not build more scope. Merge is the user's decision unless they explicitly ask to merge.

API calls: [../ticket-platform/PLATFORM.md](../ticket-platform/PLATFORM.md). Backend = last-used, else ask.

After a successful close-ticket run, write a `SESSION_TREE` in chat (see the session-tree skill).

## No ticket

If there is no GitHub issue / Jira key: say so. A PR is allowed. It cannot be "closed" against a ticket. Do not invent an id.

## Fail-closed

Any required item red → no PR, unless the user explicitly overrides. Overrides and remaining gaps go in the PR body.

## One ticket per PR

Always. Other work leaves the branch first (revert, stash, or a new ticket + later PR).

## Checklist

Run in order. Label every acceptance line **Observed** / **Inferred** / **Assumed**. Code inspection is not Observed.

1. **Identify** the ticket. Read its acceptance and out of scope.
2. **Diff vs ticket.** `git diff` / `git status` mapped to acceptance. Files that do not belong → stop; split a new ticket or revert before PR.
3. **Acceptance.** Each box, with evidence (command, URL, what appeared). Unproven = fail.
4. **Tests.** Run the relevant suite. New logic needs at least one test that would fail without the change. No harness → this item is fail (say so); do not silent-pass. User may override.
5. **Lint / types.** Clean, or user-approved exception.
6. **Dual-pass review** (if this workspace has a `review` skill, use it on the diff; always do both passes):
   - Confirmation: what is correct and working
   - Adversarial: what is missing, what breaks on edges. If the adversarial pass finds nothing, look again.
7. **UI / integration** if the ticket touches UI or a user flow: exercise the path the ticket names, plus other surfaces that read the same state. If a browser is not available, this item is not Observed — state the gap and wait for the gate (user may override, same as fail-closed).
8. **Commits** on the branch reference the ticket (`#n` or `PROJ-123`). Fix messages before opening the PR.
9. **Gate.** Show the filled checklist (pass/fail per item). Wait for yes, unless the user already said "öppna PR".
10. **PR** against `main` or `develop`. Body links the ticket. GitHub: `Closes #n` (closes on merge, not before). Jira: key in title and body.
11. **CI.** If the repo has CI, wait for `gh pr checks`. If not, skip.
12. **Ticket comment** with what changed + PR URL.
13. **Jira transition:** waiting-on-review (see platform file). **Never Done.** GitHub issue stays open until merge.

## Gate output

```
Ticket: <id>
Acceptance: pass/fail (each line + Observed/Inferred/Assumed)
Tests: pass/fail (command + result)
Lint: pass/fail
Review: confirmation / adversarial
UI: pass/fail/gap
Scope extra: none / STOP
PR: <url or blocked>
Ticket update: <done or n/a>
Overrides: <none or list>
```

