# ADR-0008：播放產物長期保留在物件儲存

已採用

## 狀態

已採用。取代 [ADR-0003](/huan/dev/adr/0003-temporary-object-storage) 中「播放產物在所有裝置 ACK 後回收」的那一段；ADR-0003 關於原始檔的部分仍然有效。

## 背景

ADR-0003 把 RustFS 定位成暫存與派送用的空間：原始檔轉完就刪，`distribution/` 的播放產物在所有目標裝置 ACK 且過了保留期（`DISTRIBUTION_RETENTION_HOURS`，預設 24 小時）之後回收，正式副本留在裝置本機。

那份 ADR 自己也寫著：「永久保留播放產物……這是最值得未來重新評估的選項」。實際使用之後，重新評估的時機到了。

## 決策

`thumbnail/`、`preview/` 與 `distribution/` 都**長期保留**，不再回收。

- 刪除 `cleanup_distribution` 工作與 `DISTRIBUTION_RETENTION_HOURS` 設定。
- `media_variants.distribution_settled_at` 保留，但只作為派送進度的紀錄，不再觸發刪除。
- 原始檔仍然在轉檔成功後刪除，這一點沒有改變。
- `NEEDS_REUPLOAD` 留在狀態機裡，因為既有資料還有這個狀態；新素材不會再產生它。

## 理由

**挑素材要看得到畫面。** 後台的素材選擇器改成帶預覽的清單之後，`preview` 從「排版時的輔助」變成挑素材的主要依據。而預覽與播放產物是同一批工作的產出，只保留其中一種，兩種資料的可用性就會互相矛盾。

**「之後會不會多一台裝置」沒有人答得出來。** 新門市、換過的機器、清掉本機儲存的裝置，都需要同一份 playback。回收機制實際上是在賭「不會再有新的讀者」，而這個賭注輸掉的代價是使用者必須重新上傳一個他以為還在的檔案。

**省下的空間比想像中少。** 被回收的是 1080p、30fps、CRF 21 的成品，是幾百 MB 等級；真正大的是原始母帶，而那一份本來就已經刪掉了。

## 後果

物件儲存的用量會隨著素材庫線性成長。這是接受的代價：架設者可以看得到用量並自行決定要不要刪素材，而刪除本來就有「正在被使用」的檢查擋著，不會誤刪還在播的東西。

`NEEDS_REUPLOAD` 變成只會出現在舊資料上的狀態。UI 與文件都照實說明它的來歷，不會假裝那些檔案還在。

## 替代方案

**把保留期調到很大（例如 720 小時）**：效果接近，但它把一個產品決定留在環境變數裡，每個架設者都要自己想一次，而且想錯的人要到「新增裝置那天」才會發現。

**只保留 preview、繼續回收 playback**：預覽看得到、但選了之後派不出去，這比兩者都沒有更難解釋。
