Skip to content

[Decision] 权限集没有模块归属:ADR-0130 §1.3(a) 点名的痛点在分拆后并没有被消掉 —— 允许按包组合,还是明确记录它不在边界范围内? #14457

Closed

Description

@huangyiirene

由分诊席(会话 session_019kDRpB7D2XzVzkaLp57T5D,R+94)自 #14454 拆出。

#14454 同时挂了 pm:queue 与 needs-user-decision —— 而六个 pm 状态是 ONE-OF,同挂会让同一张卡既进可派发库存又进维护者收件箱。它这样挂是因为卡本身确实是混的:第 1、2、4 项是测量与 pin(可直接派),第 3 项要维护者拍板。⇒ 第 3 项拆到这里,#14454 留作可派发的测量卡。⛔ 拆分不改任何事实,原文照录。

事实(逐字来自 #14454 第 3 项)

ADR-0130 §1.3(a) 把 30 行 × 9 列 × 6 套的权限矩阵列为无边界的三个可量化后果之一,并把包边界作为 Studio 一直缺的分组。但权限集天然跨域授权 —— HotCRM 6 套里 4 套横跨 5–6 个模块 —— 它不能住在某个模块里,分拆后矩阵依旧是平的。

来源:hotcrm 分拆方案 objectstack-ai/hotcrm#1448 / PR hotcrm#1449,docs/architecture/module-split-plan.md §「上游缺口」。父单 #14122。

选项(逐字来自 #14454)

  • A. 允许权限集按包组合 —— 模块把自己对象的授权贡献进 app 拥有的角色,类似 navigationContributions。
  • B. 明确记录「权限矩阵不在 ADR-0130 创造的边界范围内」 —— Studio 的分组收益不含它。

两者都要写回 ADR-0130(docs-only 卡另开)。

<!-- os-decision-facets -->
① 项目长远合理性(权重 ≥50%):ADR-0130 的整个卖点是「包边界让 Studio 能分组」,而权限矩阵是它 §1.3(a) 自己点名的三个可量化痛点之一。A 让边界在权限面也成立,ADR 的自陈收益兑现;B 等于承认最痛的那一块不在边界内 —— ADR 的收益打折,而且这个折扣以后每个读 §1.3(a) 的人都要重新发现一次。⚠️ 但 A 新增一个组合机制,声明面 +1,是永久义务;按本轴本义,这一笔要如实记在 A 的账上。
② 实际业务拉动:实测,不是假想 —— HotCRM 6 套权限集里 4 套横跨 5–6 个模块,而分拆方案今天就卡在这一项上定不了稿。这是四轴里唯一有硬数字的一轴。
③ 防 AI 犯错:B 之下,一个 AI 作者面对横跨五个模块的权限集,没有任何结构告诉它新对象的授权该写在哪 —— 它会猜,而猜错是静默的(多授或少授,两个方向都不会响亮拒绝)。A 让「这个对象的授权归哪个模块」有唯一答案。这一轴 A 明显占优。
④ 创业阶段不扩散:B 零新增声明面;A 新增一个组合机制 —— 但 A 复用 navigationContributions 已有的形状,不是从零发明一套,增量比看上去小。

推荐:先量一格再裁,而且那一格本来就要量 —— #14454 第 2 项要为 navigationContributions[].group 钉三条 pin(按目标 app 的 group id 解析 / 贡献进不存在的 group 要可见地失败 / 多包贡献同一 group 由 priority 定序)。三条全绿 ⇒「贡献进别人拥有的容器」这个形状在平台上成立且成本已知,A 的实现≈复刻既有形状,荐 A(①②③ 同向);任一条不成立 ⇒ A 的地基本身没有,只剩 B,而 B 必须把「Studio 的分组收益不含权限矩阵」明确写回 ADR-0130,⛔ 不许默默留着 —— 那正是本卡存在的原因。

⛔ 席位不代裁:A 属功能新增 + ADR 类,双重人工地板。

置信缺口(本分析看不见什么):看不见 ADR-0130 的「Studio 分组」收益对维护者值多少 —— 那是产品判断不是工程判断;也没量过除 HotCRM 之外还有哪些应用存在跨模块权限集,所以②的硬数字只有一个样本。

相关

#14454(测量与 pin 的那三项)· #14122(父单)· ADR-0130 §1.3(a) · objectstack-ai/hotcrm#1448

Generated by Claude Code

Activity

  1. added
    needs-user-decisionBlocked on a maintainer decision — do not dispatch; decision cards only, never on a PR
    domain:specDomain lane — seat card indexed by label:pm:seat
    on Sep 2, 2026
  2. hotlong commented on Sep 2, 2026

    @hotlong
    Contributor

    已裁:取 B(本次发版),A 立为二期卡 —— 本决策卡关闭

    维护者 2026-09-02 在 PM 会话(session_01UHvF5hyiZjnCyExFnfQB8m)对完整四维分析答复「同意」:本次发版按 B——权限集整体留在 type: app 包,ADR-0130 明确记录"权限矩阵不在包边界的收益范围内";A 作为分拆第二阶段立卡,不承诺时间。

    落点:

    本卡的四维分析与推荐保留在此作记录;与维护者裁定的差别只在时序(先 B 后 A,而非以三条 pin 为条件直接选 A),原因是 A 的真实拉力只在「模块单独发布」出现时兑现,第一刀 cpq 仍随 app 一起发。摘 needs-user-decision,关闭。


    Generated by Claude Code

  3. removed
    needs-user-decisionBlocked on a maintainer decision — do not dispatch; decision cards only, never on a PR
    on Sep 2, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    domain:specDomain lane — seat card indexed by label:pm:seatpriority:p2Medium: important, M3

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions