(a) 记忆入库前审查的两条 admin 端点(主人判「有必要就做」): GET /api/v1/admin/memories/reviews?limit= (留痕读侧,不含记忆正文) POST /api/v1/admin/memories/{id}/revert (回滚软合并,落审计 memory.review.revert) 两条 writeAuth(裁定 DECISIONS #10:留痕属私有面,不给 viewer) (b) 语音用户可见面:DTO voice(含服务端派生 url)+ GET /api/v1/media/{name} (200/206/304/416/HEAD、Accept-Ranges、非法名/穿越统一 404 media_not_found) + documents.Store.SaveAudio(内容寻址、$DATA_DIR 0600)+ history voice 列读写与引用计数差动 缺口(如实):message_persisted/握手回放仍不带 voice(文件面外,需给 history.Message 加字段); AMR 需一行 VoiceTranscoder 注入(DECISIONS #11 已排)。4 个变异自检(含一条自认的等价变异)。
- 迁移 0020_chat_message_voice:按 design/24 §10 与契约 §7.2 已登记的 voice 形状建列/索引 - 语音回合进编排并落库;voice 引用与统计如实回填(转码/转写没成功就如实标未成功,不假装) - 复用既有 internal/capability/transcode:非 wav(微信 AMR 等)先转码再送 ASR;失败可分类且不丢消息 ⚠️ 部分完成(如实登记):生产端到端未成立(本片只到落库与转码接入),且**未经验真机**。