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.
99 lines
9.1 KiB
Markdown
99 lines
9.1 KiB
Markdown
# CALL-MEMORY-1.1 验收清单
|
||
|
||
验收对象:当前本地工作区的改动。**服务端和管理页面可先验收;完整 RTC 固件、断网补传和真实服务商闭环尚未完成,不能据此验收整份设计文档。** 详细范围见 [实施记录](CALL-MEMORY-1.1实施记录.md)。
|
||
|
||
## 1. 一条命令复跑本地检查
|
||
|
||
在 PowerShell 中执行:
|
||
|
||
```powershell
|
||
Set-Location E:\Codex\story\platform
|
||
powershell.exe -NoProfile -ExecutionPolicy Bypass -File .\scripts\verify-call-memory.ps1
|
||
```
|
||
|
||
前提是本机 Docker Desktop 已启动,Go、Node/npm 可用,已安装 `web/node_modules`,并具备 Playwright 和 Chrome。本机现有 Codex Playwright 会自动识别;换电脑可通过 `PLAYWRIGHT_REQUIRE_FROM` 指向 Playwright 的 package.json、通过 `CHROME_PATH` 指向 Chrome。缺少前端依赖时先执行 `npm ci --prefix web`。
|
||
|
||
脚本会启动本地 PostgreSQL/Redis,创建独立的临时数据库,执行完整迁移和合成数据导入,然后逐包运行测试;结束时删除本次创建的数据库。它不会启动整套应用、迁移现有业务数据库、发布服务或刷机。Redis 使用现有本地测试实例。
|
||
|
||
检查项目:
|
||
|
||
1. 全量 Go 测试、Go 静态检查。
|
||
2. billing、callmemory、onboarding、saas、extraction、retrieval、memorytool、privacy、orchestration、vikingmemory 共 10 个包的数据库测试,开启详细输出。缺包、失败或跳过必需用例均不算通过。既有的 `TestLocalModelContentValueDecisions` 另需配置真实内容模型;未配置时单独列为 `UNVERIFIED`,不计入通过数,不影响这组本地数据库检查。
|
||
3. 前端 TypeScript 检查及生产构建。
|
||
4. 真实 React 组件的 5 项浏览器交互检查,但 API 为合成响应。
|
||
5. 固件配网页面和 SDK 日志检查;本脚本不重新编译固件、不连接话机。
|
||
|
||
最终只有输出 `PASSED_LOCAL_CHECKS`、进程退出码为 0,才表示这一组本地检查通过。**它不表示全部文档需求通过。** 单独执行 `go test ./...` 会跳过未配置数据库的集成用例,因此不能替代这条命令。
|
||
|
||
每次证据保存在 `.design-evidence/call-memory-acceptance/日期时间/`:
|
||
|
||
| 文件 | 如何核对 |
|
||
|---|---|
|
||
| `summary.json` | 本次时间、各步骤退出码、失败原因和验收边界 |
|
||
| `database-passed-tests.txt` | 真正执行通过的数据库用例名称 |
|
||
| `database-skipped-tests.txt` | 未执行的用例;真实内容模型未配置时会明确记录,不能算通过 |
|
||
| `database/*.log` | 每个包的详细执行过程;可搜索 `PASS`、`FAIL`、`SKIP` |
|
||
| `browser/result.json` | 5 项界面断言及页面异常列表 |
|
||
| `browser/*.png` | 桌面、手机及删除确认页面截图;截图仅作为辅助证据 |
|
||
| `source-sha256.json`、`base-commit.txt`、`worktree-status.txt` | 本次运行开始时的源码指纹、基准提交及未提交文件,避免拿旧版本结果替代新版本 |
|
||
|
||
## 2. 你亲自操作页面
|
||
|
||
本轮自动化命令不会启动完整网站。目前只启动测试所需的数据库和 Redis。需要手动验收时,在**本地联调环境**启动配套版本:
|
||
|
||
```powershell
|
||
Set-Location E:\Codex\story\platform
|
||
.\scripts\dev.ps1
|
||
```
|
||
|
||
此命令会构建并启动整套应用,同时对本地 `voice_platform` 数据库执行迁移。第 59 号迁移包含隐私删除台账,不能自动降级;若这个本地库包含要保留的数据,应先备份。使用专门的测试长者和合成内容,不要关联日常使用的旧固件话机:关键记忆变更后旧协议设备会被要求升级。
|
||
|
||
启动成功后打开 <http://localhost:3100>,使用本地合成账号 `owner` / `LocalOnly123!` 登录,选择测试长者,在故事区域找到“通话记忆管理”。如果提示缺少个性化记忆授权,先在该测试长者的授权管理中完成对应授权。
|
||
|
||
| 编号 | 你的操作 | 应看到什么;怎样判定失败 |
|
||
|---|---|---|
|
||
| M01 新增与持久化 | 新增偏好“验收:喜欢温的淡茶”,保存后整页刷新,再退出登录并重新进入 | 正文和“偏好”类型仍在;只在当前页面临时显示不算通过。七种类型均应可选 |
|
||
| M02 修正 | 将上条修正为“验收:只喝温的淡茶”,保存并刷新 | 显示新正文、记录版本增加,不继续把旧正文作为当前事实 |
|
||
| M03 并发冲突 | 两个窗口打开同一条记忆的“修正”弹窗;B 保存新内容后,A 保持原弹窗并尝试保存 | A 显示“这条记忆已被其他人修改”;不能覆盖 B 的新内容。可在开发者工具 Network 中核对变更请求的 409 |
|
||
| M04 使用策略 | 分别设置“只在被问及时使用”“禁止使用”,每次保存后重新加载 | 所选策略持久保存。此项只验收设置与保存;新通话的“被问及时检索”入口尚未接完,不能算语音效果已验证 |
|
||
| M05 事项完成依据 | 新增“验收:预约看牙”,类型“待跟进事项”,计划时间填一个过去日期;随后尝试标记完成,先留空完成依据,再填写依据提交 | 过去日期不会自动把事项变为完成;完成依据为空不能提交;有明确依据后显示“已完成” |
|
||
| M06 独立权限 | owner 在“记忆授权”给 editor 授予读取权限但不授予修改权限;用无痕窗口以 editor / LocalOnly123! 登录同一家庭长者 | editor 可查看但不可添加、修正或删除。设备管理角色本身不能代替记忆授权 |
|
||
| M07 撤权 | owner 撤销 editor 的读取权限,在 editor 窗口点刷新或等待一次 5 秒轮询 | 出现无访问权限提示,原先可见正文清空,添加按钮不可用;接口返回 403 |
|
||
| M08 删除范围 | 删除刚创建的测试记忆,先不勾“已核对目标和删除范围”,再勾选并提交 | 未勾选不能提交;两种删除范围可区分,提交后可查看具体任务。手动新增记录没有原始通话来源,因此不能用它证明原始文字已清理 |
|
||
| M09 六阶段状态 | 查看删除任务的记忆正文、通话记忆同步、摘要和开场上下文、当前通话停止、来源清理、备份清理 | 各阶段分别显示;缺少外部清理证据时应继续“等待完成/待核验/需处理”,不能假装全完成。真实全部完成须另有供应商和备份证据 |
|
||
|
||
建议每项记录测试时间、测试账号、测试长者、memory_id/mutation_id、操作前后截图及通过/失败。页面截图验证交互;页面重新加载后的结果和接口响应验证真实保存。失败时保留该项证据,不要用刷新后重试成功掩盖首次失败。
|
||
|
||
## 3. 页面看不到的逻辑,用这些用例核对
|
||
|
||
在 `database/integration-callmemory.log` 中搜索以下名称;用例使用真实 PostgreSQL,但设备输入为程序模拟,不是物理话机:
|
||
|
||
| 功能 | 用例名 |
|
||
|---|---|
|
||
| 修改确认、重复请求不能反向取消已提交操作、删除分阶段等待 | `TestMutationVersionFenceAndConfirmationReplay` |
|
||
| 租约过期后旧心跳不能复活通话 | `TestLeaseExpiresAndCannotResurrect` |
|
||
| prepare 幂等、提前取消、首次心跳后才能启动 | `TestPrepareIdempotenceCancelAndFirstHeartbeat` |
|
||
| 最终文字修订、收尾及撤回文字存储授权 | `TestTextRevisionDrainingAndConsent` |
|
||
| 普通设备角色不能获取记忆权限 | `TestMemoryGrantIndependentOfDeviceRole` |
|
||
| 敏感内容不能通过任务状态接口绕过授权 | `TestSensitiveMutationStatusCannotBypassListGrant` |
|
||
| 外部 ACK 不等于查询可见,版本水位不能跳过未完成项 | `TestProjectionAckIsNotVisibilityAndWatermarkHasNoHoles` |
|
||
| 投影途中再次核对授权和敏感状态 | `TestProjectionRechecksConsentAndSensitiveState` |
|
||
| 隐私删除覆盖新通话数据,且等待运行时停止证据 | `TestPrivacyDeleteIncludesNewCallDataAndWaitsForRuntime` |
|
||
| 删除后迟到文字不能恢复来源 | `TestLateRevisionCannotRestoreDeletedSource` |
|
||
| status 符合文档查询键且不能续租 | `TestStatusUsesDocumentKeyWithoutRenewingLease` |
|
||
|
||
另在 `database/integration-vikingmemory.log` 中核对 `TestCuratedProjectionUnknownCreateNeverDuplicatesOrProvesDeletion`:数据库真实,Viking HTTP 是本地模拟服务,验证响应丢失后不盲目重复新增、空查询不能冒充删除证明。
|
||
|
||
## 4. 整机验收仍待完成
|
||
|
||
以下均应保留“未验收”,不能用上述脚本或截图替代:
|
||
|
||
- 新 RTC 固件实际调用新协议、校验签名和租约、FIRST_TEST 从摘机到听到声音的闭环。
|
||
- 真实通话中新增事实,再次通话能正确使用;禁止使用、撤回授权和删除后不再使用旧事实。
|
||
- “只在被问及时使用”的按需检索入口及实际语音效果。
|
||
- 断网终稿持久化和补传、断电重启、快速摘挂机、旧回调不会串入新通话。
|
||
- 服务商实际停止、旧上下文清理、Viking schema 和查询可见性、备份清理的真实证据。
|
||
- 新通话历史/全文展示、供应商使用量和费用报表闭环。
|
||
|
||
完成这些开发和真实设备/供应商验证后,才能按原文档的 H01–H12、T01–T48 逐项签收。目前可签收的范围仅限于通过测试与手动检查的具体条目。
|