# Cursor Debug Mode 教程：修复搜索结果被旧请求覆盖的竞态

## 身份和范围

本站原创 fixture 与人工参考；实际运行：700/100ms 真实竞态复现与修复。目标代理模型、账号会话、付费 API、第三方 PR、推送和发布均未执行。公开包不含 .env；需要时仅在自己的临时练习目录从文本模板创建。

## 本地命令

```sh
python3 -m http.server 4384 --bind 127.0.0.1
```

## 七步原生操作

### 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 可以减少请求，不能替代“旧响应永远不可覆盖新查询”的验收。

### 6. 重复三次并读取最终 DOM

本站 Playwright 对 broken/fixed 进行真实点击与等待，分别得到 a 与 ab；fixed 连续三次保持 ab，日志出现 ignored-stale。截图展示实际运行页面，不伪造 Cursor 模型执行日志。

### 7. 移除或降级临时调试日志

保存复现步骤、埋点字段和修复依据，产品实现中按需要清理日志。检查没有把用户输入或账号信息写入公开遥测；练习全是本地假查询。

## 验收产物

Debug Mode 假设、埋点和复现记录；取消旧请求或请求序号保护的具体修复，以及 a→ab 最终结果的重复验收

## 门槛

- 需要当前 Cursor 可用的 Debug Mode 与模型额度；以实际 mode picker 为准。
- 使用 localhost 假接口，所有日志去除真实账号与业务数据。
- 不将 debounce 当作竞态根因修复；验收需覆盖旧请求最后完成的情况。

## 官方来源

- https://prod.cursor.com/help/ai-features/debug-mode

静态配图冻结于本次输入。修改输入需重新运行并自行重渲染；不把旧截图当新结果。

## 可重复的浏览器检查

需 Node >=24。运行 `npm ci`，若缺少 Chromium，再按 Playwright 提示安装浏览器，然后 `npm run check`。只启动本地练习 HTTP 服务，不连接任何模型或账号。PDF 页数/中文需结合包内原生 PDF 逐页人工看。
