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

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

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

---

## 🔴 一句話結論

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

---

## 這一棒在檢查什麼

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

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

---

## 找到什麼

工具找到的三條**全部不在這次的檢查範圍內**（工具自己也講明了）：

| # | 位置 | 狀態 |
|---|---|---|
| 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 的清理範圍。**

---

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

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

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

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

**這是套件自己的宣稱，要驗證。** 打開 `plugin.py` 第 222-233 行：

```python
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 那次不一樣**：那次是「權限項目有定義、有綁在頁面上、還寫進設計文件，卻沒有任何程式碼去檢查它」——那是明確的漏掛。**這次是根本沒設計過這個權限。**

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

---

## 這份結果可信到什麼程度

### 「這三條是真的嗎」→ ✅ 可信（但都是舊的）

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

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

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

**卡片點名要查的兩項，是首腦自己補做的**（結論如上，都是好消息）。

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

---

## 執行概況（技術細節）

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