diff --git a/skills/lark-drive/SKILL.md b/skills/lark-drive/SKILL.md index 31efaa2a7..8fac85ce1 100644 --- a/skills/lark-drive/SKILL.md +++ b/skills/lark-drive/SKILL.md @@ -18,6 +18,7 @@ metadata: ## 快速决策 +- 用户要**检查 / 治理文档权限、公开范围、链接分享、外部访问、复制下载权限、密级标签**,或要“权限风险报告、收紧权限、申请查看 / 编辑权限”,必须先阅读 [`references/lark-drive-workflow.md`](references/lark-drive-workflow.md),再按其中 `Workflow Registry` 进入 [`permission_governance`](references/lark-drive-workflow-permission-governance.md) workflow。 - 用户要**整理云盘 / 文件夹 / 文档库 / 知识库 / 个人文档库**,或要“盘点目录结构、找出未归档/临时/重复/空目录、生成整理方案”,必须先阅读 [`references/lark-drive-workflow-knowledge-organize.md`](references/lark-drive-workflow-knowledge-organize.md)。默认只生成方案;创建目录、移动资源、申请权限都必须单独确认。 - 用户要**搜文档 / Wiki / 电子表格 / 多维表格 / 云空间(云盘/云存储)对象**,优先使用 `lark-cli drive +search`。自然语言里"最近我编辑过的"、"我创建的"(→ `--mine`,实为 owner 语义)、"最近一周我打开过的 xxx"、"某人 owner 的 docx" 等直接映射到扁平 flag,避免手写嵌套 JSON。 - 用户要把本地 `.xlsx` / `.csv` / `.base` 导入成 Base / 多维表格 / bitable,第一步必须使用 `lark-cli drive +import --type bitable`。 diff --git a/skills/lark-drive/references/lark-drive-workflow-permission-governance-commands.md b/skills/lark-drive/references/lark-drive-workflow-permission-governance-commands.md new file mode 100644 index 000000000..00306a933 --- /dev/null +++ b/skills/lark-drive/references/lark-drive-workflow-permission-governance-commands.md @@ -0,0 +1,121 @@ +# 权限治理 Command Patterns + +本文只提供 `permission_governance` workflow 的具体 `lark-cli` 命令样例。只有进入对应 state 且需要拼装命令时才读取本文;命令可用范围仍以 [`lark-drive-workflow-permission-governance.md`](lark-drive-workflow-permission-governance.md) 的 `Command Map` 为准。 + +## 目录 + +- `目标解析` +- `目标发现` +- `事实读取` +- `写前确认与执行` + +## 目标解析 + +```bash +lark-cli drive +inspect --url '' --as user --format json +``` + +`/wiki/space/` URL 是 Wiki space 范围,不要用 `drive +inspect` 当作单文档解析;直接提取 `space_id` 后进入 `DISCOVER_TARGETS`。 + +## 目标发现 + +发现 Wiki space / node 下目标: + +```bash +lark-cli wiki +node-list \ + --space-id '' --page-size 50 \ + --as user --format json + +lark-cli wiki +node-list \ + --space-id '' --parent-node-token '' --page-size 50 \ + --as user --format json +``` + +发现 Drive folder 下目标: + +```bash +lark-cli drive files list \ + --params '{"folder_token":"","page_size":200}' \ + --as user --format json + +lark-cli drive files list \ + --params '{"folder_token":"","page_size":200,"page_token":""}' \ + --as user --format json +``` + +## 事实读取 + +读取 metadata: + +```bash +lark-cli drive metas batch_query \ + --data '{"request_docs":[{"doc_token":"","doc_type":""}],"with_url":true}' \ + --as user --format json +``` + +读取 public permission: + +```bash +lark-cli drive permission.public get \ + --params '{"token":"","type":""}' \ + --as user --format json +``` + +按需读取访问统计: + +```bash +lark-cli drive file.statistics get \ + --params '{"file_token":"","file_type":""}' \ + --as user --format json +``` + +按需读取最近访问记录: + +```bash +lark-cli drive file.view_records list \ + --params '{"file_token":"","file_type":"","page_size":50}' \ + --as user --format json +``` + +## 写前确认与执行 + +patch 前检查 manage-public permission: + +```bash +lark-cli drive permission.members auth \ + --params '{"token":"","type":"","action":"manage_public"}' \ + --as user --format json +``` + +显式确认后 patch public permission: + +```bash +lark-cli drive permission.public patch \ + --params '{"token":"","type":""}' \ + --data '{"link_share_entity":"closed","external_access":false}' \ + --as user --yes --format json +``` + +显式确认后申请访问权限: + +```bash +lark-cli drive +apply-permission \ + --token '' \ + --perm view --remark '' --as user --format json + +lark-cli drive +apply-permission \ + --token '' --type '' \ + --perm view --remark '' --as user --format json +``` + +显式确认后更新 secure label: + +```bash +lark-cli drive +secure-label-update \ + --token '' \ + --label-id '' --as user --format json + +lark-cli drive +secure-label-update \ + --token '' --type '' \ + --label-id '' --as user --format json +``` diff --git a/skills/lark-drive/references/lark-drive-workflow-permission-governance-outputs.md b/skills/lark-drive/references/lark-drive-workflow-permission-governance-outputs.md new file mode 100644 index 000000000..41047cf47 --- /dev/null +++ b/skills/lark-drive/references/lark-drive-workflow-permission-governance-outputs.md @@ -0,0 +1,263 @@ +# 权限治理输出模板 + +本文只提供 `permission_governance` workflow 的用户可见输出模板。默认先给简短摘要;只有用户要求完整表格、需要写入确认,或结果大到需要结构化展示时才读取本文。 + +## 目录 + +- `输出策略` +- `用户语言映射` +- `定位与治理动作` +- `审计摘要` +- `容器安全诊断报告摘要` +- `可操作风险清单` +- `治理选择交互` +- `权限设置清单` +- `访问复核清单` +- `整改 dry-run` +- `批量权限申请确认` +- `确认请求` +- `最终摘要` + +## 输出策略 + +- 单目标默认输出审计摘要。 +- 容器目标默认输出安全诊断报告摘要:一句话结论、覆盖情况、风险分级、优先处理对象、建议下一步和剩余限制。 +- 容器目标不要把风险按数量机械排序;外部公开、允许对外分享、缺失密级标签优先于复制 / 下载 / 评论这类依赖策略的候选项。 +- 用户没有提供明确 policy 时,使用“候选风险 / 待复核 / 待策略确认”,不要写“违规 / 已泄露 / 已外部访问”。 +- 风险对象展示按规模渐进披露:1-10 个全部展示;11-30 个展示全部高优先级待处理对象,中 / 低优先级只做分组摘要;31-100 个按高优先级分组展示 Top 5 和数量;100+ 个只展示分组统计和 Top 样例。 +- 当摘要未展示全部风险对象时,必须明确“完整清单包含 条”,并提供生成 Markdown / CSV / 飞书文档风险清单或整改 dry-run 的下一步。 +- 只要发现需要处理的对象,最终回复必须给出可执行下一步 CTA。不能因为默认只读,就只报告风险后结束。 +- 完整风险清单是后续治理选择的输入;Markdown / CSV / 飞书文档报告必须使用同一套字段和稳定 `risk_id`。 +- 写入前必须使用确认模板;权限申请、public-permission patch、secure-label update 分别确认。 +- 最终回复必须包含已完成事项、验证结果和剩余限制;异步 owner 审批不能表述为已完成授权。 + +## 用户语言映射 + +面向用户的主结论优先使用业务语言;底层字段名只在证据或完整清单中保留。 + +| 底层字段 / 值 | 用户可见说法 | +|---------------|--------------| +| `link_share_entity=anyone_readable/anyone_editable` | 互联网公开链接候选风险 | +| `link_share_entity=tenant_readable` | 公司内知道链接可读 | +| `link_share_entity=tenant_editable` | 公司内知道链接可编辑 | +| `link_share_entity=closed` | 未开启链接分享 | +| `external_access=true` | 允许分享到组织外;不等于已经存在外部协作者 | +| `external_access=false` | 不允许分享到组织外 | +| `share_entity=anyone` | 较多人可添加或管理协作者 | +| `share_entity=same_tenant` | 公司内成员可添加或管理协作者 | +| `share_entity=only_full_access` | 仅有管理权限的人可管理协作者 | +| `security_entity` is not `only_full_access` | 复制 / 下载 / 打印范围需要按策略复核 | +| `comment_entity=anyone_can_view` | 可查看者都能评论 | +| `sec_label_name` missing | 缺少密级标签 | + +## 定位与治理动作 + +风险对象必须能让用户直接定位和处理: + +- 摘要中的每个优先处理对象必须包含 `path/title`、`URL`、`type`、风险原因、关键证据和建议动作。 +- 完整清单、访问复核清单、整改 dry-run 和写入确认都必须包含 URL。缺少 URL 时,展示 token / node_token,并说明 URL 未能获取。 +- 同名文档、shortcut 或副本必须用 path + URL 区分;不要只输出 title。 +- 完整风险清单中的每条记录必须有稳定 `risk_id`,格式为 `PG-001`、`PG-002`。`risk_id` 在同一次诊断和后续 dry-run / 确认 / 验证中保持不变。 +- 建议动作必须和风险类型绑定:互联网公开链接优先建议关闭链接分享或收紧为组织内;允许对外分享优先建议 owner 复核或关闭对外分享;缺少密级标签优先建议补齐密级;复制 / 下载 / 评论范围只在用户 policy 明确时建议收紧。 +- 写入动作只能作为下一步选项或确认请求出现。不要在诊断摘要里暗示已经执行缩权。 + +## 摘要清单展开规则 + +容器安全诊断的摘要必须兼顾可读性和可治理性。不要用固定 Top N 代替可处理清单。 + +| 风险对象数 | 摘要默认展示 | 必须提供的下一步 | +|------------|--------------|------------------| +| `0` | 只展示覆盖情况、未覆盖能力和剩余限制 | 如需更细审计,可生成权限设置清单 | +| `1-10` | 展示全部风险对象 | 可直接按 `risk_id` 生成 dry-run 或写入确认 | +| `11-30` | 展示全部高优先级待处理对象;中 / 低优先级做分组摘要 | 生成完整风险清单 artifact,或按风险分组生成 dry-run | +| `31-100` | 每个高优先级风险分组展示 Top 5,附未展示数量 | 生成 Markdown / CSV / 飞书文档完整风险清单 | +| `100+` | 只展示分组统计、Top 样例和覆盖限制,不内联长表 | 强烈建议生成结构化风险清单后再选择治理范围 | + +高优先级待处理对象包括:互联网公开链接、允许对外分享、允许对外分享且缺少 / 低于 policy 密级标签、公司内可编辑链接、协作者管理范围较宽。复制 / 下载 / 打印、评论范围在用户未提供明确 policy 时归入“待策略确认”,不要挤占高优先级清单。 + +摘要中的每个待处理对象必须包含 `risk_id`、path/title、URL、type、风险原因、关键证据和建议动作。对同一底层文档的多个 Wiki 入口或 shortcut,必须用 URL 区分;如果建议合并治理,在建议动作里说明它们指向同一底层对象。 + +## 审计摘要 + +```text +目标: (<type>) +URL:<url-or-token-if-url-unavailable> +结论:<合规 / 待确认风险 / 无法完整判断> +证据: +- link_share_entity=<value> +- external_access=<value> +- share_entity=<value> +- security_entity=<value> +- comment_entity=<value> +- sec_label_name=<value-or-missing> +限制:<unsupported_checks or none> +建议动作:<read-only next step or proposed remediation> +``` + +## 容器安全诊断报告摘要 + +```text +已完成只读安全诊断,没有做任何权限修改。 + +一句话结论:<未发现互联网公开链接 / 存在互联网公开链接候选风险>;<external_access_count> 个文档允许对外分享,<missing_label_count> 个文档缺少密级标签。建议优先复核 <top_priority_group_or_paths>。 + +覆盖情况: +- 当前身份可见目标:<visible_count> +- 已成功检查公开权限:<permission_checked_count> +- 读取失败 / 已删除 / 无权限:<failed_count> +- 未覆盖能力:<collaborator_list / inheritance / audit_log / view_records / none> + +风险分级: +- 高优先级:<internet_public_count> 个互联网公开链接候选;<external_access_count> 个允许对外分享;其中 <external_without_label_count> 个同时缺少密级标签。 +- 中优先级:<tenant_link_count> 个公司内知道链接可访问 / 可编辑;<wide_share_count> 个协作者管理范围较宽。 +- 待策略确认:<security_count> 个复制 / 下载 / 打印范围待复核;<comment_count> 个评论范围待复核。 +- 无法判断:<unsupported_or_unverified_summary>。 + +高优先级待处理清单: +> 按 `摘要清单展开规则` 展示。每个对象必须包含 `risk_id` 和 URL;缺少 URL 时展示 token / node_token 和原因。若没有高优先级对象,只展示中优先级或待策略确认分组摘要。 + +- <risk_id> <path-or-title> (<type>) + URL: <url-or-token-if-url-unavailable> + 风险:<why high priority> + 证据:<short field evidence> + 建议动作:<recommended action> + +未完全展开: +- 完整风险清单包含 <risk_manifest_count> 条;本摘要已展示 <shown_count> 条,未展示 <hidden_count> 条。 +- 未展示分组:<risk_group=count summary or none> + +建议下一步: +- 生成完整风险清单 artifact,包含 `risk_id`、URL、证据字段、建议动作和 `selected` 列。 +- 基于 risk_id、风险分组、owner、路径、URL 或 artifact 中 `selected=true` 的行生成只读整改 dry-run。 +- 只针对最高优先级目标进入写入确认流程,例如关闭互联网公开链接或收紧对外分享;写入前仍需二次确认。 +- 按 owner / 密级生成复核清单。 +- 继续读取访问记录,判断低活跃高暴露。 + +剩余限制: +- <do not claim collaborator-list verification if unsupported> +- <external_access=true only means sharing outside is allowed, not that external collaborators exist> +- <missing view_records / DLP / AI index status / audit log limitations> +``` + +## 可操作风险清单 + +完整风险清单用于让用户选择后续治理范围。Markdown / CSV / 飞书文档报告都必须包含以下字段;如果某种格式无法完整展示嵌套证据,使用短文本摘要,保留 `risk_id` 和 URL。 + +```text +范围:<wiki_space / wiki_node / drive_folder> <name-or-id> +生成时间:<timestamp> +用途:用户可按 risk_id、risk_group、owner、path、URL 或 selected=true 选择治理对象。 + +| risk_id | Path | URL | Type | Owner | risk_group | evidence | recommended_action | current_setting | target_setting | selected | decision | status | skip_reason | +|---------|------|-----|------|-------|------------|----------|--------------------|-----------------|----------------|----------|----------|--------|-------------| +| PG-001 | <path> | <url-or-token> | <type> | <owner-or-unknown> | <risk_group> | <short evidence> | <recommended-action> | <field=value> | <field=value-or-owner-review> | false | undecided | pending | <none-or-reason> | +``` + +字段规则: + +- `risk_id` 按风险优先级和 path 稳定排序生成;同一次诊断中不得重复。 +- `selected` 默认 `false`;用户可在 CSV / 飞书文档表格中改为 `true`,或在聊天中直接说 “处理 PG-001、PG-003”。 +- `decision` 表示用户决策:`undecided`、`keep`、`dry_run`、`confirm_write`、`skip`。 +- `status` 表示执行状态:`pending`、`dry_run_ready`、`confirmed`、`executed`、`verified`、`failed`、`skipped`。 +- `target_setting` 是建议目标状态,不代表已执行;没有明确 policy 时只能写 owner review / policy review。 + +## 治理选择交互 + +用户基于完整风险清单继续治理时,Agent 必须先解析选择范围,再生成只读 dry-run: + +```text +可接受的用户选择: +- 处理 PG-001、PG-003、PG-008,把互联网公开链接关闭。 +- 先处理所有 risk_group=internet_public_link,不处理 external_access_only。 +- 把 CSV / 飞书文档里 selected=true 的行生成整改 dry-run。 +- PG-003 先跳过,只处理 PG-001。 + +Agent 必须回复: +- 已选择对象数:<count> +- 选择来源:<risk_id list / risk_group / selected=true / URL / path> +- 将执行的下一步:生成 dry-run;不执行写入 +- 需要跳过或重新确认的对象:<missing risk_id / unsupported / changed_since_report / no manage_public> +``` + +如果用户选择来自旧报告或外部 artifact,生成 dry-run 前必须对所选目标重新读取当前权限。当前设置和报告快照不一致时,标记为 `changed_since_report`,不要直接沿用旧字段执行。 + +## 权限设置清单 + +```text +范围:<wiki_space / wiki_node / drive_folder> <name-or-id> + +| Path | URL | Type | link_share_entity | external_access | share_entity | security_entity | comment_entity | sec_label_name | 建议动作 | 限制 | +|------|-----|------|-------------------|-----------------|--------------|-----------------|----------------|----------------|----------|------| +| <path> | <url-or-token> | <type> | <value> | <value> | <value> | <value> | <value> | <value-or-missing> | <recommended-action> | <unsupported-or-none> | +``` + +## 访问复核清单 + +```text +范围:<wiki_space / wiki_node / drive_folder / explicit_list> <name-or-id> +复核对象数:<count> + +| Owner | Path | URL | Type | 风险标签 | 当前权限摘要 | 最近访问证据 | 建议动作 | +|-------|------|-----|------|----------|--------------|--------------|----------| +| <owner-or-unknown> | <path> | <url-or-token> | <type> | <labels> | <link/external/share/security/comment> | <uv/pv/last_view_or_unknown> | <keep / tighten / owner review / unsupported> | + +限制:<unsupported_checks / discovery_blockers / none> +``` + +## 整改 dry-run + +```text +将生成整改计划,不执行写入: +- 范围:<scope> +- 选择来源:<risk_id list / risk_group / selected=true artifact / URL list> +- 候选目标数:<count> +- 计划执行命令:<command family> +- 重新读取:已对所选目标重新读取当前权限;changed_since_report=<count> +- 字段变更: + - <risk_id> <path> (<url-or-token>): <field> <old> -> <new> +- 跳过项:<unsupported / no manage_public / unsupported type / missing policy> +- 验证方式:执行后重新读取 <metadata/public_permission> +- 有限回滚范围:<public_permission_snapshots fields or not applicable> + +请确认是否进入写入确认。 +``` + +## 批量权限申请确认 + +```text +将逐个发起 <view / edit> 权限申请: +- 候选目标数:<count> +- 命令类型:drive +apply-permission +- 风险:write;每个请求都会通知 owner +- 执行方式:按候选列表顺序逐个调用,失败项会单独记录 + +候选示例: +- <risk_id> <title> (<type>, <url-or-token>):<reason> + +请确认是否对上述候选目标发起权限申请。 +``` + +## 确认请求 + +```text +将执行 <operation>: +- 目标:<risk_id> <title> (<type>, <url-or-token>) +- 命令类型:<command family> +- 风险:<risk_level> +- 字段变更: + - <field>: <old> -> <new> +- 验证方式:执行后重新读取 <metadata/public_permission> +- 有限回滚材料:<public_permission_snapshots or not applicable> + +请确认是否执行。 +``` + +## 最终摘要 + +```text +已完成:<read checks / writes> +验证:<fresh read result or async owner approval note> +清单状态:<risk_id status updates / not applicable> +回滚材料:<public_permission_snapshots / not applicable> +剩余限制:<unsupported_checks / partial facts / approvals> +``` diff --git a/skills/lark-drive/references/lark-drive-workflow-permission-governance.md b/skills/lark-drive/references/lark-drive-workflow-permission-governance.md new file mode 100644 index 000000000..08d939be3 --- /dev/null +++ b/skills/lark-drive/references/lark-drive-workflow-permission-governance.md @@ -0,0 +1,224 @@ +# lark-drive 权限治理 Workflow + +Workflow id: `permission_governance` + +Risk / Structure: `R2` / `S2` + +本文实现已注册的权限治理 workflow。执行前必须先读取 [`lark-drive-workflow.md`](lark-drive-workflow.md),并遵循其中的共享执行协议、Artifact Contract 和 Workflow Loading 规则。 + +## 必读上下文 + +执行本 workflow 前,先阅读 [`../../lark-shared/SKILL.md`](../../lark-shared/SKILL.md) 了解认证、全局参数和安全规则。 + +## 适用范围 + +当用户要求检查或治理 Drive / Docs / Wiki 资产访问权限时,使用本 workflow: + +- "检查这个文档是不是对外公开" +- "帮我收紧这个文档权限" +- "给这些文档做权限风险排查" +- "检查这个知识库下所有文档是否存在安全风险" +- "查看这个文件夹下所有文档的权限设置情况" +- "生成 owner 访问复核清单,找出低活跃但权限过宽的文档" +- "找出这个知识库下哪些文档我没有权限,并帮我申请查看 / 编辑权限" +- "评估这些文档是否适合进入 AI Agent / RAG 检索上下文" +- "申请查看 / 编辑这个文档" +- "调整这个文档的密级标签" +- "看看谁可以分享、复制、下载、评论" + +目标可以是一个明确 URL / token、小规模明确列表、Wiki space / Wiki node,或 Drive folder。遇到 Wiki space / Drive folder 等容器范围时,先执行只读 `DISCOVER_TARGETS` 并产出覆盖摘要;这里的"所有文档"只表示当前身份在确认范围内可枚举到的文档。任何写入都必须再次询问并获得确认。 + +## 非目标 + +本 workflow 不处理: + +- 目录组织、迁移、归档或清理;这类需求应使用知识整理 workflow。 +- 内容审查、过期内容判断或知识质量评分。 +- owner transfer、协作者创建 / 撤销、成员列表审计;本 workflow 只输出 owner 复核候选,不执行 owner 转移。 +- 文件夹自身公开权限审计或修复。`drive permission.public get` / `patch` 不支持 `type=folder`;必须记录到 `unsupported_checks`,然后继续读取文件夹下其他支持的文档事实。 +- 当前身份无法枚举到的不可见文档的完整发现;只能处理已发现目标,或用户显式提供的 URL / token。 +- 未按范围确认的批量写入。 + +不要声称已完成协作者列表验证:当前 CLI surface 没有 `permission.members list` shortcut。 + +## Progressive Load Map + +本表只规定每个 state 需要加载的额外上下文;命令可用范围以 `Command Map` 为准。未进入对应 state 前,不要预读无关 reference。 + +| State | Required Reference | +|-------|--------------------| +| `PARSE_INTENT` | 本文件、[`lark-drive-workflow.md`](lark-drive-workflow.md)、[`../../lark-shared/SKILL.md`](../../lark-shared/SKILL.md) | +| `TARGET_INSPECT` | [`lark-drive-inspect.md`](lark-drive-inspect.md);需要具体命令样例时读取 [`lark-drive-workflow-permission-governance-commands.md`](lark-drive-workflow-permission-governance-commands.md) | +| `DISCOVER_TARGETS` | 容器范围时读取 [`../../lark-wiki/references/lark-wiki-node-list.md`](../../lark-wiki/references/lark-wiki-node-list.md) 或 [`lark-drive-files-list.md`](lark-drive-files-list.md);需要具体命令样例时读取 [`lark-drive-workflow-permission-governance-commands.md`](lark-drive-workflow-permission-governance-commands.md) | +| `FACT_READ` | `lark-cli schema drive.metas.batch_query`;涉及公开权限时再读取 `lark-cli schema drive.permission.public.get`;涉及活跃度、访问复核或生命周期判断时再读取 `lark-cli schema drive.file.statistics.get` 和 `lark-cli schema drive.file.view_records.list`;需要具体命令样例时读取 [`lark-drive-workflow-permission-governance-commands.md`](lark-drive-workflow-permission-governance-commands.md) | +| `RISK_ASSESS` | 本文件的 `Risk Classification` | +| `EXEC_CONFIRM` | 只为用户选择的动作读取 [`lark-drive-apply-permission.md`](lark-drive-apply-permission.md)、[`lark-drive-secure-label.md`](lark-drive-secure-label.md),或 `lark-cli schema drive.permission.public.patch`;需要确认模板时读取 [`lark-drive-workflow-permission-governance-outputs.md`](lark-drive-workflow-permission-governance-outputs.md) | +| `EXECUTE` | 复用 `EXEC_CONFIRM` 已加载且已确认的写命令上下文;需要具体命令样例时读取 [`lark-drive-workflow-permission-governance-commands.md`](lark-drive-workflow-permission-governance-commands.md) | +| `VERIFY` | 复用 `FACT_READ` 阶段使用的 read schemas | + +## Runtime State Extension + +本 workflow 在共享 `Artifact Contract` 基础上扩展以下字段: + +| Field | Meaning | +|-------|---------| +| `intent` | `audit`、`list_permission_settings`、`access_review`、`remediation_dry_run`、`tighten_public_permission`、`apply_permission` 或 `secure_label_update` | +| `target_scope` | `single_resource`、`explicit_list`、`wiki_space`、`wiki_node` 或 `drive_folder`,包含用户原始输入和已确认范围 | +| `targets` | 标准化直接目标和发现目标列表,包含原始输入、解析后的 type、token、title、URL、path,以及存在时的 wiki node / object data | +| `discovered_targets` | 从 Wiki space / Wiki node / Drive folder 只读发现出的可审计文档目标 | +| `discovery_blockers` | 发现阶段因权限、分页、API 覆盖、目标类型或工具预算导致的未覆盖范围 | +| `coverage_summary` | 容器范围的发现数量、已审计数量、unsupported 数量和 partial 原因 | +| `metadata_facts` | `drive metas batch_query` 结果,包括 title、owner、URL,以及返回时的 `sec_label_name` | +| `public_permission_facts` | 对支持目标执行 `drive permission.public get` 的结果 | +| `activity_facts` | 用户要求活跃度、最近访问、闲置暴露或访问复核时,读取 `drive file.statistics get` / `drive file.view_records list` 得到的访问证据 | +| `manage_public_auth` | patch 写入前,以 `action=manage_public` 执行 `permission.members auth` 的结果 | +| `risk_findings` | 基于证据的发现和置信度;每项必须包含稳定 `risk_id`、path、title、type、URL 或可替代定位信息、风险标签、关键证据和建议动作 | +| `risk_manifest` | 完整风险清单 artifact 的行数据;包含 `risk_id`、定位信息、风险分组、当前设置、建议目标设置、`selected`、`decision`、`status` 和 `skip_reason` | +| `selected_risk_items` | 用户通过 risk_id、风险分组、owner、路径、URL、CSV `selected=true` 或飞书文档表格选择出的待处理目标 | +| `access_review_items` | 面向 owner / 项目负责人的复核清单,包含 path、URL、owner、风险标签、当前权限设置、最近访问证据和建议动作 | +| `permission_request_candidates` | 权限申请候选目标;只来自已发现且可构造申请请求的目标 | +| `remediation_plan` | dry-run 或已确认整改计划,包含目标、字段 diff、跳过原因、验证方式和执行顺序 | +| `public_permission_snapshots` | public-permission patch 前保存的原始字段快照,仅用于说明有限回滚范围 | + +## Execution State Machine + +| State | Protocol Step | Agent MUST Do | User-Facing Output | wait_for_user | Next State | +|-------|---------------|---------------|--------------------|---------------|------------| +| `PARSE_INTENT` | `route` / `scope` | 解析 intent、target scope、desired policy,以及只读审计、权限申请还是修复模式 | 范围确认;如果缺少目标或期望动作,只问一个澄清问题 | 缺少 target / action,或容器范围需要用户确认时为 `true` | `TARGET_INSPECT` | +| `TARGET_INSPECT` | `scope` | 解析单资源、明确列表、Wiki space / node、Drive folder;保留原始 URL、scope type、canonical token/type | 目标范围表,包含 scope、title/type/token status | 除非解析失败,否则为 `false` | `DISCOVER_TARGETS` or `FACT_READ` | +| `DISCOVER_TARGETS` | `scope` / `read` | 对 Wiki space / node 或 Drive folder 递归只读枚举,归一化为 `discovered_targets`;记录 `discovery_blockers` | 发现进度和覆盖摘要;不展示内部 cursor/token,除非用户要求 | 除非发现范围无法确认或全部被阻断,否则为 `false` | `FACT_READ` | +| `FACT_READ` | `read` | 对直接目标或 `discovered_targets` 执行 `drive metas batch_query`;对支持的非 folder 目标执行 `drive permission.public get`;在用户要求活跃度 / 访问复核 / 生命周期判断时读取访问统计和访问记录 | 权限事实摘要、coverage summary、activity facts 和 unsupported checks | 除非所有目标都被 auth 阻断,否则为 `false` | `RISK_ASSESS` | +| `RISK_ASSESS` | `assess/plan` | 对证据分类;如用户提供 policy,则对照 policy;构建可定位风险清单、访问复核清单、dry-run 整改计划或候选修复计划;完整清单必须生成稳定 `risk_id` | 带 URL 和 risk_id 的 findings、confidence、review items、建议动作和下一步 CTA | `true` | `EXEC_CONFIRM` or `DONE` | +| `EXEC_CONFIRM` | `confirm` | 展示准确写入范围、command family、target count、risk、verification method | 确认请求 | `true` | `EXECUTE` or `DONE` | +| `EXECUTE` | `execute` | 只执行 `Command Map` 中已确认的写入 | 进度 / 结果摘要 | 除非被阻断,否则为 `false` | `VERIFY` | +| `VERIFY` | `verify` | 重新执行支持的读取,并与目标状态对比 | 验证表和剩余缺口 | `false` | `DONE` | +| `DONE` | `done` | 停止 | 最终回复,包含完成事项、验证结果和剩余风险 | `false` | End | + +## Command Map + +本 workflow 只能使用以下 command families: + +| State | Allowed Command Families | Purpose | +|-------|--------------------------|---------| +| `TARGET_INSPECT` | `drive +inspect` | 解析 URL、type、canonical token、title 和 wiki unwrap data | +| `DISCOVER_TARGETS` | `wiki +node-list` | 递归发现 Wiki space / node 下当前身份可见的节点 | +| `DISCOVER_TARGETS` | `drive files list` | 递归发现 Drive folder 下当前身份可见的文件和子文件夹 | +| `FACT_READ` | `drive metas batch_query` | 读取 title、URL、owner 和 secure-label metadata | +| `FACT_READ` | `drive permission.public get` | 读取支持类型的 public/link/external/copy/comment/share settings | +| `FACT_READ` | `drive file.statistics get` | 在用户要求活跃度、闲置暴露、生命周期或访问复核时读取文件访问统计 | +| `FACT_READ` | `drive file.view_records list` | 在用户要求最近访问人、访问复核或低活跃证据时读取访问记录 | +| `EXEC_CONFIRM` | `drive +secure-label-list` | 提议 label update 前解析可用 secure-label IDs | +| `EXEC_CONFIRM` | `drive permission.members auth` | public-permission patch 前检查 `action=manage_public` | +| `EXECUTE` | `drive +apply-permission` | 向 owner 提交 view/edit access request;只允许单目标、小列表或已明确确认的候选列表逐个执行 | +| `EXECUTE` | `drive permission.public patch` | 修改已确认的 public/link settings;必须传 `--yes` | +| `EXECUTE` | `drive +secure-label-update` | 设置已确认的 secure-label ID | +| `VERIFY` | `drive metas batch_query`, `drive permission.public get` | 验证支持的 metadata 和 public-permission changes | + +## Command Patterns + +本入口不内联命令样例。需要拼装具体 `lark-cli` 命令时,按当前 state 读取 [`lark-drive-workflow-permission-governance-commands.md`](lark-drive-workflow-permission-governance-commands.md)。命令是否允许执行仍以 `Command Map` 和写入规则为准。 + +## Discovery Rules + +容器范围只能先做只读发现和覆盖摘要,不能在发现阶段执行权限申请、权限 patch 或密级更新。 + +通用规则: + +1. "所有文档"只表示当前身份在确认范围内可枚举到的文档。不可见、无权限、API 不返回或工具预算不足的部分必须进入 `discovery_blockers` 或 `unsupported_checks`。 +2. 发现阶段必须生成稳定 `path`。不要只保存 title;同名文档必须能通过 path 或 token 区分。 +3. 只把支持类型加入可审计目标:`doc`、`sheet`、`file`、`wiki`、`bitable`、`docx`、`mindnote`、`slides`。 +4. `folder` 只作为递归容器,不执行 `permission.public get` / `patch`。`shortcut`、`catalog` 或缺少 stable token/type 的条目必须记录为 unsupported,除非后续 API 明确解析出支持目标。 +5. 对大范围目标输出进度时,只展示已扫描容器数、已发现目标数、已审计目标数、剩余队列或 blocker;不要默认展示内部 page token / cursor。 + +Wiki space / node 发现: + +1. `/wiki/space/<space_id>` 直接解析为 `target_scope=wiki_space`。不要因为 `drive +inspect` 对该 URL 返回 not found 就停止。 +2. 用 `wiki +node-list --space-id <space_id>` 读取根节点;当节点 `has_child=true` 时,用该节点的 `node_token` 继续递归读取子节点。 +3. Wiki 节点必须同时保留 `node_token`、`obj_token` 和 `obj_type`。权限读取优先用 `type=wiki` + `node_token` 表达 Wiki 节点权限;元数据补充可使用 `obj_type` + `obj_token`。 +4. 如果节点只有 `obj_token` / `obj_type`,但无法确认 Wiki 节点权限 token,保留该目标为 partial,并在 `unsupported_checks` 中说明只能读取底层对象或无法完整判断 Wiki 节点权限。 + +Drive folder 发现: + +1. `/drive/folder/<folder_token>` 解析为 `target_scope=drive_folder`。文件夹自身公开权限不支持;继续枚举其子文档。 +2. 按 [`lark-drive-files-list.md`](lark-drive-files-list.md) 递归处理 `data.files`、`has_more` 和 `next_page_token`。不要把第一页数量当作完整范围。 +3. 只对返回项中的 `folder` 继续递归;对子文档按 `type + token` 归一化为 `discovered_targets`。 +4. 如果某个目录分页失败、无 continuation token、权限不足或 API 报错,只阻断该目录分支,并在 `discovery_blockers` 中记录;继续处理其他可枚举分支。 + +## Fact Read Rules + +1. `drive metas batch_query` 单次最多 200 个 `request_docs`;当 `targets` 或 `discovered_targets` 超过 200 个时,必须分批读取并合并结果。 +2. `drive permission.public get` 没有批量读取接口;对支持目标逐个读取。单个目标失败时记录 `unsupported_checks` 或 `partial`,不要阻断其他目标。 +3. 对 Wiki 发现目标,公开权限读取优先使用 `type=wiki` + `node_token`;metadata 可使用 `obj_type` + `obj_token` 补充 title、owner、URL 和 `sec_label_name`。 +4. 当 intent 是 `list_permission_settings` 时,只输出权限设置清单和覆盖限制,不主动生成修复计划。 +5. `drive file.statistics get` 和 `drive file.view_records list` 只在用户要求最近访问、活跃度、闲置暴露、访问复核,或用户提供的 policy 明确依赖活跃度时执行;不要为普通权限审计默认读取访问记录。 +6. 访问统计 / 访问记录当前只对 `doc`、`docx`、`sheet`、`bitable`、`mindnote`、`wiki`、`file` 作为支持类型处理。其他类型必须进入 `unsupported_checks`,不能推断活跃度。 +7. `view_records` 是访问证据,不是权限列表。没有返回访问记录只能表述为“未获得最近访问证据”或“低活跃候选”,不能表述为“无人有权限”。 + +## Risk Classification + +以下标签只能作为 evidence labels。除非用户提供明确 policy,否则不要把它们直接表述为绝对违规: + +| Evidence | Suggested Label | +|----------|-----------------| +| `link_share_entity=anyone_readable` or `anyone_editable` | 外部链接暴露候选风险 | +| `link_share_entity=tenant_editable` | 租户范围可编辑候选风险 | +| `external_access=true` | 已启用外部分享 | +| `share_entity=anyone` | 广泛协作者管理候选风险 | +| `security_entity` is not `only_full_access` | 复制 / 下载 / 打印范围候选风险 | +| `comment_entity=anyone_can_view` | 广泛评论范围候选风险 | +| `sec_label_name` missing or lower than user-provided policy | 密级标签待复核候选风险 | +| `statistics.uv` / `statistics.pv` 很低或缺少最近访问证据,同时存在广泛可访问设置 | 低活跃高暴露候选风险 | +| `owner_id` / owner metadata 缺失、无法解析,或用户明确要求 owner 复核但 owner 不可用 | owner 待复核候选风险 | +| 广泛可访问设置 + 缺少 / 较低密级标签 + 用户要求 AI / Agent / RAG 前置治理 | AI 检索暴露候选风险 | + +如果缺少 policy,必须把发现表述为“待确认风险”,并给出准确字段和值。 + +容器级安全诊断不要按命中数量机械排序。默认按以下用户决策优先级组织: + +1. `link_share_entity=anyone_readable/anyone_editable`:最高优先级,表述为“互联网公开链接候选风险”。 +2. `external_access=true`:高优先级,表述为“允许对外分享候选风险”;必须说明这不等于已经存在外部协作者。 +3. `external_access=true` + `sec_label_name` missing / lower than policy:高优先级,建议优先补标签或 owner 复核。 +4. `link_share_entity=tenant_readable/tenant_editable`、`share_entity=anyone`:中优先级,表述为“组织内广泛可见 / 可管理候选风险”。 +5. `security_entity` / `comment_entity` 这类复制、下载、打印、评论范围:除非用户提供 policy,否则放入“待策略确认”,不要压过外部分享风险。 +6. 无法读取协作者名单、继承链、DLP、AI 索引状态、访问记录时,放入“无法判断 / 未覆盖”,不要推断风险不存在。 + +`AI 检索暴露候选风险` 只是基于权限和标签的代理标签。除非另有工具明确返回索引状态,否则不要声称某个文档已经被 Agent、Copilot 或 RAG 索引。 + +## 写入规则 + +- Public-permission patch 属于高风险写入。请求确认前,必须展示 target title、token、current setting、desired setting 和准确 field changes。 +- 如果 `manage_public_auth.auth_result=false`,禁止 patch。告诉用户需要具备 manage-public 权限的用户,或由 owner 操作。 +- `drive permission.public get` 只用于 `drive +inspect` 或 `DISCOVER_TARGETS` 可解析且受支持的目标类型:`doc`、`sheet`、`file`、`wiki`、`bitable`、`docx`、`mindnote`、`slides`。 +- 不要 patch 已解析类型不支持的字段。对于 wiki 目标,必须省略 schema 明确标注为 wiki 不支持的字段。 +- 不要在同一个 confirmation 中合并 secure-label update 和 public-permission patch;必须分别确认。 +- `drive +apply-permission` 默认不批量执行;每次调用都会向 owner 发送通知。 +- 容器范围内的"统一申请权限"必须先产出 `permission_request_candidates`。未展示候选目标、数量、权限类型和 owner 通知影响前,禁止调用 `drive +apply-permission`。 +- 用户显式确认批量权限申请后,也必须逐个目标顺序调用 `drive +apply-permission`,并在结果中区分已发起申请、失败、无法构造申请请求和未发现目标。 +- 用户要求“生成整改方案 / dry-run / 先看看会改什么”时,只生成 `remediation_plan`,不执行任何写命令。dry-run 必须包含 target count、field changes、跳过原因、验证方式和有限回滚范围。 +- 用户基于完整风险清单选择对象时,必须先解析 `risk_id`、风险分组、URL 或 artifact 中 `selected=true` 的行,生成 `selected_risk_items`。无法匹配到当前 `risk_manifest` 的选择必须要求用户重新确认或重新读取清单。 +- 针对 `selected_risk_items` 生成 dry-run 前,必须重新读取所选目标的 `drive permission.public get`;如果当前设置和清单快照不同,标记为 `changed_since_report` 并跳过或要求用户确认更新后的计划。 +- 执行 `drive permission.public patch` 前,必须把当前 `public_permission_facts` 中会被改动的字段保存为 `public_permission_snapshots`。该快照只用于 public-permission 字段的有限回滚说明,不覆盖协作者、owner、继承权限或密级标签。 +- 如果用户要求批量收紧权限,必须按风险分层和目标顺序逐个执行;失败项进入结果清单,不要因为单个失败而重复执行已成功目标。 +- 遇到 secure-label downgrade error `1063013` 时,停止重试,并告诉用户需要在文档 UI 中完成审批。 + +## 未来扩展边界 + +以下能力已有部分 CLI surface 或用户价值,但不要在当前 workflow 中作为可执行分支直接调用: + +- `drive permission.members create` 可创建协作者权限,但当前 workflow 不做协作者 grant / update / revoke;未来需要单独定义授权对象解析、最小权限、确认模板和验证方式。 +- `drive permission.members transfer_owner` 属于 owner transfer 高风险写入;当前 workflow 只输出 owner 复核候选,不执行 owner 转移。 +- `wiki +member-list` 可作为 Wiki space 成员治理的读侧事实来源;当前 workflow 只治理文档 / 节点 / 文件夹下可发现文档的权限,不做 space member governance。 +- 当前 CLI 没有 `permission.members list`、完整继承链、DLP 扫描、AI 索引状态、审计日志和跨平台权限事实。遇到这些需求必须记录为 `unsupported_checks` 或建议新增独立 workflow。 + +## 输出策略 + +- 默认 summary-first:单目标输出简短审计摘要;容器目标输出安全诊断报告摘要,而不是字段计数堆叠。 +- 容器安全诊断必须包含一句话结论、覆盖情况、风险分级、优先处理对象、建议下一步和剩余限制。 +- 优先处理对象必须可定位:默认展示 path/title、URL、type、风险原因、关键证据和建议动作。缺少 URL 时,必须展示 token、node_token 或无法生成 URL 的原因。 +- 容器摘要不能固定只展示 Top N 样例。风险对象 1-10 个时全部展示;11-30 个时展示全部高优先级待处理对象;31 个以上按高优先级分组展示 Top 样例,并明确完整清单总数和生成 artifact 的下一步。 +- 发现风险后不要只结束报告。必须给出下一步 CTA,例如查看完整风险清单、生成只读整改 dry-run、按 owner / 密级生成复核清单,或对高优先级目标进入写入确认流程。 +- 完整风险清单是后续治理选择的输入,不是普通报告。每一行必须有稳定 `risk_id`,让用户可以按编号、风险分组、owner、路径、URL、CSV `selected=true` 或飞书文档表格行选择处理范围。 +- 面向用户时优先使用业务语言:如“允许对外分享”“公司内知道链接可读”“谁可以复制 / 下载 / 打印”“谁可以评论”。底层字段名只作为证据补充,不作为主结论。 +- 完整权限设置清单、访问复核清单、整改 dry-run、写入确认和最终摘要模板,按需读取 [`lark-drive-workflow-permission-governance-outputs.md`](lark-drive-workflow-permission-governance-outputs.md)。 +- 不要默认创建文件、飞书文档或长表格;只有用户要求、结果过大,或 workflow 明确需要结构化确认时再生成。 +- 最终回复必须包含已完成事项、验证结果和剩余限制。异步 owner 审批只能表述为“已发起申请”,不能表述为已完成授权。 diff --git a/skills/lark-drive/references/lark-drive-workflow.md b/skills/lark-drive/references/lark-drive-workflow.md new file mode 100644 index 000000000..9a823cf40 --- /dev/null +++ b/skills/lark-drive/references/lark-drive-workflow.md @@ -0,0 +1,130 @@ +# lark-drive Workflow 总框架 + +本文是 `lark-drive` workflow 总框架的运行协议和注册表。它面向 AI Agent 执行,只负责路由已纳入本总框架的 workflow。 + +`Workflow Registry` 是本总框架的唯一注册来源。未命中 registry 的请求必须按“未注册 workflow 处理”执行,不要按已有 workflow 类推扩展。 + +## 必读上下文 + +执行本总框架内的 workflow 前,必须先阅读 [`../../lark-shared/SKILL.md`](../../lark-shared/SKILL.md) 了解认证、全局参数和安全规则。 + +下游 reference 只能按需逐步加载。不要因为命中本总框架,就预加载所有 workflow 文件或相关 skill。 + +## 能力边界 + +`lark-drive` workflow 总框架以 `lark-drive` 作为 Drive / Docs / Wiki 资产编排的总入口。其他领域 skill 只有在已纳入本总框架的 workflow 明确需要时,才作为辅助能力加载。 + +| Layer | Owns | Must Not Own | +|-------|------|--------------| +| `lark-drive/SKILL.md` | 用户意图到具体 workflow entry 的短路由 | 长流程逻辑、未注册场景 | +| `lark-drive-workflow.md` | 共享运行协议、Artifact Contract、Workflow Registry、加载规则 | 非运行时背景说明、宽泛路线图、场景专项执行细节 | +| Registered workflow file | 场景范围、状态机、Command Map、确认门槛、验证规则 | 其他场景、隐藏写入、未被 CLI/API 支持的能力声明 | + +## 执行协议 + +每个已纳入本总框架的 workflow 必须遵循同一条执行骨架: + +```text +route -> scope -> read -> assess/plan -> confirm -> execute -> verify -> done +``` + +运行规则: + +1. 在读取或写入资产前,先把用户意图解析到唯一一个已纳入本总框架的 workflow。 +2. 在昂贵读取或写入规划前,先解析并确认 `target_scope`。 +3. 事实必须来自可执行 CLI 命令或被引用 skill;不要只凭目录结构推断治理结论。 +4. 无法执行的检查必须记录到 `unsupported_checks`,不能静默省略。 +5. 写入前必须产出计划。每一次写入都需要用户对准确范围和 command family 显式确认。 +6. CLI/API 支持验证时,写入后必须用 fresh read 验证。 +7. 结束时进入 `done`,返回已完成事项、验证结果和剩余限制。不要把尚未完成的外部审批描述成已完成。 + +## Artifact Contract + +每个已纳入本总框架的 workflow 必须维护以下内部字段: + +| Field | Meaning | +|-------|---------| +| `workflow_id` | 本总框架注册的 workflow 名称,例如 `permission_governance` | +| `current_state` | 当前 workflow 状态 | +| `target_scope` | 已确认的目标范围和用户原始输入 | +| `identity` | 当前身份和执行视角,通常为 `user` | +| `facts` | 从 CLI 读取或引用 skill 获取的证据 | +| `plan_items` | 候选动作;每项包含 command family、target、risk、verification method | +| `unsupported_checks` | 因 CLI/API 覆盖、目标类型、认证或范围限制而无法执行的检查 | +| `partial` | 结果是否不完整,以及不完整原因 | +| `execution_results` | 已确认写入的执行结果 | +| `verification_results` | fresh read 验证结果,或明确的异步审批限制 | + +用户可见输出默认使用简洁 chat summary。只有在用户要求、结果过大不适合聊天展示,或当前 workflow 明确要求共享产物时,才创建本地文件或飞书文档。 + +## Workflow Entry Contract + +每个已纳入本总框架的 workflow entry file 必须让 Agent 能直接判断和执行: + +- 何时进入该 workflow,以及哪些需求不属于该 workflow; +- 如何映射到共享执行骨架的 state machine; +- 当前 state 需要按需加载哪些 reference; +- 哪些 command family 可用,以及读写风险边界; +- 写入前如何确认,写入后如何验证; +- 最终回复必须包含哪些字段,或使用哪些 output templates。 + +每个纳入本总框架的 workflow 默认从一个独立 reference 文件开始。只有当写入、回滚或验证流程复杂到影响可读性时,才继续拆 phase 文件。 + +## Risk / Structure Gate + +每个纳入本总框架的 workflow 都必须同时声明 `Risk Level` 和 `Structure Level`。风险等级决定安全门槛;结构等级决定文件拆分。高风险写入不等于必须拆 phase。 + +Risk Level: + +| Level | Meaning | Runtime Requirement | +|-------|---------|---------------------| +| `R0` | read-only:只读发现、分析、报告 | 记录事实来源、`unsupported_checks` 和 `partial` 原因 | +| `R1` | low-risk write:创建草稿、生成临时产物等低风险写入 | 写前说明范围,写后返回结果链接或标识 | +| `R2` | high-risk write:权限变更、批量移动、标签修改等高风险写入 | 写前计划、准确 diff、用户显式确认、fresh read 验证 | +| `R3` | destructive / recovery-sensitive write:删除、自动归档、双向同步、rollback cleanup | 恢复边界、执行日志、分批策略、失败停止条件和单独确认 | + +Structure Level: + +| Level | File Shape | When To Use | +|-------|------------|-------------| +| `S1` | compact entry only | 只读、轻量审计、简单计划,无复杂写入 | +| `S2` | entry + optional `commands` / `outputs` / `artifacts` references | 有命令样例、输出模板、少量高风险写入,但状态链可集中表达 | +| `S3` | entry + phase files + optional shared references | 多阶段写入、复杂验证、恢复 / rollback、长任务或分批执行 | + +升级规则: + +1. 新 workflow 默认从 `S1` 开始。 +2. Entry file 超过约 300 行时,优先拆 `commands`、`outputs` 或 `artifacts` reference。 +3. 只有执行、验证、恢复或 rollback 状态链复杂到影响可读性时,才升级到 `S3` phase files。 +4. 垂直业务包优先作为已有 workflow 的 recipe / policy / template,不默认新增独立 workflow。 +5. 已有样板:`permission_governance` 是 `R2/S2`;已发布的独立 `knowledge_organize` 是 `R2-R3/S3`,当前不作为本总框架 registry entry。 + +## 加载与拆分边界 + +- 每个纳入本总框架的场景默认只保留一个紧凑 workflow entry file。 +- 不为未注册或未来场景创建占位 reference / registry entry。 +- 只有 workflow 已经具备可执行规则时,才允许作为本总框架 workflow 出现在 `SKILL.md` 并加入 `Workflow Registry`。 +- 多文件 phase 拆分只用于执行、回滚或验证流程复杂到影响可读性的 `S3` 场景。 + +## Workflow Registry + +| Workflow | Status | Risk | Structure | Entry File | Trigger | +|----------|--------|------|-----------|------------|---------| +| `permission_governance` | Registered | `R2` | `S2` | [`lark-drive-workflow-permission-governance.md`](lark-drive-workflow-permission-governance.md) | 权限审计、公开链接/外部访问、复制/下载/评论/分享设置、权限申请、密级标签调整 | + +## Workflow Loading + +当用户意图匹配到本总框架已注册 workflow 时: + +1. 先读取本总框架文件。 +2. 只读取 `Workflow Registry` 中命中的 entry file。 +3. 按该 workflow 的 progressive load map 继续加载额外 reference。 +4. 除非用户改变意图,或当前 workflow 明确路由到其他 workflow,否则不要读取其他 workflow 文件。 + +## 未注册 workflow 处理 + +`Workflow Registry` 是本总框架的唯一注册来源。用户请求未列入 registry 的 workflow 或组合型治理场景时: + +1. 明确说明该需求暂无纳入本总框架的 `lark-drive` workflow。 +2. 只在不新增本总框架 workflow 行为的前提下,将请求收窄为现有 skill / CLI 可执行的原子操作。 +3. 不要类比本总框架任何已注册 workflow 新增 state machine、artifact shape、风险分类、写入行为或验证结论。