---
title: "Close done Tickets from workspace panel"
state: "closed"
created_at: "2026-06-08T03:22:00Z"
updated_at: "2026-06-08T06:10:59Z"
queued_by: "workspace-panel"
queued_at: "2026-06-08T05:46:20Z"
---

## Background

Panel currently derives `NextUserAction::Close` for Tickets whose `workflow_state` is `done`, but the action is a safe no-op:

```text
Close for Ticket <slug> requires explicit resolution text; no close was recorded.
```

This leaves Tickets in an awkward state:

```text
status: open
workflow_state: done
```

The Ticket backend `close` operation is more than a raw directory move: it moves the Ticket to `closed/`, updates `item.md`, writes `resolution.md`, and records a close/resolution event. However, when a Ticket is already `workflow_state: done`, the completion judgment has already happened. Panel does not need to launch an LLM worker just to produce a resolution.

## Goal

Implement Panel `Close` action for `workflow_state: done` Tickets by calling the Ticket backend close operation with a deterministic generated resolution.

## Requirements

- Implement `NextUserAction::Close` dispatch in the TUI/Panel path.
- Only auto-close when the Ticket is safe to close, at minimum:
  - local status is `open`;
  - `workflow_state == done`;
  - `attention_required` is not set;
  - `action_required` is not set or otherwise not blocking close;
  - `resolution.md` does not already exist.
- Generate a deterministic resolution without invoking an LLM worker.
- Resolution should be concise and factual, e.g.:

```md
Closed from workspace panel.

The Ticket had already reached `workflow_state: done`.
No implementation or workflow-state changes were started by this close action.
See `thread.md` for implementation, review, merge, validation, and state-change records.
```

- Call the existing Ticket backend close path/tooling rather than manually moving files.
- After close, refresh Panel state so the Ticket disappears from open rows / appears in closed history as appropriate.
- If the Ticket is not safe to close, show a bounded diagnostic explaining the blocker instead of doing nothing.
- Do not close Tickets whose workflow state is not `done`.
- Do not launch Orchestrator/Companion/worker solely to generate resolution text.
- Do not auto-commit the close in this ticket unless the separate commit-policy work decides that behavior.

## Design notes

This is primarily a TUI/Panel feature. The Ticket backend already exposes a close operation requiring resolution text; the Panel should supply a deterministic generated resolution for already-done Tickets and invoke that backend operation.

## Acceptance criteria

- Pressing empty `Enter` on a `workflow_state: done` open Ticket in Panel closes it through the Ticket backend.
- The closed Ticket has `resolution.md` with deterministic generated text.
- The close is recorded in the Ticket thread/status according to existing backend behavior.
- Unsafe close attempts produce clear diagnostics and do not mutate the Ticket.
- Panel refreshes after close.
- Tests cover successful close, blocked close, and generated resolution content.
- Relevant TUI/Ticket tests, `cargo fmt --check`, `git diff --check`, and `target/debug/yoi ticket doctor` pass.
