Skip to content

[Decision] pnpm demo 开箱即用时没有任何账号能打开「我的合同」——要不要让脚本建账号,与 #11 第一问耦合 #28

Description

@hotlong

维护者速读

事情:卡 26(#26 / PR #27)把 120 份种子合同按相对方分给了 §10 的三个「业务承办」,43 / 43 / 34。但开箱即用时这三个账号并不存在,名字解析不到就静默落 NULL,所以 pnpm demo 跑完,「我的合同 › 我发起的」仍然是空的,要等你在 Setup 里建好账号、再跑一次 pnpm demo(数据集是 upsert,会自动交接)才填上。

为什么这不只是「少一步」:实测下来,开箱状态更彻底——pnpm demo 只产出一个账号(dev admin),而 dev admin 不持有任何 clm_* 权限集,GET /api/v1/meta/app/clm 给它返回 navigation: []所以开箱即用时,没有任何一个账号能打开「我的合同」这个分区,跟这张卡改没改都无关。对一个「能直接卖」的产品,这意味着 demo 的第一屏永远要靠一段说明书才能看到。

你要做的:回一个字母。A、B 或 C


选项

A — 维持现状(卡 26 已交付的形态)。 fixture 写好名字,操作者在 Setup 建账号再跑一次;README 写明了三个名字和分配,pnpm demo 结束时也会在终端打出来。
代价:§10 一字未动,没有虚构人物,但第一屏在操作者动手之前是空的。

B — 让 scripts/demo.mjs 自己建这三个账号并各授予 clm_requester 之后 pnpm demo 一条命令就能演示。
代价:§10 说「用户不可种子」约束的是 fixture,脚本不是 fixture——但这仍然是建账号,而且要发明邮箱与密码,那是产品内容不是工程细节。约 40 行,用的两个端点这张卡的验收里已经跑通(POST /api/v1/auth/admin/create-user 加一行 sys_user_permission_set)。

C — 把 #11 第一问判成 B(「我的合同」去掉 clm_requester.access 门控,登录即见),然后让 dev admin 分一份合同。
代价:最省事,但它是另一张卡的决定,而且会掏空 §04/§05 那套 *.access 令牌体系的一致性。

两问为什么耦合

如果 #11 判 B,dev admin 就能看见「我的合同」;而平台的 claimSeedOwnership单次启动下本来就会把 120 份全认领给它(实测 adminPromoted: true, ownershipClaimed: 260)。也就是说 C 一步同时解决两件事,一个新账号都不用建——代价是拿走一个门控开关。

反过来,如果 #11 判 A(我推荐的,也是卡 07 已实现的),那 B 就是让 demo 开箱可用的唯一路子,因为 A 的世界里 dev admin 永远看不到那个分区。

先回 #11 第一问,这一张的答案就基本定了。 单独回这一张也行,但两张一起回只用想一次。

四棱分析

实际业务需求 — 偏 B。这是买家 demo 的第一屏,「跑一条命令就能看到东西」和「先读一页说明书建三个账号」对销售转化不是一个量级。A 的成本全部落在最不该承担成本的人身上——第一次接触这个产品的人。

项目长远合理性 — 偏 A 或 B,明确反对 C。C 用一个门控决定去换 demo 数据的便利,是拿架构换演示,方向反了;§04/§05 整套导航建立在五个 *.access 令牌上,抽掉一个,下一个作者照抄的就是「分区可以不门控」。A 与 B 都不动架构,区别只在这段建账号的代码放在 fixture 外面算不算越界——我认为不算,§10 那句话防的是「种子数据里出现假用户」,脚本在开发机上建演示账号是另一回事。

防 AI 写错 — 偏 B,理由不直观。A 依赖的是操作者照着 README 把名字一字不差地打对Business Requester 1),打错一个字符就静默落 NULL、无报错无告警——这正是这个仓库一直在防的失败形状:一个静默的空结果和一个正确的空结果不可区分。B 把这个交接从人手里拿走,变成代码里的一个常量。

创业阶段不扩散 — 偏 A。B 要发明三个人的邮箱密码,等于 demo 开始携带凭据;一旦发布,这三组凭据就是产品的一部分了。这是 B 唯一的实质代价,也是它必须由你而不是由循环来定的原因。

结论:四棱里三棱偏 B,一棱(不扩散)偏 A,C 被长远合理性明确反对。我推荐 B,并建议账号名换成像真人的名字(Business Requester 1 是我起的占位,卡 26 的 agent 也把这一条列为要你定的)。但 B 要发明产品内容,所以它是你的决定,不是循环的。

影响

不阻塞任何在途卡片。M3 的卡 09–14 都不读这一条。答案影响的是 scripts/demo.mjs、README 那一节,以及(若选 C)src/apps/clm.app.ts 第 81 行。

关联

#26 / PR #27(这一条的来源,fixture 半边已交付)· #11 第一问(耦合的那一半)· #19(另一块空屏:合同版本,另有原因,仍在等裁定)· #18 / PR #21(两次启动交接,也就是无意中关掉归属认领的那次修复)。

Activity

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

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions