ValidateImmutableTaskFields reports whether an update attempted to change immutable task fields.
(current Task, next Task)
| 1125 | |
| 1126 | // ValidateImmutableTaskFields reports whether an update attempted to change immutable task fields. |
| 1127 | func ValidateImmutableTaskFields(current Task, next Task) error { |
| 1128 | if !sameActorIdentity(current.CreatedBy, next.CreatedBy) { |
| 1129 | return fmt.Errorf("%w: %s", ErrImmutableField, TaskFieldCreatedBy) |
| 1130 | } |
| 1131 | if !sameOrigin(current.Origin, next.Origin) { |
| 1132 | return fmt.Errorf("%w: %s", ErrImmutableField, TaskFieldOrigin) |
| 1133 | } |
| 1134 | if current.Scope.Normalize() != next.Scope.Normalize() { |
| 1135 | return fmt.Errorf("%w: %s", ErrImmutableField, TaskFieldScope) |
| 1136 | } |
| 1137 | if strings.TrimSpace(current.WorkspaceID) != strings.TrimSpace(next.WorkspaceID) { |
| 1138 | return fmt.Errorf("%w: %s", ErrImmutableField, TaskFieldWorkspaceID) |
| 1139 | } |
| 1140 | if strings.TrimSpace(current.ParentTaskID) != strings.TrimSpace(next.ParentTaskID) { |
| 1141 | return fmt.Errorf("%w: %s", ErrImmutableField, TaskFieldParentTaskID) |
| 1142 | } |
| 1143 | return nil |
| 1144 | } |
| 1145 | |
| 1146 | // ValidateMetadataSize reports whether metadata JSON respects the shared 16 KiB guardrail. |
| 1147 | func ValidateMetadataSize(payload json.RawMessage, path string) error { |