gastownhall/beads · error
metadata edit failed: %w
Error message
metadata edit failed: %w
What it means
Applying incremental set/unset metadata edits via storage.ApplyMetadataEdits failed. This wraps any error from applying the typed key/value edits to the current metadata document after the merge step.
Source
Thrown at internal/storage/issueops/update.go:912
}
if hasSet || hasUnset {
unset, err := mergeOpStrings(OpUnsetMetadata, updates[OpUnsetMetadata], hasUnset)
if err != nil {
return err
}
var merged json.RawMessage
if set, typed := updates[OpSetMetadata].(map[string]json.RawMessage); typed {
merged, err = applyTypedMetadataEdits(current, set, unset)
} else {
var set []string
set, err = mergeOpStrings(OpSetMetadata, updates[OpSetMetadata], hasSet)
if err != nil {
return err
}
merged, err = storage.ApplyMetadataEdits(current, set, unset)
}
if err != nil {
return fmt.Errorf("metadata edit failed: %w", err)
}
current = merged
}
// Validate the merged result, matching the schema check stores apply to
// direct metadata replacements (GH#1416 Phase 2).
if err := ValidateMetadataIfConfigured(current); err != nil {
return err
}
resolved["metadata"] = current
return nil
}
func applyTypedMetadataEdits(existing json.RawMessage, set map[string]json.RawMessage, unset []string) (json.RawMessage, error) {
data := make(map[string]json.RawMessage)
if len(existing) > 0 {
trimmed := strings.TrimSpace(string(existing))
if trimmed != "" && trimmed != "null" {
if err := json.Unmarshal(existing, &data); err != nil {View on GitHub (pinned to 71377f2769)
Solutions
- Check each key with storage.ValidateMetadataKey (or the equivalent CLI rules) before submitting
- Ensure the existing metadata is a valid JSON object; repair it with a full replacement first
- Read the wrapped %w cause for the specific key or document failure
Example fix
// before
updates[issueops.OpSetMetadata] = map[string]json.RawMessage{"bad key!": json.RawMessage(`1`)}
// after
updates[issueops.OpSetMetadata] = map[string]json.RawMessage{"priority": json.RawMessage(`1`) // key passes ValidateMetadataKey
} Defensive patterns
Strategy: validation
Validate before calling
for key := range set {
if err := storage.ValidateMetadataKey(key); err != nil {
return fmt.Errorf("skip update, invalid metadata key %q: %w", key, err)
}
} Try / catch
if err := issueops.ResolveMergeOps(issue, updates, resolved); err != nil {
if strings.Contains(err.Error(), "metadata edit failed") {
return fmt.Errorf("metadata set/unset rejected: %w", err)
}
} Prevention
- Pre-validate every metadata key against ValidateMetadataKey
- Confirm existing metadata is an object before set/unset edits
- Keep keys alphanumeric/dash/underscore to stay within rules
When it happens
Trigger: Calling an update with OpSetMetadata/OpUnsetMetadata where ApplyMetadataEdits fails — typically a key violating ValidateMetadataKey rules or an incompatible existing document.
Common situations: Using metadata keys with illegal characters or reserved prefixes, or applying set/unset edits to metadata that is not a JSON object.
Related errors
- ExternalDoltConfig: must set Socket or (Host, Port)
- metadata.repo: %w
- metadata.repo must not be null
- loading config for gate resolution: %w
- invalid metadata: %w
AI-assisted analysis of gastownhall/beads@71377f2769 (2026-08-30).
Data as JSON: /api/errors/bd5b8549670217ca.
Report an issue: GitHub.