13 KiB
13 KiB
主题资料收集工作流:执行
由状态 CONFIRM_EXECUTION、EXECUTE、VERIFY、RESTORE 加载。
本文档负责最终写操作确认、目标创建、资源移动、验证、恢复行为、RollbackSnapshotItem 和执行日志。不得修改搜索、召回、分类规则或计划 schema。
本文档只服务 topic_move_collector。进入本文档时,workflow_id 必须是 topic_move_collector;不得把当前任务改路由到其他 workflow。
必读上下文
执行本文档规则前:
- 按
../../lark-shared/SKILL.md处理写操作确认、高风险操作、身份、认证和权限。 - 按
lark-drive-create-folder.md创建 Drive 文件夹。 - 按
lark-drive-move.md执行 Drive 移动。 - 按
../../lark-wiki/references/lark-wiki-node-create.md创建 Wiki 节点。 - 按
../../lark-wiki/references/lark-wiki-move.md执行 Wiki 移动和 Drive 文档移动到 Wiki。 - 按
../../lark-wiki/references/lark-wiki-move-to-drive.md将 Wiki 节点移出到 Drive 文件夹。 - 按
lark-drive-delete.md删除本次 workflow 新建的 Drive 文件夹。 - 按
../../lark-wiki/references/lark-wiki-node-delete.md删除本次 workflow 新建的 Wiki 节点。 - 需要轮询异步任务时,按
lark-drive-task-result.md执行。 MovePlanItemschema 由lark-drive-workflow-topic-move-collector-review-plan.md定义,本文件只消费已确认计划。
状态:CONFIRM_EXECUTION
进入条件:移动计划已准备,且用户要求执行。
必须:
- 执行前展示所有写操作类别。
- 将目标创建和资源移动分开展示。
- 展示默认纳入的高相关资源。
- 如有用户选择的中相关资源,也要展示。
- 展示跳过分组和原因。
- 明确展示跨容器移动。
- 展示无移动权限和移动权限未知的资源数量。
- 请求用户明确确认。
- 确认前校验每个
move_resource项都包含完整command_family、command_args、权限快照和rollback_input;缺失时必须返回PLAN_MOVE重新生成计划,不得在执行阶段补猜。 - 只有
move_permission_state=movable且target_write_state=confirmed的计划项可以列入“将移动”。 - 对每个
rollback_supported=false的计划项逐项展示标题、当前位置、目标位置、不可恢复原因和影响,不得只展示数量。
确认 UI
请确认是否执行以下写操作:
本次搜索范围:<当前用户 owner / 负责的资源 | 所有当前身份可见资源>
将创建:
- 目标名称|父级位置|目标类型
将移动:
- 标题|类型|当前位置|目标位置|原因
不会移动:
- 中相关未选择:N 项
- 低相关:N 项
- 无权限:N 项
- 无移动权限:N 项
- 移动权限未知:N 项
- 无法验证:N 项
- 不支持移动:N 项
风险提示:
- 不可自动恢复:N 项
- 标题|当前位置|目标位置|不可恢复原因|影响:移动成功后 workflow 无法自动搬回原位置,需要手动处理
- 如果搜索范围是所有当前身份可见资源,移动权限未知项不会移动。
确认后才会创建目标和移动资源。
如果不存在不可自动恢复项,请回复“确认执行”开始写操作。
如果存在不可自动恢复项,请回复“确认执行,包括不可自动恢复项”;普通“确认执行”不满足本次风险确认。
也可以回复“调整计划”返回选择资源,或回复“取消”结束流程。
如果用户修改选择或相关性分组,废弃当前 move_plan_items 并返回 PLAN_MOVE 重新生成计划;不得在 CONFIRM_EXECUTION 直接局部改写计划。
状态:EXECUTE
进入条件:用户明确确认写操作;存在 rollback_supported=false 的计划项时,用户已明确确认包括不可自动恢复项。
必须:
- 只执行已确认
MovePlanItem.command_family和command_args;不得回查ResourceItem补齐或改写命令参数。 - 当存在
action_type=create_target的MovePlanItem时,先创建目标。 - 目标创建后记录返回 token;只允许把
created_by_plan:<create_target plan_id>引用解析为该 token,并把解析后的实际参数写入execution_journal。不得重新搜索或猜测目标。 - 目标 token 引用解析成功后再移动依赖该目标的资源;解析失败时停止依赖该创建目标的移动并记录 blocker,不得替换为其他目标。
- 执行任何写操作前,基于每个已确认计划项的
rollback_input生成rollback_snapshot。rollback_supported=false且已有明确rollback_blocker的快照视为完整风险快照,不阻塞其他项。 - 执行任何写操作前,初始化
execution_journal。 - 每次写操作尝试后记录
execution_journal。 - 单项失败后可继续执行相互独立的移动;目标创建失败时必须停止。
- 不得移动
permission_denied、no_move_permission、move_permission_unknown、unverifiable、low或unsupported_move_target项。 - 不得移动
move_permission_state!=movable或target_write_state!=confirmed的资源。 - 如果移动命令返回权限错误,记录失败原因,不自动申请权限,不自动重试同一移动。
- 如果
rollback_supported=true但rollback_input缺少恢复所需字段,将该计划项标记为failed/plan_snapshot_incomplete并跳过;不得在未重新确认风险的情况下把它静默降级为不可恢复项,也不得阻塞其他独立项。
移动方式选择
| 来源 -> 目标 | 移动方式 |
|---|---|
| Drive resource -> Drive folder | drive +move |
| Drive document-like resource -> Wiki target | wiki +move 的 docs-to-wiki 模式;默认不可自动恢复 |
| Wiki node -> Wiki target | wiki +move --node-token |
| Wiki node -> Drive folder | wiki +move-to-drive |
执行顺序
- 如有
create_target项,先执行。 - 按确认计划顺序执行
move_resource项。 - 如果命令返回 task ID,执行异步任务轮询。
- 输出写操作执行摘要。
进度 UI
批量较大时,按计数汇报进度:
执行进度:已完成 <done_count>/<total_count>,成功 <success_count>,失败 <failed_count>。
当前操作:<title>
继续执行中,不需要你操作;如遇到需要确认的失败会单独提示。
状态:VERIFY
进入条件:执行完成。
必须:
- 如果创建了目标,验证目标存在。
- 能力支持时,验证已移动资源在目标位置可见。
- 对比实际位置和
move_plan_items。 - 为每一项标记验证状态。
- 只有当已有移动成功且存在严重不一致或失败时,才提供恢复选项。
- 输出验证结果时,必须说明用户下一步可以结束流程、查看失败项,或在可恢复时选择恢复。
- 如果出现
async_pending,先使用drive +task_result轮询确认;超过轮询限制后再报告 pending blocker。
验证结果
| 状态值 | 说明 |
|---|---|
verified |
资源已在目标位置可见。 |
not_found |
目标位置未找到资源。 |
permission_unknown |
当前身份无法确认结果。 |
async_pending |
异步任务尚未完成,需要继续轮询。 |
failed |
移动命令失败或结果不符合计划。 |
状态:RESTORE
进入条件:失败、不一致或用户明确要求恢复。
必须:
- 只基于
rollback_snapshot和execution_journal生成恢复计划。 - 展示可恢复项和不可恢复项。
- 执行恢复写操作前请求明确确认;确认内容必须包含反向移动和删除本次 workflow 新建目标。
- 只恢复本次 workflow 移动过的资源。
- 只恢复
rollback_supported=true且rollback_eligible=true的移动项。 - Drive / Wiki 跨容器移动、原父级 token 缺失等
rollback_supported=false的项不得反向移动,也不得删除迁入后的文档。 - 本次 workflow 成功创建的目标文件夹或 Wiki 节点必须纳入清理计划。
- 删除 workflow 新建的 Wiki 目标节点时,必须使用
wiki +node-delete --include-children=false --yes,让已迁入的直接子文档保留到该节点父级层级。 - 删除 workflow 新建的 Drive 文件夹前,必须先恢复或移出其中由本次 workflow 放入的资源;如果无法确认文件夹已安全可删,报告清理阻塞,不得用删除文件夹来删除用户资源。
恢复顺序
- 先恢复
rollback_supported=true且rollback_eligible=true的移动项。 - 对全部
rollback_supported=false的项,只记录“保留在当前目标位置,不回迁、不删除”和对应 blocker。 - 再清理
created_by_workflow=true的目标容器。 - Wiki 新建目标清理使用
--include-children=false;Drive 新建目标清理只在不会删除用户资源时执行。
恢复 UI
可以尝试恢复本次已移动的资源:
可恢复:
- 标题|当前位置|原位置
不可自动恢复:
- 标题|当前位置|原位置|原因|影响:需要手动恢复
将清理本次新建目标:
- 名称|类型|清理方式
将保留在当前目标位置的跨容器迁入文档:
- 标题|当前位置|保留结果
是否执行恢复?
RollbackSnapshotItem
{
"snapshot_id": "稳定快照行 ID",
"plan_id": "对应 MovePlanItem.plan_id",
"resource_id": "对应 MovePlanItem.resource_id",
"source_kind": "drive|wiki",
"title": "资源标题",
"resource_type": "Drive 恢复命令需要的资源类型",
"original_token": "原始 Drive token",
"original_node_token": "原始 Wiki node token",
"original_parent_kind": "drive_folder|drive_root|wiki_node|wiki_space_root|unknown",
"original_parent_token": "原始父级 token",
"original_space_id": "原始 Wiki space_id",
"original_path": "执行前路径",
"planned_target_parent_token": "计划目标父级 token",
"rollback_supported": "是否支持自动恢复",
"rollback_blocker": "不可自动恢复原因"
}
| 字段 | 说明 |
|---|---|
snapshot_id |
稳定快照行 ID。 |
plan_id |
对应 MovePlanItem.plan_id,用于连接计划、快照和执行日志。 |
resource_id |
对应稳定资源 ID,用于审计计划来源。 |
resource_type |
drive +move 恢复时必须传入的 --type;非 Drive 恢复也保留原始资源类型。 |
original_token / original_node_token |
执行前源资源身份。 |
original_parent_kind / original_parent_token |
执行前父级位置。 |
rollback_supported |
是否支持自动恢复。 |
rollback_blocker |
不可自动恢复原因。 |
执行日志
每次写操作尝试都必须追加一条内部日志:
{
"journal_id": "稳定日志行 ID",
"plan_id": "对应 MovePlanItem 的 plan_id",
"time": "ISO-8601",
"action_type": "create_target|move_resource|restore_resource|cleanup_target",
"operation": "create_folder|create_node|move_drive|move_wiki_node|move_wiki_to_drive|restore_drive|restore_wiki_node|delete_folder|delete_wiki_node",
"command_family": "drive +move|wiki +move|wiki +move-to-drive|drive +create-folder|wiki +node-create|drive +delete|wiki +node-delete",
"resolved_command_args": {"<arg>": "实际发送的参数"},
"title": "资源或目标名称",
"resource_type": "资源类型",
"input_token": "命令输入 token",
"input_node_token": "命令输入 Wiki node token",
"input_parent_token": "已知源父级 token",
"target_parent_token": "目标父级 token",
"returned_token": "命令返回 token",
"returned_node_token": "命令返回 Wiki node token",
"returned_parent_token": "返回父级 token",
"task_id": "异步任务 ID",
"next_command": "异步继续命令",
"created_by_workflow": "是否由本次 workflow 创建",
"rollback_eligible": "是否可进入自动恢复计划",
"status": "success|failed|pending",
"error": "失败原因"
}
字段说明:
| 字段 | 说明 |
|---|---|
journal_id |
稳定日志行 ID。 |
plan_id |
对应 MovePlanItem,用于把日志项匹配回原计划。 |
operation |
细分操作类型,用于区分创建、移动和恢复。 |
resolved_command_args |
从确认计划解析出的实际发送参数;用于审计 created_by_plan:<plan_id> 的唯一运行时替换。 |
resource_type |
实际移动 / 恢复使用的资源类型。 |
input_token / input_node_token |
命令实际输入的资源 token。 |
input_parent_token |
执行前已知源父级 token。 |
target_parent_token |
命令输入的目标父级 token。 |
returned_token / returned_node_token |
命令返回的资源 token,恢复时作为当前源。 |
returned_parent_token |
命令返回的当前父级 token。 |
task_id / next_command |
异步任务跟踪信息。 |
created_by_workflow |
是否由本次 workflow 创建,用于后续清理判断。 |
rollback_eligible |
是否可进入自动恢复计划。 |
status |
写操作状态,异步未完成时为 pending。 |
除非用户要求查看技术调试细节,否则不要展示完整原始命令输出。