用 Skills 建立智能体可接手的软件项目知识库

发布于全文约5066字,阅读时间约为12分钟。

AgentSkillKnowledge Workflow知识管理协作
用 Skills 建立智能体可接手的软件项目知识库

在一个商业软件项目的实施过程中,我们开始尝试让智能体(Agent)进入真实的研发流程。

一开始,我们最关心的是它能不能读懂代码、完成修改、跑通测试。这样的工作通常很容易看到结果:文件变了,功能跑起来了,任务似乎也完成了。

真正让我们停下来重新思考的,是另一个反复出现的场景。

一个项目推进几周后,智能体接手新的任务。它读了 README,翻了 issue,又看了设计文档和最近的提交,然后很认真地问了一个团队已经讨论过几次的问题:这个功能到底是不是第一版范围?

答案当然存在。它可能在一次会议里,在某条 issue 的评论里,在一个已经关闭的 PR 里,也可能只存在于某位成员的记忆中。问题是,它没有进入一个后来的人和智能体都能稳定找到的位置。

这不是智能体不够努力,也不只是文档不够多。

常规的软件研发流程本身并没有失效。需求需要澄清,决策需要记录,任务需要拆解,验收需要证据,复盘需要回到项目里,这些做法的收益早已得到广泛认可。真正麻烦的是执行成本:项目一忙,文档维护最容易被延后;任务做完了,验证证据没有写回去;讨论形成了结论,却没有进入下一次接手时能读到的位置。

为了解决项目中反复出现的这些问题,我们开始把零散的知识维护动作整理成一组技能(skills),并把这套工作方法称为 knowledge-workflow。它并不是先被完整设计出来,再放进项目里执行;我们先针对信息误写、任务脱节和交付缺少证据等具体问题提出做法,再随着项目推进反复应用、调整和补充。

它不是一套新的软件工程方法,也不是要求团队多写几篇文档。它做的事情更朴素:让智能体在合适的阶段参与知识摄入、确认写入、交付规划、实现复核和状态报告,以更低的成本执行那些本来就应该执行的工程动作。

什么时候你会需要这套方法

不是每个项目都需要完整的知识工作流。如果项目只有一个 README、几个清楚的 issue,而且任务当天就能完成,引入更多结构反而可能增加负担。

这里的关键并不是人数。一人公司(OPC)或独立开发者,也可能同时维护产品、客户反馈、销售线索、技术债和发布计划。表面上只有一个人在工作,实际上已经有多条工作流同时推进。只要判断开始分散,知识库就会从“备忘录”变成“协作系统”,哪怕协作者暂时只有你和智能体。

当下面这些情况开始反复出现时,问题通常已经不只是缺少文档:

  • 需求、设计、架构、任务和测试分散在不同地方。
  • 团队经常需要重新解释“为什么当时这么决定”。
  • 智能体每次接手都读了很多文件,却仍然误解当前状态。
  • 任务板上有很多卡片,但看不出来源、依赖和验收条件。
  • 实现完成后,新发现的约束没有写回项目知识。

到这里,你需要的不是更长的提示词(prompt),也不只是更大的上下文窗口(context window)。你需要让项目知识有稳定的入口、明确的状态和可执行的维护规则,也需要让智能体知道:现在处在哪个阶段,具有什么权限,需要留下什么证据,什么时候必须停下来让人确认。

这些 Skills 不是一组松散的提示词

如果把需求整理、文档写入、任务规划、代码实现和项目检查全部塞进一个大提示词,智能体当然也能做一些事情。但很快就会遇到权限和责任混乱:它是在提出建议,还是在执行已经批准的写入?它是在汇报状态,还是在修改任务?发现一条新信息后,它应该先请求确认,还是直接把它写成项目事实?

所以,knowledge-workflow 并不是按“能生成什么内容”组织 skills,而是按工作阶段、写入权限和交付责任来组织。

在这个商业软件项目的实施过程中,这套方法经历了提出、应用、调整和总结,最终被整理为一组 Knowledge Workflow Skills。下面列出的是其中的主干:

