# 5F 第五階段整合驗收紀錄

本文件記錄第五階段 5F 整合驗收的實際執行結果。5F 不是新增功能節點，而是確認 5A PluginLoader、外部 DLL manual-only、5B config schema、5C DB audit、5D auth / Swagger 與 5E Windows Service 最小 hosting gate 已在授權範圍內完成，且沒有越過正式 DB、外部 DLL、OS Windows Service、production Swagger 或 secret 停止線。

## 0. 基本資訊

| 項目 | 內容 |
|---|---|
| 驗收日期 | 2026-06-08 |
| 使用者確認 | `5F 整合驗收執行前確認` 七項皆同意 |
| 程式 repo | `hs-device-control-template` |
| 程式 branch | `poc/nmodbus-tcp` |
| 程式 commit | `0789d35` |
| 程式 commit full SHA | `0789d3558220402f8ce5544d0826bf42905d6a6e` |
| 程式 Actions | `27098568634` success |
| 文件 repo | `hs-device-control-template-docs` |
| 5F 是否新增程式功能 | 否 |

## 1. 七項確認對應結果

| 編號 | 確認項 | 驗收結果 |
|---|---|---|
| 1 | 前置節點完成 | 5A、外部 DLL manual-only、5B、5C、5D、5E 均已有實作、測試、Actions 或驗收紀錄；5F 只做總收斂。 |
| 2 | 全量測試 | 已執行全 solution 測試，548 passed / 0 failed / 0 skipped。 |
| 3 | API / Service 邊界 | WebApi.Tests 17 passed；ServiceHost.Tests 19 passed；預設 console smoke 與 `--windows-service` smoke 均 Running -> Stopped。 |
| 4 | 安全停止線 | secret / password / token / service account / formal env 掃描命中均為 guard、sanitizer、manual-only 測試或 fake fixture，未發現正式 secret 保存。 |
| 5 | DB / Loader 停止線 | 未執行 DDL、ALTER TABLE、formal Apply、正式 DB 寫入、外部 DLL 載入、plugin folder 掃描或 Adapter public contract 變更。 |
| 6 | 文件與線上驗收 | 本輪建立 5F 驗收紀錄與第五階段完成稽核；推送後另建線上驗收紀錄。 |
| 7 | 排除項目 | 未新增功能、未改部署 secret、未安裝 Windows Service、未連正式 DB、未導入真實硬體控制。 |

## 2. 測試結果

| 驗收項目 | 指令 | 結果 |
|---|---|---|
| Application contract | `dotnet test tests\HS.DeviceControl.Application.Tests\HS.DeviceControl.Application.Tests.csproj --no-restore -m:1 /p:BuildInParallel=false /p:UseSharedCompilation=false` | 67 passed / 0 failed / 0 skipped |
| WebApi | `dotnet test tests\HS.DeviceControl.WebApi.Tests\HS.DeviceControl.WebApi.Tests.csproj --no-restore -m:1 /p:BuildInParallel=false /p:UseSharedCompilation=false` | 17 passed / 0 failed / 0 skipped |
| ServiceHost | `dotnet test tests\HS.DeviceControl.ServiceHost.Tests\HS.DeviceControl.ServiceHost.Tests.csproj --no-restore -m:1 /p:BuildInParallel=false /p:UseSharedCompilation=false` | 19 passed / 0 failed / 0 skipped |
| Infrastructure.MySql | `dotnet test tests\HS.DeviceControl.Infrastructure.MySql.Tests\HS.DeviceControl.Infrastructure.MySql.Tests.csproj --no-restore -m:1 /p:BuildInParallel=false /p:UseSharedCompilation=false` | 89 passed / 0 failed / 0 skipped |
| 全 solution | `dotnet test HS.DeviceControl.sln --no-restore -m:1 /p:BuildInParallel=false /p:UseSharedCompilation=false` | 548 passed / 0 failed / 0 skipped |

備註：測試期間仍出現 `.NET 5.0` EOL warning，屬既有目標框架風險，不代表 5F 驗收失敗。

## 3. Runtime smoke

| 項目 | 指令 | 實際結果 |
|---|---|---|
| ServiceHost 預設路徑 | `dotnet run --project src\HS.DeviceControl.ServiceHost\HS.DeviceControl.ServiceHost.csproj --no-restore` | `HS.DeviceControl.ServiceHost: Running device=Connected health=Healthy`；`HS.DeviceControl.ServiceHost: Stopped device=Disconnected health=Healthy` |
| Windows hosting gate smoke | `dotnet run --project src\HS.DeviceControl.ServiceHost\HS.DeviceControl.ServiceHost.csproj --no-restore -- --windows-service` | `windows-service HS.DeviceControl.ServiceHost: Running device=Connected health=Healthy`；`windows-service HS.DeviceControl.ServiceHost: Stopped device=Disconnected health=Healthy` |

## 4. 停止線掃描

| 掃描類型 | 結果 | 判定 |
|---|---|---|
| OS Windows Service install | 未命中 `UseWindowsService`、WindowsServices package、`New-Service`、`sc.exe`、installer / uninstall 關鍵字。 | 通過 |
| 外部 DLL / assembly loading | 未命中 assembly loading API；命中內容僅為既有 `ConfigLoader.LoadFromDirectory` 與禁止保存 plugin folder 的註解。 | 通過 |
| DB DDL / formal Apply | 命中既有 SQL generator、dry-run、gateway、manual-only 測試與 schema assertion；本輪未執行 DDL、ALTER TABLE、formal Apply 或正式 DB 寫入。 | 通過 |
| production Swagger / auth 擴張 | 未新增 JWT、OAuth、OIDC、外部 IdP、角色系統或 production Swagger 設定。 | 通過 |
| secret / formal env | 命中內容為 sanitizer、validator、guard 測試、manual-only env var 讀取或 fake fixture；未發現正式 API key、password、client secret、token、正式 IP、正式 port、正式 path、正式 service account 或正式機器名稱保存。 | 通過 |
| 污染字串 | 程式 repo 與文件 repo 指定範圍均無命中。 | 通過 |

## 5. 文件鏡像與 repo 狀態

| 項目 | 結果 |
|---|---|
| 文件鏡像 | `docs/phase-five-f-integration-acceptance-plan.*`、`progress.json`、`status.json` 與 public mirror hash 一致。 |
| 程式 repo 狀態 | `poc/nmodbus-tcp...origin/poc/nmodbus-tcp`，乾淨。 |
| 文件 repo 狀態 | 建立本文件前為 `main...origin/main`，乾淨。 |
| 程式遠端 head | `0789d3558220402f8ce5544d0826bf42905d6a6e`。 |

## 6. 驗收結論

5F 整合驗收通過。第五階段的已授權最小範圍可標記完成：

- 5A PluginLoader metadata-only 完成。
- 外部 DLL manual-only fake verifier 完成。
- 5B config schema metadata-only 完成。
- 5C DB audit Application contract / in-memory writer 完成。
- 5D auth / Swagger 最小 API key gate 與 development-only Swagger 完成。
- 5E Windows Service 最小 hosting gate 完成。
- 5F 整合驗收通過。

## 7. 仍需另行授權的非阻擋項目

- 正式 DB DDL、ALTER TABLE、formal Apply 或正式 DB 初始化。
- production Swagger、JWT、OAuth、OIDC、外部 IdP 或角色權限系統。
- Windows Service OS 安裝、installer、service account、正式 log / config path。
- 真實外部 DLL 載入、plugin folder 掃描、assembly 執行。
- 真實硬體控制、正式現場 IP / port / account / secret。
