Files
Agent-System-Documents/docs/proposals/2026-10-13-iam-i1-permission-contract.md
weichen 1f3bd54cfb Define the approved single-project rename projection boundary
Why: Preserve delegated project settings while keeping physical Host mutations owner-scoped.

Evidence: User explicitly approved the independently reviewed amendment and repair plan; original amendment digest recorded in the contract.

Impact: Clarify actual-actor authorization and audit, single-target owner projection, durable recovery and masked metadata; no provider implementation or deployment claim.

Refs: IAM I1 host projection amendment r1; Documents PR 98; Dev policy/delivery.md affected stages 4-5.
2026-10-13 16:04:31 +00:00

25 KiB
Raw Permalink Blame History

IAM I1 权限边界与公开扩展合同 r1

负责人:weichen;编制:Codex;更新时间:2026-10-13。 依据:用户、职位角色与分层权限统一方案 r1 (Documents a088809,原文 SHA256 39b8e9a6e078dc509bd80118c1807ce6ed23e4466e5902b51f4bfa255d55c0a1)。 用户已批准该方案并授权 I1=U1–U2,原实施终点为本地人工评审;阶段 6、7 已分别获用户“批准”“确认”。当前按 Dev policy/delivery.md 进入智能体 Review、PR、CI 与合入,状态及固定对象见验收记录。迁移、部署、工作区清理及后续增量未授权。 本合同为 U1 产物,冻结已批准语义与提供者/消费者责任;新增公开接口仍须对应模块实现、固定版本及合同验证,不能据此宣称能力已提供。 源码、业务测试及运行验收结果以 I1 任务卡的工具收据为准;本文不复制测试结果。

1. 当前增量与最终目标

最新用户裁定取代旧“管理员拥有全部业务权限”“创建者不受职位 cap”“每人仅一个生效职位”的现行解释。 历史会议、原方案、旧批准记录和 .tmp 原件保留;旧结论只用于解释历史行为。 系统管理员管理系统与授权主数据;读取他人业务内容必须有具体项目和资源授权。 职位支持一职多人、一人多职,项目明确选用有效职位绑定;新任命不自动增加既有项目权限。 通用职位、绑定、默认/上限与系统授权迁至 Backend 是已批准设计;RDM 保留项目成员、项目选用绑定、项目覆盖、资源及文档职责/状态。

层 I1 范围 后续范围
文档 U1 需求裁定、动作目录、角色 cap、隐私、公开扩展申请与验收合同 按固定公开版本补提供者/消费者验证
执行端 U2 在现有 RDM 单绑定和旧管理台账上收口可达越权路径;实际结果另见任务卡 账号有效态、受控目录及恢复能力 U3;通用职位与多绑定 U4;项目明确选用 U5
UI/Agent/迁移 不以文档保存证明能力已就位 矩阵、统一工具、完整撤权与数据迁移分别按 U7–U9 授权实施

I1 的 legacy 单绑定适配不是最终多职模型:旧账号至多一个专业角色,项目尚无显式 bindingId 集合。 已有绑定必须先检查角色有效态、动作定义与 cap,再计算默认/项目覆盖;停用或失效不能回落为无绑定成员默认。 未绑定旧会员的关系默认只能作为已登记的 legacy 兼容来源,仍受平台 cap、项目关系和资源限制;不能伪装成新的职位绑定或最终模型的资格证明。 U4/U5 迁移后无有效选用绑定的业务动作默认拒绝;迁移差异须单独评审,不在 I1 静默改造数据。 旧 RDM 管理台账在 I1 仅为明确系统管理动作的兼容来源,不能生成项目成员关系、业务 grant 或资源 bypass;Host.IsAdmin() 同样不能代替业务授权。 I1 还将当前分发 Host 的平台管理员身份显式适配为上述四项受保护系统动作;必须同时满足认证 actor 与 Host.Owner 一致,不接受 body 的管理员声明,也不把该适配扩展到其他未知动作或业务动作。细粒度系统 grant 的通用权威仍属 U4。

2. 动作目录与配置主体

scope 由受信 ActionMeta/权限注册表确定,不接受请求自报 scope,不按字符串前缀推断。 系统动作只消费系统来源;项目动作限定实际项目;资源读取还须匹配实际资源、分类与读取动作。 下表为 I1 稳定动作合同。“后续”项仅冻结目录,当前尚未提供相关接口。

