AI应用工程化实战:从Skill、Agent到Harness的稳定工作流构建

发布时间:2026/8/15 7:43:32

AI应用工程化实战:从Skill、Agent到Harness的稳定工作流构建
上周我花了一下午时间试图把一个简单的“自动生成周报”的AI小工具从单次运行扩展到能稳定处理团队几十个人的任务。结果从下午三点到晚上十点我几乎都在和报错信息、内存溢出、任务卡死作斗争。那个下午让我明白了一个道理把一个AI任务从“能跑通”到“能稳定、批量、自动化地跑通”中间隔着的不是更多的代码而是一整套工程化的思维和工具链。这恰恰是当前AI应用开发尤其是Agent智能体领域最真实的痛点。我们看了太多炫酷的Demo记住了“Agent”、“Skill”、“Subagent”这些时髦的概念但真到了要落地的时候却发现连最基本的任务调度、状态管理和错误重试都搞不定。这就像你学会了所有乐理知识但一上台却发现连把吉他调好音、接上音箱不出啸叫都成问题。今天我们就从一个最实际的视角出发不谈那些空中楼阁的“智能涌现”而是聚焦于如何用一套清晰的工程框架把零散的AI能力Skill组装成可靠的工作流Harness并让多个智能体Agent/Subagent协同工作。这不仅仅是概念辨析更是一次从“玩具”到“工具”的实战拆解。1. 先厘清概念Skill, Agent, Harness, Subagent 到底在解决什么问题在开始动手之前我们必须先统一语言。这些术语之所以让人困惑是因为不同框架、不同文章对它们的定义边界模糊。我们不妨从它们要解决的核心问题来理解而不是死记硬背定义。1.1 Skill解决“原子能力”的封装问题你可以把Skill理解为一个个封装好的、可复用的“技能”或“工具函数”。它的核心价值是标准化。它是什么一个完成特定、明确任务的单元。比如“调用天气API并解析结果”、“从网页中提取正文内容”、“将一段文本总结成三点”。它解决什么问题在没有Skill概念时我们每次写AI应用都会把调用API、解析JSON、处理异常的代码到处复制粘贴。Skill将这些脏活累活封装起来提供统一的输入输出接口。它让开发者不再关心“怎么做到”只关心“用什么”和“得到什么”。一个关键判断一个设计良好的Skill应该是无状态或弱状态的。给它相同的输入理论上应该得到相同的输出。它的可靠性不依赖于上一次的执行结果。1.2 Agent解决“任务规划与决策”的调度问题Agent是拥有自主性能根据目标、上下文和可用工具Skill进行规划、决策和执行的实体。它的核心价值是调度与串联。它是什么一个可以理解指令、拆解目标、选择合适Skill并按顺序执行并能处理执行过程中分支情况的“大脑”。比如一个“旅行规划Agent”接到任务后会自主决定先查天气Skill A再查机票Skill B最后生成行程建议Skill C。它解决什么问题解决复杂任务无法通过单一Skill完成的问题。它引入了“规划”和“决策”层让AI应用从“工具调用”升级为“目标驱动”。一个关键判断Agent的复杂性不在于它本身多“智能”而在于它如何稳健地管理一个可能失败、有分支、需要回溯的任务流程。这是工程上最大的挑战。1.3 Harness解决“工作流稳定执行”的工程问题这是最容易被忽略但恰恰是生产环境最重要的概念。Harness马具/挽具原意是控制马匹的工具在这里它指的是一套用于控制、监控和保障Agent或工作流稳定运行的工程框架。它是什么不是某个具体的库而是一种设计模式或一套基础设施。它包括任务队列、状态管理、错误处理、重试机制、超时控制、日志记录、资源隔离等。它解决什么问题解决Agent在真实场景中“跑着跑着就挂了”、“出错后状态全丢”、“无法批量处理”等问题。Harness确保工作流像生产线一样可启动、可暂停、可恢复、可监控。一个关键判断你可以没有一个叫“Harness”的库但你的系统里必须有Harness的思想和实现。否则你的Agent永远只是个实验室Demo。1.4 Subagent解决“复杂任务分解与模块化”的架构问题Subagent是Agent的进一步抽象和分解。你可以把它理解为一个专注于特定子领域的Agent它本身可能也由多个Skill组成。它是什么一个更大、更复杂Agent的组成部分。例如一个“内容创作Agent”可能包含“资料搜集Subagent”、“文案撰写Subagent”和“排版优化Subagent”。它解决什么问题解决单一Agent过于臃肿、职责不清、难以维护的问题。通过Subagent进行模块化设计可以实现关注点分离、独立开发和测试以及更灵活的编排。一个关键判断Subagent的本质是架构设计。它不是为了概念而概念而是当你的主Agent逻辑复杂到一定程度时自然产生的分解需求。Subagent之间通过清晰的接口如消息、事件通信。理解了这四者分别解决什么问题我们就能看到一条清晰的路径用Skill构建砖块用Agent设计蓝图用Harness搭建坚固的脚手架和流水线再用Subagent来划分功能模块构建更复杂的系统。2. 从单次成功到批量稳定Harness工程之道是分水岭让我们回到开头的故事。为什么单次运行成功批量就崩溃因为单次运行掩盖了所有工程问题。Harness要解决的正是批量、稳定运行所必须面对的“脏活”。2.1 一个最小Harness应该包含什么你不一定需要一个庞大的框架但你的代码里必须有这些要素任务定义与输入管理# 不好的做法直接硬编码 result travel_agent.run(“帮我规划一下北京三日游”) # 好的做法任务对象化 class Task: def __init__(self, task_id, user_input, contextNone, priority1): self.id task_id # 唯一标识用于追踪 self.input user_input self.context context or {} self.priority priority self.status “pending” # pending, running, success, failed, retrying self.result None self.error None self.retry_count 0 self.created_at datetime.now()为每个任务分配唯一ID并封装状态这是所有后续监控和重试的基础。执行引擎与状态机 核心是一个循环或事件驱动引擎它从任务队列中取出任务改变其状态pending-running交给具体的Agent执行然后根据结果更新状态success/failed。状态必须持久化哪怕只是写到一个文件或数据库里防止进程崩溃后任务丢失。错误处理与重试机制 这是Harness的心脏。不能一出错就整个流程崩溃。def execute_task_with_retry(task, max_retries3): while task.retry_count max_retries: try: task.status “running” # 这里是实际执行Agent的地方 task.result agent.execute(task.input, task.context) task.status “success” log_success(task) return except TransientError as e: # 网络超时等可重试错误 task.retry_count 1 task.error str(e) task.status “retrying” log_retry(task, e) time.sleep(2 ** task.retry_count) # 指数退避 except FatalError as e: # 逻辑错误等不可重试错误 task.status “failed” task.error str(e) log_failure(task, e) return # 重试耗尽 task.status “failed” task.error “Max retries exceeded” log_failure(task)关键点区分“可重试错误”如网络超时、API限流和“不可重试错误”如输入格式永远错误。对前者采用指数退避策略。超时控制 AI调用尤其是大模型响应时间不确定。必须设置超时防止单个任务卡死整个系统。import signal class TimeoutException(Exception): pass def execute_with_timeout(agent_func, args, timeout_seconds30): def handler(signum, frame): raise TimeoutException(“Execution timeout”) signal.signal(signal.SIGALRM, handler) signal.alarm(timeout_seconds) try: result agent_func(*args) signal.alarm(0) # 取消闹钟 return result except TimeoutException: # 记录超时触发重试或失败 raise日志与可观测性 这是调试和运维的生命线。日志不能只是print至少要记录任务ID、时间戳、执行阶段、输入、输出、错误信息、耗时。# 结构化日志比纯文本好得多 log_entry { “task_id”: task.id, “timestamp”: datetime.now().isoformat(), “level”: “INFO”, “stage”: “agent_execution”, “agent”: “travel_planner”, “input_snippet”: str(task.input)[:100], # 避免日志过大 “status”: task.status, “duration_ms”: duration, “error”: task.error } # 写入文件或日志系统2.2 为什么Harness如此重要却常被忽视因为它的价值在“规模”和“时间”上才能体现。对单个任务Harness显得冗余。直接调用agent.run()最简单。对10个任务你可能开始需要手动重试失败的那两个。对1000个任务且需要每天定时跑没有Harness你的工作就变成了“运维工程师客服”整天忙于救火。Harness的本质是将“运行AI任务”从一种手工操作转变为一种可管理、可预测的工程过程。它不直接贡献业务功能但它决定了业务功能能否可靠地交付。3. 实战架构构建一个带Harness的多Agent协作系统现在我们把这些概念组合起来设计一个能真实运行的系统。假设我们要构建一个“智能内容助手”它能够根据一个主题自动搜集资料、撰写文章、并生成配图建议。3.1 第一步定义Skill我们的工具库我们把原子能力封装好。每个Skill都是独立的函数或类有明确的输入输出。WebSearchSkill: 输入关键词输出摘要和链接列表。DataExtractSkill: 输入网页URL输出纯净正文和关键数据。OutlineGenSkill: 输入主题和资料输出文章大纲。CopywritingSkill: 输入大纲和语气要求输出文章段落。ImagePromptSkill: 输入文章段落输出文生图提示词。FormatCheckSkill: 输入文章草稿输出语法和格式修改建议。3.2 第二步构建Subagent功能模块我们将大任务分解每个Subagent负责一个环节并使用多个Skill。ResearchSubagent:职责负责信息搜集与整理。内部流程WebSearchSkill- 筛选链接 -DataExtractSkill并发- 信息去重与摘要。输出一份结构化的研究简报。WritingSubagent:职责负责内容创作。内部流程接收研究简报 -OutlineGenSkill-CopywritingSkill按大纲分部分生成-FormatCheckSkill。输出一篇格式良好的文章草稿。EnhancementSubagent:职责负责内容增强。内部流程接收文章草稿 -ImagePromptSkill为每个章节生成- 可能调用外部AIGC API获取配图。输出带配图建议的完整内容包。3.3 第三步设计主Agent与工作流编排主ContentAssistantAgent不干具体活它的核心是编排。接收用户请求“写一篇关于新能源汽车电池技术突破的科普文章”。任务解析与规划分析需求拆解为研究-撰写-增强三个阶段。调用Subagent创建任务T1调用ResearchSubagent传入主题。等待T1完成获取研究简报。创建任务T2调用WritingSubagent传入研究简报。等待T2完成获取文章草稿。创建任务T3调用EnhancementSubagent传入文章草稿。结果整合与返回将T3的输出整合后返回给用户。这里的“等待”和“创建任务”是关键它们需要由Harness层来管理而不是简单的同步函数调用。3.4 第四步用Harness贯穿始终实现工程化这才是将蓝图变为可运行系统的关键。我们为上述架构穿上Harness的“铠甲”。任务队列用户请求到来主Agent不立即执行而是生成一个主任务MainTask放入队列。一个独立的“工作流引擎”消费这个队列。状态持久化MainTask和它产生的T1T2T3子任务每个的状态pending running success failed、输入、输出、错误信息都存入数据库如SQLite/PostgreSQL。子任务调度工作流引擎根据MainTask的规划依次创建和调度子任务。T1成功后才创建T2。这里可以使用轻量级工作流引擎如Prefect、Airflow的核心思想甚至自己实现一个简单的状态机。统一的错误处理与重试每个Skill、每个Subagent的调用都被Harness包裹。WebSearchSkill网络超时自动重试3次。WritingSubagent因内容违规调用失败标记为不可重试错误通知人工审核。超时控制为每个Subagent设置合理超时如研究5分钟撰写10分钟。全面日志每个任务的开始、结束、耗时、调用哪个Skill、输入输出摘要注意脱敏都记录到结构化日志系统便于用Grafana等工具查看仪表盘。最终你的系统运行起来后你看到的不是一个黑盒。你能在仪表盘上看到今天处理了100个主任务成功率98%。失败的两个一个是因为源网站不可用Research阶段失败一个是因为生成内容过长Writing阶段失败。你还能看到每个Subagent的平均耗时发现EnhancementSubagent是瓶颈因为它调用的外部文生图API很慢。于是你考虑对其做缓存或异步优化。4. 避坑指南与进阶思考从“能用”到“好用”当你按照上述框架搭建系统时一定会遇到具体问题。以下是一些常见的“坑”和进阶思考。4.1 新手最容易掉入的五个坑坑忽视任务标识与状态追踪现象任务失败后不知道是哪个用户的哪个请求出了问题无法定位和重试。解决为每一个请求生成唯一ID如UUID并在整个调用链中传递这个ID。无论是日志、数据库记录还是错误报告都带上这个ID。坑把重试当成万能药现象所有错误都无脑重试导致某些错误如“输入无效”被反复执行浪费资源甚至因频繁调用触发风控。解决严格区分错误类型。建立错误分类体系如网络错误、业务逻辑错误、资源不足错误、输入错误。只有对“暂时性失败”如网络超时、速率限制才进行重试并采用指数退避策略。坑同步调用导致系统脆弱现象主流程同步等待一个耗时很长的Subagent或外部API导致整个系统线程被占满一个慢请求拖垮所有请求。解决采用异步任务队列。主Agent只负责接收请求、创建任务、放入队列然后立即返回“任务已接收”。由后台的工作进程从队列中取出任务执行。用户可以通过任务ID来查询进度和结果。坑日志过于简陋或过于庞大现象print(“开始执行”)或者把完整的AI返回可能长达几千字全部打印导致日志文件爆炸有效信息被淹没。解决采用结构化、分级的日志。记录关键节点开始、结束、调用外部服务和元数据任务ID、耗时、状态对于大块数据只记录其摘要、长度或关键字段。使用INFOWARNINGERROR等级别。坑没有设置资源与超时限制现象一个任务陷入死循环或等待一个永不响应的API持续占用内存和CPU直到进程崩溃。解决为每个任务或Subagent设置明确的超时时间。对于Python可以使用signal模块或multiprocessing的timeout参数。同时监控系统整体资源使用情况。4.2 进阶思考何时需要引入更复杂的框架我们上面描述的Harness你可以用几百行代码自己实现一个雏形。但当系统变得更复杂时你可能需要考虑成熟的解决方案工作流编排当你的任务流不是简单的线性A-B-C而是有分支、循环、并行时可以考虑Prefect、Airflow、Kubernetes上的Argo Workflows。它们提供了强大的DAG有向无环图定义和可视化能力。分布式任务队列当任务量巨大单机无法处理时需要CeleryRabbitMQ/Redis或Dramatiq这样的分布式任务队列配合多个工作进程。Agent专用框架如果你希望更专注于Agent的逻辑而非底层工程可以考虑LangChain、LlamaIndex、AutoGen等。它们内置了部分Harness思想如记忆、工具调用但要注意它们通常不解决大规模、高可靠的生产级任务调度和监控问题你可能仍需将其接入自己的Harness或任务队列。可观测性从日志升级到OpenTelemetry标准的追踪Tracing、指标Metrics和日志Logging使用Prometheus、Grafana、Jaeger等工具构建完整的可观测性体系。4.3 最重要的原则从简单开始逐步演进不要一开始就追求一个完美、大而全的Harness系统。遵循以下路径单机脚本阶段先让核心Agent逻辑跑通用最直接的函数调用。添加基本Harness引入任务ID、状态记录、错误重试和超时控制。这能解决80%的稳定性问题。异步与队列化当请求量上来后引入任务队列将请求接收与执行解耦。引入工作流引擎当任务流程复杂到难以用代码直观管理时引入可视化的工作流编排工具。分布式与高可用当单机成为瓶颈再考虑分布式部署、负载均衡和高可用方案。每一步的推进都应该是当前业务规模下的痛点驱动的而不是技术焦虑驱动的。回到最初的问题Skill、Agent、Harness、Subagent这些概念最终指向的是一个目标将AI能力工程化、产品化。Skill是标准零件Agent是组装蓝图Subagent是功能模块而Harness则是让这条生产线能够7x24小时稳定、高效运转的车间管理系统、质量检测线和维修手册。真正有价值的AI应用不在于它用了多么前沿的模型而在于它能否在无人值守的情况下持续、可靠地完成交给它的工作。而实现这一点需要的不是更多的算法论文而是扎实的软件工程实践。这就是Harness工程之道的核心用工程的确定性去驾驭AI的不确定性。当你开始为你的AI应用设计第一个任务ID和状态字段时你就已经走在了从“玩家”到“建造者”的正确道路上。

