# T568 — contact-stage-transition-engine

> Status: `done`  
> Milestone: `M4`  
> Kind: `feat`  
> Est. change: `~170 lines`

## Goal

完成後系統應：Contact 階段可任意跳轉（含回退、跳級、終態重開），每次轉移寫一筆 ContactTouch。

## Depends on

- T566

## Inputs

- Spec：`../spec.md` §3.4、§9.4（CR-03、CR-04、CR-05）

## Outputs

### 程式變更（預期路徑）

| 路徑 | 動作 | 說明 |
|------|------|------|
| `apps/backend/internal/module/crm/domain/stage.go` | add | 階段枚舉與合法值驗證（**允許任意跳轉**，只驗值域） |
| `apps/backend/internal/module/crm/usecase/stage.go` | add | Transition(contact, to, actor, note?)：更新 stage → append touch → 更新 `last_touch_at` |

### 行為變更

- 任意起點到任意終點皆允許，含 `won`／`lost` 重新開啟。
- 轉到同一階段（無變化）不寫 touch，回明確「未變更」語意。
- `needs_follow_up` 不因階段轉移被清掉；由 T570 的專用端點控制。
- 轉入 `won` 只改階段，不寫成果事件；成果由 T572 的成交回報端點負責（避免兩條路徑寫帳）。

## Out of scope

- API 端點（T570）
- 成交回報（T572）

## Acceptance

- [x] CR-03：`dm_sent` 直跳 `won` 成功並留痕
- [x] CR-04：`won` 重開為 `replied` 成功並留痕
- [x] CR-05：`needs_follow_up=true` 在階段轉移後仍為 true
- [x] 指令：

```bash
cd apps/backend && go test ./internal/module/crm/... -count=1
```
