# FR-058.6 T-6.3 收線 session — 階段一檢查未通過，停在 gate

- **時間**：2026-07-31 23:08 ~ 23:15
- **角色**：T-6.3 收線 session（先檢查 A/B，通過才執行 C）
- **結論**：**未通過，未進入階段二。已停下，不做任何修改、部署或驗收。**

---

## 一句話

**T-6.2（CM-1000）還在別的 session 手上進行中，尚未完成。** 檢查期間 agent 的
`sonarqube.py` 在我眼前從 799 行長到 924 行，且目前狀態**無法執行**——`run()` 呼叫的
`self._run_scan()` 這支 method 還沒被寫出來。參數 key 契約本身沒有問題。

---

## 三項檢查結果

| # | 檢查項 | 結果 |
|---|--------|------|
| ① | 兩張卡都完成 | ❌ **CM-999 完成；CM-1000 狀態仍是 `Not started`，無「已完成修正」段** |
| ② | 參數 key 對得上 | ✅ **對得上**（詳下，這項是唯一全過的） |
| ③ | 兩 repo 狀態正常 | ❌ **agent repo working tree 有未 commit 改動，且程式碼不完整** |

---

## ① 兩張卡狀態

- **CM-999（T-6.1，BE）** — ✅ 狀態「修正待驗證」，有完整「已完成修正」段、key 清單、
  驗收對照表、執行紀錄。commit `e020a3b9`，migration
  `scripts/sql/2026-07-31-fr058-19-sonarqube-scan-mode.sql` 只套 DEV。
- **CM-1000（T-6.2，agent）** — ❌ 狀態 **`Not started`**，正文只有派工內容，沒有回報段。

---

## ② 參數 key 契約 —— 唯一全過的一項（實查，非採信卡片自報）

**DB 實查**（DEV `guidant_ai_dev`，`config.detection_tool_param_schemas`）：

```
version | is_current | fields
--------+------------+---------------------------------------------------------------
      1 | f          | （v1 保留未刪未改，2 欄）
      2 | t          | scan_mode[永遠顯示] / repo_url[scan] / project_key_suffix[scan]
                     | / project_key[pull] / branch[pull]
```

- `scan_mode`：select，required，**default `scan`**，兩選項 `scan` / `pull` ✅（符合 D24）
- `repo_url`、`project_key_suffix`：condition 綁 `scan`，required ✅
- `project_key`、`branch`：condition 綁 `pull`，key 與 label 逐字未動 ✅（D-既有 pull 不受影響）

**agent 實查**（`core/task_executor_connectors/sonarqube.py`，未 commit 的工作副本）：

| 讀取處 | 行號 | key |
|--------|------|-----|
| `_resolve_scan_mode` | 335 | `params.get("scan_mode")`，預設 `scan`，非法值 **raise 不靜默降級** ✅ |
| `_resolve_repo_url` | 356 | `params.get("repo_url")` ✅ |
| `_resolve_scan_project_key` | 373 | `params.get("project_key_suffix")`，組 `Guidant-AI-<suffix>` ✅ |
| `_resolve_project_key` | 345 | `params.get("project_key")`（pull）✅ |
| `_resolve_branch` | 393 | `params.get("branch")`（pull）✅ |

**五個 key 兩邊逐字一致，前綴由 connector 組上（D21），無落差。**
額外加值：suffix 有做重複前綴去疊（避免 `Guidant-AI-Guidant-AI-x`）與字元白名單，
`repo_url` 擋掉 `file://`（避免把容器內任意目錄當源碼掃）——都是合理加固，非落差。

> 因為 key 對得上，**沒有任何契約需要決策者裁定**。這項不是卡點。

---

## ③ repo 狀態 —— 真正的卡點

### BE（`compliance-manager-be`）✅

branch `feature/FR-058`，commit `e020a3b9` 在頂。working tree 只有一批與本案無關的
untracked docs（依指示未動、未 commit、未清理）。

### evidence-agent ❌ 進行中

```
branch: feature/FR-058
 M Dockerfile
 M core/task_executor_connectors/sonarqube.py
最新 commit: 2aa95ec chore: bump 0.2.21——FR-058.5 SonarQube connector 出貨版
```

**T-6.2 沒有任何 commit**，兩檔都還在 working tree。

**觀察到檔案正在被寫入**（同一份檔案，兩次 grep 之間變了）：

