MySQL TaskStore node_executions 實作前確認

1. 文件目的

本文件用來啟動目標模式下的下一個第二階段工作節點:MySQL TaskStore node_executions 第一版

本文件只做實作前確認,先固定欄位、索引、交易策略、測試範圍與停止線;不直接建立資料表、不執行 DDL、不連真實 DB、不修改 ITaskStore public method 簽章,也不修改 TaskExecutionRecord / TaskNodeExecutionRecord public model。

2. 目前已具備能力

項目狀態說明
task_executions已完成第一版 PoC已完成 Save upsert、FindById / ListRecent、fake gateway 測試與真實 DB manual-only 驗證。
TaskExecutionRecord.NodeRecords已完成已可保存節點摘要,包含 NodeId、NodeName、DeviceId、CommandName、Status、RetryCount、TimeTakenMs、DataSummary、MetadataSummary、NextNodeId、TransitionSummary。
TaskExecutionRecord.Restore已有 internal helper可供 Infrastructure.MySql 還原任務摘要,不新增 public API。
MySqlTaskStoreSqlBuilder已完成第一版目前只產生 task_executions SQL。
IMySqlTaskStoreGateway已完成第一版目前支援 non-query、single row、list row;仍以 fake gateway 測試為主。
Schema Attribute / SQL Generator已完成第一輪可用 C# class 表達 table / column / index / comment,並產生 MySQL 5.6.2 相容 SQL。

3. 本批目標

本批建議只做 node_executions 節點摘要持久化,目標如下:

4. 本批可以做

項目是否可做理由
新增 node_executions schema class可以只定義 expected schema,不直接執行 DDL。
新增節點 SQL builder method可以屬 Infrastructure.MySql 內部 SQL 產生,不改 Core contract。
新增 node row / parameter mapper可以TaskNodeExecutionRecord 轉成 MySQL 參數。
擴充 fake gateway 測試可以不連真實 DB,適合作為第一批安全驗證。
Save 同批保存任務與節點摘要可以使用既有 ITaskStore.Save(record),不新增 public method。
更新文件與實作紀錄可以讓文件 repo 後續可同步顯示完成狀態。

5. 本批暫不做

項目暫不做原因
不修改 ITaskStore public method避免擴大 Core contract。
不修改 TaskExecutionRecord / TaskNodeExecutionRecord public constructor 或 property現有節點摘要已足夠做第一版。
不保存 RawRequest / RawResponse這些資料目前最完整來源在 WorkflowNodeExecutionSnapshot / LogEntry,不屬本批。
不實作 command_executions命令明細資料來源尚未定案。
不實作 task_log_traces詳細 log 應由 DB LogWriter / TraceStore 承接,不塞進 TaskStore。
不接 ConsoleHost / ServiceHost 啟動流程第二階段仍維持 Infrastructure 行為驗證,不導入正式 host。
不執行 CREATE TABLE / ALTER TABLE / DROP TABLEDDL 屬高風險操作,需另行確認。

6. 建議資料表定位

Table定位第一版責任
task_executions任務主檔任務狀態、Workflow、時間、結果摘要。
node_executions節點摘要任務內每個節點的執行順序、狀態、設備命令摘要與轉移摘要。

node_executions 第一版是 TaskStore 的明細表,不是詳細 log table。

7. 建議欄位

