feat(spec)!: 改名 studio 侧 ActionLocationSchema → ActionContributionLocationSchema —— 双源清账 C17,裸名唯一归 ./ui (#4737) - #4768
Conversation
…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>
|
The latest updates on your projects. Learn more about Vercel for GitHub. 1 Skipped Deployment
|
📓 Docs Drift CheckThis PR changes 1 package(s): 107 hand-written doc(s) reference the affected code and may need an implementation-accuracy re-verification:
|
…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>
🔄 入队前收尾:已并入 #4767(C10)后的 main 并全量重生成复验基线口径更新(正文里 6 → 5 的写法已过时):C10 合并后 main 基线为 3,本单删 1 行 → 2。 与 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
合并 #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>
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_toolbar…global_nav,docblock 自宣全平台唯一真源)。三仓消费者复核(import 级,实施前重扫)
先锋结论逐条复核,一致:
ActionLocationSchema引用仅:studio/plugin.zod.ts(声明 +ActionContributionSchema.location)、studio/index.ts、studio/plugin.test.ts+ 生成物/基线。packages/lint的 validate-action-locations 不 import spec 任何符号(本地词表),不受影响。root.入口不导出该名。ActionLocation repo:objectstack-ai/cloud→ 0 命中。types/src/ui-action.ts、spec-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/studio→ 0 命中,不受本改名影响。实施
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/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:dual-source-exports(基线 6 → 5,rebase 后终态):check:generated(rebase 后终态):源码审计组:
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 ✓;全仓 typecheck122 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(禁止路线:
./studiore-export ui 声明顶旧名 —— 对 dual-source 门禁不可见的语义谎报),被两层独立拦截:且 build 本身在 gen:schema 阶段直接拒绝(比预期更强 —— 该路线连构建都过不去):
(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✅(输出见上)。入队备注
695cfbd8f(feat(spec)!: 退役RestServerConfig.openApi31整块 —— declared ≠ enforced,零运行时读者 (#4579) #4764 之后)并重生成 + 全量复验,delta 对 main 恰为本单意图(api-surface ±:+ActionContributionLocation (type)/+ActionContributionLocationSchema (const)/-ActionLocationSchema (const))。./studiodef 文件与入口 + 生成物 + docs 基线;未触碰 api / system / cloud / automation / integration / data / ai 区,与在飞 C10(system+cloud)不相交。content/docs/releases/。Generated by Claude Code