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
- Inspect the full GraphQL response for additional errors/messages accompanying success=false.
- Verify the API token has write permission (admin or appropriate project scope) for the workspace.
- Confirm the project is not archived or restricted in Linear.
- Re-fetch the project and retry the update in case of a transient conflict.
- 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
- Grant the integration token write (not read-only) scope for the workspace.
- Avoid updating archived or restricted projects.
- Log the full GraphQL response, not just the success flag.
- Handle concurrent-modification by re-fetching before retrying.
- Monitor Linear workspace permission changes affecting the bot.
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
- work item creation failed: %s
- failed to create issue: %w
- issue creation reported as unsuccessful
- GraphQL error: %s
- failed to marshal request: %w
AI-assisted analysis of gastownhall/beads@71377f2769 (2026-08-30).
Data as JSON: /api/errors/e8f0029d664fb441.
Report an issue: GitHub.