建議 model:opus/effort:medium — 要同時維持新舊兩條 route 都能用,且 state 的 key 格式要換。

本卡屬 FR-107(母卡 CM-1843)第 .3 棒(子需求卡 CM-1846),子任務 T-3.3:做出用新編號(run uid)讀寫分類結果的 API,並讓批次詳情帶上結果與「這份檔內容跟某個既有證據一樣」的提示。

這張卡做什麼(白話)

分類結果現在要用新的編號(run 的 uid)來存取,不再用 Google Drive 資料夾編號。這張卡做三件事:

🔴 舊的路徑要原樣保留(用 Drive 資料夾編號的那些),POC 上的舊資料還要打得開(D3)。

動哪些檔

套件(走 path dependency 開發)
~/Projects/Jedicogy/module/jedi-python-package/jedi-evidence-classification/
  .../api/routing.py
      :56 /classification-run/<run_folder_id>/state   ← 🔴 原樣保留,docstring 標 legacy
      :60 .../archive                                 ← 原樣保留
      :64 .../file/<file_drive_id>/preview            ← 原樣保留
      :70 :74 兩份報表                                ← 原樣保留 + 新增 run_uid 版
      ← 新增 /classification-run/<run_uid>/state(GET/PUT)
      ← 新增 /classification-run/<run_uid>/file/<file_uid>/preview
      ← 新增 /classification-run/<run_uid>/report/validation、.../adjudication
  .../app/service/evidence_classification_service.py
      :733 put_state(run_folder_id, ...)   ← 保留;新增以 run uid 定址的版本
  .../report/report_common.py
      :60 load_catalog   ← 改讀 run 的 catalog_snapshot;
                            🔴 沒有快照的舊列 fallback 舊 JSON(T-5.2 才刪 JSON)
  批次詳情(T-1.3 做的 GET /evidence-batches/<batch_uid>)
      ← 每檔加 same_content_evidences(走 ITaskEvidenceSink.find_same_content)

API 規格(design.md §6.6)

方法      路徑                                                     守門
GET/PUT   /evidence-batches 系列已在 T-1.3
GET/PUT   /classification-run/<run_uid>/state                       participant/manager
GET       /classification-run/<run_uid>/file/<file_uid>/preview     participant
GET       /classification-run/<run_uid>/report/validation           participant
GET       /classification-run/<run_uid>/report/adjudication         participant

state 的資料形狀(design.md §6.1.4)
  檔案 key:file_uid(原本是 Drive file id)
  AO key: part_id,形如 AC.L1-3.1.1_obj.2(原本是 AC.L1-3.1.1[a])
  每筆保留 ao_letter 欄位供前端顯示

批次詳情每檔多帶
  same_content_evidences: [{job_execution_id, evidence_uid, job_name}]   D9 提示,不阻擋

怎麼做(逐步)

驗收條件