【HarmonyOS 7 小艺 Skill 开发实战】 09 复用已有Skill与Agent组合会后整理和跟进能力
文章目录
前言
会后行动清单已经列出林舟和许岚的工作,用户又希望把它们与蓝桥项目的旧事项一起整理成跟进文字。当前会议说明了新的安排,应用里的旧记录则反映之前保存的工作,两份内容需要一起查看。
文字整理沿用已有规则,旧记录的检索和读取则由会议应用的只读 Agent 负责。组合程序接收这两份结果,生成待核对草稿,不发送、不保存,也不更新旧事项。检查时应先确认规则和数据分别来自哪里,再用固定响应比较组合后的文字。这样,出现错误时就能判断应该回到提取、检索还是文字组织环节。

一、打开源文件,确定到底复用哪一份整理规则
从专栏目录打开 examples/reuse/README.md,再打开同目录的 bindings.json。清单记录了整理技能版本 0.2.0、旧 Agent 卡片版本 1.1.0 和对应源文件位置。先沿着 sourceSkill.path 打开 SKILL.md,确认它只整理用户提供的会议文字,输出明确行动、建议与取消,并保留原句和缺失字段。目标跟进能力需要的就是这段整理规则,无法从版本号推断它还会保存、提醒或查询其他数据。
这份整理文件位于 examples/skill-02/meeting-actions/。平台后来也导出过版本号为 0.2.0 的文件,但两份指令内容不同,平台结果仍曾把 meetingDate 放进行动的 missingFields。因此,选择复用对象时要同时核对来源目录和具体内容。当前组合沿用本地维护文件,不能借相同版本号继承另一份平台包的评测结果,也不能把后者直接当成当前程序的输入来源。
继续查看 skillResourceId、agentResourceId 和 actualRuntimeToolSchema,当前三个位置均为 null,绑定状态为 PENDING。文件路径指向可阅读的源代码,平台资源标识指向账号中能够被选择的资源,两者各有用途。把路径复制进资源标识位置无法完成绑定。如果自己的账号里尚无可引用的源技能,先保留空值,完成后面的本地数据检查;等实际资源出现以后再记录详情中的标识与版本。

确认来源以后,还要区分三种标识。平台资源标识用来找到已有能力,Agent 卡片标识描述对应 Agent,记录标识则定位会议应用中的某条数据。把业务能力名填进资源位置,或把资源标识当成会议编号,都无法指向要读取的记录。当前固定响应带有夹具前缀,真实接入时应使用检索返回的标识,不把教学值带入设备查询。
旧记录能力的来源也有具体位置。绑定清单中的 recordService 指向已有会议应用的 RecordAgentService.ets,agentConfig 指向对应卡片配置。当前只使用其中的 meeting.search 与 meeting.overview,前者找到候选记录,后者读取选中记录和关联事项。目标技能无需重复实现旧工程的通信与生命周期,但需要知道它返回哪些字段,以及哪些动作并没有提供。只读能力的返回中有完成标记,没有更新旧记录或发送通知的方法。
二、在创建页面选择资源,随后检查生成文件
进入小艺开放平台的 Skill,选择 新建Skill,在创建对话中说明会后整理与跟进用途。输入框下方有 @ 入口,选择 Skill 后再选择来源。自己的已有能力应从 我的Skill 中查找,公开能力可以查看 Skill广场,合作资源则核对 合作伙伴 来源。找到资源以后先看详情,确认文字整理范围、源版本和使用条件,再把它添加到当前创建对话。

添加后继续打开目标生成文件,检查行动字段和缺失规则是否进入 SKILL.md。引用会带入能力定义、执行逻辑和参数规范,目标生成过程仍可能根据新需求调整内容。例如跟进功能需要读取旧事项,也不能因此让原来的建议项变成正式行动。只有导出的目标规则保留了原有分类,并明确新增动作在哪里结束,才能继续检查资源调用。
旧记录从同一个 @ 入口添加,选择 Agent,再选择 我的Agent 或实际合作来源。找到会议应用对应资源后,核对类型与资源详情。这个案例需要已有应用的端 A2A 只读能力;列表中的其他 Agent 即使名称相近,也可能采用不同调用方式,或者根本没有会议数据。应用安装、平台关联与目标设备会影响这条路径,资源卡片添加成功还不能说明设备已经返回记录。