环节Skills主要作用权限与产出边界
初始化与升级knowledge-workflow-admin初始化、检查和升级知识工作流配置仅面向维护者,配置变更需要明确批准
帮助与路由knowledge-assistant判断当前工作阶段,并路由到职责更窄的 skill不修改共享知识或任务状态
信息摄入knowledge-intake搜索已有知识,识别信息类型、冲突和缺口未经确认的信息不直接写入共享知识库
批准后的写入knowledge-capture按 schema、template 和 rules 更新知识只执行已经确认目标和内容的写入
知识与任务检查knowledge-schema-audittask-metadata-auditknowledge-status-report检查结构、引用、任务元数据和项目状态默认只读,修复先以建议或 dry run 形式给出
规划与看板delivery-planningnext-task-selectionkanban-maintenance推导候选任务、依赖和就绪状态,并维护 Kanban规划先预演,看板变更需要确认
实现与复核delivery-implementationdelivery-review按已接受任务执行交付,并检查结果和验证证据必须基于任务上下文工作,并报告可复核证据
个人执行workspace-worklist管理当前成员的本地工作清单、执行计划和过程日志只处理当前成员的本地状态,不写成项目事实

这张表真正重要的,不是 skill 的数量,而是边界。配置维护、共享知识写入、只读诊断、看板变更和个人执行被明确分开,智能体在进入下一步之前,必须先知道自己现在站在哪里。

先判断当前处在哪一步

入口 skill knowledge-assistant 不急着修改知识库。它先判断用户带来的内容更接近一条待确认信息、一次共享知识更新、一个交付任务,还是一次状态查询,再把工作路由给更窄的 skill。

这个入口看起来只是分流,实际解决的是一个很常见的问题:智能体一收到信息就开始执行。先判断阶段,意味着它要先弄清楚用户是在讨论、确认、交付,还是复盘。

待判断的信息和已批准的写入分开

knowledge-intake 负责知识摄入(intake)。它搜索已有内容,判断新信息可能属于需求、决策、反馈、风险还是任务,并指出冲突和缺口,但不擅自把讨论写成共享事实。

只有目标和内容得到确认后,knowledge-capture 才负责知识捕获(capture)。它按照现有结构定义(schema)、模板(template)和规则(rules)更新知识库,并保留来源、状态和必要链接。

两者分开后,智能体就不会因为“听起来很合理”,把一句临时想法直接升级成团队结论。

检查知识和修改知识分开

知识检查类 skills 默认只读。它们可以发现缺失的字段、断开的引用、没有来源的任务,以及缺少验证证据的完成项,也可以提出修复建议,但不会一边检查一边悄悄改写项目事实。

knowledge-status-report 也是如此。它负责把当前范围、未决问题、任务状态和知识健康重新摊开给人看。报告首先要可信,然后才谈修复。

规划建议和任务板变更分开

delivery-planning 先做任务规划预演(dry run)。它从需求、决策和验收意图中推导候选任务、依赖关系和就绪状态,但不直接改变看板(Kanban)。

只有人确认规划结果后,任务板维护 skill 才更新状态。这样,智能体可以承担整理和推导成本,又不会在用户还没看清计划之前替团队承诺范围。

实现和复核各自留下证据

delivery-implementation 从已经接受的任务出发,先读取来源知识和验收条件,再修改代码或文档。执行完成后,它需要报告改动、检查命令、测试结果、剩余风险,以及过程中发现的新约束。

delivery-review 则站在原始意图一侧重新检查结果。它关心的不只是代码能不能运行,也包括实现是否满足需求、验证证据是否充分、任务是否真的具备完成条件。

把实现和复核分开,是为了让“智能体说完成了”不再等同于“任务已经完成”。

这些 skills 放在一起,形成的不是一条僵硬流水线,而是一组可以组合的协作边界。不同项目可以裁剪其中的环节,但几个基本区别最好保留下来:讨论不等于事实,建议不等于批准,执行不等于完成;项目状态也不能只靠聊天记录来判断。

为什么不直接使用项目管理工具

谈到这里,一个很自然的问题是:既然 GitHub Issues/Projects、Jira、飞书项目已经能管理需求和任务,为什么还要在仓库里维护一层项目知识?

这些工具当然有价值。它们很适合做任务协作、状态流转、负责人分配、讨论通知和跨团队看板。很多团队也确实应该继续使用它们。

