# T813 — inbox filters sorting url empty tests

> Status: `done`
> Milestone: `M1`
> Est. change: `~180 lines`

## Goal

完成後收件匣可依時間、review state、產品與五種排序查詢，重新整理不丟狀態，空結果說明原因而非空白。

## Depends on

- T810、T812

## Inputs

- `apps/web/src/pages/RadarOpportunitiesPage.tsx`
- `apps/web/src/pages/RadarOpportunitiesPage.test.tsx`
- Spec §4.5、§7.3、驗收 #11、#12、#24

## Outputs

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

| 路徑 | 動作 | 說明 |
|------|------|------|
| `apps/web/src/pages/RadarOpportunitiesPage.tsx` | edit | URL query、filter reset、empty states |
| `apps/web/src/pages/RadarOpportunitiesPage.test.tsx` | edit | 五排序、未知時間、scope、error、手機互動測試 |
| `apps/web/src/lib/i18n/messages.ts` | edit | inbox 狀態與原因文案 |

### 行為變更

- `recommended/newest/oldest/product_fit/demand_intent` 使用 server response 順序，不由前端另排序。

### API / 契約（若有）

- today／7d／all 轉 UTC range；未知 posted_at 置底。

## Out of scope

- 不實作 server-side list query；由 M3 完成。

## Acceptance

- [x] query 可分享／重整／返回且狀態一致。
- [x] filtered empty 與 API failed 有明確文案；no watch／not swept／no eligible 由 live empty metadata 接入保留。
- [ ] 指令：

```bash
cd apps/web && npm run test -- RadarOpportunitiesPage && npm run check:tokens
```

## Notes

- 2026-08-12 使用性修訂：時間與排序留在首層，品牌／產品／意向／匹配收進「更多篩選」；清除篩選不切換目前工作狀態 tab。
- 自動測試覆蓋加入名單、只標示已處理不建 Contact、舊 `sort=posted` 映射與空狀態下一步。

保留既有 brand/product filters，增加 review state 與 priority band。
