diff --git a/.task/feature-command-audit-owner-scoping.md b/.task/feature-command-audit-owner-scoping.md index d6f66999..91e3d79b 100644 --- a/.task/feature-command-audit-owner-scoping.md +++ b/.task/feature-command-audit-owner-scoping.md @@ -1,13 +1,17 @@ # feature/command-audit-owner-scoping 任务卡 -任务主记录:;状态:进行中;owner:weichen +任务主记录:;状态:进行中;owner:weichen(授权见下) ## 基线与授权 - 权威仓:ssh://git@git-ssh.u1680832.nyat.app:31411/weichen/Agent-System-Dev.git;目标分支:main;R0(initial_base_sha)= 34a2bbe15793f7cf91ffd907123deb4113230794 - 工作区:/home/weichen/projects/Agent-System-Dev-wt-feature-command-audit-owner-scoping(worktree);分支:feature/command-audit-owner-scoping -- 授权与交付终点:<本次允许的动作与终点;未授权事项写明> +- 授权与交付终点:用户 2026-10-08 会话「继续推进」,覆盖 U0 §11.1 首推任务(修复命令 + 审计跨租户可见,见 Agent-System-RDM PR #105 之 U0 提案)。允许:Backend 组件分支实现与 + PR、Dev gitlink bump PR、任务工作区操作与 evidence。终点:Backend PR + Dev PR 建立, + **均不合入**(合入属 owner 评审动作)。未授权:合入、基座其他改动、公开面(pkg/extension) + 变更(本修复纯 internal,不动 SurfaceVersion)。 - 交付模式:manual(逐阶段人工评审);明确授权后可记为 authorized-continuous - 自动推进授权:无;授权范围:无;授权来源:无;授权终点:无;停止条件:无(未授权) - 当前阶段:需求拆解;当前增量:I1(待定义) @@ -15,25 +19,35 @@ ## 目标与非目标 -<预期结果、受影响入口/模块/契约;明确不做什么。> +**问题**(U0 §5 C7 附带安全发现,SELF·源码级):`GET /api/commands/audit` 无租户过滤—— +`store.ListAudits` 无 owner 条件、`command_audit` 表无 owner 列 +(`internal/store/audit.go:25-37`、`internal/store/migrate.go` v7、`internal/server/server.go:861-865`)。 +多用户认证档下任何登录用户可读**全租户**命令审计(命令 ID、入口、会话 ID、参数摘要、状态)。 + +**目标**:命令审计按 owner 作用域——写入记 owner 列,查询按请求租户过滤;存量行回填。 +受影响:backend internal/{store,cmdbus,server};v18 迁移;不改 pkg/extension 公开面 +(cmdbus.AuditStore 为 internal 端口)。 + +**非目标**:管理员全局审计视图(后续按需另案);平台审计 AppendAuditEvent(另一张表, +本就带 owner);Host/EXT 面变更;前端改动(该端点现无工作台消费)。 ## 关联方向与规划 -- 适用状态:待核对(无适用规划时说明原因) -- 主记录路径/版本:待核对(路径按仓库根目录定位,归档后不变;只引用唯一正文) -- 对应里程碑:待核对 +- 适用状态:适用(U0 提案 §5 C7 附带安全发现 + §11.1 首推后续任务) +- 主记录路径/版本:Agent-System-RDM `docs/proposals/2026-10-08-U0-baseline-and-shared-contracts.md`(RDM feature/u0-baseline-contracts 分支,PR #105 待评审);基座引用组合 Dev@34a2bbe(backend fe7c245) +- 对应里程碑:多用户档部署前硬前置(非 MS 编号项) ## 需求分析 | ID | 描述 | 项目符合度及依据 | 优先级 | 验收条件 | 依赖 | 结论 | |---|---|---|---|---|---|---| -| R1 | 待填写 | 待评估 | 待定 | 待定义 | 待确认 | 待评审 | +| R1 | 命令审计按租户作用域:写入带 owner,查询只返回请求租户的行;存量行按 payload.actor 回填 | 不符合——现状无 owner 列与过滤(audit.go/migrate.go v7/server.go listAudits,见目标节引证) | P0 | 红测先行:两租户各写一条审计,任一租户经 API 查询只见自己的行;迁移回填后旧行归 actor 租户;actor 为空的存量行不再经 API 返回(数据保留可直查,卡内记录该取舍) | 无 | 纳入本增量 | ## 方案与计划 -- 方案引用:待填写(含对象版本) -- 实施计划引用:待填写(含增量与需求 ID) -- 测试计划引用:待填写(含需求 ID 与验收条件) +- 方案引用:本卡(backend@fe7c245 基线)——①迁移 v18:command_audit 加 owner 列(两方言)+ 存量回填 `COALESCE(json actor,'')` + 索引 (owner, conversation_id, time);②`AppendAudit(owner, env)`/`ListAudits(owner, conversationID, limit)` 签名加 owner,cmdbus.AuditStore 端口与 auditReceipt 传 req.Owner,server.listAudits 传 s.owner(r);③测试假体同步。备选(否决):仅按 Actor 过滤——Actor 语义是"发起主体"非租户,且与信封耦合。 +- 实施计划引用:增量 I1=R1。顺序:红测(HTTP 层两租户泄漏)→迁移→实现→回填测试→绿。 +- 测试计划引用:`internal/server/audit_scope_test.go`(HTTP 两租户);`internal/store` 回填测试(MigrateDown(17)→插旧行→重开触发 v18→断言归属);既有 e2e(同租户路径)不回归;Dev `make test` 组合验证。 ## 阶段评审