展开本页目录
开始前准备什么
- 需要当前 Cursor 可用的 Debug Mode 与模型额度;以实际 mode picker 为准。
- 使用 localhost 假接口,所有日志去除真实账号与业务数据。
- 不将 debounce 当作竞态根因修复;验收需覆盖旧请求最后完成的情况。
- 用固定延迟复现而不是碰运气
- 从 Cursor 的模式入口选择 Debug
- 在三个真实阶段埋点
- 只修最后一次请求的提交资格
- 在运行时复核假设与修复
- 重复三次并读取最终 DOM
- 移除或降级临时调试日志
原创输入、提示词、原生配置、参考源码、实际结果和验收说明;不含模型账号或运行缓存。
按独立目录运行,原生代理会话需由自己另行执行。
1. 用固定延迟复现而不是碰运气
本地打开 app.html?mode=broken,点击“重放 a→ab”。a 延迟 700ms,ab 延迟 100ms,最后旧请求 a 覆盖最新查询 ab;等待至少 800ms 后再观察最终结果。
2. 从 Cursor 的模式入口选择 Debug
打开练习项目,在 Agent 模式选择器中选择 Debug Mode;实际版本也可按界面提示循环模式。描述输入顺序、延迟与错误结果,让代理先提出可证伪的请求乱序假设,不先大改组件。
3. 在三个真实阶段埋点
记录 request-start、response、commit 的 query、requestId 和时刻。复现后先看 ab 的 commit,再看 a 的后提交,确定问题在状态写回;不能把“接口返回慢”直接当成重试或加延迟的理由。
4. 只修最后一次请求的提交资格
切到 fixed 参考,sequence 递增并在响应后比较 id===sequence,旧请求只能记录 ignored-stale。AbortController 是另一种方案,但取消与过期结果保护的实际行为都需验证。
5. 在运行时复核假设与修复
让 Debug 会话读取真实日志和 diff,确认只改变提交条件,不修改 700/100ms 输入真值。debounce 可以减少请求,不能替代“旧响应永远不可覆盖新查询”的验收。
本地练习命令
python3 -m http.server 4384 --bind 127.0.0.16. 重复三次并读取最终 DOM
本站 Playwright 对 broken/fixed 进行真实点击与等待,分别得到 a 与 ab;fixed 连续三次保持 ab,日志出现 ignored-stale。截图展示实际运行页面,不伪造 Cursor 模型执行日志。
7. 移除或降级临时调试日志
保存复现步骤、埋点字段和修复依据,产品实现中按需要清理日志。检查没有把用户输入或账号信息写入公开遥测;练习全是本地假查询。
怎样确认已经完成
- 700/100ms 真实竞态复现与修复应能按 README 在独立目录重现。
- 目标代理真实结果须另存;人工参考、原生会话和官方示例分别识别。
常见问题
搜索越快结果越乱,Cursor 怎么找到旧请求覆盖?
记录 request-start、response、commit 的 query、requestId 和时刻。复现后先看 ab 的 commit,再看 a 的后提交,确定问题在状态写回;不能把“接口返回慢”直接当成重试或加延迟的理由。
AI 修搜索竞态,怎么证明不是加个延迟碰运气?
本站 Playwright 对 broken/fixed 进行真实点击与等待,分别得到 a 与 ab;fixed 连续三次保持 ab,日志出现 ignored-stale。截图展示实际运行页面,不伪造 Cursor 模型执行日志。
本题哪些结果已经实际运行?
已运行的是700/100ms 真实竞态复现与修复。原生功能操作按官方文档编排,目标代理未调用;英文检索可用“Cursor Debug Mode stale async search response race condition”定位对应术语,但这不是搜索量或热榜声明。