actionId scope 配置/执行主体 附加边界
system.roles.manage system 受保护系统管理者 角色创建/编辑/停用/读取;不能经项目覆盖获取
system.roles.assign system 受保护任命者 任命在可委派上限内;不能间接授予受保护系统权限
system.policy.manage system 受保护策略管理者 平台 cap 与权限政策;保护最后有效管理者
system.admin.transfer system 当前有移交资格的系统管理者 明确移交目标;旧 rdm.perm.transfer 映射此门禁
project.create system 有明确系统/职位建项 grant 的有效用户 创建者管理 cap 资格见 §3;不接受项目 allow
project.archive project 目标项目的合法管理者 保留稳定 ID;纠正旧目录误标的 system scope
project.settings project 目标项目创建者/委任管理者或合法获授者 仅本项目设置与覆盖;不能进入全局角色、cap 或管理员移交
member.manage project 本项目合法管理者 成员及选用角色管理;不得替他人做本人受限重选
duty.assign project 本项目合法分配者 候选有效成员+对应资格 cap+三权异人;分配不代签
stage.advance project 有阶段推进 grant 的成员 阶段准入准出、当前状态
doc.read project 有读取 grant 的成员 文档阶段范围+受控正文职责/明确资源授权
doc.write project 有编制资格的指定编制人 具体文档、当前状态、冻结版本;不因管理权取得
doc.publish project 有发布资格及对应职责的成员 固定整文版本及已批准状态,不替代批准签字
review.participate project 有评审资格的指定审核/批准人 按具体职责决定可执行动作;只能批注及通过/驳回
trace.edit project 有追溯编辑 grant 的成员 文档层/项目层裁定范围与状态分别检查
knowledge.publish project 有发布 grant 的成员 明确提交/发布;不能借发布读取私人原件
audit.read project 有明确业务审计 grant 的当前成员 独立于正文读取;当前角色动作 cap、平台 cap 与范围均满足
system.settings.read/system.settings.write及设置子项 system,后续目录 对应系统管理者 模型、插件、Agent、检索等设置分项授权
system.users.view/create/edit/disable、credential.recover system,后续目录 对应账号管理者/恢复提案者 编辑资料不能改管理员资格;恢复见 §6
permission.manage、knowledge.read、trace.read、document.read/export、业务审计导出 后续目录,project 按注册元数据和当前业务关系 当前 doc.* 等 ID 不静默重命名;新增需公开版本映射

audit.read 是 I1 新独立项目动作:必须由合法项目管理者在上限内明确授予,或来自明确配置的角色默认 grant;管理身份本身不提供审计 grant。 非成员 admin、仅持 Host.IsAdmin() 的主体、无审计 grant 的创建者、cap 已收紧的旧获授者均拒绝。 系统安全日志只披露必要安全动作、结果及不透明对象标识,不能包含业务正文、文件名、项目名、内容摘要或完整业务差异;业务审计仍走 audit.read。

旧入口/元数据 I1 兼容规则
rdm.role.create/action/disable/list 命令 ID 保留,系统门禁改为 system.roles.manage
rdm.role.assign 命令 ID 保留,系统门禁改为 system.roles.assign
rdm.perm.cap 命令 ID 保留,系统门禁改为 system.policy.manage
rdm.perm.transfer 命令 ID 保留,系统门禁改为 system.admin.transfer
旧 project.archive scope=system 目录版本标记改为 project;具体项目重验;旧系统覆盖写法不继续接受
project.settings 作为全局门禁 不兼容保留;项目 grant 不被翻译成系统 grant
未登记 ID、旧示例 admin.transfer/business-audit.read 不是隐式别名;拒绝执行/写入,采用上表稳定 ID 或显式版本映射

3. cap、创建者资格与撤权

最终系统动作路径为:有效账号 ∩ 受信系统动作 ∩ 平台允许范围 ∩ 受保护规则 ∩ 明确系统 grant 或完整系统职位默认路径;项目覆盖不能参与。 最终项目动作对每个有效且本项目选用的 binding 建立完整路径:

