Skip to content

refactor(spec)!: 按 ADR-0049 退役 FieldMapping.transform 与整个 FieldMappingTransform 联合 —— 五成员零执行者 (#5552) - #6078

Merged
qq9340100 merged 7 commits into
mainfrom
claude/issue-5552-fieldmapping-transform-retire
Aug 7, 2026
Merged

refactor(spec)!: 按 ADR-0049 退役 FieldMapping.transform 与整个 FieldMappingTransform 联合 —— 五成员零执行者 (#5552)#6078
qq9340100 merged 7 commits into
mainfrom
claude/issue-5552-fieldmapping-transform-retire

Conversation

@qq9340100

Copy link
Copy Markdown
Collaborator

Fixes #5552

按 01:26Z 维护者裁决执行 B(enforce-or-remove)两步走。A(只修 describe)已被否决,本 PR 不做 describe 镀金。

第一步:四成员消费面实测(裁决要求的前置测量)

constant / cast / lookup / map(以及报单已指出的 javascript)三层测量,基线 origin/main @ efedd28:

层面 结果 证据
声明式(谁写这个键) 全仓 0 处(spec 自身测试除外) examples/ / skills/ / objectui 均无。showcase 唯一的映射写的是 transform: 'map' —— 裸字符串,属另一个 schema
parse 点(谁解析) ,且可达 AutomationEngine.registerConnector / registerDegradedConnectorConnectorSchema.parse,会走到 fieldMappings[](service-automation/src/engine.ts:1692,1771)
运行时执行点(谁执行) fieldMappings 只在 packages/spec 内被拼写;四个 connector 包、automation engine、REST、objectui 都不读它;全仓无任何代码对 transform.type 分支

反查证伪扫描器(零命中时的必要控制):成员专属词在树里都找得到 —— targetType 70 处、keyField 66 处、valueField 260 处。扫描器工作正常,消费者是真的不存在。

cloud 面:未验,如实标注。 本会话对 objectstack-ai/cloud 无读权限(add_repo 返回 "you don't have access"),且 GitHub code search 不索引该仓 —— 控制查询 repo:objectstack-ai/cloud objectstack 返回 0 命中且 incomplete_results: true,即"查不到"不等于"没有"。按 #5540 的处理方式记为未验证,不冒充已验。

结论:全死。 五个成员一起 declared-but-unenforced,不只是报单指出的那一个 —— 于是按裁决走「整个 FieldMappingTransformSchema 联合退役」。

javascript 成员仍是让缺口显形的那一个,报单的三处打架全部复现:describe 推荐的 dialect: "js" 被枚举拒收(js#3278 / ADR-0058 addendum 退役);唯一能过 parse 的裸字符串被 ExpressionInputSchema 包成 dialect: 'cel';而同一行给的例子 value.toUpperCase() 作为 CEL 不成立。

第二步:退役路线选择(裁决要求在正文论证)

这是 authorable 面,不是纯类型面 —— 两个判据都指向同一边:

  1. .parse() 消费:上表第二行,ConnectorSchema.parse 是活的接收者。所以处方有人能收到,不适用 playbook 的「nothing parses it → 两者都不做」那一行(那是 findStream / IStorageService.list 的形状 —— 纯 TS 契约,没有任何东西跑过 .parse())。
  2. 在 authorable-surface 上:shared/FieldMapping:transformintegration/ConnectorFieldMapping:transformdata/ExternalFieldMapping:transform 三行都在。

retiredKey() 墓碑路线,理由是 schema 形态:FieldMappingSchema 与两个 extender 全是普通 z.object(非 .strict())。直接删键会被 zod 静默 strip —— 用一个静默 no-op 替换另一个静默 no-op,正是 #3726 / #3733 那一类。墓碑给出两个通道:tsc 拒绝赋值,parse 抛出处方本身。

⚠️ 一个墓碑 → 三处可作者化拼写:两个 extender 是 .extend(),会把该属性复制进各自的 shape,所以 RETIRED_KEYS_BY_MAJOR 按键逐条登记三条(网关按精确集合成员匹配,不从基类辐射)。这一点单独立了个 pin 测试。

生成物读数 —— 按路线核对,不要反过来

playbook 明确:整 def 删除必须让四张 ratchet 动;枚举值收窄则仪器上不可见。本 PR 是前者,读数如下,并且 json-schema.manifest.json 的 ratchet 先自己开火了,这串输出本身就是路线的证据:

❌ 1 previously published schema(s) disappeared from this build:
     - json-schema/shared/FieldMappingTransform.json

按要求有意删除 manifest 行,并在 RETIRED_DEFS_BY_MAJOR 登记。最终读数:

toMajor: 17,照抄现行 protocol-17 chain step 先例(包版本 17.0.0-rc.2,仍在 rc 窗口内)。

反向验证(sabotage)—— 方向在跑之前就写死了

预测:恢复联合与键之后,[#5552] 系列 pin 全部转红(普通方向,不是反转方向 —— 因为墓碑是这些判决的唯一来源:FieldMappingSchema 是普通 z.object,没有墓碑就只有"接受"或"静默 strip",没有底下的 schema 级拒绝可以兜)。

实测:7 条 pin 转红,失败文本正是"能力被恢复"的签名。其中两条值得单独说:

  • …and a member that used to be VALID fails identicallyexpected '' to contain 'TS2322' —— 恢复后该 probe 零诊断地编译通过。这条 pin 存在的唯一目的就是抓「联合被悄悄恢复」,而它给出的正是最强信号。
  • transform 是 retired —— 恢复后仍有诊断,但换成了另一条(Type '"custom"' is not assignable…,值判决)。所以这条 pin 断言的是具体文本而非"非空":只断言非空的话,它在 sabotage 下会保持绿色,是个 phantom check。成对 probe(一个已退役成员 + 一个原本合法成员)才是让这件事可测的设计。

另有 1 条 pin 在 sabotage 下保持绿色,如实说明:a mapping without the key parses and carries no transform at all —— 它是 strip 正路 pin,没写该键的映射两边都能解析,本来就不该变色。

一处如实修正:墓碑的 tsc 通道不点名该键

第一版 probe 断言 toContain('transform'),实测失败。retiredKey()z.never().optional(),其输入类型是 undefined,tsc 报的是 TS2322: Type '{ … }' is not assignable to type 'undefined' —— 拒绝了,但没有点出键名。处方完整地挂在 parse 通道上。测试里按实测形状钉住并写明了这个差别,而不是按想当然的形状写。

未受影响(⛔ 未碰)

  • ExpressionDialect 本体及其它 schema —— 按指令未动。
  • ExternalLookup.transform —— lookup 级的 { request, response } 管线,与字段映射的 transform 同名不同物。
  • 导入映射 mapping.fieldMapping[].transform —— 这才是活的那条:扁平字符串枚举,由 REST 导入路径逐行执行,liveness ledger 逐键记录在案。它对自己的 javascript 值是直接 400 拒收(服务端无沙箱)。同一个词,相反的处置 —— 一边跑并且说清楚,另一边从来没跑过。data/mapping.zod.ts 的三点差异注释已按此更新。

验证

命令 结果
pnpm --filter @objectstack/spec test 325 files / 8305 tests passed
pnpm --filter @objectstack/spec typecheck PASS(tsc --noEmit + test-typecheck 债本未增长)
pnpm --filter @objectstack/spec check:generated 10/10 PASS
check:liveness / check:empty-state / check:skill-examples / check:exported-any / check:dual-source-exports 全部 PASS
@objectstack/cli test(migrate-meta e2e / chain replay) 87 files / 872 passed
@objectstack/metadata test 25 files / 508 passed
@objectstack/metadata-protocol test 49 files / 487 passed
node scripts/check-nul-bytes.mjs OK(5780 文件,无裸控制字节)

liveness ledger 无需改动:ledger 按元数据类型建档,shared/FieldMapping 家族没有 ledger 行(liveness/mapping.json 记的是 MappingSchema,即上面那条活的导入映射)。check:liveness 绿,既无 UNCLASSIFIED 也无 ORPHAN。


Generated by Claude Code

claude added 2 commits August 6, 2026 15:42
…gTransform 联合 (#5552)

WIP: schema tombstone + D2 conversion + D3 chain step + 两张退役登记表首入。

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011M7UwH25Unfi73UHim7ajY
…gTransform 联合 (#5552)

测量结论:五个成员(constant/cast/lookup/javascript/map)无一存在执行者。
fieldMappings 只在 packages/spec 自身被拼写,connector 包/automation engine/REST/
objectui 均不读取,全仓无任何代码对 transform.type 分支。

退役套件:retiredKey() 墓碑(schema 与两个 extender 均为普通 z.object,直接删键会静默
strip)、D2 conversion field-mapping-transform-removed、D3 chain step、
RETIRED_KEYS_BY_MAJOR/RETIRED_DEFS_BY_MAJOR 两表首批条目、生成物重生成、changeset。

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011M7UwH25Unfi73UHim7ajY
@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 7, 2026 2:47am

Request Review

@github-actions

github-actions Bot commented Aug 6, 2026

Copy link
Copy Markdown
Contributor

📓 Docs Drift Check

This PR changes 2 package(s): @objectstack/dogfood, @objectstack/spec.

113 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 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 @objectstack/spec)
  • content/docs/kernel/index.mdx (via packages/spec)
  • content/docs/kernel/runtime-services/data-service.mdx (via @objectstack/spec)
  • content/docs/kernel/runtime-services/email-service.mdx (via packages/spec)
  • content/docs/kernel/runtime-services/examples.mdx (via @objectstack/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 @objectstack/spec)
  • content/docs/kernel/runtime-services/sms-service.mdx (via packages/spec)
  • content/docs/kernel/runtime-services/storage-service.mdx (via @objectstack/spec)
  • content/docs/kernel/services-checklist.mdx (via @objectstack/spec)
  • content/docs/kernel/services.mdx (via @objectstack/spec)
  • content/docs/permissions/authorization.mdx (via packages/qa/dogfood, @objectstack/spec)
  • content/docs/permissions/delegated-administration.mdx (via packages/qa/dogfood)
  • 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/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.

Copy link
Copy Markdown
Collaborator Author

CI 状态(截至 19:41Z)

两个必看门禁均已 completed / success,逐 job 读取(非聚合状态):

workflow / job 结论
Lint & Type Check → ESLint ✅ success
Lint & Type Check → TypeScript Type Check ✅ success
Docs Drift Check ✅ success
Duplicate Fix Guard ✅ success
Spec Liveness Check ⏳ 仍 queued
Console Pin Freshness ⏳ 仍 queued
CI ⏳ 仍 queued

TypeScript Type Check 正是承载 spec 八张生成物门禁的那个 job,ESLint 承载家族门禁(check:engine-double-contract / check:error-code-casing / check:route-envelope 等)—— 本 PR 的退役套件如果哪里没配齐,红的会是这两个,现在都是绿的。

后三个仍在排队与本 PR 无关:runner 池今晚整体饱和(18:09 注册后曾出现全仓 90 runs queued / 0 in_progress 持续约一小时的窗口;此刻仍有 52 个排队),排队的是整个仓库的 PR 与 merge queue,不是这一个分支。作为替代证据,Spec Liveness CheckCI 覆盖的内容已在本地跑过并记录在正文的验证表里:check:liveness PASS、spec 全量 325 files / 8305 tests、cli / metadata / metadata-protocol 三个包的测试全绿。ESLint job 的家族门禁也在本地逐条复跑过(lint / check:engine-double-contract / check:error-code-casing / check:route-envelope / check:adr-anchors / check:merge-driver,全 PASS)。

main 在本分支开出后只前进了一个提交(#6027,client-sdk 合规矩阵文档),与本 PR 文件面零重叠,故未做同步合并。

顺带记录的范围外发现

#6085 —— expression.zod.ts 模块 TSDoc 的方言表仍把 js 列为活方言(还配了引擎,"use" 列写着 mapping,正是本 PR 退役掉的那个面),同时漏了真实成员 template;该表逐字流进 content/docs/references/shared/expression.mdx:32。与 #5552 同一缺陷类,但位置在方言表本身。按本单指令 ⛔ 不碰 ExpressionDialect 本体,故仅立单未修,已 unassigned 交三诊。


Generated by Claude Code

claude added 2 commits August 7, 2026 00:44
…ldmapping-transform-retire

# Conflicts:
#	packages/spec/api-surface.json
#	packages/spec/authorable-surface.json
#	packages/spec/json-schema.manifest.json
api-surface/shared.json −2 导出;authorable-surface 的 data/integration/shared
三个分片各一行转 [RETIRED];json-schema.manifest/shared.json −1 def。
manifest ratchet 在分片布局下再次自行开火并点名分片路径,处置同前:有意删除 +
RETIRED_DEFS_BY_MAJOR 已登记。check:generated 10/10 绿。

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011M7UwH25Unfi73UHim7ajY
@github-actions github-actions Bot added the size/l label Aug 7, 2026

Copy link
Copy Markdown
Collaborator Author

补圈同步完成:#5837 分片布局(main e3ef52b)

新 head:6076254c96acef984827721f8a4e2a5f0912da9c

两个提交:dcade3cb(merge origin/main)+ 6076254c(退役读数物化进分片布局)。

冲突处置

三个单体生成物全部以 modify/delete 冲突落地(main 侧删除、本分支侧修改),按 os-regen 纪律一律取 main 侧、接受删除、不手改:

CONFLICT (modify/delete): packages/spec/api-surface.json         deleted in origin/main
CONFLICT (modify/delete): packages/spec/authorable-surface.json  deleted in origin/main
CONFLICT (modify/delete): packages/spec/json-schema.manifest.json deleted in origin/main

先 commit merge,再全量重生成(buildgen:schema/gen:openapigen:api-surface)。

分片读数核对(三项全部物化,逐项验证)

生成物 分片 读数
json-schema.manifest/ shared.json −1 def(shared/FieldMappingTransform)
api-surface/ shared.json −2 导出(FieldMappingTransform (type) / FieldMappingTransformSchema (const))
authorable-surface/ shared.json shared/FieldMapping:transform [RETIRED]
authorable-surface/ integration.json integration/ConnectorFieldMapping:transform [RETIRED]
authorable-surface/ data.json data/ExternalFieldMapping:transform [RETIRED]

三个 ratchet 的总占地:5 个文件 / 3 insertions / 6 deletions —— 比单体布局下的同一改动小得多,正是 #5837 要拆掉的那份串行税。一个附带的好证据:data.jsondata/ImportFieldMapping:transform 没有 [RETIRED] 标记,与同分片上一行的 data/ExternalFieldMapping:transform [RETIRED] 并排 —— 活的导入映射与已退役的字段映射变换,在同一个文件里逐行可对照。

manifest ratchet 在分片布局下再次自行开火,并点名了分片路径,处置与单体时一致(有意删除 + RETIRED_DEFS_BY_MAJOR 登记,后者在 merge 中原样存活):

❌ 1 previously published schema(s) disappeared from this build:
     - json-schema/shared/FieldMappingTransform.json
   … delete the key(s) from packages/spec/json-schema.manifest/<category>.json
     in the same PR AND declare each one in RETIRED_DEFS_BY_MAJOR

重新验证(重活均持 flock 串行)

命令 结果
pnpm --filter @objectstack/spec check:generated ✓ All 10 generated artifacts are up to date.
pnpm --filter @objectstack/spec test 326 files / 8332 passed(合并前 325/8305,增量来自 main 侧新增用例)
pnpm --filter @objectstack/spec typecheck PASS(tsc --noEmit + test-typecheck 债本未增长)

changeset 不变(@objectstack/spec major)。CI 会在新 head 上重跑;上一轮 head 的 ESLint / TypeScript Type Check 两个必看门禁均为 completed/success


Generated by Claude Code

1. packages/spec/variant-docs.json:孤儿条目 "sync mapping transform"
   (key type:cast|constant|javascript|lookup|map) —— 该判别联合已随
   FieldMapping.transform 一并退役,按 check:variant-docs 自身处方删除条目。
   门读数:19 unions / 9 governed / exempt 11 → 10。

2. packages/qa/dogfood/test/expression-conformance.ledger.ts:cel-formula 行的
   cover 'shared/mapping.zod.ts:expression' —— 该 expression 面由被退役的
   javascript 成员携带,源码里已不存在,故删除该 cover(沿用同一行 #3605
   kernel/feature.zod.ts 的处理先例并留注释);summary 同步去掉
   "+ mapping expressions",因该侧已无可解释的东西。

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011M7UwH25Unfi73UHim7ajY

Copy link
Copy Markdown
Collaborator Author

回派两处实红已修

新 head:955ece1e92a1d578f65fd61508252d6a56847359(单个提交 955ece1e,只动两处账本,未扩大改动面)

两处都是退役收尾面 —— 剧本里「漏一件就有门开火」的那一类。它们此前没被我本地扫到的原因很具体,记录下来:check:variant-docs 属于 check:generated 明确列为「不代跑」的源审计之一,而我上一轮只逐条跑了同组的 check:liveness / check:empty-state / check:skill-examples / check:exported-any / check:dual-source-exports,漏了它;packages/qa/dogfood 则整个不在我按消费半径圈定的包集合里(我圈的是 cli / metadata / metadata-protocol)。两条都是「账本引用已删联合」的同族,前提与裁 B 均不受影响。

1. packages/spec/variant-docs.json —— 删除孤儿条目

条目 key: "type:cast|constant|javascript|lookup|map" / label: "sync mapping transform",exempt: generated-reference-only,理由写的是「DOCUMENTATION GAP,等有页面时再绑」。该判别联合已随 FieldMapping.transform 整体退役,已按门自身处方删除条目。

$ pnpm --filter @objectstack/spec check:variant-docs
✓ variant/doc gate: 19 discriminated union(s) — 9 governed (every variant mentioned in a bound doc), 10 exempt.

读数对得上:governed 9 不变,exempt 11 → 10,少的正是这一条。

2. packages/qa/dogfood/test/expression-conformance.ledger.ts —— 删除失效 cover

cel-formula 行的 covers'shared/mapping.zod.ts:expression':该 expression 面是由被退役的 javascript 成员携带的(expression: ExpressionInputSchema),源码里已不存在,故删除该 cover 而非改指别处。沿用同一行已有的先例(kernel/feature.zod.ts:expression#3605 随孤儿 FeatureFlagSchema 一起删除)并按同样格式留了注释。

顺带把该行 summary'computed / formula field + mapping expressions' 改为 'computed / formula field expressions' —— 这不是扩大改动面,而是同一条目的必要一半:mapping 侧已无任何可解释的表达式,留着这半句就是账本自己在宣传一个不存在的面(正是本单要治的那类)。

$ pnpm --filter @objectstack/dogfood exec vitest run test/expression-conformance.test.ts
 Test Files  1 passed (1)
      Tests  3 passed (3)

复验

$ pnpm --filter @objectstack/spec check:generated
✓ All 10 generated artifacts are up to date.

另做了一次全仓兜底扫描,确认没有第三处遗漏:FieldMappingTransform 的剩余命中全部是本次退役自身的处方文本(墓碑 guidance 渲染进 json-schema/**spec-changes.json,以及 data/mapping.zod.ts 里那段有意保留的对照注释),没有任何账本/基线还把它当作活面引用。

关于 ESLint 红

按 PM 说明,该红来自 main 破损(#6100,slot-lookup ratchet 10→11),止血 f7f54a960 已在 main。本 push 换了 merge ref,CI 会对着带止血的 main 重算,故本分支未为此改动任何东西。


Generated by Claude Code

claude added 2 commits August 7, 2026 02:34
main 落了 6e82972(#5606/#6058):docs-gen 把 retiredKey() 墓碑从 any 渲染成
never。本分支的 FieldMapping.transform 墓碑正好出现在这三页上,故 merge ref 用新
渲染器重算与分支内旧产物不一致。按门自身处方 gen:schema + gen:docs 重生成。

三页 diff 即 any→never 形状(同页上先前就存在的 rateLimitConfig 墓碑 #4911 也一并
翻新,可证是渲染器变更而非本分支改动),外加同一渲染器变更的连带效果:
fieldMappings 的内联形状摘要不再打印 never 化的已退役属性,腾出的位置显示真实键。

strictness ledger 的 cloud/ 82→83 来自本次 merge(本分支从未触及 cloud/)。

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011M7UwH25Unfi73UHim7ajY

Copy link
Copy Markdown
Collaborator Author

补圈完成:按 #6058 新渲染器重生成三张墓碑页

新 head:abb665f9629e6367861a6f21b763b1145b0c47e9(merge 7784c3fd + 重生成 abb665f9)

merge 干净无冲突(三个单体生成物在上一轮已随分片同步删除,本轮无可冲突面)。

三页 diff 确认为墓碑渲染 any→never 形状

- | **transform** | `any`   | optional | [REMOVED] `FieldMapping.transform` …
+ | **transform** | `never` | optional | [REMOVED] `FieldMapping.transform` …

一条独立佐证归因的证据:同在 connector.mdx 上、与本分支无关的既有墓碑 rateLimitConfig(#4911)也一并翻新:

- | **rateLimitConfig** | `any`   | optional | [REMOVED] `connector.rateLimitConfig` …
+ | **rateLimitConfig** | `never` | optional | [REMOVED] `connector.rateLimitConfig` …

即该渲染器变更命中的是页面上的每一处墓碑,不是本分支的改动 —— 与 PM 的归因一致。

另有同一渲染器变更的连带效果,一并如实记录(不是额外改动,是 gen:docs 的产物):fieldMappings 的内联嵌套形状摘要不再打印 never 化的已退役属性,腾出的位置改显真实键 ——

- | **fieldMappings** | `{ source: string; target: string; transform?: any; defaultValue?: any; … }[]`
+ | **fieldMappings** | `{ source: string; target: string; defaultValue?: any; dataType?: Enum<'string' | 'number' | …

一处顺带转绿的门(非本分支引入)

重生成后 check:strictness-ledger 报 stale,已按处方跑 gen:strictness-ledger。其 delta 是 cloud/ 82 → 83 —— 本分支自始至终未触及 packages/spec/src/cloud/,该 strip site 来自本次 merge 带入的 main 侧提交。

复验

$ pnpm --filter @objectstack/spec check:generated
✓ All 10 generated artifacts are up to date.

本轮改动面恰好四个文件,无溢出:三张参考页 + strictness ledger。pre-commit 的 os-regen 钩子也独立确认了两个 deferred artifact 已从合并后的树重生成并 current(os-regen: all deferred artifacts are current — marker cleared.)—— 正是 AGENTS.md §11 要防的「拿半合并树跑生成器」那一步。

changeset 不变(@objectstack/spec major)。


Generated by Claude Code

@qq9340100
qq9340100 marked this pull request as ready for review August 7, 2026 03:04
@qq9340100
qq9340100 added this pull request to the merge queue Aug 7, 2026
Merged via the queue into main with commit 811c30c Aug 7, 2026
25 checks passed
@qq9340100
qq9340100 deleted the claude/issue-5552-fieldmapping-transform-retire branch August 7, 2026 03:18
qq9340100 pushed a commit that referenced this pull request Aug 7, 2026
`git merge origin/main` 把 counts.md **干净且错误**地合并了:本分支侧
的 `shared/ | 25` 胜出,而 main 侧 #6078 退役 `FieldMappingTransform`
五成员联合后该目录已是 20。两侧改动不重叠(本分支动分桶表,main 动
未分诊目录表),所以文本合并无冲突 —— 正是 #5107 记录的那种失败:
与谁都不冲突的数字合并干净、两边都错。

按台账自己的规矩从**合并树**整体重算(`gen:strictness-ledger`),
`shared/` 25 → 20。分桶与 197 的总数不受影响。

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011M7UwH25Unfi73UHim7ajY
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 protocol:data size/l tests tooling

Projects

None yet

Development

Successfully merging this pull request may close these issues.

shared/mapping.zod.ts 的 javascript 变换 describe 推荐 dialect="js",而 ExpressionDialect 只有 cel/cron/template —— 照着写会被拒

2 participants