本卡屬 FR-101(母卡見建卡後補號),第 3 棒:FR-081 之後內容有改動的 25 支既有檔——GitLab/GitHub issue adapter、三種附件實作、成員 adapter、issue/attachment/member 三支 app service、兩個 entity。只掃不修。
回饋轉成 GitLab/GitHub 問題單、附件跟著送過去、從第三方拿成員名單——這批程式 FR-081 掃過,之後改了約 120 行邏輯(其餘是搬 import 與 dataclass 化)。這棒有兩個目的:①回歸確認——FR-081 I1/I3/I5 的結論在新版還成不成立、有沒有修了什麼或弄壞什麼;②方法驗證——第一次對同一批檔重掃,看工具會不會給出一致結論。
57 支完全沒動的檔不重掃、沿用 FR-081;這 25 支動過,其中 GitHub 附件那支刪 34 行改 15 行,是唯一實質行為變更。分開一棒是為了讓「重掃結論是否一致」這個問題有乾淨的對照組。
infra/issue_upload_files/github/github_issue_attachment.py,diff 最大)。舊:拋 NotImplementedError→上游 except Exception 吞掉→整張 issue 沒建;新:issue 照建、附件跳過、逐檔 WARNING。要驗:跳過時使用者端知不知道(回應有沒有告知附件沒送出);WARNING 印的是檔名還是含內容;「靜默降級但有 log」與「明確拒絕」哪個才對——這是產品決策題,標明。verify=False 兩處仍在(infra/github.py:22、infra/issue/adapter/github/github_issue_adapter.py:40)。標「重複 CM-1632,位置行號更新」;另查 GitLab 側(infra/gitlab.py、gitlab_issue_adapter.py)有沒有同款 ssl_verify=False。feedback_service.py 六處 except Exception: logger.warning)。本棒看被吞的那一側:GitLab/GitHub adapter 拋的例外裡帶不帶 token/URL/回應原文,被 f"{e}" 格式化進 log 時會外洩什麼。infra/issue_upload_files/local/local_issue_attachment.py、issue_attachment.py、gitlab/gitlab_issue_attachment.py)。CM-1633「刪除檢查半套」在哪一支、修了沒;本地存檔路徑怎麼組(檔名可控→路徑穿越);GitLab projects.upload() 回的連結會不會原樣進 issue 內文。infra/member/repository/member_repostiory.py 查無回 None;infra/project_member/adapter/github|gitlab/member_adapter.py)。查無回 None 後呼叫端有沒有處理;GitHub/GitLab 成員清單拿回來後存哪、有沒有租戶欄(members 零隔離,第 7 項)。domain/member/entities/member_entity.py +22/-7、domain/issue_upload_file/entities/issue_upload_file_entity.py)。欄位預設值有沒有從「必填」變「選填 None」而讓上游的存在檢查失效(FR-095 P1 §3.2 第 17 項同型:查無回固定空值讓權限測試假通過)。verify=False 兩處/CM-1633 附件刪除檢查半套/CM-1634 Nexus 明文。撞到標「重複 CM-16xx,位置更新」不另計——CM-1630 與 CM-1632 首腦已開檔確認搬家沒修(新位置見各棒重點)。issues、labels、issue_*_mapping 皆 RLS 關、0 規則;只有新的 feedback_issues 開 RLS、4 規則、不強制)。撞到標「第 7 項」。RootIntegrateConfigProvider 從 ROOT 租戶讀設定;不要被任何「沒在用」的殘留註解說服。第一步:驗 scope 檔數,對上 25 才啟動(這棒是明確檔案清單,不是目錄):