创建页面的 Skill检索 用于选择生成范本,@ 用于添加已有资源,运行时则要通过系统提供的工具取得结果。检索中一次选择一个主要范本,没有匹配内容时可以跳过。选到相似范本以后仍需检查生成规则,添加资源以后仍需验证调用,不能把这两个页面动作当成已经读到旧记录。
运行时使用的工具名称与参数结构,需要从真实资源详情或生成文件中读取。系统基础工具中虽然有 load_skill,当前却没有本案例的实际调用参数,因此不能自行写成 load_skill(name)。Agent 的外层工具参数与内部业务 JSON 也需要分别确认。取得实际 Schema 后,再记录它怎样接收业务文本、哪个字段携带技能标识,以及返回怎样交给下一步;外层结构尚未取得时,先保留本地组合路径。
三、查到候选以后,让用户选定一条旧记录
在真实资源已经可调用的情况下,先按项目相关关键词检索。旧业务服务接受的检索内容如下,keyword 使用蓝桥,limit 使用五条,便于把候选记录交给用户辨认。它是 Agent 内部的业务输入,真正调用时还要由已核对的外层工具接收,不能直接粘贴到一个未知工具并认为参数已经适配。
{"skillId":"meeting.search","keyword":"蓝桥","limit":5}
检查返回的记录标识、标题和开始时间。如果出现多条蓝桥记录,就让用户根据时间和标题选定本次要核对的一条。标题相同也可能属于不同会议,因此下一步以真实记录标识为准。没有命中时,可以解释本次关键词下没有结果,再请用户调整关键词;资源报错时则先排查连接或权限,这两种返回会导致不同操作。
选定以后,再读取这一条记录的概览。下面的 meetingId 必须替换成候选中实际返回并由用户选中的标识,不能使用当前新会议的 M-20261004-01 代替。当前会议编号描述刚整理的文字,旧记录标识指向应用数据库中的对象,两者即使碰巧相似也需要分别核对。
{"skillId":"meeting.overview","meetingId":"用户选中的真实记录标识"}
检索的 limit 范围是一到二十。概览先确认记录存在,再读取关联行动,最多返回二十项,并用 actionsTruncated 标明是否截断。读取成功以后先看这个标记,再看事项内容。如果记录已经删除,重新选择候选;如果标记为 true,当前返回不能支撑完整历史比较,需要回应用查看剩余事项。不能因为概览包含几条行动,就宣布全部旧工作都已经核对。
四、把两份输入并排打开,保留各自的字段含义
打开 samples/09-current-actions.json,先看项目、会议和日期,再展开 actions。当前共有两项:林舟在十月六日前补齐接口清单,许岚在十月八日前确认联调窗口。每项都包含 title、owner、dueDate、source 和 missingFields,原句可以用来判断日期和负责人是否来自这次会议。文件中的增加短信提醒位于 suggestions,没有因为要生成跟进文本就自动升级为工作安排。

再打开 samples/09-agent-overview-fixture.json。文件很短,格式化阅读以后可以看到一条蓝桥联调准备记录、一项整理测试账号清单的旧工作,以及 isChecked: false。这个响应是固定教学数据,文件中的 fixture 标识提醒它没有来自当前设备。它的作用是让本地程序收到与旧业务结构相同的对象,检查组合过程,不用等待真实账号与设备条件。

当前行动包含负责人、截止日期与原句,旧事项只有 id、content 和完成标记,组合时不能补出旧数据没有提供的信息。isChecked 只说明应用中的勾选状态,也不能证明这项旧工作与当前某条行动相同。因此,草稿分别呈现本次安排和历史事项,不按相近标题自动归并,让用户继续核对两边是否有关联。