| 時間 | `sonarqube.py` |
|------|----------------|
| 23:09 左右（第一次 grep） | 799 行，**完全沒有** `_resolve_scan_mode` / `repo_url` / `project_key_suffix` |
| 23:13:25（mtime） | 924 行，上述 method 都在了 |
| 23:13:33 ~ 23:14:51（連續取樣 3 次 + 追查） | mtime 停在 23:13:25 未再變動 |

→ **另一個 session 正在這個 repo 上作業。**

### 目前程式碼無法執行（AST 靜態檢查）

```
SonarQubeConnector -> 呼叫但未定義: ['_run_scan']
```

- `run()`（:457）已寫好分流：`mode == "scan"` → `return self._run_scan()`（:464）
- `_run_pull()`（:469）完整，pull 路徑一行未動 ✅
- **`_run_scan()` 尚未定義** → 任何 scan 模式任務會直接 `AttributeError`

scan 四步驟的**常數已備好但實作未落地**：`_CE_PENDING_STATUSES`（:144）、
`_PROJECT_KEY_PREFIX`（:114）、`_ALLOWED_GIT_SCHEMES`（:154）都在，
但 **git clone / sonar-scanner 子行程 / `report-task.txt` 解析 / `api/ce/task` 輪詢 /
tmp 清理** 這五段程式碼一段都還沒有（grep `report-task` / `ceTaskId` / `api/ce/task`
只命中檔頭 docstring，命不中任何實作）。

`Dockerfile` 那一半看起來是完整的（sonar-scanner CLI 7.3.0.5189 linux-x64 平台專屬 zip
＋ `unzip`，註解紀律有跟上），但**未 build 驗證**。

`test/test_sonarqube_connector.py` mtime 20:16，**602 行未動** → T-6.2 要求的兩條
必測（非法 `scan_mode` raise、失敗路徑 tmp 已清）尚未加。

---

## 為什麼停在這裡（不是保守，是真的做不下去）

T-6.3 的核心是「兩模式端到端驗收」。目前：

1. **scan 模式跑不起來** —— `_run_scan` 不存在，任務一發就 `AttributeError`
2. **不能重建 image** —— 拿一份寫到一半的 working tree build 出 0.2.22 推上 DEV 123，
   等於把半成品當版本；且原作者還在寫，我一 build 就與他的進度脫節
3. **不能碰那兩個檔** —— 別的 session 正在編輯，我一動就是覆寫衝突

pull 模式的 UI 驗收理論上可先做（`_run_pull` 完整、schema 已就位），但那需要重啟 BE +
重建部署 agent，而 agent 重建正是被 ①②③ 擋住的動作，所以**整段一起停**。

---

## 現況快照（給接手者省一輪查詢）

| 項目 | 狀態 |
|------|------|
| DEV DB param_schema | ✅ v2 `is_current=t`（5 欄），v1 保留 `is_current=f` |
| DEV agent 心跳 | `4b9cd3bd2538` / **0.2.21** / active（尚未 bump 0.2.22） |
| BE 進程 | pid 35859 `main_app.py` 執行中，port 8000 有回應（`/` 404 屬正常，無 root route）。**未重啟** |
| FE dev server | http://localhost:5180 **有回應（200）**，branch `feature/FR-058`，working tree 乾淨 |
| STG 122 / POC 121 | **完全未碰**（DB、部署都沒動）✅ |

---

## 本 session 做了什麼 / 沒做什麼

**做了**：fetch 兩張 Notion 卡、DB 實查 param_schema、agent 原始碼實查、AST 靜態檢查、
repo 狀態確認、環境探測（唯讀）、寫這份紀錄。

**沒做**（依指示停下）：未改任何一行 code、未 commit、未 build、未部署、未重啟 BE、
未動 FE、未跑任何驗收、未回寫 CM-1001、未動 STG/POC。

---

## 建議決策者早上處理

1. **確認 T-6.2 那個 session 的下落** —— 是還在跑、還是中途斷了？
   斷在 `_run_scan` 未寫、測試未加、未 commit 的狀態。
2. **T-6.2 收完（`_run_scan` 實作 + 兩條必測 + 全套回歸 + commit）後，T-6.3 才有得跑。**
   我這一棒的三段工作（環境就位 / FE 微調 / 兩模式端到端）本身沒有阻礙，
   純粹卡在上游未完成。
3. 參數 key 契約**不需裁定**，兩邊已一致。
