📱

Get Our Mobile App

Take your business learning on the go!

Download on the App StoreGet it on Google Play

Spec-Driven Development: Agentic Coding at FAANG Scale and Quality — Al Harris, Amazon Kiro

AI Engineer1:03:50

Transcription

如果您还不了解我们,Kira 是一个代理式 ID。嗯,我们最近的星期一,我想是 17 号,正式全面上市,但我们在 7 月份,呃,我想是 7 月 14 号,推出了公开预览。所以,已经上市几个月了,收集客户反馈,嗯,所有这些好东西。我们将讨论使用 Spectriven 开发来磨砺您的 AI 工具箱。我做了个举手。这里大约有四分之一的人熟悉 Spectrum 和 Dev。我叫 Al Harris。嗯,亚马逊的首席工程师。我一直在从事 Curo 的工作。呃,我们是一个非常小的团队。我们基本上是三四个人挤在一个壁橱里,做我们认为可以改善客户软件开发生命周期的事情。所以,我们被委托构建一个开发工具,该工具能够改善 Spectrum 和开发体验。我们理论上是由支持 QDV 等事物的组织资助的,但我们故意与 QE 系统采用了截然不同的产品套件,只是对这些事情采取了不同的看法。所以,我们想在扩展方面下功夫,你知道,帮助您将 AI 开发扩展到更复杂的问题。提高您对 AI 代理的控制程度,并提高代码质量和维护——我应该说,您从管道另一端获得的东西的可靠性。现在我们回到新内容。嗯,所以我们的解决方案是 specri。我们看了一些现有的东西,然后说,“嘿,Vibe 编码很棒,但 Vibe 编码很大程度上依赖于我作为操作员正确地处理事情。那就是我给系统设置护栏。那就是我将代理置于一种严格的工作流程中。我们希望 Spectri 驱动的开发能够代表完整的 SDLC,因为我们拥有 25 到 30 年的行业经验,构建软件,良好地构建它,并使用不同的实践来构建它,对吧?我们经历了瀑布模型到 XP,我们有所有这些不同的方式来表示系统应该做什么,我们想有效地尊重之前发生的事情。所以,这个动画看起来好多了。最初只是左边的菱形,但我的想法是,你知道,你基本上是在迭代一个想法。我认为软件开发的一半是需求发现。而这种发现不仅仅是通过坐着思考系统应该做什么,系统能做什么来完成的。我们在研究这个的过程中意识到,让这些系统工作的最好方法是实际综合输出并能够非常快速地反馈回来。例如您的输入需求,以实际完成设计和反馈,你知道,意识到哦,实际上,如果我们这样做,这里会有一个我们没有考虑到的副作用,我们需要将其反馈给输入需求,因此 SDLC 的这种压缩演变成为了将结构引入软件开发流程。我们想利用您在设计过程中生成的工件,那就是产品经理或开发人员编写的需求,那就是验收标准,在这个结束时成功是什么样的,然后我们想要设计工件,您可能会与您的开发团队审查,您可能会与利益相关者审查,说我们将构建和实现这个东西,我们希望确保您可以在一个紧密的内部循环中完成所有这些。嗯,最终,这就是 spectriven dev 最初的样子,或者至少在它上市之前,spectriven development in hero 今天是什么样子,或者至少在它上市之前是什么样子,就是你给我们一个提示,我们会将其转化为一套清晰的需求和验收标准。我们将这些验收标准表示为 EARS 格式。EARS 代表需求语法的简便方法。嗯,这让您非常容易地——它有效地是一种结构化的自然语言表示,您希望系统做什么。现在,在产品存在的最初四个半月里,ears 格式看起来是我们做出的一个有趣的决定,但只是那种有趣的。嗯,随着我们周一的全面上市,我们终于开始推出一些副作用,那就是基于属性的测试。嗯,现在您的 ears 需求可以直接转换为系统的属性,这些属性有效地是我们希望交付的不变量。嗯,对于那些过去曾经或喜欢——我猜没有——进行过基于属性的测试的人,使用类似 Python 中的 hypothesis 或 Node 中的 fast check 的东西。closures spec library 是另一个例子。这些是测试您的软件系统的方法,您实际上是在尝试生成一个单一的测试用例,该测试用例会证伪您想要证明的不变量。如果您能找到任何反例,那么您可以说这个需求没有得到满足。如果您不能,您就有很高的信心,这里的“高”这个词起着一点点重要的作用,因为这取决于您编写测试的水平,但您可以很有信心地说,系统完全按照您所说的在做。嗯,是的,所以一个属性,我们稍后会更深入地讨论基于属性的测试和 PBT,但这是我们正在采取的许多步骤中的第一步,实际上是将这些结构化的自然语言需求与整个流程一直连接到最终代码,并说如果您的代码——如果代码的属性满足初始需求,我们就有很高的信心您已经可靠地交付了您期望交付的软件。所以,通过 spectriven dev,我们获取您的提示,将其转化为需求,从中提取设计,定义系统属性,然后构建任务列表并执行,您可以运行您的任务列表。有效地,规范就变成了您系统的自然语言表示。它有约束,它有关于功能需求、非功能需求的关注点,并且它是您交付的这套工件。所以,我不认为我在这套幻灯片中有,但最终,我如何看待 spec 是,它是一套代表您系统在某个时间点 t 的状态的工件。它是我们推动您完成的结构化工作流程,以可靠地交付高质量软件,那就是需求、设计和执行阶段。然后,它是建立在此之上的工具和系统集,帮助我们交付可重现的结果,其中一个例子是基于属性的测试。另一个例子,虽然不太明显,但我们可以稍后讨论,将是——我甚至不知道该怎么称呼它——需求验证。所以,我们扫描您的需求是否存在歧义。我们扫描您的需求是否存在无效约束,例如,您有冲突的需求,我们使用经典的自动化推理技术帮助您解决这些歧义。嗯,我可以多谈谈 Kira 的一些功能。我认为这可能对这次讲座不太有趣,因为我们想谈论 Spectrum 和 Dev。但我们拥有您期望的所有东西。我们有转向,也就是记忆和光标规则。我们有 MCP 集成。我们有图像等等。嗯,所以我们有方法,我们有软件钩子。嗯,所以让我们来谈谈如何磨砺您的工具链。我在这里稍作休息。呃,请稍作停顿,让房间里那些可能尝试下载 Curo 或其他东西的人,并问现在是否有任何问题,然后我们再深入探讨如何实际使用 spec 来实现目标?没有问题。这可能是一个好兆头。可能意味着我没有谈论任何特别有趣的事情。嗯,我实际上想在这里具体谈谈。这是我几个月前关于如何在 Kira 中使用 MCP 的讲座。所以,那些尝试过 Kira 的人遇到的挑战之一,也许更容易看到的是,他们觉得我们推给他们的流程有点太结构化了,比如你无法访问外部数据,你无法访问所有其他你想要的东西。所以,我们在这里朝着您的……哦,对了,这有点乱,这是我漂亮的 AI 生成的图片。所以,您可以使用 MCP。我假设这里每个人现在都熟悉 MCP。但是,Curo 集成 MCP 的方式与其他工具一样。但我认为人们做得不够的是在构建 spec 时使用他们的 MCP。所以,您可以在 spec 驱动开发工作流程的任何阶段使用您的 MCP 服务器。这将是需求生成、设计和实现。嗯,您可以使用,我们将通过每个阶段的示例进行介绍。所以,首先,在 Kuro 中设置 spec 是相当直接的。我们有 Kuro 面板,那里有一个小幽灵。然后您可以向下滚动到您的 MCP 服务器并单击加号按钮。您也可以直接问 Kirro 添加 MCP,然后提供一些关于它在哪里以及它通常可以从中找出信息的信息,或者您只提供 JSON 块,它就会找出答案。一旦您添加了 MCP,您就会在下面的控制面板中看到它,您可以启用它、禁用它、允许列表工具、禁用工具等。所以,您可以这样管理上下文。值得注意的是,更改 MCP 和更改工具通常是一个缓存操作。所以,如果您在一个漫长的会话中很深入,也许不要调整您的 MCP 配置,因为它会大大减慢您的速度。但让我们来谈谈 MCP 的 spec 生成。所以,我 Curo 团队使用一个……出于我不知道的原因,但它是我们选择的任务跟踪器。所以,我想做的一件事是,也许去说我不想从头开始编写 spec 的需求。我的产品团队已经做了一些思考。我们已经在 Asana 中进行了迭代,以分解项目。事情并不总是这样,但有时是这样。所以,在这种情况下,我在 Asana 中有一个任务。哦不,我做错了。这就是我缩放的代价。所以,我在 Asana 中有一个任务,说为我的开放 Asana 任务添加视图模型和控制器。在这种情况下,这是一个演示应用程序,我可以在几分钟内解决。我们甚至有一些细节,关于我们想要发生的事情。现在我可以进入 Kira 并说开始执行 Asana 的任务 XYZ URL,Kira 将识别这是一个 Asana URL。我安装了 ASAN MCP。它会拉下那里的所有元数据。哒哒哒。所以,它会分解,然后从那里开始……开始确定要处理什么。嗯,哦,这些标题是颠倒的,这很有趣。基本上为我的开放 Asana 任务创建 spec。再次,从 Asana 拉下所有任务,然后为每个任务生成需求。所以,我想我有大约六个分配给我的任务。一个是用户管理,一个是属性管理,哒哒哒,它拉进来了,生成了需求,然后在这种情况下,标题是错误的,抱歉,开始执行任务。这是我想去进行代码合成,我将在这里稍作休息,谈谈如何在实践中做到这一点。所以,对于那些在房间里跟着我的人,请随时启动您的 curo,打开一个项目,然后选择一个 MCP 服务器。我将在这里分享一些 repos,您可以玩玩。所以我有一个 MCP 服务器实现。我有一个宏伟的视图,我认为它实现了 Asana。然后这些应该是公开的。让我检查一下。是的。所以,例如,如果您想扩展我的,我有一个诺贝尔奖 MCP,它可能会出乎意料地卷曲,有一个诺贝尔奖 API。所以,您可以使用 UVX 来安装它,或者您可以克隆这个 Al Harris at Nobelmcp。这只是一个例子。另一个例子是,如果您想玩视频中的示例。我有一个 Al Harris atlofty Views。我将把这两个都放在屏幕上几分钟,供想复制 URL 的人。但与此同时,哦不,我把你们放在同一个窗口里。所以,我将快速演示如何使用 MCP 来使 spec 生成更容易或更可靠。所以,这里我看到,我有很多 MCP。我实际上想用哪些?让我们使用 GitHub MCP。哦,不。别管我。这样更好。好吧,我有一个 Fetch MCP。所以,在这种情况下,我可以例如进来并说,嘿,我生成了很多任务,Lofty Views 应用程序。这基本上是一个非常简单的 CRUD Web 应用程序。但我希望 Kira 使用 Fetch MCP 从互联网上存在的类似产品中提取示例。您也可以使用 Brave Search 或 Tavlet Search MCP 服务器,但在这种情况下,我只会使用 Fetch,因为我已经启用了它。嗯,所以,让我们说,哦,实际上我们可以运行 Web 服务器并使用 Fetch。这是一个很好的例子。这是您可以在生成 spec 的工作流程的任何阶段使用 MCP 服务器来完成工作的示例。不,这是我因为很久没用项目了而得到的。我们将取消它。我们可以做一些更有趣的事情,这是一个我一直在开发的独立项目。嗯,我一直在开发一个核心代理。这可能是我……我知道这个项目有效,这就是我启动它的原因。我应该叫它什么?嗯,也许我们将在最后进行现场演示。所以,这是您可以使用 Curo 的最基本的事情,就是使用 MCP 服务器,但任何工具都使用 MCP 服务器。我实际上不认为这特别有趣。所以,让我们说,在试图磨砺我们的 spec dev 工具集的过程中,我们已经完成了 200 目。我们已经添加了一些 MCP 功能。它很有用,但它不会改变游戏规则。我想进来并真正达到 400 目。让我们开始真正地抛光一下。我想自定义生成的工件,因为您有这个任务列表,您有这个需求列表,而且我不同意您写的东西,Al。嗯,您可能会说很多人是这样,这是一个很好的起点。所以,这是我本周早些时候在……嗯,会议上听到的一件事是,人们喜欢使用线框图和模型。使用线框图模型,因为您的 spec 是自然语言,您使用 spec 作为控制界面来解释您希望系统做什么。因此,我想能够实际地将 UI 模型放在这里。所以,微不足道的情况是,我只是进来并说 Kuro 问我,设计看起来好吗?您满意吗?我说这看起来很棒,但能否包含线框图,并要求我为我们要构建的屏幕。我正在添加,这是再次来自那个 Lofty Views 的东西。我正在添加一个用户管理 UI,但我实际上想看到我们正在提议构建什么,而不仅仅是事物的架构。所以,您的 cure 将在这里停留几秒钟,但您可以将任何您想要的东西添加到这些工件中的任何一个,因为它们是自然语言。所以,它们是结构化的,这意味着我们希望它们的外观具有一定的可重现性,但最终它们的外观并不重要,因为我们有这里的任何机器,代理在那里可以帮助将其翻译成它需要的东西。所以,Kira 正在这里忙碌。它正在思考,思考,然后它会吐出这些文本包装的 asy 图。我将在视频中稍后修复包装,但最终,你知道,它会做任何你想要的事情。所以,如果您想在需求中添加额外的数据,您可以做到。如果您想在设计中添加额外的数据,比如这个,您可以轻松添加。这里我们有一些 asy 线框图,可以帮助我合理化我们即将发布的。嗯,然后我可以再次继续聊天,说实际上在设计中,我不想……嗯,也许我不想一直把这个添加用户按钮放在顶部。在这种情况下,我可以很容易地与它聊天来做出改变,现在我们一开始就在同一个页面上,而不是在实施过程中。所以,我们再次将一些担忧“左移”了。嗯,这是一个例子。你知道,我想在系统设计中添加 UI 模型。但另一个例子可能是这个。嗯,哦,这是那个最终状态的一个快速快报,现在我的设计确实有这些 UI 模型。嗯,但另一个例子,我实际上更喜欢的是这个,在定义和任务中包含测试用例。所以,今天 cure 会给您的任务将是需求的要点和您需要达到的验收标准。但我希望在这个任务被执行的最终状态下,我们有一个非常清晰的理解,即它是正确的。它不仅仅是因为……任何使用过代理的人都可以证明,LLM 非常擅长说我完成了。我很高兴。我确信您很高兴。我只是要完成。哦,是的,测试不通过,但它们很烦人。我尝试了三次让它们起作用。我只是要继续。不,我不想那样。我实际上想知道事情是否在起作用。所以,在这种情况下,我要求 Hero 包含明确的单元测试用例,这些测试用例将被覆盖。所以,我的任务,例如在创建这个代理核心内存检查指针时,将包含在完成之前需要通过的所有测试用例,然后我可以使用代理钩子等来确保这些测试是正确的。我们将在稍后的讲座中运行这个示例。这是我准备好进行现场演示的另一个例子。嗯,是的,这是另一个例子,您再次……您正在处理您的工具箱。您基本上……您拥有所有这些功能和原语,您可以控制它们,您可以调整流程以适合您,而不仅仅是我认为最好的流程。然后,最后但并非最不重要的,800 目。此时,我们正在对工具进行最后的抛光。我们可能会打磨脖子,但我们想……你知道,您可以迭代您的工件,但您也可以迭代实际运行的流程。所以,您可能拥有的一件事,我经常这样做,就是我和 Kira 聊天,我说,“嘿,我想……在这种情况下,我想在我的代理核心中添加内存。嗯,在每次执行结束时将对话转储到 S3 文件。”Cur 会说,“这太棒了。我知道怎么做。我将研究如何做这件事。我将为您实现这个目标。”但最终我所做的实际上是引入了一个偏见,那就是我正在使用 S3 作为这个存储解决方案来指导整个代理,仅仅因为我可能熟悉它,但这可能不是最好的方法。所以,在它综合了设计和所有任务以及所有这些东西之后,我回来并说,嗯,我们不必坚持这个由 Kirao 定义的严格的 spectriven dev 工作流程。我可以要求替代方案,例如,这是实现会话持久性的惯用方法吗?我不知道,也许有更好的方法。也许如果我们谈论 AWS 服务,它不是 S3,而是 Dynamo 或哒哒哒。Kira 会进来并说,“嗯,好问题。哒哒哒。让我研究一下。”它会通过调用我授予它访问权限的许多 MCP 工具。这有点回到了您应该使用 MCP 的问题。然后它会回来,提供一个我不知道的功能,那就是 Asian core memory。它说它更惯用且面向未来,也许是 TBD,应该更仔细地检查。嗯,或者您可以使用 S3,这是您推荐的。现在,实际上,我敢打赌还有远不止两个选项。所以,您可能可以继续问代理,还有其他选项吗?哒哒哒,它会继续调查,但您不应该将自己锁定在这个严格的流程中,这是这里的起点。嗯,是的。所以,这实际上是我认为的全部内容。嗯,我将谈论的是,让我们来运行一下我刚才提到的示例,就是……所以,基本上,让我删除它,我将只进行一次现场演示,说明 Curo 中的 spec 以及我们如何微调一些东西。所以,这个项目是一个 Node.js 应用程序。它是一个……它是一个 CDK。再次,我不是在推销更多的 AWS。我只是熟悉我使用的技术,所以我可以更快地移动。所以,我想了解一些关于 agent core 的信息,这是一个新的 AWS 产品。作为一个构建代理的人,我应该熟悉它。所以,我不太熟悉它。所以,我们这里有其他人对它很了解。所以,我举手示意,你知道,你抓到我了。所以,我设置了一个 CDK 堆栈,这只是……你知道,用于部署软件的 IA 技术。我熟悉它,我喜欢它。所以,我有一个堆栈,可以让我部署任何 agent core 运行时。我不知道。我让 Kira 去做的。我们对这部分进行了 Vibe 编码。所以,我们对总体结构进行了 Vibe 编码。我们得到了一个代理。我们设置了 IA。然后我 Vibe 编码添加了 commit lint。我添加了 husky。一些我喜欢用于我自己的 TypeScript 项目的东西。prettier 和 eslint 我认为。所以,我们有一个基本的产品,或者说一个基本项目,我知道我可以部署到我的个人 AWS 账户。嗯,现在我要进来……哦,而且很重要,这非常重要,因为我不知道 agent core 是如何工作的。我可以去阅读文档,但文档很长而且很复杂,我只是想构建一个 PC 来……了解它自己。所以,我添加了两个 MCP 服务器。哦,不,也许我没有。让我检查一下。哦,好的。是的,抱歉。埋在底部。所以,这是我的 Kira MCP 配置。我在这里添加了一个重要的 MCP 服务器,那就是 AWS 文档服务器。还有其他获取文档的方法。您可以使用 Tessle level 7 之类的东西,但在这种情况下,这是 AWS 提供的。所以,我有一些信心它可能是正确的。所以我用它来帮助代理了解存在哪些技术。而且我认为我也使用了 Fetch 很多次。所以,这是我提供的两组……这是我提供的两组 MCP 服务器。这很好。继续。确认。所以,我将从头开始重新运行它。所以,我昨天晚上或者前天晚上做的事情是,我坐下来,我有一个系统……基本上在工作,现在我想开始做 specri 开发。所以,我想添加这个会话 ID 的概念,然后我想将对话读入 S3 文件,哒哒哒。这是我之前展示的整个偏见问题。我们将通过 Curo 启动它,它将开始运行……忙碌起来,然后它将……看看 spec 是否存在。嗯,好的,文件夹确实存在。它可能会意识到那里没有文件,然后开始工作。但是,从这里我将进行现场演示。它将阅读需求。它将阅读现有文档。它将阅读现有文件,收集它需要的上下文。当然,在某种程度上。嗯,但一会儿,一旦它生成了……初始需求和设计,我将挑战它使用自己的……MCP 服务器。我想让你去研究一下最好的方法,并给我一些建议。嗯,这就是我希望夹式麦克风能起作用的原因,因为我需要暂时放下这个。好的。所以,嗯,我不知道这是最好的方法。嗯,去阅读文档,去使用 Fetch。D。它将继续在这里忙碌,然后在我可能得到一些想法并提出建议之后回来找我。但是,这是我使用额外功能的示例。嗯,使用 Fetch,使用文档 MCP,使用任何你能获得的最佳信息,不要把我说的话当作理所当然。这些通常是我们必须非常努力地提示代理才能做的事情,但如果您实时去做,它效果相当好。嗯,再次,代理,所有这些代理都会非常容易取悦。所以,你知道,仅仅因为我在愚蠢的文档中说了一些话,它可能实际上不是代理在未来最重要的事情。所以,你知道,好的,所以它做了一些研究。它已经理解了 Lang graph,这是我们正在使用的代理框架,已经有了这个持久性的知识……哒哒哒,实际上在这种情况下,它没有使用 MCP 来……Agent Core 文档,它没有发现 Agent Core 具有这种持久性的知识。嗯,所以也许你喜欢……假设我不知道……我仍然不知道它的存在,因为我几天前没有进行过干运行……我们可能稍后会在设计阶段找到它。所以,第一件事是它将……迭代我所有的需求。需求在这里。嗯,它改变了需求,基于它现在对 Langraph 的了解以及它如何本地集成检查点,但它仍然非常清晰地绑定到我之前在请求中做出的 S3 决定。嗯,所以这只是需要注意的一点。您在提示中输入的任何内容都会有效地塑造代理。嗯,无论好坏。我看到它仍在迭代。所以,是的,它会过来,说,看起来好吗?我们改变了……我将说看起来很好,让我们进入设计阶段。所以,现在 Curo 将获取我的需求,并将我带入这个项目的设计阶段。我可以让东西变得更大一点。但是,这里有一个例子,说明了我所说的 ears 需求。所以,用户故事是,作为一个开发人员,我希望实现一个自定义的 S3 基于的检查点,以便代理可以使用 Langraph 的本地持久化机制与 S3。很好。作为一个人,这听起来很合理,你知道,共同撰写这些需求。这里,这种“当然后果”的语法,这就是 ears 格式,结构化的自然语言对我们来说非常重要,可以将其传递给非 LLM 模型,并在我们解析您的需求时为您提供更确定的结果,因为最终我们的目标是实际使用 LM 的……不是尽可能少,而是随着时间的推移越来越少。我们希望使用经典的自动化推理技术为您提供高质量的结果,而不仅仅是……最新的模型会告诉您什么。嗯,所以这里已经完成了,吐出了一个设计文档。让我们实际上在 markdown 中看看。这……您有一个服务器,哒哒哒,检查点幽灵 S3,这很有意义。伪代码,再次,在真实场景中,也许我更仔细地阅读它,而实际上,这是我们新发布的……在 17 号,现在 cur 将进行这个形式化的需求,以确保正确性属性。嗯,所以现在系统正在做的是,它正在查看您生成的需求……我们之前与系统达成一致的需求。这些看起来不错,我同意它们。哒哒哒。它正在查看设计,并提取我们想要运行基于属性的测试的系统的正确性属性。这是您在原型阶段可能关心也可能不关心的事情,但在您进入生产阶段时应该非常关心。因为这些属性是正确的,并且满足了所有这些属性。系统与您提供的输入需求一对一地对齐。嗯,是的,所以当这个忙碌的时候,还有什么问题吗?还有人好奇吗?>> 嗯,是的,>> 我们在这里,然后在那边。>> 嗯,您会说它与……有什么主要区别?我几周没用过规划模式了。所以,它……我……事情发展得如此之快,有点疯狂。嗯,但我想最终……我们会说的是,Kuro 的 spectrum 和 dev 不仅仅是 LLM 驱动的,它实际上是由……一个结构化的系统驱动的。嗯,所以规划模式我不确定是否真的……有一个工作流程带您完成事情,但……是的,这是我们对此的看法,肯定。>> 我不够熟悉,无法提供更具体的例子,不幸的是。类似的……我的意思是,它不会给你……我认为这个文档很酷,它带来了这个文档,但……Cer 所做的是基本上创建一个计划,那就是>> 只是一个执行计划,好的>> 哦,我明白了,所以我认为根本区别在于,那个计划会被提交到任何地方,还是只是临时的?>> 嗯,它有点>> 好的,所以我想随着时间的推移,不仅仅是我们如何做出我们关心的改变,而是实际上是关于系统做什么的文档和规范。嗯,所以我的长期目标是,作为 Kira,我们能够进行……双向同步,也就是说,当您继续与 Kira 合作时,您不仅仅是在累积这些……任务列表,所以,我只是说“去吧”去执行任务……但我们不仅仅是在累积任务列表,实际上,如果我回来,比如说,改变了需求,我们将会修改之前的 spec。所以,我看到的是需求的差异,当您经历绿色字段过程时,您将在您的 PR 中产生很多绿色,这可能不是最好的,因为我只是在审查三个新的巨大 markdown 文件,但在下一次或之后我再次打开那个文档时,我想看到哦,您实际上……您已经放宽了之前的需求,您添加了一个需求,它实际上对设计文档有这种影响……这就是 Curo 团队内部用来讨论 Curo 更改的过程。所以,我们审查我们的设计文档……通常被 spec 审查取代。所以,我们将……你知道,有人会从 markdown 中获取 spec,他们会将其发送到我们的 wiki,基本上使用我们内部使用的 MCP 工具,然后我们将像在设计会议中一样审查那个东西并评论它,而不是……我从头开始写了那个 markdown 文件或 wiki。嗯,所以它变成了……嗯,它实际上不像 ADR,因为它不是时间点。它是关于系统的……这个活文档。嗯,是的,谢谢提问。这里有一个问题。>> 嗯,这可能更多的是一个 spectrum 开发问题,但有没有……像一个文件模板,您需要填写?比如现在您在 design.md 中。>> 有没有……>> 这是 design.md 吗?这是 spec,它是一个文档,还是有……>> 哦,好问题。所以,是的,问题是……是否有用于系统的模板集?您提出的问题是,您能否更改模板,或者只是……好的,所以,是的,问题是……是否有模板集……在我们的系统提示中,我们如何处理您的 spec,所以您会看到这里顶部的导航栏,现在我们在这个需求设计任务列表阶段非常严格,但我们知道这对每个人都不起作用,例如,如果您刚开始,我们从很多亚马逊内部人士那里得到反馈,说我想从……我有一个技术设计的想法,我不一定知道需求是什么,但我知道我想……也许设计这个词都不对,我想从一个技术笔记开始,比如我想重构……这经常出现,用于重构……所以,我想重构它,使其不再依赖于……这里有一个很好的例子,我们使用大量的互斥锁来确保我们在代理执行某些操作时进行适当的锁定,因为我们不希望不同的代理互相干扰。但也许我想挑战系统的需求,所以我可以删除其中一个互斥锁……或者我应该说信号量。嗯,所以,我可能会从类似技术笔记的东西开始,然后从中……提取我想与团队分享的需求,并说,嘿,你知道,我不得不玩了一段时间才了解我想构建什么,但我仍然想生成所有这些丰富的工件。所以,今天它是这个结构化的工作流程。我们正在努力让它变得更灵活。但结构很重要,因为结构使我们能够构建可重现的工具,而不仅仅是 L。所以,我认为这是一个重要的区别,我们不是一个简单的 LLM,而是一个工作流程。后端可能是 LLM,也可能不是,或者可能是其他神经符号推理工具。嗯,所以我们试图让这个区别稍微清晰一点,你不仅仅是在和 Sonnet 或 Gemini 或其他什么东西说话。你是在和……基于您在任何时候执行的任务类型的系统混合体说话。嗯,虽然您在聊天时,您只是在和一个 LLM 说话。嗯,是的,所以我们有一个需求模板。我们有一个设计文档模板,因为有一些我们认为重要的部分需要涵盖。嗯,再次,如果你不同意,你说我不在乎测试策略部分,只需让它去做,同样,任务列表也有结构,因为我们也有……建立在它之上的 UI 元素,比如任务管理和……我们有……当我们做一些基于属性的测试时,我们会到达那里,但……有一些额外的 UI,我们将添加一些可选的东西,比如可选任务等等。所以,我们需要在那里进行结构,以便我们的……任务列表 LSP 可以工作,例如。嗯,是的,谢谢提问。还有什么要继续的吗?酷。嗯,我可能需要有人提醒我我们在做什么。哦,对了。所以,我们已经完成了,并且我们综合了为我的代理添加内存和一些持久性的 spec。顺便说一下,我没有向您介绍这个项目。这个项目叫做 Gramps。它是一个……它是一个代理,我正在将其部署到 agent core 来了解它。我提到了这一点。但我没有告诉你的是,它是一个……一个爸爸笑话生成器。一个非常昂贵的,因为我们通过 LLM 为它提供动力,但有效地,您是一个爸爸笑话生成器。笑话应该是干净的。它们应该基于双关语,你知道,显然,如果它们有点俗气但又讨人喜欢,那就加分。嗯,哒哒哒。所以,我们正在将其部署到后端。所以,我想要内存的原因是,每次我向爸爸笑话生成器要一个笑话时,它都会给我同一个该死的笑话,这太无聊了,我的孩子们不会对此感到兴奋。所以,我想要内存,这样当我回到同一个会话时,我就会一遍又一遍地得到不同的笑话。嗯,这是项目的背景。所以,我们已经完成了,实际上我们说我们生成了这个东西,我们做了任务列表。我说,“嘿,这是惯用的做法吗?”但我的意思是,我们实际上并没有……我们没有使用 Agent Core 的内存功能,这可能是一个大失误。嗯,所以,你知道,快速举手。我们想犯这个错误,一直进行到综合和部署,还是现在就修复它?>> 谁想现在就修复它,因为我们知道得更好?>> 不,我想犯这个错误。让我们继续。我……房间里有三个“是”,但人很少。所以,我们将犯这个错误,然后再回来修复它。所以,嗯,让我们说按顺序运行所有任务。嗯,我之所以提到按顺序,是因为这似乎非常具体,是因为这是 Kira 的预览版本。嗯,所以有人刚刚在系统提示中添加了,我应该一次只做一个任务。我发现如果我说运行所有任务,它会认为我意思是并行执行所有任务。所以,我们……在这些更改发布到生产环境之前,这将被修复。所以,Kira 将继续在这里忙碌,并在后端处理系统。嗯,它有转向文档,解释了如何完成它的工作。它有,我想我应该给你们看。转向再次就像内存。所以,我有一些转向,如何提交。你知道,我喜欢如何提交,但也有关于如何实际部署这个东西的转向。如何处理 agent core。然后如何运行部署到我的本地开发账户所需的命令。嗯,然后这些大多只是一个例子,再次,磨砺您的工具,比如……我经历了这个痛苦的过程,弄清楚,哦,你知道,你必须在 CDK 上使用这个参数,CDK 命令,你必须使用这个滞后,否则它不会正确工作,所以一旦我经历了学习的痛苦,我就说 Kira,把你的学习成果写进转向文档,它通常会做得很好。嗯,所以它自动生成了这个 Asian core langraph workflow MD 文件。嗯,是的,所以,我的意思是,它只是会在这里继续工作,做它的工作,我们可以在后台观看它。但与此同时,嗯,我认为在这一点上,我们处于一个非常灵活的位置。嗯,所以对于那些想尝试的人,请随时使用 Kira,自己尝试 Spectriven Dev。我将继续在后台运行它,并回答问题和评论。但这就是今天预定部分的全部内容。>> 是的。>> Carol 如何处理……现有的庞大代码库或这个?>> 是的。>> 是的。问题是如何处理大型和现有代码库,基本上是棕地用例,嗯,答案是取决于您想做什么。嗯,对于 spec 驱动的开发,您可以要求 cure 研究已有的东西。所以,当您开始一个新的 spec 时,它通常会从读取工作树开始。嗯,但代理通常是从……从零开始的,对吧?它需要理解系统。嗯,实际上,这意味着您最终会得到很多东西,比如,如果您的系统已经很好地分离了关注点,您的……系统中的组件高度内聚,并且它们……高度连贯和高度内聚,它会做得很好,对吧?它会说这是做这件事的模块。我不需要在我的上下文中保留 18 件事来完成我的工作,它会做得很好。嗯,如果您……让我们举一个我脑海中想到的例子。如果您试图快速启动一个 IDE,在 AWS 发布之前,并且您……你知道,一路走来,您积累了很多技术债务,您需要それを解开,你知道,这里没有人会这样做,我敢肯定,但……如果您这样做,就像我一样,那么您的代理可能在遍历代码库方面会比开发人员更困难,对吧?所以,从……仅仅是那个角度来看,越可靠的东西,比如您的测试套件,越容易理解的东西,比如模块分离和……关注点分解,代理就会做得越好。嗯,与真正的……当然。现在对于……理解代码库,这是一个糟糕的例子,因为这是一个非常小的代码库,但我们确实有……代码搜索和工作区。嗯,我不知道该怎么称呼这些上下文提供者。嗯,所以您可以进来并说我想做代码。嗯,它是什么?我可能已经关闭了它。哦,我确实关闭了它,因为代码库不够大。我们会做一些后台索引的事情,这样代理就可以……您可以对您拥有的东西进行语义搜索,如果您只是在聊天。但总的来说,嗯,Cur 应该进去并进行……后台搜索以找出如何完成它的工作。就像代码库规模扩大一样,它可能总体上做得……做得不太好。但这是我们团队正在努力的一个方面。这是否回答了您的问题,还是我有点跑题了?>> 是的,我想我明白了。>> 好的,酷。>> 还有其他人吗?>> 嗯,您愿意等待索引完成多长时间?嗯,我有一个例子是代码 OSS。嗯,如果它看起来不那么明显,那么 cur 就是一个代码 OSS 分叉,就像……你知道,cursor winds surf。嗯,我们遇到的挑战之一是代码 OSS 代码库非常大,相当大,还有其他大的代码库,但那对我来说是一个大的代码库,因为我并不经常被迫在其中工作。嗯,所以,当您处理像那样的大东西时,肯定会感觉到一些减慢,特别是当您谈论代码库索引时。这是我们一个非常活跃的工作领域。所以,我们正在尝试做的事情是……要么从关键路径中删除索引,这样您就不会等待一些减慢的渲染线程,因为索引正在运行。嗯,但实际上,不应该有。我的意思是,再次,代理可能总体上做得不太好,但我们将在几周后在 reinvent 上讨论 Curo 中的一些模板功能是如何通过 spec 在我们不太了解的代码库中构建的,因为我们不是 VS Code 开发人员。嗯,Curo 把它做得很好。但再次,这是……

