Skip to content

refactor(spec)!: 退役 plugin-runtime 家族五个 schema —— 无任何 runtime 实现的「Dynamic Loading」词表 (#4834, ADR-0049) - #4878

Merged
os-zhuang merged 3 commits into
mainfrom
claude/issue-4834-plugin-runtime-family-retire
Aug 3, 2026
Merged

refactor(spec)!: 退役 plugin-runtime 家族五个 schema —— 无任何 runtime 实现的「Dynamic Loading」词表 (#4834, ADR-0049)#4878
os-zhuang merged 3 commits into
mainfrom
claude/issue-4834-plugin-runtime-family-retire

Conversation

@os-zhuang

@os-zhuang os-zhuang commented Aug 3, 2026

Copy link
Copy Markdown
Contributor

Fixes #4834

按维护者裁决(remove)删除 packages/spec/src/kernel/plugin-runtime.zod.ts 的五个 schema 及全部类型别名。整个文件就此清空,因此文件本身与 kernel/index.ts 的 re-export 一并删除 —— 文件里除这五个 def 外只剩两块 REMOVED 注释(#3896 的 discovery/sandbox 岛、#4657ActivationEventSchema),没有任何残留活物。

删除的十二个名字:DynamicLoadRequestSchema / DynamicUnloadRequestSchema / DynamicPluginResultSchema / PluginSourceSchema / DynamicPluginOperationSchema,以及 DynamicLoadRequest / DynamicUnloadRequest / DynamicPluginResult / PluginSource / DynamicPluginOperation / DynamicLoadRequestInput / DynamicUnloadRequestInput


1. 三仓消费方复核(裸名扫描 + 对照验证)

扫描词为五个 schema 名 + 五个类型名(裸名 DynamicLoadRequest 等同时覆盖 ...Schema...Input)。

路径 / HEAD 五名命中 对照验证(证明扫描器与路径有效)
objectstack 本 worktree 仅本包自身声明、自身单测、生成物、历史 changeset/CHANGELOG 散文 —— 零 runtime consumer 不适用(命中非空)
objectui git -C /workspace/objectui grep,785b8a5 0(exit=1) PluginContextROADMAP.mdpackages/core/src/registry/PluginSystem.tspackages/types/src/plugin-scope.ts 等命中;@objectstack/spec/kernel importer 命中 10+ 文件(app-shell/.../PackagesPage.tsxcore/src/validation/schema-validator.ts …)
cloud git -C /workspace/cloud grep,5df2c69 0(exit=1) PluginContextpackages/objectos-runtime/src/ai-token-guardrail-plugin.ts 等;@objectstack/spec/kernel importer → apps/objectos/test/always-on-slate.test.tspackages/objectos-runtime/src/capability-loader.ts

⛔ 两个 sibling 仓全程用 git -C 路径 grep 形式(带 -C 参数),没有 cd。空结果均以「确定存在的邻近词反查」证伪了「扫描器/路径坏了」这一解释。

另核:*.form.tspackages/cliskills/examples/ 四处零命中 —— 因此本单不涉及 form input 裁剪,也不触发 i18n bundle 变更(pnpm check:i18n 实跑 OK 佐证)。

2. 退役形态:#4650 路径 3(门禁实跑裁定,非照抄先例)

没有走 retiredKey() 墓碑:这五个 schema 已无任何东西去 parse,「一份没人能收到的处方就是噪音」—— 正是本模块自己在 #3896 立下的先例。

第一次 gen:schema 实报 —— json-schema.manifest.json ratchet(#2978)先开火:

❌ 5 previously published schema(s) disappeared from this build:
     - json-schema/kernel/DynamicLoadRequest.json
     - json-schema/kernel/DynamicPluginOperation.json
     - json-schema/kernel/DynamicPluginResult.json
     - json-schema/kernel/DynamicUnloadRequest.json
     - json-schema/kernel/PluginSource.json
   ... if the removal is deliberate — delete the key(s) from
   packages/spec/json-schema.manifest.json in the same PR.

按其指示有意删除五个 manifest key 后重跑,per-key ratchet 自行判定为路径 3:

ℹ️  4 baseline deletion(s) since beefe89b2488 carry their own proof (#4650):
     - kernel/DynamicLoadRequest:* (7 line(s)) — def no longer emitted by this build; whole-schema
       removals are adjudicated by json-schema.manifest.json (#2978) and check:api-surface.
     - kernel/DynamicPluginResult:* (7 line(s)) — 同上
     - kernel/DynamicUnloadRequest:* (5 line(s)) — 同上
     - kernel/PluginSource:*        (4 line(s)) — 同上

✅ Generated bundled schema: objectstack.json (1651 definitions)
✅ Successfully generated 1668 schemas.

四张 ratchet 确有变化(#4391 的「枚举值收窄对 ratchet 不可见」异常信号未出现,符合整 def 删除的预期)。相对 origin/main 的净 delta,零新增:

生成物 delta
api-surface.json −12(五个 const + 七个 type),+0
authorable-surface.json −23 行,+0
json-schema.manifest.json −5 def
content/docs/references/kernel/ plugin-runtime.mdx 删除,meta.json / index.mdxgen:docs 重算

3. ADR-0087 conversion 逐条评估

对照两侧先例:需要 D2 的是有作者源 / sys_metadata 行可改写的(#4734 enable.trash#4391 crypto.hash token);不需要的是纯导出面或 runtime 请求形状(#4767 / #4783 / #4616 / #4657)。逐个论证:

  • DynamicLoadRequestSchema — runtime 请求载荷形状,根 schema,无任何父 schema 嵌入它,不在 stack 树内(applyConversions 接在 normalizeStackInput 上,只走 stack 树)。四仓零 caller,连「构造过一个」的证据都不存在。无 D2:conversion 要改写的源不存在,伪造一个永远命中不了的 conversion 只会制造「已自动迁移」的假象。
  • DynamicUnloadRequestSchema — 同上,请求形状。无 D2
  • DynamicPluginResultSchema响应/结果形状,连作者面都谈不上(作者从不写 result,只可能去读)。这正是 skill 里点名的 EnhancedApiError.fieldErrors 那一类:response-surface with no source to rewrite → 登记为 D3 SemanticMigration,不是 D2。无 D2
  • PluginSourceSchema — 本单里唯一需要单独判断「是否出现在作者源里」的一个。结论:。它的唯一可达路径是 DynamicLoadRequest.source(gen:schema 的可达性 BFS 亦证实:它不从任何 metadata-type root 可达,故其 authorable-surface 条目本就是 over-collection),既不是独立 metadata type,也不被 .stack.ts / objectstack.config.ts 的任何键嵌入 —— stack.pluginsz.array(z.unknown()),manifest 走自己的形状。没有 sys_metadata 行能携带它。无 D2
  • DynamicPluginOperationSchema — 纯枚举 def,唯一可达路径是 DynamicPluginResult.operation,随之而去。无 D2

→ 五个全部无 D2,统一登记为一条 ADR-0087 D3 SemanticMigration plugin-runtime-family-retired(与 #4616 / #4767 / #4783 同一处置)。

4. #4657 D3 条目 plugin-activation-events-retired 的处置 —— 保留并修正

理由(以事实而非直觉裁定):该条目是双 surface 的,kernel.dynamicLoadRequest.activationEvents / studio.studioPluginManifest.activationEvents。studio 那一半至今活着:StudioPluginManifestdefineStudioPlugin 的入参,仍以 strict parse + guidance 拒绝该键。删掉整条会连同一个仍在生效的迁移记录一起删掉,历史链也断。

因此:条目保留,kernel 半边的散文改写为记录本次 supersede(不再声称存在一个 retiredKey() 墓碑 —— 那是删除后立刻会变成假话的一句),acceptanceCriteria 同步改为「kernel 侧适用 #4834 的更强判据:根本不存在 DynamicLoadRequest 可以把这个键写进去」。step17 的 rationale 也补了一段 supersede 说明。这就是 skill §4「a correction must propagate to every one of these lines」那条纪律。

5. 两层迁移话术(合并写清)

DynamicLoadRequestSchema 上挂着 #4657 刚立的 activationEvents 墓碑,整 def 删除会连墓碑一起带走。这是合法的 —— 「整个请求形状已移除」严格强于「该键已移除」—— 但作者收到的指令因此变了,changeset 与 D3 都按两层合并写:

#4657 告诉你的是:把这个键从你的 DynamicLoadRequest 里删掉
现在正确的指令是:把整个 DynamicLoadRequest 删掉
承载这个键的形状本身已不存在,所以它的 retiredKey() 处方随之消失。从 v16 升级、且以任一形式写过 activationEvents(v16 字符串 ['onMetadataType:flow'],或 #4653 之后的结构化 [{ type, pattern }])的作者,根本不需要迁移这个键 —— 它所在的那个值既没有形状也没有接收方。
#4657 的 studio 半边不受影响:defineStudioPlugin 仍是活的作者面,仍以自己的处方拒绝 activationEvents,那一侧照旧删键。

6. Pin + sabotage 实跑

新增 packages/spec/src/kernel/plugin-runtime-retirement.test.ts:TypeScript compiler-API 程序,从 package.json 的 exports map 枚举全部公共入口,对十二个名字断言 holdersOf(name) 精确相等 [](不是 not.toContain)。三道防空转守卫:入口枚举必须含 ../kernel 且多于 10 项;每个入口的 module symbol 必须解析成功;holdersOf 必须能在存在的名字上找到 holder(holdersOf('PluginSchema')./kernel)。另有 runtime namespace 一致性断言与「模块本身已不存在,深路径 import 也拿不到」。

sabotage 三项实跑输出:

##### SABOTAGE 1: resurrect PluginSourceSchema in ./kernel #####
AssertionError: PluginSourceSchema must have zero holders: expected [ './kernel' ] to deeply equal []
AssertionError: ./kernel must not export PluginSourceSchema: expected true to be false
 Tests  2 failed | 1 passed (3)

##### SABOTAGE 2: re-export DynamicPluginOperationSchema from ./studio (a DIFFERENT entry) #####
AssertionError: DynamicPluginOperationSchema must have zero holders: expected [ './studio' ] to deeply equal []
 Tests  2 failed | 1 passed (3)

##### SABOTAGE 3: point the entry enumeration at nothing (vacuity check) #####
AssertionError: exports map must include .: expected [] to include '.'
 Tests  2 failed | 1 passed (3)

即:复活声明红、从别的入口顶名 re-export 红、空转检验被守卫拦住而非静默通过。

同时改了 #4657 的 pin(activation-events-retirement.test.ts):它的防空转锚点原本用 DynamicLoadRequestSchema / PluginSourceSchema(被退役键的父形状),现改为存活邻居 PluginSchema / PluginContextSchema;其 kernel 侧 parse 断言随墓碑一并移除,studio 侧断言原样保留。

7. 验证读数(全部实跑)

读数
gen:schema ✅ 1668 schemas / 1651 definitions;路径 3 自证输出见 §2
check:generated All 8 generated artifacts are up to date
check:authorable-surface ✅ PASS
check:api-surface ✅ PASS(−12 / +0)
check:dual-source-exports 0 accepted dual-source(4264 names across 16 entry points,171 re-exported)
源码审计组 check:liveness / check:empty-state / check:skill-examples / check:react-declaration-parity / check:variant-docs / check:strictness-ledger / check:exported-any 全 PASS
check:spec-changes / check:upgrade-guide / check:skill-refs / check:skill-docs ✅ PASS
pnpm check:i18n ✅ OK(9 packages,all bundles in sync)
spec test 295 files / 7353 tests passed
spec typecheck tsc --noEmit 无输出
全仓 typecheck 122 successful, 122 total
全仓 build 71 successful, 71 total

8. 同步记录

push 前 git fetch origin main 发现 main 前进到 0e96e4628(#4871 / #4391 crypto.hash 退役,同样动 spec 生成物),按 AGENTS.md §3 走 git merge origin/main(未 rebase、未 force-push)

  • packages/spec/src/migrations/registry.ts 冲突:双方都在 step17 的 rationale 尾部追加段落。两边条目全部保留(我方 supersede 段在前,对方以 "Finally it removes…" 开头的段在后),并把我方末行结尾的引号加逗号改为引号接 \n\n 续接。
  • 生成物一律用 git checkout origin/main -- 加文件路径的方式取 main 版,重新施加本单的基线删除(23 authorable 行 + 5 manifest key),再 pnpm install --frozen-lockfilebuildcheck:generated --fix 整体重新生成,不做任何文本合并。commit 时 os-regen 守卫确认 spec-changes.jsonprotocol-upgrade-guide.md 两件 deferred artifact 均 current。
  • 合并后 §7 全部读数重跑一遍(表内数字即合并后读数)。

9. 其他


🤖 Generated with Claude Code

https://claude.ai/code/session_0176qgxgCXTJCUv4YFLtusP9

claude added 2 commits August 3, 2026 12:16
…ing" vocabulary no runtime implemented (#4834, ADR-0049)

ADR-0049 enforce-or-remove, maintainer-ruled REMOVE. `DynamicLoadRequestSchema`,
`DynamicUnloadRequestSchema`, `DynamicPluginResultSchema`, `PluginSourceSchema`
and `DynamicPluginOperationSchema` (+ seven type aliases) declared runtime
load / unload / reload of plugins without a kernel restart — sources, integrity
hashes, sandboxing, drain strategies, dependent-cascade policy. None of those
operations exists. Bare-name scan of objectstack, cloud (5df2c69) and objectui
(785b8a5): zero references outside this package's declaration, its unit tests
and the generated artifacts, each empty result control-verified against a
known-present neighbour. The whole module is deleted.

#3896 removed this module's discovery/sandbox config island and left these five
in place explicitly ("operation contracts, not security promises; the
enforce-or-remove call on them is a design decision rather than a correction") —
a suspension that lived only in a changeset paragraph with no issue carrying it.
#4834 is that decision.

Route: whole-def removal (#4650 route 3). No `retiredKey()` tombstones —
nothing parses these schemas, so a prescription could never be received; the
same disposition this module set in #3896. The `json-schema.manifest.json`
ratchet (#2978) demanded the five def keys be deleted deliberately, and
gen:schema then reported all 23 authorable-surface deletions as carrying their
own proof ("def no longer emitted by this build").

This subsumes the kernel half of #4657: `DynamicLoadRequest.activationEvents`'s
`retiredKey()` tombstone goes with the shape that carried it, which is strictly
stronger than the tombstone ("this request shape does not exist" > "this one key
does not exist"). The studio half (`StudioPluginManifest.activationEvents`) is
untouched and still enforced. The #4657 D3 entry is corrected rather than
deleted — its studio half is live and its history must keep replaying.

- ADR-0087 D3 semantic migration `plugin-runtime-family-retired` (no
  `sys_metadata` source exists for a D2 rewrite: these are root request/result
  payload shapes, embedded in no parent schema)
- compiler-API export pin with three anti-vacuity guards, `holdersOf(name)`
  exactly `[]` across all 16 entries — sabotage-verified
- PLUGIN_STANDARDS.md §5.3 + capability table now say "Not built", not ✅
- baselines regenerated from rebuilt source; changeset carries the merged
  two-layer migration narrative

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0176qgxgCXTJCUv4YFLtusP9
…gin-runtime-family-retire

# Conflicts:
#	packages/spec/src/migrations/registry.ts
@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:52pm

Request Review

@github-actions github-actions Bot added documentation Improvements or additions to documentation tests tooling size/xl 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.

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

Copy link
Copy Markdown
Contributor Author

二次同步完成(a2ebea2e8)—— 已可入队

git merge origin/main(⛔ 未 rebase / 未 force-push),本次零冲突:#4852 只动 packages/core/src/kernel.ts 与 strictness-ledger 的量尺,与本单 diff 无重叠。

四单条目并存(逐条实查,非目测)

条目 归属 位置 spec-changes.json
plugin-activation-events-retired #4657 migrations/registry.ts semantic 2
batch-row-result-schema-shape #4793 / #4841 migrations/registry.ts:942 semantic 2
hook-body-crypto-hash-removed #4391 / #4871 conversions/registry.ts:3460(D2),wired at migrations/registry.ts:824 2
plugin-runtime-family-retired 本单 migrations/registry.ts semantic 2

一条未丢。注意 hook-body-crypto-hash-removedD2 conversion(不在 semantic[]),按 conversionIds 挂在 step17 上 —— 用 id: '...'migrations/registry.ts 会得到 0,这是形态差异不是丢失。

ratchet delta 相对新 main —— 纯删除,零新增

生成物
api-surface.json −12 0
authorable-surface.json −23 0
json-schema.manifest.json −5 0
dual-source-exports.baseline.json 0 0(未触碰)

check:generated 在合并后直接就是 current,无需重生成 —— #4852 未动任何生成物。因此本次没有 git checkout origin/main -- 文件 + 整体重生成的动作可做,也没有触发 #4868(os-regen 未挂起任何 deferred artifact)。

精确名 0 命中(⚠️ 全名带引号匹配,规避子串误撞)

api-surface.json 中,#4616 / #4657 / 本单的退役名逐个精确查,全部 0:

EmailTemplateSchema (const)            0      ActivationEventSchema (const)      0
SMSTemplateSchema (const)              0      ActivationEvent (type)             0
PushNotificationSchema (const)         0      DynamicLoadRequestSchema (const)   0
InAppNotificationSchema (const)        0      PluginSourceSchema (const)         0
EmailTemplate / SMSTemplate /                 DynamicPluginOperation (type)      0
PushNotification / InAppNotification (type)  0

对照验证(证明匹配器不是恒返 0):EmailTemplateDefinitionSchema (const) = 1PluginSchema (const) = 1NotificationSeveritySchema (const) = 1。这正是子串匹配会误撞的那个 EmailTemplateDefinition 家族 —— 精确名下它安然存活,退役名归零。

合并后重跑读数

读数
gen:schema / check:generated All 8 generated artifacts are up to date
check:dual-source-exports 0 accepted dual-source(4264 names / 16 entry points,171 re-exported)
check:strictness-ledger(#4852 新量尺) ✅ 67 files / 5 triaged dirs,site counts match;remaining-strip 51 open files / 325 sites,counts match
源码审计组 check:liveness / check:empty-state / check:skill-examples / check:react-declaration-parity / check:variant-docs / check:exported-any 全 PASS
check:authorable-surface / check:api-surface / check:spec-changes / check:upgrade-guide / check:skill-refs / check:skill-docs ✅ 全 PASS
spec test 295 files / 7360 tests passed
spec typecheck tsc --noEmit 无输出
全仓 typecheck 122 successful, 122 total
全仓 build 71 successful, 71 total

HEAD f30f045e5 已 push。未 un-draft、未 auto-merge,等你操作。


Generated by Claude Code


Generated by Claude Code

Copy link
Copy Markdown
Contributor Author

✅ 验收通过 —— 已转正 + auto-merge

同步后的 head f30f045e5 由我独立复跑判据(不采信报告数字),读数如下。

1. 同步形态合规

f30f045e5 Merge remote-tracking branch 'origin/main' into claude/issue-4834-...
8f3eb49aa Merge remote-tracking branch 'origin/main' into claude/issue-4834-...
a2ebea2e8 fix(spec): #4001 重测 …… (#4852)

两次都是 merge commit,git merge-base --is-ancestor a2ebea2e8 f30f045e5YES。无 rebase、无 force-push,符合 AGENTS.md §3。

2. step17 四条条目并存(os-regen 静默吞并的检验点)

今天已在三个 PR 上实证:merge=os-regen 的文件会零冲突标记地静默丢掉一侧改动,只有重新生成才暴露。因此逐条查:

条目 出处 spec-changes.json migrations/registry.ts
plugin-activation-events-retired #4657 ✅ L1304
batch-row-result-schema-shape #4793 ✅ L942
hook-body-crypto-hash-removed #4391 ✅ L824
plugin-runtime-family-retired 本单 ✅ L1351

四条全在,一条没丢。 旁证:#4391 的 D2 conversion 在 conversions/registry.ts L3465-3514 完整存活(含 caps.filter((c) => c !== 'crypto.hash') 与两个 fixture),说明这次 merge 没有吞掉上一单的实现体。

3. ratchet delta 相对新 main —— 纯删除、零新增

生成物 delta
api-surface.json +0 −12
authorable-surface.json +0 −23
json-schema.manifest.json +0 −5
api-surface-signatures.json 零差
dual-source-exports.baseline.json 零差(它本就 entries: [])

这正是整 def 删除该有的形态。 对照组:#4391 是枚举收窄,四张 ratchet 全部字节相同 —— 两种退役形态在仪器上的可见性差异,今天各测到一例,互为佐证。

4. 十二个名字的存活声明:全 0

对六个 *Schema 逐个查声明式(export const/type/interface Xexport { … X … }):

ActivationEventSchema           decls=0
DynamicLoadRequestSchema        decls=0
DynamicUnloadRequestSchema      decls=0
DynamicPluginResultSchema       decls=0
PluginSourceSchema              decls=0
DynamicPluginOperationSchema    decls=0

packages/spec/src/kernel/plugin-runtime.zod.ts —— git cat-file -e 报不存在,文件已整体消失(−275 行)。

残留提及逐条看过,全部是注释、pin 测试的断言词、迁移散文,没有一处活声明:kernel/index.ts L44/L61 是解释性说明块,plugin-runtime-retirement.test.ts L38 是被断言为零 holder 的名单,registry.ts 三处是迁移话术。

⛔ 这一步必须用带引号的精确名:裸名 system/EmailTemplate 会把幸存的 EmailTemplateDefinition 家族当子串命中,给出假阳性。

5. content/docs/releases/ —— 零文件触碰

git diff --name-only a2ebea2e8 f30f045e5 -- content/docs/releases/0

顺带核过与新 main(a114caa79,#4877 的 v17 releases 页)的文件交集:空集,两单不会互相覆盖。

6. #4657 D3 条目「保留并修正」的判断成立

同意不删。理由在 PR 正文 §4 说清了,我复核过事实基础:该条目是双 surface 的,studio.studioPluginManifest.activationEvents 那一半至今活着 —— StudioPluginManifest 仍是 defineStudioPlugin 的入参,仍以 strict parse + guidance 拒绝该键(studio/plugin.zod.ts L291 的注释与 studio/plugin.test.ts L202/L315 的断言都还在)。删整条会连带删掉一个仍在生效的迁移记录。

配套改动也做对了:#4657 pin 的防空转锚点原本用被删的 DynamicLoadRequestSchema / PluginSourceSchema,已换成存活邻居 PluginSchema / PluginContextSchema —— 没有留下任何指向死符号的测试

7. pin 的形态是有效的那一种

holdersOf(name) 精确等于 [],而不是 not.toContain —— 只有前者能抓住「从另一个入口顶名 re-export」这条路。sabotage 2 的实跑输出(expected [ './studio' ] to deeply equal [])正是这条路被抓住的证据。三道防空转守卫(入口枚举须含 ../kernel 且 >10 项、module symbol 须解析成功、holdersOf 须能在存在的名字上找到 holder)也都实跑验证过。


结论:ACCEPT。 已 un-draft + auto-merge(SQUASH)。CI 跑完即进队列,我跟到真正合并为止。


Generated by Claude Code

@os-zhuang
os-zhuang added this pull request to the merge queue Aug 3, 2026
Merged via the queue into main with commit d51bed2 Aug 3, 2026
24 checks passed
@os-zhuang
os-zhuang deleted the claude/issue-4834-plugin-runtime-family-retire branch August 3, 2026 13:13
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/xl tests tooling

Projects

None yet

2 participants