Skip to content
This repository was archived by the owner on Nov 4, 2026. It is now read-only.
This repository was archived by the owner on Nov 4, 2026. It is now read-only.

[Decision] @objectstack 17.5.0 升级的第二批取舍:17.5.0 新声明的键在升级 PR 里就地声明,还是记账给各自的卡;以及 better-auth 版本钉退役(被会话分类器拒) #11111

Closed

Description

@objectstack-fleet

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 新声明了一批键,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,回退 B。文档写明应随本次升级做;早一天做,live 通道就少一天跑错配的组合。

  • 只看①选 A;②③④ 是否翻转:否。
  • 置信缺口:授权后分类器是否仍会拒,不知道。若仍拒,只能由你亲手改。

回一行即可,例如「决策三 B,决策四 A」。


Generated by Claude Code

Activity

  1. objectstack-fleet commented on Sep 29, 2026

    @objectstack-fleet
    ContributorAuthor

    决策四补充证据(CI 两次实测):保留 better-auth 钉,live 通道在 17.5.0 上确实起不来。domain:devx 座位 2(objectui#10917),session_01TdiauJaVCHuj45EzZGUxHh,2026-09-29T19:30Z。问题与推荐都不变,下面只补证据和对选项的影响。

    回一行即可,例如「决策三 B,决策四 A」。

  2. objectstack-fleet commented on Sep 30, 2026

    @objectstack-fleet
    ContributorAuthor

    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 the domain:devx seat 2 packet (the body) and its added evidence 5897202798.

    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.

    • Long-term: whether a key is declared or only used at runtime is each key's own card's call, by measurement (contract first); a dependency bump that batch-declares ~50 unverified inputs writes keys into the public surface that the renderers may not honour.
    • Real use: twenty cards wait on the bump (measured); the ~50 inputs have no known author today (unmeasured).
    • AI-safety: A risks "declared, not delivered"; B's differences are on the books, owned, dated — visible, not silent.
    • Startup scope: B adds only what each card verifies.

    Decision 4 — Ruled: A, with the maintainer's authorisation recorded here. The live CI lane's better-auth pin (BETTER_AUTH_VERSION in e2e/live/ci/backend.env and e2e/live/ci/better-auth-pin.mjs) is retired in PR objectui#11086, the PR its own text names ("retire in the PR that bumps OBJECTSTACK_VERSION past 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.

    • Long-term: the pin's reason is gone (17.5.0's plugin-auth declares exactly 1.7.3 and dropped the 1.7.2-only account.issuer model); keeping it makes the lane test a combination nobody ships.
    • AI-safety: with the pin, the lane goes green on a mismatch it exists to catch — silent; without it, the lane tests the real combination.

    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_TIER on 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-decision removed; this card closes completed (the decisions are made; execution lives on objectui#11073 / PR #11086).

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:devxobjectui devx stream: fix lands on .github/, scripts/ or release pipeline — devx lane cross-repopriority:p2

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions