docs(adr): ADR-0115 — the stub table is retired; plugin-dev assembles, empty slots stay empty (#4093) - #4103
Merged
Conversation
…, empty slots stay empty (#4093) The evaluation #4093 asked for, recorded as a decision. The founding premise of plugin-dev's fill-every-slot design (downstream needs correct return types instead of undefined) is refuted by production semantics — every slot is optional there, and four one-at-a-time retirements (#4000, #4058) already proved empty slots regress nothing. Verdict: retire the design, not more members of it; plugin-dev converges to a pure assembly plugin. Disposition is tiered: fabricators (data/auth/security.*/ui) go first with a production guard; core's fallback family becomes the one copy (with #4089); the working in-memory tier retires without a rebuild phase — service-realtime already ships the InMemory adapter, service-storage is real, and the search/workflow slots have zero consumers in the repo. Direct cut in the 17.x rc window with FROM→TO changesets; sequenced behind the in-flight #4086. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01BEM82RNKyyyTNPYHK1VJJS
|
The latest updates on your projects. Learn more about Vercel for GitHub. 1 Skipped Deployment
|
4 tasks
The changeset gate counts changesets added by the PR; an empty-frontmatter file is its sanctioned 'this PR releases nothing' declaration (same pattern as adr-0044-revise-service-owned-note). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01BEM82RNKyyyTNPYHK1VJJS
… lands as assembly auto-wire Maintainer review confirmed D5's direct cut and collapsed the tier work: PR-1 = Tier A + Tier C + production guard + optional service-storage/service-realtime child plugins (the 3b i18n auto-detect precedent — zero-config kept by real implementations); PR-2 = Tier B + #4089 + docs convergence. Tracked in #4104. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01BEM82RNKyyyTNPYHK1VJJS
os-zhuang
marked this pull request as ready for review
July 30, 2026 10:30
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Closes #4093.
#4093 要求的是评估,不是删除 —— 本 PR 交付评估本身:ADR-0115,裁决为「stub 填满槽位」这个早期设计整体作废,plugin-dev 收敛为纯装配插件。空槽位在 dev 和生产里含义相同,这条从 #3891 一路退役到 #4086 的规则不再逐个槽位适用,而是升为设计层结论。
裁决依据(issue 的四条证据全部核实,另加一条 issue 没有的)
Issue 的证据 1–4 逐条对着源码核实无误(原设计理由被 #4086 的"一次清空 4 个槽位全绿"直接反证;三个安全 stub 撞 D12 红线且伪造的是
security-service.ts明说"deliberately NOT part of this contract"的别家内部件;metadata双份实现有 core CHANGELOG 里"同一个 bug 修两处"的收据;包已发布、无护栏、仓库内无使用者、文档描述错误)。评估新增的证据 5 —— C 档比 issue 以为的小得多,且不需要"先补 InMemory 策略":
realtime:真实包已经带着 InMemory 策略(service-realtime/src/in-memory-realtime-adapter.ts,且是该插件注册realtime槽位的默认实现)—— issue 想让人先去建的迁移路径已经存在;file-storage:service-storage是真实包(local + S3 适配器),local 适配器就是 dev 路径;search/workflow/ui:整个仓库没有任何代码解析这三个槽位(getService('search'|'workflow'|'ui')零调用点;dispatcher 无对应域;REST 的/api/v1/search是数据面搜索,不碰search服务)—— 这三个 stub 服务于不存在的调用方,退役不可能造成任何回归。三个待定问题的答案(= ADR 的 D4/D5/D6)
NODE_ENV === 'production'断言 +OS_ALLOW_DEV_PLUGIN_IN_PRODUCTION逃逸阀,PD [WIP] Create a new release version #9 形状)盖住删除盖不住的部分(默认 dev auth secret + seed admin)。执行序(ADR Execution 节)
dev-plugin.ts;service-storage/service-realtime);终态可机械检验:
DEV_STUB_FACTORIES/DEV_STUB_SELF_INFO/SHAPELESS_STUB_SELF_INFO/NO_DEV_STUB_SERVICES与填充循环从dev-plugin.ts消失。验证
main源码核实(含security-service.ts的契约措辞、core CHANGELOG 收据、resolve-execution-context.ts的真实身份路径、realtime-service-plugin.ts:59的默认适配器、零调用点的 grep)。🤖 Generated with Claude Code
https://claude.ai/code/session_01BEM82RNKyyyTNPYHK1VJJS
Generated by Claude Code