mirror of
https://github.com/sinanyuntu/trade-message-center.git
synced 2026-09-17 13:22:11 +08:00
5.4 KiB
5.4 KiB
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;不得把范围外文件或用户既有改动重置、纳入或覆盖。
实施顺序
-
共享 content 合同
- 在
apps/onetalk-contract/src/content.ts增加名片、询盘、订单 kind、类型、exact-shape guard 和导出。 - 保持
OneTalkMessage通用身份/时间字段及 wire creator 不变;更新contract.test.ts的有效、无效与 frame decode 矩阵。 - 先运行 contract package 的 typecheck/test,保证任何跨层代码只消费共享合同。
- 在
-
MAIN 历史消息归一化
- 在
message-observer/content-decoder.ts增加历史业务卡 tuple matcher、名片 marker 投影和受限订单摘要解码;扩展内部 source metadata,但不让 raw SDK 字段或客户资料进入输出。 - 在
history.ts只提取 decoder 所需的messageType、type、viewType;不提取名片contact候选,继续丢弃业务卡content与完整原始对象。__conversationListData__/ profile observer 的异步结果不得拼入消息观察。 - 不修改
decodeOneTalkRawContent、new.ts的 raw 入口或 WebSocket tap;为完整匹配、相邻卡、未知卡、每种订单失败和 raw 不回归补充 extension focused tests。
- 在
-
传递、耐久与服务端接纳
- 以 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不存在。
-
全链路审查与质量门禁
- 执行定向 contract、extension 和 server 测试;检查 contract ↔ page ↔ frame ↔ IndexedDB ↔ server JSONB ↔ Mind projection 的 kind 一致性。
- 执行
pnpm format:check、pnpm typecheck、pnpm build、pnpm 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 anomaly,raw 不越界 |
| 名片资料来源 | 在观察时读取 item.contact 或等待异步页面 map |
message content 仅为 marker;读取时才按账号+会话 profile 组合四字段 view;profile 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。