siyuan-note/siyuan · error

invalid new item template field value mode

Error message

invalid new item template field value mode [%s]

What it means

Field value modes are restricted to the known constants NewItemFieldValueStatic and NewItemFieldValueCurrentTime. Any other Mode string falls into the switch's default branch and rejects the configuration, because the template engine cannot interpret an unknown fill mode.

Solutions

  1. Set Mode to av.NewItemFieldValueStatic for fixed pre-filled values
  2. Set Mode to av.NewItemFieldValueCurrentTime (date fields only) for creation timestamps
  3. Leave Mode as empty string if unsure — it defaults to static automatically

Example fix

// before
fv.Mode = "now"
err := av.SetNewItemTemplates(config)
// after
fv.Mode = av.NewItemFieldValueCurrentTime
err := av.SetNewItemTemplates(config)
Defensive patterns

Strategy: validation

Validate before calling

if fv.Mode != av.NewItemFieldValueStatic && fv.Mode != av.NewItemFieldValueCurrentTime && fv.Mode != "" {
	return fmt.Errorf("unsupported mode %q", fv.Mode)
}

Prevention

When it happens

Trigger: Calling SetNewItemTemplates with FieldValues[keyID].Mode set to an unrecognized string (typo, empty handled separately by defaulting to static — so this requires an explicit unknown value such as "now" or "formula").

Common situations: Plugins inventing custom fill modes not supported by the kernel; configs written by a newer/older version using modes that no longer exist; hand-editing persisted JSON with a misspelled mode.

Understand the failure class

Background: Invalid enum value errors: "Unknown type", "Invalid scope", "must be one of" — when a string is not on the library's allowed list — this error's family across 23 libraries.

Related errors


AI-assisted analysis of siyuan-note/siyuan@9f775e8a12 (2026-09-19). Data as JSON: /api/errors/2c6b54ba06e5bba1. Report an issue: GitHub.

Appendix: source

Thrown at kernel/av/new_item_template.go:344

			}
			fieldValue.Value = nil
		case NewItemFieldValueStatic:
			if nil == fieldValue.Value {
				continue
			}
			fieldValue.Value, err = normalizeNewItemTemplateValue(fieldValue.Value, key)
			if nil != err {
				return fmt.Errorf("new item template field [%s] value is invalid: %w", keyID, err)
			}
			if KeyTypeSelect == key.Type || KeyTypeMSelect == key.Type {
				for _, selection := range fieldValue.Value.MSelect {
					if nil != selection && nil == key.GetOption(selection.Content) {
						return fmt.Errorf("new item template field [%s] option [%s] not found", keyID, selection.Content)
					}
				}
			}
		default:
			return fmt.Errorf("invalid new item template field value mode [%s]", fieldValue.Mode)
		}
		fieldValues[keyID] = fieldValue
	}
	if 0 == len(fieldValues) {
		itemTemplate.FieldValues = nil
	} else {
		itemTemplate.FieldValues = fieldValues
	}
	return nil
}

func normalizeNewItemTemplateValue(value *Value, key *Key) (*Value, error) {
	value = value.Clone()
	switch key.Type {
	case KeyTypeText:
		if nil == value.Text {
			return nil, errors.New("text value is missing")
		}

View on GitHub (pinned to 9f775e8a12)