# 2026-07-25 Sonar 存量清理 arc 收官 + v1.10.1 進版 — SUMMARY

| 項目 | 內容 |
|------|------|
| Arc | Sonar 存量 code smell 清理(2026-07-25 開局同日收官)+ 資安 arc 尾巴(semgrep 預演)+ 覆核輪 Drive bug |
| 版本 | **v1.10.1**(BUG 版號),BE `d0fbdba4` / FE `814b0a3`,tag 已打已推 |
| 成果 | 兩 repo Sonar open **1,440 → 0**、Quality Gate 雙 PASSED、semgrep security-audit 歸零 |
| Notion | CM-895 ~ CM-905 共 11 案,全 Done(2026-07-25) |
| 協作模式 | 主 session(任務分析首腦,triage/開 case/驗收)+ user 外部 loop runner(執行)+ subagent(查證/掃描類) |

## 1. 最終帳面(issue 條數,per 2026-07-25「以 issue 為主」紀律)

| 處置 | BE | FE | 追溯 |
|------|-----|-----|------|
| 真修 | ~200 條 | ~196 條 | git log `chore(sonar)`/`fix(sonar)`/`fix(security)` 系列,BE 16 + FE 11 commits |
| accept | 465 | 160 | 逐條附裁決 comment;HIGH 大宗為 S3776 ×240(認知複雜度不重構裁決)、BLOCKER 8 條逐條查證(FR-038 stub ×7 + CSRF 不適用 ×2 有分析文件背書) |
| false positive | 34 | 48 | S6019 regex 誤判(實測)、S125 中文註解誤判、css 對比度 48 條(`docs/analysis/2026-07-25-sonar-css-contrast-false-positive.md`) |

## 2. Case 清單與真 bug 收穫

| Case | 內容 | 真 bug 收穫 |
|------|------|------------|
| CM-895~898 | 外部 runner:FE a11y / 註解碼 / BE logging 桶 / FE 語法樣式桶 | — |
| CM-899 | BE 語意桶(S8786/S5754/S5886),29 真修 + 41 accept | 裸 except 誤吞系統訊號 ×11 |
| CM-900 | SECURITY impact 7 條:pytz→zoneinfo ×2 真修 + S1313 ×5 accept | 順手修掉 1937~1979 日光節約轉換日未攔例外(舊 except 攔不到 pytz 例外) |
| CM-901 | BE Overall 收尾:Reliability 13 全修 + 機械桶 63 | `utcnow()` naive/aware 逐條查下游(review_marks 欄位不帶時區、`isoformat()+"Z"` 雙時區標記雷);Drive `get_file_metadata` 介面違反 |
| CM-902 | FE Overall 收尾 ~190 條 | — |
| CM-903 | semgrep security-audit 預演 3 條:docker 參數白名單真修 + XXE/|safe 誤報標記 + triage 答辯材料 | docker flag 注入面(`-` 開頭參數) |
| CM-904 | 最終收官:一行級 39 真修 + 111 標記;**runner 實測後拒改 12 條**(structuredClone 對 Vue reactive 拋錯等) | defineEmits 漏宣告 ×2、`sub_workflows_count` tuple 未爆彈 |
| CM-905 | 覆核輪 Drive 資料夾缺失(雷門實測回報) | **功能 bug**:發起覆核不建 Drive 資料夾→第二輪分類 404;route 層接線補跑 init(避開 grc↔cloud_integration 循環依賴),歷史專案已補 |

## 3. 行為差異(對 user 可見的)

- 覆核輪(第二輪起)證據 AI 分類不再 404;新發起的覆核自動建 Drive 資料夾
- AI 助理對話框關閉鈕、批次上傳使用者後清單刷新:從「靠 fallthrough 僥倖」轉正
- 證據分類 API 傳非法 folder ID(如 `--privileged`)會被擋(安全硬化)
- 其餘 ~390 條修改全部行為等價(每批驗證:import 不炸 + login 煙霧 + BE 全測試 before/after 失敗清單相同)

## 4. 規範文件

- Release note:`docs/release_notes/v1.10.1.md`(+ spec 站鏡射 + `_overview.md` 列表)
- Spec 快照:`docs/specs/v1.10.1/`(current 複製,HTML 重 build 零 nav 警告)
- Checkmarx 答辯:`docs/features/security-scan-2607/2026-07-25-semgrep-security-audit-preview-triage.md`
- 掃描 JSON 佐證:`docs/security-reports/2026-07-25/`(本機留存)
- 頁面 spec:本 arc 無頁面行為變更(CM-905 屬 bug 修復回歸既定行為),不觸發 spec 更新

## 5. 已知 follow-up

1. **FE semgrep 覆蓋缺口**:security-audit 掃 FE 只吃到 40 條規則(BE 1,144),JS/TS 導向 ruleset 補掃待開案(CM-903 runner 發現)
2. **CI/CD 掃描接入**:Quality Gate 已就緒,等環境(既有 case CM-CI 那條)
3. 已 accept 623 條 = 有意識風險接受,對應模組重構時可順修
4. Semgrep Pro engine 限制:Community 版無跨檔 taint 分析,Checkmarx 可能報本次掃不到的路徑(答辯材料已載明)

## 6. 部署 handover(v1.10.1)

1. BE:`git pull` → `poetry update`(weasyprint 69.0 / Flask-Cors 6.0.0 / jedi-* 升版)→ 重啟
2. FE:同版 build 部署
3. 主機:`fc-match 'Noto Sans CJK TC'` 回 NotoSansCJK + `which libreoffice`(見 `docs/claude/host-dependencies.md`)
4. classify image 如未含新依賴需 rebuild
5. 無 DB migration、無 breaking

## 7. 本 arc 方法論教訓(已入 memory)

- **`feedback_sonar_issue_centric_workflow`**(新增):Sonar 工作以 issue 清單為主體(規則×條數前後對照),不繞評級/維度敘事;真修與 accept 分開報;主 session 角色=逐條 triage「能不能修/需不需要修」三分法
- **`reference_security_scan_tooling`**(更新):semgrep 一律加掃 `p/security-audit` ruleset(Checkmarx 預演常規化),指令與已知限制已載明
- Runner「實測後拒改」紀律再次證明價值:CM-904 拒改 12 條全部有實測依據(structuredClone/頭像 hash/FR-038 stub),照單全收會出貨真 bug
