stablyai/orca · error · LinearWriteFailure
failed
failed
Error message
Linear relation creation failed
What it means
Thrown by createLinearIssueRelation when the GraphQL issueRelationCreate response lacks success===true or lacks the created issueRelation node. The mutation reached Linear and came back, but Linear reported failure (or returned an unexpected shape). Encoded as LinearWriteFailure kind 'failed'.
Source
Thrown at src/main/linear/issue-relation-mutation.ts:46
const DELETE_RELATION_MUTATION = `
mutation OrcaLinearDeleteIssueRelation($id: String!) {
issueRelationDelete(id: $id) { success }
}
`
export async function createLinearIssueRelation(
client: LinearClient,
input: { issueId: string; relatedIssueId: string; type: string }
): Promise<RawRelationNode> {
const raw = await runRelationMutation(() =>
client.client.rawRequest<RelationMutationResponse, Record<string, unknown>>(
CREATE_RELATION_MUTATION,
{ input }
)
)
const created = raw.data?.issueRelationCreate
if (created?.success !== true || !created.issueRelation) {
throw new LinearWriteFailure('failed', 'Linear relation creation failed')
}
return created.issueRelation
}
export async function deleteLinearIssueRelation(
client: LinearClient,
relationId: string
): Promise<void> {
const raw = await runRelationMutation(() =>
client.client.rawRequest<RelationMutationResponse, Record<string, unknown>>(
DELETE_RELATION_MUTATION,
{ id: relationId }
)
)
if (raw.data?.issueRelationDelete?.success !== true) {
throw new LinearWriteFailure('failed', 'Linear relation removal failed')
}
}View on GitHub (pinned to 1136503c6a)
Solutions
- Verify issueId and relatedIssueId are valid, existing Linear issue ids.
- Confirm the relation type is one Linear accepts for that issue pair.
- Ensure the API token has write permission on both issues.
- Inspect raw.data?.issueRelationCreate for Linear's error detail; fall back to the Linear web UI if the SDK hides it.
Example fix
// before
await createLinearIssueRelation(client, { issueId, relatedIssueId, type: 'BLOCKS' })
// after
const validTypes = ['blocks','isBlockedBy','duplicate','relatesTo']
if (!validTypes.includes(type)) throw new Error('bad type')
await createLinearIssueRelation(client, { issueId, relatedIssueId, type }) Defensive patterns
Strategy: try-catch
Validate before calling
const validTypes = ['blocks','isBlockedBy','duplicate','relatesTo']
if (!validTypes.includes(input.type) || !input.issueId || !input.relatedIssueId) throw new Error('invalid relation input') Type guard
function isLinearWriteFailure(e: unknown): e is LinearWriteFailure {
return e instanceof Error && (e as LinearWriteFailure).name === 'LinearWriteFailure'
} Try / catch
try { return await createLinearIssueRelation(client, input) }
catch (e) {
if (e instanceof LinearWriteFailure && e.kind === 'failed') { await refreshRelations(input.issueId); throw e }
throw e
} Prevention
- Validate relation type and both issue ids before calling.
- Ensure the token has relation write scope on both issues.
- Surface raw.data?.issueRelationCreate details for Linear's rejection reason.
When it happens
Trigger: Linear rejects the relation input — invalid issueId/relatedIssueId, an unsupported relation type, a cyclic/disallowed relation, or a permission error returned as success:false. Also when the schema changes and issueRelationCreate no longer returns the expected node fields.
Common situations: User links two issues across teams/permission boundaries. Relation type string is wrong (case-sensitive). Issue was deleted between selection and create. API token lacks write scope for relations.
Related errors
AI-assisted analysis of stablyai/orca@1136503c6a (2026-08-12).
Data as JSON: /api/errors/778279e047101244.
Report an issue: GitHub.