vercel-labs/agent-skills · error · Error
SCOPE_UNRESOLVED
SCOPE_UNRESOLVED
Error message
SCOPE_UNRESOLVED: ${commandScope.detail} Run `vercel switch <team>` or re-link with `vercel link --yes --project <project-name-or-id> --team <team-slug>`. What it means
Thrown by main() when resolveCommandScope(project) returns {ok:false}. resolveCommandScope tries to map the project's orgId to a CLI-safe scope slug: for `team_` ids it checks whoami's currentTeam, then falls back to getTeamInfo(orgId); for `usr_` ids it derives the username from whoami. If neither path yields a usable slug (team API failed, or the linked user isn't the authed user), the command scope stays unresolved and the error embeds commandScope.detail.
Source
Thrown at skills/vercel-optimize/scripts/collect-signals.mjs:128
usage: null,
usageScope: null,
usageTeamTotal: null,
usageError: 'NOT_COLLECTED_UNSUPPORTED_FRAMEWORK',
stack,
metrics: {},
metricsSchema: null,
}, { usable: true, blocker: null, detail: 'Observability Plus was not checked.' }, frameworkSupport);
return;
}
if (!frameworkSupport.ok && continueUnsupportedFramework) {
log('continuing after unsupported framework blocker because --continue-unsupported-framework was set');
}
log('resolving Vercel CLI command scope…');
const commandScope = await resolveCommandScope(project);
if (!commandScope.ok) {
throw new Error(`SCOPE_UNRESOLVED: ${commandScope.detail} Run \`vercel switch <team>\` or re-link with \`vercel link --yes --project <project-name-or-id> --team <team-slug>\`.`);
}
const scope = commandScope.cliScope || undefined;
log(`command scope resolved (source=${commandScope.source}; scoped=${scope ? 'yes' : 'no'})`);
log('validating linked project belongs to the resolved scope…');
const projectCfg = await getProjectConfig(project.projectId, project.orgId);
const projectScope = validateProjectScope(projectCfg, project);
if (!projectScope.ok) {
throw new Error(`PROJECT_SCOPE_MISMATCH: ${projectScope.detail} Ask the user to confirm the exact Vercel project and team/personal scope, then rerun after \`vercel link --yes --project <project-name-or-id> --team <team-slug>\` or after setting both VERCEL_PROJECT_ID and VERCEL_ORG_ID for the intended scope.`);
}
log(`project scope verified (source=${projectScope.source})`);
log('checking Observability Plus configuration…');
const observabilityPlusConfig = await checkObservabilityPlusConfiguration({
orgId: project.orgId,
projectId: project.projectId,
});
log(`observabilityPlusPreflight=${observabilityPlusConfig.access === true ? 'enabled' : observabilityPlusConfig.blocker ?? 'unknown'} (${observabilityPlusConfig.source})`);View on GitHub (pinned to b8caa260a4)
Solutions
- Switch the CLI to the right team: `vercel switch <team-slug>`, then rerun.
- Re-link cleanly: `vercel link --yes --project <project-name-or-id> --team <team-slug>` so whoami's currentTeam matches.
- Verify the token has access to the owning team in the Vercel dashboard and regenerate if scoped too narrowly.
Example fix
# before $ node scripts/collect-signals.mjs -> SCOPE_UNRESOLVED: Could not resolve the linked team ID to a CLI scope slug. # after $ vercel switch acme-team $ vercel link --yes --project web --team acme-team $ node scripts/collect-signals.mjs
Defensive patterns
Strategy: validation
Validate before calling
const scope = await resolveCommandScope(project);
if (!scope.ok) {
throw new Error(`Cannot resolve CLI scope: ${scope.detail}. Run 'vercel switch <team>' or re-link.`);
}
// proceed only with scope.cliScope Type guard
function isResolvedCommandScope(s) {
return !!s && s.ok === true && typeof s.cliScope === 'string' && s.cliScope.length > 0;
} Try / catch
try {
const scope = await resolveCommandScope(project);
if (!scope.ok) throw new Error(`SCOPE_UNRESOLVED: ${scope.detail}`);
} catch (err) {
if (err.message.startsWith('SCOPE_UNRESOLVED')) {
// prompt user to `vercel switch` / re-link, then retry
}
throw err;
} Prevention
- Ensure the authed user has access to the owning team before running.
- Use `vercel switch <team>` so whoami's currentTeam matches the project owner.
- Grant the token team:read scope so getTeamInfo can resolve the slug.
When it happens
Trigger: The linked team id cannot be resolved via the teams API (permissions/access denied, network error); the authed user does not match the linked `usr_` id; currentTeam differs and the team lookup returned no slug.
Common situations: The CLI is logged into team A but the project belongs to team B and the user lacks access to team B; token lacks team:read scope; transient API failure during the teams lookup; user switched accounts and the link is stale.
Related errors
AI-assisted analysis of vercel-labs/agent-skills@b8caa260a4 (2026-08-13).
Data as JSON: /api/errors/385262e8cbd6a4d7.
Report an issue: GitHub.