siyuan-note/siyuan · error

invalid new item template field value mode [%s]

Error message

invalid new item template field value mode [%s]

What it means

fieldValue.Mode is neither NewItemFieldValueCurrentTime nor NewItemFieldValueStatic. An empty Mode is silently defaulted to Static (new_item_template.go:319), so this branch only fires for an explicit, unrecognized mode string — typically a value from a newer or typo'd client.

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 251596fc0d)

Solutions

  1. Send one of the two canonical mode constants defined in the av package.
  2. Leave Mode empty ("") if you want the default Static behavior.
  3. Upgrade the kernel if a newer mode is required.

Example fix

// before
FieldValues["k"] = &av.NewItemFieldValue{Mode: "auto"}
// after
FieldValues["k"] = &av.NewItemFieldValue{Mode: av.NewItemFieldValueStatic}
Defensive patterns

Strategy: type-guard

Type guard

func isValidFieldValueMode(m string) bool {
    return m == "" || m == av.NewItemFieldValueStatic || m == av.NewItemFieldValueCurrentTime
}

Prevention

When it happens

Trigger: Client sends a future mode value the running kernel does not recognize; a typo in the mode string; corrupted payload or version skew.

Common situations: Version skew after a new mode is added on the client but the kernel is not upgraded; manually authored JSON with a wrong mode literal.

Related errors


AI-assisted analysis of siyuan-note/siyuan@251596fc0d (2026-08-12). Data as JSON: /api/errors/2c6b54ba06e5bba1. Report an issue: GitHub.