Skip to content

[umbrella][security] 授权全生命周期缺口地图 — 包开发 → 生产上线(P0–P3) #2561

Description

@os-zhuang

概述

平台授权在整个生命周期上的全部已知缺口的总追踪 issue —— 覆盖包开发、分发安装、环境组合、运行时强制、生产/企业加固五个阶段。源自 #2557 / ADR-0086(PR #2559)工作中同步完成的全生命周期评估。

核心结论: 运行时强制层已相当扎实(约 18 个原语已强制,由 ADR-0056 D10 一致性矩阵在 CI 中守护)。缺口集中在两头——包开发端与生产/企业端。

🏁 收尾更新(2026-07-15,最终账本校正):本地图使命完成。 P0(3/3)· P1(3/3)全部合并;P2 除「groups + 减法 muting(deferred)」外全部落地;P3 中委派管理、合规裁决、SSO 已解决或超额完成。剩余未勾项均为 deferred / evidence-gated,各条已注明去向;授权后续开发已整体迁移至 #2920(双轨任务:ADR-0095 授权内核链 + ADR-0090 权限模型 v2 地基/补齐轨)。

✅ 状态更新(2026-07-04 收尾):所有 P0 关闭,P1 全部落地,P2 里三项已完成。上线所需的授权 + 认证能力已就绪。

