package projectinstance import ( "crypto/sha256" "encoding/hex" "encoding/json" "sort" ) func computePlanHash(plan WorkflowPlan) (string, error) { normalized := normalizePlan(plan) raw, err := json.Marshal(normalized) if err != nil { return "", err } sum := sha256.Sum256(raw) return hex.EncodeToString(sum[:]), nil } func normalizePlan(plan WorkflowPlan) WorkflowPlan { out := plan sort.Slice(out.Stages, func(i, j int) bool { return out.Stages[i].StageKey < out.Stages[j].StageKey }) for i := range out.Stages { sort.Slice(out.Stages[i].DocTasks, func(a, b int) bool { return out.Stages[i].DocTasks[a].TaskKey < out.Stages[i].DocTasks[b].TaskKey }) } return out }