feat: expand companion platform, device controls, and memoir workflows
ci / verify (push) Canceled after 0s

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.
This commit is contained in:
Codex Local
2026-10-08 10:06:44 +08:00
parent 98fb2965d0
commit bf1233d5df
861 changed files with 94614 additions and 3209 deletions
@@ -0,0 +1,33 @@
# 小禾动态开场试用(无天气,2026-10-01)
2026-10-03 已发布 API `0.99.26-rc.natural-chat1`,并将同一试用长者的基础人设保存为 `companion-xiaozhi-v2`。普通开场改为简短日常寒暄,移除主动谜语、猜物件、词语标题与编故事活动;中性话题允许重复,只轮换近期句子,不再为轮换主题而安排活动。短答不视为请求游戏,问候不扩展成知识讲解;兴趣识别、避谈、同通冻结和记忆授权保留。新角色与欢迎语已实际保存并回读,非角色供应商配置保持不变,下一次新通话由现有 Prepare 同步。开场单测和 10 项隔离通话集成通过,真实语音自然度尚待实听;没有为验收主动发起通话。证据位于 `.local-evidence/companion-natural-chat-20261003`,以下为旧版历史记录。
已发布 API `0.99.22-rc.opening1`,基线为 `0.99.21-rc.companion1`。在设备 `KP01-020026091601` 当前绑定的长者上开启 `conversation_preferences.dynamic_opening=true`;其它长者默认关闭。下一次新会话生成新的开场,同一会话的续约和重试仍使用原冻结参数。
## 行为
- 按长者已设置的时区问候,空值、无效值或 `Local` 回退上海时区;时区数据随二进制内置。
- 有个性化记忆授权时,从档案兴趣和优先话题识别固定类别标签,不把任意原文写进开场。十二类轻话题轮换,近期五通避开相同模板和主话题;普通轻话题多数直接提供内容,正文最多 45 字,带问候与首次介绍最多约 60 字。
- 没有近期通话记录时介绍一次“小禾”;之后不反复自我介绍。上一通在十分钟内结束且存在双方真实字幕,并仍有个性化记忆和字幕授权时,使用六种简短招呼轮换。不声称已记得某段对话,也不据此认定某话题未完成。
- 遵守明确的避谈类别和模板跨题材依赖;无法识别的避谈内容使用中性开场。极端限制下允许安全的中性类别复用,优先保持句子变化。
- 不使用天气、定位、外部资讯查询或额外的模型生成请求。现有火山 Viking 抽取、`curated_memory` 注入和原生记忆开关沿用原实现。
## 会话一致性与记录
在现有长者锁和无活动通话检查内选择一条开场;`PrepareWithWelcome` 将同一句写入提交火山的配置,成功后再签发设备运行参数。它从保存的基础配置重建本通角色,补充“简短同意时沿开场继续”的引导,不把动态开场或本通背景写回基础 Bot 配置。关闭试用的长者继续使用旧 `Prepare`。
`call_session.budget_snapshot.opening` 仅保存有界的模板 ID、主话题、类别及版本,不保存档案原文或记忆正文。它表示选中了哪种开场,不代表设备已经播放或老人已聊过该话题。历史按同一长者及当前 `privacy_epoch` 筛选,个人兴趣与字幕证据分别经过授权检查;撤回后停止相应用途。
## 验证与部署
- `companionopening`、`elderagent`、`callmemory` 包测试及 Go vet 通过,Linux API 和测试程序构建通过。
- 独立 PostgreSQL、Redis 与内部测试网络中应用 74 个迁移并使用本地测试种子,10 项会话测试全部通过、0 跳过;覆盖连续开场轮换、两端同句、成功会话重试冻结、长者隔离、真实字幕重开、授权撤回和配置失败不提交。火山调用使用模拟回调,没有读写生产通话数据。测试容器、网络及临时目录已清理。
- 候选从已发布基线构建,仅包含九个本次源码/测试文件,其中 `app.go` 只移植一行接线。其它 696 个基线文件及 `go.mod`、`go.sum` 保持一致,没有夹带共享工作区的其它修改。
- 发布前确认无活动通话;只重建 API。readiness 与公网版本核对通过;schema 仍为 74 且 clean。其它容器 ID、网页内容、API 环境/挂载/端口及许可证保持一致。
- 在同一长者锁内核对设备绑定、Bot 和基础角色摘要后,只开启一个偏好字段;基础人设和欢迎语未改写。尚未实听设备首句、后续内容吸引力或首音延迟;自动测试与发布成功不能替代实际通话验收。
## 回滚与证据
动态开关的旧值保存于服务器私有备份 `/opt/data-terminal-cloud/backups/companion-opening-20261001.json`,权限 `0600`。本地 `apply-pilot.py --execute --rollback` 会在同一长者锁内核对绑定、确认无通话,只恢复该字段。下一次新通话重新走原静态开场;不得改写正在通话的 Bot。API 原镜像与上一发布目录保留,可以独立回退 API。
操作与证据在 [本次证据目录](E:/Codex/story/.local-evidence/companion-opening-20261001),包括 [发布回执](E:/Codex/story/.local-evidence/companion-opening-20261001/production-receipt.json)、[开关保存回执](E:/Codex/story/.local-evidence/companion-opening-20261001/pilot-apply-receipt.json)、[隔离测试](E:/Codex/story/.local-evidence/companion-opening-20261001/result.json) 和 [仅本次改动](E:/Codex/story/.local-evidence/companion-opening-20261001/task-only.patch)。