相关新闻

StyleBuddy v0.4.0:情感化设计与情境感知如何重塑个人效率工具

StyleBuddy v0.4.0:情感化设计与情境感知如何重塑个人效率工具

2026/8/15 7:33:31

1. 项目概述:当“风格”遇见“伙伴”最近在折腾个人效率工具时,我一直在思考一个问题:市面上那么多待办清单、笔记软件,功能一个比一个强大,但为什么用起来总感觉冷冰冰的,像在完成一个个冰冷的任务&#x…

Nginx配置PHP-FPM全解析:从原理到排错实战指南

Nginx配置PHP-FPM全解析:从原理到排错实战指南

2026/8/15 7:33:31

1. 项目概述:Nginx与PHP的“握手”协议如果你刚把网站从Apache迁移到Nginx,或者第一次尝试在Nginx上跑PHP应用,大概率会在nginx.conf这个文件里卡住。这太正常了,Nginx处理PHP的方式和Apache的mod_php有本质区别,它不是…

Claude Code + Node.js + Git Bash:从零搭建本地网页开发环境

Claude Code + Node.js + Git Bash:从零搭建本地网页开发环境

2026/8/15 7:33:31

1. 项目概述:从零到一,用Claude Code构建你的第一个本地网页最近在开发者圈子里,Claude Code的热度持续攀升。作为一个集成了强大AI辅助编程能力的代码编辑器,它让很多原本需要手动敲击的重复性工作变得轻松高效。今天&#xff0c…

