Skip to content

SYNC_ARCHITECTURE.md 的 L3 Connector 示例不可编译,且写的是 schema 会**拒收**的键名(sourceField / targetField / transform.type: 'custom' / webhook retryPolicy) #5515

Closed

Description

@os-zhuang

发现于 #4963(修 L2 ETLPipeline 示例)时用同一套 compiler-API 探针顺手量了同文件的 L3 段,不在该 PR 范围内 —— 属主是 integration/connector.zod.ts,不是 automation/etl.zod.ts。

事实

packages/spec/docs/SYNC_ARCHITECTURE.md 的 "Level 3: Enterprise Connector → Example"(const sapConnector: Connector = { … },约 200–300 行)逐字丢给 ts.createProgram(strict: true,@objectstack/spec/* 映射到 entry barrel,types: ['node']),报四条诊断:

TS2322: Type 'string' is not assignable to type
        '{ dialect: "cel" | "cron" | "template"; source?: string | undefined; ... }'
TS2353: Object literal may only specify known properties,
        and 'sourceField' does not exist in type '{ source: string; target: string; ... }'
TS2322: Type '"custom"' is not assignable to type
        '"map" | "lookup" | "constant" | "cast" | "javascript"'
TS2353: Object literal may only specify known properties,
        and 'retryPolicy' does not exist in type
        '{ name: string; url: string; method: ...; timeoutMs: number; isActive: boolean; signatur…'

逐条对照 schema:

示例写的 schema 实际声明 位置
fieldMappings[].sourceField / targetField source / target packages/spec/src/shared/mapping.zod.ts:101 起(ConnectorFieldMappingSchema extends 它,connector.zod.ts:121)
transform: { type: 'custom', function: … } type 只接受 map / lookup / constant / cast / javascript shared/mapping.zod.ts 的 FieldMappingTransformSchema
webhooks[].retryPolicy: { … } WebhookConfigSchema 没有这个键 connector.zod.ts:284–309
syncConfig.schedule: '*/15 * * * *' 见下 —

sourceField 不是"随便写错的键",它是 schema 里挂了 curated alias 的被拒键:packages/spec/src/integration/connector.test.ts:1028 的注释写着 sourceField: 'a', // a real alias, deliberately: the message must name it —— 也就是说该文档示例照抄进去会被 strict schema 明确拒收并提示改名。这正是 Prime Directive #10 里"绝不宣传运行时不兑现的能力"的反面,而且是 AI 作者最可能直接复制的那种行数。

第四条(cron 字符串)是另一个 #4963:connector.zod.ts:742 是 export type Connector = z.infer(…),而 ConnectorInput = z.input(…) 在 744 行 —— 该文件用的是第三种命名(XInput 而非 house convention 的 XParsed),而示例注解用的是 parsed 的裸名 Connector,于是 syncConfig.schedule 的裸 cron 字符串被拒。这一条改注解或改约定都能解,不必和上面三条捆绑;#4963 的裁定路线(裸名翻转 + *Parsed)在这里迁移面不为空,要单独裁定 —— connector.zod.ts 有 20 个 z.infer 裸名别名且是 live parse path(ConnectorSchema.syncConfig)。

同文件另两段 L3 片段(Migration Guide 的 "Before (L3 syncConfig)" / "After (L3)")用裸 ... 做省略,不是 TypeScript,属于示意草图,不在此列。

建议

前三条是纯文档修正(把示例改成 schema 真的接受的键名和取值),可以独立于第四条先做。#4963 的 PR 里已经加了 packages/spec/src/automation/etl-author-shape.test.ts,它把该文档的 ```typescript 块总数钉死为 6 并逐字编译其中 3 段 ETL 块;把 L3 段也纳入同一个门是自然的下一步,但需要先决定第四条怎么解,否则门进不去。

未验证的部分

只量了 SYNC_ARCHITECTURE.md。content/docs/references/integration/connector.mdx 和 connector.zod.ts 自己的 @example 是否有同样的键名错误,没查。

Activity

  1. os-zhuang commented on Aug 5, 2026

    @os-zhuang
    ContributorAuthor

    分诊结论

    分类:pm:queue
    领域:domain:spec

    核对结果(对照 origin/main,均已复核):

    • packages/spec/src/shared/mapping.zod.ts 的 FieldMappingSchema(基,ConnectorFieldMappingSchema 在 connector.zod.ts extend 它)只声明 source/target,没有 sourceField/targetField;FieldMappingTransformSchema 是判别联合,type 只接受 constant | cast | lookup | javascript | map,没有 custom。
    • connector.zod.ts 的 WebhookConfigSchema(WebhookSchema.extend({ events, signatureAlgorithm }))链上确实没有 retryPolicy 键。
    • export type Connector = z.infer<...> / ConnectorInput = z.input<...> 属实,裸名是 parsed 形状,故文档里 syncConfig.schedule 的裸 cron 字符串编译不过。
    • packages/spec/docs/SYNC_ARCHITECTURE.md 在 origin/main 上 L3 sapConnector 示例(205–262 行)原样带着 sourceField/targetField/type: 'custom'/retryPolicy 四处问题,前提未过期,缺陷仍然存在。

    去重:全组织搜索未发现同主题的重复 issue 或在飞 PR。唯一相关的开放 PR #5514(修 #4963)同样改了本文件,但 diff 核实过只动了 L2 ETLPipeline 段落,完全没碰 L3 Connector 段,不构成冲突或阻塞。

    理由:前三条(sourceField/targetField→source/target、transform.type 去掉 'custom'、去掉 webhooks[].retryPolicy)是定位明确、可独立执行的纯文档修正,不依赖任何未决裁定。第四条(裸名 Connector vs ConnectorInput 的 house convention 选择)issue 本身已言明"改注解或改约定都能解"、可独立于前三条推进,不构成阻塞前三条排队的理由,后续 PR 里按 #4963 已确立的分析路数处理即可,不必上升为 needs-user-decision。落地文件锚点:packages/spec/docs/SYNC_ARCHITECTURE.md(主要改动)与 packages/spec/src/integration/connector.zod.ts/packages/spec/src/shared/mapping.zod.ts(比对依据),均属于 packages/spec,对应 domain:spec。

    本评论来自分诊座位 Routine(#5474 试点),不构成认领。


    Generated by Claude Code

  2. added
    pm:queueReady for the PM dispatch loop
    domain:specDomain lane — seat card indexed by label:pm:seat
    on Aug 5, 2026
  3. added
    bugSomething isn't working
    pm:dispatchedDispatched to a dev agent by /pm-dispatch
    and removed
    pm:queueReady for the PM dispatch loop
    on Aug 5, 2026
  4. self-assigned this
    on Aug 5, 2026
  5. os-zhuang commented on Aug 5, 2026

    @os-zhuang
    ContributorAuthor

    PM 认领(spec 车道 PM,session_018fxLGQdatPbBUvCgiVxg6D,2026-08-05)


    Generated by Claude Code

  6. os-zhuang commented on Aug 5, 2026

    @os-zhuang
    ContributorAuthor

    验收通过(spec 车道 PM,session_018fxLGQdatPbBUvCgiVxg6D,2026-08-05)—— PR #5603。

    落地暂缓:ESLint job 因 #5604(main 侧 engine-double-contract 断裂,与本单无关)全仓红,修复落地后本 PR 合 main 重跑 → ready → auto-merge。


    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

Labels

bugSomething isn't workingdomain:specDomain lane — seat card indexed by label:pm:seatpm:dispatchedDispatched to a dev agent by /pm-dispatch

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions