方法论与洞察

dws 块级插入:—index 语义陷阱与倒序插入法

入档:2026-08-17 来源:DeepSeek Harness 教程钉钉文档口播脚本补写(alidocs adoc,dws doc block 链路) 验证状态:✅ 当场验证(顺序搞反 → 对调修复 → 倒序插入 5 段 → list 校验顺序正确)


事实记录(不可修改区)

一、方法论沉淀

[—index 是”插入位置”,不是”参照位置”]

核心dws doc block insert--index N 语义是**“插入到索引 N 处”**(原 N 及之后整体后移),不是直觉上的”插到 N 之后”。--where before/after 只修饰 --ref-block,不修饰 --index。把两者混用(--index 22 --where after)不会报错,会静默插错位置——和 UI自动化的固定坐标必须绑前提断言_v1 同构:参数前提不成立时不报错,照常执行出错误结果

操作规则

  1. 多段连续插入,锚定块 ID--ref-block),不要锚索引——索引每次插入都会漂移,块 ID 是稳定引用;
  2. 同一锚点连续插入多段时倒序插入(最后一段先插),每段都紧贴锚点,顺序自然正确;
  3. 或者每插一段重新 block list 拿新块 ID 再插下一段(更慢但更直白);
  4. 插完必须 block list 校验最终顺序,返回的 success 只证明”插进去了”,不证明”插对了位置”(同 自动化产出双重验收_机器验参数人眼验内容_v1 的机器关/人眼关分层)。

[顺序错了先想对调,delete 是最后手段]

核心:两段顺序颠倒时,用 block update 互换两段文本即可修复,比”delete + 重插”少一步危险操作(doc block delete 不可恢复、且在 dws 危险操作清单里)。文本对调是幂等的、可预览的,适合一切”内容对、位置错”的修复。

[口播脚本协作:AI 只写文字层,标注层归作者]

核心:给视频口播脚本补写内容时,AI 的交付物是可直接念的正文。花字、录屏占位、aroll/broll 提示、放大/变暗等剪辑标注是作者的私有工作流语言,由作者在录制/剪辑阶段自己加。AI 代加标注的三个问题:① 格式和作者的标注习惯不一致(作者用红色 span 标注,格式各异);② 标注依赖素材实际情况,AI 不知道录了什么;③ 作者要全文删一遍标注才能用。

操作规则

  1. 补写口播脚本默认纯文字输出,结构对齐已有章节的口播语气(口语化、短句、有收口句);
  2. 事实性内容(命令、版本号、价格)先 WebSearch 核实再写,口播稿错了是播出事故;
  3. 写钉钉文档前先用 dws doc info 探节点类型(adoc/axls/able 路由不同产品),写的过程中每步用 block list 校验。

二、一句话结论

dws 块级插入锚块 ID 不锚索引、多段倒序插、插完 list 校验;顺序错了对调文本不重插;口播脚本只写纯文字,剪辑标注是作者的图层。

如何使用

事实追加(2026-08-17 下午 · callout 批注框与配图上传)

["container",{"subType":"colorBlocks","metadata":{"padding":{"top":11,"right":11,"bottom":11,"left":11},"borderRadius":8,"sticker":"气泡","bgcolor":"#E8F2FE","showstk":true}},["p",{},["span",{"data-type":"text"},["span",{"data-type":"leaf"},"标题"]]],["p",{},["span",{"data-type":"text"},["span",{"data-type":"leaf"},"正文"]]]]

事实追加(2026-09-04 · block update 通道选择、fetch-uuid 直改与 uuid 易变陷阱)

场景:WorkBuddy 教程钉钉文档(1300+ 块)按回执决策修订 5 个正文块 + 全文残留校验。

事实追加(2026-09-04 · 大板块改写:先出待审稿,再一次性入库)

场景:WorkBuddy 教程《能力7-Skill》板块(22 块 / 2061 字)从「概念讲解」改为「手把手实操演示」。