📌 优先级重排(2026-07-04,面向本次生产上线)
本次上线不评估 AI 相关能力:ADR-0086 objectui 升 P0;强制 agent visibility(#1901)降 P3(唯一 AI 专属项);其余不变。


P0 — 上线阻断(全部关闭 ✅)

P1 — 高优先级(生产必需,全部落地 ✅)

P2 — 模型完备性(6.5/7 ✅)

P3 — 企业 / 合规纵深(3/5 ✅)


依据来源 / 关联

Activity

  1. self-assigned this
    on Jul 4, 2026
  2. changed the title [-][umbrella][security] Authorization lifecycle gap map — package development → production launch (P0–P3)[/-] [+][umbrella][security] 授权全生命周期缺口地图 — 包开发 → 生产上线(P0–P3)[/+] on Jul 4, 2026
  3. os-zhuang commented on Jul 4, 2026

    @os-zhuang
    ContributorAuthor

    收尾进度补记(2026-07-04)

    企业认证 P1/P2 — 已确认收尾,issue 正文已如实反映:

    P2「两道门分离」(ADR-0086 P2) — 框架侧已开发完成,评审中 #2573(草稿):

    • 块1(包门):publishMetaItem 通用发布期物化器 → 已发布 permission 元数据物化进 sys_permission_set(managed_by:'package'+package_id),复用既有 sys_metadata 草稿/发布流水线。
    • 块2(管理门):数据层写门硬拒绝——管理门不能改/伪造 managed_by:'package' 行;系统/开机写 isSystem 短路,物化器不自锁。
    • 验证:单测(含数组伪造 / update 改badge / 无主体 / 精确批量)+ 真实 showcase 内核 dogfood(发布物化 + REST 管理门 403/200/伪造 403)全绿。
    • objectui 侧(把包门实时保存改走 mode:'draft'+批量发布)为后续独立改动。

    余下 P2/P3 纵深项不阻断上线。


    Generated by Claude Code

  4. os-zhuang commented on Jul 4, 2026

    @os-zhuang
    ContributorAuthor

    ✅ P2「两道门分离」(ADR-0086 D6/D7)端到端完成并合并

    框架 + objectui 两侧均已合并,两道门在各自 main 上闭环生效:

    • framework#2573(已合并 9796e7c)—— P2 框架半边:
      • 块1 包门发布物化:publishMetaItem 通用发布期物化器 → 已发布 permission 元数据 upsert 进 sys_permission_set(managed_by:'package'+package_id),与 bootstrapDeclaredPermissions 共用同一 upsert;publishPackageDrafts 聚合物化结果。
      • 块2 管理门数据层写门(硬拒绝):安全中间件拒绝管理门写/伪造 managed_by:'package' 行(insert/update、单对象/数组),置于空主体 fall-open 之前(对超级用户亦成立);多行写仅在过滤命中包行时拒绝;系统/开机 isSystem 短路,物化器不自锁。
    • objectui#2225(已合并 d9f5ccd)—— P2 objectui 半边:
      • 包 Access 门(/studio/:packageId/access)从"实时写活动记录"改为 client.save(...,{mode:'draft',packageId}) 写草稿、随包 Publish 发布;草稿感知读(pending draft 覆盖已发布基线、侧栏合并 已发布 ∪ 草稿);env-admin 门保持 live;banner 从"保存即生效"改为"保存为草稿、发布后生效"。

    闭环:包门编辑 → Save 写草稿 → 顶栏 Publish → 框架物化 → 数据层写门确保两道门各写各的。完全对齐 ADR-0086 TL;DR §1「populate and gate on the managedBy provenance axis」。

    验证:framework 单测(物化语义 + 写门含数组/改badge/无主体/精确批量)+ 真实 showcase 内核 dogfood(发布物化 + REST 管理门 403/200);objectui scope 测试断言包门 save 携带 {mode:'draft',packageId} 且保留他包切片;两侧 CI 全绿。


    至此 #2561 上线地图的授权项收尾:P0(3)· P1(3)· P2 两道门(D6/D7)全部完成合并。 剩余为不阻断上线的纵深项:groups + 减法 muting(subtract 层,ADR 明确 deferred)、按操作 requiredPermissions、能力注册表、secure-by-default 推广、per-org IP(#2571,deferred)、SSO/合规(P3)。


    Generated by Claude Code

  5. os-zhuang commented on Jul 8, 2026

    @os-zhuang
    ContributorAuthor

    剩余任务评估 + 账本更正(2026-07-08 逐条复核代码后)

    对剩余项按当前代码实况逐条核过,三处与清单不符,先更正:

    1. P2「两道门分离」实际已完成 —— assertPackageManagedWriteGate(plugin-security/src/security-plugin.ts:1055-1122,置于空主体 fall-open 之前)+ permission 发布物化器(security-plugin.ts:788)+ 单测(security-plugin.test.ts:946-1092)+ dogfood(two-doors-permission.dogfood.test.ts)均已在仓库。但上文评论引用的 PR feat(security): 权限集「两道门」分离 — 包门发布物化 + 管理门写门 (ADR-0086 P2) #2573 / commit 9796e7c 在本仓库历史中不存在;实际经 PR Showcase redesign: six-domain layout, registry-driven coverage, capability-map tour #2619(31faea1) 落地。建议勾选该项并更正引用。

    2. 能力注册表(D1)已是 PARTIAL,而非未动 —— sys_capability 对象(plugin-security/src/objects/sys-capability.object.ts)+ 向后兼容 seeding(bootstrap-system-capabilities.ts,挂 kernel:ready)已落地。剩:systemPermissions/requiredPermissions 由自由字符串→引用解析(permission.zod.ts:150、object.zod.ts:532 仍是 z.array(z.string()))+ ⑨ 授权/发布期 lint。

    3. SSO(P3)比清单更完整 —— OIDC RP、SAML、SCIM 均已经由 @better-auth/sso / scim 落地(auth-manager.ts:1463-1559),超出 ADR-0069 对 P3 的原始 defer。P3-SSO 实际只剩 settings-manifest 形式的信任列表 UI polish(现走 sys_sso_provider 记录 + action)。

    其余项复核后的真实剩余:

    • secure-by-default 推广(④):D2 原语已强制(object.zod.ts:159-162;permission-evaluator.ts:66-77,183-206),但无一生产对象设 access.default:'private',sys_secret/sys_sso_provider 等敏感系统对象仍 public-by-default —— 纯 defaults + 可视化,剩余 P2 中价值最高;需先定"哪些对象转 private"(避免误伤运行时读取路径)。
    • 按操作 requiredPermissions(⑤):未开始(object.zod.ts:532 仍 string[],security-plugin.ts:406-422 对 CRUD 一刀切)。加性、向后兼容、边界清晰 —— 正在实现,单开 draft PR。
    • groups + 减法 muting(⑦,落地时须覆盖 FLS/⑧)、per-org IP([security][P2] Per-org / per-user IP allow-list (record-level allowed_ip_ranges) — ADR-0069 D5 #2571)+ require_ip_match(D5):未开始,ADR 明确 deferred / evidence-gated。
    • 诚意债(ADR-0049 "不留未强制的安全属性"):agent.visibility([P2][security] Enforce agent visibility (organization/private) — context now has tenant (ADR-0095); needs owner/org anchor on the agent #1901,agent.zod.ts:172 声明、runtime 零消费)与合规子系统 ×4(compliance / encryption / masking / rls-global,均 EXPERIMENTAL 无运行时消费)—— 应各自定"强制 or 移除",与本次上线正交但不宜长期悬置。

    Generated by Claude Code


    Generated by Claude Code

  6. os-zhuang commented on Jul 8, 2026

    @os-zhuang
    ContributorAuthor

    ✅ P2 两项落地:按操作 requiredPermissions(⑤)+ 能力引用 lint(⑨)

    #2690 已合并(squash 466adf6,CI 16/16 全绿):

    • ⑤:对象 requiredPermissions 支持 string[](全 CRUD)或 {read,create,update,delete} 按操作映射(读开放/写门控);plugin-security 按操作强制,transfer/restore→update、purge→delete;数组形式语义不变(向后兼容)。
    • ⑨:新 validateCapabilityReferences(@objectstack/lint)接入 os validate/os lint —— requiredPermissions 引用一个"无处注册"的能力时授权期告警(打错如 mange_users 不再只有运行时静默 fail-closed)。内置能力表上移到 spec(security/capabilities.ts)作单一事实源,seeder 与 lint 共用。

    正文待勾选:「按操作粒度的 requiredPermissions」→ [x];「能力注册表」剩余仅 string→引用解析迁移(表+seeding+⑨ lint 均已落地)。

    下一项推进:secure-by-default 推广(④)。


    Generated by Claude Code

  7. os-zhuang commented on Jul 8, 2026

    @os-zhuang
    ContributorAuthor

    ✅ 本轮收尾:④ 合并 + 诚意债全部裁决(2026-07-08)

    已合并:

    • feat(platform-objects): secure-by-default posture for sensitive system objects (ADR-0066 ④) #2691(9fa84f9)— ADR-0066 ④ secure-by-default 系统对象切片:sys_secret / sys_jwks / sys_verification / sys_oauth_access_token / sys_oauth_refresh_token / sys_device_code 翻 access.default:'private'(逐读取路径验证:better-auth adapter=isSystem、driver 级直读、空主体 fall-open 均不受影响);sys_scim_provider 加 D3 能力门(镜像 sso);nav_jwks 导航门;姿态由 platform-objects 测试 + D10 矩阵行 secure-by-default-posture 钉死。刻意排除成员自助对象(sys_session/sys_api_key/sys_oauth_application/sys_two_factor,Account app 以成员上下文经通用数据层读取)并有反向断言。④ 剩余:Studio 姿态可视化(objectui 侧)。

    评审中(#2693,draft)— 诚意债裁决(ADR-0056 D8「强制 or 移除」):

    设计意见备案: #2571 per-org IP 组合语义 → 收紧/交集(不可放宽平台边界),见 #2571 评论。

    至此本地图 framework 侧收敛: P0(3)+ P1(3)+ P2 核心(两道门、⑤、⑨、④系统对象切片、可观测性、共享限流)全部落地;D8 诚意债全部裁决(#2693)。剩余均为 deferred/evidence-gated(⑦ muting、#2571、委派管理、⑥ CEL 能力、SSO UI)或 objectui 侧(④ 可视化)。


    Generated by Claude Code

  8. os-zhuang commented on Jul 8, 2026

    @os-zhuang
    ContributorAuthor

    ✅ objectui 侧收尾:④ Studio 姿态可视化 + ⑤/⑨ 授权 UX 已合并(objectui#2350,6eca471)

    • ④ 可视化(闭环 ADR-0066 ④ 的最后一块):Access 权限矩阵对 access.default:'private' 对象行显示 Private 徽章 + "通配授权不覆盖"提示;对象设计器(metadata-admin 与 Studio 设置页共享)新增 Access 区块可编辑 posture,private 带发布前警示。
    • ⑤ 编辑体验:对象级 requiredPermissions 双模式控件(全部操作 / 按操作 read·create·update·delete),模式互转无损;per-op 切换对 bundled spec 特性探测(≥12.7 自动点亮)。
    • ⑨ 进发布流:usePublishAllDrafts 发布前对待发布草稿跑 validateCapabilityReferences(声明侧 = 已发布∪草稿权限集),告警 toast 呈现;规则特性探测 + 全异常吞掉,advisory、绝不阻断发布。
    • en/zh i18n 齐备;CI 9/9 全绿(Test、Build & E2E、Bundle);590 用例回归通过。

    至此 #2561 地图上 framework + objectui 两侧的可执行项全部收敛:剩余仅 deferred/evidence-gated(⑦ groups+muting、#2571 per-org IP、委派管理、⑥ CEL 能力面、SSO 信任列表 UI polish)与 #1901(等 agent listing 面具备 owner/org 语义)。


    Generated by Claude Code

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

enhancementNew feature or requestpriority:p0Critical: blocker, must ship before MVPsecurity

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions