Skip to content

feat(spec): 补上 defineHook() 作者侧工厂,并修正 object.zod.ts 两处错误处方 (#4269) - #4273

Merged
os-zhuang merged 2 commits into
mainfrom
claude/definehook-factory-zod-fix-007ec4
Jul 31, 2026
Merged

feat(spec): 补上 defineHook() 作者侧工厂,并修正 object.zod.ts 两处错误处方 (#4269)#4273
os-zhuang merged 2 commits into
mainfrom
claude/definehook-factory-zod-fix-007ec4

Conversation

@os-zhuang

Copy link
Copy Markdown
Contributor

Closes #4269。从 #4001/#4207 延伸:hook 的约定扫描作者路径此前零运行时校验,且 object.zod.ts 的错误处方引用了不存在的 defineHook() —— 作者照处方 import 会再失败一次。

改动

1. defineHook() 工厂(packages/spec/src/data/hook.zod.ts)

defineDatasource 模板(datasource.zod.ts:538):纯 HookSchema.parse,Hook(z.input)进、ResolvedHook(z.output)出;包根与 @objectstack/spec/data 子路径均导出。v1 不含任何劝导逻辑 —— handler 弃用告警留在 binder(bindHooksToEnginewarnLegacyHandler 选项),单处维护。

注:issue 里写的 binder 函数名 warnDeprecatedHandler 实际不存在,核实后的真名是 warnLegacyHandler 选项 —— JSDoc/changeset 用的是真名,否则就是在本 PR 里复现本 PR 要修的毛病。

2. 两处错误处方修正(object.zod.ts UNKNOWN_KEY_GUIDANCEworkflows/hooks)

"registered via `defineHook()`" → "wrapped in `defineHook()` from `@objectstack/spec/data`":随工厂落地处方成真;措辞复核把「registered」改准确(工厂做校验,注册靠扫描/defineStack),并补上 import 路径让 AI 作者零猜测照做。既有测试钉子(lifecycle hook / record_change / #1535)全部保留。

3. drift-guard 测试(hook.test.ts,+5)

4. 文档一处注记(content/docs/protocol/objectql/schema.mdx)

Lifecycle Hooks 示例裸字面量 → export default defineHook({...}) + 「工厂优先于裸字面量」注记(defineDatasource 同款规则);os:check 片段对构建后 dist 类型检查通过。

5. changeset(@objectstack/spec minor,新公共 API)+ api-surface 基线重生成(root 与 data 两个入口各 +defineHook)。

有意的行为变化

parse-at-import:坏 hook 从「绑定期 skip + warning」变为作者期硬失败(#4001 姿态:静默失效制造虚假完成)。存量裸字面量不受影响,工厂是可选入口,迁移纯增量。

验证

后续(不扩大本 PR 范围)

skills/objectstack-data 的 hook 示例仍教裸 : Hook 字面量(SKILL.md:399 等)—— 已另开 issue 跟进。

🤖 Generated with Claude Code

…#4269)

Follows the defineDatasource template: input-shape config in,
HookSchema.parse, resolved shape out. Exported from the package root and
@objectstack/spec/data. Closes the convention-scan authoring path's
zero-validation gap (the #4207 alias/guidance errors now fire at import,
not bind) and converges both authoring paths on the z.output artifact
shape.

Also rewords the two UNKNOWN_KEY_GUIDANCE prescriptions (workflows/hooks)
in object.zod.ts that referred authors to a defineHook() that did not
exist — they now name a real function plus its import path — and switches
the schema.mdx lifecycle-hook example to the factory with a
factory-over-bare-literal note.

Drift guard in hook.test.ts: factory output === HookSchema.parse output,
defaults/CEL materialization, function-handler passthrough by reference,
bind-time re-parse idempotence, authoring-time hard-fail with the
schema's own guidance.

Closes #4269

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

vercel Bot commented Jul 31, 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 Jul 31, 2026 2:19am

Request Review

@github-actions github-actions Bot added size/m documentation Improvements or additions to documentation protocol:data tests tooling labels Jul 31, 2026
@github-actions

Copy link
Copy Markdown
Contributor

📓 Docs Drift Check

This PR changes 1 package(s): @objectstack/spec.

106 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 packages/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 packages/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/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/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/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/kernel/runtime-capabilities.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/create-vs-edit-form.mdx (via @objectstack/spec)
  • content/docs/ui/dashboards.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.

@os-zhuang
os-zhuang merged commit a1a4140 into main Jul 31, 2026
18 checks passed
@os-zhuang
os-zhuang deleted the claude/definehook-factory-zod-fix-007ec4 branch July 31, 2026 02:33
os-zhuang added a commit that referenced this pull request Jul 31, 2026
* docs(skills): hook examples author with defineHook(), not bare `: Hook` literals (#4274)

#4273 shipped defineHook() and pointed docs + error prescriptions at it,
but skills/objectstack-data — the first thing an AI author reads — still
taught the bare-literal form in 18 places across SKILL.md,
rules/hooks.md, rules/validation.md, and references/data-hooks.md.

Mechanical rewrite: `const x: Hook = {…}` → `const x = defineHook({…})`
(imports switched to the value import), plus the factory-over-bare-literal
note in rules/hooks.md and references/data-hooks.md, phrased identically
to the schema.mdx note from #4273. Every rewritten block was scanned for
unknown top-level keys — HookSchema is strict, so a stray key inside a
defineHook() example would teach a crash — none found; the os:check gate
covers the tagged blocks (198 examples green).

Closes #4274

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

* chore: empty changeset — docs-only PR, releases nothing

Same convention as #4279: the changeset gate wants an explicit statement
of release intent, and skills/ ships in no npm package.

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

---------

Co-authored-by: Jack Zhuang <277994282+os-zhuang@users.noreply.github.com>
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
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/m tests tooling

Projects

None yet

Development

Successfully merging this pull request may close these issues.

补上 defineHook():hook 的作者侧工厂(defineDatasource 范式),并修正 object.zod.ts 两处引用不存在函数的错误处方

1 participant