关联文档

事实追加(2026-09-04 · 同事并行编辑下的改稿:先拉快照、倒序插入、格式去留、全文审阅导出)

场景:WorkBuddy 教程《能力6-Skill》板块按 v2.1 稿写入 9 块;期间同事同步把「仓库推荐区」从散装链接重做成三张表格,并把整篇能力编号前移一位(删了原能力5-AI助理,导致 6→5、7→6、8→7、9→8、10→9)。

同事并行编辑 → 动笔必须重新拉快照

倒序插入仍然成立(同锚点插多块)

同锚点 X--where after 插多块时,按「最终顺序的倒序」依次插入:想得 X → A → B,就先插 B(after X),再插 A(after X)——后插的会顶到最前面。本次「第六步」+「心法」两块即如此,结果 684 选择路径收尾 → 685 第六步 → 686 心法,顺序正确。

--content 会清掉 inline 格式——这既是坑也是工具

全文内容层审阅:导出带 uuid 的行索引

审长文档(本例 4.5 万字 / 2484 块)不要靠 block list(只有前 50 块)或肉眼翻页面。可用流程:

  1. dws doc +fetch --node <id> --scope full --detail full > doc.json
  2. Python json.loads(data['content']['jsonml'])注意是字符串,要二次解析
  3. 递归遍历,只收直属 leaf 文本(子块的文本不计入父块,否则父块文本会含全部子孙,重复且无法定位)
  4. 输出 doc_index.tsv:每行 行号 \t uuid \t 类型 \t 文本
  5. 正则扫疑似问题(的的了了存储中,,、术语不一致、数字前后矛盾),命中后从 tsv 直接取 uuid

好处:审核报告里每条问题都能附块 ID,作者点头后可以直接批量执行,不用二次定位。 本次用这套流程扫出 A 类明确错误 27 处、B 类内容缺失 7 处(都是正文留了位置没填的网址)。

其他

六、+media-insert 批量插图:verify 假失败与重复插入(2026-09-04 补)

插图的完整命令

cd <图片所在目录>   # 必须!用 ./相对路径
dws doc +media-insert --node <DOC> --file ./xxx.png --ref-block <ID> --where after -y

陷阱 1:verify 失败 = exit 1 = 批量脚本中断

四步流程 resolve_upload -> upload_oss -> insert_block -> verifyverify 这一步经常失败媒体资源在有界回读窗口内仍无法读取: list_document_blocks 声明仍有下一页但当前页为空, 返回 partial_successverified: falseretryable: false,进程退出码 1。

但实际已经插入成功(前三步 success)。 后果:bash 批量脚本里如果直接串行调用,第一张就把脚本”跑死”了(我第一次就只插成 2 张)。

对策:批量脚本每张命令后加 || true,或把退出码吞掉(子 shell 里跑完再 echo 退出码)。 不要用 && 串联,不要 set -e

+media-list 不能作为校验依据(count 恒等于附件数,不含图片)。 唯一可信的校验是 +fetch 全量拉下来数 img 块。

陷阱 2:脚本被中断的那一批,“以为没插”的其实插了

本次:批 A 脚本执行到第 3 张时进程被 SIGTERM,日志显示”插入 07-13”后无结果。 我判断没成功,又单独重插了一次 —— 结果那一组变成 4 张(应 3 张)。 根因:SIGTERM 发生在 verify 阶段或之后,前三步早已写库。

对策:批量插入中途被打断后,必须先拉快照数一遍实际张数,再决定补哪张, 绝不能凭”日志没有成功输出”就重跑。

陷阱 3:如何判定哪张是重复项

钉钉块 uuid 形如 mt + base36 时间戳 + 随机串(如 mtmujds9w807gsgt0a)。 中间两个字符是时间戳,越大 = 创建越晚:jd(697) > ha(622) > en(527) > cz(467)。 配合倒序插入法可以还原真实插入顺序,再拿 src 尾 40 字符和执行日志里的 resourceUrl 比对, 就能精确定位”哪一张是重跑的那张”,删掉即可,不用猜。