有效成员/管理关系 ∩ 已定义动作 ∩ 平台 cap ∩ 本职位 cap(含范围) ∩ 项目覆盖/当前默认 ∩ 资源关系 ∩ 阶段/状态 ∩ 文档职责。

至少一条完整路径允许才放行,不拼接不同职位的 grant 与资源范围;平台禁止、项目明确 deny 和资源禁止对所有路径生效。 allow 只能替换默认 grant,不能创造未配置动作或越 cap;deny 阻断该成员该项目该动作的全部路径;inherit 使用当前默认。 停用、解绑、换岗、cap 收紧、账号停用和成员移除后重验当前资格;遗留 allow 不能复活旧权。 创建者关系只提供本项目管理默认,其有效角色 cap 与平台 cap 仍先验;A 创建者不能管理 B,不能读取私人资源或代签。

建项前校验创建者角色组合具备 project.settings、member.manage、duty.assign cap 资格;这些角色 default 可关闭,由创建者关系提供项目内管理默认。 最终创建项目、创建者成员关系及所选 binding 在同一领域事务落地;宿主绑定以可恢复状态和幂等对账处理。 已有项目遇 cap 收紧保留 createdBy 与历史归属,阻断受影响动作并说明等待重新任命;不能扩大 cap 恢复管理。

受限“重新选择本人项目职位”是后续独立动作,不复用 project.settings:仅当前有效负责人本人,从账号当前有效任命中明确选取具备管理 cap 的 binding,按项目当前版本确认。 仅此动作可使用尚未被本项目选用的任命;它不改变负责人、不恢复遗留 allow、不清除 deny、不授予资源读取或三权。 系统任命者不能代选;无合格任命时保持等待。项目内移除最后负责人须保护实际可操作管理资格;系统必要撤权不因这一保护而被阻止。

4. 资源、正文与审计读取合同

认证 actor、资源真实 owner/projectId/resourceId/分类来自执行端受信上下文;客户端标识只能定位对象,不能授予访问。 本人的私聊、私人原件和个人草稿属于私人资源;在当前账号有效且资源确属本人时按自有资源规则读取,不因放在项目下变为受控正文。 受控文档正文即使物理由本人生成,也须具体文档职责或明确资源授权、当前项目资格及当前 cap;真实 owner 相等不绕过受控规则。 审核/批准职责仅开放送审正文与明确关联材料,不开放未分享原件、私聊或私人草稿;分享只授予指定资源的只读能力,不授予编写或签字。 项目知识只由明确提交/发布产生;成员身份不意味着私人资源或所有受控正文全量可读。 历史签字、职责与事件保留;历史内容读取依旧使用当前授权,时间点重建不恢复当时权限。 读取、下载、列表、搜索、stream、模型上下文均遵循同一分类和当前判定;裁剪列表后再返回数量/分页,拒绝不得泄露存在性。 I1 现有项目聚合审计 DTO 含正文预览,故除 audit.read 外还必须具备当前完整项目 doc.read;阶段范围受限者不能通过全项目聚合审计取得范围外正文,按资源裁剪的细粒度审计由 U5 完善。具体文档导出检查该文档的 doc.read 和阶段范围,不把审计 grant 当成导出 grant。 I1 私人 pending/rejected 草稿仅提案人可读与决定;知道 proposalId、拥有项目管理权或文档职责都不能采纳/拒绝他人私稿。已采纳正文仍按当前文档读取授权逐项过滤。原件批次确认只限上传者本人,管理台账可披露经当前管理授权限定的业务元数据,不能因此读取或确认私人原件。

5. 公开扩展:现有能力与四要素申请

以下现有公开面是 I1 原合同的 Backend 0f192a481388184df39f81c28b0587a7e16ec3ca 快照,参考 pkg/extension/extension.go、host.go 与 surface.txt,不导入 Backend internal。 该快照的 SurfaceVersion=2.11.0-experimental 源码声明不是部署或消费者可用性证明,也不代表后续主干能力;同步后的组合必须重新核对提供者及消费者实际固定版本。

