Skip to content

test(core,metadata,platform-objects): #5619 解锁的另外 6 条各接一行 pin,基线整条删除 (#5855) - #5910

Merged
baozhoutao merged 2 commits into
mainfrom
claude/issue-5855-wire-remaining-six-entries
Aug 6, 2026
Merged

test(core,metadata,platform-objects): #5619 解锁的另外 6 条各接一行 pin,基线整条删除 (#5855)#5910
baozhoutao merged 2 commits into
mainfrom
claude/issue-5855-wire-remaining-six-entries

Conversation

@baozhoutao

Copy link
Copy Markdown
Contributor

Fixes #5855

#5619(PR #5871,51a587d97)把 assertEngineDeleteDispatch / assertEngineUpdateDispatch 下沉到 @objectstack/metadata-core —— 一个既不依赖 @objectstack/objectql、也不依赖本单这三个包的包。那次下沉解除的不只是 metadata-protocol 那 26 条:基线里另有 6 条 (file, verb) 条目卡在同一个环上,现在各剩一行 pin。本 PR 就是这 6 行。

前提核验(⛔ 不沿用立单时的清单,重读 origin/main 现测)

立单时的结论是在 #5619 的 worktree 上测的,按分诊座位的明令在 origin/main(7b005b4)上逐条重测:

条目 verb origin/main 基线现状 剩余动作(实测)
packages/core/src/utils/migration-journal.test.ts delete + update 在 DEBT,closes 已改写为「阻塞已解除」并指向本单 加 devDependency
packages/metadata/src/migrations/migrate-sys-notification-to-event.test.ts delete + update 同上 零配置(dependencies 已含 metadata-core)
packages/platform-objects/src/plugin.test.ts update 同上 零配置
packages/platform-objects/src/system/migration-flag.test.ts update 同上 零配置

前提成立,一字未变:6 条都在、verb 与立单一致、三个包的依赖现状与立单描述一致。谓词的最终导出名与 arity 以 packages/metadata-core/src/index.ts 现测为准 —— 构建产物上 assertEngineDeleteDispatch.length === 1assertEngineUpdateDispatch.length === 2,即 assertEngineDeleteDispatch(options) / assertEngineUpdateDispatch(data, options)

@objectstack/core 的 devDep 判据自己重测了一次(⛔ 不引用立单的测量):加上这条边之后

$ npx turbo run build --filter=@objectstack/core --dry
(无 circular / cyclic 输出)
tasks: ['@objectstack/core#build', '@objectstack/metadata-core#build', '@objectstack/spec#build']

顺带确认 CI 顺序也是对的 —— turbo 的 test 任务 dependsOn: ["^build"],所以 @objectstack/core#test 现在依赖 @objectstack/metadata-core#build,不会出现「测试跑在未构建的 dist 上」。

