jackwener/OpenCLI · warning · EmptyResultError

No forum found with id "${forum}". Confirm the forum id from

Error message

No forum found with id "${forum}". Confirm the forum id from openreview.net.

What it means

The reviews command first fetches the root note of the forum (/notes?id=<forum>) to anchor the reply thread. If that query returns no notes, the forum id does not correspond to any public note, and EmptyResultError is thrown before fetching replies.

Source

Thrown at clis/openreview/reviews.js:108

    strategy: Strategy.PUBLIC,
    browser: false,
    args: [
        { name: 'forum', positional: true, required: true, help: 'OpenReview forum id (same as paper id)' },
        { name: 'max-length', type: 'int', default: 4000, help: 'Per-row text truncation (min 200)' },
    ],
    columns: ['type', 'author', 'rating', 'confidence', 'text'],
    func: async (args) => {
        const forum = requireForumId(args.forum, 'forum');
        const rawMax = args['max-length'] ?? args.maxLength ?? 4000;
        const maxLength = coerceInt(rawMax);
        if (!Number.isInteger(maxLength) || maxLength < 200) {
            throw new ArgumentError('openreview reviews max-length must be an integer >= 200');
        }
        const rootJson = await openreviewFetch(`/notes?id=${encodeURIComponent(forum)}`, `openreview paper ${forum}`);
        const rootNotes = Array.isArray(rootJson?.notes) ? rootJson.notes : [];
        const root = rootNotes[0];
        if (!root) {
            throw new EmptyResultError('openreview', `No forum found with id "${forum}". Confirm the forum id from openreview.net.`);
        }
        const repliesJson = await openreviewFetch(`/notes?forum=${encodeURIComponent(forum)}&details=replies&limit=1000`, `openreview reviews ${forum}`);
        const replies = Array.isArray(repliesJson?.notes) ? repliesJson.notes.filter(note => note?.id !== forum) : [];
        // Sort by cdate (creation time) so ordering is deterministic regardless of API order.
        const sorted = [...replies].sort((a, b) => (a?.cdate ?? 0) - (b?.cdate ?? 0));
        const ordered = [root, ...sorted];
        return ordered.map((note) => {
            const isRoot = note?.id === forum;
            const type = classifyNote(note, isRoot);
            const author = authorFromSignatures(note?.signatures);
            const rating = readContent(note?.content, 'rating');
            const confidence = readContent(note?.content, 'confidence');
            const text = truncate(joinSections(note?.content), maxLength);
            return {
                type,
                author,
                rating: rating === undefined || rating === null ? '' : String(rating),
                confidence: confidence === undefined || confidence === null ? '' : String(confidence),

View on GitHub (pinned to 49907e53dc)

Solutions

  1. Re-copy the forum id from the openreview.net paper URL (?id= parameter)
  2. Confirm the paper loads publicly in a browser on openreview.net
  3. Use the openreview search command to find the paper and get its correct id
  4. Try the review-thread id only if it is the root forum id — replies are not valid forum ids

Example fix

// before
openreview reviews --forum WRONGID
// after (resolve id via search first)
openreview search "paper title"   # take the id column
openreview reviews --forum <id-from-search>
Defensive patterns

Strategy: try-catch

Validate before calling

if (typeof forum !== 'string' || forum.trim().length < 10) {
    throw new Error(`Forum id looks invalid: ${forum}`);
}

Type guard

function isLikelyForumId(v) {
    return typeof v === 'string' && v.trim().length >= 10 && /^[A-Za-z0-9_-]+$/.test(v.trim());
}

Try / catch

try {
    const reviews = await reviewsCommand({ forum });
} catch (err) {
    if (err instanceof EmptyResultError) {
        console.error('Forum not found; verify the root paper id on openreview.net.');
    } else {
        throw err;
    }
}

Prevention

When it happens

Trigger: openreviewFetch('/notes?id=<forum>') succeeds but json.notes is empty — the given forum id matches no public OpenReview note.

Common situations: Mistyped or truncated forum id from a paper URL; paper withdrawn or restricted (not publicly visible); using a review/reply id instead of the forum (root paper) id; venue moved to OpenReview API v2 where ids differ.

Understand the failure class

Background: EmptyResultError / "no results found": when an API or scraper succeeds but returns zero rows — this error's family across 9 libraries.

Related errors


AI-assisted analysis of jackwener/OpenCLI@49907e53dc (2026-08-29). Data as JSON: /api/errors/0bfaec7fe6a4fd1e. Report an issue: GitHub.