统一审计记录模型(时间/主体/动作/对象/结果/原因/关联任务/ 关联审批)+ 追加写 JSONL + SHA-256 哈希链(改写/删除/调序可 被 verify 发现)+ 字段级白名单清洗(密钥/token 值/对话原文 绝不进审计);事件分类覆盖任务派发、VM 生命周期、同步、审批、 支付、配额、记忆、后台、推理/遥测;from_legacy_row 承接现有 audit_log 行;导出选 JSON。 活动视图后端:计划登记(已做 vs 计划做,流转受控)+ 已批准 权限登记(接 P5 describe 形状)+ activity_summary 纯函数; 结构化审批卡数据(风险分级 + 接受/拒绝明确动作 + 五档授权 选项,永久档须显式 opt-in)+ card_matches_channel 校验卡与 P5 通道载荷一致。 只做后端 + 数据接口,前端视图留接口;P3/P5 不在本基线, 接线走 dict 契约,集成由 round-11 合并;审计持久化先落独立 JSONL,待 P7 状态库就绪后迁移。真机验证排队在 round-11 之后。 新测试 43/43,全量 cloud 套件 1910 OK(skipped=8); mypy 在改动文件上干净。
5.9 KiB
5.9 KiB
对齐 Muse P12 差距表:审计轨迹与活动视图
依据:~/workspace/research_notes/meta-muse-ai-architecture-20261101-0755/report.md
(官方新闻室、安全文 2026-09-08、设计文为准;第三方拆解只作参考,
不得把逆向细节写成官方架构)。基线:06c3e17。
1. Muse 官方要求(报告原文口径)
| # | 要求 | 来源 |
|---|---|---|
| R1 | 完整审计轨迹(audit trail)展示已做与计划做的事 | 新闻室、设计文(报告 §2.2 第 7 步) |
| R2 | 头像下方显示正在做什么的摘要,点头像可见完整活动日志与已批准权限 | 设计文(任务简报口径;报告未逐字展开,列为设计文要求) |
| R3 | 确定性 UI:结构化审批卡(明确接受/拒绝动作)与凭证安全存储 | 设计文(报告 §2.6) |
| R4 | 审批请求由 Sentinel 直接发到客户端 UI(不是对话内),用户答复直接回 Sentinel | 安全文(报告 §2.6) |
| R5 | 用户可自由检查、编辑、下载 VM 内所有文件,包括 Muse 关于用户的记忆 | 安全文(报告 §3 凭证与数据政策) |
2. 现状(基线 06c3e17)
- 审计是散的:
cloud/auth.py的AuthStore.audit()只追加(user_id, project_id, action, detail, created_at)到 SQLiteaudit_log表,list_audit()只按项目倒序取;cloud/worker.py的Worker._audit()是 best-effort 包装;worker_adapter.py的make_chv_audit_callback把 CHV 事件转成(project_id, "chv_vm_" + event, detail)。没有统一记录模型,没有“已做/计划 做”汇总,没有活动视图,没有已批准权限清单,没有导出。 - 审批侧:P3(分支 feat-chv-muse-p3,提交 a90cf78)有
ApprovalQueue(内存态 pending 记录:目标描述 + 原因 + ts); P5(分支 feat-chv-muse-p5,提交 25bcd35)有对话外审批通道approval_channel.py(nonce + 15 分钟过期 + HMAC-SHA256 签名, 答复只能用一次)与ScopedCapability.describe()(能力绑定描述)。 但 P3/P5 都不在本基线里,本轨不能 import 它们,只能按 dict 契约接线,集成时由 round-11 合并。 - 状态存储:P7(feat-chv-muse-p7)正在做状态分离,本轨审计轨迹 的持久化先落独立 JSONL 文件 + 明确标注待迁移到 P7 存储, 不重复造 P7 的库。
3. 本轨改什么
cloud/chv/audit_trail.py(新,纯标准库):统一审计记录模型 (时间/主体/动作/对象/结果/原因/关联任务/关联审批/项目); 追加写 JSONL + SHA-256 哈希链(改写/删除/调序可被verify()发现);字段级白名单清洗(密钥、token 值、对话原文绝不进 审计,否定测试钉住);事件分类覆盖任务派发、VM 生命周期、 同步、审批、支付(P10)、配额(P11)、记忆操作(P7 的忘记)、 后台任务(P8)、推理/遥测(P9);from_legacy_row()把现有audit_log行转成统一记录(标legacy: true,无哈希链); 导出选 JSON(不做 CSV,见 §5)。cloud/chv/activity.py(新,纯标准库):计划登记(已做 vs 计划做:pending/running/done/cancelled,非法流转拒绝); 已批准权限登记(接 P5describe()形状:连接器/主机/用例/ 档位/有效期/次数余量/撤销);activity_summary()纯函数拼出 正在做摘要 + 近期已做 + 计划清单 + 已批准权限数。cloud/chv/approval_card.py(新,纯标准库):结构化审批卡 数据(动作/目标/原因/风险分级/接受与拒绝两个明确动作/五档 授权类型选项,永久档标注须显式 opt-in);card_matches_channel()校验卡数据与 P5 通道载荷一致(pending_id + 目标字段全等)。- 前端视图不做:本轨只给后端 + 数据接口,客户端 UI 是另一侧的 工作,契约见各模块 docstring。
4. 诚实边界
- 哈希链是篡改可发现,不是防篡改:能写文件的人重算整条链 就能掩盖改动。真防篡改要外部锚定(远端日志/签名时间戳), 不在本轨。
- 审计清洗是字段名黑名单 +
key=value模式脱敏,不是内容理解: 密钥若藏在自由文本字段里且不带token=/password=等标记, 清洗器看不出来。调用方仍须只传描述性字段(P3/P5 的口径)。 - 活动视图的“正在做什么”来自计划登记与审计记录,不是实时 进程探针;VM 内真实执行状态以执行器为准。
- 审批卡只做数据,不做签发:档位可选项由 Sentinel 决定(P5 口 径),本轨只呈现调用方传进来的档位列表。
5. 决定记录
- 导出选 JSON 不选 CSV:JSON 保留哈希链与嵌套结构,CSV 会丢 字段;任务简报允许二选一。
- 审计持久化先用独立 JSONL 文件(
audit_trail.jsonl,0600), 待 P7 状态库就绪后迁移,迁移接口是from_legacy_row()同款 转换(本文件行 → P7 记录)。 - project_id 强制:
list()/export()必须传 project_id,只返 回该项目记录;跨项目读取返回空,不抛错(与现有list_audit行为一致,不泄露“存在别的项目记录”这一事实)。
6. 真机待验证清单(未做,排队在 round-11 之后)
- 审计 JSONL 在真实 VM 生命周期(wake/pause/resume/shutdown)
下的追加与
verify()表现。 - 活动摘要与真实任务派发/完成事件的对应(正在做是否及时变 更、计划状态流转是否与 worker 终态一致)。
- 已批准权限清单与 P5 五档能力在 wake/同步路径下的真实表现 (签发→使用→过期→撤销全程)。
- 审批卡数据与 P5 对话外通道在真机上的端到端一致(卡上点的 接受/拒绝与通道答复同一 pending_id)。
- 审计文件落盘权限(0600)与多进程追加(worker + host.py) 下的完整性。