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 答辯材料
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 pullpoetry 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