跳转至

应用宝活动平台 Harness 工程实践——从对话式 AI Coding 到工程化系统

📊 Level ⭐⭐⭐ | 13.0KB

原文归档:原文归档

腾讯应用宝活动平台(支撑应用宝内 app、pc、手助等产品所有日常/节假日活动)在生产环境中实践 Harness Engineering 的完整报告,详细记录了从对话式 AI Coding 走向工程化系统的路径、架构设计与实战经验。

一句话

应用宝活动平台团队在 90+ 微服务、800+ 文档、12 个专家 Agent 的生产规模下,用"知识库工程 ✖️ 端到端开发工程"双重架构,实现了从对话式 AI Coding 到系统化 Harness 工程的全流程落地。

从对话式 AI Coding 到 Harness 工程化

团队初期使用对话式 AI coding(CodeBuddy + Plan Mode、Rules + Prompt)开发,但随着项目复杂度提升暴露四大问题:

  • 单窗口上下文快速膨胀:每次启动已在塞知识/规则,多轮交互后上下文有损压缩
  • 缺乏完整的业务知识:每次需求依赖人捋清多服务串联关系喂给 AI
  • 缺乏工程自动化闭环:AI 只负责 coding,需求拆解/部署/验证仍需人工
  • 单窗口无法并行:多任务只能串行或开多个窗口人工切换

核心判断:任务越是完整、规模化、可抽象成稳定流程,对话式 AI coding 的弊端越明显,Harness 工程化的价值越高。

独特贡献

本文是当前 wiki 中 Harness Engineering 相关实体中最详细的生产级实现报告,提供了以下独特概念和实践机制:

1. 知识库工程子系统

在 Harness 综合实体 的基础上,本文贡献了一个可操作的知识库工程架构:

  • 三层目录结构:总览层(overview.md)→ 域层(meta.yaml + custom/)→ 服务层(8类自动生成文档 + custom/)
  • 8类自动生成文档:overview/interfaces/architecture/dependencies/storage/config/pitfalls/log,各有面向读者和内容规范
  • 知识自动生成流水线:gen-project-docs / batch-doc-generator 两个 skill,import 追踪 → proto 提取 → 增量融合保留人工批注
  • 接口活跃度标注:以伽利略平台调用量为指标判断接口活跃性
  • 渐进式加载检索:三层分层 + grep,4 种查询模式(需求拆解/技术方案/接口搜索/知识问答),替代传统 RAG
  • 文档新鲜度检测:meta.yaml 中 git_hash vs 仓库 HEAD hash 比对,超阈值触发增量更新

2. 状态文件驱动

区别于依赖对话历史传递上下文,本文提出了长链路状态化的关键实践:

  • product-state.json:多 Story 并行开发流程状态(breakdown → forking → joining)
  • e2e-state.json:单 Story 端到端流程 Phase 0-7
  • Hook 机制:Stop/SessionStart/SessionEnd 三事件注入脚本,强制流程确定性、跨会话断点恢复、清理残留

3. 12 专家 Agent 体系

设计原则——单一职责、上下文隔离、工具最小权限、确定性输入输出(结构化状态文件)、模型可插拔:

类别 Agent 职责
规划 product-analyst 需求拆解 + kb-query
规划 requirement-analyst 需求澄清 + 技术方案
规划 task-planner 任务拆解 + DAG 编排
执行 proto-engineer Proto 变更 + 桩代码
执行 backend-developer Worktree 开发
执行 code-fixer 复用性修复
验证 unit-tester 单测 + 覆盖率
验证 interface-verifier 接口验证 + 根因分析
验证 test-case-designer 用例设计
审查 code-reviewer Codar 评审(只评不改)
集成 publisher 发布 + 配置重启
集成 git-committer 提交 + MR

4. DAG 编排 + Fork-Join 并行模式

  • Worktree 隔离:task-planner 按 DAG 编排任务,同一层并发,git worktree 隔离,统一 merge
  • Fork-Join:R 阶段需求拆解 → Fork 段多子需求并行 Phase 1-4 → Join 段串行收口
  • 冲突治理四策略:Merge Conflict(事前文件隔离,不绕过)/ Shared file(收口串行)/ Proto 协议(前置串行统一生成)/ DB/配置(一次性前置确认)

5. 脚本化执行

"AI 负责认知,脚本负责执行"——前后沉淀近 15 个脚本将确定性操作固化:

  • e2e-dev.py(状态机解析执行)
  • worktree.sh / sub_worktree.sh(多 Agent 并行开发工作流)
  • build-and-publish.sh(编译发布)
  • kb-init.sh(知识库初始化更新)

6. DevOps 全流程集成

tRPC-Gateway(本地 AI 调内网接口)、Codar CR 流水线、TAPD/Rick/123/七彩石/伽利略等多平台能力集成。

7. 调度架构演进:从 Agent 驱动到强类型代码编排

