I4 檢查結果:對外的 API 與插件裝配

I4 檢查結果:對外的 API 與插件裝配

檢查日期 2026-09-09|耗時 95 分鐘|對應卡片 CM-1616


§1

🔴 一句話結論

工具在這 20 個檔裡沒找到新問題,而且卡片點名要查的兩個重點它一個都沒回答——由首腦自己補查,兩個答案都是好消息。


§2

這一棒在檢查什麼

這個套件對外只開了一個 API:/issue/get_members(取得成員名單)。另外還有「插件裝配」的部分——套件怎麼被主專案掛載起來。

這一棒檢查這 20 個檔案,重點是這扇門有沒有守好。


§3

找到什麼

工具找到的三條全部不在這次的檢查範圍內(工具自己也講明了):

# 位置 狀態
1 infra/github.py:22 和 I1、I3 重複(同一個 verify=False,這是第三次被撈到)
2 github_issue_adapter.py:43 和 I1、I3 重複
3 jedi_issue/.env 和 I1、I3 重複(CM-1573 舊案)

工具在範圍內找到的新問題:0 個。

不過第 3 條多給了前面沒有的一項:歷史裡除了那個設定檔,還有兩處直接把密碼寫死在程式碼裡(member_adapter.py 和 github_adapter.py),都已經從最新版移除但留在歷史。已補進 CM-1607 的清理範圍。


§4

🔴 首腦補查:卡片點名要查的兩件事

開卡時把重點 ②寫成「本棒最重要的一條」,結果報告完全沒提到;重點 ①也沒答。首腦自己查了:

問題一:「缺少認證設定時會擋下來」這個說法是真的嗎?→ ✅ 是真的

套件的說明文件裡自己寫著:「缺少認證接線時要拒絕掛載,不是跳過——跳過的後果是成員名單變成公開的,任何人都拿得到全站使用者清單,而服務照常起得來、健康檢查照樣綠燈」。

這是套件自己的宣稱,要驗證。 打開 plugin.py 第 222-233 行:

missing = [name for name in ("auth_required",) if getattr(adapters, name, None) is None]
if missing:
    raise RuntimeError("jedi-issue:mount_api=True 但認證接線缺少 ...故拒絕掛載。")

確實會直接報錯停下來,不是默默掛上去。 同一支檔案第 137 行還寫著「認證設定刻意不給預設值——給預設值會讓『忘記傳』變成一個安靜的洞」。

結論:這個套件在這件事上做對了。

(後來 I5 那棒的檢查員在否決一條候選時,理由之一也是這個——兩邊獨立確認,對上了。)

問題二:那個 API 只要求「登入」,是漏掛權限檢查嗎?→ ❌ 不是漏掛,是從來沒設計過

首腦去查資料庫的權限清單,發現:根本沒有「取得成員名單」這個權限項目。清單裡跟 issue 有關的只有四項(issue-integrate-config 的讀寫增刪),那是**「整合設定頁」的權限,不是「取成員名單」的**。

這跟 FR-079 那次不一樣:那次是「權限項目有定義、有綁在頁面上、還寫進設計文件,卻沒有任何程式碼去檢查它」——那是明確的漏掛。這次是根本沒設計過這個權限。

要不要補是產品決策,不是程式錯誤。


§5

這份結果可信到什麼程度

「這三條是真的嗎」→ ✅ 可信(但都是舊的)

三條都是 3 票全過,12 票全數投出、零漏投。

「這 20 個檔乾不乾淨」→ ❌ 這一棒沒有給出答案

工具反覆撈同一個範圍外的舊問題,對範圍內零產出。 報告自己也承認「研究員沒有留下逐檔閱讀的紀錄」。

卡片點名要查的兩項,是首腦自己補做的(結論如上,都是好消息)。

所以正確的說法是:「這 20 個檔沒有被工具查出問題」,而不是「這 20 個檔沒問題」。


§6

執行概況(技術細節)

項目 數字
檢查範圍 20 個檔案
派出/回報的研究員 2 / 2
候選問題 → 去除重複 4 → 4
投票數 12
沒投到票的 0
範圍內新問題 0
首腦補查項目 2(都有結論)
耗時 95 分鐘