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.

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)

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.