stablyai/orca · error · Error

Linear attribute filters require a concrete workspace; "all"

Error message

Linear attribute filters require a concrete workspace; "all" workspaces is not supported.

What it means

Thrown by listIssues when an attributeFilter (state/member/label ids) is supplied together with workspaceId==='all'. Workspace-scoped ids cannot be safely fanned out across multiple workspaces, so the library rejects this combination before creating any client. It is a plain Error, not a LinearWriteFailure.

Source

Thrown at src/main/linear/issues.ts:1075

}

export async function listIssues(
  filter: LinearListFilter = 'assigned',
  limit = 20,
  workspaceId?: LinearWorkspaceSelection | null,
  options?: LinearIssueListOptions
): Promise<LinearCollectionResult<LinearIssue>> {
  const effectiveLimit = clampLinearIssueListLimit(limit)
  const attributeFilter = options?.attributeFilter
  // Why: workspace-specific state/member/label ids cannot fan out safely across
  // "all" workspaces; reject before creating clients so non-UI callers cannot
  // get a misleading partial subset.
  if (
    attributeFilter &&
    !isEmptyLinearIssueAttributeFilter(attributeFilter) &&
    workspaceId === 'all'
  ) {
    throw new Error(
      'Linear attribute filters require a concrete workspace; "all" workspaces is not supported.'
    )
  }
  const entries = getClients(workspaceId)
  if (entries.length === 0) {
    return { items: [] }
  }

  if (entries.length === 1) {
    return readListIssuesForWorkspace(entries[0], filter, effectiveLimit, workspaceId, options)
  }

  return readListIssuesAcrossWorkspaces(entries, filter, effectiveLimit, workspaceId, options)
}

export async function createIssue(
  teamId: string,
  title: string,

View on GitHub (pinned to 1136503c6a)

Solutions

  1. Resolve a single concrete workspace id before applying an attribute filter.
  2. If the user picked 'all', either clear the attributeFilter or run the query once per workspace with each workspace's own scoped ids.
  3. Validate at the call site that attributeFilter and workspaceId==='all' never travel together.

Example fix

// before
listIssues('assigned', 20, 'all', { attributeFilter: { stateIds: ['state-1'] } })
// after
const ws = resolveWorkspaceId(selection)
listIssues('assigned', 20, ws, { attributeFilter: { stateIds: ['state-1'] } })
Defensive patterns

Strategy: validation

Validate before calling

function assertConcreteForAttributeFilter(workspaceId: unknown, attributeFilter: unknown): void {
  if (workspaceId === 'all' && attributeFilter && !isEmptyAttributeFilter(attributeFilter))
    throw new Error('Resolve a single workspace before applying an attribute filter')
}

Type guard

function isAllWorkspaceFilterError(e: unknown): boolean {
  return e instanceof Error && e.message.includes('attribute filters require a concrete workspace')
}

Try / catch

try { listIssues('assigned', 20, selection, { attributeFilter }) }
catch (e) { if (isAllWorkspaceFilterError(e)) selection = pickConcreteWorkspace(); else throw e }

Prevention

When it happens

Trigger: Passing options.attributeFilter that is non-empty (per isEmptyLinearIssueAttributeFilter) while workspaceId is the literal string 'all'. Typically a multi-workspace UI selection combined with a state/assignee/label filter.

Common situations: UI defaulted to 'All workspaces' and the user applied a state or label filter whose ids only exist in one workspace; an agent or background job reused a default 'all' selection with scoped filters.

Related errors


AI-assisted analysis of stablyai/orca@1136503c6a (2026-08-12). Data as JSON: /api/errors/6924a310f2d47dbf. Report an issue: GitHub.