Skip to content

fix(worktree): 隔离子代理按自己的工作目录取值,越界可观测 - #434

Merged
njfuzrs merged 2 commits into
mainfrom
fix/subagent-worktree-cwd
Oct 24, 2026
Merged

njfuzrs merged 2 commits into
mainfrom
fix/subagent-worktree-cwd

Conversation

@njfuzrs

@njfuzrs njfuzrs commented Oct 24, 2026

Copy link
Copy Markdown
Owner

背景

withAgentCwd 只改 ALS、不 chdir,子代理里直接读 process.cwd() 的地方拿到的都是主仓根。

本机轨迹实测(2026-10-16~22,4 个会话、11 个 sub_agent(isolation:"worktree")):

  • 529 次带路径的工具调用里 501 次(约 95%)打在主仓绝对路径上
  • 9/11 个子代理第 1 轮就用了主仓路径
  • D13 隔离提示零次出现(判据拿到的是主仓路径,条件恒假)

改动

② 进程层(逻辑)

  • 子代理系统提示词 / spawn workdir / teammate cwd 改用 getCwd();隔离提示点名 worktree 根与主仓根
  • 子代理 JIT 以 getAgentRoot() 为项目根(原先加载的是主仓那份规则文件);jit-telemetry 相对路径按项目根解析
  • bash 在子代理里 cwd 失效时回退到自己的 root,root 也没了就报错不执行(原先静默回退到主仓,且 bash 不经过 W12)
  • checker 的 sed 目标解析与 LLM 分类器共用同一 cwd 口径(分类器原先用 process.cwd())
  • 隔离 worktree 路径判定收口到 cwd-context.splitIsolatedWorktreePath,W12 / D13 / digest 共用
  • 自定义子代理(executeCustom)新增 cwd 字段

③ 运行时层

  • lockfile 一致性告警覆盖 monorepo 子包的 node_modules symlink(原先只认顶层)

可观测 / 数据层

  • SubagentStart 新增 isolation / agent_cwd(agent_cwd 列入上传剥离名单)
  • jit_context 新增 isolated_worktree
  • sidechain_start 落盘子代理实际收到的系统提示词与 cwd(sidechain 仅本地,不上传)
  • digest 子代理段新增隔离越界口径:mainRepoPathCalls / absPathCalls,修复后应接近 0

trade-off:sidechain 多存一份系统提示词,本地磁盘略增(更省 ↔ 可观测);bash 在 root 失效时直接报错,比原先多一次失败(更安全优先)。

验证

  • 新增 packages/core/tests/agent/isolated-subagent-cwd.test.ts(13 条),digest / advisories 补用例
  • 每条修复都做了变异自证:改回旧行为后对应用例变红(提示词 cwd、JIT 根、bash 兜底 ×2、SubagentStart 字段、上传剥离、自定义路径 cwd、sidechain systemPrompt、end 无 start 守卫、digest 越界判据、monorepo lockfile)
  • bun run typecheck:gate(66/66 无新增)、lint、format:check、lint:boundary、lint:command-system、docs:gen-reference --check、make build 全部通过
  • 全量 bun test:17556 pass / 2 fail,两条均已举证与本改动无关:
    • R14 alt-screen 并发下 301s 超时,单独重跑 17/17 绿
    • prune-branch-builds 在 origin/main 上 5/5 绿;本地失败是因为分支最近几个 commit 恰是本机其它分支的 HEAD 被判 protected,CI 无这些分支

Agent Note:.agents/notes/implemented/bug-fix/2026-10-24-隔离子代理工作目录口径与可观测.md

🤖 Generated with Claude Code

njfuzrs and others added 2 commits October 24, 2026 19:11
withAgentCwd 只改 ALS、不 chdir,子代理里直接读 process.cwd() 的地方
拿到的都是主仓根。本机轨迹(2026-10-16~22,11 个隔离子代理):
529 次带路径工具调用里 501 次打在主仓绝对路径,D13 隔离提示零次出现。

逻辑:
- 子代理系统提示词 / spawn workdir / teammate cwd 改用 getCwd();
  隔离提示点名 worktree 根与主仓根
- 子代理 JIT 以 getAgentRoot() 为项目根,jit-telemetry 相对路径按根解析
- bash 在子代理里 cwd 失效时回退到自己的 root,root 也没了就报错不执行
- checker 的 sed 目标与 LLM 分类器共用同一 cwd 口径
- 隔离 worktree 路径判定收口到 cwd-context.splitIsolatedWorktreePath
- 自定义子代理新增 cwd 字段
- lockfile 一致性告警覆盖 monorepo 子包 node_modules

可观测 / 数据:
- SubagentStart 带 isolation / agent_cwd(agent_cwd 上传前剥离)
- jit_context 带 isolated_worktree
- sidechain_start 落盘子代理系统提示词与 cwd(仅本地)
- digest 子代理段新增隔离越界口径 mainRepoPathCalls/absPathCalls

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@njfuzrs
njfuzrs enabled auto-merge October 24, 2026 12:15
@njfuzrs
njfuzrs merged commit 819ee54 into main Oct 24, 2026
4 checks passed
@njfuzrs
njfuzrs deleted the fix/subagent-worktree-cwd branch October 24, 2026 12:24
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant