# FR-047 已知坑 ⑦DEAD 桶 — 收尾 SUMMARY

> **日期**：2026-07-07　**branch**：`fix/v1.8.0-bugs`（未 push，等 user 明示）
> **範圍**：FR-047 已知坑 DEAD 桶（死碼/預留/vestigial）逐條銷帳 + 尾巴 v1 module_frame template copy 整條鏈退役
> **追蹤表**：[`docs/analysis/2026-07-07-known-pits-remediation-tracker.md`](../../../analysis/2026-07-07-known-pits-remediation-tracker.md) §DEAD 桶（逐條銷帳表為 living truth，本檔為 arc 收口彙整）

---

## 1. 一句話

DEAD 桶 30 條逐條 grep/DB 驗證後分 5 族處理——只刪「確定安全」的死碼，其餘（死欄/表待拍板、誤歸 bug 改桶、寫了沒接回報）不動；尾巴把一條 live-wired 卻零呼叫、JOIN 已 drop v1 表的 module_frame template copy 鏈**整條退役**。

## 2. Commits 清單

### BE（`compliance-manager-be`）
| hash | 類型 | 內容 |
|------|------|------|
| `d4b6ee6e` | chore | 刪 feedback 模組確認死碼（`FeedbackRequest`/`FeedbackFileRequest` schema + `ALLOWED_EXTENSIONS` 常數）|
| `7c058565` | docs | 追蹤表 ⑦DEAD 桶逐條銷帳（5 族分類表）|
| `2d085edf` | **refactor** | **退役 v1 module_frame template copy 整條鏈（23 檔，-1312 行）** |
| `d573c2d4` | docs | 追蹤表 `_overview#3` 標「已退役」附 commit |
| `ae169a99` | docs | 追蹤表補三環境 DB 實查結論（無需 DROP migration）|

### FE（`compliance-manager-fe`）
| hash | 類型 | 內容 |
|------|------|------|
| `7afeb49` | chore | 刪確認死碼 service/表單元件 4 支 + 註解掉的死 route |

> 註：同期 branch 上另有 `76c9b677`/`c797b1d6`/`58dbfddd`/`3b8dad05`/`999d548a` 等 FR-047 其他桶 / _overview#3 調查 commit，屬平行 session，不在本 arc 收口範圍。

## 3. 改動範圍 + 行為差異

### 3a. DEAD A 族 — 確認死碼刪除（跨 BE+FE）
| 坑 id | 刪除物件 | 行為差異 |
|-------|---------|---------|
| user-form#1 | FE `UserForm.vue`（463 行）+ 註解 route | 無（生效版 `UserMTRBACForm.vue`，死碼零引用）|
| user-log#7 / bulletin-manage#5 / feedback-management#6(FE) | FE `UserLogService.js` / `BulletinService.js` / `FeedbackService.js`（讀 `/demo/data/*.json`）| 無（零 import 的假資料 service）|
| feedback-management#6(BE) | `FeedbackRequest` schema / `feedback_file.py` / `ALLOWED_EXTENSIONS` 常數 | 無（route 手解 `request.files['json']`，schema/常數零引用）|

### 3b. DEAD 尾巴 — v1 copy 鏈退役（commit `2d085edf`）
**背景**：`oscal.profile_controls` / `oscal.catalog_control_assessments` 兩張 v1 表 FR-038 v2 後已從 DB drop，但主專案殘留一條 **live-wired（DI 有註冊）卻零呼叫**的 v1 copy 鏈 JOIN 它們。FR-038 Wave 2B 後專案啟動改走 `project_start_app_service.deep_clone_ssp`，這條鏈被整條繞過 = 孤兒 + 上膛腳槍（誰重新接 `copy()` 就 `UndefinedTable` 500）。