团队在演进过程中做出两个关键调整:

  • 弃用主子 Agent 模式:改由外部主程序编排全局流程,hy3-preview 聚焦局部文档生成,Claude 负责高维度域综述
  • 弃用 Shell 脚本:大模型生成的 Shell 脚本常藏隐性语法错误,最终驱动层全面重构为 Go 代码

七条核心原则

本文提出贯穿整套 Harness 工程的核心原则,是已有的 Harness 综合实体 未覆盖的生产级判断准则:

  1. AI 负责认知,脚本负责执行
  2. 长链路必须状态化
  3. 知识库必须结构化
  4. Agent 必须职责隔离
  5. 执行步骤必须脚本化
  6. Workflow 比 Prompt 更重要
  7. 把 AI 当作工程系统来设计

开放性思考

TDD 在 AI 时代

TDD 落地不在代码层面,而是在接口测试用例上——一开始生成需求级测试用例(含输入输出预期),流程中基于用例构请求、判结果。

AI 工程架构分层

当前 AI 工程缺乏类似 MVC/DDD/Clean Architecture 的成熟架构方法论——Agent、Skill 之间如何组织、AI 工程与 AI 工具如何解耦、Agent 与 Skill 如何插拔式组合是亟待解决的问题。

代码还重要吗?

核心立场:核心在线业务系统仍需要人守住架构这条线——AI 代码腐化速度快、高质量代码和架构会反哺 AI、人对代码失去掌控后线上问题只能靠 AI 排查。但结果导向/容错率高的系统(如运营看板)适合 vibe coding 黑盒化。

参见 Code is cheap: Harness 方法论——水流理论、最小混沌单元与反 slop——前者从第一性原理推导 Harness 方法论,本文提供生产级实现细节,两者互补。本文也补充了 腾讯技术工程 Harness 探索之旅 中缺失的工程细节。

深度分析

状态即契约,而非进度日志

状态化起作用的不是落盘,而是把阶段变成可判定的契约:e2e-state.json 的 Phase 0-7 与 product-state.json 的 breakdown/forking/joining 构成两级状态机,子需求数 × 阶段数即状态爆炸。原文未定义状态守卫,把确定性押在 Agent 的确定性 IO 与 Stop hook 拦截"偷懒式停止"上——Hook 是兜底,schema 才是主约束;缺强类型状态,"这阶段算不算完成"的判定权就回到模型。故必须禁用项目级 Memory:它是第二份不受版本控制的状态,与状态文件争同一事实。这套 Harness 用放弃跨任务学习,换单次运行的可重放。

幂等边界按不可逆性划分

worktree 隔离先解决的是回滚:分支失败可整棵丢弃,爆炸半径压在一个任务内;代价是合并成为唯一不可幂等的步骤,Join 必须串行。冲突四策略的排序同理——事前文件隔离、收口串行、proto 前置单一写者、DB/配置一次性前置确认——判据是不可逆性而非实现难度,最后一项已无法回滚,只能交人。Mock 再把调度与生成耗时解耦,状态机可脱模重跑,这是重放便宜的前提。

专家 Agent 赢在控制流外置

长 prompt 只有一次有损压缩的机会。专家 Agent 的价值不在切得细,而在边界由工具最小权限划定:通用 Agent 握着全部工具,第 3 阶段的越权与第 5 阶段的正常操作在日志上无法区分,故障不可归因。更硬的证据是调度层回退——弃用主子 Agent,改由外部程序编排全局流程,驱动层从 LLM 生成的 Shell 重写为 Go。胜利的本质是把控制流从模型里拿出来,让 Agent 退化为纯函数。

重放要四个版本号,原文只钉住两个

状态落盘只给了可中断、可恢复、可观测的骨架,真重放还需脚本、知识库、模型三个版本坐标。meta.yaml 的 git_hash 对比 HEAD 服务于生成文档,不服务于执行需求:跑到 Phase 5 时知识库被增量更新,同一份状态会走岔;log.md 只审计知识生成。原文把评估体系列为下一步——缺口不在指标,而在"状态迁移→模型调用→产物"的三元组绑定,参见 Harness 可观测性的生产要求。

可迁移的是约束结构,不可迁移的是强类型 RPC 文化

可迁移的部分很硬:状态即接口、确定性下沉为脚本、worktree 限爆炸半径、按不可逆性排冲突、渐进式 grep 替代向量 RAG。不可迁移两处:proto-first 才使"前置串行、统一生成桩代码"成立,REST/GraphQL 团队得先自造契约工件;800+ 文档、90+ 服务摊薄了冷启成本,五个服务时三层目录先成负债。更隐蔽的是组织前提:能禁用 Memory、能前置确认 DB 变更的是全栈平台团队;跨团队只能协商接入点——结构可抄,约束不可抄。

标签

HarnessEngineering #腾讯 #应用宝 #生产实践 #知识工程 #状态驱动 #专家Agent #ForkJoin #冲突治理 #脚本执行 #DevOps集成 #TDD #代码架构