Skip to content

feat(subagent): 实现 Task Context Slice 与结构化结果契约#335

Merged
pionxe merged 4 commits into
1024XEngineer:mainfrom
Cai-Tang-www:feat(subagent)
Apr 17, 2026
Merged

feat(subagent): 实现 Task Context Slice 与结构化结果契约#335
pionxe merged 4 commits into
1024XEngineer:mainfrom
Cai-Tang-www:feat(subagent)

Conversation

@Cai-Tang-www

@Cai-Tang-www Cai-Tang-www commented Apr 17, 2026

Copy link
Copy Markdown
Collaborator

关联

Closes #277

本次改动

  • 新增 Task Context Slice 模型,输入收敛到任务目标、依赖产物、相关文件摘要、激活技能与 Todo 片段
  • 新增预算裁剪逻辑,按优先级保留进行中任务与关键依赖并限制上下文体积
  • 新增 descriptor 重建能力,支持 compact 后仅凭 descriptor + 当前快照 重建上下文
  • 调度器接入 Context Slice 构建,Worker 任务不再只携带 goal/acceptance
  • 统一子代理输出契约为强制六段:summary/findings/patches/risks/next_actions/artifacts

测试

  • go test ./internal/subagent -cover
  • go test ./internal/subagent ./internal/runtime

说明

  • 全量 go test ./... 在当前主线存在与本 PR 无关的既有失败(internal/configinternal/gateway),本 PR 未改动对应模块逻辑

@codecov

codecov Bot commented Apr 17, 2026

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 82.08191% with 105 lines in your changes missing coverage. Please review.

Files with missing lines Patch % Lines
internal/subagent/context_slice.go 80.73% 63 Missing and 42 partials ⚠️

📢 Thoughts on this report? Let us know!

fennoai[bot]

This comment was marked as outdated.

@Cai-Tang-www

Copy link
Copy Markdown
Collaborator Author

@xgopilot 你现在是本仓库的独立审查 Agent(只读审查,不改代码,不提交 commit,不 push)。

审查目标:

  1. 查错(逻辑 bug、边界条件、并发/状态问题)
  2. 查架构(分层边界、依赖方向、职责泄漏)
  3. 查漏洞(命令执行、路径穿越、权限绕过、敏感信息、SSRF/注入等)
  4. 做 reviewer 视角代码评审(按严重级别输出)

执行要求:

  1. 先同步代码并确认工作区状态,只读分析,不做任何代码修改。
  2. 至少执行并汇总以下检查(可按环境降级):
    • go test ./...
    • go test ./... -coverprofile=coverage.out
    • go vet ./...
    • staticcheck ./...(若可用)
    • govulncheck ./...(若可用)
  3. 重点关注模块:
    • internal/runtime
    • internal/tools
    • internal/security
    • internal/provider
  4. 对每个问题必须给证据:文件路径 + 行号 + 触发条件 + 影响范围。
  5. 禁止泛泛而谈;没有证据的问题不要报。

输出格式(严格):

  1. 【结论摘要】
    • 审查范围、执行了哪些检查、总体风险等级(高/中/低)
  2. 【问题列表】(按严重度排序:严重/中等/建议)
    • 严重度 | 模块 | 文件:行号 | 问题描述 | 复现方式 | 修复建议
  3. 【架构评审】
    • 是否存在跨层调用、职责泄漏、隐式依赖、重复逻辑
  4. 【安全评审】
    • 权限模型、输入校验、路径/命令安全、超时与输出限制
  5. 【测试与覆盖率评审】
    • 当前覆盖率、薄弱点、缺失测试清单
  6. 【建议的修复优先级】
    • P0 / P1 / P2 列表(每项一句话)
  7. 【无问题声明】(若确实无问题)
    • 明确写“未发现可确认问题”,并列出残余风险与盲区

@Cai-Tang-www

Copy link
Copy Markdown
Collaborator Author

