{"record":{"id":"2adcbe50ac578b6a","repo":"jackwener/OpenCLI","slug":"after-must-be-a-seq-number-or-messageid-uuid-go","errorCode":null,"errorMessage":"--after must be a seq number or messageId UUID (got \"${after}\")","messagePattern":"--after must be a seq number or messageId UUID \\(got \"(.+?)\"\\)","errorType":"validation","errorClass":"ArgumentError","httpStatus":null,"severity":"error","filePath":"clis/slock/message-read.js","lineNumber":50,"sourceCode":"  browser: true,\n  siteSession: 'persistent',\n  args: [\n    { name: 'channel', positional: true, required: true, help: 'channelId UUID, \"#name\", or \"#channel:msgIdOrShort\"' },\n    { name: 'after', help: 'Cursor: seq number or messageId UUID (exclusive)' },\n    { name: 'before', help: 'seq to page before' },\n    { name: 'limit', type: 'int', default: 50, help: 'Max messages' },\n    { name: 'no-threads', type: 'bool', default: false, help: 'Skip /threads enrichment' },\n    { name: 'server', help: 'Override active server' },\n  ],\n  columns: ['id', 'seq', 'createdAt', 'senderName', 'content', 'threadChannelId', 'replyCount', 'unreadCount', 'lastReplyAt'],\n  func: async (page, kwargs) => {\n    const channel = String(kwargs.channel ?? '').trim();\n    if (!channel) throw new ArgumentError('channel required');\n    const tt = classifyThreadTarget(channel);\n    const isUuid = UUID_RE.test(channel);\n    const after = kwargs.after !== undefined ? String(kwargs.after) : '';\n    if (after && !/^\\d+$/.test(after) && !UUID_RE.test(after)) {\n      throw new ArgumentError(`--after must be a seq number or messageId UUID (got \"${after}\")`);\n    }\n    const limit = parsePositiveInteger(kwargs.limit, '--limit', { defaultValue: 50 });\n    const before = kwargs.before !== undefined ? String(kwargs.before) : '';\n    if (before && !/^\\d+$/.test(before)) {\n      throw new ArgumentError(`--before must be a seq number (got \"${before}\")`);\n    }\n    if (before) parsePositiveInteger(before, '--before');\n    const noThreads = !!kwargs['no-threads'];\n    // R1 — pass the raw override through to authHeadersFragment; it owns the\n    // UUID-vs-slug resolution against /servers/ now.\n    const override = kwargs.server ?? null;\n\n    await page.goto(SLOCK_HOME_URL);\n\n    const params = {\n      isUuid, channel, after, before, limit, noThreads, override,\n      parentTarget: tt?.parentTarget ?? '',\n      parentMsgId: tt?.parentMsgId ?? '',","sourceCodeStart":32,"sourceCodeEnd":68,"githubUrl":"https://github.com/jackwener/OpenCLI/blob/49907e53dc3ade5c223ff0c4c2c2785687cec4e6/clis/slock/message-read.js#L32-L68","documentation":"message-read.js validates the optional `--after` cursor: it must be either a numeric sequence number (/^\\d+$/) or a messageId UUID (UUID_RE). Any other non-empty value throws this ArgumentError naming the offending value.","triggerScenarios":"Passing `--after` with a timestamp string, a non-UUID message id (slug/base64), a float like \"1.5\", or a seq with units (\"12s\").","commonSituations":"Using a createdAt ISO timestamp as a cursor; copying a message URL slug instead of the message UUID; locale-formatted numbers.","solutions":["Use the numeric message `seq` value or the full messageId UUID for --after.","If you have a timestamp, first fetch messages and use the closest seq/UUID as the cursor.","Strip stray whitespace/characters from the value before passing it."],"exampleFix":"// before\n--after 2026-08-29T10:00:00Z\n// after\n--after 8471   (or --after 6f1c2e34-9a0b-4c8d-8e2f-1a2b3c4d5e6f)","handlingStrategy":"validation","validationCode":"const UUID_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;\nif (after != null && after !== '' && !/^\\d+$/.test(String(after)) && !UUID_RE.test(String(after))) throw new Error(`--after must be a seq number or UUID, got: ${after}`);","typeGuard":"const isValidAfter = (v) => v === undefined || v === '' || /^\\d+$/.test(String(v)) || /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(String(v));","tryCatchPattern":"try { await readMessages(page, {...kwargs, after}); } catch (e) { if (String(e.message).startsWith('--after must be')) { console.error(`Bad --after cursor \"${after}\"; use seq number or messageId UUID`); } else throw e; }","preventionTips":["Use the numeric seq field from message output as cursor values","Never pass ISO timestamps to --after","Validate cursor formats in wrapper scripts before invoking"],"tags":["invalid-argument","validation","cli"],"backgroundTag":"invalid-argument-format","analyzedSha":"49907e53dc3ade5c223ff0c4c2c2785687cec4e6","analyzedAt":"2026-08-29T08:14:47.543Z","schemaVersion":2},"datasetVersion":"2026-08-29T12:17:43.993Z"}