/** A persisted timeslot may be backed by scanner runs, GPO assessments, or both. */ export function hasSelectedTimeslotScope(scanRunIds?: readonly string[], assessmentIds?: readonly string[]): boolean { return Boolean(scanRunIds?.length || assessmentIds?.length); } /** Stable local UI scope for one client state in Work. */ export function createWorkScopeId(projectId: string, scanRunIds?: readonly string[], assessmentIds?: readonly string[]): string { if (!scanRunIds?.length && assessmentIds?.length) { return `${projectId}::assessments::${[...new Set(assessmentIds)].sort().join('|')}`; } if (!scanRunIds?.length) return projectId; const runs = [...new Set(scanRunIds)].sort(); return `${projectId}::timeslot::${runs.join('|')}`; }