{"record":{"id":"04e7ba68c54521bf","repo":"jackwener/OpenCLI","slug":"twitter-collection-page-delay-must-be-an-integer","errorCode":null,"errorMessage":"twitter collection --page-delay must be an integer between 0 and 60 seconds","messagePattern":"twitter collection --page-delay must be an integer between 0 and 60 seconds","errorType":"validation","errorClass":"ArgumentError","httpStatus":null,"severity":"error","filePath":"clis/twitter/collection.js","lineNumber":80,"sourceCode":"    }\n    return parsed;\n}\n\nfunction normalizeCollectionLimit(rawLimit) {\n    const limit = rawLimit ?? MAX_USER_TWEETS_LIMIT;\n    if (!Number.isInteger(limit) || limit < 1 || limit > MAX_USER_TWEETS_LIMIT) {\n        throw new ArgumentError(\n            `twitter collection --limit must be an integer between 1 and ${MAX_USER_TWEETS_LIMIT}`,\n            'Example: opencli twitter collection @jack --until 2026-07-23T00:00:00Z --limit 250',\n        );\n    }\n    return limit;\n}\n\nfunction normalizeCollectionPageDelaySeconds(rawDelay) {\n    const delay = rawDelay ?? DEFAULT_USER_TWEETS_PAGE_DELAY_SECONDS;\n    if (!Number.isInteger(delay) || delay < 0 || delay > 60) {\n        throw new ArgumentError(\n            'twitter collection --page-delay must be an integer between 0 and 60 seconds',\n            'Example: opencli twitter collection @jack --until 2026-07-23T00:00:00Z --page-delay 2',\n        );\n    }\n    return delay;\n}\n\nfunction unwrapTweetResult(result) {\n    if (!result) return null;\n    if (result.__typename === 'TweetWithVisibilityResults' && result.tweet) return result.tweet;\n    return result.tweet || result;\n}\n\nfunction relationshipTarget(result, fallbackId = null, contextStatus = 'complete') {\n    const tweet = unwrapTweetResult(result);\n    const user = tweet?.core?.user_results?.result;\n    const rawHandle = user?.legacy?.screen_name || user?.core?.screen_name || null;\n    const authorHandle = typeof rawHandle === 'string' && normalizeTwitterScreenName(rawHandle)","sourceCodeStart":62,"sourceCodeEnd":98,"githubUrl":"https://github.com/jackwener/OpenCLI/blob/49907e53dc3ade5c223ff0c4c2c2785687cec4e6/clis/twitter/collection.js#L62-L98","documentation":"normalizeCollectionPageDelaySeconds validates that --page-delay is an integer in [0, 60]; out-of-range, negative, fractional, or non-numeric values throw. This delay throttles pagination requests to stay polite to the X API; the default applies when the flag is omitted.","triggerScenarios":"opencli twitter collection --page-delay -1, --page-delay 61, --page-delay 1.5, --page-delay '2s', or scripts passing NaN/undefined-as-string values instead of an integer.","commonSituations":"Users assuming the flag accepts units ('2s', '500ms') or floats; wanting a longer cool-down than 60s for aggressive rate-limit avoidance; automation frameworks passing wrong types.","solutions":["Pass an integer number of seconds between 0 and 60, e.g. --page-delay 2","Omit --page-delay to use the built-in default delay","Strip units in scripts: pass Math.round(seconds) as a plain integer","If you need >60s between pages, implement an external loop that invokes the command repeatedly"],"exampleFix":"// before\n--page-delay 2s\n// after\n--page-delay 2","handlingStrategy":"validation","validationCode":"function validatePageDelay(n) {\n  return Number.isInteger(n) && n >= 0 && n <= 60;\n}\nif (!validatePageDelay(delay)) throw new Error('--page-delay must be an integer 0-60 (seconds, no units)');","typeGuard":"function isValidDelaySeconds(v) {\n  return typeof v === 'number' && Number.isInteger(v) && v >= 0 && v <= 60;\n}","tryCatchPattern":"try {\n  await run(['opencli','twitter','collection',handle,'--page-delay',String(delay)]);\n} catch (err) {\n  if (String(err.message).includes('--page-delay')) {\n    delay = 2; // documented default-ish safe value\n  } else throw err;\n}","preventionTips":["Pass bare integers — never '2s', '500ms', or floats","Convert any duration object to whole seconds before invoking the CLI","Cap external cooldown needs at 60s or loop the command externally","Omit the flag to use the built-in default delay"],"tags":["twitter","cli","validation","rate-limit","delay"],"backgroundTag":"invalid-cli-argument","analyzedSha":"49907e53dc3ade5c223ff0c4c2c2785687cec4e6","analyzedAt":"2026-08-29T08:14:47.543Z","schemaVersion":2},"datasetVersion":"2026-08-29T17:17:51.833Z"}