Skip to content

feat(spec)!: 改名 studio 侧 ActionLocationSchema → ActionContributionLocationSchema —— 双源清账 C17,裸名唯一归 ./ui (#4737) - #4768

Merged
os-zhuang merged 2 commits into
mainfrom
claude/issue-4737-action-location-dual-source
Aug 3, 2026
Merged

feat(spec)!: 改名 studio 侧 ActionLocationSchema → ActionContributionLocationSchema —— 双源清账 C17,裸名唯一归 ./ui (#4737)#4768
os-zhuang merged 2 commits into
mainfrom
claude/issue-4737-action-location-dual-source

Conversation

@os-zhuang

Copy link
Copy Markdown
Contributor

Fixes #4737(#4535 C17,第二批,v17 破坏窗口内)。

路线(已裁决,按 #4737 body 执行)

前锋判定 + 维护者 2026-08-03 批复:D9(a) 改名 studio 侧ActionContributionLocationSchema;ui 侧正名一字未动。ActionLocationSchema 曾由 ./studio./ui 各自导出一个声明 —— 同名、词表完全互斥的两个概念(#4411 陷阱):studio 侧 3 值 IDE surface 枚举(toolbar / contextMenu / commandPalette,唯一嵌入方 ActionContributionSchema.location)vs ui 侧 7 值平台正典(list_toolbarglobal_nav,docblock 自宣全平台唯一真源)。

三仓消费者复核(import 级,实施前重扫)

先锋结论逐条复核,一致:

结果
objectstack studio 侧 ActionLocationSchema 引用仅:studio/plugin.zod.ts(声明 + ActionContributionSchema.location)、studio/index.tsstudio/plugin.test.ts + 生成物/基线。packages/lint 的 validate-action-locations 不 import spec 任何符号(本地词表),不受影响。root . 入口不导出该名。
cloud GitHub code search ActionLocation repo:objectstack-ai/cloud0 命中
objectui 14 个文件全部消费 ui 侧(ActionEngine、types/src/ui-action.tsspec-derived-unions.test.ts:379-383 按引用钉住 ACTION_LOCATIONS、parity ratchet 等)—— ui 侧本 PR 一字未动,零迁移,不复演 objectui#3235(C15 的 S3 教训)。对 ./studio 的唯一代码引用是 export type * as Studio(type-only 命名空间),对 const 改名不可见;新增的 ActionContributionLocation 类型导出对其纯增量。

扫描集外补充:objectstack-ai/studio 仓(私有,2026-02-22 起未更新,处置手册四仓集之外)有 spec/studio 字样引用,但 ActionLocation repo:objectstack-ai/studio0 命中,不受本改名影响。

实施

  • studio/plugin.zod.ts:改名 + 完整改名注释(含「禁止 re-export ui 枚举」的守则);新增 ActionContributionLocation 类型导出(旧 const 从无 type 导出,顺带消掉 docs-import-surface 基线的 no-type-export 例外行 —— 基线只减不增,若不补类型导出,改名会产生一条新例外行直接打红 check:docs)。
  • studio/index.ts:导出改名 + 类型导出。
  • scripts/lib/renamed-defs.ts:studio/ActionLocation → studio/ActionContributionLocation(0-key carry —— 枚举 def 无 authorable properties,authorable-surface.json 逐字节零变化,以门禁实跑为准,见下)。零 tombstone(无 key 退役)、零 ADR-0087 conversion(StudioPluginManifest 是根 schema,不在 stack 树,converge-activation-event-schema 先例)。
  • dual-source-exports.baseline.json:删 ActionLocationSchema 行,6 → 5
  • docs-import-surface.baseline.json:删 studio/ActionLocation — no type export 行(shrink-only,stale 行不删即红)。
  • 幽灵页 content/docs/references/studio/action.mdx 随 gen:docs 自愈删除(build-docs.ts 的 schema→页面索引按「裸名字」全局建表,同名跨 category 的 schema 会被归到错误的页面 #4696 语境):ActionContributionLocation 现落到它真正的家 studio/plugin.mdx,import 示例行同时补进 const + type。
  • changeset:major,FROM → TO 及零元数据迁移论证见 .changeset/action-location-dual-source-c17.md

定级自证(#4535 §5,不抄别簇)

major:./studio 已发布 const 名消失,曾 import 它的 TypeScript 自 v17 起 TS2305。零已知受影响方(上表三仓 + studio 仓零外部 importer)。零元数据迁移:作者写的 contributes.actions[].location 取值域(3 值)逐字节不变,已有清单原样解析;def 改名经 RENAMED_DEFS 承接,发布的 JSON Schema $id 随动。

门禁自证(实跑输出)

删基线行自证(0-key def 改名,不触发 authorable-surface 删行 —— 门禁实跑证实):

✓ check:authorable-surface   authorable-surface.json + JSON schemas   (authorable-surface.json 零 diff = 0-key carry)
json-schema.manifest.json:  -"studio/ActionLocation"  +"studio/ActionContributionLocation"  (RENAMED_DEFS 承接,±1 行)

check:dual-source-exports(基线 6 → 5,rebase 后终态):

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

check:generated(rebase 后终态):

✓ All 8 generated artifacts are up to date.

源码审计组:check:liveness ✓ / check:empty-state ✓ / check:skill-examples ✅ 202 / check:variant-docs ✓ / check:exported-any ✅ / check:react-declaration-parity(本地无 objectui manifest,照常 skip)/ check:strictness-ledger(site counts match —— 纯改名不动 site 数,台账零改动,实跑为准)。

测试与类型:spec 7351 passed (7351);spec typecheck ✓;全仓 typecheck 122 successful, 122 total(rebase 到 #4764 之后重跑)。

符号身份 pin + sabotage(#4642 形态,照 PR #4760)

新增 packages/spec/src/studio/action-location-retirement.test.ts:TypeScript compiler API 在 src 上做符号身份解析,从 exports map 枚举全部 16 入口(防新入口逃逸)+ 防空转守卫(module symbol 必解析、./studio 表面 > 40 名、邻居健在)+ holders 精确相等断言(ActionLocation(Schema)ACTION_LOCATIONS 必须恰为 ['./ui']、origin 钉在 src/ui/action.zod.ts;ActionContributionLocation(Schema) 恰为 ['./studio'])+ 活路径断言(manifest 经改名后枚举照常 parse,list_toolbar 在 studio 清单里仍响亮被拒)。

S1(禁止路线:./studio re-export ui 声明顶旧名 —— 对 dual-source 门禁不可见的语义谎报),被两层独立拦截:

× resolves the export surface: one owner per name, across every public entry
  AssertionError: ./studio must not export ActionLocationSchema
× keeps the runtime namespaces consistent with the compiler view
  Tests  2 failed | 1 passed (3)

且 build 本身在 gen:schema 阶段直接拒绝(比预期更强 —— 该路线连构建都过不去):

❌ 1 problem(s) in RENAMED_DEFS (scripts/lib/renamed-defs.ts):
   - studio/ActionLocation → studio/ActionContributionLocation: the SOURCE def is still
     emitted by this build. That is a copy, not a rename — and a copy is precisely the
     dual-source shape this table must never be able to launder (#4411, #4446).

(dual-source 门禁对 re-export 的结构性盲区由其 self-test 固定(fixture 断言 re-export 不许被标),故 pin 的 holders 精确相等断言是该路线唯一的符号级守卫。)

S2(复活旧 3 值声明顶旧名 —— 双源回归),同样两层拦截:pin 同上 2 failed;check:authorable-surface 红(同一条 copy-not-a-rename 不变式)。

两次 sabotage 后均已还原,还原后终态:pin 3/3 passed、check:dual-source-exports ✅、check:authorable-surface ✅(输出见上)。

入队备注


Generated by Claude Code

…ationSchema —— 双源清账 C17,裸名唯一归 ./ui (#4737)

- studio 3 值 IDE surface 枚举与 ui 7 值平台正典同名不同概念(#4411 陷阱),
  按 ADR-0112 D9(a) 改名 studio 侧;ui 侧一字未动
- RENAMED_DEFS 承接 studio/ActionLocation → studio/ActionContributionLocation
  (0-key carry,枚举 def 无 authorable properties);零 tombstone、零 conversion
- 新增 ActionContributionLocation 类型导出,docs-import-surface 基线
  no-type-export 例外随之删行
- dual-source-exports 基线 6 → 5;幽灵页 references/studio/action.mdx 随
  gen:docs 自愈(#4696 语境)
- compiler-API 符号身份 pin(exports map 全入口枚举 + 防空转守卫 + holders
  精确相等),S1/S2 sabotage 实证见 PR

Claude-Session: https://claude.ai/code/session_0176qgxgCXTJCUv4YFLtusP9

Co-authored-by: Claude <noreply@anthropic.com>
@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 6:07am

Request Review

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

…dual-source

生成物冲突按 #4535 §7 重新生成,不做文本合并:
- json-schema.manifest.json:合并会静默复活 C10 蓄意删除的 9 个
  system/EnvironmentArtifact* 键(gen:schema 实测报 disappeared),故取 main
  版本后由 gen:schema 重新落我方 RENAMED_DEFS 承接(studio/ActionLocation →
  studio/ActionContributionLocation),delta 对 main 恰 ±1 行
- 两张 shrink-only ratchet(dual-source / docs-import-surface)不归 merge
  driver 管,手工解冲突:取 main 版本后只删本单那一行,diff 对 main 为纯单行删除
- api-surface.json / references 由 gen:api-surface + gen:docs 从合并树重生成
- authorable-surface.json 与 main 逐字节一致(0-key carry 复证)

Claude-Session: https://claude.ai/code/session_0176qgxgCXTJCUv4YFLtusP9

Co-authored-by: Claude <noreply@anthropic.com>

Copy link
Copy Markdown
Contributor Author

🔄 入队前收尾:已并入 #4767(C10)后的 main 并全量重生成复验

基线口径更新(正文里 6 → 5 的写法已过时):C10 合并后 main 基线为 3,本单删 1 行 → 2

与 main 同步的方式

git merge origin/main(非 rebase)。分支已推送到远端,rebase 只能靠 force-push 落地,而 AGENTS.md 多 agent 纪律 §3 明令禁止 --force / --force-with-lease;merge 是 AGENTS.md §9/§10/§11 明确支持的路径(merge=os-regen 驱动本就是为它写的),终态与 rebase 等价:base 为当前 main 9f601e892,delta 恰为本单意图,推送为普通 fast-forward,零 force。合并提交已说明每个生成物的处置理由。

⚠️ 静默回退陷阱:本单同样中招,且是在 manifest 上

PM 点名的两处(两张 ratchet)如期冲突;第三处更隐蔽:json-schema.manifest.json 归 merge driver 管、无冲突标记,但合并结果静默复活了 C10 蓄意删除的 9 个 system/EnvironmentArtifact* —— 只有 gen:schema 实跑才暴露:

❌ 9 previously published schema(s) disappeared from this build:
     - json-schema/system/EnvironmentArtifact.json
     - json-schema/system/EnvironmentArtifactChecksum.json
     … (共 9 个)

处置(#4535 §7:生成物冲突只能重新生成):三份文件一律取 main 版本为底,再只落本单那一处改动,而不是文本合并 ——

文件 处置 对 main 的 delta
json-schema.manifest.json 取 main 版本 → gen:schema 重新落 RENAMED_DEFS 承接 -studio/ActionLocation / +studio/ActionContributionLocation(±1 行)
dual-source-exports.baseline.json(非 driver 管辖,手工解) 取 main 版本 → 只删本单一行 纯单行删除
docs-import-surface.baseline.json(同上) 取 main 版本 → 只删本单一行 纯单行删除
api-surface.json / references/** gen:api-surface + gen:docs 从合并树重生成 仅 C17 三行 + studio docs
authorable-surface.json 取 main 版本,生成器零改写 与 main 逐字节一致(0-key carry 二次复证)

顺带说明:两张 ratchet 在 main 上现为 转义字节形(C10 PR 带入,生成器 JSON.stringify 本会写字面 em-dash)。本单不做全文件规范化重写 —— 那会把 diff 变成整файл改写、掩盖「只删一行」的意图,正是 #4650/#4663 警惕的手编气味;按 main 现状只删行,保持最可审。字节形归一若要做,应是独立单。

复验终态(合并树上重跑,flock 前台)

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

✓ All 8 generated artifacts are up to date.

✅ Successfully generated 1679 schemas.            (check:authorable-surface)

Test Files  1 passed (1)   Tests  3 passed (3)     (pin: action-location-retirement.test.ts)
Tests  7351 passed (7351)                          (spec 全量)
> tsc --noEmit                                     (spec typecheck ✓)
Tasks:  122 successful, 122 total                  (全仓 typecheck)

蓄意变更逐项确认仍在:改名(3 处源文件)、RENAMED_DEFS 承接行、两条基线删行、类型导出、changeset、pin 测试 —— 无一被合并回退。

保持 draft;转正 / auto-merge / 入队由 PM 执行。


Generated by Claude Code

@os-zhuang
os-zhuang marked this pull request as ready for review August 3, 2026 06:09
@os-zhuang
os-zhuang enabled auto-merge August 3, 2026 06:09
@os-zhuang
os-zhuang added this pull request to the merge queue Aug 3, 2026
Merged via the queue into main with commit e6ac4bd Aug 3, 2026
22 checks passed
@os-zhuang
os-zhuang deleted the claude/issue-4737-action-location-dual-source branch August 3, 2026 06:31
os-zhuang pushed a commit that referenced this pull request Aug 3, 2026
合并 #4768(C17)/ #4786 / #4780 / #4783(#4634,31 位能力位退役)后重生成。

按 #4535 §7 与「rebase/merge 静默回退」纪律处理三张 ratchet:
`dual-source-exports.baseline.json` / `authorable-surface.json` /
`json-schema.manifest.json`(+ `api-surface.json`)一律 `git checkout
origin/main --` 取 main 版本后全量重跑生成器,只重施本 PR 的一处改动。
其中 json-schema.manifest.json 与 authorable-surface.json 归 os-regen
merge driver 管、合并不产生冲突标记,最易静默回退,故以 gen:schema 实跑
输出为准。

逐项确认他人蓄意变更未被回滚(regen 后实测):
- #4783 `data/DriverCapabilities:*` 31 行 [RETIRED] + 3 行存活 —— 均在
- C10 `system/EnvironmentArtifact*` 删除 —— 仍为 0
- C17 `studio/ActionLocation` → `studio/ActionContributionLocation` —— 旧 0 新 1
- 本 PR `kernel/PackageDependency` → `kernel/ResolvedPackageDependency` —— 旧 0 新 1

`renamed-defs.ts` 冲突为两条独立改名条目并存(C17 与本簇),按时序保留两条。

dual-source 基线 2 → **0**(entries: []),#4535 第二批收官、双源账目归零。

Claude-Session: https://claude.ai/code/session_0176qgxgCXTJCUv4YFLtusP9

Co-authored-by: Claude <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 size/m tests tooling

Projects

None yet

Development

Successfully merging this pull request may close these issues.

spec 双源清账 C17:ActionLocationSchema(./studio ≠ ./ui)—— studio 侧 D9(a) 改名,1 条

2 participants