现有能力 提供者/消费者 足够性与边界
EXT-18 AdminProvider.IsAdmin()/Request.HostProjectID Backend 分发 Host → RDM 平台管理身份与宿主项目定位;不能证明系统分项授权、账号有效态、RDM 项目关系或业务访问
EXT-19 AccountLister.ListAccounts(cursor, limit),AccountEntry{Owner,Valid} Backend → 授权目录消费者 最小身份目录,非资料页;不提供姓名、联系方式、多职绑定或写权;缺能力不允许新增产品路径无校验继续
EXT-8b ResourceAuthzQuery/ResourceAuthorizerV2/注册口 Backend 构造受信查询 → RDM 提供策略 → Backend 执行 现有六要素为 actor/action/resourceType/resourceId/owner/projectId;读取专用,V2 对域内读权威(含自有命中);未注册的 V1 回落不能替代 I1 必需的资源限制

以下是 U1 冻结的公开扩展申请四要素,符号为合同草案,I1 不新增导出实现、不更改 surface 版本。

申请 场景 希望的公开符号/路径 现有注册点为何不足 兼容方式
IAM-P 政策与动作目录 UI/命令/工具需查询 scope、cap、有效绑定、权限解释与版本;角色通用权威迁移后供 RDM 同源判定 可选 PermissionCatalogProvider、AuthorizationProvider;公开目录/判定/解释与授权管理预览提交服务 IsAdmin 只有布尔身份;ActionMeta 在 RDM 内部;EXT-8b 仅资源读,无法供系统管理或管理写入事务使用 新可选接口及版本化 DTO;旧 Host 不加必实现方法;RDM legacy 适配与新权威切换分别固定版本
IAM-D 受控人员目录 项目选人需要稳定身份、有效态和最小辨识字段,系统资料管理需独立授权 可选 AccountDirectoryProvider 与版本化查询/投影 DTO;既有 EXT-19 保留 AccountEntry 仅 owner+valid,没有字段权限、搜索模式、可披露辨识资料及多职;私自扩展所有账号资料会扩大披露 新可选接口;旧 ListAccounts 不改变返回隐私范围;不得向旧消费者塞入联系方式
IAM-R 资源与当前政策上下文 跨原件/草稿/正文/审计分类,查询当前 policy/duty epoch,撤权影响读面与后台提交 新版资源查询/决策 DTO 及可选政策上下文提供者;保留 ResourceAuthorizerV2 六要素无分类、职责/版本/epoch;bool 返回不能携带可披露原因与版本,读适配器不能承担写入事务 新版本资源接口或明确 DTO 增补;禁止未知字段零值放行,必需提供者缺失即拒绝;版本协商与双读仅作诊断
IAM-C 账号本人恢复 管理者只能提出恢复,账号本人经独立证明才能取得可兑换设密能力 公开恢复提案/本人确认/兑换回执合同,隔离恢复凭据与业务会话 IsAdmin、目录、资源授权均不提供本人证明或安全凭据交付,不能用个人资料代替 新路径/可选能力,不向普通管理员交付目标账户可兑换 Key;旧不满足证明的线上路径明确拒绝
DTO 必须冻结的字段与版本语义
PermissionDescriptor actionId、label、description、scope、resourceTypes、group、conditions、delegationLevel、risk、descriptorVersion;稳定 ID 不随改名变化,新增项默认拒绝
授权查询/解释 受信 actor、actionId、资源定位与实际归属、当前状态/版本、选用 binding;输出 allow/deny、可披露 reason、来源链、authorityEpoch;解释只限本人或有权管理对象
目录查询/投影 稳定 userId/owner、valid、获授权姓名/登录名/工号/职位投影、cursor/limit、精确/模糊模式及字段/状态过滤、directoryVersion;未授权字段不返回、不参与匹配;电话、邮箱、部门、备注只在独立授权资料面披露
管理 patch/预览 固定对象 ID、expectedVersion、authorityEpoch、patch 摘要、幂等键;预览不代替提交授权,非法对象/越 cap/冲突整体拒绝;跨模块写入不冒充单库事务
资源决策扩展 受信分类(私人/发布知识/受控正文/业务审计)、resourceVersion、policyVersion、dutyVersion、authorityEpoch 与决策原因;缺失或不认识分类拒绝,禁止请求自报归属