CTF入门实战指南:从零构建可持续进化的网络安全攻防能力体系

CTF入门实战指南:从零构建可持续进化的网络安全攻防能力体系

2026/8/15 8:43:34

你点开这篇文章,大概率不是因为“网络安全”这四个字听起来很酷,而是因为一个更具体、更现实的问题:“CTF到底怎么入门?为什么我看了那么多教程,还是连最简单的题都做不出来?”这种感觉我太熟悉了。几年前&…

套管换热器设计:从传热原理到CFD仿真的工程实践指南

套管换热器设计:从传热原理到CFD仿真的工程实践指南

2026/8/15 8:43:34

1. 项目概述:从“黑盒子”到“透明设计”的工程思维跃迁 在化工、能源、暖通乃至食品加工等众多工业领域,你总能见到一种结构看似简单、实则内藏乾坤的设备——套管式换热器。它由两根或更多同心圆管嵌套而成,冷热流体在管间和管内逆向或同向…

计算机毕业设计基于YOLO目标检测+多模态AI大模型分析的木材缺陷智能检测分析预警系统(源码+LW+PPT+讲解)

计算机毕业设计基于YOLO目标检测+多模态AI大模型分析的木材缺陷智能检测分析预警系统(源码+LW+PPT+讲解)

2026/8/15 8:43:34

