Skip to content

decision: objectui 按提交钉 objectstack(.objectstack-sha),开发与 CI 从该提交的源码构建 @objectstack/*,npm 版本范围与下限只在 objectui 发版时由提交算出 —— 前端不再逐个 PR 等后端发版 #12955

Closed

Description

@objectstack-fleet

Ruled: 6248859734 · letter B · execution cards #12957 (pin and build), #12958 (floors at publish), objectstack-ai/objectstack#24306 (build-console) · dispatched by domain:ui seat 1 on the maintainer's order

Filing gate ②:只有维护者能做的决定。 维护者在 domain:ui seat 1 的会话(session_0188TsgPV8kQXfuRuKmkj2ks)里先问了这个问题,原文:「还有目前前后端互相依赖的方式开发太麻烦了,前端经常要等后端发版本,猴没有更好的方案」。席位给出四个方案并推荐 B,维护者随后写道(原文):「写决策卡 objectui 也改成按提交钉 objectstack:新增 .objectstack-sha,开发和 CI 都从这个提交的源码构建 @objectstack/spec 等包(objectui 只依赖 spec、client、formula、lint 这几个)。npm 版本范围只在 objectui 发版时才起作用,下限也可以在那时按「哪个已发布版本包含这个提交」机械地算出来。」

维护者速读

现在 objectui 从 npm 上的 @objectstack/*@next.N 取后端契约。后端改动合并以后,要等人工发版(2026-08-07 裁定:版本发布必须人工),前端才能开工。等待期间,被搁置的卡和版本下限都要靠人记,今天两样都出了错。

  • A:维持现状。
  • B(维护者提出的方案):objectui 增加 .objectstack-sha。开发和 CI 从这个提交的源码构建所需的 @objectstack/* 包,按提交缓存。npm 版本范围只在 objectui 发版时起作用,下限由「哪个已发布版本包含这个提交」算出。
  • C:objectstack 每次合并都把包发到第三方预览仓库(pkg.pr.new),objectui 按提交 URL 引用。
  • D:objectstack 每次合并都自动往 npm 发 snapshot 版。需要先改 08-07 的人工发版裁定。

推荐 B。回一个字母:A / B / C / D。

一句话问题

后端已经合并的能力,要等下一次人工发版,前端才能开发和上线。一个跨前后端的功能因此至少要多一个发版周期才能到用户手里;等待期间被搁置的工作靠人记,记漏了就是漏发、漏改。

背景与 Governing text

  • 人工发版裁定:objectstack/.github/workflows/release.yml 开头记录了维护者 2026-08-07 的原话:「刚才我也没提出要求,是哪个ai自己替我发了 rc.4,版本发布必须是人工的。这个要写入规范。」ADR-0125 把授权发版的人工动作定为 environment: release 审批。方案 B 和 C 不碰发版;D 与这条裁定直接冲突。
  • 反方向已经按提交钉:objectstack 用 .objectui-sha 加 scripts/bump-objectui.sh(741 行)和 scripts/build-console.sh(435 行)从源码构建 objectui;cloud 也按 .objectstack-sha 钉 objectstack(references/triage-duties.md:28)。只有 objectui → objectstack 这个方向走 npm。
  • console 打包已经注入源码 spec:objectstack#8134 把 framework 自己的 spec 注入 console 包,objectui#4854 加的钩子(PR feat(console): OBJECTSTACK_SPEC_DIST hook so a framework build can bundle its own @objectstack/spec (#4854) #4927,+799/−14)是它的落地,build-console.sh:276-286 的注释写明了要解决的就是「spec 发布 → objectui 刷锁文件 → pin 移动」这三步等待。但 objectui 自己的开发、类型检查和测试仍用 npm 上的 spec。objectstack#9659(把注入扩到另外 4 个包)于 2026-09-23 以 not_planned 关闭,维护者原话「第四组 同意」,理由是实测这 4 个包都不需要注入(2 个与已发布产物逐字节相同,另 2 个的差异 console 用不到)。
  • spec 形状门已从 objectui 移走:objectstack#23238 裁定 B(2026-10-13,维护者「其他同意」)把「拿 objectstack main 编译 objectui」的形状门移到 objectstack,按小时跑,发版前必须过;objectui 删掉了它的副本(objectui#12352)。被否的 D 理由是「把 13 分钟的任务放上 PR 路径,违反两速 CI 规则 1」(objectstack#22998)。这对方案 B 是一条设计约束:按提交构建必须靠提交号缓存,不能每个 PR 都重建。
  • 两速 CI 的原话(objectui#12214):「我觉得能让整个车队提速的方案就是好方案,main 很多天才会发一个版本,我只要确保发版本之前做好各种测试就可以。」
  • objectui AGENTS.md §9 版本号策略:objectui 的 major 与 @objectstack 的 major 保持一致。方案 B 不改这一条。

协议声明: 方案 B 会改 objectui AGENTS.md 里依赖和锁文件的规则,也会改 pm-dispatch 的 Restart-when: 写法:「等 next.N 发布」改成「pin 已包含 」。后者与 objectstack#24276(B 项)一并执行。

前提(每条带复核命令)

  1. objectui 依赖的 @objectstack/* 包。 objectui 在 manifest 里声明 spec、client、formula、lint。但 client 依赖 @objectstack/core,lint 依赖 @objectstack/sdui-parser,所以从源码构建实际要 6 个包:spec、core、client、formula、sdui-parser、lint。
    • 复核:git grep -hoE '"@objectstack/[a-z-]+":' origin/main -- '**/package.json' | sort | uniq -c(objectui);在 objectstack 里 node -e "console.log(require('./packages/client/package.json').dependencies)",lint 同理。
  2. 今天有三张卡在等发版。 objectui#12932、Studio 变更 drawer: on publish, offer 补默认值 per new field that carries a default, through the protocol's opt-in backfill (ruling A on cloud#2924) #12929、approvals B1 closing card (ruling C on objectui#12438): the inbox opens a request on the served sys_approval_request page where the side sheet is, deletes the sheet, and lists each retired pin against its user report #12484 都是 pm:blocked,Blocked-by: objectstack-ai/objectstack#24168(Version Packages PR,2026-10-17T12:12Z 开出,至今未合)。它们的后端部分 586705d85d、1e001c7df、e15897c0f1 已于今天 07:35–08:17Z 合进 objectstack main。
    • 复核:gh api 'repos/objectstack-ai/objectui/issues?labels=pm:blocked&state=open' --jq '.[].number',再逐张读 body 里的 Blocked-by: 行。
  3. 一次发版集中解锁很多卡,是常态。 objectui#11717 一次升到 17.7.0,解锁了 8 张等它的卡。
  4. 发版频率。 npm view @objectstack/spec time:18.0.0-next.0 到 next.3 分别发于 10-13、10-14、10-16、10-17。
  5. 今天的下限事故。 next.3 升级(objectui#12873,PR deps(v18): resolve @objectstack/* 18.0.0-next.3 and follow its contract (objectui#12873) #12887 写「Range floors. None moved.」)漏提了 app-shell 和 plugin-detail 的下限。plugin-detail 那处让 main 的夜检 Spec Range Floors 从 c4dd7078 起变红,changeset:publish 会因此拒绝发版;app-shell 那处是语义缺口,按符号判断的检查看不见。已由 objectui#12943、deps(plugin-detail): raise @object-ui/plugin-detail's @objectstack/spec floor from ^18.0.0-next.1 to ^18.0.0-next.3, the first release that exports the SelectOptionKind its published types reference #12946 修复,预防卡是 objectstack#24276。

选项 × 真实代价 × 工作量

选项 做什么 用户能感到的后果 工作量
A 维持现状 不动 跨前后端的功能,前端部分照旧晚一个发版周期上线;搁置卡和下限继续靠人记 无
B 按提交钉 objectui 增加 .objectstack-sha 和 bump 脚本;开发和 CI 从这个提交构建 6 个包,按提交号缓存,用 pnpm.overrides 指过去;锁文件与 pin 相关的检查跟着调整;发版时由提交算下限,提交还不在任何已发布版本里就不发;objectstack 的 build-console.sh 给 objectui 安装时换成 framework 自己的源码 后端一合并,前端当天就能开发、合并;objectui 对外发布的版本范围总是准的 objectui domain:devx 约 3 个 PR(其中改 .github/workflows/** 的属于 Tier H),objectstack domain:devx 1 个 PR,skills 部分并入 objectstack#24276。先例:反方向的 bump-objectui.sh 741 行和 build-console.sh 435 行;objectui PR #4927(+799/−14);objectui#12250(+236/−148)。发版时算下限这一步无先例
C 预览包 objectstack 每次合并把包发到 pkg.pr.new,objectui 按提交 URL 引用 和 B 一样不用等;依赖链上多了一个第三方服务 objectstack 1 个 PR(Tier H)加安装 GitHub App(维护者操作),objectui 1–2 个 PR。无先例
D 自动 snapshot objectstack 每次合并自动往 npm 发 snapshot 版 不用等;npm 上多出大量自动版本 改 release.yml(Tier H),并先修改 08-07 裁定。无先例;17.0.0-rc.3/rc.4 被自动误发是反面先例

不列:把两个仓库合成一个。它最彻底,但两个大仓库的历史、CI 和门禁迁移成本远超本问题。

业务含义直译

  • A:前端每用一个新零件,都要等后端正式出货一次。
  • B:前后端在同一条流水线上按零件编号对接,只有对外发货时才对版本号。这和 objectstack 取 objectui 的方式一样。
  • C:零件先放进第三方的临时仓库中转。
  • D:后端每改一次都自动正式出货,等于取消「发版必须人工」。

四轴(从业务立场论证)

  • ① 项目长远合理性(领起):B 让三条跨仓依赖(objectstack←objectui、cloud←objectstack、objectui←objectstack)用同一种机制,契约面不增加,也不引入第三方。npm 回到它本来的角色:对外发货的出口。C 多一个外部依赖面;D 推翻一条明确裁定。
    • 终态:两年后,objectui 与 objectstack 应像 Chromium 用 DEPS 文件按 git 修订钉住依赖仓、由 autoroller 滚动那样按提交互钉,版本范围由发版流水线从提交算出。
  • ② 实际业务拉动:今天就有三张卡因此搁置(前提 2);17.7.0 那次一次解锁 8 张(前提 3)。每个跨前后端的功能都会撞上,不是投机需求。
  • ③ 防 AI 犯错:
    • A 出错时用户看到的是静默错误:下限漏提,按符号判断的检查一直绿;被搁置的卡被遗忘,功能没上线也没人知道。
    • B 出错时是响亮的拒绝:pin 不对,PR 的类型检查当场红;发版时 pin 不在任何已发布版本里,算下限这一步给不出答案,发版直接停下。
    • C 的 URL 依赖和 npm 上的版本可能悄悄不一致。D 自动发版出错时,错误版本直接公开发布。
  • ④ 创业阶段不扩散:B 的工作量一次付清;check-spec-range-floors.mjs 在发版时的检查可能随之变得多余,可以退役,不新增门禁。C 和 D 各多一条长期运维的管道。

四棱

os-decision-facets

Prior rulings read: objectstack-sha, pkg.pr.new, snapshot, canary, publish ordering, OBJECTSTACK_SPEC_DIST, spec main shape gate, 发版 → 8 hits (release.yml 2026-08-07 ruling; objectstack#23238 ruling B; objectstack#8134; objectui#4854 / PR #4927; objectstack#9659 not_planned; objectui#12214; objectui#11717; triage-duties.md:28); ADR-0125; thread: none

推荐、回退与置信缺口

  • 推荐 B。回退 A:保持现状,同时执行 objectstack#24276 的 A、B 两项,把漏记的风险降下来。
  • 自检:只看①选 B;②③④ 是否翻转:否。
  • 置信缺口(席位看不见、没测过的):
    1. 在 objectui 的 runner 上从源码构建这 6 个包要多久,没测。旧的 Spec Main Shape Gate 中位数 13.3 分钟,其中还包括编译 objectui(objectui#12214 的实测表)。按提交号缓存后,每次换 pin 只付一次。
    2. pnpm.overrides 指向本地构建的 tarball 后,check:lockfile-integrity 和 check:installed-pin-claims 怎么改,没测。
    3. 循环:objectstack 按 .objectui-sha 构建 objectui,而那个提交的 objectui 又钉着更早的 objectstack。build-console.sh 已经在打包环节注入 framework 自己的 spec;把这种注入扩到安装环节是新做法。
    4. objectui 发 npm 版仍要排在包含该提交的 objectstack 版本之后。等待并没有消失,只是从「每个 PR 都等」移到「每次发版等一次」。

裁后执行


Generated by Claude Code

Activity

  1. objectstack-fleet commented on Oct 18, 2026

    @objectstack-fleet
    ContributorAuthor

    Ruling · letter B · domain:ui seat 1 · session_0188TsgPV8kQXfuRuKmkj2ks · 2026-10-18T10:39Z

    The maintainer, verbatim, in this seat's session:

    • 「12955 同意」
    • 「12955 B」
    • then: 「你负责派发处理相关的issue,包括 objectstack 和 objectui 并测试确认。」

    B — objectui consumes @objectstack/* by commit.

    • .objectstack-sha pins an objectstack main commit.
    • Dev and CI build the six packages objectui needs (spec, core, client, formula, sdui-parser, lint) from that commit's source, cached by the pin.
    • npm ranges matter only at objectui's publish, where each floor is computed as the first published release that contains the pinned commit.

    Not taken: A (keep npm next.N), C (pkg.pr.new previews), D (automatic npm snapshots, which would need the 2026-08-07 human-release ruling amended).

    Execution: domain:ui seat 1 dispatches the related cards in both repositories, on the maintainer's order above, and confirms the result by test. The execution cards follow on this card, then it closes.


    Generated by Claude Code

  2. objectstack-fleet commented on Oct 18, 2026

    @objectstack-fleet
    ContributorAuthor

    Ruled B and handed to execution · domain:ui seat 1 · 2026-10-18T10:44Z

    The ruling is 6248859734. These cards execute it, and domain:ui seat 1 dispatches all three on the maintainer's order:

    1. tooling: objectui consumes @objectstack/* by commit — .objectstack-sha, a bump script, and dev and CI built from that commit's source, cached by the pin (ruling B on objectui#12955, step 1) #12957: the pin, the bump, and dev and CI built from the pinned commit, cached by the pin. It is dispatched first.
    2. tooling: objectui's publish computes each @objectstack/* floor from .objectstack-sha — the first published release that contains the pinned commit — and stops when none does (ruling B on objectui#12955, step 2) #12958: each published @objectstack/* floor is computed from the pin at publish. Blocked-by: objectstack-ai/objectui#12957.
    3. tooling(build-console): when the console build installs objectui at .objectui-sha, objectui's @objectstack/* resolve to this framework tree, not objectui's own .objectstack-sha build (ruling B on objectstack-ai/objectui#12955, step 3) objectstack#24306: build-console.sh makes objectui's install resolve to the framework tree. Blocked-by: objectstack-ai/objectui#12957.

    The seat's verification once they land: the first pin carries 586705d85d, 1e001c7df and e15897c0f1, so objectui#12932, #12929 and #12484 stop waiting on next.4; objectstack's pnpm objectui:refresh builds against an objectui that carries the pin.

    This card closes completed, and needs-user-decision comes off.


    Generated by Claude Code

  3. objectstack-fleet commented on Oct 19, 2026

    @objectstack-fleet
    ContributorAuthor

    Ruling B, verified end to end · domain:ui seat 1 · session_0188TsgPV8kQXfuRuKmkj2ks · 2026-10-19T14:28Z

    The maintainer's order: 「你负责派发处理相关的issue,包括 objectstack 和 objectui 并测试确认。」, then 「你继续负责验证。.objectui-sha 可以升级到最新」. Each leg below was read on the real CI runs, not inferred.

    leg what had to hold landed by reading
    1. objectui consumes @objectstack/* by commit dev and CI build the seven packages from .objectstack-sha's source, cached by the pin, with no npm resolution objectui#12957 → PR #12963 → 749ed760 main CI run 39180840201, all jobs green. Every job ran restore → build at the pin → save, the main-only coverage shards included, and main saved the first cache.
    2. objectstack's console builds an objectui that consumes by commit build-console.sh makes objectui's install resolve all seven to the framework tree (OBJECTSTACK_ROOT) objectstack-ai/objectstack#24306 → PR #24440 → 2be3d7a5e6 Covered by leg 3's run; before the pin moved, main's Console Pin Gate stayed green on the old path (725a5b1311).
    3. objectstack's .objectui-sha moves past leg 1 the first console build from such a pin is green in CI objectstack-ai/objectstack#24457 → PR #24476 → 3b086e76ff (pin objectui 4016370af3c9) Console Pin Gate job 117953834692 on main ce2e08ee3b, green. Its log: Cache not found (a fresh build); installs … by commit — building them here; OBJECTSTACK_ROOT is set: packing @objectstack/* from /home/runner/work/objectstack/objectstack; pack 7 package(s): 9.0s; Lockfile is up to date; dist from objectui@4016370af3c9; stamp and injection checks pass.
    4. The front end takes back-end commits without an npm release objectui's pin moves to an objectstack main commit carrying held back-end work, with no release in between objectui#12971 → PR #13043 → 8aa8e3e1e5 The pin is objectstack main f4755a68a797, carrying 586705d85d, ef65646843, 1e001c7df, e15897c0f1 and adb7910f81. CI on the head: 33 success, 0 failure. Contract review PASS 6268975517. objectui#12932, #12931, #12929, #12484 and #13015 are released the same day, with no npm release involved.

    What this costs, measured:

    Open edges, each carded:


    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

No one assigned

    Labels

    domain:specobjectui spec stream: fix lands on packages/types, schema corpus or spec pin coupling — spec lane

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions