gastownhall/beads · error

project update reported as unsuccessful

Error message

project update reported as unsuccessful

What it means

UpdateProject returns this when Linear responded with a well-formed ProjectUpdateResponse whose projectUpdate.success flag is false. The mutation was executed and answered, but Linear reported the update itself did not succeed.

Solutions

  1. Inspect the full GraphQL response for additional errors/messages accompanying success=false.
  2. Verify the API token has write permission (admin or appropriate project scope) for the workspace.
  3. Confirm the project is not archived or restricted in Linear.
  4. Re-fetch the project and retry the update in case of a transient conflict.
  5. Log updateResp to capture any 'lastSyncedAt' or error detail fields Linear returned.

Example fix

// before
if !updateResp.ProjectUpdate.Success {
	return nil, fmt.Errorf("project update reported as unsuccessful")
}
// after
if !updateResp.ProjectUpdate.Success {
	return nil, fmt.Errorf("project update reported as unsuccessful for project %s (id %s)", project.Name, project.ID)
}
Defensive patterns

Strategy: try-catch

Validate before calling

// pre-check: fetch project and confirm token can see it
proj, err := client.GetProject(ctx, id)
if err != nil || proj == nil {
	return fmt.Errorf("project %s not accessible with current token", id)
}

Try / catch

if _, err := client.UpdateProject(ctx, id, updates); err != nil {
	if strings.Contains(err.Error(), "reported as unsuccessful") {
		// inspect full response / permissions, then surface actionable message
		return fmt.Errorf("linear refused update to project %s: check token write scope", id)
	}
	return err
}

Prevention

When it happens

Trigger: Client.UpdateProject receives a response where updateResp.ProjectUpdate.Success is false — Linear accepted the request but reports the mutation failed (e.g. permission denied, no-op, entity-level validation).

Common situations: API token lacks write access to the project, project is in an archived/workspace-restricted state, another integration changed the project concurrently, Linear-side soft failures.

Related errors


AI-assisted analysis of gastownhall/beads@71377f2769 (2026-08-30). Data as JSON: /api/errors/e8f0029d664fb441. Report an issue: GitHub.

Appendix: source

Thrown at internal/linear/client.go:1588

		Query: query,
		Variables: map[string]interface{}{
			"id":    projectID,
			"input": updates,
		},
	}

	data, err := c.Execute(ctx, req)
	if err != nil {
		return nil, fmt.Errorf("failed to update project: %w", err)
	}

	var updateResp ProjectUpdateResponse
	if err := json.Unmarshal(data, &updateResp); err != nil {
		return nil, fmt.Errorf("failed to parse update project response: %w", err)
	}

	if !updateResp.ProjectUpdate.Success {
		return nil, fmt.Errorf("project update reported as unsuccessful")
	}

	return &updateResp.ProjectUpdate.Project, nil
}

View on GitHub (pinned to 71377f2769)