温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台…

W25Q64JV SPI Flash驱动开发实战:从原理到文件系统与磨损均衡

W25Q64JV SPI Flash驱动开发实战:从原理到文件系统与磨损均衡

2026/8/15 8:43:34

1. 从零开始:为什么我们需要操作外部Flash? 如果你玩过STM32或者类似的微控制器,肯定遇到过内部Flash不够用的情况。项目做着做着,代码体积越来越大,或者需要存储大量的字库、图片、音频数据,内部那几十K、…

深度求索新模型本地部署指南:从环境准备到功能验证

深度求索新模型本地部署指南:从环境准备到功能验证

2026/8/15 8:43:34

这次我们来看一个来自深度求索(DeepSeek)的新模型发布。深度求索作为国内知名的AI研究机构,其模型更新一直备受关注。这次发布的新模型,从命名上看似乎带有“重置完成”的意味,这通常预示着模型架构、训练方式或能力边…

【TensorRTtSharp v4.0】使用 TensorRT CSharp API 完成 Dynamic Shape 与动态 Batch 推理

【TensorRTtSharp v4.0】使用 TensorRT CSharp API 完成 Dynamic Shape 与动态 Batch 推理

2026/8/15 8:33:34

生产环境中的输入尺寸很少永远固定:服务端会合并不同数量的请求,图像模型可能接收多种分辨率,序列模型的长度也会变化。TensorRT 用动态维度和 Optimization Profile 描述这些变化范围,但仅把输入维度写成 -1 并不足以完成推理。构…

