Skip to content

feat(spec): ProvisionEnvironmentResponse 增加可选 hostnameAssignment —— 自动改名的响亮回执 (#5185) - #6068

Draft
qq9340100 wants to merge 1 commit into
mainfrom
claude/issue-5185-provision-hostname-assignment
Draft

feat(spec): ProvisionEnvironmentResponse 增加可选 hostnameAssignment —— 自动改名的响亮回执 (#5185)#6068
qq9340100 wants to merge 1 commit into
mainfrom
claude/issue-5185-provision-hostname-assignment

Conversation

@qq9340100

Copy link
Copy Markdown
Collaborator

Fixes #5185

cloud#1070 响亮改名裁定(方案 C,维护者已批)的契约半边。cloud 侧实现被本单阻塞,合并后走 bump-objectstack.sh 拾取 —— 本 PR ⛔ 不碰 cloud、不碰其它 schema。

问题

环境的 canonical hostname 是 UNIQUE 的。provision 时若请求的 hostname 撞车,控制面不会让整个调用失败,而是追加一小段后缀自动改名。改名以前只体现在返回的 environment.hostname —— 调用方除非自己把请求的 hostname 存下来再逐字符比对,否则无从知道自己拿到的并不是自己要的那个。

改了什么

packages/spec/src/cloud/environment.zod.tsProvisionEnvironmentResponseSchema 新增可选字段:

hostnameAssignment: z.object({
  requestedHostname: z.string(),   // 调用方要的(显式传入,或由 displayName 推导)
  assignedHostname: z.string(),    // 改名后实际分配的,等于 environment.hostname
}).optional()

.describe() 把语义写死为 「仅在真的发生了自动改名时才填充」:没撞车、原样分配的调用完全不带这个键,因此 hostnameAssignment !== undefined 本身就是信号。⛔ 缺席不等于「未知」—— describe 里对这条做了显式否定,免得下游把它当三态读。

为什么必须 declare 在 spec,而不是控制面本地 extend

三条理由都写进了字段上方的 TSDoc,便于后来者原地读到:

  • 控制面本地 extend 出来的是未声明的兄弟键,z.object 出站即剥离 —— 回执靠蒸发「合规」。本 PR 用一条测试把这个事实钉住了(见下)。
  • 塞进自由格式的 metadata 袋:在 caller-wins 先例下,调用方可以压制、也可以伪造这个由服务端发出的信任信号。
  • AI 生成的 provisioning 客户端按本协议已发布的表面(api-surface.json)生成 —— 字段不进 spec 表面,生成出来的客户端永远不会去读它。

兼容性

纯增量的可选字段。既有的 provisioning 响应(不带该键的)照旧合法,无需改动任何调用方;ProvisionOrganizationResponse.defaultEnvironment 因嵌套本 schema 自动继承(生成文档里的 省略号即是)。changeset:@objectstack/spec minor

测试

packages/spec/src/cloud/environment.test.ts 新增 7 条契约测试 —— 该 schema 此前零测试覆盖:

用例 钉住的事实
不带 hostnameAssignment 解析通过 可选,且解析后为 undefined
带完整 hostnameAssignment 解析通过 两个 hostname 都原样保留,不被吃掉
assignedHostname / 缺 requestedHostname 各一条 子键都是必填,半个回执不合法
assignedHostname 传数字 形状钉子
hostnameAssignment 传字符串 必须是对象,不能退化成裸 hostname
未声明兄弟键 renamedHostname 被剥离 上面第一条理由的实证:本地 extend 的回执会蒸发

本 PR 未引入任何 fake engine,故无 assertEngineDeleteDispatch 落点。

生成物

按 os-regen 纪律:先 build(内含 gen:schema + gen:openapi),再 check:generated 让它自己报哪些 stale,只 --fix 它证明为 stale 的那 2 项 —— 不整套重刷。

  • packages/spec/authorable-surface.json:+1 行 cloud/ProvisionEnvironmentResponse:hostnameAssignment
  • content/docs/references/cloud/environment.mdx:新字段行 + defaultEnvironment 的嵌套省略号
  • docs/audits/2026-07-unknown-key-strictness-ledger.counts.md:cloud/ 82 → 83(新增的那一个 z.object( 站点;cloud/ 属未三诊目录,只计站点数,不含 strict/strip 判定)
  • check:api-surface 绿 —— 本 PR 不新增导出符号
  • packages/spec/json-schema/(含 openapi.json)被 .gitignore 排除,故补跑 gen:openapi 无提交物

🤖 Generated with Claude Code

https://claude.ai/code/session_011M7UwH25Unfi73UHim7ajY


Generated by Claude Code

按 cloud#1070 方案 C(维护者已批)在 ProvisionEnvironmentResponseSchema 上声明
可选的 hostnameAssignment { requestedHostname, assignedHostname }:控制面在
hostname 撞车时自动改名,该字段让改名"响亮"——仅在真的发生改名时填充。

声明在 spec 而非控制面本地 extend:未声明的兄弟键会被 z.object 剥离(靠蒸发
合规);塞 metadata 袋则在 caller-wins 先例下可被调用者压制或伪造;且 AI 生成
的 provisioning 客户端按 api-surface.json 生成,字段不进 spec 表面就永远读不到。

生成物按 os-regen 纪律整体重生成(authorable-surface / references 文档 /
strictness 计数),外加契约测试与 changeset。

Refs #5185, cloud#1070

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 6, 2026 4:39pm

Request Review

@github-actions

github-actions Bot commented Aug 6, 2026

Copy link
Copy Markdown
Contributor

📓 Docs Drift Check

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

112 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 @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/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.

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

2 participants