# T044 — Run 原子可見與 score 排序

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

## Goal

完成後，搜尋結果只有在整批成功時可見，失敗不留下可瀏覽半套資料，所有模式依 score 排序。

## Depends on

- T033、T043

## Inputs

- 讀取 / 依賴：
  - 檔案：`apps/backend/internal/module/scout/usecase/service.go`、repository contracts
  - 既有能力 / API：staged post、PublishRun、CleanupRun、run status
  - Spec 段落：§3、§4 流程 A/E、§7 原子可見性

## Outputs

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

| 路徑 | 動作 | 說明 |
|------|------|------|
| `apps/backend/internal/module/scout/usecase/run_publish.go` | add | 保存 staging、計數、guarded publish 與 failure cleanup。 |
| `apps/backend/internal/module/scout/usecase/service.go` | edit | 移除 activity momentum 最終排序，交由 run results query。 |
| `apps/backend/internal/module/scout/usecase/run_publish_test.go` | add | 驗證成功可見、失敗不可見、retry 不重複。 |

### 行為變更

- completed membership 固定；posted_at 未知不以 created_at 冒充，score 主排序、status 不重排。

### API / 契約（若有）

- failed run 可保留 diagnostics，但公開 posts page 為不可用而非半套 list。

## Out of scope

- 不改 Mongo transaction topology，不處理 job lifecycle。

## Acceptance

- [x] 任一步保存失敗時 run 不成功、結果不公開；retry 不產生 duplicate。
- [x] 指令：

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

驗收結果：StageRunPosts／PublishRun／FailRun 以 run status 作 visibility barrier，成功後才 guarded succeeded、失敗結果頁保持空；結果回傳改為 score、posted_at、created_at、id 穩定排序。

## Notes

可用 run status 作 visibility barrier，不要求部署環境一定支援多文件 transaction。
