# 旧协议内容标记存活清单 > **核对时间**:2026-09-28 首查(只读);**2026-09-29 完成处置** —— 用户确认 > 「独立页面、不再嵌入」+「旧对话已清空」后,清单里除"在用"的 5 条之外**全部删除**。 > **方法**:全仓库 grep `<标记`,逐个反查三件事: > ① `stream-xml-filter.ts` 里有没有规则 → ② 谁消费(渲染组件 / `customProcessor`)→ > ③ **现在谁产出**(新协议适配层?旧会话历史?开发环境 mock 文本?)。复核命令见 §四。 ## 一、结论表(2026-09-29 后:只剩"在用"的 5 条) | 标记 | 过滤器规则 | 消费端 | 现在的产出者 | 结论 | |---|---|---|---|---| | `` | block | `ScopeContent` | **适配层**(progress / heartbeat → 思考中卡片) | ✅ 在用 | | `` | 特殊块 | `PolicyMatch` | **适配层**(item 事件) | ✅ 在用 | | `` | block | `BusinessRecord` 参考资料 | **适配层**(source 事件) | ✅ 在用 | | `` | block | `QuestionCard` | **适配层**(interrupt 事件) | ✅ 在用 | | `` | block | `ImageContent` | **适配层**(result.cipa → 企业微信二维码) | ✅ 在用 | | ~~``~~ | ~~block~~ | ~~`PolicyListUpdatedMatch`~~ | 无 | 🗑 **2026-09-28 已删**(见 §二) | | ~~`
`~~ · ~~``~~ · ~~``~~ | ~~block~~ | ~~`FormContent` / `LinkURLContent` / `OfficeURLContent`~~ | 无(只有旧历史能触发) | 🗑 **2026-09-29 已删**(见 §三) | | ~~``~~ | ~~skip~~ | ~~`customProcessor` → `setFormOptions`~~ | 无(消费端本来就是空函数) | 🗑 **2026-09-29 已删** | | ~~``~~ · ~~``~~ | ~~skip~~ | 无人注册 | 仅开发环境 mock 文本 | 🗑 **2026-09-29 已删** | | ~~``~~ | ~~skip~~ | 无人注册 | 无 | 🗑 **2026-09-29 已删** | **删除后 `stream-xml-filter.ts` 的规则表只剩 4 条**(scope / image-scope / ref_links / question-cards) +特殊块 ``;枚举 `RecordRowTypes` 只剩 6 个成员。 > ⚠️ **遗留**:开发环境那两个 mock 文本(`test-document-line-stream.ts:20`、 > `useBusinessAssistantChat.ts:1466`)里仍写着 `` —— 点"测试流"按钮时 > 那串标记会以**原始文本**显示(dev-only,不影响线上)。要清可以把那两处 mock 一并改掉。 > 🐛 **顺带修掉一个更早就存在的解析器 bug**(是靠本清单的断言发现的): > `isPossibleOpenPrefix()` 在"标签名比规则名长"那一支里**没检查是否真的以规则名开头**, > 于是任意文本只要在第 `open.length` 个字符处是空格或 `>` 就会被误判为"可能的前缀"而 > **永久挂起**(既不产出行也不吐文本)。实测:`…`(偏移 11 处是 `>` → 撞上 `image-scope`)、 > ``(偏移 9 处是 `>` → 撞上 `ref_links`)。已修 + 在 > `harness/tools/verify-stream-filter-rules.mjs` 加断言钉住。 ## 二、2026-09-28 已删:`` ## 二、本次已删:`` - **原用途**:旧协议里后端在正文下发 `{link, payload}`, 给出一个**地址**,前端(`PolicyListUpdatedMatch.vue`)照着去取 json 渲染卡片列表, 并把结果写回 `globalThis.policiesPublic`。这是接口清单 #11(见 [`current-api-call-sites.md`](current-api-call-sites.md))。 - **为什么能删**:新协议适配层**从不产出**这个块(它只产 `scope` / `POLICY_TABLE` / `ref_links` / `question-cards` / `image-scope`,见 [`api-chat-coordinator.ts:10-21`](../../../src/components/api-chat-coordinator.ts))。 它唯一的触发源是**旧会话的历史内容**——用户 2026-09-28 确认「老对话仅测试,后续会全部清空」, 这条保留理由随之消失。 - **删除范围**:`src/components/Chat/PolicyListUpdatedMatch.vue` 整文件 · `BusinessRecord.vue` 的挂载点 / import / `hasPolicyTableRow` 里的分支 · `StreamXMLFilter` 的枚举成员与标签规则 · `PolicyMatch.vue` 的说明注释 · 接口清单 #11 与本文档。 - **⚠️ 已知副作用(用户已确认接受)**:规则删掉后,**清空之前**若有人打开旧测试会话, 正文里那串 `{"link":…}` 会**当普通文本显示** (既没有卡片列表,也不再被吞掉)。新会话不受影响。 ## 三、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`(`` 那项)、因此失去用途的 `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`](current-api-call-sites.md) > §二/§三(已停用接口、死代码),不在本文范围。 ## 四、复核方法(可重跑) ```bash # ① 规则表只剩 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 "&1 | grep -c "No such file" # 期望 3 # ④ 断言的权威版本(推荐直接跑这个) node harness/tools/verify-stream-filter-rules.mjs ```