jackwener/OpenCLI · warning · EmptyResultError
Check the username — LessWrong slugs are lowercase (e.g. "zv
Error message
Check the username — LessWrong slugs are lowercase (e.g. "zvi", "eliezer-yudkowsky")
What it means
resolveUserId looks up a LessWrong user by slug via GraphQL; if the response has no user._id, it throws EmptyResultError with a hint that LessWrong slugs are lowercase. This means the supplied username did not resolve to any user.
Source
Thrown at clis/lesswrong/_helpers.js:66
}
}`;
const data = await gqlRequest(query);
const tag = data?.tags?.results?.[0];
if (!tag?._id || !tag?.name)
return null;
return { _id: tag._id, name: tag.name };
}
export function resolveUserId(slug) {
const normalized = gqlEscape(slug.toLowerCase());
const query = `query UserProfile {
user(input: {selector: {slug: "${normalized}"}}) {
result { _id displayName slug }
}
}`;
return gqlRequest(query).then((data) => {
const user = data?.user?.result;
if (!user?._id) {
throw new EmptyResultError(`lesswrong user ${slug}`, 'Check the username — LessWrong slugs are lowercase (e.g. "zvi", "eliezer-yudkowsky")');
}
return { _id: user._id, displayName: (user.displayName ?? '') };
});
}
export function parsePostId(urlOrId) {
const trimmed = urlOrId.trim();
const match = trimmed.match(/posts\/([a-zA-Z0-9]+)/);
return match ? match[1] : trimmed;
}
View on GitHub (pinned to 49907e53dc)
Solutions
- Lowercase the username and replace spaces with hyphens (slug form)
- Verify the slug by visiting lesswrong.com/users/<slug> or the profile page URL
- Check for typos in the username
- If account was renamed/deleted, find the new slug from their posts or search
Example fix
// before const slug = username; // "Zvi" // after const slug = username.trim().toLowerCase().replace(/\s+/g, '-'); // "zvi"
Defensive patterns
Strategy: validation
Validate before calling
function toLwSlug(name){ const s = String(name).trim().toLowerCase().replace(/\s+/g,'-'); if(!/^[a-z0-9-]+$/.test(s)) throw new Error('invalid LessWrong slug'); return s; } Type guard
const isResolvedUser = (d) => typeof d?._id === 'string' && d._id.length > 0;
Try / catch
try {
const user = await resolveUserId(rawName);
} catch (e) {
if (e.name === 'EmptyResultError') {
const slug = rawName.trim().toLowerCase().replace(/\s+/g, '-');
return resolveUserId(slug); // retry with slug form
}
throw e;
} Prevention
- Always normalize usernames to lowercase-hyphen slugs
- Resolve slugs from profile URLs, not display names
- Check the account exists on lesswrong.com before lookup
- Handle renames by re-searching the display name
When it happens
Trigger: Calling the lesswrong user/resolve flow with a username whose slug does not exist, or with mixed case / spaces / display name instead of the URL slug, so data.user.result comes back null.
Common situations: Passing 'Zvi' instead of 'zvi'; using a display name like 'Eliezer Yudkowsky' instead of 'eliezer-yudkowsky'; typos; deleted or renamed accounts.
Understand the failure class
Background: "User not found", "Invalid user", and "does not exist": what missing-user lookup errors mean across Rocket.Chat, LiteLLM, Phabricator, rustfs, and pnpm — this error's family across 10 libraries.
Related errors
- lesswrong user ${String(kwargs.username)}: Check the usernam
- lesswrong comments: Post "${postId}" not found
- lesswrong read: Post "${postId}" not found
- lesswrong tag ${tagInput}: Use "opencli lesswrong tags" to l
- dongchedi search "${keyword}": No car series matched. Try th
AI-assisted analysis of jackwener/OpenCLI@49907e53dc (2026-08-29).
Data as JSON: /api/errors/d983edb268295486.
Report an issue: GitHub.