# FR-035 SSP Table Rename — 收尾 SUMMARY

> 日期：2026-06-10 ｜ Branch：`feature/ssp-table-rename`（BE + jedi-oscal monorepo 同名）
> 狀態：DEV 完成並驗證；STG/POC/PROD 待套用；兩 repo 待 push

## 一句話

把冗長的 `system_security_plans*` 三張 OSCAL 表改名為 `ssp(s)_*`（表名 only、欄位不動），跨 BE + jedi-oscal 套件 + DB，用 in-place `ALTER RENAME`，DEV 零丟失零回歸。

## Commits

| Repo | Commit | 內容 |
|------|--------|------|
| jedi-oscal monorepo | `278bfbb` | ORM 改名（8 檔：tablename + index + FK 字串） |
| jedi-oscal monorepo | `bb192e9` | bump 0.0.21 → 0.0.22 |
| BE | `3ca0ad9d` | BE FK 字串 + 6 條 raw SQL + 測試斷言 + 可攜 migration |
| BE | `dddc6335` | FR-035 feature 文件（design + plan + 登記表） |
| BE | `7b44e8d2` | pin jedi-oscal 0.0.22 |
| BE | （收尾本批） | changelog + 文件清理 + 本 SUMMARY |

jedi-oscal **0.0.22 已推 Nexus**（pypi-hosted）。

## 改動範圍

- **表名**：`system_security_plans→ssps`、`system_security_plan_control_implementations→ssp_control_implementations`、`system_security_plans_system_characteristics→ssp_system_characteristics`。
- **欄位完全不動**（`system_security_plan_id` / `ssp_id` 等保留）。
- migration `scripts/sql/2026-06-10-ssp-table-rename.sql`：3 表 + 3 sequence + 3 pkey + 3 uid_key + 6 index + 5 條舊名 FK constraint，全 `ALTER RENAME`。

## 行為差異

- 對外 API / FE 行為**無差異**（FE 用 API field，不碰 DB 表名；envelope shape 不變）。
- 純內部 schema 命名整理。

## 驗證結果（DEV）

- migration：BEGIN/ROLLBACK 乾跑零錯 → 真實套用，9 FK 全 valid，資料保留 219/2375/200。
- BE boot：無 `NoReferencedTableError`。
- live API e2e：`GET /ssp/<uid>/control-implementations` 回真實控制項，log 零 SQL 錯誤。
- pytest baseline diff：零新回歸。
- Nexus 0.0.22 artifact：拆 symlink 後實體裝出驗證 tablename = 新名、源碼零舊名。

## 規範文件齊全度

- ✓ changelog `docs/changelog/2026-06-10-tweak-ssp-table-rename.md`
- ✓ FR design + implementation-plan + README 登記
- ✓ 本 SUMMARY
- ✓ 橫向文件：`docs/claude/database-schema.md` + 2 doc-gen 腳本 + 5 BE prose 註解已清
- ✓ memory feedback（symlink-pin 驗證 + table rename lockstep）
- ☐ Notion 任務（收尾本批）

## 部署 handover（未做，user-gated）

1. **STG → POC → PROD 逐一套 migration**：每環境 lockstep（先對該環境 catalog 重驗 constraint 名 → 套 `2026-06-10-ssp-table-rename.sql` → 部署 BE pin 0.0.22）。⚠️ 順序不可顛倒：舊 BE 對改名表會炸。
2. **push 兩 repo**：BE + jedi-oscal monorepo（jedi-oscal gitlab push 需 user 憑證）。
3. **重跑 ERD tbls + gen_erd** 更新 `docs/system-design/database/erd/tbls/oscal.system_security_plans*.md`（生成物）。

## 已知 follow-up

- ERD tbls 生成檔仍是舊表名（重跑工具即更新，不手改）。
- （既有、非本 arc）`docs/system-design/scripts/generate_db_schema_docx.py:34` hardcoded DB 密碼，待 user 決定改讀 env。
- 既有 4 個 pytest fail（`template_module_frame_id` raw-UPDATE 斷言 vs ORM 寫入不符 + integration 3 個）與本次無關，留既有 follow-up。