欄位型別必填來源描述
task_idvarchar(64)TaskExecutionRecord.TaskId任務識別碼,與 task_executions.task_id 對應。
sequence_nointNodeRecords 順序,由 1 開始任務內節點執行順序。
node_idvarchar(64)TaskNodeExecutionRecord.NodeIdWorkflow 節點識別碼。
node_namevarchar(128)TaskNodeExecutionRecord.NodeNameWorkflow 節點名稱。
device_idvarchar(64)TaskNodeExecutionRecord.DeviceId節點使用的設備識別碼。
command_namevarchar(128)TaskNodeExecutionRecord.CommandName節點執行的設備命令名稱。
statusvarchar(32)TaskNodeExecutionRecord.Status節點執行狀態。
retry_countintTaskNodeExecutionRecord.RetryCount節點實際重試次數。
started_atdatetimeTaskNodeExecutionRecord.StartedAt節點開始時間。
ended_atdatetimeTaskNodeExecutionRecord.EndedAt節點結束時間。
time_taken_msintTaskNodeExecutionRecord.TimeTakenMs節點耗時毫秒數。
error_codevarchar(64)TaskNodeExecutionRecord.ErrorCode節點失敗時的錯誤代碼。
error_messagevarchar(255)TaskNodeExecutionRecord.ErrorMessage節點失敗時的錯誤訊息。
data_summarytextTaskNodeExecutionRecord.DataSummary節點回傳 Data 摘要。
metadata_summarytextTaskNodeExecutionRecord.MetadataSummary節點 Metadata 摘要。
next_node_idvarchar(64)TaskNodeExecutionRecord.NextNodeId實際轉移的下一節點。
transition_summarytextTaskNodeExecutionRecord.TransitionSummary節點轉移判斷摘要。
created_atdatetime寫入當下或 task updated time節點紀錄建立時間。

8. 建議主鍵與索引

第一版建議採複合主鍵:


PRIMARY KEY (task_id, sequence_no)

理由:

建議索引:

IndexColumns用途
idx_node_executions_task_idtask_id查詢指定任務節點歷程。
idx_node_executions_statusstatus查詢失敗或執行中節點。
idx_node_executions_devicedevice_id查詢某設備參與的節點。
idx_node_executions_node_idnode_id查詢特定 Workflow 節點的執行紀錄。

備註:若 PRIMARY KEY (task_id, sequence_no) 已能支援 task_id 查詢,idx_node_executions_task_id 可在實作時評估是否保留;若為了可視化與文件一致性,保留也可以接受。

9. 寫入策略

第一版建議採 delete-and-insert

理由:

限制:

10. 交易策略

第一版實作建議先拆成兩層:

階段策略
fake gateway 單元測試驗證會依序建立 task upsert、node delete、node insert commands。
真實 DB manual-only需確認 gateway 是否以 transaction 包住 task upsert + node delete + node inserts。

若要實際導入 transaction,建議優先在 MySqlTaskStoreGateway 內新增 internal transaction method,不改 ITaskStore

11. 查詢還原策略

第一版建議:

原因:

12. 測試策略

12.1 fake gateway 單元測試

測試目的
Save_ShouldDeleteExistingNodeExecutionsBeforeInsert確認同一 task_id 重存時先刪舊節點。
Save_ShouldInsertNodeExecutionsInOrder確認 sequence_no 由 1 開始,順序符合 NodeRecords
Save_ShouldMapNodeExecutionParameters確認 NodeId、DeviceId、CommandName、Status、RetryCount、DataSummary、MetadataSummary、NextNodeId、TransitionSummary 被寫入參數。
Save_ShouldSkipNodeInsertWhenNoNodeRecords沒有節點時只保存 task 主檔,不產生 node insert。
Save_ShouldTruncateNodeExecutionLongFields確認 varchar 欄位不超過 DB 長度。
Save_ShouldNotExposePasswordWhenNodeCommandFailsnode command 失敗時錯誤訊息不得包含密碼。

12.2 schema / SQL 測試

測試目的
NodeExecutionSchema_ShouldParseColumnsAndIndexes確認 schema class 可解析欄位、主鍵、索引、comment。
NodeExecutionSchema_ShouldGenerateMySql56Sql確認 SQL Generator 可產生 MySQL 5.6.2 相容 SQL。

12.3 manual-only 真實 DB 驗證

本批完成 fake gateway 後,真實 DB 驗證需另列節點,不自動執行。

建議驗證項目:

13. 必須停下確認的事項

以下任一項出現時,Codex 必須停下,不得自動執行:

14. 建議實作順序

15. 本次確認結論

建議採用「先保存節點摘要,不急著回讀明細」:

建議下一步進入「MySQL TaskStore node_executions 第一版實作」,但只做 schema class、SQL builder、fake gateway 與單元測試;遇到 DDL、真實 DB 寫入或 public contract 變更時必須停下。