3D Application contract 草案 / 實作前確認表

整理 3D 進入 Application contract 第一版前的候選檔案、命名、測試策略與停止線。

返回 docs

3D Application contract 草案 / 實作前確認表

本文件承接 3D contract 草案 / 實作前確認表3D contract 決策確認表3D 程式 repo 結構檢查與實作前確認3D 程式 repo 結構檢查線上驗收紀錄,把 3D 第一版真正進入 HS.DeviceControl.Application 前需要確認的候選檔案、contract 名稱、測試策略與停止線整理成可逐項確認的表格。

本文件只整理 Application contract 草案與實作前確認,不修改程式 repo,不載入外部 DLL,不建立 Plugin Loader,不修改 Adapter public contract,不修改 config schema,不新增 ServiceHost / WebApi,也不執行 DB 寫入、DDL 或正式 Apply。

0. 確認狀態

項目內容
文件狀態已確認
整理日期2026-06-05
確認日期2026-06-06
對應階段第三階段 3D Plugin / 多設備單元
程式 repohs-device-control-template
程式 branchpoc/nmodbus-tcp
程式 commitaee6ab6a2c3818ecdd244ce7f1db01d763ed4a14
程式 repo 狀態唯讀盤點完成,工作樹乾淨
本次目標確認 3D 第一版 Application contract 候選範圍
本次不做不改程式、不新增 route、不載入 DLL、不建立 Plugin Loader、不改 Adapter / config / DB
使用者確認已確認第 10 節七項決策

1. 第一版定位

3D Application contract 第一版的目標,是在既有 HS.DeviceControl.Application 專案中先建立多設備單元、資源占用、命令規劃與 Plugin metadata 的最小 contract,讓後續程式實作有穩定邊界。

第一版仍不是完整 Plugin 平台,也不是正式排程器。它只做可測試、可回退、可被 ServiceHost / WebApi 未來共用的 Application 層 contract。

原則說明
Application 層承接3D 第一版候選只放 HS.DeviceControl.ApplicationHS.DeviceControl.Application.Tests
Core 保持乾淨不把 ControlUnit、Plugin metadata、Resource Lock 或 Command Plan 寫入 Core。
Adapter contract 不變不修改 IDeviceAdapterDeviceCommandExecuteResult public contract。
Config schema 不變不改 devices.json / workflows.json schema,不導入 schema migration。
先規劃再執行第一版 Commands 只做 command plan / validation,不執行命令、不建立背景 queue。
Plugin 只做 metadata不掃描資料夾、不讀 DLL、不使用 Assembly.Load

2. 既有 Application 風格

目前程式 repo 已有 HS.DeviceControl.Application,可作為 3D 延伸基準。

既有區塊現況3D 延伸方式
TasksTaskControlService、request / result DTO、ITaskControlService保持任務啟動 / 查詢 / 取消邊界,不把 Resource Lock 寫入 Task service。
DevicesDeviceStatusServiceIDeviceStatusService可供 ControlUnit status 彙總參考,但不直接呼叫 Execute()
SchemaSchemaPreviewService 包裝 ManualApplyPreview保持 preview-only,不把 plugin/config apply 混進 schema preview。
HealthHealthService 與 dependency check3D 可補 read-only catalog health,但不暴露 secret。
CommonApplicationErrorCodes 已有 APP-0001APP-00053D 可新增 Application 層錯誤碼,不改 Core error contract。
TestsApplication.Tests 使用 xUnit 與 fake / in-memory3D 第一版測試也應使用 fake / in-memory,不連 DB、不載入 DLL。

3. 第一版候選檔案

以下候選檔案只有在使用者確認第 10 節七項決策後,才可進入程式 repo 實作。