目录 r1 的 scope 修订不能只改显示标签;执行端必须同时拒绝错误作用域写入。公开版本须同时登记导出面快照、版本号、变更表、提供者/消费者合同及固定组合。 缺必需能力、未知动作/字段/状态、政策读取失败、归属不一致、过期版本、失效绑定均 fail-closed;不能用 Host.IsAdmin()、缓存 allow、V1 粗粒度授权或手填 owner 兜底。 通用迁移前 legacy 台账只在其声明范围使用;迁移时保留 userId/owner/roleId/projectId/createdBy,禁止双主写入,不生成旧管理员的永久业务 grant,回滚不复活旧越权。

5a. 当前公开能力缺口的 I1 处理

以下是 U2 收口所需的默认拒绝策略,不是后续能力已实现声明;本地候选的实际验证见 I1 评审记录。

  • 未归属事件盘点、归属迁移、全量 outbox 队列必须另有 owner 批准的精确资源范围。I1 的 Runtime.SetLegacyAccessAuthorizer 为实例内受信集成点,查询绑定 actor/action/project/seq;不存在用户自授命令,不持久化、不跨重启继承。无提供者或提供者失败即拒绝。迁移另检查目标 knowledge.publish。
  • 当前 Host.KnowledgeDelete 仅能删当前 owner 的整个插件前缀,不能限定项目。rdm.knowledge.revoke 先验证目标项目 knowledge.publish,再明确拒绝执行,不能借 A 项目 grant 删除 B 项目索引。
  • rdm.init 当前实现读服务器路径并写全量未归属域,公开命令拒绝;可信本地 CLI/bootstrap 仍需操作授权。本轮不另造公开目录读取和项目初始化能力。
  • Host↔RDM 绑定须证明两个项目的管理资格;旧映射行与请求中的 HostProjectID 都不是此证明。I1 的实例内受信 Host 项目授权集成点必须绑定 actor/action/两个实际项目,缺失即拒绝绑定、解绑及基于映射的共享访问。旧映射不自动升级成授权证明。
  • 现 Backend project/list 授权成功后会返回项目下全部 owner 工件元数据,缺少逐资源 owner 裁剪,I1 拒绝此聚合共享。项目级 search 无发布分类证明时也拒绝跨 owner 检索;自有私人资源的具体读取路径保留。
  • 项目聚合 DTO 尚无安全的按阶段裁剪投影时,要求当前完整 doc.read;章节/文档接口按实际对象检查阶段。业务审计另需显式 audit.read。后续安全裁剪不得用 UI 隐藏代替执行端检查。
  • 新 outbox 回执以事务内 rdm_audit_outbox_scope 记录实际 project/owner,只送入对应 owner 的 Host;旧未知归属回执保持 pending,禁止按下一调用者猜测归属。该关联表为新增领域元数据,无历史自动归属,本轮未执行生产数据库变更。
  • status/resume/cancel 按私人批次的真实 owner 判定;恢复另检查当前项目写权及生命周期,取消仅保留本人停止私人任务的能力。opID 重放必须绑定操作、项目、主体与实际资源,冲突不能返回另一资源回执。
扩展申请补充 场景 希望的公开符号/路径 现有注册点不足 兼容方式
IAM-K 项目级知识撤销 合法 A 项目发布者仅撤销 A 已发布资源 可选项目/资源限定的知识撤销 DTO 与提供者;实际命名待模块评审 EXT-9 whole-prefix 删除跨同一 owner 多项目;无可靠逐 ref 删除契约 新可选公开接口,旧缺失拒绝;固定提供者/消费者版本,不改 pins 猜测能力
IAM-H 宿主项目管理证明与资源裁剪 绑定需双方管理证明,共享读取需当前项目授权与实际资源分类 受信 Host 项目授权查询/证明及逐件资源投影提供者;实际命名待模块评审 EXT-18 仅给当前 actor 的管理员位与项目定位;EXT-8b project/list 是整面 bool,无逐件过滤 新可选契约、权威对象与版本;旧映射只作定位,缺失默认拒绝;RDM 私有受信适配不能冒充 Backend 公共实现

6. 账号恢复证明与交付

普通管理员仅发起恢复提案;本人须使用管理员不能单方改写或取得的既有有效会话确认,或预先建立的本人恢复证明,才取得可兑换设密能力。 姓名、电话、邮箱、工号均为可选资料,不自动成为恢复证明;新证明建立或更换不能由恢复提案管理员单独完成。 无独立本人验证条件时拒绝线上恢复,不向普通管理员签发可兑换的目标账户 Key;异常人工恢复由另行批准的 owner 操作处理。 恢复能力限制为一次消费、目标账号、设密用途与有效期,不生成业务会话;消费后本人使用正式凭证重新认证。 本合同不证明恢复实现已具备;U3须验证“管理员提出恢复后自行设密接管业务身份”负例,旧路径未收口前 R7 不得闭合。