比较好的亚太EMBA,问了6位校友师资差别真的挺大

比较好的亚太EMBA,问了6位校友师资差别真的挺大

2026/8/13 11:01:28

比较好的亚太EMBA核心差异先看什么?对于希望兼顾工作与系统管理能力提升的亚太区高管而言,筛选匹配度高的EMBA项目时,师资配置是决定学习体验与实际收获的核心要素之一。我们结合3-4个公开信息透明、办学历史较长的亚太区主流EMBA项目特点&am…

备考3个月对比6份资料 海外游学的亚洲EMBA面试注意点

备考3个月对比6份资料 海外游学的亚洲EMBA面试注意点

2026/8/14 10:48:24

备考海外游学的亚洲EMBA面试,核心要围绕项目国际化设计逻辑、个人跨文化管理经验匹配度两个维度准备,避免把游学模块等同于普通旅游参访的认知偏差。不少备考者花3个月对比6份资料,却容易忽略面试官对“国际视野落地能力”的考察——比如香港…

比较好的国内EMBA,问了二十位校友聊透人脉价值

比较好的国内EMBA,问了二十位校友聊透人脉价值

2026/8/13 17:17:06

比较好的国内EMBA核心差异体现在哪些方面?比较好的国内EMBA的核心长期价值,很大程度上依托于校友网络的连接质量与资源生态的活跃度,这也是不少高管在择校时优先考量的因素。我们结合3-4个市场关注度较高的项目公开信息,从课程、师…