陷阱 4:图片不是独立块,是嵌在空段落里

+media-insert 生成的结构是 p 段落内嵌 img 节点:

["p", {"uuid": "..."},
  ["span", {"data-type":"text"}, ["span", {"data-type":"leaf"}, ""]],
  ["img", {"uuid":"...", "src":"..."}, [...]],
  ["span", {"data-type":"text"}, ["span", {"data-type":"leaf"}, ""]]]

删图 = 删整个 p 段落(不是删 img 子节点),block delete --block-id <p 的 uuid>。 校验时也不能只统计”顶层块里的 img”,要递归找。

陷阱 5:JSONML 的 leaf 不是 leaf 标签

文本节点是 ["span", {"data-type":"leaf"}, "文字"] —— 标签是 span,靠属性区分。 按 x[0] == "leaf" 判断会全部落空(我第一次 dump 出来所有块文本都是空字符串, 一度以为同事把正文搬走了)。正确写法:

if x[0] == "span" and isinstance(x[1], dict) and x[1].get("data-type") == "leaf":
    text += x[2]

校验脚本套路

统计”锚点块之后紧跟的连续新图段落数”,与预期张数逐锚点比对:

EXPECT = {anchor_uuid: [图1说明, 图2说明], ...}
# 新插入的 img:uuid 以 mt 开头且长度 > 12(文档原有的图多是 6 位短 uuid)
# 每个锚点往下扫,遇到非新图段落就停

26 张一次性校验完成,当场抓出 1 处重复。

七、窗口截图边缘光晕(壁纸透色)的自动修复(2026-09-04 补)

症状

实机截图(非全屏,窗口贴不满桌面)四周有一圈橙红色杂边。 本次 26 张图里 13 张 1920×1080 实机截图全部中招; 3200×1800 的示意图和 1600×900 的图完全干净 —— 凡是自己画的图就不会有

根因(三层,逐层量化)

特征数据
窗口阴影顶/右边缘柔和渐变,R-G 从 +36 衰减到 +16,跨 25-30px无清晰边界
窗口边框左边缘 x=6 处 R-G 从 +36 跳到 +19 后完全稳定清晰边界
圆角外的壁纸四角 12×12 均值 R-G 48-67,比边中部(+36)更深矩形裁剪治不了

界面本体本身就是暖白设计(R-G ≈ 15-19),所以”把橙色都改掉”会误伤界面, 只能把”超出本体水平的色相偏移”压回去。