事实是代码库结构合理,嗯,而且如果你花时间去理解它是如何工作的,它就非常容易理解。如果你没有,它可能会有点晦涩难懂。是的。嗯,在索引方面,它只是把代码库中的信息尽可能多地放入上下文中,还是有一种方法可以像创建一个包含整个代码库的某种向量数据库,然后像查询它一样?我只是是的。嗯,所以问题是,你说的索引是什么意思?嗯,因为索引可以意味着很多不同的事情,而我的意思是,代理实际上并没有被提供,我将尽可能保持代理的上下文很小。我们使用索引来实现大多数像二次效果的事情,比如如果你正在进行代码搜索,或者如果我搜索像井号,嗯,这里的http服务器文件,比如我们更多地将其用于这些类型的用户界面,而不是将其提供给代理,因为代理这样做是基于轶事的,并且基于我们的基准测试,在提供较少上下文的情况下表现更好,但提供了理解在哪里查找事物的工具。嗯,我们在这个会议上经常听到的一件事是增量披露。同样,我们不希望在开始时在上下文和与代理的对话中加载太多内容。我们希望代理能够自我发现适合任务的正确上下文。是的。谢谢。是的。你们管理会话长度吗?有任何压缩或修剪吗?是的。所以,嗯,问题是我们如何管理会话长度?今天我们没有任何增量修剪或增量摘要。嗯,你基本上只是累积上下文直到达到限制,我认为现在我使用的是自动模式,它有一个大约 20 万个 token 的限制,类似于 sonnetss。嗯,所以我们还没有一个非常复杂的算法。我们已经研究了一些东西,但我们最关心的是提示缓存命中率。所以在正常的用例中,我可以实现大约 90-95% 的缓存 token 使用率,这意味着我的交互速度非常快。而且它们比替代方案快得多,那就是我将 16 万个 token 发送到 bedrock cold。嗯,所以这是我们实际上没有对增量摘要进行太多实验的原因之一。嗯,我们的摘要功能存在。当你达到上限时,它并不好。我们正在努力在不久的将来发布一个改进版本,嗯,在接下来的几周内,它应该会更快。今天它就像一个一次性操作,可能需要 30 到 45 秒,这是一个糟糕的体验。我们希望在这里解决这个问题,并使其成为一种实时体验。后续管理会话之间的稳定性,是这样吗?所以,嗯,那不是唯一的原因,我的意思是,开发人员的频谱与性能关系不大,而与代理的可重现性和准确性关系更大。嗯,因为如果我们能给你正确的结果,我以及我认为我们团队内部谈论它的方式是,如果我花 10 秒向代理提供一个提示,然后它出错了,这对我来说无关紧要,对吧?我燃烧了多少 token,你知道,我 LM 提供商的几美分信用额度,但我花了 10 秒生成一个提示。如果我花 5 到 10 分钟与系统一起制作详细的设计文档,或者让我们说即使是一套详细的需求,我也想做得很好。如果我花一个小时制作设计文档,与我的团队一起审查它,然后从中综合,我希望它能正确。所以目标不一定是仅仅是延迟,而是准确性,当我们谈论它时。不,这是一个两者兼顾。你需要两者都做。但规范更多地来自于拥有高度可重现的输出的目标。我将先去这里,然后你是的。这些任务代理如何将上下文传递给彼此?然后你只需要运行这个父任务吗?因为它已经完成了所有 3.1、3.2、3.3,但它仍然认为 3.1 没完成,并且也运行了 3.2。哦,是吗?是的。嗯,不,我的对。哦,好的。是的。是的。嗯,所以如果你在用户界面中运行任务,我可以拉出我的任务列表。嗯,所以如果我点击开始,开始,开始,每一个都将是一个新的会话,这意味着上下文是完全唯一的。嗯,我个人喜欢,如果可以的话,如果我有足够的上下文基础,我就会说做所有任务,因为我觉得这样更容易理解,而且我认为我的性能实际上更好。但默认情况下,每个任务都是一个新会话,与之前的任务没有任何共享上下文。所以会话基本上只是用你的规范来填充,然后你正在处理一个做所有这些事情的规范,这段文本,而你正在做这个任务,达达达,不要做任何其他任务,只做这个。嗯,那听起来像个 bug。嗯,他们是否为某些事情启动了子代理?我们还没有子代理,卡罗,我们正在努力。是的。是的。因为理想情况下,对吧?如果我们点击任务三,我有 31、32、33,它们是分开的,我没有理由不能让不同的系统处理它们。是的。就在这里,我们在 Curo CLI 中有自定义代理,你也可以运行它们。是的。Curli 是自定义代理的概念,嗯,它可以作为任务运行,嗯,这是我们在 Curo Desktop 上正在玩的东西,我认为你还有另一个,是的,我很抱歉,如果我错过了这一点,但在 spec 文件夹中,随着你随着时间的推移执行越来越多的这些任务,它只是都在一个设计需求任务中,你的整个项目都在那里定义,还是分组的?这是个好问题,嗯,是的,所以我会有很多,我会,问题是随着时间的推移,你生成了更多的规范,你是否只是创建了一个巨大的规范,不?嗯,让我打开另一个项目。所以这例如是 curo 扩展,它是 curo IDE 中的一个 1p 扩展。这就是代理本身所在。所以我们修剪了一些规范,但这里有一些规范我们可以讨论,或者我可以演示一下。嗯,所以这些是我认为的方式,规范代表了项目中的一个功能或问题领域。所以例如,我可以稍微放大一下。所以例如,我们有一些只是测试。我们做过的事情,比如,我们能有一个提示注册表吗?我们能有一个提示注册表文件加载器吗?它们可能最终会进入生产环境,也可能不会。我想要聊天 UI 的遥测。所以这些只是有人会花几天的时间来完成一个 SD 的工作。代理 MD 支持是一个很好的例子,我们只是,你知道,我研究了什么是代理 MD,并以构建转向支持的方式构建它。这个规范在未来我们很可能不会再回顾它。所以我也许会删除它。嗯,这也是我们对一些旧的所做的。但一个我们可能会回顾的好例子是我们的消息历史记录清理器。所以,我们早期在 Kira 开发中遇到过问题,或者我们遇到过问题,那就是我们会发送这些无效的消息序列,因为例如,anthropic API 要求工具的顺序与它们被调用和响应的顺序相同,但系统没有这样做。所以我们构建了这个完整的清理器系统,它有一些关于,嗯,让我看看,非常具体地说,是的,当对话被验证时,系统应验证每个用户输入是非空内容还是工具响应。所以我们有过像空字符串被传入但有工具响应的情况。这是一个很好的例子,我们随着时间的推移,实际上只是添加了,也许不是在需求中,而是在需求的可接受标准中,随着新的验证规则被发现。是的。所以你如何处理?所以例如,你有像那里的遥测,需要遥测的功能,它会回去更新那个规范吗,还是你只是它应该。是的。所以,如果你通常会看到,让我发起一个新的聊天。不,这是个糟糕的主意。所以在这里,我要求,我做了一个检查模式,我做了一些请求,嗯,为那个东西添加 UI 遥测,我会帮你添加它,让我先检查一下是否有任何相关的 runbooks,然后探索代码库并发送实现,它可能会做一些研究,然后抛硬币,再说一遍,这是一个 LLM,所以它可能会发现现有的规范,也可能不会,但理想情况下,在进行研究后,它会说已经有一个关于 UI 遥测等事物的规范,我将去修改那个。嗯,如果它没有,在这种情况下,我会进来,只是要求它作为系统的操作员。但随着时间的推移,我们希望你作为用户更容易做到这一点,不必考虑太多。我们可以看着它,因为它在努力工作。Kira 中有什么东西被重新配置,使其能更好地与 AWS 配合使用吗?不,不是真的。嗯,那是个问题吗?哦,问题是,嗯,Kira 中有什么东西是预先配置好的,可以使其与 AWS 更好地配合使用吗?不。嗯,我们是故意的,我们是由 AWS 提供的,所以你知道,安迪·贾西和杰夫·贝支付我的工资,但我们不是一个与 AWS 生态系统深度集成的 AWS 产品。现在,也就是说,如果有人问我“为什么我们用 AWS 构建的另一个东西与 Curo 不兼容?”,我仍然会回答电子邮件。是的。但是,同样,如果你正在构建 GC 或 Azure,或者你在本地运行一些系统,该产品应该和你一样好。这是我们的目标。一个好的潜在答案是 AWS 文档 MCP 服务器。是的。所以有一些 MCP 服务器可以添加到任何这些东西中,它们会做得更好。是的,这是个好主意。所以,在这种情况下,我实际上必须在这里添加 AWS MCP 文档。我们当然可以原生捆绑它,但我不想把它交给不需要它的客户。是的。因为同样,AWS 不是我们可能关心的唯一文档。嗯,顺便说一句,回到你的问题,所以它确实找到了遥测的现有规范。它阅读了它,它阅读了其中的不同部分,现在它实际上正在对其进行修改。所以,我们可以看到它在这里显示的差异。所以,它为预先存在的规范添加了新的要求。嗯,所以这实际上是另一个我们变异系统的案例,而不是仅仅添加这种永无止境的规范。我猜我想知道的是,它是如何知道或决定将规范放在哪里,你知道,如果你将你的项目分解成这些不同的类别?是的。我敢想象,比如交叉。是的。嗯,我的意思是,这就像软件开发的缩影,对吧?就像你如何定义你的系统不同部分之间的界限,不同的关注点,产品对,但如果你想构建一些东西,比如我有一个任务,它将需要改变三四个东西,是的,它将改变三个或四个规范,然后运行跨越三个或四个任务,哦,是的,是的,不,它不应该这样做,它可能会,所以再次,我手头没有一个好的例子,我们可以做到,但我的观点是,如果你正在处理一些跨职能的事情,顺便说一句,问题是,如果我正在处理一些事情,比如我有一个安全需求规范,我有一个 API 设计规范,比如 API 形状,我有一个日志记录规范,而我正在改变 API 公共接口中的一些东西,这是一个面向安全的关注点,因为我们正在删除日志记录 PII,我认为这可能是一个半可触及的用例,我们可以想象来自我们的治理团队,我想,你会选择其中一个来加载需求,或者你创建一个跨职能的规范,但这将取决于你作为操作员的决定,就像我如何实现它一样,你可能不会实现我的 PII API 删除模块。它是一个独立的模块,它将是你的代码库中的一个横切主题,我敢想象。这也是一个很好的例子,就像多组工作区出来时,它在周一去了 G,现在你可以拖动不同的。所以就像你在 API 和认证以及前端的例子一样,你可以引入那些项目,如果你有它们是分开的,然后仍然工作。是的。谢谢兄弟。心智模型,规范生成代码,之后,你指定什么代码,它是如何工作的?是的,所以,嗯,我们现在已经有效地综合了规范,所以我们坐下来,我们定义了需求、设计和任务列表,我已经让 Kira 运行了这个规范中的所有任务,所以它一次运行一个,它基本上处理小块的工作,一块一块地,然后,嗯,现在完成了。所以我们实际产生的不只是完成的规范,而是它进入了我的代理,并在 CDK 仓库中做了一些事情,因为它正在持久化到 S3。我敢肯定它添加了一个存储桶。是的。一些新的存储桶加密等等。然后它进入代理,添加了 S3 检查点保存器。看起来它,你知道,创建了一个检查点器。它将这个添加到图中,并将所有这些传递给系统。而这里的 S3 检查点器我敢肯定知道如何将检查点读写到 S3。所以,我们不仅仅是定义了系统,我们现在已经端到端地生成了它,或者我们已经端到端地交付了它,包括属性测试,我相信。是的。哦,我有一个答案,关于早些时候的问题,关于像一些特定的 AWS 相关功能,使它更容易工作。Curo CLI 附带了使用 AWS 工具,它有助于 CLI。是的。是的。所以,Rob 指出的是 Curo CLI,我们本周刚刚重新命名了它,它有一个使用 AWS 的工具,它基本上是 AWS SDK 的一个包装器,嗯,为了让一些事情变得容易。嗯,但同样,如果你愿意,你可以自己使用 GCP 工具,如果你愿意,你可以使用 FCP 服务器,如果那是你选择的工具。我相信,不要引用我的话,嗯,因为 CLI 对我来说是新的,我应该说,但我相信你也可以在 CLI 中关闭工具。如果不对,Rob,请告诉我。是的。所以,你实际上并不严格。在今天的桌面产品中,你无法控制工具,内置的本地工具,但在 CLI 中,你可以。嗯,所以我直观地理解了拥有规范的好处。你是否做过任何实证研究,看看一个项目或一个问题在有或没有规范的情况下是如何工作的?是的。嗯,我们确实有基准测试,涵盖了数据。嗯,我认为其中一部分在我们的博客中。所以如果你去 cure.deblog 或者在网站上,我们非常清晰地谈论了一些像基于属性的测试对任务准确性带来的提升。科学团队一直在研究这些东西。一篇关于规范的博客,我很好奇。是的。区分数据库工程师。是的。他的博客文章确实提升了它。我认为它没有你正在寻找的 D 方面的具体内容,但我认为它会很有用。是的。是的。它是如何工作的?我理解它的功能方面,但它在非功能方面是如何工作的,比如代理处理一些更难的问题?嗯,是的,嗯,这最终是我们的目标,对吧?我们说你前期投入的投资稍微大一些,但我们相信我们带来的结构将有助于你提高结果的准确性。所以,嗯,虽然我们有一个团队在努力让规范变得更好,但我的工作是当我飞回西雅图时,让整个 Curo 变得更快。一,执行时间和用户界面的滞后性,二是,我们如何更快地通过系统传输 token?我们如何更快地给你响应,这样你就不必花费那么多成本来使用规范?是的。是的。我不是在谈论 KO 工具本身,而是从规范生成的代码。哦。哦,是的,好的。是的。你的意思是生成的代码的非功能性需求?所以,嗯,我认为这取决于你具体想做什么。所以,你可以添加,我这里有一个幻灯片,谈到了如何调整过程和调整工件以适应你的用例。嗯,同样,你可以很容易地添加一些东西,比如我希望在设计阶段考虑速度和运行时以及锁争用等非功能性需求。嗯,是的,你当然可以添加。所以你可以生成 Rust 或 Java 代码。是的。是的。它在功能上会有所不同,取决于你生成什么语言。嗯,它必须,是的,我认为没有其他方法可以解决这个问题。嗯,我再次,我只熟悉 node,所以我在这里用 node 做所有事情,但你可以用任何语言使用它。我认为技术上我们说我们支持 Java、Python、JavaScript,嗯,还有,天哪,JavaScript、TypeScript、Java 和 Rust。但实际上,没有理由它不能与任何语言一起使用。我的意思是,它只是一个 LLM。系统中没有任何语言特定或框架特定的东西。对于你们中的那些人,嗯,本周早些时候有一个由 Tessle 主办的会议,他们正在为知识库做规范,只要你有正确的接地文档在那里,这就是他们的论点,无论你构建什么,它都不应该重要,因为所有这些都由你为系统构建的上下文所决定。这也是一个很好的关于转向的观点。所以转向你可以让代理以你想要的方式开发代码。就像成为一名开发人员就是做出权衡,而你的开箱即用的问题是它太礼貌了,因为它试图满足所有人的需求。嗯,特别是像延迟和成本以及其他类似的东西,只是在转向中告诉它你想要优先考虑什么,然后它就会影响任何生成的代码。是的。即使是它如何设计也是如此。所以,如果有什么东西对你的用例或你的行业非常具体,那就把它塞进那个转向文件中,然后是的,没错。所以,例如,我将让 Kira 为我生成提交。我关心的一件事是,我可以跟踪我生成的提交和 Kira 生成的提交,它们来自系统。所以我的转向文件虽然简短,但包含了我对 Curo 的要求,比如仅仅使用归因于 Curo Agent 的 UI,嗯,这是微不足道的,但我也希望它每次都发生。所以,在这种情况下,它刚刚生成了一个由 Kirao Agent D 共同署名的提交。所以这是一个例子,比如你可以添加任何你想要的东西,不仅仅是与 get 提交相关的东西,你也可以做代码风格,你可以做嗯,代码风格,代码覆盖率。嗯,每当你添加一个规范或添加一个新模块时,请确保用 90% 的覆盖率最小值来注释它,因为这是我关心的。你可以把任何你想放的东西放在那里。好消息是,看起来我们构建的东西是有效的。嗯,Curo 对自己非常满意,至少看起来所有测试都通过了。嗯,是的,所以我们可以将它部署到后端,看看效果如何。我们技术上时间差不多了。所以,你知道,如果有人还有其他问题,我将在这里停留一段时间。但谢谢大家参加、聆听,并了解更多关于 Spectrum 和 Dev Heat 的信息。