@xgopilot 解决以上review的所有问题,然后把覆盖率补齐到90%以上,向我的分支推送pr

@fennoai

fennoai Bot commented Apr 17, 2026

Copy link
Copy Markdown
Contributor

完成结果

已按“以上 review”逐项修复并补测试,变更已推送到你的 PR 分支 feat(subagent)(commit: 523114e)。

主要修复

  • 修复 RebuildTaskContextSlice 重建漂移:现在强制按 descriptor.ArtifactRefs 过滤 DependencyArtifacts
  • 修复 TodoFragmentIDs 为空语义:重建路径改为严格白名单,空白名单即保留 0 个 fragment,避免范围扩张。
  • 优化调度热路径:新增 TaskContextSliceInput.ReadOnlyTodos,在 scheduler/rebuild 构建上下文时启用只读快照,避免每任务全量深拷贝 Todos
  • 补充回归测试:覆盖 artifact 白名单、空 todo 白名单语义、scheduler 只读快照传递、若干边界分支。

验证

  • go test ./internal/subagent ./internal/runtime 通过
  • go test ./internal/subagent -cover = 90.7%

未执行

  • 未运行 go test ./...(沿用 PR 说明:主线存在与本次改动无关的既有失败)

View job run

…clone cost

- enforce descriptor allowlists for artifact refs and todo fragments during rebuild
- treat empty todo fragment allowlist as explicit keep-none
- add read-only todo snapshot flag to avoid deep clone in scheduler hot path
- add regression tests and raise subagent coverage above 90%

Generated with [codeagent](https://github.com/qbox/codeagent)
Co-authored-by: Cai-Tang-www <106404101+Cai-Tang-www@users.noreply.github.com>
@phantom5099

Copy link
Copy Markdown
Collaborator

@xgopilot 先分析当前PR中可能存在哪些风险点,然后给我一个让AI能够进行review的提示词

@1024XEngineer 1024XEngineer deleted a comment from fennoai Bot Apr 17, 2026
@Cai-Tang-www

Copy link
Copy Markdown
Collaborator Author

@xgopilot 帮我修复上述的6个风险问题

@fennoai

fennoai Bot commented Apr 17, 2026

Copy link
Copy Markdown
Contributor

修复结果

已完成你提到的 6 个风险点修复,并已推送到当前 PR 分支 feat(subagent)

已推送提交:ac5d75c

本次修复

  1. 恢复 RequiredSections 生效语义
  • 修改 validateOutputContract:按 policy.RequiredSections 执行必填校验,不再固定强制 6 段。
  • 文件:internal/subagent/output_contract.go
  1. 修复 descriptor 空白名单语义导致的过度收缩风险
  • 新增 descriptor 可选字段规整逻辑:区分 nil(未指定,不过滤)与 [](显式空,过滤为空)。
  • todo/artifacts/skills/related_files 重建过滤统一采用该语义。
  • 文件:internal/subagent/context_slice.go
  1. 修复极小预算下上下文语义被清空风险
  • 预算裁剪时保证 Goal 不会被清空为 "",在极端情况下保留最小语义占位。
  • 文件:internal/subagent/context_slice.go
  1. 修复 Render 结构注入风险
  • 渲染前统一清洗动态文本(换行/控制字符折叠为空格),避免注入额外结构行。
  • 文件:internal/subagent/context_slice.go
  1. 降低预算裁剪热路径性能开销
  • 将字符计数从反复 Render() 改为直接结构化计数,避免多次大字符串构建。
  • 文件:internal/subagent/context_slice.go
  1. 增加 Task 与 ContextSlice 的一致性守卫
  • Task.Validate() 新增校验:若 ContextSlice.TaskID 非空,必须与 Task.ID 一致。
  • 文件:internal/subagent/types.go

新增/调整测试

  • internal/subagent/context_slice_test.go
    • nil/空白名单语义回归(todo/artifacts/skills)
    • 极小预算下 Goal 非空回归
    • Render 注入清洗回归
    • contextSliceRuneCountRender 长度一致性
  • internal/subagent/output_contract_test.go
    • 调整为“仅校验配置声明 section”语义
  • internal/subagent/types_test.go(新增)
    • Task.ValidateContextSlice.TaskID 一致性校验

验证

  • go test ./internal/subagent
  • go test ./internal/subagent -cover ✅(90.4%
  • go test ./internal/subagent ./internal/runtime

未执行

  • 未执行全量 go test ./...(沿用你在 PR 描述里的说明:主线存在与本 PR 无关的既有失败)。

View job run

Generated with [codeagent](https://github.com/qbox/codeagent)

Co-authored-by: Cai-Tang-www <106404101+Cai-Tang-www@users.noreply.github.com>
@phantom5099

Copy link
Copy Markdown
Collaborator

/review

@fennoai fennoai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

整体实现和测试覆盖都比较完整;我主要保留了 2 个值得修正的正确性问题。

})

slice.DependencyArtifacts = filterByAllowlist(slice.DependencyArtifacts, descriptor.ArtifactRefs)
slice.TodoFragment = filterTodoFragmentsByID(slice.TodoFragment, descriptor.TodoFragmentIDs)

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

RebuildTaskContextSlice 在 build 之后只按 descriptor 过滤了 DependencyArtifactsTodoFragment,但没有再过滤 RelatedFiles。由于 BuildTaskContextSlice 会把依赖产物重新合并进 RelatedFiles,这里会出现 descriptor 白名单绕过(例如 RelatedFilePaths 为空时仍可能返回 artifact 衍生文件)。建议在这里补一轮 RelatedFiles 的 allowlist 过滤,确保重建结果严格受 descriptor 约束。

slice.Goal = "…"
refreshChars()
}
if currentChars > maxChars && len(slice.Acceptance) == 0 && len(slice.TodoFragment) == 0 &&

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

