Skip to content

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

Merged
qq9340100 merged 3 commits into
mainfrom
claude/issue-5185-provision-hostname-assignment
Aug 7, 2026
Merged

feat(spec): ProvisionEnvironmentResponse 增加可选 hostnameAssignment —— 自动改名的响亮回执 (#5185)#6068
qq9340100 merged 3 commits 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/specminor

测试

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

vercelBot commented Aug 6, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

1 Skipped Deployment
ProjectDeploymentActionsUpdated (UTC)
objectstackIgnoredIgnoredAug 7, 2026 12:47am

Request Review

@github-actions

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.

…vision-hostname-assignment
# Conflicts:
#	packages/spec/authorable-surface.json
#5837(PR #6069)把三个单体生成物按 category / entrypoint 拆成分片目录。
本分支原先是对着单体布局生成的,merge origin/main 时 authorable-surface.json
取 main 侧(接受删除,不手工恢复),再整体重生成让本单的 schema 变更落到
分片布局里:packages/spec/authorable-surface/cloud.json 新增一行
`cloud/ProvisionEnvironmentResponse:hostnameAssignment`。
分片的 locality 在这里得到实测:14 个 authorable 分片只动了 cloud.json 一个,
api-surface/ 与 json-schema.manifest/ 零改动(本单不新增导出符号)。
check:generated 10 门全绿。
Refs #5185, #5837
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011M7UwH25Unfi73UHim7ajY
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentationImprovements or additions to documentationsize/mteststooling

Projects

None yet

2 participants

@qq9340100@claude