{"record":{"id":"14f778915f4d7fd4","repo":"jackwener/OpenCLI","slug":"nothing-was-posted-open-the-tweet-in-the-browser","errorCode":null,"errorMessage":"Nothing was posted. Open the tweet in the browser and retry.","messagePattern":"Nothing was posted\\. Open the tweet in the browser and retry\\.","errorType":"exception","errorClass":"CommandExecutionError","httpStatus":null,"severity":"error","filePath":"clis/twitter/quote.js","lineNumber":163,"sourceCode":"            // Dedicated composer is more reliable than the inline quote-tweet button.\n            await page.goto(`https://x.com/compose/post?url=${encodeURIComponent(target.url)}`, { waitUntil: 'load', settleMs: 2500 });\n            await page.wait({ selector: '[data-testid=\"tweetTextarea_0\"]', timeout: 15 });\n\n            if (localImagePath) {\n                await page.wait({ selector: COMPOSER_FILE_INPUT_SELECTOR, timeout: 20 });\n                await attachComposerImage(page, localImagePath);\n            }\n\n            const result = await submitQuote(page, kwargs.text, target.id);\n            if (result.ok) {\n                // Wait for network submission to complete\n                await page.wait(3);\n            }\n            if (result.unconfirmed) {\n                throw new TimeoutError('twitter quote', SUBMIT_TIMEOUT_MS / 1000, `${result.message} Check your profile before retrying; the quote may already be live.`);\n            }\n            if (!result.ok) {\n                throw new CommandExecutionError(result.message, 'Nothing was posted. Open the tweet in the browser and retry.');\n            }\n            return [{\n                    status: 'success',\n                    message: result.message,\n                    text: kwargs.text,\n                    ...(kwargs.image ? { image: kwargs.image } : {}),\n                    ...(kwargs['image-url'] ? { 'image-url': kwargs['image-url'] } : {}),\n                }];\n        } finally {\n            if (cleanupDir) {\n                fs.rmSync(cleanupDir, { recursive: true, force: true });\n            }\n        }\n    }\n});\n\nexport const __test__ = {\n    buildQuoteComposerUrl,","sourceCodeStart":145,"sourceCodeEnd":181,"githubUrl":"https://github.com/jackwener/OpenCLI/blob/49907e53dc3ade5c223ff0c4c2c2785687cec4e6/clis/twitter/quote.js#L145-L181","documentation":"CommandExecutionError thrown when submitQuote returned result.ok === false, meaning the quote tweet definitively failed and nothing was posted. Unlike the unconfirmed/timeout case, no side effect occurred, so the fix message tells the user to open the tweet in the browser and retry.","triggerScenarios":"The submit flow detected explicit failure (post button click rejected, error state in the page, or validation failure in result.message) — submitQuote resolved with ok:false and a reason message.","commonSituations":"x.com showing 'Something went wrong' during posting; text/media rejected; rate limits or account restrictions on posting; DOM changes making the submit click ineffective; empty or oversized tweet text.","solutions":["Read the accompanying result.message for the concrete failure reason and fix the input (text length, media)","Retry the command after verifying the tweet was not posted","Manually perform the quote in the browser to check for account-level restrictions (rate limit, suspension)","Update the library if x.com UI changes broke the submit flow selectors"],"exampleFix":null,"handlingStrategy":"try-catch","validationCode":"if (!kwargs.text || kwargs.text.length > 280) {\n  throw new Error('Quote text must be 1-280 characters');\n}","typeGuard":null,"tryCatchPattern":"try {\n  await cli.run('twitter quote', kwargs);\n} catch (e) {\n  if (e instanceof CommandExecutionError && /Nothing was posted/.test(e.message)) {\n    // definitive failure: safe to retry after fixing the cause in e.message\n    logFailure(e.message);\n    throw e;\n  }\n  throw e;\n}","preventionTips":["Keep quote text within Twitter limits and media valid before submitting","Watch for account rate limits; space out submissions in batch runs","Inspect result.message for the concrete cause before retrying","Update the library if submit selectors break after x.com UI changes"],"tags":["post-failure","twitter-api","submission"],"backgroundTag":"post-submission-failed","analyzedSha":"49907e53dc3ade5c223ff0c4c2c2785687cec4e6","analyzedAt":"2026-08-29T08:14:47.543Z","schemaVersion":2},"datasetVersion":"2026-08-29T12:17:43.993Z"}