multica-ai/multica · error

get issue

Error message

get issue: %w

What it means

The issue reference resolved, but the GET to /api/issues/{id} itself failed. Unlike the pull-requests variant the ID here is inserted without url.PathEscape, but resolution has already produced a server-issued ID, so the failure is again transport, auth, or an HTTP error status (e.g. the issue disappeared between resolution and fetch, returning 404).

Solutions

  1. Read the wrapped error's HTTP status: 404 → the issue was deleted, re-resolve from a fresh list; 401/403 → fix token/scope; 5xx/connection → restore server and retry.
  2. Re-run `multica issue list` to confirm the issue still exists in the current workspace.
  3. For batch scripts, handle per-issue failures without aborting the whole batch.
Defensive patterns

Strategy: retry

Try / catch

# distinguish deleted (404, don't retry) from transient (5xx, retry)
 for i in 1 2 3; do
   out=$(multica issue get "$REF" 2>&1) && break
   case "$out" in *404*|*401*|*403*) echo "$out" >&2; exit 1;; esac
   sleep $((i*2))
 done
 echo "$out"

Prevention

When it happens

Trigger: Running `multica issue get <ref>` with valid auth but the server unreachable; token expired; the issue deleted by a concurrent session after resolution (404); insufficient permission on that specific issue (403).

Common situations: Race between list/get scripts and cleanup jobs; long-lived tokens expiring mid-batch; permissions differing per issue in shared workspaces.

Related errors


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

Appendix: source

Thrown at server/cmd/multica/cmd_issue.go:822

}

func runIssueGet(cmd *cobra.Command, args []string) error {
	client, err := newAPIClient(cmd)
	if err != nil {
		return err
	}

	ctx, cancel := cli.APIContext(context.Background())
	defer cancel()

	issueRef, err := resolveIssueRef(ctx, client, args[0])
	if err != nil {
		return fmt.Errorf("resolve issue: %w", err)
	}

	var issue map[string]any
	if err := client.GetJSON(ctx, "/api/issues/"+issueRef.ID, &issue); err != nil {
		return fmt.Errorf("get issue: %w", err)
	}

	output, _ := cmd.Flags().GetString("output")
	if output == "table" {
		actors := loadActorDisplayLookup(ctx, client)
		assignee := formatAssignee(issue, actors)
		startDate := strVal(issue, "start_date")
		if startDate != "" && len(startDate) >= 10 {
			startDate = startDate[:10]
		}
		dueDate := strVal(issue, "due_date")
		if dueDate != "" && len(dueDate) >= 10 {
			dueDate = dueDate[:10]
		}
		headers := []string{"KEY", "TITLE", "STATUS", "PRIORITY", "ASSIGNEE", "START DATE", "DUE DATE", "DESCRIPTION"}
		rows := [][]string{{
			issueDisplayKey(issue),
			strVal(issue, "title"),

View on GitHub (pinned to 2c0912b6ec)