multica-ai/multica · error

option %q not found on property %q; valid options: %s

Error message

option %q not found on property %q; valid options: %s

What it means

Thrown by `encodeIssuePropertyValue`'s `resolveOption` closure when the value passed to `--value` for a select/multi_select property does not match any option by ID or case-insensitive name. The message lists all valid option names for the target property to make correction immediate.

Source

Thrown at server/cmd/multica/cmd_property.go:450

// ---------------------------------------------------------------------------
// issue property {list|set|unset}
// ---------------------------------------------------------------------------

// encodeIssuePropertyValue converts the CLI --value string into the typed
// JSON the API expects, translating option names to ids for select types.
func encodeIssuePropertyValue(property propertyDTO, raw string) (json.RawMessage, error) {
	optionNames := make([]string, len(property.Config.Options))
	for i, opt := range property.Config.Options {
		optionNames[i] = opt.Name
	}
	resolveOption := func(ref string) (string, error) {
		ref = strings.TrimSpace(ref)
		for _, opt := range property.Config.Options {
			if opt.ID == ref || strings.EqualFold(opt.Name, ref) {
				return opt.ID, nil
			}
		}
		return "", fmt.Errorf("option %q not found on property %q; valid options: %s", ref, property.Name, strings.Join(optionNames, ", "))
	}

	switch property.Type {
	case "select":
		id, err := resolveOption(raw)
		if err != nil {
			return nil, err
		}
		return json.Marshal(id)
	case "multi_select":
		parts := strings.Split(raw, ",")
		ids := make([]string, 0, len(parts))
		for _, part := range parts {
			if strings.TrimSpace(part) == "" {
				continue
			}
			id, err := resolveOption(part)
			if err != nil {

View on GitHub (pinned to 2c0912b6ec)

Solutions

  1. Use one of the option names listed in the error message exactly (matching is case-insensitive, so casing is safe).
  2. Run `multica property list` (or `multica issue property list <issue>`) to see current options and their names.
  3. Update scripts that hard-code old option names after renaming options on a property.

Example fix

// before
multica issue property set ISS-1 --name Priority --value urgent
// error: option "urgent" not found on property "Priority"; valid options: P0, P1, P2

// after
multica issue property set ISS-1 --name Priority --value P0
Defensive patterns

Strategy: validation

Validate before calling

# bash: verify the option exists on the property before setting
multica property list | grep -qw "$OPT" || { echo "option $OPT not on property $PROP" >&2; exit 1; }

Type guard

func isValidOption(p propertyDTO, ref string) bool {
    ref = strings.TrimSpace(ref)
    for _, opt := range p.Config.Options {
        if opt.ID == ref || strings.EqualFold(opt.Name, ref) {
            return true
        }
    }
    return false
}

Prevention

When it happens

Trigger: `multica issue property set <issue> --name <select-prop> --value <bad>` where `<bad>` is neither an option ID nor an option name (case-insensitive). For multi_select, any comma-separated segment that fails resolution triggers it.

Common situations: Typo in an option name; option was renamed or archived after the script was written; using a display label that differs from the configured option name.

Related errors


AI-assisted analysis of multica-ai/multica@2c0912b6ec (2026-08-15). Data as JSON: /api/errors/499a74416bcea8be. Report an issue: GitHub.