# Case: `reassign-cancels-old-thread-and-dispatches-new-attempt`

## 用例意义

验证 `reassign` 会取消旧的阻塞线程，并为新 worker 创建新的尝试与线程。

## 前置条件

- 已创建运行 `run_blog_reassign_001`
- 已创建任务 `T1`
- `T1` 已通过严格 worktree 模式完成首次 `dispatch`
- `worker-a` 已 `claim` 首次尝试线程，并通过 `inbox update --status blocked` 写入问题
- 最近一次 `reconcile` 已执行，使任务进入 `blocked`
- 已知旧线程为 `OLD_THREAD_ID`

## 输入

```bash
orch --db TMPDIR/coord.db --json reassign --run run_blog_reassign_001 --task T1 --to worker-b --reason "Try another worker with clearer ownership."
inbox --db TMPDIR/coord.db --json show --thread OLD_THREAD_ID
```

## 预期输出

- `reassign` 退出码为 `0`
- `reassign.data.attempt.assigned_to == "worker-b"`
- `reassign.data.attempt.attempt_no == 2`
- `reassign.data.attempt.thread_id != OLD_THREAD_ID`
- `show.data.thread.status == "cancelled"`，指向旧线程

## 断言结论

- `reassign` 不是简单修改 `assigned_to` 字段，而是显式终止旧尝试并派生新尝试
- 旧线程被取消后，worker 侧不会继续在过期上下文上执行

## 补充约束

- `reassign` 只接受 `blocked` 或 `failed` 任务
- `--to` 是必填参数；`--reason` 建议始终填写，便于审计和人工排障
