Files
story/docs/device-physical-transfer-20260922.md
T
Codex Local bf1233d5df
ci / verify (push) Canceled after 0s
feat: expand companion platform, device controls, and memoir workflows
Add customer and operator login, BLE provisioning, device fleet controls, call memory, memoir generation, and refreshed family and maintenance portals. Include API contracts, migrations, firmware sources, tests, assets, and deployment documentation.
2026-10-08 10:06:44 +08:00

27 lines
3.3 KiB
Markdown

# COM6 更换使用老人
两端原“更换使用老人”调用旧版直接转移接口;COM6 为 physical_confirm,旧接口应继续拒绝绕过设备确认。新增蓝牙转移流程保留该约束。
API 与网页已发布 `0.99.10-rc.device-transfer1`;小程序代码已完成,正式发布和 COM6 实物转移待验收。
## 实现
- 家属端先选择目标老人并检查绑定影响。`requires_physical_confirmation` 指示进入附近蓝牙流程;旧设备继续原直接转移方式。
- `ble-bind-tokens` 新增可选 `expected_binding_id`,与 `elder_id` 一起明确表示转移。缺少原绑定版本不能把普通添加误当转移。账号必须同时有原家庭及目标家庭管理权限。
- 申请期间原绑定、旧聊天归属和设备设置保持原值。现有 BLE `configure` 携带一次性令牌,仍需设备轻触确认和 DEVREQ1 设备签名。
- `device_ble_binding.binding_id` 在 PENDING 转移时固定原绑定,COMMITTED 时记录新绑定;普通添加仍从 NULL 开始。无需数据库迁移。
- 设备确认事务重新核对当前绑定及代次、两边权限、通话、有效命令、两类 OTA 和待确认 claim,关闭旧绑定后通过已有数据库 claim guard 建立新绑定。任一步失败全部回滚,不留下中间解绑状态。
- 与 callmemory 使用相同的设备事务锁,先取得通话锁,再按 twin/device 顺序锁定控制状态,防止检查空闲后并发开始通话。
- 旧绑定关闭和新绑定插入分别推进代次;持久化转移令牌的预期代次随之更新,使丢失响应和并发重试只返回同一结果。旧绑定回执不能恢复旧归属。
- 原语音服务身份复用,不重复注册。历史聊天仍属于原老人,后续聊天使用新老人。
- 两端都必须查询云端令牌最终状态,不能将蓝牙配置成功当作转移成功。选择了其他设备、绑定过期、权限变化和连接中断都有独立处理。
## 验证与边界
- onboarding 隔离数据库全包通过,包括同源网页登录令牌、缺少设备签名拒绝、原绑定保留、重复确认、过期、跨账号/设备/目标、源权限单独撤销、真实语音注册身份复用、四种活动通话状态、OTA pending/accepted、写入故障回滚及正在启动通话的并发锁检查。
- saas 和 callmemory 集成测试通过。
- 小程序 59 项相关测试通过,9 页 WXML、10 个 WXSS 原生编译通过。确认导航携带指定设备、原绑定和目标老人,不调用旧直接转移接口;重复点击、隐藏页面、冲突及蓝牙假成功均不误报完成。
- 网页候选 TypeScript/Vite 及 Linux API 构建通过。使用真实组件和模拟接口验证等待实体确认、云端完成和归属冲突提示;模拟页不进入生产构建。
- COM6 尚未实际更换老人;没有创建测试家庭或修改真实归属。需要用户登录家属账号选择目标老人并进行设备现场确认。小程序尚未确认正式发布。
- 发布清单:线上 release 的 `device-transfer-release.json`;9 个源码/契约文件增量覆盖,未做数据库迁移。候选 API/Web 构建、线上版本及资产哈希、匿名请求拒绝、其他服务容器不变检查通过。发布后 COM6 仍在线、绑定 1、音量 60、配置版本 12。