multica-ai/multica · error

resolve subscriber %q: %w

Error message

resolve subscriber %q: %w

What it means

Wraps any failure from resolveAssignee while resolving one --subscriber reference for an autopilot trigger. The inner error carries the actual cause: the GET request to look up the assignee failed, or the reference matched no member (resolveAssignee is constrained to assigneeKinds{member: true} here). The %q shows which ref failed.

Source

Thrown at server/cmd/multica/cmd_autopilot.go:751

	path := "/api/autopilots/" + autopilotRef.ID + "/triggers/" + triggerRef.ID
	if err := client.DeleteJSON(ctx, path); err != nil {
		return fmt.Errorf("delete trigger: %w", err)
	}
	fmt.Printf("Trigger %s deleted.\n", triggerRef.ID)
	return nil
}

func resolveAutopilotSubscriberInputs(ctx context.Context, client *cli.APIClient, refs []string) ([]map[string]string, error) {
	inputs := make([]map[string]string, 0, len(refs))
	seen := map[string]struct{}{}
	memberOnly := assigneeKinds{member: true}
	for _, ref := range refs {
		if strings.TrimSpace(ref) == "" {
			return nil, fmt.Errorf("--subscriber cannot be empty")
		}
		userType, userID, err := resolveAssignee(ctx, client, ref, memberOnly)
		if err != nil {
			return nil, fmt.Errorf("resolve subscriber %q: %w", ref, err)
		}
		if userType != "member" {
			return nil, fmt.Errorf("subscriber %q resolved to %s; autopilot subscribers must be members", ref, userType)
		}
		if _, ok := seen[userID]; ok {
			continue
		}
		seen[userID] = struct{}{}
		inputs = append(inputs, map[string]string{
			"user_type": "member",
			"user_id":   userID,
		})
	}
	return inputs, nil
}

// ---------------------------------------------------------------------------
// Helpers

View on GitHub (pinned to 2c0912b6ec)

Solutions

  1. Check the wrapped error text: 'no match' means the ref is wrong — verify the member exists with `multica member list`.
  2. If the wrapped error is a transport/auth failure, refresh the session (`multica auth login` or equivalent) and retry.
  3. Ensure the reference is a member, not an agent or team — subscriber resolution is member-only by assigneeKinds{member: true}.

Example fix

# before
multica autopilot trigger create --name t1 --subscriber jn doe
# after
multica autopilot trigger create --name t1 --subscriber "jdoe@example.com"
Defensive patterns

Strategy: validation

Validate before calling

# verify the member exists before creating the trigger
multica member list --output json | jq -e --arg s "$SUB" '.[] | select(.email == $s or .id == $s)' >/dev/null \
  || { echo "subscriber $SUB is not a resolvable member" >&2; exit 2; }
multica autopilot trigger create --name t1 --subscriber "$SUB"

Try / catch

if err := runAutopilotCreate(); err != nil {
    var re *cli.RunError
    if errors.As(err, &re) && strings.HasPrefix(re.Msg, "resolve subscriber") {
        // extract ref from message, verify membership, surface actionable hint
    }
    return err
}

Prevention

When it happens

Trigger: `multica autopilot trigger create --subscriber <ref>` where <ref> is neither an existing member's email/ID nor resolvable in the current workspace; or the API lookup request itself fails (auth expired, server unreachable).

Common situations: Typo'd or stale username/email after a member left the workspace; using an agent or team reference as a subscriber (only members allowed); expired CLI session token.

Related errors


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