两条输入分别进入跟进草稿,并保留各自来源。箭头表示组合内容,不表示按相近标题归并为同一项任务;草稿仍需用户核对,也没有触发业务写入。
打开文件比较时,可以先用原句确认每项新行动,再把旧记录的标题与标识单独记下。原句来自本次会议,因此能说明林舟和许岚当前承担什么;旧事项文本只说明应用保存过什么。草稿里同时出现两类内容时,用户才能判断一项工作究竟是新安排还是历史提醒。发现旧工作已完成却仍为未勾选状态,应回应用核对实际记录,不能在组合输入中直接改成完成来代替业务更新。
继续核对 records 数组和 actionsTruncated。当前固定响应只包含一条已选记录,并明确标记未截断,这满足本地组合的入口条件。后面接入真实返回时,也需要保持同一关系。把多条检索候选直接交给组合函数,会跳过用户选择;省略截断字段,则会让程序无法判断历史是否完整。这两种输入都应先修正来源步骤,不能为了通过程序而随意删掉记录或补一个假标记。
五、运行组合程序,按两种实际返回检查草稿
将终端的工作目录设为根目录再执行下面两行命令。第一行进入 examples/reuse/,第二行运行组合程序;进入子目录以后应该能看到 compose.py。程序使用相对于自身的路径读取前述输入,所以无需在命令中手工拼接 JSON,也不需要安装额外库。文件找不到时先核对两行命令的起始目录,不要去修改源码中的读取位置。
cd examples/reuse
python3 compose.py
如果命令结束却没有拿到预期对象,先看终端末尾是JSON还是异常堆栈。读取错误通常会指出找不到的文件,参数错误则由组合函数给出具体原因。脚本末尾的入口分别调用有固定响应和没有资源的两条路径,所以打印两个分支是正常行为,不能把它当成执行了两次真实Agent查询。这里的输出只显示在终端,不会自动覆盖保存的原始结果,比较时可以同时打开原件。
程序会在终端打印一个 JSON 对象,已有实际输出保存在 samples/09-actual-local-fixture.json,可以先打开原件逐项核对。根字段 realPlatformInvocation 为 false,表明这次没有经过平台调用。withFixture 使用固定的历史响应,missingResource 则没有传入旧数据。两条路径放在同一次输出中,可以直接比较有无历史数据时草稿怎样变化。

在 withFixture 中,草稿保留林舟和许岚的负责人、日期与工作名称,又追加蓝桥联调准备的记录标识及未勾选旧事项。末尾明确说明旧数据只是核对材料,还没有按原文判断两边是否指向同一工作。这个结果说明组合函数能把已提供的字段组织成文字,不能证明上游从会议原文提取正确。发现负责人或日期错误时,应回到当前清单和原句处理,不能只在草稿中改一个名字。
没有传入旧数据时,missingResource 仍保留本次两项工作,同时说明旧记录能力未绑定或不可用,历史核对没有完成。程序没有查询,就不能把这份返回说成没有发现旧记录。真实对话准备采用这个分支时,应先告诉用户缺少历史比较,再确认是否继续使用当前输入。本地入口直接打印该分支,只能展示文字变化,不能代表用户已经接受。
两条返回都有 sent: false 与 saved: false,草稿也写明尚未发送、保存或提交。检查到这里可以继续人工核对文字,不应等待备忘录或业务列表自动出现记录。如果下一个需求是保存或更新旧事项,先确认存在对应写入能力与用户确认过程;当前只读 Agent 和组合程序都没有执行这些动作。
六、错误出现时,回到缺失的那一步
打开 compose.py,先看草稿字符串建立之前的入口检查。只有资源状态明确、行动数组存在、旧响应包含一条选中记录,并且截断标记严格为 false 时,完整组合才继续。下面的片段保持现有程序的检查顺序,可以对应前面候选选择和完整概览两个操作。
if resource_state == 'available':
if not isinstance(overview, dict) or len(overview.get('records', [])) != 1 or not isinstance(overview.get('actions'), list):
raise ReuseError('A selected record and overview are required')
if overview.get('actionsTruncated') is not False:
raise ReuseError('Truncated records cannot support a complete comparison')
elif overview is not None:
raise ReuseError('Unavailable resource must not carry fabricated results')

