Skip to content

常见踩坑 ​

来自真实交付复盘。每条先写会出什么事,再写怎么做才对,并标出通常发生在哪一步。派发前可用文末清单快速自检。

1. 迁到错误分支 ​

发生在: same 的目标确认阶段。

出什么事: 说「开始迁移 / 交接到项目C…」后,Agent 在当前所在分支直接改,结果改到了发布分支。

怎么做:

  1. 先看每个目标仓:现在在哪条分支、是否干净、是不是这个任务的分支
  2. 不对就先切到正确功能分支,再改
  3. 禁止「人在哪就改哪」

→ same


2. 源仓库没提交就多项目派发 ​

发生在: dispatch 从预览进入正式派发时。

出什么事: 预览过了,一点真正派发就被拦住。

怎么做:

  1. 源仓库先 commit
  2. 再预览 → 你批准 → 再派发
  3. 被拦住时先补提交,不要强行派发

→ dispatch


3. 把「调度通过」当成「已经上线」 ​

发生在: dispatch 报告项目验收通过之后。

出什么事: 调度显示验收通过,但代码还没 push,也没合进 dev。

怎么做:

阶段意思
调度验收通过记录和证据齐了
远端落地还要 push,需要时用 end 合分支

4. 把 Grok 和 Codex 的用法抄反 ​

发生在: dispatch 选择宿主和工作方式时。

出什么事: 以为一定要开很多会话,或把两种工具的做法弄反。

怎么做:

工具日常习惯
Grok / Claude默认绑 一个会话;不同项目可同时改,同一项目仍串行
Codex可以按能力开多个会话 / 线程

细节见宿主说明。


5. 升级后对话里没有新命令(如 /jj-init) ​

发生在: 以前装过 jj-flow,后来包里多了新 skill。

出什么事: ~/.grok/skills 里有 jj-ralph / jj-same 等,但没有 jj-init。斜杠菜单也没有 /jj-init。旧版安装在已有文件时会整组拒绝写入。

怎么做:

bash
npx @brewer/jj-flow@latest install-skill --platform all

再次安装会补上缺失项,默认不覆盖已有文件;覆盖安装请加 --force。然后新开一轮对话,输入 /jj。


6. 回退时自动擅自改动 Git ​

发生在: dispatch 处理回退或重新打开交付时。

出什么事: 你说「回退某次交付」,Agent 直接 revert/reset,与你预期的干净历史不一致。

怎么做:

  1. 先处理调度记录(能否重开、能否再做)
  2. Git 先探测「推没推、合没合」→ 列选项给你 → 你点了再执行
  3. 本地干净未推常适合 reset;已推或已合常适合 revert;不会随意 force

→ dispatch


7. 只靠聊天就当「做完了」 ​

发生在: ralph 验收 / 归档或 dispatch 验收之后。

出什么事: 任务显示归档通过,但审查还开着问题;或任务说明还是旧状态。

怎么做:

  • 只看:任务记录、Git 提交、审查文件、调度记录
  • 还有未解决的中等问题,不要当作验收通过
  • 调度通过后,任务说明要和最新状态一致

→ 证据怎么算数


8. team 完成就当成验收通过 ​

发生在: team-coordinate / lifecycle / swarm 报告完成之后。

出什么事: team 提示 complete,就以为 ralph ACCEPT 或 dispatch VERIFIED 已经通过。

怎么做:

引擎产物算不算验收
team-coordinate动态角色协作产物不算
team-lifecycle规格 / 计划 / 实现产物不算
team-swarm候选方案 / 推荐不算

验收仍只认 ralph 的记录和证据,或 dispatch 的验收记录。team 产物可以写进证据里引用,但不会自动打开验收门。

→ team-coordinate、证据怎么算数


9. 以为每次都必须独占目录 ​

发生在: ralph / dispatch 开始选择工作区时。

出什么事: 每次都开单独 worktree,或反过来在脏的主分支上直接写。

怎么做: 默认在功能分支上改;只有要隔离时才单独目录。分支或工作区不确定就先问。


10. 把项目族角色名擅自改成 source / target ​

发生在: same / dispatch 解析目标项目时。

出什么事: 叫成 source / target 后指向错误仓库。

怎么做: 会话和调度里用稳定的项目族称呼(文档示例为项目A / 项目B / 项目C);用项目地图里的 path 对照,别靠别名猜。


11. 收工时把 staging 当成 dev ​

发生在: end 选择合入分支、打印收工计划时。

出什么事: 仓库里既有 dev 又有 staging,Agent 只因为历史提交或构建脚本里出现 staging,就把功能合进预发分支。

怎么做:

  1. 没写 integration=、文档 / naming.json 也没点名合入分支时:有 dev 就只合 dev
  2. git log、MR 标题、默认远端指向、功能分支来源、仓库里有 staging 分支、构建脚本名里带 staging,都不算约定
  3. 要合入预发必须写 integration=staging,或文档明确点名合入分支
  4. 执行前那一行 work → integration 要看得出依据,方便当场拦住

→ end

复盘(仓库内,站点不收录):docs/evaluations/EP-20260828-jj-end-staging-not-dev.md


12. 收工遇到冲突就整段放弃,或只解一半 ​

发生在: end 合并工作分支时。

出什么事: $jj-end 把「两边都在演进」的 Vue/文档冲突标成 complex,整段 merge --abort(feat/dynamic-form:AGENTS.md 策略段、readonly vs uploadDisabled、草稿恢复 helper、LOGO 条件)。或者只解了 import、业务函数还留着,半成品 merge。一有冲突就停也是同一类问题。

怎么做:

  1. 先打分类表:每个冲突文件 self-merge 或 unhandleable;拿不准的交给你判断
  2. 默认自行合并:能一句话说清如何合并、不发明产品决策 → 解完继续 push 合入(Vue/文档/条件守卫不同也算)
  3. 只有真正无法合并(同一产品开关两边相反且无法判断、二进制/密钥、读完仍无法陈述解法)→ merge --abort,回到工作分支,把表给你
  4. 不要只解子集再 abort;解完不能留下 <<<<<<<
  5. 第一眼「看起来复杂」不是停手理由,要读 hunk 和上下文再判

→ end


派发前 10 秒自检 ​

  • [ ] 源仓库已经 commit
  • [ ] 每个目标仓的分支对得上这次任务
  • [ ] 分支或目录拿不准时,已经问过
  • [ ] 说清楚要不要 push、要不要合进 dev

更细的复盘在仓库 docs/evaluations/(偏内部,日常上手不用读)。