这条挡住了 cloud 的所有 framework pin bump(实测:objectstack-ai/cloud#1091,把 pin 从 ad047d2e 挪到 586d6f70 后,verify-objectos-ee-image 立刻红)。
现象
cloud 的 EE 镜像构建里,framework 的 @objectstack/spec build 直接失败:
@objectstack/spec:build: ─── Summary ───
@objectstack/spec:build: Generated: 1654 (135 as input shape)
@objectstack/spec:build: Skipped: 23 (unsupported types: function, date, bigint, custom)
@objectstack/spec:build: ❌ Cannot resolve origin/main to anchor the authorable-surface deletion check (#4650).
@objectstack/spec:build: Deleted baseline lines are validated against authorable-surface.json at the
@objectstack/spec:build: merge base with origin/main — a baseline this commit cannot rewrite. Without
@objectstack/spec:build: that anchor the tombstone gate can be bypassed by hand-editing the file, so
@objectstack/spec:build: this build fails instead of silently skipping the check.
@objectstack/spec:build: Fix: `git fetch origin main` (or point refs/remotes/origin/main at your
@objectstack/spec:build: upstream main) and re-run.
@objectstack/spec:build: ELIFECYCLE Command failed with exit code 1.
@objectstack/spec#build: ERROR command (/repo/objectstack/packages/spec) pnpm run build exited (1)
Tasks: 0 successful, 3 total
Failed: @objectstack/spec#build
归因(已逐条核过,不是推断)
| 检查 |
结果 |
该报错字符串在 cloud 当前 pin ad047d2e 上存在吗 |
不存在(git grep 零命中) |
在 586d6f70 上呢 |
存在于 packages/spec/scripts/build-schemas.ts |
| 同一个 CI job 在别的 cloud PR 上(仍是旧 pin)通过吗 |
全部通过(近 10 次运行只有改 pin 的这次红) |
本地在有 origin/main 远程引用的 framework worktree 里构建 586d6f70 |
通过 —— 所以本地验证看不见它 |
也就是说:闸门是本区间新增的,且只在「没有 origin/main 远程引用」的构建环境里触发。
为什么消费者构建必然踩到
resolveSurfaceBase() 先 git rev-parse origin/main^{commit},失败则自愈式 git fetch --depth=1 origin +refs/heads/main:refs/remotes/origin/main,再失败就 fatal。
cloud(以及任何按 SHA 消费 framework 的下游)拿到的 framework 树来自 actions/checkout@v4 + ref: <pinned SHA>(默认 fetch-depth: 1):只有那一个 commit,没有 refs/remotes/origin/main。cloud 三个 workflow 全是这个形状:
.github/workflows/verify-objectos-ee-image.yml(已实测红)
.github/workflows/pin-smoke.yml
.github/workflows/test.yml
镜像那条更硬:framework 是被 COPY objectstack/ /repo/objectstack/ 抄进 buildx 构建阶段再构建的,自愈 fetch 在那里也没成功。
为什么这不只是「cloud 自己加个 fetch」就完事
可以让 cloud 三处 checkout 都 fetch-depth: 0(或显式 fetch main)绕过去,但那给这个开源产物加了一条很难看的性质:
「构建一个按 SHA 钉死的 @objectstack/spec 发布树,必须能联网访问它自己 main 分支的当前状态。」
这会打断离线 / 气隙构建、fork 构建、以及任何按 tag 复现历史版本的构建——而在这些场景里闸门要防的事根本不存在:树是不可变的、已经合并过的,没有「我这个 PR 相对 main 删了什么」这个问题可问。闸门在消费者构建里既问不出答案,也没有要防的对象。
同时也不该简单加个 SKIP=1 环境变量——那正是 #4650 要堵的旁路。
建议方向(留给维护者定)
- 闸门只在「开发式检出」跑:判据不是环境变量,而是可验证的事实——例如
authorable-surface.json 相对已提交状态有改动、或存在多于一个 commit / 存在分支引用。消费者构建里没有可删的基线,就没有要证明的删除。
- 或者把基线锚点变成树内产物:把 merge-base 那份基线在发布时固化进包内(如
authorable-surface.base.json),让闸门比对树内文件而不是远程分支——保持「PR 改不动的基线」这个性质,同时不依赖网络。
两条都保留 #4650 的防旁路性质;第 2 条对下游最友好。
影响面
- cloud 的
.objectstack-sha 今天无法往前挪到任何含该闸门的 SHA,pin 会一直停在 ad047d2e(现已落后 main 119+ commit),连带 staging 部署与所有等 pin 的 issue(如 cloud#1012)。
- 同样的形状会打到
release-objectos-ee.yml 与 deploy-* 系列(都在 pin 住的 framework 检出上构建镜像)。
出处
cloud#1012 的 pin bump(PR objectstack-ai/cloud#1091,会话 session_015W6nhsDrz6zWQc8je12a1t)。失败 run:https://github.com/objectstack-ai/cloud/actions/runs/30905564626 。未指派,按 Prime Directive #10 归档。
这条挡住了 cloud 的所有 framework pin bump(实测:objectstack-ai/cloud#1091,把 pin 从
ad047d2e挪到586d6f70后,verify-objectos-ee-image立刻红)。现象
cloud 的 EE 镜像构建里,framework 的
@objectstack/specbuild 直接失败:归因(已逐条核过,不是推断)
ad047d2e上存在吗git grep零命中)586d6f70上呢packages/spec/scripts/build-schemas.tsorigin/main远程引用的 framework worktree 里构建586d6f70也就是说:闸门是本区间新增的,且只在「没有
origin/main远程引用」的构建环境里触发。为什么消费者构建必然踩到
resolveSurfaceBase()先git rev-parse origin/main^{commit},失败则自愈式git fetch --depth=1 origin +refs/heads/main:refs/remotes/origin/main,再失败就 fatal。cloud(以及任何按 SHA 消费 framework 的下游)拿到的 framework 树来自
actions/checkout@v4+ref: <pinned SHA>(默认fetch-depth: 1):只有那一个 commit,没有refs/remotes/origin/main。cloud 三个 workflow 全是这个形状:.github/workflows/verify-objectos-ee-image.yml(已实测红).github/workflows/pin-smoke.yml.github/workflows/test.yml镜像那条更硬:framework 是被
COPY objectstack/ /repo/objectstack/抄进 buildx 构建阶段再构建的,自愈 fetch 在那里也没成功。为什么这不只是「cloud 自己加个 fetch」就完事
可以让 cloud 三处 checkout 都
fetch-depth: 0(或显式 fetch main)绕过去,但那给这个开源产物加了一条很难看的性质:「构建一个按 SHA 钉死的
@objectstack/spec发布树,必须能联网访问它自己 main 分支的当前状态。」这会打断离线 / 气隙构建、fork 构建、以及任何按 tag 复现历史版本的构建——而在这些场景里闸门要防的事根本不存在:树是不可变的、已经合并过的,没有「我这个 PR 相对 main 删了什么」这个问题可问。闸门在消费者构建里既问不出答案,也没有要防的对象。
同时也不该简单加个
SKIP=1环境变量——那正是 #4650 要堵的旁路。建议方向(留给维护者定)
authorable-surface.json相对已提交状态有改动、或存在多于一个 commit / 存在分支引用。消费者构建里没有可删的基线,就没有要证明的删除。authorable-surface.base.json),让闸门比对树内文件而不是远程分支——保持「PR 改不动的基线」这个性质,同时不依赖网络。两条都保留 #4650 的防旁路性质;第 2 条对下游最友好。
影响面
.objectstack-sha今天无法往前挪到任何含该闸门的 SHA,pin 会一直停在ad047d2e(现已落后 main 119+ commit),连带 staging 部署与所有等 pin 的 issue(如 cloud#1012)。release-objectos-ee.yml与deploy-*系列(都在 pin 住的 framework 检出上构建镜像)。出处
cloud#1012 的 pin bump(PR objectstack-ai/cloud#1091,会话
session_015W6nhsDrz6zWQc8je12a1t)。失败 run:https://github.com/objectstack-ai/cloud/actions/runs/30905564626 。未指派,按 Prime Directive #10 归档。