區塊候選檔案用途是否本次新增程式
ControlUnitssrc/HS.DeviceControl.Application/ControlUnits/IControlUnitCatalogService.cs查詢多設備單元 catalog。
ControlUnitssrc/HS.DeviceControl.Application/ControlUnits/ControlUnitDefinition.cs定義單元、站位、設備綁定摘要。
ControlUnitssrc/HS.DeviceControl.Application/ControlUnits/ControlUnitDeviceBinding.cs定義 ControlUnitId / StationId / DeviceId / ResourceId 關係。
ControlUnitssrc/HS.DeviceControl.Application/ControlUnits/ControlUnitStatusQuery.cs查詢單元狀態。
ControlUnitssrc/HS.DeviceControl.Application/ControlUnits/ControlUnitStatusResult.cs回傳單元狀態與設備摘要。
Resourcessrc/HS.DeviceControl.Application/Resources/IResourceLockService.cs定義取得、釋放與查詢 resource lock。
Resourcessrc/HS.DeviceControl.Application/Resources/ResourceDefinition.cs定義 resource id、名稱與適用單元。
Resourcessrc/HS.DeviceControl.Application/Resources/ResourceLockRequest.cs取得鎖請求。
Resourcessrc/HS.DeviceControl.Application/Resources/ResourceLockResult.cs取得鎖結果與標準錯誤。
Resourcessrc/HS.DeviceControl.Application/Resources/ResourceReleaseRequest.cs釋放鎖請求。
Resourcessrc/HS.DeviceControl.Application/Resources/ResourceReleaseResult.cs釋放鎖結果。
Resourcessrc/HS.DeviceControl.Application/Resources/ResourceLockMode.csExclusive / SharedRead 候選 enum。
Commandssrc/HS.DeviceControl.Application/Commands/IDeviceCommandPlanner.cs規劃設備命令,不執行命令。
Commandssrc/HS.DeviceControl.Application/Commands/DeviceCommandPlanRequest.cscommand plan 請求。
Commandssrc/HS.DeviceControl.Application/Commands/DeviceCommandPlanResult.cscommand plan 結果。
Commandssrc/HS.DeviceControl.Application/Commands/DeviceCommandPlanItem.cs單筆設備命令、resource dependency 與順序。
Pluginssrc/HS.DeviceControl.Application/Plugins/IPluginCatalogService.cs查詢 plugin metadata catalog。
Pluginssrc/HS.DeviceControl.Application/Plugins/PluginDescriptor.cs定義 plugin id、version、capability 與相容性。
Pluginssrc/HS.DeviceControl.Application/Plugins/PluginCapabilityDescriptor.cs描述支援 device type / command / adapter contract。
Pluginssrc/HS.DeviceControl.Application/Plugins/PluginCatalogResult.cs回傳 plugin catalog 查詢結果。
Commonsrc/HS.DeviceControl.Application/Common/ApplicationErrorCodes.cs補 3D Application error code。
Teststests/HS.DeviceControl.Application.Tests/*DTO、fake service 與停止線測試。

4. ControlUnits contract 草案

ControlUnits 第一版只做單元、站位與設備綁定描述,不修改既有 config schema。

Contract欄位 / 方法草案
IControlUnitCatalogService.GetStatus(ControlUnitStatusQuery query)查詢指定單元或全部單元狀態。
ControlUnitDefinitionControlUnitIdControlUnitNameDescriptionStationsDeviceBindingsMetadata
ControlUnitDeviceBindingControlUnitIdStationIdDeviceIdResourceIdCommandNames
ControlUnitStatusQueryControlUnitIdIncludeDevicesIncludeResourcesOperator
ControlUnitStatusResultSuccessControlUnitIdStatusDeviceStatusesResourceStatusesCodeMessageError

邊界限制:

5. Resources contract 草案

Resources 第一版只建立 resource lock contract 與 fake / in-memory 測試,不建立跨 process lock、不寫 DB。

Contract欄位 / 方法草案
IResourceLockService.Acquire(ResourceLockRequest request)嘗試取得指定 resource。
IResourceLockService.Release(ResourceReleaseRequest request)釋放指定 lock。
ResourceDefinitionResourceIdResourceNameControlUnitIdDeviceIdsMetadata
ResourceLockRequestResourceIdModeOwnerTaskIdOwnerNodeIdDeviceIdCommandNameTimeoutMsOperator
ResourceLockResultSuccessLockIdResourceIdAcquiredModeCodeMessageError
ResourceReleaseRequestLockIdResourceIdOwnerTaskIdReasonOperator
ResourceReleaseResultSuccessLockIdResourceIdReleasedCodeMessageError
ResourceLockModeExclusiveSharedRead

6. Commands contract 草案

Commands 第一版建議做 DeviceCommandPlan,不是正式 Command Queue。目標是先讓命令可被規劃、驗證、標示 resource dependency,但不下硬體命令。

Contract欄位 / 方法草案
IDeviceCommandPlanner.Plan(DeviceCommandPlanRequest request)產生命令計畫與 resource dependency。
DeviceCommandPlanRequestTaskIdNodeIdControlUnitIdDeviceIdCommandNameResourceIdOperatorCorrelationId
DeviceCommandPlanResultSuccessPlanIdItemsRequiresLockCodeMessageError
DeviceCommandPlanItemSequenceDeviceIdCommandNameResourceIdRequiresExclusiveLockMetadata

第一版停止線:

7. Plugins contract 草案

Plugins 第一版只做 read-only metadata catalog,不建立 loader。

Contract欄位 / 方法草案
IPluginCatalogService.List()回傳目前已知 plugin metadata。
PluginDescriptorPluginIdPluginNameVersionVendorCapabilitiesCompatibilityChecksumMetadata
PluginCapabilityDescriptorCapabilityNameDeviceTypeSupportedCommandsAdapterContractVersion
PluginCatalogResultSuccessPluginsCodeMessageError

Plugin metadata 不得包含:

8. Application error code 草案

3D 第一版若進入程式實作,可只在 Application 層補錯誤碼,不改 Core。

錯誤代碼建議常數用途
APP-0301ControlUnitNotFound找不到指定 control unit。
APP-0302ControlUnitInvalidDefinitioncontrol unit 定義缺少必要欄位或重複。
APP-0311ResourceNotFound找不到指定 resource。
APP-0312ResourceLockDeniedresource 已被占用或不允許取得。
APP-0321CommandPlanInvalidcommand plan request 不合法。
APP-0331PluginMetadataInvalidplugin metadata 不合法或缺少必要欄位。

9. 測試策略

測試節點驗證目的建議方式
ControlUnit definition validation確認 ControlUnitIdStationIdDeviceIdResourceId 必填與重複檢查。HS.DeviceControl.Application.Tests 單元測試。
ControlUnit status read-only確認 status 查詢不呼叫 Adapter Execute()fake adapter / fake catalog。
Resource lock acquire / release確認同一 ResourceId 的 exclusive lock 不可重複取得,release reason 可追蹤。in-memory fake service。
Command plan validation確認缺少 DeviceId / CommandName / ResourceId 會回標準錯誤。不執行命令。
Plugin catalog validation確認 plugin id、version、capability 必填,metadata 不含敏感資訊。不讀 DLL。
Stop-line guard確認本批不修改 Adapter contract、不改 config schema、不新增 Plugin Loader。檔案範圍與單元測試對照。

10. 七項確認表

以下七項需使用者確認後,才可進入程式 repo 實作。

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

建議使用者回覆格式:

3D Application contract 確認:
1. 同意
2. 同意
3. 同意
4. 同意
5. 同意
6. 同意
7. 同意

11. 仍需停止的項目

除非使用者另行明確授權,仍不得自動執行:

12. 建議下一步

使用者已於 2026-06-06 確認第 10 節七項決策。下一步可參考 3D Application contract 決策確認表,再進入「3D Application contract 第一版實作前最後確認」或最小 Application contract 程式實作;仍不得超出本文件停止線。