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

  1. Check each key with storage.ValidateMetadataKey (or the equivalent CLI rules) before submitting
  2. Ensure the existing metadata is a valid JSON object; repair it with a full replacement first
  3. 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

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


AI-assisted analysis of gastownhall/beads@71377f2769 (2026-08-30). Data as JSON: /api/errors/bd5b8549670217ca. Report an issue: GitHub.