一文读懂快消WMS怎么选?2026年国内外10大主流WMS品牌盘点

一文读懂快消WMS怎么选?2026年国内外10大主流WMS品牌盘点

2026/8/15 0:03:07

快消品(FMCG)是流通速度较快、竞争较为激烈的行业之一。一瓶饮料从出厂到消费者手中,往往只有几十天甚至几天的周转窗口。这决定了快消行业的仓储管理系统(WMS)与制造业、电商行业存在明显区别:它不仅需要管…

内景 空间站内部 中国空间站 太空 内仓

内景 空间站内部 中国空间站 太空 内仓

2026/8/15 0:03:07

本项目为前几天收费帮学妹做的一个项目,在工作环境中基本使用不到,但是很多学校把这个当作编程入门的项目来做,故分享出本项目供初学者参考。 一、项目描述 空间站内部 中国空间站 太空 内仓 地址:本地PC端运行(或Web…

重新定义数据接口:3个突破性场景让通达信数据读取更智能

重新定义数据接口:3个突破性场景让通达信数据读取更智能

2026/8/15 0:03:07

重新定义数据接口:3个突破性场景让通达信数据读取更智能 【免费下载链接】mootdx 通达信数据读取的一个简便使用封装 项目地址: https://gitcode.com/GitHub_Trending/mo/mootdx 当我们面对海量金融数据时,传统的数据获取方式往往让我们陷入困境—…

摆脱论文困扰!盘点2026年全网爆红的的AI论文写作工具

摆脱论文困扰!盘点2026年全网爆红的的AI论文写作工具

2026/8/15 1:04:46

一天写完毕业论文在2026年已不再是天方夜谭。2026年最炸裂、实测能大幅提速的AI论文写作工具,覆盖选题构思、文献整理、内容生成、格式排版等核心场景,真正帮你高效搞定论文难题。 一、全流程王者:一站式搞定论文全链路(一天定稿首…

导师推荐!2026最新AI论文工具测评与实用推荐

导师推荐!2026最新AI论文工具测评与实用推荐

2026/8/9 13:42:46

2026年真正好用的AI论文工具,核心看生成的论文质量、低AI味、格式正确、学术适配四大指标。综合实测,千笔AI、ThouPen、豆包、DeepSeek、Grammarly 是当前最值得推荐的梯队,覆盖从免费到付费、从中文到英文、从文科到理工的全场景需求。 一、…

告别游戏崩溃:XCOM 2模组管理器的智能革命

告别游戏崩溃:XCOM 2模组管理器的智能革命

2026/8/14 19:35:14

告别游戏崩溃:XCOM 2模组管理器的智能革命 【免费下载链接】xcom2-launcher The Alternative Mod Launcher (AML) is a replacement for the default game launchers from XCOM 2 and XCOM Chimera Squad. 项目地址: https://gitcode.com/gh_mirrors/xc/xcom2-lau…