只是它们主要解决“任务如何被协作推进”,不一定解决“项目知识如何被长期维护和接手”。

一个 issue 可以记录一次讨论,一个 Jira ticket 可以承载一个需求,一个飞书项目任务可以推动一次交付。但几个月后,后来的人和智能体仍然需要判断:哪条评论是最终决策?这次状态变化背后的范围取舍在哪里?验收证据是否和代码、文档、测试一起留下来了?某条规则现在仍然有效,还是只属于当时的迭代?

知识工作流并不替代这些产品。任务可以继续在熟悉的工具里推进,仓库内的知识条目则保存外部链接、关键判断、可复核证据和维护规则。智能体接手时,可以先从项目知识层理解背景,再沿着引用进入 GitHub、Jira、飞书或设计工具查看过程材料。

外部工具负责推进协作,知识库负责沉淀可接手的上下文。两者结合,才更接近真实团队会长期使用的工作方式。

用一个软件项目看它怎么工作

为了不披露真实商业项目的具体信息,也不把这套方法讲成抽象流程,下面用一个模拟项目还原它的工作方式。

假设你和一个小团队正在开发 issue triage dashboard。它不是完整的项目管理平台,而是一个面向开源维护者的轻量工具:读取 GitHub issues,按类型、优先级、影响范围和可复现程度完成初步整理,再给出下一步处理建议。

项目开始时,手里的材料通常不会像需求文档那样完整,而是一些半成型信息:

  • 一段产品想法:维护者每天要处理大量 issue,希望先自动分组和初筛。
  • 几条用户反馈:有人关心 duplicate,有人只想找到 release blocker。
  • 一些技术判断:是否调用 GitHub API,是否需要本地缓存,是否接入大语言模型(LLM)做摘要。
  • 几个初始任务:搭建项目、定义分类、实现 dashboard、补测试、准备 release note。
  • 一些尚未确认的问题:先服务个人维护者还是小团队?先支持一个 repository 还是多个?

如果此时直接让智能体“开始做”,它大概率能写出一些代码。但真正决定项目能否继续推进的范围、假设和依赖,仍然没有稳定下来。

想法刚出现时,先不要急着写入

你可能对智能体说:

我们先做一个工具,帮维护者快速判断哪些 issue 是 bug、哪些是 duplicate、哪些需要更多信息。以后也许可以接 GitHub Actions,但第一版先在本地跑通。

如果没有阶段边界,智能体很容易把这段话当成直接任务:搭项目、写 dashboard、接 API。

进入 intake 后,它会先拆开这段话:这里有产品目标,有用户场景,有技术假设,也有潜在任务。它会搜索已有知识,确认是否已经存在类似需求或决策,并把需要人回答的问题摆出来:第一版是否只支持单 repository?是否保存 triage 结果?GitHub Actions 是明确延期,还是尚未决定?

这一步的价值不是多写几个文件,而是帮团队区分:什么已经可以成为项目事实,什么仍然只是方向,什么还需要确认。

范围确认后,再把知识写成稳定形状

当用户确认“第一版只做单 repository、本地运行、支持 issue 分类和优先级建议”之后,才适合进入 capture。

智能体可以把刚才的讨论写入几类稳定知识:

  • 在产品知识中记录第一版目标:帮助开源维护者快速处理 issue。
  • 在用户故事(user story)中记录典型场景:维护者打开 dashboard,看到需要优先处理的 issue 分组。
  • 在决策(decision)中记录范围取舍:第一版不接 GitHub Actions,不支持多个 repository。
  • 在任务(tasks)中记录候选工作:定义分类规则、读取 GitHub issues、实现 dashboard、补充测试。

这些分类不是固定套餐。团队可以按项目需要裁剪 schema、template 和 rules:哪些字段必须留下,哪些状态可以省略,哪些内容只能留在个人草稿,哪些判断一旦确认就必须进入共享知识库。

同样一句“第一版先在本地跑通”,留在聊天里很快会变成模糊记忆;写成 decision 后,后来的人就能知道:这不是忘了做 GitHub Actions,而是第一版明确不做。

文档堆保存内容,知识库还要保存判断。

