Skip to content

feat(spec)!: 移除 ./ui 的 HttpMethod 导出 —— C14 双源清账,5 值子集用既有名 HttpMethodType (#4691) - #4727

Merged
os-zhuang merged 1 commit into
mainfrom
claude/issue-4691-http-method-dual-source
Aug 3, 2026
Merged

feat(spec)!: 移除 ./ui 的 HttpMethod 导出 —— C14 双源清账,5 值子集用既有名 HttpMethodType (#4691)#4727
os-zhuang merged 1 commit into
mainfrom
claude/issue-4691-http-method-dual-source

Conversation

@os-zhuang

Copy link
Copy Markdown
Contributor

Fixes #4691

spec 双源清账 C14(#4535 v17 账最后一条):消除 HttpMethod 双源。本单为停摆重派收尾——首个实施 agent 留下完整未提交、未验证的实现,本次逐项独立复核后补全交付;复核结论在文末「复核记录」。

双源消除:前后对照

入口 之前 之后
./shared HttpMethod(7 值 const+type,含 HEAD/OPTIONS)、HttpMethodSchema(5 值 zod)、HttpMethodType(5 值 type) 一字未动
./api re-export ./shared 的 7 值 HttpMethod 一字未动
./ui export type HttpMethod = z.infer< typeof HttpMethodSchema >(5 值独立声明,与 ./shared 同名异型 —— #4411 陷阱,且两侧取值集合不同) 不再导出 HttpMethod;新增 re-export 既有的 HttpMethodType(shared/http.zod.ts 同一声明,零形状变化)

为什么不是 re-export 路线(C11 #4688 的做法,本簇不适用):把 ./sharedHttpMethod re-export 进 ./ui 会把该入口类型从 5 值悄悄放宽到 7 值,而 HttpRequestSchema.method 运行时仍只接受 5 值 —— method: 'HEAD' 通过编译、.parse() 抛错,类型对运行时说谎。实现走「删名字」:5 值类型保留它在 ./shared 里的诚实名字 HttpMethodType,并从 ./ui 原地可得(编译器 "did you mean" 指向同一入口的正确名字,而不是引诱换路径拿到 7 值那个)。

复核确认:shared/http.zod.ts 与 main 逐字节相同(diff 零接触)—— 7 值声明原样、HttpMethodSchema 仍 5 值,无人「顺手统一」。

消费者证据(三仓实测,全部本次重跑,不引用早前结论)

HEAD 检索 结果
objectstack 23338c3(rebase 后) 所有 import @objectstack/spec/ui 且含 HttpMethod 的文件 + import * as … from '…/ui' 命名空间用法 零代码消费者。命中仅:view.zod.ts(实现本体)、references/ui/http.mdx(AUTO-GEN,本 PR 同步)、quick-reference.mdx:215(链接 shared/http 页,7 值侧,不受影响);examples/app-showcaseimport * as uiHttpMethod 成员访问
cloud 5df2c69 rg "HttpMethod" 全仓 零命中(spec 依赖为 link:,全仓无该字符串)
objectui 785b8a5 同上两类检索 ⚠️ 1 个真实消费链(type-only):packages/types/src/objectql.ts:35 export type { HttpMethod } from '@objectstack/spec/ui';packages/types/src/index.ts:329 再导出 → 仓内下游 packages/core/src/adapters/ApiDataSource.ts:18(经 @object-ui/types,语义就是 5 值)。依赖区间 ^17.0.0-rc.1,下一个 rc 将以 TS2305 显形。迁移一行、零形状变化(HttpMethodType as HttpMethod),已立单 objectstack-ai/objectui#3235(含 A/B 两案与取舍)。index.ts:932export type * as UIUI.HttpMethod 用法;spec-subschema-parity.test.ts 只比较 HttpMethodSchema const,不受影响

即:issue 风险面里「仓内为零」经复核属实;「外部消费者不可见」现在可见了一个,正是 changeset 定 major 时预定价的那类,已转为跟踪单。

基线 14 → 13

dual-source-exports.baseline.json 只删 HttpMethod — [./api, ./shared (type)] ≠ [./ui (type)] 一行(该 ratchet 按 AGENTS.md 属 hand-edited under review,删行由 gate 的 stale-line 检查反向验证)。实跑:

✅  self-test: flags same-name different-declaration exports, and nothing else.
✅  no new dual-source exports: 4328 names across 16 entry points — 168 re-exported
    (single declaration), 13 accepted dual-source (baseline).

authorable-surface 零变化

HttpMethod 是纯 TS 类型别名,不进 schema 面。pnpm --filter @objectstack/spec build(内含 gen:schema,1705 schemas)后 git status --porcelain 输出为空(生成物零漂移);check:generated:

✓ All 8 generated artifacts are up to date.

RENAMED_DEFS(scripts/lib/renamed-defs.ts)与 KNOWN_STILL_DUAL_SOURCE(connector.test.ts:794,仍为 [])均未动;无 tombstone、无 ADR-0087 conversion/migration,spec-changes.json / protocol-upgrade-guide.md 零变化(均在上面 8 个 gate 内)。

生成物 / 表面改动合法性(逐一核对)

  • api-surface.json:仅 ./ui 一行对换 - HttpMethod (type) / + HttpMethodType (type)(check:api-surface 绿 = 与重建后的 dist 逐字一致)。
  • content/docs/references/ui/http.mdx(AUTO-GEN):import 示例 type 行去掉 HttpMethod(check:docs 绿 = 与生成器输出逐字一致)。
  • docs-import-surface.baseline.json:+1 行 ui/HttpMethod — no type export —— 生成器按 JSON-Schema 名 HttpMethod 解析 ./ui 的 type 导出失败(名字已删,HttpMethodType 与 schema 名不同属预期),该 ratchet 的设计就是以基线行显式记账、diff 可见。仅此一行,可逐字解释。

回归 pin(4 条语义)+ sabotage 实证

packages/spec/src/ui/view.test.ts [#4691] 块(3 个 it,覆盖 4 条 pin 语义;compiler-API 形态照 PR #4689,#4642 后本仓唯一有效的类型级 pin,含防空转守卫 moduleSym must resolve + ./ui 表面非平凡断言):

  1. ./uiHttpMethod、有 HttpMethodType 且源自 shared/http.zod.ts;./shared/./apiHttpMethod 为同一声明。
  2. 值域双向 pin:7 值 / 5 值集合逐值断言,HEAD ∈ 7 值 ∉ 5 值。
  3. parse pin:HttpMethodSchema.parse('HEAD'/'OPTIONS') 抛、HttpRequestSchema.parse({url, method:'HEAD'}) 抛、method:'PATCH' 通过(防「拒绝一切」式空转)。

sabotage 矩阵(逐个改坏 → 只跑 [#4691] 块 → 复原;末态 git status 干净):

破坏 结果
S0 干净树基线 Tests 3 passed, 214 skipped
S1 重加 export type HttpMethod = z.infer< typeof HttpMethodSchema > AssertionError: expected [ 'reportForm', 'viewForm', …(413) ] to not include 'HttpMethod'
S2 禁止路线 export type { HttpMethod } from '../shared/http.zod' ❌ 同上 —— pin 同样拦截 re-export 错案
S3 HttpMethodSchema 放宽 5→7 值 ❌ 值域 pin:expected [ 'DELETE', 'GET', 'HEAD', …(4) ] to deeply equal [ 'DELETE', 'GET', 'PATCH', …(2) ];parse pin:expected [Function] to throw an error
S4 7 值枚举收窄(删 HEAD/OPTIONS) ❌ 值域 pin:expected [ 'DELETE', 'GET', 'PATCH', …(2) ] to deeply equal [ 'DELETE', 'GET', 'HEAD', …(4) ]

changeset 定级

.changeset/http-method-dual-source-c14.md,@objectstack/spec major:移除已发布导出名,外部 import type { HttpMethod } from '@objectstack/spec/ui' 以 TS2305 失败(与 C11 定 patch 的情形相反——那次名字仍在)。v17 pre 窗口实测开着(.changeset/pre.json mode: "pre", tag rc)。changeset 含 FROM → TO、以及「不要换成 ./shared 路径保名字」的反模式警告。零元数据迁移。

验证矩阵(实跑,全部串行于共享验证锁)

步骤 结果
pnpm --filter @objectstack/spec build(gen:schema 1705 + gen:openapi + tsup + DTS) ✅ exit 0,后继 git status
check:generated(8 gate:api-surface / docs / authorable-surface / spec-changes / upgrade-guide / skill-refs / skill-docs / react-blocks) All 8 generated artifacts are up to date.
check:dual-source-exports ✅ 13 accepted(14→13)
源码审计组 check:liveness check:strictness-ledger check:empty-state check:variant-docs check:exported-any check:skill-examples(附加 check:react-declaration-parity,无 manifest 按其常规行为跳过) ✅ exit 0
pnpm --filter @objectstack/spec test Test Files 294 passed (294) / Tests 7390 passed (7390)
pnpm --filter @objectstack/spec typecheck ✅ exit 0
全仓 pnpm typecheck --concurrency=2 Tasks: 122 successful, 122 total(8m22s)
sabotage 矩阵(上表) ✅ 4/4 被拦截,基线 3/3 通过

复核记录(对首次实现的逐项独立结论)

  1. 路线正确:实现是「删名字 + re-export HttpMethodType」,不是禁止的 HttpMethod re-export(S2 另证 pin 会拦截该错案)。
  2. 真源未动:shared/http.zod.ts 与 main 逐字节相同;HttpMethodSchema 未被放宽(发现即改回——未发现)。
  3. 消费者结论修正:issue 的「仓内为零」属实;但三仓重验发现 objectui 有 1 个 type-only 消费链(上表),已立 objectui#3235——不改变路线与定级(major 正是为此定的),只是把「不可见的外部消费者」变成了可见的跟踪单。
  4. 基线只删一行、api-surface 一行对换、docs 基线 +1 行、http.mdx 生成器产出——逐一与生成器/gate 对账通过。
  5. changeset 定级与理由复核属实;其文内「实跑 ✓」的声明在首次实现时并未真的跑过,本次全部真实执行(上表)。
  6. 首次实现的 3 个 pin 测试语法完整但从未执行——本次基线跑通 + 4 案 sabotage 全拦截。
  7. 未触碰 content/docs/releases/;无新 tombstone/conversion;KNOWN_STILL_DUAL_SOURCE[]

🤖 Generated with Claude Code

https://claude.ai/code/session_0176qgxgCXTJCUv4YFLtusP9


Generated by Claude Code

…ethodType` (#4691)

`HttpMethod` 曾由三个入口导出但指向两个不同声明:`./shared`/`./api` 是 7 值
z.enum(含 HEAD/OPTIONS),`./ui` 是 `z.infer<typeof HttpMethodSchema>`(5 值
UI 子集)。同名异型,拿到哪个取决于 import 路径(#4411 陷阱),且两侧取值
集合不同,不能像 C11(#4688)那样用 re-export 收敛 —— 那会把 `./ui` 的类型
放宽到 7 值,而 `HttpRequestSchema.method` 运行时仍只接受 5 值,类型开始对
运行时说谎。

处置:删除 `./ui` 的 `HttpMethod` 导出(名字只剩 `./shared`+`./api` 的 7 值
那一个声明),并从 `./ui` re-export 既有的 5 值类型名 `HttpMethodType`
(shared/http.zod.ts 的同一声明,零形状变化),迁移是同入口内的一次改名。
`./shared` 的 7 值声明与 `HttpMethodSchema` 的 5 值语义一字未动。

- dual-source-exports.baseline.json:删 `HttpMethod` 行(14 → 13,
  #4535 v17 双源账最后一条)
- api-surface.json:`./ui` 一行对换(- HttpMethod (type) / + HttpMethodType (type))
- docs-import-surface.baseline.json +1 行、references/ui/http.mdx:生成器产出
- pin(view.test.ts [#4691]):compiler-API 断言 `./ui` 无 `HttpMethod`、
  值域 7/5 双向 pin、`HttpRequestSchema.parse({method:'HEAD'})` 拒绝 pin;
  全部 sabotage 实证
- changeset:@objectstack/spec major(移除已发布导出名),含 FROM → TO

已知外部消费者:objectui packages/types(type-only 一行),迁移单
objectui#3235;objectstack / cloud 两仓零消费者(实测)。

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0176qgxgCXTJCUv4YFLtusP9
@vercel

vercel Bot commented Aug 3, 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 3, 2026 12:03am

Request Review

@github-actions github-actions Bot added size/m documentation Improvements or additions to documentation tests protocol:ui tooling labels Aug 3, 2026
@github-actions

github-actions Bot commented Aug 3, 2026

Copy link
Copy Markdown
Contributor

📓 Docs Drift Check

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

107 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 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 marked this pull request as ready for review August 3, 2026 00:04
@os-zhuang
os-zhuang enabled auto-merge August 3, 2026 00:04
@os-zhuang
os-zhuang added this pull request to the merge queue Aug 3, 2026
Merged via the queue into main with commit d52d4fe Aug 3, 2026
22 checks passed
@os-zhuang
os-zhuang deleted the claude/issue-4691-http-method-dual-source branch August 3, 2026 00:24
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:ui size/m tests tooling

Projects

None yet

Development

Successfully merging this pull request may close these issues.

spec 双源清账 C14:HttpMethod(./api, ./shared ≠ ./ui)—— 1 条,且两侧是「7 值 vs 5 值」的真分歧,不是同形别名

2 participants