看到 A selected record and overview are required 时,检查传入的是检索候选还是已选概览。records 有两条时,需要先完成选择,不能随便删除其中一条来消除错误。看到 Truncated records cannot support a complete comparison 时,检查 actionsTruncated 是否缺失或标记为截断。当前程序在这里停止,尚未建立任何草稿,不能把错误解释成已经返回部分跟进内容。
资源状态为不可用却仍附带概览时,程序返回 Unavailable resource must not carry fabricated results。这条检查防止调用者一边报告资源失败,一边又把固定旧数据写成真实查询结果。要观察完整分支,就明确使用固定响应并保留其身份;要观察缺少资源,就不提供概览。选择哪条路径取决于实际拿到了什么数据,不能只为得到更完整的文字而改状态。
截断标记还要核对类型。JSON 中的布尔值 false 与字符串形式的值具有不同含义,当前函数要求它确实是布尔值;字段缺失也不会被当作未截断。遇到这一错误时,沿实际响应检查输出约定与外层解析,确认完整性标记在哪一步丢失。只有来源能够证明没有截断,才允许继续生成,不能在目标文件里无条件补值让检查通过。
当前行动缺少原句也会停止。负责人或日期为空时,程序则保留该项工作,并在草稿中写待确认;它没有负责全部字段校验,也不会重新理解原文。复现这些情况可以在本目录执行 python3 -m unittest -v test_compose.py,四组现有检查覆盖字段保留、资源缺失、多候选与截断,以及缺少负责人。检查通过后仍要返回输入确认原文含义,字符串组合不能判断会议安排是否真实有效。
检查草稿时还可以按工作对象逐项回读。第一项应该保留林舟与十月六日,第二项应该保留许岚与十月八日,旧事项则只有测试账号清单和未勾选说明。短信建议不应出现为已经分派的工作,缺失分支也不应出现旧记录标题。如果其中一处变化,先比较当前输入、旧响应与对应分支,再决定修正整理规则还是组合显示。这个顺序能够避免用流畅的草稿掩盖上游字段错误。
把平台绑定接上以后,再使用相同输入比较实际调用。先记录源资源与工具结构,再确认搜索传入蓝桥、概览传入用户选中标识,草稿生成后比较负责人、日期与旧事项。源规则升级时重复这组比较,可以发现字段或范围变化。来源版本和返回结构都保持一致以后,才有依据说明新旧能力组合仍然按预期工作。
总结
本地组合程序已经能够把当前安排与固定旧记录分别写进草稿,也能显示资源缺失的情况;候选未选定或概览截断时,它会停止。真正接入时,仍要先取得用户选中的完整概览,再核对草稿是否保留两份数据各自的含义。文字整理规则、资源调用和最终组合分别检查,才能判断哪项工作已明确,哪项还需要回到会议原文或应用中确认。
配套文件
1. 目标技能的整理与历史核对规则
文件路径:examples/reuse/meeting-actions/SKILL.md,展示完整内容。
目标技能先整理当前会议,再按真实资源定义读取历史记录。下面保留完整规则,缺少资源和外层工具参数时的停止条件也保留在内。
---
name: meeting-actions
description: 根据用户提供的会议文字整理行动,并在已绑定的只读会议记录能力可用时辅助核对历史事项,生成待核对的跟进文本;不发送、不保存、不提交。
---
## 整理当前会议
读取references/extraction-rules.md的行动判断与字段规则。沿用projectId、meetingId、meetingDate、actions、suggestions、cancellations结构。原文没有给出的负责人或日期保留null和missingFields。跟进文本只包含明确行动,不能将建议或取消事项写成待办。
## 历史记录核对
这是本地作者规则,资源绑定尚未完成。运行前必须从平台资源详情取得真实Skill/Agent标识及生成的工具Schema,并完成bindings.json记录;未取得时不得用本地路径、Agent卡片id或能力skillId充当平台资源id。
已绑定只读会议Agent时,先用其实际Schema发送meeting.search的输入JSON,keyword为用户提供的标题关键词,limit范围1到20。多条候选需要用户选定记录,再按实际Schema请求meeting.overview及真实meetingId。不能把任意第一条候选当作当前会议。
读取结果records含id、title、startTimeMs;actions含id、content、isChecked,actionsTruncated表示结果是否截断。历史记录没有负责人、截止日期及原文依据,不能从这些字段推导。新事项与旧记录分别展示,未经原文确认不自动归并。
运行时加载其他Skill只使用平台实际提供的load_skill接口及参数;创建时引用资源不能视为运行时已经加载。没有已绑定资源或Schema时停止历史调用,并说明历史核对未完成。用户允许继续时仅生成当前输入的跟进草稿。
## 生成跟进草稿
草稿沿用当前清单的title、owner、dueDate及source,不修改正式行动结果。缺失字段先标注待确认。历史响应为空只表示所选查询未命中;资源超时、报错或不可用不表示没有旧记录。actionsTruncated=true时说明没有完成全部历史核对。
最终展示当前行动、已经取得的旧记录及待确认说明,并明确文本尚未发送、保存或提交。用户要求发送时说明本版本没有发送能力,不自动添加通知工具。
规则引用的提取文件仍需放在同一技能目录的 references/ 中。资源尚未绑定时,这份文件不能证明平台已经调用了旧 Agent。
2. 目标技能的版本与依赖
文件路径:examples/reuse/meeting-actions/module.json,展示完整内容。
这份配置与目标技能放在同一目录,当前没有填写工具依赖。
{"version":"1.0.0","availableOn":["phone"],"toolDependencies":[]}
真实资源需要通过平台详情确认,不能把业务能力名直接补成资源标识。
3. 复用源规则中的输出约定
文件路径:examples/reuse/meeting-actions/references/extraction-rules.md,展示相关片段。
比较源规则与目标规则时,先核对两边是否保留同一套输出字段。下面只摘录源文件的输出约定,完整提取规则仍在原路径。
## 输出约定
根对象包含 projectId、meetingId、meetingDate、actions、suggestions、cancellations。
未提供的 projectId、meetingId、meetingDate 输出 null;meetingDate 已提供时使用 YYYY-MM-DD。
actions 的每一项只能包含 title、owner、dueDate、source、missingFields。
title 为工作名称;owner 为原文明示姓名或 null;dueDate 为 YYYY-MM-DD 或 null。
source 为原文依据字符串。重复归并时按原文顺序用换行连接原句,不删掉关键条件。
missingFields 为数组,只能列 owner 和 dueDate;相应值为 null 时必须列出。
suggestions 与 cancellations 中每项包含 title、source;取消记录需要保留原文的取消范围。
无内容的分类输出空数组。归并说明和歧义提醒放在 JSON 后面的简短中文中,不添加根对象新字段。
输出原文依据用于用户核对,不输出内部思维过程。
目标规则中的历史记录字段另有来源,不能将它们混入当前行动的负责人、日期或原文依据。
4. 尚未完成的资源绑定字段
文件路径:examples/reuse/bindings.json,展示相关片段。
这份清单还包含源文件路径和摘要。下面只摘录资源标识、工具结构与资源缺失处理,末尾花括号对应原文件的结束位置;这段内容不能作为独立平台配置导入。
"skillResourceId": null,
"agentResourceId": null,
"actualRuntimeToolSchema": null,
"onMissingResource": "Explain unavailable; produce only current-input draft if user accepts incomplete historical check; never report no records."
}
三个空值需要在取得真实资源以后填写,当前不改成教学标识。
5. 完整跟进草稿组合程序
文件路径:examples/reuse/compose.py,展示完整内容。
这份程序接收当前行动与已选旧记录,先检查资源状态和概览是否完整,再分别组织两类内容。文件末尾保留固定响应和资源缺失两条本地路径,便于按第五节的命令运行。
"""Author local composer. Input fixtures are not real Skill/Agent execution evidence."""
import json
from pathlib import Path
class ReuseError(ValueError):
pass
def compose(actions, overview=None, resource_state='unavailable'):
if resource_state not in ('available', 'unavailable'):
raise ReuseError('Resource state must be explicit')
if not isinstance(actions, dict) or not isinstance(actions.get('actions'), list):
raise ReuseError('An action list is required')
if resource_state == 'available':
if not isinstance(overview, dict) or len(overview.get('records', [])) != 1 or not isinstance(overview.get('actions'), list):
raise ReuseError('A selected record and overview are required')
if overview.get('actionsTruncated') is not False:
raise ReuseError('Truncated records cannot support a complete comparison')
elif overview is not None:
raise ReuseError('Unavailable resource must not carry fabricated results')
lines = [f"{actions['projectId']}会后跟进草稿", f"会议 {actions['meetingId']},日期 {actions['meetingDate']}"]
for index, item in enumerate(actions['actions'], 1):
if not isinstance(item.get('source'), str) or not item['source']:
raise ReuseError('Every new action requires its original source')
if item.get('owner') is None or item.get('dueDate') is None:
lines.append(f"{index}. {item['title']},负责人或日期待确认。")
else:
lines.append(f"{index}. {item['owner']}在{item['dueDate']}前完成{item['title']}。")
if resource_state == 'available':
record = overview['records'][0]
lines.append(f"已读取的旧记录 {record['title']}(标识 {record['id']})。")
for item in overview['actions']:
label = '已勾选完成' if item['isChecked'] else '尚未勾选完成'
lines.append(f"旧记录事项 {item['content']},{label}。")
lines.append('旧记录只作为核对材料,尚未按原文判断新旧事项是否相同。')
else:
lines.append('旧记录能力未绑定或不可用,当前草稿没有完成历史核对。')
lines.append('这是待核对的跟进文本,尚未发送、保存或提交。')
return {'projectId': actions['projectId'], 'meetingId': actions['meetingId'],
'existingRecordsStatus': resource_state, 'sent': False, 'saved': False,
'draft': '\n'.join(lines)}
if __name__ == '__main__':
base = Path(__file__).resolve().parents[2]
current = json.loads((base / 'samples/09-current-actions.json').read_text())
fixture = json.loads((base / 'samples/09-agent-overview-fixture.json').read_text())
output = {'identity': 'author-local-fixture-result', 'realPlatformInvocation': False,
'withFixture': compose(current, fixture, 'available'),
'missingResource': compose(current)}
print(json.dumps(output, ensure_ascii=False, indent=2))
程序没有发出真实 Agent 请求,也没有执行发送或保存。它生成的文字仍需与两份输入逐项比较。
6. 当前会议的完整行动输入
文件路径:samples/09-current-actions.json,展示完整内容。
当前输入包含两项行动和一项尚未采用的建议。保留完整对象,才能核对组合程序是否只采用了明确行动。
{
"projectId": "blue-bridge",
"meetingId": "M-20261004-01",
"meetingDate": "2026-10-04",
"actions": [
{
"title": "补齐接口清单",
"owner": "林舟",
"dueDate": "2026-10-06",
"source": "林舟在2026年10月6日前补齐接口清单。",
"missingFields": []
},
{
"title": "确认联调窗口",
"owner": "许岚",
"dueDate": "2026-10-08",
"source": "许岚在2026年10月8日前确认联调窗口。",
"missingFields": []
}
],
"suggestions": [
{
"title": "增加短信提醒",
"source": "陈禾建议增加短信提醒,团队尚未决定。"
}
],
"cancellations": []
}
这份输入已经完成结构化,组合程序没有重新从原文提取负责人或日期。
7. 用于组合的固定旧记录响应
文件路径:samples/09-agent-overview-fixture.json,展示完整内容。
下面是本地使用的完整固定响应,记录标识带有 fixture 前缀,概览明确标记未截断。
{"records":[{"id":"fixture-record-001","title":"蓝桥联调准备","startTimeMs":1791014400000}],"actions":[{"id":"fixture-action-001","content":"整理测试账号清单","isChecked":false}],"actionsTruncated":false}
它用于比较组合行为,不能替代设备查询返回。
8. 有旧记录与缺少资源时的历史输出
文件路径:samples/09-actual-local-fixture.json,展示完整内容。
这份已有输出将两条本地路径放在同一个对象中,保留了未调用平台、未发送和未保存的标记。
{
"identity": "author-local-fixture-result",
"realPlatformInvocation": false,
"withFixture": {
"projectId": "blue-bridge",
"meetingId": "M-20261004-01",
"existingRecordsStatus": "available",
"sent": false,
"saved": false,
"draft": "blue-bridge会后跟进草稿\n会议 M-20261004-01,日期 2026-10-04\n1. 林舟在2026-10-06前完成补齐接口清单。\n2. 许岚在2026-10-08前完成确认联调窗口。\n已读取的旧记录 蓝桥联调准备(标识 fixture-record-001)。\n旧记录事项 整理测试账号清单,尚未勾选完成。\n旧记录只作为核对材料,尚未按原文判断新旧事项是否相同。\n这是待核对的跟进文本,尚未发送、保存或提交。"
},
"missingResource": {
"projectId": "blue-bridge",
"meetingId": "M-20261004-01",
"existingRecordsStatus": "unavailable",
"sent": false,
"saved": false,
"draft": "blue-bridge会后跟进草稿\n会议 M-20261004-01,日期 2026-10-04\n1. 林舟在2026-10-06前完成补齐接口清单。\n2. 许岚在2026-10-08前完成确认联调窗口。\n旧记录能力未绑定或不可用,当前草稿没有完成历史核对。\n这是待核对的跟进文本,尚未发送、保存或提交。"
}
}
比较结果时,重点核对两条当前行动和旧事项是否仍然分开,以及资源缺失分支是否明确说明未完成历史核对。
更多推荐



所有评论(0)