Repository navigation
[Decision] @objectstack 17.5.0 升级的第二批取舍:17.5.0 新声明的键在升级 PR 里就地声明,还是记账给各自的卡;以及 better-auth 版本钉退役(被会话分类器拒) #11111
Description
Ruled: 5902351047 · letter decision 3 B (book to owner cards, dated ledger exceptions), decision 4 A (retire the better-auth pin in #11086 on the maintainer's authorisation); executed on objectui#11073 / PR #11086 · 2026-09-30T01:40Z
Filing-gate category: ② — 只有维护者能做的决定。本卡承 objectui#11073(@objectstack/* 17.5.0 升级)第二轮实测带出的两项取舍;objectui#11088(第一批:决策一 A、决策二 A,已由维护者 2026-09-29T13:02Z 裁定并关闭)的执行中新生的问题,按「另立卡并回链已裁卡」规则单开。立卡:domain:devx @ objectui 座位 2(objectui#10917),session_01TdiauJaVCHuj45EzZGUxHh,2026-09-29T13:45Z。PR objectui#11086 head 174c4a7:改动 3927 行,未触受管路径。
维护者速读
- 改了什么:17.5.0 升级 PR(chore(deps): resolve @objectstack/* 17.5.0, and the zod 4.6.5 it requires, in pnpm-lock.yaml (objectui#11073) #11086)已按第一批裁定推进。
- 为什么要你裁:还剩两件规则定不了。
- 决策三:17.5.0 新声明的一批键,objectui 的守卫要求「当场声明」。就地声明会在依赖升级里扩大公开面;不声明就要暂时放宽两道守卫。
- 决策四:better-auth 版本钉按文档应在本次升级里退役,但会话分类器拒了这次改动。
- 席位意见:决策三荐 B(记账给各自的卡);决策四荐 A(你在 chore(deps): resolve @objectstack/* 17.5.0, and the zod 4.6.5 it requires, in pnpm-lock.yaml (objectui#11073) #11086 里做,或明确授权)。
- 你要做的:回一行,例如「决策三 B,决策四 A」。
决策三:17.5.0 新声明了一批键,objectui 两道守卫要求「当场声明」——在升级 PR 里就地声明,还是先记账给各自的卡?
一句话问题:spec 17.5.0 在一批组件上新声明了键(例如三个记录块上的字段安全三件套,看板/日历上的 navigation,按钮类动作上约 50 个输入)。objectui 有两道守卫:
- 一道要求「不许用类型强转去读契约已声明的键」,它的账本被钉为空;
- 一道要求「新出现的差异必须当场声明」,积压上限为 0。
所以升级 PR 不就地声明这些键,就是红的。可就地声明等于在一个依赖升级里扩大公开面约 50 个输入。
实测(dev 在 17.5.0 上测):
- 守卫 9965/9475 红 2 条(
enforceFieldSecurity/redactFields/requiredPermissions,已有卡 objectui#8649); - 注册表对齐测试红 23 条,其中
navigation已有卡 objectui#8652(其解锁条件刚满足); - 另有 10 个 17.5.0 新增的块从未判过,其余键无卡。
Governing text:
references/execution-duties.md原文:「强制条款②:放宽接受集或扩大公开面的卡默认判断档施工;命中即 spec 车道的活」。- 两道守卫各自的正文,dev 已引:9475 的「an entry added here is a declaration that disagrees with itself somewhere … or move the declaration instead」;注册表对齐的「a plain defect and gets declared」,积压上限 0。
选项 × 真实代价
| 选项 | 做什么 | 客户可感知的后果 |
|---|---|---|
| A 就地声明 | 在 #11086 里逐键核渲染器是否真读,然后声明约 50 个输入、删被拒的枚举值、补成员 pin、加载 4 个懒注册块 | 升级晚落地(这是一张卡的工作量)。公开面一次性变大,而且这一批键由升级 PR 顺带决定,不是由各自的卡决定 |
| B 记账给主人卡 | #11086 只把人口数重新钉准。新键逐条记进两道守卫的账本并写明到期,由 objectui#8649、objectui#8652 和本席新立的一张分诊卡各自声明;守卫的「空账本」和「上限 0」在这几张卡落地前暂时放宽 | 升级按时落地、20 张卡解锁。守卫在一段时间内带着具名到期的例外,例外是看得见的,不是静默的 |
| C 等 | #11086 不动,等 spec 车道先把注册表收齐 | 死循环:那张卡需要先装上 17.5.0 |
业务含义直译:
- A = 新车交付时,顺手把 50 个选配件全装上,装哪些由交车员当场定。
- B = 先交车,选配件清单交给各自的负责人去逐项定。
- C = 等选配件定完再交车,但选配件要等车到了才能定。
四轴(业务立场):
- 长远合理性:每个键「声明还是只在运行时用」应由它自己的卡按实测定(契约优先)。在依赖升级里批量声明会把未核实的键写进公开面。B 的例外有具名到期。
- 业务拉动:20 张卡在等升级(实测);这 50 个输入今天没有已知作者在写(未测)。
- 防 AI 犯错:A 可能把渲染器并不兑现的键声明出来(声明而不兑现,正是框架禁止的);B 的差异登记在账、有主人,不静默。
- 创业阶段不扩散:A 一次扩大公开面约 50 个输入;B 只声明各卡核实过的。
os-decision-facets
① 项目长远合理性:B 由各主人卡逐键声明(契约优先);A 在升级里批量声明未核实的键;C 死循环。
② 实际业务拉动:20 张卡等升级(实测);新键的作者拉动未测。
③ 防 AI 犯错:A 有「声明而不兑现」的风险;B 的差异在账、有到期、不静默。
④ 创业阶段不扩散:A 公开面 +约 50;B 只加各卡核实过的。
Prior rulings read: objectui#11073 本席 Q1 裁定(5889581478:条款② 的 burn-down 留在它自己的卡,objectui#10940 同法);ADR none;thread: objectui#11073 报告的 Q9、Q10。
推荐:B,回退 A。只看①选 B;②③④ 是否翻转:否。
置信缺口:放宽守卫的时长取决于三张主人卡的节奏(未定价)。
决策四:live CI 通道的 better-auth 版本钉,要在这次升级里退役——本会话的安全分类器拒绝了这次改动
一句话问题:仓库自己的文档写着「在把 OBJECTSTACK_VERSION 升过上游修复的那个 PR 里退役 BETTER_AUTH_VERSION 和 e2e/live/ci/better-auth-pin.mjs」。#11086 就是那个 PR。dev 做了这项退役,被会话的自动安全分类器以「CI Bypass」拒绝,dev 没有换路重试。本席按规矩 ⛔ 不代做被拒的动作,所以交给你。
实测(dev 读 npm tarball):@objectstack/plugin-auth 17.5.0 已不再 import createLocalAccountIssuer,并把 better-auth / @better-auth/core 钉在正好 1.7.3(17.4.0 钉 1.7.2)。不退役的话,live 通道会在 17.5.0 上强装 1.7.2,而 17.5.0 是按 1.7.3 写的,这恰好是这条通道存在要抓的「错配」。它的校验步骤仍然会通过,因为 1.7.2 也有它检查的那个导出。
Governing text:e2e/live/ci/backend.env 与 content/docs/guide/ci-cd-pipeline.md,原文见 dev 报告 Q11。
选项:
- A:你亲手(或明确授权后由席位派 dev)在 chore(deps): resolve @objectstack/* 17.5.0, and the zod 4.6.5 it requires, in pnpm-lock.yaml (objectui#11073) #11086 里做退役。
- B:chore(deps): resolve @objectstack/* 17.5.0, and the zod 4.6.5 it requires, in pnpm-lock.yaml (objectui#11073) #11086 落地后,紧接着单独开一个小 PR,由你做或授权。
- C:保留钉,不退役。
推荐:A,回退 B。文档写明应随本次升级做;早一天做,live 通道就少一天跑错配的组合。
- 只看①选 A;②③④ 是否翻转:否。
- 置信缺口:授权后分类器是否仍会拒,不知道。若仍拒,只能由你亲手改。
回一行即可,例如「决策三 B,决策四 A」。
Generated by Claude Code
Activity
objectstack-fleet commentedon Sep 29, 2026
决策四补充证据(CI 两次实测):保留 better-auth 钉,live 通道在 17.5.0 上确实起不来。
domain:devx座位 2(objectui#10917),session_01TdiauJaVCHuj45EzZGUxHh,2026-09-29T19:30Z。问题与推荐都不变,下面只补证据和对选项的影响。119f4d3:job109574432026;cdd84c7:job109578265358。objectstack dev --seed-admin --fresh(published 17.5.0,better-auth 被钉到 1.7.2)300 秒内没有就绪。种子管理员登录(admin@objectos.ai)一直答[Better Auth]: User not found,一条 console 测试都没跑。[Auto-Mode Bypass]拒绝,本席不代跑):maybeSeedDevAdmin逐字节相同,dev-admin-seed-gate.tsdiff 为空。plugin-auth在 17.4.0(7e63370)声明整个家族 1.7.2,在 17.5.0(0f6dcac)声明正好 1.7.3。auth-schema-config.ts:103-108写明:1.7.0–1.7.2 的account.issuer必填模型已被 1.7.3 移除,sys_account已没有这一列。backend.env:64-65)写明「在把OBJECTSTACK_VERSION升过上游修复的那个 PR 里退役」,chore(deps): resolve @objectstack/* 17.5.0, and the zod 4.6.5 it requires, in pnpm-lock.yaml (objectui#11073) #11086 就是那个 PR。退役提交推上去后,CI 的 Live E2E 会直接验证它,这正好补上本地复现被拒留下的缺口。main的backend.env就是 17.5.0。在补丁 PR 落地前,每个 PR 的 Live E2E 都会以同样方式变红。这条通道不拦合并,但会在这段时间里失去作用。cdd84c7),types 全套 0 失败。回一行即可,例如「决策三 B,决策四 A」。
objectstack-fleet commentedon Sep 30, 2026
Ruling: batch #246 · decision 3 letter B, decision 4 letter A · maintainer 「11111 同意」 2026-09-30T01:36Z
Director seat (objectstack#12708, summon #30 续 2,
session_01AsCNgFBs8HCjwhyHQsFbx3). Provenance: maintainer, live PM chat with the director seat, 2026-09-30, replying 「11111 同意;20665 业务上需要支持,ENFORCE;20542 同意;5930 v18 启动;20513 A」 to batches #246–#249 as presented; 「同意」 is to the director's recommendation in chat (decision 3: B; decision 4: A), which followed thedomain:devxseat 2 packet (the body) and its added evidence5897202798.Decision 3 — Ruled: B. The keys 17.5.0 newly declares (the three record blocks' field-security trio,
navigation, the ~50 action inputs, the ten never-judged blocks) are booked to their owner cards, not declared in the bump PR. PR objectui#11086 only re-pins the population; every new difference goes into the two guards' ledgers as an entry naming its owner card and an expiry date; the guards' "empty ledger" and "backlog cap 0" are relaxed to a cap equal to the entries listed, never unbounded; objectui#8649, objectui#8652 and one new triage card (the ten blocks and the keys with no card) declare each key by its own measurement; each owner card's landing strikes its entries, and the last one restores the empty ledger and cap 0.Decision 4 — Ruled: A, with the maintainer's authorisation recorded here. The live CI lane's
better-authpin (BETTER_AUTH_VERSIONine2e/live/ci/backend.envande2e/live/ci/better-auth-pin.mjs) is retired in PR objectui#11086, the PR its own text names ("retire in the PR that bumpsOBJECTSTACK_VERSIONpast the upstream fix"). The maintainer's 「11111 同意」 to the presented A is the written authorisation the refused action needed: the seat dispatches the dev to redo the retirement citing this record; if the session's classifier refuses again, the maintainer makes the one deletion by hand. C is measured out (Live E2E red on two heads with the pin kept,5897202798); B would leave every PR's Live E2E red until a follow-up landed.plugin-authdeclares exactly 1.7.3 and dropped the 1.7.2-onlyaccount.issuermodel); keeping it makes the lane test a combination nobody ships.Execution parameters: the objectui#11073 seat runs the ruled patch round on PR #11086 (B's re-pin plus ledger entries with owners and expiries; A's retirement), then a contract-review record at
CONTRACT_REVIEW_TIERon the final head, then ready plus auto-merge once every check is green, Live E2E after the retirement included. objectui#11073 is unblocked by this ruling; objectui#11101 and PR objectui#10278 follow #11086's landing.State:
needs-user-decisionremoved; this card closescompleted(the decisions are made; execution lives on objectui#11073 / PR #11086).