**退役內容**：
- **copy 鏈本體**：`module_frame_template_copy_service.py` + `infra/module_frame/clone/`（cloner_impl + `__init__`，整目錄）+ `domain/module_frame/gateway/`（interface + `__init__`，整目錄）
- **PAW 鏈**：`infra/associations/{model,mapper,repository}/profile_assessment_workflow*` + `domain/associations/{entity(×2),repository,service}/profile_assessment_workflow*`；6 個 `associations/__init__` 清 PAW export（保留其餘 sibling）
- **DI 解線**：`di_containers/module_frame/module_frame_containers.py` 移除 4 imports + repo/domain_service/cloner/copy_service provider + `ModuleFrameService` 注入參數
- **`ModuleFrameService` 死碼**：PAW imports/建構參數/self 屬性（全檔零讀取）+ `create_assessments_workflow_template` 整支（零 caller，已被 v2 `_init_ao_workflows` 取代）+ 連帶死掉的 `ActionType` import
- **tests**：刪 `test_module_frame_template_copy_service{,_phase2}.py`；`test_ssp_versioning_service.py` 僅改指向已不存在檔案的 docstring 參照

**行為差異**：無。全鏈零 production caller，退役不影響任何 live 路徑（專案啟動、資源庫 CRUD 皆走 v2）。

## 4. 驗證紀錄

- **grep 全 repo**：退役符號主專案 `.py` 歸零；殘留只剩 v2 tree dict-key `profile_controls`（非表）+ serializer field + 2 處說明註解
- **import sanity**（`.venv`）：associations / module_frame_service / DI 依賴鏈 import 無斷裂
- **pytest baseline diff**（`git stash` 對照）：HEAD `59 failed / 191 passed / 25 errors` → 本次 `49 failed / 189 passed / 25 errors`。**失敗↓10**（＝被刪的 copy_service 測試，baseline 即因 JOIN 死表而 fail）、**errors 25 不變且皆 pre-existing**（`ai_dashboard.service.*` / `module_frame_*_default_entity` 等既有 stale 測試，與退役符號無關）、**零新增失敗**
- **DB 實查三環境**：`profile_controls` / `catalog_control_assessments` / FK-holder `profile_assessment_workflow_mapping` 三表在 **DEV / STG / POC 全部 already dropped**，v1-family pattern 掃殘留＝none → **無需補 DROP migration，DB 端已乾淨**

## 5. 規範文件清單（已更新）

- ✅ `docs/analysis/2026-07-07-known-pits-remediation-tracker.md`：§DEAD 桶 5 族逐條銷帳表 + `_overview#3` 標「已退役」+ 三環境 DB 實查結論
- ✅ `docs/claude/database-schema.md`：`catalog_control_assessments` / `profile_controls` / `profile_assessment_workflow_mapping` 三列標「v1 已退役」（drift 修正）
- ✅ 本 SUMMARY

## 6. 未做 / Follow-up

- **DEAD 桶其餘族（回報，未動）**：
  - **B 族死欄**：`users.topt_secret`（37 users 全 0 資料、零引用）＝乾淨 drop 候選，待補 STG/POC 多環境確認 + user 拍板才 DROP
  - **改判 jedi 套件**：`SURVEY_409003`（jedi-survey，零 raise site）需 user 拍板 + 發版才刪
  - **C 族誤歸 bug**（已改桶，非本桶修）：`project-dashboard#1`→BUG、`role-manage#3`→BUG+ECODE、`feedback-management#1`→BUG(TypeError)、`issue-integrate-config#1`→REPLACE
  - **E 族寫了沒接**（回報，刪＝永久失去）：`user-log#6` `maintain_log_partitions()` 無排程；`feedback verify_feedback_issue_is_exist` 守門未接（update/delete 缺 None 檢查會 500）→ 正解是**接上**非刪
- **實體 DROP migration**：三環境表皆已無 → 不需要
- **`docs/features/FR-047-.../known-pits-remediation-tracker.md`**（untracked 副本）與 `docs/analysis/` 版本並存，可擇一收斂（非本 arc 阻塞）

## 7. 部署 handover

- **BE 需重啟**（無 hot reload，DI 容器有變更）。重啟後手測：
  1. **資源庫清單 / 詳情**能開（module_frame 模組 DI 正常 resolve）
  2. **建一個測試專案**跑通（專案啟動走 `deep_clone_ssp`，不碰退役的 copy 鏈）
- **FE**：刪的是零引用死碼，不影響 build
- **push**：BE + FE 各自 branch 領先 origin，等 user 明示才 push
