{"record":{"id":"e4ea1c933d0e5a62","repo":"jackwener/OpenCLI","slug":"nothing-changed-open-the-tweet-in-the-browser-and-e4ea1c","errorCode":null,"errorMessage":"Nothing changed. Open the tweet in the browser and retry.","messagePattern":"Nothing changed\\. Open the tweet in the browser and retry\\.","errorType":"exception","errorClass":"CommandExecutionError","httpStatus":null,"severity":"error","filePath":"clis/twitter/like.js","lineNumber":77,"sourceCode":"            await new Promise(r => setTimeout(r, 1000));\n\n            // Verify success by checking if the 'unlike' button reappeared\n            const verifyArticle = findTargetArticle() || targetArticle;\n            const verifyBtn = verifyArticle?.querySelector('[data-testid=\"unlike\"]');\n            if (verifyBtn) {\n                return { ok: true, message: 'Tweet successfully liked.' };\n            } else {\n                return { ok: false, unconfirmed: true, message: 'Like action was initiated but UI did not update as expected.' };\n            }\n        } catch (e) {\n            return { ok: false, unconfirmed: writeStarted, message: e.toString() };\n        }\n    })()`);\n        if (result.unconfirmed) {\n            throw new TimeoutError('twitter like confirmation', 1, `${result.message} Check the tweet before retrying; the like may already have succeeded.`);\n        }\n        if (!result.ok) {\n            throw new CommandExecutionError(result.message, 'Nothing changed. Open the tweet in the browser and retry.');\n        }\n        await page.wait(2);\n        return [{\n                status: 'success',\n                message: result.message\n            }];\n    }\n});\n","sourceCodeStart":59,"sourceCodeEnd":86,"githubUrl":"https://github.com/jackwener/OpenCLI/blob/49907e53dc3ade5c223ff0c4c2c2785687cec4e6/clis/twitter/like.js#L59-L86","documentation":"This CommandExecutionError is thrown when the like attempt completed without starting a write (unconfirmed is false) but returned ok:false, meaning the like definitively did not happen. The action failed cleanly, so the message advises opening the tweet in the browser and retrying.","triggerScenarios":"During `twitter like`, the in-page evaluate returned {ok:false, unconfirmed:false} — e.g. the like button/confirmation was never found, the write never started, and no exception escalated to the TimeoutError branch.","commonSituations":"Tweet is protected/deleted or the account cannot see it; already-liked state causing the button lookup to fail; Twitter DOM/selector changes; page loaded partially (primaryColumn present but the like control not rendered); logged-out or restricted session.","solutions":["Open the tweet in the browser to verify its visibility and current like state","Confirm the session is logged in and can interact with the tweet","Re-run `twitter like` once the page state is verified","Check the underlying result.message (the first argument) for the in-page failure reason","Update the library if Twitter changed its UI selectors"],"exampleFix":null,"handlingStrategy":"try-catch","validationCode":"// pre-check: confirm the tweet is visible and not already liked\nawait page.goto(target.url);\nawait page.wait({ selector: '[data-testid=\"primaryColumn\"]' });","typeGuard":null,"tryCatchPattern":"try {\n  await clis.twitter.like.func(page, { url });\n} catch (e) {\n  if (e.message.includes('Nothing changed')) {\n    // clean failure: inspect result reason, verify session/tweet, retry once\n  } else throw e;\n}","preventionTips":["Confirm the session can view/interact with the tweet (not protected/deleted)","Log the inner failure message (first constructor arg) for diagnosis","Update the library when Twitter changes its UI","Retry only after verifying page state in the browser"],"tags":["twitter","browser-automation","command-execution"],"backgroundTag":"twitter-action-not-confirmed","analyzedSha":"49907e53dc3ade5c223ff0c4c2c2785687cec4e6","analyzedAt":"2026-08-29T08:14:47.543Z","schemaVersion":2},"datasetVersion":"2026-08-29T17:17:51.833Z"}