解法:亮度-色相基线自适应校正

  1. 自动检测四边光带宽度:从边缘往内扫,找第一个”连续 8 像素 R-G ≤ 22”的位置,+3px 余量后裁剪
  2. 建基线:用图像内部区域(距边 > 100px)按亮度桶(r//16)统计 R-G / R-B 的中位数
  3. 边缘带 64px 内校正:超出 基线 + 4 的部分压回;excess < 50 才动(保护 UI 高饱和橙色按钮)

效果:残留 4981 → 157 像素(散布在 12px 环带,肉眼不可见), 顶部橙色”安装”按钮、彩色卡片图标零误伤。

为什么中间踩了两个坑

现象修正
阈值写死g < r*0.62 判定橙边 → 26 张报 0 张(边缘像素 R-G 只有 36)改用相对值
用绝对亮度保护g > 150 才校正 → 深色遮罩弹窗图(g ≈ 104)全部漏掉,07-13 校正像素为 0改用”每亮度档的基线”,深浅界面通吃

结论:界面颜色是设计出来的,不能靠绝对阈值判断”正不正常”,只能跟图像自己的统计比。

修复成果

13 张修复图输出到 截图_clean/,原图未动。


八、长文档内容层审核:数字与专名核对的三条铁律

场景:3 万字钉钉教程《WorkBuddy全案实战汇总》,先产出一份 A/B/C 分类审核报告(A 类明确错误 27 处),再分批执行修改。执行到「事实数字类」时踩出的坑。

铁律一:一致性 ≠ 正确性——「与全文统一」类建议必须先查外部信源

审核报告 #12 建议:某处写「混元 Hy3」,全文其余 12 处写「混元 3」,故「Hy3 → 混元 3」。

这个建议是反的。 查证后:

教训:审核报告里凡出现「改成与 XX 统一」这种理由,它证明的只是「多数派」,不是「正确」。多数派可能集体过期。这类条目必须先查权威信源再定方向,否则会把对的内容改错——改错比不改的代价大得多

判断顺序应为:① 外部信源查证 → ② 再看全文是否需同步 → ③ 改不动的标为待确认(例如模型名这类”要看客户端实际显示什么”的事项,AI 判不了,交给人)。

铁律二:数字类错误必须对齐”计数源”,不能只看句子本身

报告的说法实际要怎么做
#7 资料库形态数「五种形态」应改「六种」光看这句判断不了。要拉出上方表格的实际行数——表格 6 行(在线文档/网页剪藏/数据表/汇报页/网盘文件/目录·空间),且原句只列了 5 个名词。所以不只是改数字,还要补漏掉的那个名词(汇报页)
#25「怎么用(2步)」改「4 步」往下数实际「步骤一/二/三/四」标题,确认是 4 个再改;顺带发现步骤一与步骤二内容重叠(属另一类问题,记入报告但不擅自动)
#24 笔记篇数 6 vs 5两处矛盾,需统一同块内数字出现次数是判决依据mtmuayu65awu79tuhx8 一块内「6」出现 3 次(6 个 md / 六篇笔记连通子图 / 6 个原始文件),而另一块的「五」只出现 1 次 → 以 6 为准,只改那 1 处

要点:数字错往往伴随「列举项漏项」或「别处另有说法」,只替换数字会留下新的不一致。改前先把整节上下文(前后 8 块)dump 出来看。

铁律三:审核报告的行号与块 ID 会过期,执行前必须重新定位

文档在上一步被改动过(插章节、删块、插图),报告的坐标就失效了:

做法:写脚本按 uuid 在最新快照里反查,命中不到就按关键词全文重找,不要直接拿报告的 ID 去调 update。

副产物:提示词原文块要不要改

教程里的 prompt 是”录制时念的原文”,改了会与录像不一致。判据:

执行通道(复用)

改文字一律走 --element '<jsonml>' --content-format jsonml不要用 --content "文本"(后者会清掉 highlight/color/bold 等 inline 格式)。同块多处替换必须合成一次更新——分两次会因 uuid 在首次更新后变更而失效。


九、事实追加(2026-09-15 · 本档续篇已独立成篇)

同一篇《WorkBuddy全案实战汇总》的逐字稿补写(案例 7 / 案例 12 引言 + 两处过渡话术),本轮沉淀两条超出本篇标题范围的新律,已独立成篇,见 2026-09-15_钉钉逐字稿引言与过渡话术补写_占位符原地改写与mention保留_v1

  1. 正文里写着「过渡话术」的段落 = 作者预留的槽位,接到「补一段过渡话术」要先读区间——槽位往往已存在,原地改写而非新增;且槽位块带 @某人 mention,改写必须原样拼回(--content 会把 mention 一起清掉,只能走 JSONML 通道)。
  2. 逐字稿案例引言有固定骨架(承上 → 传统做法对比 → 本节定位 + 步骤数预告 → 成品展示句 → 制作步骤),其中「一共 N 步」必须往下数正文实际步骤标题——与本篇「铁律二:数字对齐计数源」同失效模式,本次为跨场景二次验证。

本篇的倒序插入法在本轮第三次验证成立;JSONML 通道留格式 / --content 清格式的判据本轮再次适用(mention 属于要留的那一类)。

类型/协作工具链主题/钉钉文档