{"record":{"id":"f1a727acebaeca16","repo":"multica-ai/multica","slug":"get-issue-w-f1a727","errorCode":null,"errorMessage":"get issue: %w","messagePattern":"get issue: %w","errorType":"console","errorClass":null,"httpStatus":null,"severity":"error","filePath":"server/cmd/multica/cmd_property.go","lineNumber":562,"sourceCode":"\t\t}\n\t\trows = append(rows, issuePropertyValueRow{\n\t\t\tPropertyID: p.ID,\n\t\t\tName:       p.Name,\n\t\t\tType:       p.Type,\n\t\t\tValue:      value,\n\t\t\tDisplay:    formatIssuePropertyValue(p, value),\n\t\t\tArchived:   p.Archived,\n\t\t})\n\t}\n\treturn rows\n}\n\nfunc fetchIssuePropertyBag(ctx context.Context, client *cli.APIClient, issueID string) (map[string]any, error) {\n\tvar issue struct {\n\t\tProperties map[string]any `json:\"properties\"`\n\t}\n\tif err := client.GetJSON(ctx, \"/api/issues/\"+issueID, &issue); err != nil {\n\t\treturn nil, fmt.Errorf(\"get issue: %w\", err)\n\t}\n\tif issue.Properties == nil {\n\t\treturn map[string]any{}, nil\n\t}\n\treturn issue.Properties, nil\n}\n\nfunc printIssuePropertyRows(rows []issuePropertyValueRow) {\n\theaders := []string{\"NAME\", \"VALUE\", \"TYPE\"}\n\ttableRows := make([][]string, len(rows))\n\tfor i, row := range rows {\n\t\ttableRows[i] = []string{row.Name, row.Display, row.Type}\n\t}\n\tcli.PrintTable(os.Stdout, headers, tableRows)\n}\n\nfunc runIssuePropertyList(cmd *cobra.Command, args []string) error {\n\tclient, err := newAPIClient(cmd)","sourceCodeStart":544,"sourceCodeEnd":580,"githubUrl":"https://github.com/multica-ai/multica/blob/2c0912b6ec764b373d44eeea1e80f0d9f11ab417/server/cmd/multica/cmd_property.go#L544-L580","documentation":"Returned by `fetchIssuePropertyBag` when the GET to `/api/issues/<issueID>` fails while fetching an issue's properties map. The %w wrap exposes the HTTP cause; note the issueID used is the already-resolved ID, so this is purely a transport/authorization/404 failure, not ref resolution.","triggerScenarios":"The issue was deleted between resolution and fetch, the token lost read access (401/403), or the server is unreachable — triggered by `issue property list/set/unset` flows that call this helper.","commonSituations":"Race in automation: issue moved/deleted mid-run; permission changes on the workspace; network blips or server restarts during long CLI scripts.","solutions":["If the wrapped error says 404, re-resolve the issue (`multica issue list`) — it was deleted or the ref is stale.","401/403 → refresh credentials / check workspace membership.","Network failure → confirm the API URL and server health, then retry the command."],"exampleFix":"// before\nmultica issue property list ISS-42\n// error: get issue: request failed: 404 not found\n\n// after\nmultica issue list | grep -i <summary>   # find the live issue ref\nmultica issue property list <live-ref>","handlingStrategy":"retry","validationCode":"# bash: confirm the issue exists before reading its properties\nmultica issue list | grep -qw \"${ISSUE%%-*}\" || { echo \"issue not visible\" >&2; exit 1; }","typeGuard":null,"tryCatchPattern":"if err := client.GetJSON(ctx, \"/api/issues/\"+issueID, &issue); err != nil {\n    if isTransient(err) { // network/5xx: retry with backoff\n        return retryGet(ctx, client, issueID, &issue)\n    }\n    return fmt.Errorf(\"get issue: %w\", err)\n}","preventionTips":["Resolve issue refs once and complete the operation promptly to avoid mid-run deletion.","Distinguish 404 (stale ref) from transport errors before retrying."],"tags":["go","cli","api","issue","network"],"backgroundTag":null,"analyzedSha":"2c0912b6ec764b373d44eeea1e80f0d9f11ab417","analyzedAt":"2026-08-15T13:25:18.241Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}