7. 验收矩阵与证据边界

R1–R20 到 RDM 原 UR/SR 的映射由 RDM docs/proposals/2026-10-13-iam-i1-contract-adoption.md 维护,原需求 ID 不重新编号。

判据 I1 文档核对 行为验收归属
系统动作不可由项目 override 或 project.settings 获取 §2逐动作 scope/旧命令映射 U2:普通成员合法本项目设置成功,全局角色/cap/移交拒绝
创建者仍受有效角色 cap,遗留覆盖不越界 §1/§3 U2:创建者 cap=false、角色动作未定义、停用/换岗及旧 allow 负例
管理员无业务身份旁路,审计独立授权 §2/§4 U2:admin/Host.IsAdmin 非成员及无 audit grant 拒绝;合法成员 audit grant∩cap 正例
私人资源与受控正文分开 §4/EXT-8b 消费边界 U2 可达路径;U5/U6 统一资源及职责、当前版本完整验收
一职多人、一人多职、项目明确选用 §1/§3/IAM-P U4/U5:新任命不扩既有项目、解绑再任命不复活、完整路径不拼接
账号目录敏感投影与本人恢复 §5/§6 U3:未授权字段不匹配/不返回;管理员不能取得本人兑换凭据
冻结文档轮次、撤权与迟到事件 §3/§4/IAM-R U6/U8:当前职责与 cap 重验;旧卡/Surface/SSE/后台最终提交拒旧
单权威迁移、版本兼容、完整组合 §1/§5 U4/U9:旧→新差异、双主拒绝、当前固定提供者/消费者和制品验收

U1 只检查文档差异、链接、动作与 scope 一致性、R1–R20 追溯及原方案摘要保持;无行为变更,不运行业务测试。 本地检查来源为 SELF;审核与正式验收须按任务规则同步对象、独立重放并核验 GATE/REPLAY 身份及 SHA。 公开实现、业务测试、浏览器、真实模型、数据库迁移、服务运行、部署与正式验收均不能用本合同的保存结果代替。

8. I1 宿主改名投影的已批准修订(2026-10-13)

用户已批准委任改名契约修订与修复计划 r1,批准对象原文摘要为 3eee5714cce974ce13229b3e184bc3aa763a5e0819fdf7dcf088dafe68b1ed2a。正文维护在 RDM 一处;批准状态与实际实现、测试、Review、CI 和合入分开记录。

合法项目 project.settings 可以委任改名;现有 ProjectHost 的管理修改保持 owner-only。RDM 仅对这一动作建立受信的单目标投影适配:先以实际认证 actor 判定当前项目设置权及状态,再核对域/宿主绑定/物理项目的完整身份,只用受信创建者的 scoped Host 执行该 hostID 的改名。不借创建者身份重新授权,不把投影句柄返回或传入其他业务动作;无需额外 doc.read,私人读取和 Native work 不扩权。

首次改名要求 ready;失败恢复必须对应同事务持久的改名意图、同一主体/项目/host/创建者/目标与版本,并再次检查实际 actor 的当前资格。未知 failed/create 不恢复,未就绪时读/work 仍拒绝。该元数据只属于 RDM 项目投影,不修改旧账号或项目身份,不实施生产迁移,也不冒称完整跨库 epoch。

命令与 HTTP lifecycle 都使用原请求 Host 审计实际操作者。Backend 审计的 Actor=plugin:rdm 继续表示插件来源;业务 actor 由受信 Host.Owner 和审计 evidence.actor 记录。命令保留既有 DTO,HTTP 保留 core.Project 及公开元数据的脱敏设置;不得带出物理 owner 的原始管理设置。

本修订不新增 Backend 公开符号或放宽其 owner-only 管理规则。正式通过须覆盖合法委任及无读取权管理、cap/停用/非成员、实际归属变化、失败/重启/未知恢复、两入口审计和真实 HTTP;未通过当前组合验证时不能声称 I1 完成。