Skip to content

feat(spec): SaveMetaItemResponseSchema 声明保存响应的全集字段 version / seq / state / projectionApplied (#5745) - #5861

Merged
os-zhuang merged 5 commits into
mainfrom
claude/issue-5745-save-meta-response-fields
Aug 6, 2026
Merged

feat(spec): SaveMetaItemResponseSchema 声明保存响应的全集字段 version / seq / state / projectionApplied (#5745)#5861
os-zhuang merged 5 commits into
mainfrom
claude/issue-5745-save-meta-response-fields

Conversation

@os-zhuang

Copy link
Copy Markdown
Contributor

Fixes #5745

#5563 维护者 2026-08-06 附带裁定「先补齐 spec 字段」,把 SaveMetaItemResponseSchema 从真子集补成实现真实返回的全集。本单只做 spec 半边;client.meta.saveItem 的返回类型注解按裁定留给 cli 车道(#5545 家族),packages/client 一行未动。

一、先测产出:逐字段实测表

生产者只有一个:ObjectStackProtocolImplementation.saveMetaItem(packages/metadata-protocol/src/protocol.ts)。REST 路由 PUT /meta/:type/:name 把它的返回值原样交给 res.json()(packages/rest/src/rest-server.ts),所以协议返回即线上响应体,无需另测 REST 层。

实测手段:真实 ObjectQL 引擎 + 真实 protocol(非 stub),覆盖 publish / draft / 注册 projector 三种情形。

字段 实测类型 出现条件 定型 依据
success boolean 恒在 required(原有)
version string,实测形如 sha256: + 64 位十六进制 恒在 required ADR-0008 OCC 令牌;声明为不透明串,格式不入契约
seq number(整数) 恒在 required 元数据事件序号,排序用,非 OCC 令牌
state 'draft' / 'active' 两值 恒在 required,z.enum 取自 mode === 'draft' ? 'draft' : 'active'
projectionApplied { success: boolean; error?: string } 仅当该类型注册了 ADR-0094 mutation projector optional 缺席 = 没有 projector 跑过,不是投影失败
message string 恒在 维持 optional(原有,未动) 不在本单范围

实测原始输出(publish / draft / 带 projector):

A keys : ["success","version","seq","state","message"]
A shape: version = "sha256:7aad99c8d969efb5067fff275fb3e5be7ec90f9cd610d41709fcddbf8c34b1f0"
         seq = 1, state = "active", success = true
B keys : ["success","version","seq","state","message"]   state = "draft"
C keys : ["success","version","seq","projectionApplied","state","message"]
C projection: {"success":false,"error":"boom-from-projector"}

与裁定字段集无出入 —— 四个字段都真实存在,没有多也没有少;差异只在 projectionApplied 是条件性的,已按「以实测收窄」处理为 optional。

二、先证红(方向预先写死)

预定方向:,且形态是「静默 strip」而非「解析报错」—— 因为这些是普通 z.object,Zod 对未声明键的姿态是丢弃、不是拒收。改前在 origin/main 上探针实测:

E input keys  : ["success","message","version","seq","state","projectionApplied"]
E parsed keys : ["success","message"]
E STRIPPED    : ["version","seq","state","projectionApplied"]
E safeParse ok: true          ← 注意:是 true

safeParse 为真而数据消失,是最不容易被发现的失败形态。所以断言必须落在「有没有键被 strip」上,而不是 safeParse 的判定 —— 后者改前改后都是绿的,拿它当断言就是一个永远不会红的空检查(#4984 家族)。

补齐后同一探针转绿,并转正为两处常设测试(见下)。

反向验证

把 schema 改回 origin/main 再跑 conformance,方向与预测一致 —— :

AssertionError: expected [ 'version', 'seq', …(2) ] to deeply equal []
+ [ "version", "seq", "projectionApplied", "state" ]
Tests  3 failed | 2 passed (5)

两个仍绿的用例是应该绿的,如实记录:一个断言「没注册 projector 时 safeParse 绿」(改前改后都绿,正是上面说的那一点),另一个是死代码绊线。

过程中踩到 AGENTS.md §9 陈旧产物陷阱并已修正:第一次回退后测试仍全绿,查出是 packages/spec/dist 没有真正重建(objectql 通过 dist 消费 spec);重建后才拿到上面这份真红。

三、state 收紧连带的生产端类型修正

新声明的 state: z.enum(['draft','active']) 使 ObjectStackProtocolImplementation 不再满足 MetadataProtocol.saveMetaItem(TS2416):对象字面量属性会把两个字面量的三元表达式加宽成 string,于是实现的返回类型说 state: string,而契约说的是它一直在发的那个闭集。

这正是收紧契约要抓的松动 —— 此前消费者拿到的 statestring,把它和拼错的 'publshed' 比较不会有任何类型错误。按 Prime Directive #12 修在生产端,只加一处类型断言,取值不变、运行时行为不变

未采用的替代:把 state 降级为 z.string()z.string().refine(...) 可以完全不动 metadata-protocol,但那是为绕开文件面边界而明知故犯地弱化契约(Prime Directive #5),并且恰好丢掉「在编写期阻止错误」的那一半价值。

⚠️ 越界说明:packages/metadata-protocol 在本单派发时被列为在飞不触面(因 #5672)。实际核对后判断碰撞风险为零 —— #5672 的改动面是 getDiscovery() 的 capabilities 记录,与 saveMetaItem 的返回相隔约 5000 行、属不同函数不同关注点。若 PM 认为仍应回避,可将这一行拆出另派,但 spec 侧的 z.enum 会随之被迫降级。

证据:tsc --noEmit -p packages/metadata-protocol 在本改动下 63 个错误,与 origin/main 基线一致(该包无 typecheck script,是已计量 DEBT 项);只改 spec 而不加这一行则为 64,多出来的正是该 TS2416。

四、随 main 合入的口径更新

合并 origin/main 带进了 PR #5782(#5264):saveMetaItem 的 legacy raw-engine 分支已被删除。这与本单改前的独立实测结论一致(我在合并前也测出该分支不可达:agentNOT_CREATABLE 403 挡在更早位置),并让 required 的依据更干净 —— 从「另一条返回不可达」变成「只有一条返回」。schema 头注释、测试注释、changeset 措辞已相应更新。

因此本单不再另立死代码 finding —— 该发现已由 #5264 / PR #5782 覆盖,尾巴由 #5783 跟踪。

五、测试

  • packages/spec/src/api/protocol.test.ts(+76):schema 侧钉住四字段的存在性、可选性与类型。首个用例断言「真实响应体过 parse 后没有任何键被 strip」,即上面那条改前为红的。
  • packages/objectql/src/save-meta-response-conformance.test.ts(新增,+203):生产者侧 conformance,驱动真实 protocol + 真实 ObjectQL 引擎,断言真实响应零 strip;并用 agentNOT_CREATABLE 钉住 required 所依赖的前提(不存在第二条无回执的写路径)。
验证 结果
pnpm --filter @objectstack/spec test 321 files / 8207 passed
pnpm --filter @objectstack/metadata-protocol test 47 files / 457 passed
pnpm --filter @objectstack/objectql test 127 files / 2084 passed
typecheck(spec / objectql / runtime) 全部 Done
tsc --noEmit -p packages/metadata-protocol 63,与基线一致
pnpm --filter @objectstack/spec check:generated 10/10 up to date
check:nul-bytes + 控制字符自查 PASS,无命中

六、生成物

走 os-regen:authorable-surface.json(+4,恰为本单四键)、content/docs/references/api/protocol.mdx、strictness-ledger counts(api/ 394 → 395,即 projectionApplied 的嵌套对象)。

authorable-surface.base.json重锚漂移已照 #5358 剔除:每次 gen:schema 都会把 baseRev 前移并吸进 mcp / scoping / $icontains / ActionSession:* / hideFields别人的键 —— 本单是加键,锚点不前移,已逐次还原,最终 diff 中该文件为零改动。

七、changeset

@objectstack/spec minor(新增声明字段),正文写消费者视角变化:此前 parse 后四字段被静默 strip 且类型面不可见,此后可见且有类型。


Generated by Claude Code

claude added 3 commits August 6, 2026 08:52
`PUT /api/v1/meta/:type/:name` 一直比 schema 承认的多发字段。声明停在
`{ success, message? }`,而路由实际返回 `{ success, version, seq, state,
message }`(注册了 projector 时还有 `projectionApplied`)—— 契约描述的是真实
响应体的真子集。

因为这些是普通 `z.object`,这个缺口以最安静的方式失败:`safeParse` 保持绿,
未声明的键被静默 strip。改前在 origin/main 上实测:

    raw keys      : ["success","version","seq","state","message"]
    after parse   : ["success","message"]
    STRIPPED      : ["version","seq","state"]
    safeParse ok  : true

`version` 是其中最要紧的一个:它正是 ADR-0008 乐观并发链在用的令牌 —— 下次写入
把它作为 `If-Match` 回传,并发编辑就会得到 409 `metadata_conflict` 而不是被静默
覆盖。此前它在线上被携带却没有契约兜底,于是解析响应的消费者恰好丢掉了 OCC
握手所需的那个值。

逐字段按实测定型(证据见 PR 正文):
- `version: string` required —— 不透明内容哈希,ADR-0008 `If-Match` 令牌
- `seq: number` (int) required —— 元数据事件序号,排序用,不是 OCC 令牌
- `state: 'draft' | 'active'` required —— 落库的生命周期
- `projectionApplied?: { success, error? }` optional —— ADR-0094 投影结果,仅在
  该类型注册了 projector 时出现;缺席表示"没有 projector 跑过",而不是"投影失败"

三个字段定 required 是因为实测生产者恒发,而非假设:`saveMetaItem` 唯一可达的
成功返回是仓储写路径,REST 路由把该对象原样交给 `res.json()`。它的另一个 return
(legacy raw-engine,三者皆无)不可达 —— 其上游 code-only 闸门拒绝的正是能走到
那里的类型。

运行时行为不变:路由本就返回这些字段,且此前没有任何地方用该 schema 解析响应。
`client.meta.saveItem` 的返回类型注解按裁定留给 cli 车道(#5545),以便对着已落地
的契约标注而不是提前撒谎。

测试:
- `packages/spec/src/api/protocol.test.ts` —— schema 侧钉住四字段的存在性、
  可选性与类型;断言落在"解析后没有键被 strip"上,而不是 `safeParse` 的判定
  (后者改前改后都是绿的,正是本单要修的静默失败形态)
- `packages/objectql/src/save-meta-response-conformance.test.ts` —— 生产者侧
  conformance:驱动真实 protocol + 真实 ObjectQL 引擎,断言真实响应体过 schema
  零 strip,并用 `agent` → NOT_CREATABLE 钉住"legacy 返回不可达"这条 required
  的前提

反向验证(方向预先写死为红,实测吻合):把 schema 改回 origin/main 后
conformance 3/5 转红,stripped keys 为 `["version","seq","projectionApplied",
"state"]`;仍绿的两例分别是"safeParse 恒绿"与死代码绊线,符合预期。

生成物走 os-regen;`authorable-surface.base.json` 的重锚漂移按 #5358 剔除
(本单是加键,锚点不前移)。

Fixes #5745

Co-Authored-By: Claude <noreply@anthropic.com>
合并 origin/main 后带进 PR #5782(#5264):`saveMetaItem` 的 legacy raw-engine
分支已被删除,现在只剩唯一一个成功 return。这与本单改前的独立实测结论一致,
并且让 `version` / `seq` / `state` 定 required 的依据更干净 —— 不再是"另一条
返回不可达",而是"只有一条返回"。相应更新 schema 头注释、conformance 测试注释
与 changeset 的措辞。

同时,新声明的 `state: z.enum(['draft','active'])` 让
`ObjectStackProtocolImplementation` 不再满足 `MetadataProtocol.saveMetaItem`
(TS2416):对象字面量属性会把两个字面量的三元表达式**加宽成 `string`**,所以
实现的返回类型说 `state: string`,而契约现在说的是它一直在发的那个闭集。

这正是收紧契约要抓的松动:此前消费者读到的 `state` 是 `string`,把它和拼错的
`'publshed'` 比较不会有任何类型错误。修在生产端(Prime Directive #12 契约优先),
只加一处类型断言,**取值不变、运行时行为不变**。

未采用的替代方案:把 spec 里的 `state` 降级为 `z.string()` 或
`z.string().refine(...)` 就能不动 metadata-protocol,但那是为了绕过文件面边界而
明知故犯地弱化契约(Prime Directive #5「不要 workaround」),且恰好丢掉在编写期
阻止错误的那一半价值。

证据:`tsc --noEmit -p packages/metadata-protocol` 在本改动下为 **63** 个错误,
与 origin/main 基线一致(该包无 typecheck script,是已计量 DEBT 项);若只改 spec
而不加这一行则为 64 —— 多出来的正是上述 TS2416。

Co-Authored-By: Claude <noreply@anthropic.com>
@vercel

vercel Bot commented Aug 6, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

1 Skipped Deployment
Project Deployment Actions Updated (UTC)
objectstack Ignored Ignored Aug 6, 2026 10:19am

Request Review

@github-actions github-actions Bot added the size/m label Aug 6, 2026
@github-actions

github-actions Bot commented Aug 6, 2026

Copy link
Copy Markdown
Contributor

📓 Docs Drift Check

This PR changes 2 package(s): @objectstack/metadata-protocol, @objectstack/spec.

110 hand-written doc(s) reference the affected code and may need an implementation-accuracy re-verification:

  • content/docs/ai/agents.mdx (via @objectstack/spec)
  • content/docs/ai/skills-reference.mdx (via @objectstack/spec)
  • content/docs/ai/skills.mdx (via @objectstack/spec)
  • content/docs/api/client-sdk.mdx (via @objectstack/spec)
  • content/docs/api/environment-routing.mdx (via @objectstack/spec)
  • content/docs/api/error-catalog.mdx (via @objectstack/spec)
  • content/docs/api/error-handling-client.mdx (via @objectstack/spec)
  • content/docs/api/error-handling-server.mdx (via @objectstack/spec)
  • content/docs/api/index.mdx (via @objectstack/spec)
  • content/docs/automation/approvals.mdx (via @objectstack/spec)
  • content/docs/automation/connectors.mdx (via @objectstack/spec)
  • content/docs/automation/flows.mdx (via @objectstack/spec)
  • content/docs/automation/hook-bodies.mdx (via packages/spec)
  • content/docs/automation/hooks.mdx (via @objectstack/spec)
  • content/docs/automation/index.mdx (via @objectstack/spec)
  • content/docs/automation/webhooks.mdx (via @objectstack/spec)
  • content/docs/automation/workflows.mdx (via @objectstack/spec)
  • content/docs/concepts/architecture.mdx (via @objectstack/spec)
  • content/docs/concepts/design-principles.mdx (via packages/spec)
  • content/docs/concepts/index.mdx (via @objectstack/spec)
  • content/docs/concepts/metadata-driven.mdx (via @objectstack/spec)
  • content/docs/concepts/metadata-lifecycle.mdx (via @objectstack/metadata-protocol, packages/spec)
  • content/docs/concepts/north-star.mdx (via @objectstack/spec)
  • content/docs/data-modeling/analytics.mdx (via @objectstack/spec)
  • content/docs/data-modeling/drivers.mdx (via @objectstack/spec)
  • content/docs/data-modeling/external-datasources.mdx (via @objectstack/spec)
  • content/docs/data-modeling/field-types.mdx (via @objectstack/spec)
  • content/docs/data-modeling/fields.mdx (via @objectstack/spec)
  • content/docs/data-modeling/formulas.mdx (via @objectstack/spec)
  • content/docs/data-modeling/index.mdx (via @objectstack/spec)
  • content/docs/data-modeling/objects.mdx (via @objectstack/spec)
  • content/docs/data-modeling/queries.mdx (via @objectstack/spec)
  • content/docs/data-modeling/schema-design.mdx (via @objectstack/spec)
  • content/docs/data-modeling/seed-data.mdx (via @objectstack/spec)
  • content/docs/data-modeling/validation-rules.mdx (via @objectstack/spec)
  • content/docs/data-modeling/validation.mdx (via @objectstack/spec)
  • content/docs/deployment/cli.mdx (via @objectstack/spec)
  • content/docs/deployment/tenancy-modes.mdx (via @objectstack/spec)
  • content/docs/deployment/troubleshooting.mdx (via @objectstack/spec)
  • content/docs/deployment/validating-metadata.mdx (via @objectstack/spec)
  • content/docs/getting-started/build-with-claude-code.mdx (via @objectstack/spec)
  • content/docs/getting-started/common-patterns.mdx (via @objectstack/spec)
  • content/docs/getting-started/examples.mdx (via @objectstack/spec)
  • content/docs/getting-started/quick-reference.mdx (via @objectstack/spec)
  • content/docs/getting-started/quick-start.mdx (via @objectstack/spec)
  • content/docs/getting-started/your-first-project.mdx (via @objectstack/spec)
  • content/docs/kernel/cluster.mdx (via @objectstack/spec)
  • content/docs/kernel/contracts/auth-service.mdx (via packages/spec)
  • content/docs/kernel/contracts/cache-service.mdx (via packages/spec)
  • content/docs/kernel/contracts/data-engine.mdx (via @objectstack/spec)
  • content/docs/kernel/contracts/index.mdx (via @objectstack/spec)
  • content/docs/kernel/contracts/metadata-service.mdx (via packages/spec)
  • content/docs/kernel/contracts/storage-service.mdx (via packages/spec)
  • content/docs/kernel/index.mdx (via packages/spec)
  • content/docs/kernel/runtime-services/email-service.mdx (via packages/spec)
  • content/docs/kernel/runtime-services/index.mdx (via packages/spec)
  • content/docs/kernel/runtime-services/queue-service.mdx (via packages/spec)
  • content/docs/kernel/runtime-services/sharing-service.mdx (via packages/spec)
  • content/docs/kernel/runtime-services/sms-service.mdx (via packages/spec)
  • content/docs/kernel/runtime-services/storage-service.mdx (via packages/spec)
  • content/docs/kernel/services-checklist.mdx (via @objectstack/metadata-protocol, @objectstack/spec)
  • content/docs/kernel/services.mdx (via @objectstack/spec)
  • content/docs/permissions/authorization.mdx (via @objectstack/spec)
  • content/docs/permissions/permission-sets.mdx (via @objectstack/spec)
  • content/docs/permissions/permissions-matrix.mdx (via @objectstack/spec)
  • content/docs/permissions/positions.mdx (via @objectstack/spec)
  • content/docs/permissions/rls.mdx (via @objectstack/spec)
  • content/docs/permissions/sharing-rules.mdx (via @objectstack/spec)
  • content/docs/plugins/adding-a-metadata-type.mdx (via @objectstack/spec)
  • content/docs/plugins/development.mdx (via @objectstack/spec)
  • content/docs/plugins/index.mdx (via @objectstack/spec)
  • content/docs/plugins/packages.mdx (via @objectstack/spec)
  • content/docs/protocol/backward-compatibility.mdx (via @objectstack/spec)
  • content/docs/protocol/diagram.mdx (via packages/spec)
  • content/docs/protocol/kernel/config-resolution.mdx (via @objectstack/spec)
  • content/docs/protocol/kernel/http-protocol.mdx (via @objectstack/spec)
  • content/docs/protocol/kernel/i18n-standard.mdx (via @objectstack/spec)
  • content/docs/protocol/kernel/index.mdx (via @objectstack/spec)
  • content/docs/protocol/kernel/lifecycle.mdx (via @objectstack/spec)
  • content/docs/protocol/kernel/plugin-spec.mdx (via @objectstack/spec)
  • content/docs/protocol/knowledge.mdx (via @objectstack/spec)
  • content/docs/protocol/objectql/index.mdx (via @objectstack/spec)
  • content/docs/protocol/objectql/query-syntax.mdx (via @objectstack/spec)
  • content/docs/protocol/objectql/schema.mdx (via @objectstack/spec)
  • content/docs/protocol/objectql/security.mdx (via packages/spec)
  • content/docs/protocol/objectql/state-machine.mdx (via @objectstack/spec)
  • content/docs/protocol/objectui/actions.mdx (via @objectstack/spec)
  • content/docs/protocol/objectui/concept.mdx (via @objectstack/spec)
  • content/docs/protocol/objectui/index.mdx (via @objectstack/spec)
  • content/docs/protocol/objectui/layout-dsl.mdx (via @objectstack/spec)
  • content/docs/protocol/objectui/record-alert.mdx (via @objectstack/spec)
  • content/docs/protocol/objectui/widget-contract.mdx (via @objectstack/spec)
  • content/docs/releases/implementation-status.mdx (via @objectstack/spec)
  • content/docs/releases/index.mdx (via @objectstack/spec)
  • content/docs/releases/v12.mdx (via @objectstack/spec)
  • content/docs/releases/v13.mdx (via @objectstack/spec)
  • content/docs/releases/v16.mdx (via @objectstack/spec)
  • content/docs/releases/v17.mdx (via @objectstack/spec)
  • content/docs/releases/v9.mdx (via @objectstack/metadata-protocol, @objectstack/spec)
  • content/docs/ui/actions.mdx (via @objectstack/spec)
  • content/docs/ui/apps.mdx (via @objectstack/spec)
  • content/docs/ui/create-vs-edit-form.mdx (via @objectstack/spec)
  • content/docs/ui/dashboards.mdx (via @objectstack/spec)
  • content/docs/ui/field-grouping-and-order.mdx (via @objectstack/spec)
  • content/docs/ui/forms.mdx (via @objectstack/spec)
  • content/docs/ui/index.mdx (via @objectstack/spec)
  • content/docs/ui/public-data-collection.mdx (via @objectstack/spec)
  • content/docs/ui/setup-app.mdx (via @objectstack/spec)
  • content/docs/ui/translations.mdx (via @objectstack/spec)
  • content/docs/ui/views.mdx (via @objectstack/spec)

Advisory only. To re-verify, run the docs-accuracy-audit workflow scoped to these files:
node scripts/docs-audit/affected-docs.mjs origin/main → pass the list as args.docs.

@github-actions github-actions Bot added documentation Improvements or additions to documentation tests tooling labels Aug 6, 2026
@os-zhuang
os-zhuang marked this pull request as ready for review August 6, 2026 09:48
@os-zhuang
os-zhuang added this pull request to the merge queue Aug 6, 2026
@github-actions

github-actions Bot commented Aug 6, 2026

Copy link
Copy Markdown
Contributor

⛔ merge queue 构建失败 — 先分诊,再决定要不要重排

队列构建 31090703275 红了。队列跑的是全量套件(PR 侧 CI 只跑 affected 子集),
所以失败的测试可能在本 PR 没碰过的包里 —— 那不是重排能修的。每次盲目重排都会让排在后面的所有 PR 重建一轮。

失败的 job(日志抽取,best effort):

  • Test Core (1/3) — 失败步骤: Run this shard's tests

    �[41m�[1m FAIL �[22m�[49m scripts/strictness-ledger-doc.test.ts�[2m > �[22mthe ledger and the generated counts agree�[2m > �[22mis checked in current — the artifact on disk equals a fresh render
    

历史信号:

  • 本 PR 过去 24h 无队列失败记录(首次)。
  • 过去 24h 队列共有 16 个失败构建(不含本次)。

分诊清单:

  1. 失败测试在本 PR 改动的包里 → 真回归,修 PR。
  2. 失败测试与本 PR 无关 → 在其他 PR 的同类评论里搜同名测试;出现过 ⇒ flaky 实锤,开 issue 修/隔离那条测试。修好前重排只会再烧一轮全队列。
  3. 两者都不是 → 可能与同组 PR 语义冲突;等前面的 PR 落地或失败出队后再重排一次即可,不要连续重排。

Generated by Claude Code · merge-queue-triage workflow (#4859)

@github-merge-queue
github-merge-queue Bot removed this pull request from the merge queue due to failed status checks Aug 6, 2026
claude added 2 commits August 6, 2026 10:03
…ble-surface)

#5861 被合并队列踢出,签名是 `strictness-ledger-doc.test.ts > is checked in current`。
归因:#5849 / #5857 在入队前合入 main(#5857 给 `api/` 新增了一个 z.object 站点),
本分支的 counts.md 是在旧树上渲染的,合并树上不再等于现渲染 —— 单体生成物的串行税
(#5837 正在治的病),不是实现回归。

在合并树上重跑 os-regen:`api/` 站点数 395 → 396(main 的 +1 与本单 `projectionApplied`
嵌套对象的 +1),docs 与 authorable-surface 一并重渲。相对 origin/main 的净增量仍只有
本单四个键。`authorable-surface.base.json` 本轮无重锚漂移(已核对与 main 一致)。

Co-Authored-By: Claude <noreply@anthropic.com>

Copy link
Copy Markdown
Contributor Author

重新入队就绪(生成物随 main 重渲,非实现改动)

被踢出签名 strictness-ledger-doc.test.ts > is checked in current 已复现并修好。归因与 PM 判断一致:#5849 / #5857 在本 PR 入队前合入 main(#5857api/ 新增了一个 z.object 站点),本分支的 counts.md 是在旧树上渲染的,合并树上不再等于现渲染 —— 单体生成物的串行税(#5837 正在治的病),不是实现回归

处置(os-regen 循环,在合并树上跑):

复跑结果:

验证 结果
strictness-ledger-doc.test.ts + src/api/protocol.test.ts 2 files / 48 passed
save-meta-response-conformance.test.ts 5 passed
pnpm --filter @objectstack/spec test 321 files / 8229 passed
pnpm --filter @objectstack/metadata-protocol test 47 files / 461 passed
pnpm --filter @objectstack/objectql test 127 files / 2084 passed
check:generated 10/10 up to date
check:nul-bytes PASS

相对 origin/main 的净增量未变(8 files / +401 / −2):authorable-surface.json 仍只有本单四个键,counts.md 一行,protocol.mdx 四行。


Generated by Claude Code

@os-zhuang
os-zhuang enabled auto-merge August 6, 2026 10:20

Copy link
Copy Markdown
Contributor Author

队列管家让行(Routine pm-queue-steward,第 4 轮巡检,2026-08-06 10:20Z)

本 PR 09:49Z 被队列踢出(run 31090703275 + 31090703357)。本座位按完整日志归档独立认签名,结论与车道 10:19Z 那条回报一致:生成物计数基漂移,非实现回归。⇒ 车道已在处置,本座位让行 —— 不重投、不入队、不做任何队列动作。留此一行只为审计闭环,外加补一条车道视野外的队列层读数。

签名(两个 job 同一根因)

  • CITest Core (1/3)Run this shard's testsFAIL scripts/strictness-ledger-doc.test.ts > the ledger and the generated counts agree > is checked in current139:68- | api/ | 396 | / + | api/ | 395 |;turbo 汇总行 Failed: @objectstack/spec#test(相邻的 service-i18n / trigger-api 输出是并发进程,非因果)。同 job 的 check-test-completeness: OK (8898 tests) 是绿的 —— 又一次「completeness 绿 ≠ 测试过」。
  • Spec Liveness CheckCheck the strictness ledger matches the code✗ strictness ledger: 1 drift(s),同一行 api/ 395 vs 396。

连坐清单(车道视野外的读数):同一签名还踢出过 #5865(run 31091255496 / 31091255193,09:57Z,基 1b234bed = 本 PR 的结果 sha,失败步骤同为 Check the strictness ledger matches the code)。本 PR 出队后,#5865 原封不动在干净基 aac90a5 上一次通过并落地(10:01Z)⇒ 干净对分,红的归属确为本 PR 侧的生成物计数,#5865 无需任何处置。窗口内无第三个受连坐的 PR。

⚠️ 该签名天然带连坐性,值得记一笔counts.md加总型生成物——两个各自 +1 的 PR 会各自写 395、文本零冲突(连 os-regen 驱动都不必登场),只有在合并树上重渲才暴露 396。凡在飞 PR 新增 api/ 站点者同形,落地顺序决定谁踩上。系统性治法已在 #5837 在案;本座位已就该签名向锚点单 #5810 提请人工升级台账(⛔ 不自行加表)。


Generated by Claude Code

@os-zhuang
os-zhuang added this pull request to the merge queue Aug 6, 2026
Merged via the queue into main with commit 5c94f83 Aug 6, 2026
25 checks passed
@os-zhuang
os-zhuang deleted the claude/issue-5745-save-meta-response-fields branch August 6, 2026 10:43
baozhoutao pushed a commit that referenced this pull request Aug 6, 2026
第三次基漂移,签名同前:335 是在推上校准提交那一刻冻结的,而 #5861
(SaveMetaItemResponseSchema,#5745)几乎同分钟落地。合并 c15fcee 后实测 339,
+4 全部集中在该 PR 新增的 src/save-meta-response-conformance.test.ts 一个文件:

- :115  TS2554  Expected 2-5 arguments, but got 1
- :119  TS6133  'LOG' is declared but its value is never read
- :119  TS2304  Cannot find name 'appendFileSync'
- :119  TS2304  Cannot find name 'OUT'

tests 126 -> 127。其余 33 条纹丝不动(合计 2022 raw errors,无一超出记录值,也没有
一行 can-be-lowered —— 34 条全部与实测严格相等)。

那两条 TS2304 已在 note 里点名:名字都解析不到,那一行根本跑不起来,不是类型讲究
问题 —— 但那是 #5861 自己要修的,不是本台账要修的,所以只记录、不代修。

按非确定性假说已证伪(前一轮双跑逐字节相同),本轮不再双跑。

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01559M8FVm6W6vDLABL3jvdW
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentation Improvements or additions to documentation size/m tests tooling

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[#5563 附带裁决] SaveMetaItemResponseSchema 补齐实现实际返回的字段(version / seq / state / projectionApplied)

2 participants