# T033 — 結果分頁與 legacy run

> Status: `done`
> Milestone: `M3`
> Est. change: `~190 lines`

## Goal

完成後，新 run 結果與缺 run_id 的舊貼文都能按 Spec 依 score 穩定分頁，且同分未知 posted_at 置底。

## Depends on

- T032

## Inputs

- 讀取 / 依賴：
  - 檔案：`apps/backend/internal/module/scout/repository/{memory,mongo}.go`
  - 既有能力 / API：Post.RunID、canonical identity、run query contract
  - Spec 段落：§4 流程 E、§6.1、§9 #8–#11

## Outputs

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

| 路徑 | 動作 | 說明 |
|------|------|------|
| `apps/backend/internal/module/scout/repository/memory.go` | edit | 實作 score／同分時間排序、legacy synthetic grouping 與 page total。 |
| `apps/backend/internal/module/scout/repository/mongo.go` | edit | 實作等價 Mongo query/aggregation 與 stable tie-breaker。 |
| `apps/backend/internal/module/scout/repository/run_paging_contract_test.go` | add | 同案例驗證 memory/Mongo 契約。 |

### 行為變更

- legacy 同 owner＋theme 只形成一個 synthetic run；canonical duplicates 只顯示偏好項。

### API / 契約（若有）

- score desc；同分 posted_at > 0 在未知前，再以 created_at／ID desc。

## Out of scope

- 不猜測 legacy 同 theme 的歷史執行次數。

## Acceptance

- [x] 27 筆跨頁 unique count 等於 total，重複查詢順序一致。
- [ ] 指令：

```bash
cd apps/backend && go test ./internal/module/scout/repository -run RunPaging -count=1
```

驗收結果：Memory RunPaging 驗證 27 筆跨頁唯一、legacy synthetic run、未知時間置底與穩定 tie-breaker；Mongo 查詢含 posted/created/id 排序。

## Notes

Mongo 若需兩段排序，行為結果必須與 memory contract 一致。
