# 3D contract 決策確認表

## 1. 文件定位

本文件承接 [3D contract 草案 / 實作前確認表](plugin-multi-device-contract-preimplementation-checklist.md)，將進入「3D 程式 repo 結構檢查與實作前確認」前需要使用者確認的七項決策整理成獨立確認表。

本文件只做決策確認，不代表已同意修改程式、新增專案、載入外部 DLL、新增 Plugin Loader、修改 `IDeviceAdapter` public contract、導入 plugin / queue 套件、修改 config schema、新增 ServiceHost / WebApi、執行 DB DDL 或接真實硬體。

## 2. 確認狀態

| 項目 | 內容 |
|---|---|
| 文件狀態 | 已確認 |
| 整理日期 | 2026-06-05 |
| 確認日期 | 2026-06-05 |
| 對應階段 | 第三階段 3D Plugin / 多設備單元 |
| 前置文件 | [3D contract 草案 / 實作前確認表](plugin-multi-device-contract-preimplementation-checklist.md) |
| 本次目標 | 取得 3D contract 進入程式 repo 結構檢查前的七項決策確認 |
| 本次不做 | 不改程式、不新增專案、不載入 DLL、不新增 Plugin Loader、不改 Adapter contract、不改 config schema、不新增 ServiceHost / WebApi |
| 確認結果 | 使用者已回覆 1 至 7 全部同意 |
| 確認後可進入 | 3D 完成稽核、文件 repo stage / commit / push 與部署查驗；後續若進入程式 repo 仍限於另行確認後的唯讀盤點 |

## 3. 七項決策確認表

| 編號 | 決策項 | 建議定案 | 同意後可進入 | 停止線 | 確認結果 |
|---:|---|---|---|---|---|
| 1 | 多設備單元 contract | 以 `ControlUnitId` / `StationId` / `DeviceId` / `ResourceKey` 作為第一版 DTO 命名基礎。 | 可唯讀盤點 Application 專案是否適合承接 Control Unit DTO。 | 不立即修改 `devices.json` / `workflows.json` / `appsettings.json` schema。 | 同意 |
| 2 | Resource Lock contract | 第一版候選放在 Application 層，先做 request / result / fake 邊界。 | 可唯讀盤點 lock service / DTO 的程式候選位置。 | 不新增 DB table、不導入分散式鎖、不寫 TaskStore schema。 | 同意 |
| 3 | Command Queue contract | 第一版候選放在 Application 層，先做 in-memory / fake contract。 | 可唯讀盤點 enqueue / status / cancel contract 與測試策略。 | 不導入 queue 套件、不改啟動方式、不讓 WebApi request 長時間阻塞。 | 同意 |
| 4 | Plugin metadata contract | 第一版只做 metadata / manifest DTO 候選。 | 可唯讀盤點 plugin id、version、capability、checksum 與相容性欄位位置。 | 不建立 Loader、不掃描 DLL、不載入 DLL、不保存正式 DLL 路徑。 | 同意 |
| 5 | Adapter contract 穩定性 | 維持 `IDeviceAdapter` public contract 不變，後續若需要 plugin adapter 先用 wrapper / factory 映射。 | 可降低對既有 Mock / Modbus Adapter 的破壞風險。 | 未確認前不新增或改動 Adapter public method。 | 同意 |
| 6 | 測試策略 | 第一版只做 Application.Tests 的 DTO / fake / in-memory 測試。 | 可整理不連 DB、不載入 DLL、不接硬體的測試範圍。 | 不跑真實硬體、不連正式 DB、不執行 DDL。 | 同意 |
| 7 | 3D 停止線 | 未再次確認前不改 config schema、不新增 ServiceHost / WebApi、不改 route、不保存敏感資訊。 | 可保留 3D contract 為安全、可回退的前置節點。 | 不保存密碼、Token、IP、Port、完整 connection string 或正式環境資訊。 | 同意 |

## 4. 使用者回覆紀錄

使用者已於 2026-06-05 回覆：

```text
3D contract 確認：
1. 同意
2. 同意
3. 同意
4. 同意
5. 同意
6. 同意
7. 同意
```

## 5. 確認後的可執行下一步

七項已同意後，本節點可先進入 3D 完成稽核、必要文件同步、文件 repo stage / commit / push 與部署查驗。若後續要進入「3D 程式 repo 結構檢查與實作前確認」，範圍仍需限於唯讀盤點，不直接修改程式。

| 項目 | 盤點方向 | 是否立即實作 |
|---|---|---|
| Application 專案 | 檢查 `HS.DeviceControl.Application` 是否適合承接 ControlUnits、Resources、Commands、Plugins namespace。 | 否 |
| 測試專案 | 檢查 `HS.DeviceControl.Application.Tests` 是否適合承接 DTO / fake / in-memory 測試。 | 否 |
| 既有 contract | 檢查 Task / Device / Schema / Health contract 是否需保持獨立。 | 否 |
| Adapter contract | 確認 `IDeviceAdapter` 不需調整即可保留 wrapper / factory 空間。 | 否 |
| 停止線 | 再次確認 DLL、Plugin Loader、config schema、ServiceHost / WebApi、DB 與敏感資訊均不進入本批。 | 持續保留 |

## 6. 仍需停止的項目

即使七項全部同意，除非使用者另行明確授權，仍不得自動執行：

- 不新增程式檔案。
- 不新增或修改 solution / project。
- 不載入外部 DLL。
- 不掃描 plugin 目錄。
- 不新增 Plugin Loader 程式。
- 不新增或更換 plugin framework、queue framework、DI / Host framework。
- 不修改 `IDeviceAdapter`、Core、Adapters、Infrastructure public method 簽章。
- 不修改既有 config schema 或啟動方式。
- 不新增 ServiceHost / WebApi 專案。
- 不新增 API route、controller、endpoint 或 middleware。
- 不執行 DB 寫入、DDL、ALTER TABLE 或正式 Apply。
- 不保存密碼、Token、IP、Port、完整 connection string、正式 DLL 路徑或正式環境資訊。

## 7. 建議下一步

七項決策已確認。建議先完成本次文件 repo stage / commit / push 與部署查驗；後續如需進入 3D 程式 repo 結構檢查，仍需遵守本文件第 6 節停止線。
