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/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 7, 2026 12:47am

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.

claude added 2 commits August 7, 2026 00:44
…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 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