Files
story/docs/CALL-MEMORY-1.1验收清单.md
T

99 lines
9.1 KiB
Markdown
Raw Normal View History

# 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 逐项签收。目前可签收的范围仅限于通过测试与手动检查的具体条目。