MySQL TaskStore 節點 / 命令 / 詳細 log table 邊界分析

1. 文件目的

本文件整理 MySQL TaskStore 第一版 PoC 完成後,是否要把節點歷程、設備命令與詳細 log table 納入第二階段下一批。

本文件只做邊界分析與實作順序建議,不直接修改資料表、C# model、public method 簽章、ConsoleHost 啟動方式,也不執行真實 DB 寫入或 DDL。

2. 目前已完成狀態

項目狀態說明
task_executions已完成第一版 PoC已完成 Save upsert、FindById、ListRecent 與真實 DB manual-only 驗證。
TaskExecutionRecord.NodeRecords已存在可記錄節點摘要,包含 NodeId、NodeName、DeviceId、CommandName、Status、RetryCount、TimeTakenMs、DataSummary、MetadataSummary、NextNodeId、TransitionSummary。
WorkflowNodeExecutionSnapshot已存在TaskNodeExecutionRecord 更接近 Workflow 完成瞬間,包含 AdapterTimeTakenMs、RawRequestSummary、RawResponseSummary。
LogEntry已存在已承接 TaskId、NodeId、DeviceId、CommandName、Status、RetryCount、TimeTakenMs、AdapterTimeTakenMs、DataSummary、RawRequestSummary、RawResponseSummary、MetadataSummary、ErrorCode、Message。
MySQL Schema Automation已完成第一輪可用 C# schema class 維護欄位、索引、描述,並以 dry run 產生 SQL preview。

3. 邊界結論

建議第二階段下一批不要一次把節點、命令與詳細 log 全部實作,而是拆成三個層級:

層級建議狀態原因
node_executions建議優先納入下一批目前 TaskExecutionRecord.NodeRecords 已有足夠資料,可不改 public contract 先保存節點摘要。
command_executions建議先做實作前確認目前最完整的 RawRequest / RawResponse 來源在 WorkflowNodeExecutionSnapshotLogEntry,不是 TaskNodeExecutionRecord;需先決定資料來源,避免改錯模型。
詳細 log table建議獨立於 TaskStore 設計詳細 log 屬於 Log Writer / Trace 職責,不宜塞進 TaskStore;建議後續以 DB LogWriter 或 TaskTraceStore 方式處理。

4. 為什麼不一次做完

一次完成多表持久化會同時碰到:

以上任一項都可能改變資料模型、public contract 或正式 DB 邊界,依 AGENTS.md 規則必須先停下確認。

5. 建議 table 分工

Table職責是否屬 TaskStore建議批次
task_executions任務主檔與任務狀態摘要已完成第一版
node_executionsWorkflow 節點歷程摘要下一批優先
command_executionsAdapter / Device command 執行明細視資料來源決定下一批後段或獨立批次
task_log_traces任務相關詳細 log / trace否,建議屬 Log Writer後續批次
task_errors錯誤快照與例外資訊可選等錯誤查詢需求明確後再做

6. node_executions 建議邊界

node_executions 可直接由 TaskExecutionRecord.NodeRecords 產生,因此最適合作為下一個小步。

6.1 建議保存欄位

欄位來源第一版建議
node_execution_id程式產生建議用 task_id + sequence_no 或 Guid,需實作前確認。
task_idTaskExecutionRecord.TaskId必填。
sequence_noNodeRecords 順序必填,利於重建節點順序。
node_idTaskNodeExecutionRecord.NodeId必填。
node_nameTaskNodeExecutionRecord.NodeName可空。
device_idTaskNodeExecutionRecord.DeviceId可空。
command_nameTaskNodeExecutionRecord.CommandName可空。
statusTaskNodeExecutionRecord.Status必填。
retry_countTaskNodeExecutionRecord.RetryCount必填或預設 0。
started_atTaskNodeExecutionRecord.StartedAt必填。
ended_atTaskNodeExecutionRecord.EndedAt可空。
time_taken_msTaskNodeExecutionRecord.TimeTakenMs必填或預設 0。
error_codeTaskNodeExecutionRecord.ErrorCode可空。
error_messageTaskNodeExecutionRecord.ErrorMessage可空。
data_summaryTaskNodeExecutionRecord.DataSummary可空,建議 text
metadata_summaryTaskNodeExecutionRecord.MetadataSummary可空,建議 text
next_node_idTaskNodeExecutionRecord.NextNodeId可空。
transition_summaryTaskNodeExecutionRecord.TransitionSummary可空,建議 text
created_at寫入當下必填。

6.2 建議索引

IndexColumns用途
idx_node_executions_task_idtask_id查詢指定任務節點歷程。
idx_node_executions_task_sequencetask_id, sequence_no依任務還原節點順序。
idx_node_executions_statusstatus查詢失敗或執行中節點。
idx_node_executions_devicedevice_id查詢某設備參與的節點。

6.3 實作注意

第一版建議只追加保存節點摘要,不要求 FindById / ListRecent 立即完整回填 NodeRecords

原因是查詢還原多表資料會牽涉:

這些都可能影響 public contract 或效能,應另行實作前確認。

7. command_executions 邊界

command_executions 要保存設備命令明細,但目前資料來源需先定義。

候選來源優點風險
TaskNodeExecutionRecord已被 TaskStore 持有,可隨 Save 一起處理目前沒有 RawRequestSummary、RawResponseSummary、AdapterTimeTakenMs。若補欄位會改 public constructor / model。
WorkflowNodeExecutionSnapshot資料最完整,包含 RawRequestSummary / RawResponseSummary / AdapterTimeTakenMsSnapshot 只在 Workflow callback 當下存在,TaskStore 目前拿不到。
LogEntry已包含命令與 raw summary,可由 Log Writer 承接屬 Log 流,不是 TaskStore 流;需另建 DB LogWriter 或 TraceStore。

建議結論:

8. 詳細 log table 邊界

詳細 log table 建議不要由 MySqlTaskStore.Save 負責。

原因:

建議後續另立:

元件職責
MySqlLogWriterLogEntry 寫入 DB。
TaskTraceStore提供依 TaskId 查詢 log trace 的讀取介面。
task_log_traces保存任務相關 log / trace,不替代 file log。

第一版 detailed log table 建議只保存摘要與診斷欄位,不保存過大的完整 raw payload;若要保存完整 RawRequest / RawResponse,需先定義大小限制與遮蔽規則。

9. 交易策略建議

策略適用情境建議
單表 upsert目前 task_executions 第一版已完成。
task_executions + node_executions 同一 transaction保存任務摘要與節點摘要下一批建議。
task_executions + node_executions + command_executions 同一 transaction命令資料來源明確後後續再做。
log table 獨立寫入詳細 log / trace建議獨立,不阻塞 TaskStore Save。

node_executions 若與 task_executions 同批保存,建議採「先刪除同 task_id 舊節點,再插入目前 NodeRecords」或「以 task_id + sequence_no upsert」二選一。兩者都會影響 DB 寫入語意,需要實作前確認。

10. Schema / DDL 停止線

以下項目在使用者再次確認前不得執行:

11. 建議下一批實作順序

建議下一批先做「node_executions 實作前確認」,範圍如下:

12. 本次建議結論

建議採用「先節點、再命令、最後詳細 log」:

建議下一步做「MySQL TaskStore node_executions 實作前確認」,先固定欄位、索引、交易策略與測試範圍。

返回文件首頁