这里的提前返回可能在“极小 maxChars”场景下把 Truncated=true 返回给调用方,但渲染结果仍然大于预算(task_id: 前缀本身不会被裁剪)。如果预算语义要求严格不超限,建议在返回前再做一次硬性上限校验/兜底策略。

@Cai-Tang-www

Copy link
Copy Markdown
Collaborator Author

/simplify

@fennoai

fennoai Bot commented Apr 17, 2026

Copy link
Copy Markdown
Contributor

处理结果

已完成你要求的 3 件事:检查未解决 review、按价值修复、并执行 code-simplifier 简化复审;改动已提交并推送到当前 PR 分支。

已修复问题

  • 修复 RebuildTaskContextSliceRelatedFiles 白名单绕过风险:在重建后新增一轮 descriptor.RelatedFilePaths 过滤,避免依赖产物合并导致越界回注。
  • 修复极小预算场景可能“Truncated=true 但仍超预算”的问题:新增极端预算硬收缩逻辑,确保渲染长度可被压到预算内。
  • 吸收 code-simplifier 建议:删除 enforceTaskContextBudget 中不可达的冗余分支,保持行为不变并简化实现。

新增测试

  • TestRebuildTaskContextSliceEmptyRelatedFileAllowlistMeansNone
  • TestBuildTaskContextSliceTinyBudgetNeverExceedsLimit

验证

  • go test ./internal/subagent ./internal/runtime 通过
  • go test ./internal/subagent -cover 通过(90.2%

提交与推送

未执行

  • 未执行 go test ./...(沿用该 PR 描述中的既有说明:主线存在与本次改动无关失败)

View job run

…dget cap

Generated with [codeagent](https://github.com/qbox/codeagent)
Co-authored-by: Cai-Tang-www <106404101+Cai-Tang-www@users.noreply.github.com>
@pionxe pionxe merged commit fedb351 into 1024XEngineer:main Apr 17, 2026
2 checks passed
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.

feat(subagent): 实现 Task Context Slice 与结构化结果契约

4 participants