Files

5.4 KiB
Raw Blame History

OneTalk 结构化消息信息采集分类:实施计划

Scope and coordination

Scope ID Execution workspace Workspace role Owns Excludes
STRUCTURED-MESSAGE /Users/ybf/work/trade-message-center task-branch shared content contract、历史 SDK decoder/adapter、bridge guard compatibility、server JSONB migration/read projection、Mind test harness consumer 和对应回归测试 raw WebSocket decoder/new-message collection、contact profile ledger 的写入/owner 改动(读取时按账号+会话组合除外)、发送/授权/路由语义、任何 SDK raw payload 透传

用户在 2026-09-11 的“开始!”确认在已审阅的 PRD/设计范围内实施本 scope。所有实施/检查代理使用同一个已声明的 primary checkout;不得把范围外文件或用户既有改动重置、纳入或覆盖。

实施顺序

  1. 共享 content 合同

    • apps/onetalk-contract/src/content.ts 增加名片、询盘、订单 kind、类型、exact-shape guard 和导出。
    • 保持 OneTalkMessage 通用身份/时间字段及 wire creator 不变;更新 contract.test.ts 的有效、无效与 frame decode 矩阵。
    • 先运行 contract package 的 typecheck/test,保证任何跨层代码只消费共享合同。
  2. MAIN 历史消息归一化

    • message-observer/content-decoder.ts 增加历史业务卡 tuple matcher、名片 marker 投影和受限订单摘要解码;扩展内部 source metadata,但不让 raw SDK 字段或客户资料进入输出。
    • history.ts 只提取 decoder 所需的 messageTypetypeviewType;不提取名片 contact 候选,继续丢弃业务卡 content 与完整原始对象。__conversationListData__ / profile observer 的异步结果不得拼入消息观察。
    • 不修改 decodeOneTalkRawContentnew.ts 的 raw 入口或 WebSocket tap;为完整匹配、相邻卡、未知卡、每种订单失败和 raw 不回归补充 extension focused tests。
  3. 传递、耐久与服务端接纳

    • 以 shared guard 驱动既有 page bridge、IndexedDB、frame writer、server ingest、repository 和读投影;仅修正因封闭 union 扩展造成的 exhaustive type/test 缺口,禁止增加第二个卡片 parser。
    • 更新 apps/server/src/database/schema/onetalk.ts 中 JSONB kind check,并用 pnpm --filter @trade-message-center/server db:generate 生成 apps/server/drizzle/ 迁移及 meta 快照;0011 先把旧名片 content 归一化为 marker,再建立 exact check。
    • 补 server wire/领域/repository/reading 回归测试,断言名片 marker round-trip、按同账号同会话 profile 读取时组合 view、无 profile 返回 marker、部分字段为 null,且 sign、原始 content、完整 contact/params 不存在。
  4. 全链路审查与质量门禁

    • 执行定向 contract、extension 和 server 测试;检查 contract ↔ page ↔ frame ↔ IndexedDB ↔ server JSONB ↔ Mind projection 的 kind 一致性。
    • 执行 pnpm format:checkpnpm typecheckpnpm buildpnpm test;对 server DB 迁移执行 pnpm --filter @trade-message-center/server db:check
    • 用 GitNexus detect_changes 核对受影响 symbols/flows;检查 diff 没有 raw WebSocket 或 contact-profile owner 的意外改动。

高风险点与检查点

检查点 风险 必须保持的结果
content union exact-shape guard 漏分支,导致桥或 server 拒绝合法卡 contract 是唯一类型/validator owner;所有消费者复用它
历史 tuple msgType=10010 误分类附件或未知卡 六元联合条件完整,附件仍是 file,未知卡仍 unsupported
order Base64 空值或解码失败变成空订单 每种失败进入可观测 card anomalyraw 不越界
名片资料来源 在观察时读取 item.contact 或等待异步页面 map message content 仅为 marker;读取时才按账号+会话 profile 组合四字段 viewprofile ledger 无修改
server migration 新 kind 被 JSONB check 拒绝或旧行受影响 先扩 contract,再迁移 check;只扩大允许集合
运行态来源 顺手修改 raw WebSocket 形成未验证采集 raw decoder/new message 行为和测试均不变

回滚点

  • 合同或 MAIN decoder 不通过 focused test:停止在实施步骤 1/2,不触及持久化 schema。
  • server migration 生成或 db:check 失败:停止在步骤 3,修复 schema/migration 一致性后再继续;不手工编辑 snapshot。
  • end-to-end guard/round-trip 失败:回到产生 normalized content 的唯一 MAIN decoder,禁止在 bridge、Service Worker 或 server 添加补偿 parser。
  • 发布后如需回滚:先阻止 extension 产生新 kind;在存在新 JSONB kind 时不得直接部署只认识旧三种 kind 的 server。

验证命令

pnpm --filter @trade-message-center/onetalk-contract test
pnpm --filter @trade-message-center/chrome-extension test -- onetalk-media-content-decoder.test.js
pnpm --filter @trade-message-center/server test -- onetalk-domain.test.ts onetalk-read-domain.test.ts onetalk-websocket.test.ts
pnpm --filter @trade-message-center/server db:check
pnpm format:check
pnpm typecheck
pnpm build
pnpm test

真实 Chromium 验收仅在用户提供已登录 OneTalk 页面后,针对历史 SDK 扁平消息做只读 smoke;不发送消息、不切换会话、不记录原始数据。本期不进行 WebSocket raw 卡片 smoke。