改了什么

  1. 四个 fake 引擎的写谓词接到生产者自己的判定上,一律以 assertEngineDeleteDispatch(options) / assertEngineUpdateDispatch(data, options) 开头,⛔ 无一处手抄 if (!where?.id && !multi)(feat(plugin-email): 邮件投递接入持久化队列 —— send 走 email.send.async / sys_job_queue,三门可配置 (#5160) #5173 / fix(plugin-email): sys_email 的 queued 行在启动时被清扫,drain 失败升为 error (#5161) #5191 / fix(service-queue,platform-objects): sys_job_queue 的 completed 行按声明式 retention 到期即清(#5179) #5192 / fix(runtime): callData 的 ObjectQL 兜底对「记录不存在」统一答 404 RECORD_NOT_FOUND (#5138) #5584 各烧掉一轮 CI 的写法);导入一律来自 @objectstack/metadata-core,不是 @objectstack/objectql(反向边就是 turbo 拒绝的那个环)。
  2. @objectstack/core 新增 devDependency @objectstack/metadata-core: workspace:*。lockfile 只有该 devDep 引起的 3 行增量,⛔ 无全量重解析。
  3. 基线删掉这 6 条整条

三个 fake 的 update 调用点都传标量真值 data.id(迁移 id / 通知行 id),即 by-id;packages/coreplugin.test.ts 的两处则根本没有路径驱动到该谓词,pin 之后仍保持原样(not used / {}),只是把「有朝一日有人从这里写」的那扇门提前关上 —— 这正是 #5629 记录的 dormant-not-harmless。

计数(改前读数在 origin/main 上现测)

改前 改后
基线 entries 141 135
gate pinned 64 70
gate DEBT 139 133
gate exempt 2 2

反向验证(方向先预测,后运行)

预测:把已接线的 migration-flag.test.ts 里那行谓词调用临时拿掉,该 (file, verb) 就成了「无守卫的替身 + 基线里已无条目」,门禁必须在 PINNED 不变量上报红并点名它。运行结果与预测一致:

x PINNED [update]: packages/platform-objects/src/system/migration-flag.test.ts declares 1 engine
  double(s) whose update() does not route through assertEngineUpdateDispatch (line 26). ...
  Open the fake's update with `assertEngineUpdateDispatch(data, options)` from
  '@objectstack/metadata-core' (where the predicate lives since #5619) ...

恢复该行后门禁退出码 0。

验证

$ node scripts/check-engine-double-contract.mjs   # 含 --self-test
check-engine-double-contract: OK — 70 pinned, 133 in the DEBT ledger, 2 exempt.

$ pnpm --filter @objectstack/core --filter @objectstack/metadata --filter @objectstack/platform-objects test
packages/core test:              Test Files  27 passed (27)   Tests  498 passed (498)
packages/metadata test:          Test Files  25 passed (25)   Tests  508 passed (508)
packages/platform-objects test:  Test Files   9 passed (9)    Tests  266 passed (266)

$ pnpm --filter @objectstack/platform-objects typecheck    # tsc --noEmit,通过
$ pnpm check:nul-bytes                # OK(5706 个文件,无裸控制字节)
$ pnpm check:type-check-coverage      # OK(core / metadata 无 typecheck 脚本属既有 DEBT,本 PR 未改变)
$ pnpm check:published-files          # OK(devDep 不进发布面)
$ npx eslint 四个测试文件               # 0 problems

以上均已在 git merge origin/main(⛔ 未 rebase)之后重跑一遍,合入的是纯文档提交,与本 PR 文件面无交集。

在飞同族(#5748)

#5748 正在把 data.id 的判定翻面(维护者裁 A:data.id 同过标量测试)。⛔ 本 PR 不碰 metadata-core 源码。推送前复核了 git log origin/main -- packages/metadata-core/src/engine-update-dispatch.ts scripts/engine-double-contract.baseline.json,最新一笔仍是 51a587d(#5871),期间无在飞变更落地。

本 PR 的 fixture 无一驱动「非标量 data.id」形状 —— 四处要么不调用 update,要么传标量字符串 id,在裁决 A 下仍判 by-id,语义翻面不会让任何一条用例变红。反过来说,pin 之后这 4 处会自动继承 #5748 的修法,不需要再逐个改 —— 这正是「导入生产者的判定」相对「手抄一份」的收益。

changeset:建议 skip-changeset

本 PR 的文件面是测试 + 一条 devDependency + 基线数据文件,无任何用户可见行为变化:

  • 四个改动文件全是 *.test.ts,不进任何包的发布产物(check:published-files 绿,files 白名单只有 dist);
  • @objectstack/core 加的是 devDependency —— 消费者安装时不解析,不构成对外依赖契约的变化,发不出有意义的 release note;
  • scripts/engine-double-contract.baseline.json 是门禁台账,不是运行时。

故未加 .changeset/*.md,并已自行给 PR 打上 skip-changeset 标签。

🤖 Generated with Claude Code

https://claude.ai/code/session_019Q7oc7ASjh8yxyS3Yz78We


Generated by Claude Code

claude added 2 commits August 6, 2026 11:25
…ubles to the producer's dispatch predicates (#5855)

#5619 sank `assertEngineDeleteDispatch` / `assertEngineUpdateDispatch` into
@objectstack/metadata-core — a package that depends on neither @objectstack/objectql
nor these three. That removed the cyclic-edge blocker recorded on six (file, verb)
entries of the double-contract ledger, leaving a one-line pin each.

Four fakes wired, six baseline entries deleted (141 -> 135 entries;
gate: 64 -> 70 pinned, 139 -> 133 DEBT). @objectstack/core gains the
devDependency the import needs; metadata and platform-objects already had it.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019Q7oc7ASjh8yxyS3Yz78We
@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 11:28am

Request Review

@baozhoutao baozhoutao added the skip-changeset PR has no user-facing published change; bypasses the changeset gate label Aug 6, 2026 — with Claude
@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 1 package(s): @objectstack/core.

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

  • content/docs/ai/actions-as-tools.mdx (via @objectstack/core)
  • content/docs/ai/knowledge-rag.mdx (via @objectstack/core)
  • content/docs/ai/natural-language-queries.mdx (via @objectstack/core)
  • content/docs/automation/webhooks.mdx (via @objectstack/core)
  • content/docs/concepts/north-star.mdx (via packages/core)
  • content/docs/deployment/migration-from-objectql.mdx (via @objectstack/core)
  • content/docs/kernel/contracts/index.mdx (via @objectstack/core)
  • content/docs/kernel/runtime-services/examples.mdx (via @objectstack/core)
  • content/docs/kernel/services-checklist.mdx (via @objectstack/core)
  • content/docs/kernel/services.mdx (via @objectstack/core)
  • content/docs/permissions/authentication.mdx (via @objectstack/core)
  • content/docs/permissions/authorization.mdx (via packages/core)
  • content/docs/plugins/anatomy.mdx (via @objectstack/core)
  • content/docs/plugins/development.mdx (via @objectstack/core)
  • content/docs/plugins/index.mdx (via @objectstack/core)
  • content/docs/plugins/packages.mdx (via @objectstack/core)
  • content/docs/protocol/kernel/config-resolution.mdx (via @objectstack/core)
  • content/docs/protocol/kernel/index.mdx (via @objectstack/core)
  • content/docs/protocol/kernel/lifecycle.mdx (via @objectstack/core)
  • content/docs/protocol/kernel/plugin-spec.mdx (via @objectstack/core)
  • content/docs/releases/implementation-status.mdx (via @objectstack/core)
  • content/docs/releases/v12.mdx (via @objectstack/core)
  • content/docs/releases/v15.mdx (via @objectstack/core)
  • content/docs/releases/v17.mdx (via @objectstack/core)

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.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

dependencies Pull requests that update a dependency file size/m skip-changeset PR has no user-facing published change; bypasses the changeset gate tests

Projects

None yet

2 participants