准备交付时,任务不能只剩标题

很多任务板看起来井井有条,点进去却只有一行标题:“实现 dashboard 页面。”“接 GitHub API。”“补测试。”熟悉项目的人知道它们之间的关系,第一次接手的智能体并不知道。

在这个案例里,planning 不会根据一句“做 dashboard”直接改看板,而是从产品范围、用户故事、决策和验收意图中整理出一份预演:

候选任务来源知识建议状态说明
定义 issue 分类 schemaproduct scopeReady第一版必须先明确 bug、duplicate、needs-info 等
实现 GitHub issue 读取technical assumptionBacklog依赖认证方式和 API 限流判断
实现最小 dashboard 页面user storyBacklog依赖分类 schema 和 issue 数据结构
补充 triage 结果的测试用例acceptance intentBacklog需要先确定分类规则
评估 GitHub Actions 集成方案deferred decisionBacklog明确不属于第一版范围

用户确认后,看板才会更新。下一次选择任务时,智能体也可以根据依赖和就绪状态,推荐先定义 issue 分类 schema,而不是直接跳到 dashboard UI。

这时,任务板上的状态不再只代表“有人移动了一张卡片”,而是能够说明任务为什么存在、依赖什么,以及怎样才算完成。

执行任务时,留下可复核证据

当“定义 issue 分类 schema”进入 Ready 后,智能体先读取任务来源、验收条件(acceptance criteria)、相关 decision 和项目规则,再开始修改。

实现完成后,它带回来的不应该只有一句“已经完成”,还应该包括:

  • 修改了哪些文件。
  • 运行了哪些检查。
  • 哪些测试通过,哪些边界还没有覆盖。
  • 执行中发现了哪些新约束。
  • 是否需要更新产品知识、决策、任务或测试用例。

比如,原计划只有 bugduplicateneeds-info 几类,但测试数据里出现了大量功能建议(feature request)。这个发现不应该只停留在实现总结里。智能体需要提示用户:是把 feature request 纳入分类 schema,还是把它记录为第一版暂不支持的范围边界?

随后,复核(review)会检查本地差异、测试结果和完成就绪状态。你看到的不再是智能体对自己的评价,而是一组可以复核的证据。

项目推进后,重新看见全局状态

项目推进几轮后,团队往往会问:第一版到底还缺什么?哪些任务已经准备好?哪些决策仍然没有定?

knowledge-status-report 会从仓库里的项目知识和交付状态出发,汇总当前范围、任务依赖、未决决策,以及缺失的来源和验证证据。它不负责顺手修改这些内容,只负责让团队先看清项目现在处于什么位置。

这类报告真正有用的地方,是它不再重新总结最近一次聊天,而是在读取一个持续维护过的项目状态。

这套实践真正改变了什么

随着这套方法在项目中反复应用和复盘,我们越来越确定,knowledge-workflow 的价值并不是多了一组文档目录,也不是多了一批 skill 名称。

它首先把标准化要求落实到了可验证的文档里。schema 规定同类知识需要留下哪些内容,template 让新内容从正确形状开始,rules 则明确什么可以写、谁可以写,以及什么时候需要确认。项目规则不再只存在于成员的记忆和某次对话里。

它同时降低了维护这些文档的成本。过去需要人主动记得更新需求、补充证据、同步看板和回写新约束;现在,智能体可以在对应阶段提醒遗漏、整理材料、检查状态和执行更新,人则把精力放在确认事实、判断取舍和承担最终责任上。

改变的不是“要不要做软件工程”,而是那些已经被证明有效的工程动作,能不能在真实项目压力下持续发生。

后来,这些做法也在其他商业项目中得到进一步验证,并作为项目知识维护经验逐步推广到公司内部的其他团队。具体落地时,各团队会按自己的流程做相应裁剪;实践中发现的问题和改进建议,则通过反馈(feedback)机制回到维护团队,用于持续优化这些 skills 和配套流程。

下一次智能体接手项目时,真正决定它能否继续推进的,不只是代码和文件是否可读,而是项目是否留下了可判断的状态、可追溯的决策和可复核的证据。knowledge-workflow 让我们看到,智能体可以不只进入代码,还可以进入项目。