dingtalk-oa-approval
Skill0 starsChanged 2 months agoMITView on GitHub
钉钉 OA 审批审阅与提醒工作流。凡是用户提到钉钉审批、OA、待审批、同意/拒绝/退回、录用、离职、请假、出差、外出、财务付款、报销、合同、晋升、立项特批,或让你定时检查新审批/超过 3 天审批,都必须使用本 skill。它要求先完整读取审批详情、流水、附言、附件、链接文档、PDF、面试记录、试用期考核标准等材料,再给出审批决策和附言;DWS 优先,DWS 读不到全文时按用户授权打开钉钉界面补读。
- Sends data out
In this repository42 other files it gives its agents.
- ai-pr-redteamSkill
- ai-servicesSkill
- build-work-memorySkill
- ceo-calendar-inviteSkill
- ceo-document-reviewSkill
- ceo-email-classifierSkill
- ceo-feedback-iterationSkill
- ceo-feedback-processingSkill
- ceo-mail-reviewSkill
- ceo-meeting-workSkill
- ceo-message-triageSkill
- ceo-minutes-syncSkill
- ceo-personnel-communicationSkill
- ceo-wechatSkill
- ceo-work-trackingSkill
- codex-model-capacity-retrySkill
- daily-frontier-tech-discoverySkill
- dengbao-code-auditSkill
- dingtalk-browser-exportSkill
- dingtalk-knowledge-organizeSkill
- dingtalk-minutes-access-requestSkill
- dingtang-okr-reviewSkill
- fundflow-investor-meetingSkill
- fxiaoke-crm-cliSkill
- internal-app-standardsSkill
- ocrSkill
- pm-data-adaptation-assistantSkill
- project-delivery-document-collectionSkill
- qa-generated-test-caseSkill
- senior-technical-product-evaluationSkill
- spec-intakeSkill
- sso-oidc-onboardingSkill
- stardust-interviewSkill
- production-devops-sreSkill
- stardust-ttsSkill
- startask-io-contract-auditSkill
- task-managementSkill
- transcribeSkill
- veyra-timesheetSkill
- vibe-coding-rescueSkill
- vibe-codingSkill
- video-transcribeSkill
The file
Files
DingTalk OA Approval Review
这个 skill 用于帮助当前授权审批人审阅钉钉 OA 审批。目标不是快速给结论,而是先把审批材料读完整,再根据定时任务 prompt 或其引用的本公司规则给出可执行意见。
与其他 DingTalk skills 的边界
不要把本 skill 合并进其他 DingTalk skill。它们负责不同业务,合并后会让触发范围过宽,容易在审批、文档、听记和知识库清理之间误用工具。
dws doc/dws wiki:负责钉钉文档/知识库的创建、读取、写入、成员权限等文档与知识库操作。dingtalk-browser-export:负责从已登录 Chrome 导出当前 DingTalk/Alidocs 文档为 Word、PDF 或 Markdown。dingtalk-knowledge-organize:负责知识库盘点、分类、移动、重命名和 CSV 审批式整理。dingtalk-minutes-access-request:只负责钉钉 AI 听记权限申请、权限页复查和阻塞诊断;听记读取走dws minutes。stardust-oa-finance-review:只管它登记的 11 个财务模板(按processCode精确匹配,见该 Skill 的references/template-registry.md)。审批的processCode在它的登记表里,才按它的规则卡处理;不在登记表里,那个 Skill 对这条审批完全不适用,应选择对应的业务 Skill,按该 Skill 中的规则评估rule_coverage。"没有规则卡"只对登记过的财务模板有意义,不能作为其他审批类型请示 Derek 的理由——2026-09-22 起一条 POC 立项评估和一条其他合同审批都因此被误停在needs_human,而它们本来就不该有财务规则卡。stardust-oa-project-review:项目立项、第一曲线、POC/新机会及项目特批;读取该 Skill 指定的公司项目制度。它不覆盖合同签约权或财务模板审批。stardust-oa-contract-review:合同及其他对外有约束力承诺的审批;必须读合同正文。它不授予签约权,也不替代匹配的财务/项目审阅。stardust-oa-people-review:录用、离职、晋升。各类型规则与未决缺口互不通用;材料之间的矛盾(例如面试不推荐却已发 offer)由提交人解释,按决策表第 6 行退回,不转needs_human。stardust-oa-attendance-travel-review:请假、出差、外出。三类规则不得互相借用;若该 Skill 未定义当前分支的适用边界,或它明确要求的外部规则来源无法取得,rule_coverage不得为1.0。stardust-oa-cloud-resource-review:云资源费用、服务器与计算硬件使用审批;按已批准资源方案核对本次变更。
分类可重叠:例如项目合同应同时读项目与合同 Skill;付款如精确匹配财务 registry,还需财务 Skill。非财务审批不需要在财务 Skill 中有模板行;应按 live process identity 选择其业务 Skill。业务 Skill 给出检查项不等于该类别已 100% 覆盖;只有本单所属业务 Skill 已定义覆盖本案适用分支的判断标准,并已逐条按实际材料核对,才允许 rule_coverage = 1.0。申请是否达到标准是审批结论,不影响该标准本身是否完整,因此未达标准但规则完整时仍可 rc = 1.0。动作映射就是本 Skill 的完整决策表,业务 Skill 不需要、也不应单独再写一份;某类别没有自己的动作清单,不是规则缺口。规则只在各 Skill 里,不读 钉钉审批审阅原则.md 之类的参考文档。
- 资金调拨申请单:一律
needs_human(Derek, 2026-09-23)。照常读完材料,给出摘要、风险和建议,但不执行同意、退回、拒绝或评论,交给 Derek 决定。这是明确规则,不是规则缺口,以后补规则时也不要把它纳入自动处理。
审批内如果出现钉钉文档、Alidocs、知识库文件或 AI 听记链接,可以按材料类型临时调用对应能力读取材料;但审批判断、审批意见、附言和审批动作仍以 dingtalk-oa-approval 为主。AI 听记正文、摘要和转写读取统一走 dws minutes,只有遇到权限阻塞时才使用 dingtalk-minutes-access-request。
基本原则
- 先审阅,后动作。 同意和拒绝属于审批决策动作,必须先读完材料、确认当前
RUNNING任务属于当前授权审批人、拿到当前taskId后才执行。若用户明确说“批了/同意/拒绝”,按用户确认执行;若当前任务或定时任务已明确授权自动处理,只有下文的材料、规则和动作门槛均满足时才可执行。业务 Skill 的判断标准缺失或互相冲突、且本单恰好取决于它时转needs_human;动作本身一律按下文完整决策表,不要由 Skill 臆造审批结论。 - 所有可访问材料必须读完。 包括审批详情、审批流水、审批附言/评论、附件、链接文档、PDF、合同、报销凭证、面试记录、试用期考核标准、交接文档等。
- 通过的前提是所有实质文件都已审阅完成,并且有相应标准/依据文档。 只要审批中的附件、链接、PDF、合同、面试记录、试用期标准、BRD、工时评估、制度依据、预算依据等任一实质材料未读到、未读完或缺少标准文档,不得建议或执行同意。
判定“读不到”之前必须先走通附件读取路径。
dws oa approval attachment download-url和authorize-download目前对审批附件一律返回business error: success=false(2026-09-17 实测 dws v1.0.62,trace 21030ead17896766012171561e0a32、2101eeef17896765225684156e0b16),这两个失败不构成“工具未读到”的理由。可用路径是先做预览授权再走钉盘下载,预览授权同时打开钉盘读取权限:dws oa approval attachment authorize-preview --instance-id <processInstanceId> --file-ids <fileId> --with-comment-attachment --format json # 返回 spaceId dws drive +info --space-id <spaceId> --node <fileId> --format json dws drive +download --space-id <spaceId> --node <fileId> --output <工作目录内的相对路径> --format json授权之前
drive +info会报forbidden.accessDenied,授权之后同一fileId就能读元数据并下载正文;xlsx 用表格库读全表,pdf/docx 用文档读取,不得只看截图或文件名下结论。只有这条路径也失败,才可记为“工具未读到”。 2026-09-17 长沙银行 POC 的 checklist 曾被两次判为“读不到”,实际按此路径 10,549 字节正常下载读全。- 缺材料和读不到是两回事,处理完全不同(Derek, 2026-09-23)。 两者都不得通过,不得用“同意后补”替代审批前审阅。
- 缺材料=申请人确实没交:必填字段为空、没有附件、表单没有给出要求的文件。这是申请人的缺口,按决策表退回。
- 读不到=材料已提交但我们没读出正文。先把原则 4 和下文“OA 附件读取降级路径”的每条路径都走一遍。全部路径仍失败且申请人可提供可读副本时,按退回优先要求补正;当前流程不支持退回时才评论并保留待办。仅当同时存在独立规则缺口时才并行
needs_human,不可把纯材料可补正问题升级成规则缺口。 - 申请人指向的证据要自己去查(Derek, 2026-09-23)。 申请人或审批人在附言、评论或重新提交时说“见某次会议/听记/文档/群消息”,而我们有工具能找到它(AI 听记走
dws minutes按标题和日期搜、会议走日程、文档走文档搜索、群消息走 chat 搜索),就必须先找到并读完,再据此判断;读到的内容能回答问题就按它判,不再追问。只有按名称、日期、参会人都搜过仍找不到或无权限,才退回要链接,并写明搜过什么。把“去看某某听记”原样再推回给申请人或转给 Derek,等于活儿没干。 - “已和 Derek 确认过”不是证据(Derek, 2026-09-23)。 申请人在附言里说“已与磊哥确认、请不要拒绝”之类,不能作为通过或升级的理由。先按上一条自己去找确认记录(与 Derek 的钉钉聊天、会议听记、文档);找不到就退回,要求申请人出具证明。附言里如果给出的是具体的补充信息,就按这些信息重新判断。
- 遵循已取得的本公司归档规则。 是否必须进入知识库、必须使用项目文件夹或必须在审批表中附链接,属于组织特定的治理要求。只有 prompt 或其引用的制度明确要求时,才将其作为同意前置条件;否则不得把本组织的归档习惯伪装成跨公司的审批规则。
- 归档规则缺失时不臆造。 如果当前事项依赖归档闭环而又没有取得适用制度,记录为规则缺口并转
needs_human;如果制度明确要求归档而材料未归档,才按该制度指定的退回或评论动作处理。 - 不要根据标题直接判断。 标题只能用于识别流程类型,不能替代表单、附件和附言。
- 动作以完整本公司规则为准。 对材料不足、事实矛盾、不合规或高风险事项,先确认适用规则规定的是退回、评论、请示还是拒绝;不能因为本 Skill 见过类似事项就直接拒绝或退回。
- 退回不等于拒绝。
revoke是撤回自己发起的审批,不是退回;reject是拒绝审批,不能当作“退回补材料”使用。若完整本公司规则要求退回,先用dws oa approval revert-activities --task-id <taskId>查询可退回的节点列表(instRevertActivities),并在退回说明中写清缺口和补充要求。模板支持退回发起人(REVERT_FOR_RESUBMIT)时优先退发起人;不支持、或发起人已离职时,退回到仍在职、负责补充材料的节点(REVERT_FOR_APPROVAL)。若本公司规则指定评论或instRevertActivities确实为空,才按该规则评论并保留待办;工具错误不构成“没有可退回节点”的证据。 - 不要手打或转抄任何 URL。 2026-09-17 实测:分身把 prompt 里的反馈链接手抄进
dws chat +dm --content,百分号转义被抄断在半路(...%E5%AE%A1%E6% 批待办扫描...、...%E7%90%86%E,尚...),申请人收到一大段乱码;它发现后用chat message edit重发,又抄错一次。规则:消息正文里只能出现从工具返回结果里原样复制的链接;prompt、历史消息或上一轮输出里的长 URL 一律不要重抄。反馈链接由服务在自己的发送路径上追加,分身不得自行拼接或复述——需要给对方链接时,用审批详情返回的url字段,或者干脆只写事项名称让对方在钉钉待办里打开。 - 被判为重复的消息是已送达,不是失败。 给申请人发通知时,如果 provider 返回重复抑制(例如
PROVIDER_DUPLICATE_NO_READBACK),说明同样内容此前已经发出去了:应当读回那条消息确认后报"已送达",不要把本轮判为失败。实测 2026-09-17:一条审批因此连跑四轮全部失败、反复重试又反复被去重,钉钉里当晚一条都没发出。 - 当前不需要授权审批人处理的审批要跳过,结论是
no_action,不是needs_human。 如果详情或任务列表显示当前RUNNING任务不属于当前授权审批人,不做完整材料审阅,也不提醒为待处理事项;只记录为列表口径异常或他人待办。这一条先于下文的完整决策表判断——决策表第 14 行(兜底needs_human)只适用于授权审批人确实有待处理任务的审批,不能用来接住"不确定是不是他的"。
- 归属对不上时,以授权审批人自己的
list-pending为准。 实例详情里tasks的userId与授权审批人对不上、或多个并行RUNNING任务分不清归属时,不要因为"无法确认 userId 对应谁"而转needs_human:跑dws oa approval list-pending,这个实例不在授权审批人自己的待办里,就是他人待办,结论no_action;在里面,才继续审阅。 - 2026-09-22 实测:两条审批(一条 POC、一条其他合同)实例都还
RUNNING,但 Derek 的list-pending为 0,当前待办都在别的审批人手里。一条前一轮已正确得出no_action(conf 0.99),下一轮却因"对不上 userId"翻成needs_human(conf 0.42、rc 0.38);另一条要 Derek"授权重跑"一个他根本没有待办的审批。把"要不要处理别人的待办"交给授权审批人,是在造一个他答不了的问题。
通用默认分流
- 可补正的材料缺口优先退回补充,不以拒绝代替补正。 只有问题已查实、无法通过补充或修订纠正,并且适用业务规则允许拒绝时,才建议拒绝。若钉钉当前流程不支持适用的退回动作,按本公司规则评论要求补充并保留待办;不得用
reject模拟退回。 - 只有制度/标准来源缺失时,申请人侧与人工侧并行处理。 在 OA 评论中只问申请人能否提供已有、可追溯的制度/标准来源或链接;同时将规则来源、适用边界或动作授权缺口交
needs_human,不能让申请人替公司制定规则。申请人回复只用于定位来源,不能单独关闭人工升级。 - 以上是审阅分流默认值,不替代公司或业务大类 Skill 对具体阈值、例外、授权人和最终动作的规定。若业务 Skill 明确写了不同的动作(例如财务模板的规则卡),以该 Skill 为准;没写就按本 Skill 的决策表。业务 Skill 之间互相冲突时转
needs_human。
工具顺序
优先使用 dws,所有命令加 --format json。
先读取 DWS skill(如果当前会话还没有读过):
sed -n '1,220p' /Users/derek/.agents/skills/dws/SKILL.md常用只读命令:
dws oa approval list-pending --start "<YYYY-MM-DD>" --end "<YYYY-MM-DD>" --format json
dws oa approval detail --instance-id <processInstanceId> --format json
dws oa approval records --instance-id <processInstanceId> --format json
dws oa approval tasks --instance-id <processInstanceId> --format json当前本机 dws v1.0.52 的 list-pending 必须传 --start 和 --end;不要再使用旧版 --page/--size 示例。dws mcp 的 canonical MCP 命令面已禁用,不能再用 dws mcp oa get_processInstance_detail 作为详情兜底。
DWS detail 解析失败的已知模式
如果 dws oa approval detail --instance-id <processInstanceId> --format json 返回:
server_error_code=PARAM_ERRORtechnical_detail包含iPaaS 调用失败、saNode parse output error、expPayloadexpPayload里已经出现正确的processInstanceId、标题、operationRecords或评论正文片段
这通常不是实例 ID、当前账号权限或 CLI 参数绑定问题,而是 DWS 远端 Wukong/iPaaS 节点在把钉钉 OA 详情返回值转换为声明出参类型时失败。常见触发点是审批详情里的可变结构字段,例如很长的 operationRecords[].remark、评论附件、表单嵌套 JSON、空值/数组/对象混合字段。此时 DWS CLI 只收到业务错误,无法从 detail 产出可用 JSON。
处理要求:
- 先记录 DWS 版本、实例 ID、
trace_id、server_error_code和上述失败症状。 - 继续读取
records和tasks,但只能用于确认流水和任务归属;records不返回评论正文,不能替代完整详情。 - 立即使用 OpenAPI 详情补读脚本,不要基于
records的空评论正文做审批通过判断:
python3 /Users/derek/.agents/skills/dingtalk-oa-approval/scripts/oa_openapi_detail.py --instance-id <processInstanceId> --summary若需要保留完整原始详情用于审阅,去掉 --summary,但不得输出或保存 access token、AppKey、AppSecret、cookie、OAuth code 或临时下载 URL。
长期修复应在 DWS 远端接口完成:放宽 oa/get_processInstance_detail 的出参 schema,允许 operationRecords、表单值、附件、评论等字段保留原始 JSON/字符串/空值/数组/对象,不要让单个字段转换失败导致整个详情接口失败。
如果 detail 返回 formValueVOS: [{"details":[]}]、附言只有 ADD_REMARK 但无正文,或详情接口解析失败:
- 明确记录 DWS 版本、实例 ID、返回症状。
- 继续读取
records和tasks,但不要基于空详情做通过判断。 - 如果用户已授权使用 API,并且本机有
~/.dingtalk-skills/config,用 OpenAPI 补读详情;不要在输出里打印 access token、AppKey、AppSecret。 - 若用户已授权打开钉钉界面,切到钉钉客户端或 Chrome 读取页面详情。
- 若钉钉界面仍失败,向用户说明具体失败点,并要求打开对应审批详情页后继续。
OpenAPI 详情补读
当 DWS 详情为空、字段丢失、或任务归属异常时,允许调用已授权的钉钉 OA OpenAPI/API 作为补充事实源。当前 OA 详情不完整时不能强行只用 DWS;以后如果 DWS 新增完整详情能力,再优先收敛到 DWS。前提是用户已授权,且应用已开通 qyapi_aflow 权限。
获取 token 和详情:
set -a; source ~/.dingtalk-skills/config; set +a
token=$(curl -sS "https://oapi.dingtalk.com/gettoken?appkey=${DINGTALK_APP_KEY}&appsecret=${DINGTALK_APP_SECRET}" | jq -r '.access_token // empty')
curl -sS -X POST "https://oapi.dingtalk.com/topapi/processinstance/get?access_token=${token}" \
-H 'Content-Type: application/json' \
-d '{"process_instance_id":"<processInstanceId>"}'常用提取:
jq -r '
.process_instance as $p |
"TITLE: \($p.title)",
"BUSINESS: \($p.business_id)",
"CREATE: \($p.create_time)",
"STATUS: \($p.status) RESULT: \($p.result)",
"ORIGINATOR_DEPT: \($p.originator_dept_name)",
"FIELDS:",
($p.form_component_values[]? | "- [\(.component_type)] \(.name // "") = \(.value // "")"),
"REMARKS:",
($p.operation_records[]? | select(.remark != null and .remark != "") | "- \(.date) \(.operation_type) \(.operation_result): \(.remark)"),
"TASKS:",
($p.tasks[]? | "- \(.taskid) \(.task_status) \(.task_result) user=\(.userid) url=\(.url // "")")
'OpenAPI 审阅要点:
form_component_values是表单字段的事实源,可能包含 DDBizSuite JSON、附件数组、链接、表格行等嵌套内容。operation_records是审批附言/评论事实源;审批留言里的补充信息必须纳入判断。tasks是审批动作和是否需要处理的事实源;只审阅、提醒、操作当前用户且task_status=RUNNING的任务。若待办列表仍显示但 OpenAPI 中当前 RUNNING 任务不属于当前用户,跳过该审批,不做完整材料审阅,也不要操作。- 附件里的
DDAttachment.fileId/spaceId先按“OA 附件读取降级路径”处理。不要把fileId直接当dws drive download --node的 dentryUuid,也不要把同名doc search结果直接当作附件正文;同名文档只能作为补充候选,必须和原附件文件名、正文关键信息或审批事实交叉验证。 - 输出和日志中不得暴露 token、AppKey、AppSecret、cookie 或 OAuth code。
- 在
ceo-agent-service自动化里,API token、AppKey、AppSecret、cookie、OAuth code、签名下载 URL 不得写入 SQLite、日志、报告、DingTalk 回复、agent 输出或audit_summary;只能记录“已使用授权 API 补读详情”这类事实。
钉钉界面 fallback
当 DWS 不能读全文且用户允许打开审批页时:
- 先尝试钉钉客户端内的
审批 -> 审批中心 -> 待处理的。 - 如果工作通知里有审批通知,也可以从
工作通知:北京星尘纪元智能科技有限公司打开对应卡片。 - Chrome 直达审批页可能缺钉钉客户端身份,出现“用户信息验证失败”;这时不要继续在 Chrome 硬试,改用钉钉客户端。
- 直达详情 URL 可从 PC bundle 路由推导,但 PC 客户端可能提示“暂时无法打开该链接,请在手机上查看”。遇到这种情况要如实报告。
- 智能合同里的合同正文/附件如果 DWS 和文档搜索都读不到,可以在钉钉客户端审批中心搜索申请人、合同名或业务编号,打开审批详情里的
合同正文 -> 预览。预览页通常能显示 Word/PDF 正文、AI 概览和页码;需要逐页滚动读完。预览页 URL 可能含临时签名、STS token 或下载参数,不得复制到报告、日志或回复里。 - 只读审阅时不要点击同意、拒绝、撤销按钮;但若当前任务要求自动评论,且已经确认不是同意/拒绝动作,可以提交评论。
审批中心链接:
https://aflow.dingtalk.com/dingtalk/pc/query/pchomepage.htm?corpid=ding8ffc70a4ef94915f35c2f4657eb6378f&swfrom=mainNav#/upcoming?type=upcoming移动详情 URL 模板(不保证 PC 可打开):
https://aflow.dingtalk.com/dingtalk/mobile/query/formService?dd_share=false&showmenu=false&dd_progress=false&dd_enable_replace=true&corpid=ding8ffc70a4ef94915f35c2f4657eb6378f&bizType=approve#/detail?procInstId=<processInstanceId>审阅流程
每条审批按这个顺序处理:
- 从
list-pending提取标题、流程类型、processInstanceId、processCode、状态和更新时间。 - 先用
tasks或 OpenAPItasks确认当前RUNNING任务是否属于当前授权审批人;不属于就跳过,不继续打开附件、文档或链接。 - 用
detail读取业务编号、创建时间、发起部门、表单字段、附件和任务节点。 - 用
records读取审批流水和附言/评论。若有ADD_REMARK但无正文,必须说明正文未读到。 - 打开审批内所有可访问链接、附件、文档和 PDF。
- 如果当前本公司规则明确要求归档,检查实质评审文件是否满足该归档规则;没有读到归档制度时把它记录为规则缺口,而不是假定必须存在某一种项目文件夹。
- 若任一实质材料读不到、缺少对应标准/依据文档,停止实质判断;动作必须遵循完整本公司规则的退回或评论映射。没有该映射时转
needs_human,并列出未读到的材料或未取得的规则来源。 - 如果是录用审批,必须读取面试记录和试用期考核标准;没有读到不得下结论为同意。
- 如果是财务/报销/付款,必须读取付款依据、预算/项目归属、发票/凭证、合同/订单/账单、费用说明和风险。
- 如果是出差/差旅/报销,先加载对应业务 Skill;只有该 Skill 明确指定了需要核验的现行制度来源时,才按其限定范围读取。Skill 未提供关键标准时,将其记录为规则缺口,不自行搜索背景文档补规则。
- 对每条审批显式给出“风险等级”“确信度”“information_completeness”“rule_coverage”,再给出建议动作、核心理由、制度依据、关键风险、建议附言。四个值必须互相自洽:结论里写了缺材料,
information_completeness就不能接近 1;没取到完整适用规则,rule_coverage就不能为1.0。 - 只有用户确认,或当前定时任务 prompt 已明确授权且
information_completeness == 1.0、rule_coverage与风险门槛都满足时,才用tasks中当前用户的taskId调用 approve/reject。分值不达标时按「动作与结局映射」分流:材料缺口按决策表退回;判断标准不足转needs_human;材料依据都齐但高风险确信度不够转needs_human。等待他人确认或外部结果按决策表评论说明。
风险和确信度
每条审批必须单独评估两个维度:
风险等级
- 低风险:错误后果通常可通过常规管理动作纠正,且本公司完整规则明确属于低风险并允许自动动作。不得仅按金额小、历史曾同意或个人口头印象定为低风险。
- 中风险:涉及预算、客户、差旅、合同、项目资源、特殊费用或后续凭证闭环,或本公司规则没有将它明确归为低风险。
- 高风险:涉及录用/薪资、晋升、合同实质义务、授信/借款/付款、项目例外、数据/隐私/权限、对外重大承诺、法律/财务/税务/合规风险,或存在明显不一致、矛盾、虚假、不合规。除当前用户对本条具体审批的明确指令外,高风险不得自动同意;即便有明确指令,也必须读完材料且取得完整适用规则。
确信度
- 高确信度:审批详情、审批流水、附言/评论、所有实质附件/链接/PDF/文档均已读完;适用 Skill 要求核验的事实证据已核对;如规则明确要求归档,归档也已闭环;当前
RUNNING任务属于当前授权审批人;没有未解释矛盾;结论依据充分。规则文字是否完整计入rule_coverage,不重复计入事实确信度。 - 中确信度:主体事实和关键依据已读到,但仍有次要信息、后续凭证、已确认的归档要求或边界说明需要补齐;可给出倾向意见,但不自动同意,优先评论要求补充或等待用户确认。
- 低确信度:详情为空、事实材料未读到、附件不可访问,或评论中有未澄清的新信息。适用标准/授权缺口单独反映在
rule_coverage;若它使本案分支未被覆盖,不得自动同意。
information_completeness(材料完整度,0~1)
衡量的是做这个决定所需的事实,我实际读到并核实了多少。它衡量材料,不衡量我们做过的动作——"已经评论过""已经通知过申请人""上一轮审阅过"都不能抬高这个值;材料没补上来,它就该一直是低的。
- 1.0:表单、流水、附言/评论、全部实质附件和链接文档中与本次判断相关的事实都已读到;如适用规则规定需有归档证据,也已满足;没有未解释的事实矛盾。规则来源本身按
rule_coverage评分。 - 0.8~0.99:主体事实和关键依据齐全,只差次要项——后续凭证、边界说明,或已确认制度要求的归档链接。不得自动同意。
- 0.5~0.79:有一项关键材料缺失或读不到——合同正文、验收标准、交接文档、面试记录、预算依据、发票凭证。结论只能是退回。
- < 0.5:表单为空、核心附件全部不可读、当前任务归属不明、或评论里出现未澄清的新事实。服务会强制走单问回退,不产生终态结论。
判断时逐项列出"这个审批类型必须读到的材料清单",再数已读到几项;不要凭整体感觉给分。附件按原则 4 的预览授权路径试过才算读不到。
规则来源、完整性与实际覆盖
rule_coverage 不是“读到一段规则文字”的分数,而是本次审批适用的完整规则集是否已经取得、理解并覆盖了实际情况。在评分前,必须先建立本次审批的规则来源和适用范围。
运行时审批判断按当前任务 prompt 和已加载的通用/业务 Skill 执行。相关规则可以由以下位置提供:
- 定时任务 prompt 中明确写出的 OA 审批规则区域;
- prompt 或业务上下文明确引用的规则文档、制度文档或其他可追溯来源;
dingtalk-oa-approval与匹配事项的公司/业务专用 Skill,以及 Skill 明确引用的规则 reference。
钉钉审批审阅原则.md 是背景参考文档,不是审批 Agent 的运行时规则来源;不得为了补齐 rule_coverage 而读取它。若决定所需的公司规则没有写入当前 prompt 或适用 Skill,按规则缺口处理,不自行搜索、推断或用历史案例补规则。
只提供 DWS 查询、详情、任务或写操作命令的 dingtalk-misc/references/oa.md 是工具用法参考,不是业务审批规则来源,不能单独支撑高 rule_coverage。不得把背景参考文档当作运行时制度来源;本公司审批规则须已写入当前定时任务 prompt 或适用业务 Skill,不可从 Skill 本机路径、历史案例或 Agent 记忆中猜测。
规则来源必须覆盖以下内容:
- 当前审批事项类型和适用范围;
- 做出决定所需的事实、材料和前置条件;
- 阈值、单位、时限、角色关系和判断标准;
- 例外、特批条件、授权人和适用边界;
- 每种结果对应的动作(同意、拒绝、退回、评论、等待或
needs_human); - 当前审批实际触及的分支、事实和风险。
有下列任一情况,rule_coverage 不得为 1.0:只读到总原则或摘要;规则只覆盖事项的一部分;适用 Skill 提到另有公司制度决定本案分支但没有明确给出可适用标准,且没有指出可读取的有效规则来源;例外或授权边界没有写清;规则逻辑与当前案例不匹配;规则来源之间存在未解决冲突;或当前案例出现规则没有覆盖的新分支。不得用经验、先例、常识或 Agent 自己补出的判断把覆盖率补到 1.0。
审阅结果的“制度依据”必须同时记录:规则来源、适用事项/范围、已核对的条款或段落、规则版本或更新时间(如果来源提供),以及未覆盖项或冲突。规则缺口属于我们的依据缺口,不得伪装成申请人的材料缺口。
rule_coverage(规则覆盖度,0~1)
衡量的是这个审批有没有完整、可依据、我已经核对过并且覆盖当前实际情况的成文规则集。完整审批 Skill 可以直接构成规则来源;只有当适用 Skill 明确要求读取外部制度/标准作为本案决策依据时,才必须读取该指定来源。
- 1.0:通用 Skill 与适用业务 Skill 已覆盖当前分支的事项范围、所需事实、阈值、例外和授权边界;Skill 明确要求的外部规则来源(如有)已读取;并已逐条对照审批内容核对。动作映射由通用决策表给出,不要求业务 Skill 重复编写。
- 0.5~0.99:有直接规则,但只覆盖部分情形,或有个别条款、例外、授权边界或当前分支需要解释;这表示“部分覆盖”,不是完整规则。
- 大于 0、小于 0.5:只有边缘或间接依据(如同类审批先例、他人转述的口径),没有直接适用的规则。
= 0:该审批类型完全没有直接适用的成文规则,或 Skill 明确要求的外部规则来源存在但读取失败。背景参考文件不是必须读取的规则来源,也不得仅因没有读取它而降低覆盖分。
找不到规则不等于可以按常识放行。Skill 已完整定义本案实际分支时,可依据 Skill 评分;若 Skill 明确要求外部制度补充本案标准而该来源未取得,或 Skill 本身未定义当前分支,rule_coverage 必须低于 1.0,并按决策表转人工。
两个分值和三条路径的关系
information_completeness < 0.8且缺的是申请人可补正的材料、同时适用规则及动作授权完整 → 优先退回,写明补正项;当前流程不支持退回时,按适用规则评论并保留待办。若同时存在规则缺口,执行下文“双向处理”,不能只退回或只升级。rule_coverage < 0.5→ 转人工,不要凭经验给结论,也不要以此为由退回(缺的是我们的依据,不是申请人的材料)。rule_coverage < 1.0→ 规则尚未完整覆盖;不得在结论中写“规则已完整覆盖”,也不得把未覆盖的规则分支当作已满足。需要依赖该缺失规则作出业务判断时,转needs_human或先补齐规则来源。- 自动同意要求
information_completeness == 1.0且rule_coverage == 1.0。 - 报分值前先自查:若结论写明决策所需事实或材料缺失/未读到,
information_completeness必须反映该事实缺口;核心材料缺失时低于0.8,仅缺次要项时可为0.8~0.99。单纯缺规则来源只降低rule_coverage,不自动降低材料完整度。
完整决策表(自上而下,命中第一条即执行)
没有类型黑名单,全部按分值判定。每一轮必须先给出 risk、confidence、information_completeness(ic)、rule_coverage(rc),再对照下表;顺序不可调换,上面的条件优先于下面的。
先分清两类“不能同意”,它们的处理不同,且均不能由本 Skill 自己创造拒绝边界:
- 事实不成立(违规):已查实与事实不符、伪造,或违反强制性规定(法律、财税、合规红线)。材料之间只是互相矛盾、还没有提交人的解释时,是提交人要补的说明,按第 6 行退回,不是违规,也不是请示人工的理由。只有在完整适用规则明确允许拒绝、事实已查实且动作授权成立时,才可拒绝;否则请示人工。
- 未达规则要求:材料真实可信,但不满足制度设定的标准或门槛——例如金额、定级、差旅或项目条件。默认结果是拒绝(Derek, 2026-09-23)——不满足门槛即不予通过,不需要规则另行写明。唯一例外:业务 Skill 设有特批条款、且申请人已在表单或附言中明确提出特批并写明理由,才转
needs_human请示;特批申请不完整(缺负责人意见或理由)按材料缺口退回补齐。业务 Skill 允许特批、但申请人没有提出,仍然拒绝:特批是申请人要主张的事,不是我们替他补上的。
不要把"未达标准"当成违规去拒绝,也不要把违规当成未达标准去请示。
材料缺口与规则缺口同时存在(优先规则)
如果同一审批同时存在申请人能够补充的事实/附件/链接缺口,以及我们尚未取得的判断标准、例外或授权缺口,必须做两件彼此独立的事:
- 在 OA 评论中向申请人只问一个可由其补充的问题,明确需要的事实、附件、链接或已知制度位置;不要让申请人“确认可以批准”或替我们创造制度。
- 对缺少的公司判断标准、例外或授权边界同时记录
needs_human,说明具体缺口和规则来源所有者。评论回执、申请人说明或材料补齐不能关闭这个needs_human;收到补充后必须重读当前 OA,再继续等待/处理人工的规则结论。
这条优先于下表的单纯“材料缺口”行:材料问题不能掩盖规则问题,规则问题也不能免除对申请人可补材料的询问。只有完整的公司规则明确把该材料缺口映射为退回,且该规则本身没有缺口时,才可用退回替代评论。
| # | 情况 | 风险 | ic | rc | confidence | 附加条件(须同时成立) | 动作 | Consumer 结局 |
| 1 | 不归当前审批人处理 | 任意 | 任意 | 任意 | 任意 | 当前 RUNNING 任务不属于当前授权审批人,或审批已终态 | 跳过,写明依据 | proposal(跳过) |
| 2 | 读取失败 | 任意 | 任意 | 任意 | 任意 | 工具、线路或详情服务本身报错/不可用;不包括已提交附件按全部支持路径读取后仍不可读的第 4a 行 | 报失败,保留错误原文 | failed |
| 3 | 无成文依据 | 任意 | 任意 | = 0 | 任意 | 仅有规则来源缺口、没有独立的申请材料缺口;若两者并存,先执行上方“双向处理” | 评论只询问申请人是否知道已有、可追溯的规则来源/链接;并行请示人工补齐规则 | proposal(oa-comments)+ needs_human |
| 4 | 材料缺口 | 任意 | < 1.0 | = 1.0 | 任意 | 申请人确实没交的材料(字段为空、无附件、未给出要求的文件),规则来源完整 | 优先退回补正;当前流程不支持退回时,按规则评论并保留待办 | proposal(revert-task / oa-comments) |
| 4a | 读不到 | 任意 | < 1.0 | 任意 | 任意 | 材料已提交但我们没读出正文,且所有读取路径都已走过 | 申请人可提供可读副本时优先退回补正;流程不支持退回时评论并保留待办。只有并存独立规则缺口时才另加 needs_human | proposal(revert-task / oa-comments) |
| 5 | 事实不成立 | 任意 | = 1.0 | > 0 | > 0.9(针对违规事实) | 已查实矛盾、不实、伪造或违反强制性规定 | 拒绝,写明查实的事实 | proposal(reject) |
| 6 | 未解释的矛盾 | 任意 | 任意 | 任意 | <= 0.9(针对违规事实) | 材料之间、材料与流程状态之间互相矛盾且没有说明,或怀疑第 5 行情形但未查实 | 退回提交人,写明矛盾的两处事实,要求解释并补充依据;流程不支持退回时评论并保留待办。矛盾由提交人解释,不转 needs_human(Derek, 2026-09-23);并存独立规则缺口时按“双向处理”另加 | proposal(revert-task / oa-comments) |
| 7 | 未达标准·已申请特批 | 任意 | = 1.0 | > 0 | 任意 | 材料真实但不满足门槛;业务 Skill 设有特批条款;申请人已在表单或附言中明确提出特批并写明理由,且负责人意见已记录 | 请示 Derek,附特批建议与理由(特批申请不完整时按第 4 行退回补齐) | needs_human |
| 8 | 未达标准 | 任意 | = 1.0 | = 1.0 | > 0.9 | 材料真实但不满足业务 Skill 设定的门槛 | 拒绝,引用条文和实际数值(默认结果,无需规则另行写明“不满足即不予通过”) | proposal(reject) |
| 9 | 含义有歧义 | 任意 | = 1.0 | > 0 | 任意 | 某处含义不明,需申请人一句话澄清才能定论 | 评论提问,正文只放一个问题 | proposal(oa-comments) |
| 10 | 等第三方 | 任意 | 任意 | > 0 | 任意 | 在等他人确认或外部结果(财务复核、客户回签、交接人确认等),且申请人没有应补材料 | 评论说明当前状态和等待对象 | proposal(oa-comments) |
| 11 | 可通过·低风险 | 低 | = 1.0 | = 1.0 | > 0.9 | 材料真实、满足完整规则的全部要求 | 同意 | proposal(approve) |
| 12 | 可通过·中风险 | 中 | = 1.0 | = 1.0 | > 0.9 | 材料真实、满足完整规则的全部要求 | 同意 | proposal(approve) |
| 13 | 可通过·高风险 | 高 | = 1.0 | = 1.0 | > 0.9 | 材料真实、满足完整规则的全部要求 | 同意 | proposal(approve) |
| 14 | 兜底 | 任意 | 任意 | 任意 | 任意 | 以上都不命中,包括适用规则不完整或没有覆盖当前实际分支;前提是授权审批人确有待处理任务,否则按基本原则 13 结论为 no_action | 给出建议和理由,请示当前授权审批人;先补齐规则来源,不得把规则缺口写成申请人材料缺口 | needs_human |
第 14 行是兜底:凡是没够到第 11–13 行门槛的,一律落到这里请示当前授权审批人,不需要为“rc 差一点”或“confidence 差一点”单独列行。
第 9、10 行排在同意之前是有意的:含义未澄清、或还在等第三方结果时,分值再高也不能同意。
任何审批决策都必须带理由,--remark 一律必填。 DWS 的 schema 把 remark 标为"可选",这里不接受可选:approve、reject、revert-task 三个命令缺少 --remark,或 --remark 为空、只有"同意""不通过"这类无信息的词,都属于错误执行,必须重做。理由要写清依据的条文或事实、以及对方接下来该怎么办(退回)或为什么走不下去(拒绝)。
执行后必须回读确认理由已经落库:dws oa approval records 不返回 remark 正文(已知限制),所以不能用它核验理由;要用 OpenAPI 详情补读脚本读 operation_records[].remark,确认自己写的那段话确实在里面。回读不到理由,就当作这次动作没写清楚,需要补一条评论把理由补上。
执行拒绝前必须先查退回,并用措辞自检。 2026-09-17 实测:一份客户合同被直接拒绝,revert-activities 一次都没调用,而拒绝理由写的是"请先补齐上述既有事实并重新提交审阅"——那是一句退回的话,却用拒绝的命令发了出去;审批因此终结,申请人只能从头重发。两条强制检查:
- 调用
reject之前,必须先调用dws oa approval revert-activities --task-id <taskId>,并在结论里写明返回结果。此查询用于确认拒绝理由是否其实要求申请人补正;仅仅instRevertActivities非空,不会把“材料齐全但未达已覆盖标准”的第 8 行默认拒绝改成退回。 - 措辞自检:如果你写的理由里出现"请补充""请补齐""请提供""重新提交""修改后再提交"这类要求对方做事然后回来的表述,那么这不是拒绝,是退回——改用
revert-task,把同一段话放进--remark。拒绝的理由只描述已经查实的事实和据此不予通过的结论,不含"补齐后再来"的要求。
拒绝是终结这条审批;退回是把它交回给能修的人。要对方补东西就永远是退回。
拒绝(第 5、8 行)不套用第 11–13 行的风险门槛,但仍要求适用规则完整。 已确认的违规(第 5 行)只有在事实依据充分、规则明确允许拒绝且授权成立时才可拒绝。真实材料未达到 Skill 明确规定的标准(第 8 行)按用户确认的默认规则拒绝,无需业务 Skill 再重复声明拒绝动作;若 Skill 设有特批且申请人明确提出,走第 7 行。若规则本身不完整或当前分支未覆盖,不能伪装成已确认违规/未达标准,转第 14 行 needs_human。
统一前置(第 5、8、11、12、13 行必须同时满足):当前 RUNNING 任务确属当前授权审批人、审批仍是 RUNNING、分值与结论自洽——结论里写了“缺 X”或“未读到 X”,ic 就不可能是 1.0。
几条容易走错的边界:
ic不满分但缺的不是材料(例如只差第三方确认)→ 不要退回,走第 10 行评论等待;退回是要申请人补东西,第三方的事退给申请人没用。rc不达标 → 永远不要退回给申请人:缺的是我们的依据,不是他的材料。低于 0.5 走第 3 行;0.5 <= rc < 1.0走第 14 行补齐规则来源并needs_human;只有rc == 1.0才能按完整规则作出规则驱动的通过或拒绝。- 第 3 行的申请人询问只用于定位已有规则来源,不能要求申请人创设或解释公司制度;人工升级必须并行保留。若同时有可补正的申请材料缺口,另按“材料缺口与规则缺口同时存在”处理,不能用退回替代规则升级。
动作与结局映射
审批动作必须映射到协议的结局上,不能自创。每一种处理都要落成一个带理由的 proposal——包括“跳过”:跳过是一个明确的判断(这件事不需要当前授权审批人处理),必须写清依据,不能用空的 no_action 代替。no_action 只保留给“本轮确实没有任何可提案的动作”这种退化情形。
用 no_action 表达“我已经评论过了”或“等当前授权审批人确认”是错的:任务会收口成 done 并从 Attention 消失,待处理人再也看不到它在等待。
| 业务情形 | 动作 | Consumer 结局 |
| 分值达标,且完整规则明确同意动作 | 同意 | proposal(approve) |
| 事实有问题、不合规,且完整规则明确拒绝动作 | 拒绝 | proposal(reject) |
| 材料缺、读不到且申请人可补正 | 优先退回;流程不支持时评论保留待办 | proposal(revert-task / oa-comments) |
| 材料齐全,只是在等他人确认或外部结果 | 评论 | proposal(oa-comments) |
| 材料在但含义有歧义,需申请人澄清 | 在审批里评论提问 | proposal(oa-comments,正文只放一个问题) |
| 高风险但分值不够 | 请示当前授权审批人 | needs_human |
找不到成文制度(rc<0.5) | 补齐规则来源并请示当前授权审批人;只有本公司规则要求时才评论申请人 | needs_human |
规则未完整覆盖(0.5 <= rc < 1.0) | 补齐规则来源并请示当前授权审批人 | needs_human |
| 当前 RUNNING 任务不属于当前授权审批人,或已终态 | 跳过 | proposal(跳过,写明依据) |
| 工具、线路、读取失败 | — | failed |
提问一律走审批评论,不要发私聊。 问题留在审批单上,任何人打开这条审批都能看到上下文;私聊会让问答脱离审批记录,而且绕过服务的发送通道(无幂等键、无账本、反馈脚注要靠模型手抄,已因此发出过乱码消息)。
协议在 information_completeness < 0.5 时要求返回"只含一个问题的 proposal"。在 OA 场景下,缺材料时这个问题由退回说明承载——退回本身就是向申请人提出补充要求,不要再另发一条问句。只有材料齐全、仅含义不清时,才单独用评论提问。
审批材料读取补充
OA 附件读取降级路径
OA 表单里的 DDAttachment.fileId 是审批附件 ID,不等同于 dws drive download --node 需要的 32 位 dentryUuid。审批附件优先走钉钉官方审批附件下载接口;只有官方下载失败时,才用文档搜索、企业检索或钉钉界面补读。
- 先从 OpenAPI 原始字段提取
fileName、fileType、fileSize、fileId、spaceId,保留这些信息用于比对。 - 优先调用官方审批附件下载接口获取真实附件:
# 使用新版 OpenAPI token;不要打印 token 或 downloadUri。
curl -sS -X POST "https://api.dingtalk.com/v1.0/workflow/processInstances/spaces/files/urls/download" \
-H "x-acs-dingtalk-access-token: <accessToken>" \
-H "Content-Type: application/json" \
-d '{"processInstanceId":"<processInstanceId>","fileId":"<fileId>"}'接口返回 result.downloadUri 后,用该临时地址下载二进制附件,再按 fileType 抽取正文:docx 解 word/document.xml,xlsx 读工作表 XML/sharedStrings,pdf 用 PDF 文本抽取,图片用 OCR 或人工查看。下载地址通常短期有效,且可能含签名;不得写入日志、SQLite、审批评论、DingTalk 回复或 agent 输出。
在 ceo-agent-service 中,优先使用服务侧已封装的 DwsClient.download_oa_process_attachment(processInstanceId, fileId) 和 worker 注入的 downloaded_attachment.text,不要让子 agent 自己把 fileId 当 drive node 下载。
- 如果官方审批附件下载接口返回
noPermission、超时或网络错误,可重试一次;仍失败时,记录具体错误,并用文件名查找可读的钉钉文档节点作为候选:
dws doc search --query "<fileName without extension or key title words>" --page-size 10 --format json
dws mcp aisearch search_enterprise --json '{"queries":["<fileName> <审批标题> <关键业务词>"],"searchTypes":["document"],"timeRange":""}' --format json评论/审批流水里的附件和表单 DDAttachment 不是同一个下载口径。OpenAPI operation_records[].attachments[] 可能只给 file_id、file_name、file_size、file_type,没有 spaceId。处理顺序:
- 先确认它是评论附件,不要把“评论附件下载失败”误判为申请人未上传。
- 可先获取审批钉盘空间,用于判断是否能走审批钉盘授权:
curl -sS -X POST "https://api.dingtalk.com/v1.0/workflow/processInstances/spaces/infos/query" \
-H "x-acs-dingtalk-access-token: <accessToken>" \
-H "Content-Type: application/json" \
-d '{"userId":"<currentUserId>","agentId":<agentId-or-0>}'- 普通
processInstances/spaces/files/urls/download即使带上该spaceId,对评论附件仍可能返回noPermission。这是评论附件下载口径问题,不是附件不存在。 - 新版 OA 高级版下载接口可读评论附件:
curl -sS -X POST "https://api.dingtalk.com/v1.0/workflow/premium/processInstances/spaces/files/urls/download" \
-H "x-acs-dingtalk-access-token: <accessToken>" \
-H "Content-Type: application/json" \
-d '{"processInstanceId":"<processInstanceId>","fileId":"<fileId>"}'如果返回 benefit.status.invalid,表示租户/应用未开通或权益过期,不能继续把同一个 file_id 当作表单附件、drive node 或 doc node 反复尝试;改走钉钉客户端审批详情、工作通知卡片、申请人评论补可访问链接三选一。若 UI 和搜索也读不到,结论必须是“工具未能读取评论附件”,不得通过,但也不要说申请人没上传。
- 对搜索结果只接受能和原附件匹配的候选:文件名/标题高度一致,并且正文 snippet 明确包含审批中的项目、客户、金额、主体、日期等关键字段。不要因为搜到同名或相似文件就默认匹配;同名在线文档可能是模板、旧版本或另一个节点。
- 搜到
nodeId后按类型读取:extension=adoc:dws doc read --node "<nodeId>" --format jsonextension=axls:dws sheet list后用dws sheet range readextension=docx|pptx|pdf|md且doc info/download可用:dws doc download --node "<nodeId>" --format json,再用本地工具抽取文本;若企业搜索已返回完整可判断 snippet,也可作为辅助证据,但合同/关键财务附件仍应尽量下载或读取全文。
- 如果
doc search找不到,但aisearch search_enterprise能返回带完整正文片段的同名文件,可引用该检索结果继续判断,并在材料记录中说明“通过企业知识检索按文件名补读”。 - 如果应用已开通开放平台权限
Storage.Dentry.Search,可用官方存储搜索接口按附件名、空间或其他线索定位 dentry;若接口返回Forbidden.AccessDenied.AccessTokenPermissionDenied,说明当前应用缺少该权限,继续走文档搜索、企业检索和钉钉界面,不要把它当成附件不存在。 - 只有官方审批附件下载(必须先走原则 4 的预览授权路径,
download-url/authorize-download失败不算读不到)、文档搜索、企业检索、官方存储搜索和已授权钉钉界面都无法读到时,才把附件列为“工具无法访问/材料缺口”。一旦确认读不到,本单不得建议通过;申请人可提供可读副本时优先退回补正。若审批流程不支持退回,才评论说明具体缺项并保留待办;只有并存独立规则缺口时另加needs_human。
财务审批里的发票字段不要只读 InvoiceField.value。value 可能只有供应商名;完整发票号、开票日期、购销方、价税合计、税额、验真/合规结果、文件 fileId/spaceId 通常在 InvoiceField.ext_value 的 JSON 里。必须解析 ext_value 后再判断发票是否匹配付款金额和供应商。
PDF 附件读取失败时,先判断是“真的不可读”还是“PDF 结构损坏、扫描件或图片型 PDF”。如果 PDF 文本抽取失败、页数为 0、page tree 异常或文本层为空,不得直接列为不可读;必须先走“审批 OCR 路径”。只有下载失败、OCR 失败、钉钉界面也无法读取时,才列为工具不可读。
审批 OCR 路径
审批中的扫描 PDF、图片附件、发票/完税证明截图、合同扫描件、盖章扫描件、报销凭证、验收单等,如果没有可用文本层,必须使用 ocr skill 的外部 Stardust OCR 服务读取;不要把本地 magick + tesseract 当作默认路径,避免 PDF 转图卡住或 OCR 语言/版面处理不一致。
OCR 前提:
- 必须先用官方审批附件下载接口、文档下载或钉钉界面导出拿到真实本地文件;不要把临时下载 URL、token、cookie、AppKey、AppSecret 写入日志、SQLite、审批评论或回复。
- 对高影响字段,如金额、日期、主体、合同期限、发票号、税额、付款账号、验收数量、身份证/手机号等,必须保留页码和 OCR 置信度;置信度低或识别有警告时,结论只能到中确信度,并提示需要人工核对原图。
- OCR 结果要和审批表单、评论、合同/发票字段、历史审批编号交叉验证;不得只凭 OCR 单点通过财务、合同、录用、立项等高风险审批。
- OCR 失败或服务认证失败是真失败;不要未经授权上传到其他 OCR 服务,也不要用猜测补全文字。
常用命令:
python3 "$HOME/.agents/skills/ocr/scripts/ocr.py" \
"/absolute/path/to/scanned.pdf" \
--format markdown \
--output "/absolute/path/to/ocr-result.md"如果只需要抽查关键页,使用一基页码:
python3 "$HOME/.agents/skills/ocr/scripts/ocr.py" \
"/absolute/path/to/scanned.pdf" \
--pages 1,3-5 \
--format markdown审批审阅时要读取 OCR 输出全文,并在材料记录中说明“通过 OCR 读取扫描件”。如果 OCR 输出与表单/评论冲突,按明显不一致处理,要求补充清晰材料或人工复核;不得自动同意。
已验证案例:
- OA 附件
项目实施计划(第三曲线大模型解决方案)(2)(2)(1).docx不能用同名dws doc search结果替代;同名 Alidoc 节点曾是空模板。正确路径是用 OpenAPI 详情中的fileId=224596585916调官方审批附件下载接口,真实 docx 可读到项目范围、责任分工、T+30/T+60 里程碑、风险评估和交付物清单。 - OA 附件
专家网络平台一期工时评估.pdf的drive download因空间权限失败,但dws doc search --query "专家网络平台一期工时评估"可找到同名 Alidoc 节点并用dws doc read读取全文。 - OA 附件
背景_统一事实底稿模板.docx的drive download因空间权限失败,但dws doc search --query "背景_统一事实底稿模板"可找到同名 Alidoc 节点并读取转让定价事实底稿全文。 - 智能合同正文
0526星尘设备交接单.docx的drive download因空间权限失败,doc search和企业检索也没有可信同名结果;钉钉客户端审批中心搜索Lynne后打开对应合同审批,在合同正文 -> 预览中可逐页读取 Word 正文和 AI 概览。
钉钉文档和表格:
alidocs.dingtalk.com/i/nodes/<nodeId>可能是在线文档,也可能是钉钉表格。- 在线文档用
dws doc read --node "<url-or-nodeId>" --format json。 - 如果提示
当前节点是钉钉表格(扩展名=axls),改用:
dws sheet list --node "<nodeId>" --format json
dws sheet info --node "<nodeId>" --sheet-id "<sheetId>" --format json
dws sheet range read --node "<nodeId>" --sheet-id "<sheetId>" --range "A1:Z80" --format json钉盘预览链接和只读权限:
- 审批表单或评论里的
https://qr.dingtalk.com/page/yunpan?route=previewDentry&spaceId=<spaceId>&fileId=<dentryId>&type=file是钉盘预览入口。先解析spaceId和fileId,再用dws drive info --node "<fileId>" --space-id "<spaceId>" --format json获取真实文件名、扩展名、路径、dentryId、32 位fileId/nodeId和docUrl。 - 对
docx、pptx、xlsx、pdf、图片等二进制文件,优先尝试dws drive download --node "<dentryId>" --space-id "<spaceId>" --output "<local-dir-or-file>" --format json。下载成功后再按文件类型抽取正文或走 OCR。 - 如果
drive info成功但drive download报“没有权限访问该钉盘空间”“无文件读取权限”等,不要说文件不存在;这是“可预览/可见元数据,但无下载读取权限”。必须继续用dws doc permission list --node "<32位nodeId>" --format json或相应drive permission list查看权限角色。 - 若权限列表显示当前审批执行账号只通过部门、群或个人获得
READER,说明通常只能网页/客户端预览,不能下载解析正文。不要把READER直接等同于材料不可读;如果docUrl、钉盘预览页或审批详情里的预览按钮能打开,必须进入网页或钉钉客户端预览页逐页读取全文,必要时使用页面复制、浏览器导出、截图 OCR 或人工逐页摘录完成审阅。 - 只有在 DWS 不能下载、网页/客户端预览也打不开,或预览页无法读完正文时,才把材料标记为“只读预览仍无法读取全文”。此时不得建议通过。
- 用户明确要求修复时,可以尝试给当前审批执行账号补
DOWNLOADER权限,例如dws doc permission add --node "<32位nodeId>" --users "<currentUserId>" --role DOWNLOADER --format json。如果返回forbidden.accessDenied或提示需要OWNER / MANAGER / EDITOR,说明当前账号没有权限管理权,不要重复尝试,也不要改用猜测路径。 - 权限修复失败后的处理:若网页/客户端预览可读,继续通过预览完成审阅,并在材料记录中说明“通过网页/客户端预览读取,不能下载”;若预览也无法读完且申请人能补正,优先退回要求其提供可访问链接/副本,或协调文件所有者/管理员授权当前审批执行账号。当前流程不支持退回时才评论并保留待办。评论/退回中写明文件名、节点 ID、当前只读角色、所需补正和“未读完前不得通过”;若并存规则缺口,另行
needs_human。 - 对这类问题,最终报告要区分四种状态:
文件缺失、文件存在但只能预览不能下载、已通过网页/客户端预览读取完成、预览和下载均无法读取全文。不要把权限不足归为普通附件解析失败。
外部业务证据系统:
- 录用、项目、财务或合同审批可能引用审批表之外的业务系统。该系统的名称、登录方式、查询键和所需证据包必须由当前本公司规则源指定,不能从历史环境或本 Skill 推定。
- 只读到列表摘要不构成读完;需要逐项展开或导出完整评审/证据包,读到每轮评价、风险、结论及相关附件。
- 系统访问失败时,记录具体访问失败;不要把系统中可能存在但未读取的证据当作缺失、也不能以摘要替代正文。
公司制度与知识边界
公司/业务专用 Skill 是本 OA workflow 的运行时规则载体。Agent 不得通过搜索或打开 钉钉审批审阅原则.md 补规则;当前 Skill 未覆盖的真实公司规则、例外或权限,按规则缺口处理并进入 needs_human。若业务 Skill 明确引用另一份有效文件作为本案必要的事实证据或规则原文,可以按该 Skill 的限定用途读取,但不能因此将背景材料扩展为新的动作规则。
通用审批证据框架
以下是要检查的证据类别,不是可直接执行的公司规则。每个类型的阈值、例外和授权人由对应业务 Skill 提供;动作一律按本 Skill 的决策表。
| 审批类型 | 需读证据 | 规则必须补齐的内容 |
| 项目/特批 | 商业理由、项目测算、战略/客户价值、管理意见、历史/会议依据 | 收益或毛利门槛、特批条件、授权人、低于门槛后的动作 |
| 录用 | 岗位需求、简历、完整面试记录/评审包、试用期目标、定级与薪资依据 | 岗位级别标准、市场薪资方法、HR/业务授权、候选人系统入口 |
| 离职 | 交接清单、接收确认、账号/资产处置、未结风险 | 必须交接项、接收确认标准、例外和关闭责任 |
| 请假/外出 | 理由、时间、工作交接、业务影响、必要的人员关系证据 | 人员关系要求、时长/证明标准、例外和动作 |
| 财务/报销/付款/关联交易 | 付款对象和金额、预算/项目、合同/订单/账单/验收、发票/凭证、风险与复核意见 | 授权矩阵、税务/发票例外、预付款/紧急付款、关联交易定价与复核 |
| 晋升 | 岗位变化、历史绩效/反馈、改进计划、考核指标 | 晋升标准、评审人、例外和后续考核 |
| 出差/差旅 | 客户/商机或业务依据、行程、预算、费用凭证、预期结果 | 场景、提前期、额度、交通/住宿例外、报销材料 |
| 合同 | 合同正文、主体、价款、交付/验收、违约、保密/数据/IP、期限、法务与业务意见 | 签约授权、必须法务复核条件、金额/风险阈值、红线和动作 |
规则源不完整或当前实际分支未被覆盖时,不能用此表中的“通常做法”替代本公司规则,必须将 rule_coverage 记为低于 1.0 并转人工。
输出格式
普通审阅输出每条包含:
标题:
流程类型:
业务编号:
创建/更新时间:
是否超过 3 天:
审批链接:
建议动作:同意 / 拒绝 / 退回补充 / 评论等待 / 评论提问 / 请示当前授权审批人(needs_human)/ 跳过(写明依据)
风险等级:低 / 中 / 高
确信度:高 / 中 / 低
核心理由:
制度依据:
关键风险:
建议附言:
材料缺口:如果是定时 heartbeat,只提醒两类事项:
- 上次检查后新出现的审批。
- 创建时间距当前已超过 3 天且仍在 RUNNING 的审批。
heartbeat 输出要简洁,按风险优先排序。是否执行同意、拒绝、退回或评论,完全由当前定时任务 prompt 提供的授权和完整本公司规则决定;Skill 不因它是 heartbeat 而自行扩大或收缩权限。材料缺口、规则缺口和等待第三方结果必须区分:材料缺口按本公司规则指定动作处理,规则缺口转 needs_human,等待第三方结果按本公司规则决定评论或等待。如果没有新审批也没有超过 3 天审批,明确说明无需处理。
执行动作
同意、拒绝、退回和评论均须由当前任务授权及完整本公司规则决定。审批评论不是同意或拒绝,但也不得在本公司规则指定退回或人工请示时擅自以评论替代。
自动同意只在当前定时任务 prompt 明确授权、information_completeness == 1.0、rule_coverage == 1.0、本公司风险门槛满足且规则明确指定同意动作时执行。自动动作必须写明审批意见,并在执行后回读审批记录或待办列表确认结果。
同意:
dws oa approval approve --instance-id <processInstanceId> --task-id <taskId> --remark "<审批意见,必填,写清依据的条文或事实>" --format json --yes退回(仅当当前授权和完整本公司规则指定退回;缺口和补充要求写进 --remark,不要另发一条评论):
先查可退回节点:
dws oa approval revert-activities --task-id <taskId> --format jsoninstRevertActivities 非空时执行退回;模板支持退发起人时优先 REVERT_FOR_RESUBMIT(target-activity-id 固定 sid-startevent),否则退到负责补充材料的节点 REVERT_FOR_APPROVAL(activityId 取自 instRevertActivities):
dws oa approval revert-task --instance-id <processInstanceId> --task-id <taskId> --target-activity-id <activityId> --action <REVERT_FOR_RESUBMIT|REVERT_FOR_APPROVAL> --remark "<材料缺口和补充要求>" --yes --format json这条命令已于 2026-09-17 实跑验证可用(长沙银行 POC,返回 success: true,钉钉待办随即从 4 条减为 3 条)。它是写操作,必须带 --yes。
选择退回节点时的硬规则:
actualActioners/activityActioners里标注 “(已离职)”的节点不得作为退回目标——退过去没有人处理,审批会彻底卡死。发起人已离职时不要用REVERT_FOR_RESUBMIT,改退到仍在职的负责节点,通常是“提交人部门直接主管审批”,由主管指定新负责人。- 只有
instRevertActivities为空才允许说“无法退回”。dws schema --cli-path "oa approval revert-task"返回unknown runtime schema path是 DWS 漏注册 schema 的已知缺陷(revert-task、revert-activities两条都缺,同族的reject、redirect-task正常),命令功能完好,不是退回不可用的证据。 - 退回在审批流水里记为
REDIRECT_PROCESS,没有独立的 revert 操作类型;核验是否生效看这条记录加待办列表,不要找 “revert” 字样。
只有完整本公司规则允许评论、或 instRevertActivities 确实为空且规则指定该降级动作时,才评论要求补材料并保留待办,并在结论里写明“该模板无可退回节点”:
dws oa approval oa-comments --instance-id <processInstanceId> --text "<审阅意见、材料缺口和补充要求>" --format json等待他人确认或外部结果(不涉及材料缺口)用上面的评论命令说明;需要申请人澄清含义时,也用同一条命令,正文只放一个问题。
拒绝:
dws oa approval reject --instance-id <processInstanceId> --task-id <taskId> --remark "<必填:已查实的事实和不予通过的依据条文;不要写'补齐后再提交',那是退回>" --format json --yes不要用 reject 执行“退回补材料”;按决策表需要退回时,用上面的 revert-activities + revert-task。是否退回由决策表决定,不需要业务 Skill 另写动作映射。
执行同意、拒绝或退回后必须用 list-pending 复查该审批是否离开待办列表(退回后应不再是分配给当前审批执行账号的 RUNNING 任务),并把结果告诉用户。执行评论后必须用 records 或 OpenAPI operation_records 复查评论是否写入成功。
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
No reviews yet
People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.
- It worked
- Partly
- It didn't
Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

