Files
codex-app-server/docs/chv-muse-p12-gap.md
T
host 9759be47bb feat(chv): 对齐 Muse P12——审计轨迹与活动视图
统一审计记录模型(时间/主体/动作/对象/结果/原因/关联任务/
关联审批)+ 追加写 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 在改动文件上干净。
2026-11-06 22:38:19 +00:00

96 lines
5.9 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 对齐 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)` 到 SQLite
`audit_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,非法流转拒绝);
已批准权限登记(接 P5 `describe()` 形状:连接器/主机/用例/
档位/有效期/次数余量/撤销);`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 之后)
1. 审计 JSONL 在真实 VM 生命周期(wake/pause/resume/shutdown)
下的追加与 `verify()` 表现。
2. 活动摘要与真实任务派发/完成事件的对应(正在做是否及时变
更、计划状态流转是否与 worker 终态一致)。
3. 已批准权限清单与 P5 五档能力在 wake/同步路径下的真实表现
(签发→使用→过期→撤销全程)。
4. 审批卡数据与 P5 对话外通道在真机上的端到端一致(卡上点的
接受/拒绝与通道答复同一 pending_id)。
5. 审计文件落盘权限(0600)与多进程追加(worker + host.py)
下的完整性。