# 3D Application contract 決策確認表

本文件承接 [3D Application contract 草案 / 實作前確認表](plugin-multi-device-application-contract-preimplementation-checklist.md)，記錄使用者對 3D Application contract 七項決策的確認結果。

本文件只做決策確認，不代表已修改程式 repo，不代表已建立 Plugin Loader、不代表已載入外部 DLL，也不代表已同意修改 Adapter public contract、config schema、`ServiceHost`、`WebApi`、API route、DB DDL 或正式 Apply。

## 0. 確認狀態

| 項目 | 內容 |
|---|---|
| 文件狀態 | 已確認 |
| 整理日期 | 2026-06-06 |
| 確認日期 | 2026-06-06 |
| 對應階段 | 第三階段 3D Plugin / 多設備單元 |
| 前置文件 | [3D Application contract 草案 / 實作前確認表](plugin-multi-device-application-contract-preimplementation-checklist.md) |
| 程式 repo | `hs-device-control-template` |
| 程式 branch | `poc/nmodbus-tcp` |
| 程式 commit | `aee6ab6a2c3818ecdd244ce7f1db01d763ed4a14` |
| 本次確認範圍 | Application 層放置位置、ControlUnits、Resources、Commands、Plugins、Application error code / tests 與停止線 |
| 確認結果 | 使用者已回覆 1 至 7 全部同意 |
| 確認後可進入 | 3D Application contract 第一版實作前最後確認，或在同一停止線內進入最小 Application contract 程式實作 |
| 本次仍不做 | 不改 Core / Adapters public contract、不新增 ServiceHost / WebApi、不新增 route、不載入 DLL、不建立 Plugin Loader、不改 config schema、不連 DB、不執行 DDL 或正式 Apply |

## 1. 使用者確認內容

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

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

## 2. 七項決策定案

| 編號 | 決策項 | 定案結果 | 可進入項目 | 仍需停止 |
|---:|---|---|---|---|
| 1 | Application 層放置位置 | 同意 3D 第一版只新增於 `HS.DeviceControl.Application` 與 `HS.DeviceControl.Application.Tests`。 | 可新增 ControlUnits / Resources / Commands / Plugins 資料夾。 | 不改 Core、Adapters、Infrastructure、ConsoleHost。 |
| 2 | ControlUnits contract | 同意以 `ControlUnitDefinition`、`ControlUnitDeviceBinding`、`ControlUnitStatusResult` 作為第一版命名。 | 可實作 read-only catalog / status contract。 | 不改 config schema、不保存連線資訊。 |
| 3 | Resources contract | 同意新增 `IResourceLockService` 與 lock / release request-result DTO。 | 可實作 fake / in-memory resource lock 測試。 | 不建立 DB table、不做跨 process lock。 |
| 4 | Commands contract | 同意第一版只做 `DeviceCommandPlan`，不建立正式 Command Queue。 | 可實作 command plan / validation contract。 | 不呼叫 Adapter `Execute()`、不新增背景 worker。 |
| 5 | Plugins contract | 同意第一版只做 `PluginDescriptor` / catalog metadata。 | 可實作 read-only plugin catalog contract。 | 不建立 Plugin Loader、不載入 DLL、不掃描資料夾。 |
| 6 | Error code / tests | 同意只補 Application 層錯誤碼與 Application.Tests。 | 可新增 `APP-03xx` 錯誤與單元測試。 | 不改 Core error contract、不連 DB、不接硬體。 |
| 7 | 停止線 | 同意本批仍不新增 ServiceHost / WebApi、不改 Adapter public contract、不改 config schema。 | 可安全進入最小 Application contract 程式實作。 | 不保存 secret、不改啟動方式、不導入新套件。 |

## 3. 實作邊界定案

| 邊界 | 定案 |
|---|---|
| 程式放置位置 | 僅限 `src/HS.DeviceControl.Application` 與 `tests/HS.DeviceControl.Application.Tests`。 |
| ControlUnits | 只做 read-only catalog / status contract，不持有硬體連線資訊。 |
| Resources | 只做 fake / in-memory lock contract，不建立 DB table 或分散式鎖。 |
| Commands | 只做 command plan / validation，不建立正式 queue、不呼叫 Adapter `Execute()`。 |
| Plugins | 只做 metadata catalog，不建立 Loader、不掃描或載入 DLL。 |
| Error code | 僅補 Application 層 `APP-03xx` 錯誤碼，不改 Core error contract。 |
| Tests | 僅使用 xUnit、fake / in-memory 測試，不連 DB、不接硬體、不載入 DLL。 |

## 4. 實作前仍需遵守

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

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

## 5. 建議下一步

3D Application contract 七項決策已確認。建議下一步進入「3D Application contract 第一版實作前最後確認」或直接依本文件停止線執行最小 Application contract 程式實作；實作範圍仍限於 `HS.DeviceControl.Application` 與 `HS.DeviceControl.Application.Tests`。
