legacy-content-markers.md 6.9 KB

旧协议内容标记存活清单

核对时间:2026-09-28 首查(只读);2026-09-29 完成处置 —— 用户确认 「独立页面、不再嵌入」+「旧对话已清空」后,清单里除"在用"的 5 条之外全部删除。 方法:全仓库 grep <标记,逐个反查三件事: ① stream-xml-filter.ts 里有没有规则 → ② 谁消费(渲染组件 / customProcessor)→ ③ 现在谁产出(新协议适配层?旧会话历史?开发环境 mock 文本?)。复核命令见 §四。

一、结论表(2026-09-29 后:只剩"在用"的 5 条)

标记 过滤器规则 消费端 现在的产出者 结论
<scope> block ScopeContent 适配层(progress / heartbeat → 思考中卡片) ✅ 在用
<!-- POLICY_TABLE … --> 特殊块 PolicyMatch 适配层(item 事件) ✅ 在用
<ref_links> block BusinessRecord 参考资料 适配层(source 事件) ✅ 在用
<question-cards> block QuestionCard 适配层(interrupt 事件) ✅ 在用
<image-scope> block ImageContent 适配层(result.cipa → 企业微信二维码) ✅ 在用
<policy-list-updated> block PolicyListUpdatedMatch 无 🗑 2026-09-28 已删(见 §二)
<form> · <link-url> · <file-docx> block FormContent / LinkURLContent / OfficeURLContent 无(只有旧历史能触发) 🗑 2026-09-29 已删(见 §三)
<ui-form> skip customProcessor → setFormOptions 无(消费端本来就是空函数) 🗑 2026-09-29 已删
<followup> · <silence> skip 无人注册 仅开发环境 mock 文本 🗑 2026-09-29 已删
<qingpu_enterprise_notificaion> skip 无人注册 无 🗑 2026-09-29 已删

删除后 stream-xml-filter.ts 的规则表只剩 4 条(scope / image-scope / ref_links / question-cards) +特殊块 <!-- POLICY_TABLE … -->;枚举 RecordRowTypes 只剩 6 个成员。

⚠️ 遗留:开发环境那两个 mock 文本(test-document-line-stream.ts:20、 useBusinessAssistantChat.ts:1466)里仍写着 <silence><followup …> —— 点"测试流"按钮时 那串标记会以原始文本显示(dev-only,不影响线上)。要清可以把那两处 mock 一并改掉。

🐛 顺带修掉一个更早就存在的解析器 bug(是靠本清单的断言发现的): isPossibleOpenPrefix() 在"标签名比规则名长"那一支里没检查是否真的以规则名开头, 于是任意文本只要在第 open.length 个字符处是空格或 > 就会被误判为"可能的前缀"而 永久挂起(既不产出行也不吐文本)。实测:<form id="a">…(偏移 11 处是 > → 撞上 image-scope)、 </link-url>(偏移 9 处是 > → 撞上 ref_links)。已修 + 在 harness/tools/verify-stream-filter-rules.mjs 加断言钉住。

二、2026-09-28 已删:<policy-list-updated>

二、本次已删:<policy-list-updated>

  • 原用途:旧协议里后端在正文下发 <policy-list-updated>{link, payload}</policy-list-updated>, 给出一个地址,前端(PolicyListUpdatedMatch.vue)照着去取 json 渲染卡片列表, 并把结果写回 globalThis.policiesPublic。这是接口清单 #11(见 current-api-call-sites.md)。
  • 为什么能删:新协议适配层从不产出这个块(它只产 scope / POLICY_TABLE / ref_links / question-cards / image-scope,见 api-chat-coordinator.ts:10-21)。 它唯一的触发源是旧会话的历史内容——用户 2026-09-28 确认「老对话仅测试,后续会全部清空」, 这条保留理由随之消失。
  • 删除范围:src/components/Chat/PolicyListUpdatedMatch.vue 整文件 · BusinessRecord.vue 的挂载点 / import / hasPolicyTableRow 里的分支 · StreamXMLFilter 的枚举成员与标签规则 · PolicyMatch.vue 的说明注释 · 接口清单 #11 与本文档。
  • ⚠️ 已知副作用(用户已确认接受):规则删掉后,清空之前若有人打开旧测试会话, 正文里那串 <policy-list-updated>{"link":…}</policy-list-updated> 会当普通文本显示 (既没有卡片列表,也不再被吞掉)。新会话不受影响。

三、2026-09-29 已删:其余 7 条(用户确认「独立页面 + 旧对话已清空」后一次性清掉)

删了什么:

  • 规则 7 条 + 枚举成员 7 个(Form / LinkURL / OfficeURL / UIForm / Silence / FollowUp / EnterpriseNotification)
  • 三个渲染组件文件:FormContent.vue / LinkURLContent.vue / OfficeURLContent.vue
  • BusinessRecord.vue:三处挂载、三个 import、inject("formOptionsControl") 与 customProcessor(<ui-form> 那项)、因此失去用途的 jsonrepair import
  • 两个壳组件里已无人 inject 的 provide("formOptionsControl", …)(本来就是空函数)
  • stream-xml-filter.ts 里随之失去调用方的两个私有方法 (splitSafeContentBeforeCloseTail / getNestedFilter,为 silence 的"透明容器"服务)

依据:用户 2026-09-29 明确「这个是单独的前端页面,不会嵌入到其他页面」+「旧对话已清空」 ⇒ 那三个"只服务旧历史"的渲染器失去唯一触发源;另外四条本来就是死链。

验证:verify-stream-filter-rules 32/32(新增断言:7 个标记都不再产出行、按普通文本留在正文、 枚举只剩 6 个成员、三个组件文件与其挂载/import/inject 都没了)· verify-question-cards 36/36(真实切行器往返)· verify-policy-card-list 24/24 · npm run build 通过 · vue-tsc 无新增报错 · dev 冒烟页面 200 且 BusinessRecord.vue 编译 200

另有一批与旧协议无关的历史包袱在 current-api-call-sites.md §二/§三(已停用接口、死代码),不在本文范围。

四、复核方法(可重跑)

# ① 规则表只剩 4 条 + 枚举只剩 6 个成员
grep -n "name: RecordRowTypes\." src/utils/stream-xml-filter.ts
grep -c "= \"" src/utils/stream-xml-filter.ts   # 期望 6(枚举成员数)

# ② 被删的 7 个标记在 src 里**只在注释里**出现(`[已删]` 说明)
grep -rn "<followup\|<ui-form\|<link-url\|<file-docx\|<form\|<silence\|qingpu_enterprise" src/ \
  | grep -v "^\S*:\s*[0-9]*:\s*//" 

# ③ 组件与挂载确已消失
ls src/components/Chat/FormContent.vue src/components/Chat/LinkURLContent.vue \
   src/components/Chat/OfficeURLContent.vue 2>&1 | grep -c "No such file"   # 期望 3

# ④ 断言的权威版本(推荐直接跑这个)
node harness/tools/verify-stream-filter-rules.mjs