issues-batch-fix · git:20261005.8889a9b · 2026-10-05 · sha256 d3fb5932bed7027f
issues-batch-fix git:20261005.8889a9bA
Immutable. This exact content never changes and is served at /api/v1/blob/d3fb5932bed7027f.
--- name: issues-batch-fix description: Fix Browser4 test-issue reports under coworker/tasks/issues/draft via the locate-fix-verify-docs loop. Use when the user says 继续修复 #N 报告中的问题 or asks to fix the next dated .issues.md report. Not for unrelated bug fixes. --- # Issues 报告批量修复(Browser4 专属) 按批次修复 `coworker/tasks/issues/draft/` 下的测试问题报告。核心循环:读报告 → 静态定位 → 双端修复 → 定向验证 → 文档联动 → 批次总结。全程中文沟通。 ## 1. 定位报告 - 报告目录:`coworker/tasks/issues/draft/`,命名 `YYYYMMDD-HHMMSS-<slug>.issues.md`(同名 `.full.md` 为长版参考,一般不必读)。 - 用户说"继续修复 #N":先用 §6 进度表把 #N 映射到文件;映射不明或表未覆盖时,按文件名时间顺序列出未修报告候选,让用户确认后再动手。 - 编号可能跳过已在会话空档修过的报告。判断某候选是否已修的快速探针:取报告中一个标志性 issue 的代码指针(如某函数的回退逻辑),Grep 当前代码看修复是否已存在。探针确认已修后,把该报告移入 §6 已完成清单。 - 用户说"下一个报告":取时间顺序下一个未修报告,先报出文件名与 issue 数量。 - 批次范围以用户指定为准;历史批次(如 20260916/20/23-*)默认不在范围内,除非用户点名。 ## 2. 单 Issue 修复循环 1. 建 todo:id 用 `#N-<issue序号>`,逐个 issue 推进,完成即标 completed。 2. 静态定位:Grep/Read 双端排查 —— CLI(`cli/browser4-cli/src/`,Rust)与后端(`browser4-agentic/`、`browser4-rest/`、`browser4-core/`,Kotlin)。先找根因,再想修法。 3. 确认修复点是否在本仓:部分行为由外部 artifact 实现(如 pulsar-browser 的 AX 渲染器,版本锁在 `browser4-dependencies/pom.xml`),本仓不可改。此时用组合方案:CLI 侧文本后处理、executor 侧预检(大声失败)、文档如实化。 4. 修复原则:大声失败 —— 错误信息直达 CLI/用户,不静默吞错、不被重试机制包装;重试幂等;不回退上游错误语义;拿不准的边界显式报错而非静默 no-op。 5. 测试:主路径 + 边界各一。Rust 测试放 `main.rs` 底部 `mod tests`;Kotlin 测试放对应 `*Test.kt`(camelCase 方法名 + `@DisplayName`,禁 backtick 命名)。 6. 文档联动:公开行为变化必须同步 `skills/browser4-cli/SKILL.md`、`skills/browser4-cli/references/*.md`、`cli/browser4-cli/src/help.rs`、`tips.rs`(见 AGENTS.md 的 Documentation Update Rule)。 ## 3. 验证命令 PowerShell 环境,注意引号与 `-am` 陷阱: - Rust 单测:`cd cli/browser4-cli; cargo test --bin browser4-cli` - Kotlin 单测:`.\mvnw.cmd test -pl <module> -Dtest=<TestClass> "-Dsurefire.failIfNoSpecifiedTests=false"` - 不要加 `-am`:上游模块会报 No tests matching pattern - `-D` 参数必须加引号:PowerShell 会把点号参数拆开 - 跨模块编译确认:`.\mvnw.cmd -q -D"skipTests"` - e2e 仅编译确认:`cargo test --test e2e --no-run`;真跑需要后端在线(默认端口 18182) - 全绿才算完成;测试失败先定位根因,禁止 sleep 重试循环。 ## 4. 已知坑位(本仓实测教训) - 管道提前关闭:裸 `println!` 会 EPIPE panic → 用 `print_stdout_line`。 - 退出码语义(如 grep 零匹配 exit 1):用哨兵错误字符串向上传播 + 主错误处理器特判静默返回对应 ExitCode。 - 工具参数可能存 JSON 整数或字符串:容错读取(`as_i64` 优先,回退 `as_str().parse()`)。 - 字符串预处理的 trim 顺序:先 `trim_start()` 空白,再 `trim_start_matches(前缀符号)`,再 trim —— 顺序反了缩进行匹配不到。 - 需要真实浏览器 e2e 才能验证的 issue:有意暂缓,向用户说明理由与残余风险,不硬修。 - 下载/输出目录用绝对路径(如 `~/.browser4/downloads`),避免文件落进 bundle build 树。 - 修一个 `.ps1` 时检查同目录兄弟脚本是否有同样问题。 ## 5. 批次收尾 1. 所有 todo 标 completed 后,输出总结表:Issue 序号 → 级别 → 根因 → 修复方案 → 涉及文件 → 验证结果。 2. 更新 §6 进度表(把报告移入"已完成")。 3. 询问是否继续下一个报告。 ## 6. 批次进度(每完成一个报告后更新本节) 已完成(截至 2026-10-05,20261004 批次 18 个中的 17 个): - `20261004-150935-agent-extraction` - `20261004-151355-agent-status-result-tracking` - `20261004-152127-attach-failure-boundaries` - `20261004-153016-attach-remote-debug` - `20261004-160851-crawl-link-discovery`(其中 2 项需真实浏览器 e2e,有意暂缓) - `#24 20261004-161445-html-snapshot-extraction` - `#25 20261004-161908-headed-window-visibility` - `#26 20261004-162205-htmlsnapshot-inspect-discovery` - `#27 20261004-163201-loop-monitoring` - `#28 20261004-164400-plugin-captcha-detection` - `#29 20261004-165144-plugin-image-detection-download` - `20261004-165857-plugin-markdown-conversion`(#29/#30 之间空档修过;经 resolve_plugin_method 探针验证) - `20261004-171100-plugin-media-video-detection`(同批空档修过;经 ProbeResult: DirectValue 探针验证) - `#30 20261004-172853-plugin-pptx-generation` - `#31 20261004-173150-session-management` - `#32 20261004-173914-snapshot-mastery` - `#33 20261004-174324-tab-management`(Issue 1/2 空档已修并补回归测试;本轮补 Issue 3 友好错误与 Issue 2 关闭后当前 tab 提示) 待修候选: - `#34 20261004-174741-x-sql-query-methods`