docs(adr): ADR-018 §8 addendum — C5 實作偏差回填(路由段維持 UUID)

- §5.5 加補註指向、原文一字未動(ADR 不可變原則)
- §8.1 記錄 C5 偏差證據鏈(fetchDevice 純 DB / API 無 GetBySerial /
  帶 serial deep-link 必 404)與最終實作(路由段 UUID、serial 頁內派生、
  入口 disable 全落實);決策本體 FE-A 與 C1–C4/C6–C8 不變
- 裁定來源:wp-c-frontend-serial-routing-review.md(reviewer 獨立驗證)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
jim800121chen 2026-07-11 08:39:32 +08:00
parent 12f5bf6c47
commit 72544d00ba

View File

@ -150,6 +150,8 @@ session_tokens物理 schema 不動)
### 5.5 前端 WP-C 逐檔FE-A 混合) ### 5.5 前端 WP-C 逐檔FE-A 混合)
C1 `device-store.ts``serialNumber` type + normalizeC2 `workspace-client.tsx` camera/media/inference 識別改 serial + disableC3 `use-inference-stream.ts` 註解C4 `lib/media.ts` 註解C5 `workspace/[deviceId]` 連結改帶 serialC6 `device-card.tsx` 工作區按鈕加 `hasSerial`C7 `device-detail-client.tsx` 工作區用 serial詳情頁本身 fetchDevice 維持 UUIDC8 flashF8 接時用 serial。**不改(保持 UUID**fetchDevices/fetchDevice/unpair/connect/disconnect、詳情頁路由 `/devices/[id]` C1 `device-store.ts``serialNumber` type + normalizeC2 `workspace-client.tsx` camera/media/inference 識別改 serial + disableC3 `use-inference-stream.ts` 註解C4 `lib/media.ts` 註解C5 `workspace/[deviceId]` 連結改帶 serialC6 `device-card.tsx` 工作區按鈕加 `hasSerial`C7 `device-detail-client.tsx` 工作區用 serial詳情頁本身 fetchDevice 維持 UUIDC8 flashF8 接時用 serial。**不改(保持 UUID**fetchDevices/fetchDevice/unpair/connect/disconnect、詳情頁路由 `/devices/[id]`
> ⚠️ 補註2026-07-11上列 C5「連結改帶 serial」一句於 WP-C 實作時證實與 §2.2 FE-A 自相矛盾,實作偏差已裁定接受——路由段維持 UUID、serial 頁內派生。詳見 §8 補註(本段原文依 ADR 不可變原則保留、不改寫)。
--- ---
## 6. 合規性 ## 6. 合規性
@ -165,3 +167,31 @@ C1 `device-store.ts` 加 `serialNumber` type + normalizeC2 `workspace-client.
## 7. 一句話總結 ## 7. 一句話總結
讀 code 後推翻「`session_tokens.device_id` 單一 FK 是硬傷」的假設——推論路由根本不靠它,真正缺口是「雲端 device.id ↔ local agent 本地 id」從不對齊。故採 **走向 A'**:新增 `agents` 表、`devices` 改為實體 USB 掛 `agent_id``session_tokens.device_id` 保留物理 schema 但改綁「agent 代表 device」避開破壞性 FK migration、路由統一用 serialkn_number並在 local agent 端加 serial→本地 key 雙查(純加法、保護推論)。前端採 **FE-A 混合模型**DB 操作用 UUID、路由到 local agent 的操作用 serialserial 值替換 UUID、傳輸位置不動serial 空的 device 路由類操作 disable。 讀 code 後推翻「`session_tokens.device_id` 單一 FK 是硬傷」的假設——推論路由根本不靠它,真正缺口是「雲端 device.id ↔ local agent 本地 id」從不對齊。故採 **走向 A'**:新增 `agents` 表、`devices` 改為實體 USB 掛 `agent_id``session_tokens.device_id` 保留物理 schema 但改綁「agent 代表 device」避開破壞性 FK migration、路由統一用 serialkn_number並在 local agent 端加 serial→本地 key 雙查(純加法、保護推論)。前端採 **FE-A 混合模型**DB 操作用 UUID、路由到 local agent 的操作用 serialserial 值替換 UUID、傳輸位置不動serial 空的 device 路由類操作 disable。
---
## 8. 補註Addendum
> ADR 為不可變決策紀錄以下補註只增不刪§1§7 原文一字未動。
### 8.1 C5 實作偏差回填2026-07-10 實作定案、2026-07-11 回填)
**偏差內容**§5.5 原句「C5 `workspace/[deviceId]` 連結改帶 serial」於 WP-C 前端實作時證實與本 ADR §2.2 FE-A 混合模型**自相矛盾**
1. workspace 進頁第一件事是 `fetchDevice(路由段值)`,屬「純雲端 DB 操作」——依 FE-A 分流表本應歸 **UUID** 組。
2. api-server 只有 `GET /devices/:id` 一個讀取端點、handler 直接按 DB 主鍵UUID`visionA-backend/internal/api/devices.go:26-42`**不存在任何 GetBySerial 端點**。
3. 路由段若帶 serial直接輸入 URL / 重新整理 / 書籤進入 workspace → `fetchDevice(serial)` → 404 → 整頁卡占位態。要救就得 api-server 加 serial 查 DB——正是本 ADR §3 否決 FE-B 時列出的理由。
R-Route 查證報告 §3.2 第 4 點當時已標注此張力,但 §4 C5 與本 ADR §5.5 C5 的行文未回頭同步,屬**文件內部殘留矛盾、非實作漏做**。
**最終實作(經 reviewer 獨立驗證、裁定偏差成立並接受)**
- workspace 路由段 `[deviceId]` **維持 UUID**`device-card.tsx` / `device-detail-client.tsx` / `workspace/page.tsx` 連結仍帶 `device.id`)。
- serial 由頁內 `selectedDevice.serialNumber` 派生,供 camera / media / inference WS 等路由類操作使用。FE-A 精神(「路由到 local agent 的操作識別值 = serial」100% 達成——路由段只是「取 device 資料的 key」、本身不路由到 local agent。
- C5 的「serial 空時工作區入口 disable + tooltip」行為全數落實另加頁內 no-serial banner。
**決策本體不變**§2.2 FE-A 混合模型、§5.5 其餘各條C1C4 / C6C8均維持原決策本補註僅將 C5 中「連結 href 改帶 serial」一句更正為「路由段維持 UUID、serial 頁內派生」。
**參照**
- 裁定證據鏈:`.autoflow/05-implementation/review/wp-c-frontend-serial-routing-review.md` §二C5 偏差獨立驗證)與 Minor #2(本回填的來源指令)。
- 同步修正文件:`.autoflow/04-architecture/personal-device-mgmt-R-Route-frontend-verification.md` §4 C5該檔非 ADR、直接於原條目修正 + 表下加修正註記)。