Repository navigation
Proposal + tested PoC: keep DSH bootable when an optional plugin bundle is incompatible #4175
Replies: 1 comment
提案 + 已测试 PoC:当可选插件 Bundle 不兼容时,仍让 DSH 保持可启动在维护一个仓库外插件(Codex Connect)时,我们遇到了 DSH 升级后最糟糕的故障模式:不兼容的插件可能导致 DSH Web 应用外壳无法挂载,同时也让用户失去用于诊断或移除该插件的设置页和插件管理入口。 因此,在提出 Core 修改建议之前,我基于
建议的归属模型这不应该是官方插件与第三方插件之间的区别,插件也不应该自行声明自己是否可选。负责组装应用的 Profile 才知道当前部署是否依赖某个 Bundle。
PoC 中的 Host 行为每个 Bundle patch 层都会作为一次独立的根 Include/Loader 事务来应用。
启动后的激活审计同样会隔离已标记但导入失败、激活失败或仍处于 pending 状态的配置项。未标记的配置项仍然是致命错误。 PoC 中的浏览器行为Host 的 client-module graph 只投射 如果同一个 client 包对应多个符合条件的 Host 实例,只要其中任何一个实例是必需的,最终就按必需处理;这也适用于该实例稍后通过生命周期更新出现的情况。 为什么这仍然符合“everything is a plugin”这里区分的不是插件与 Core。应用外壳、graph composer、UI renderer 和功能包仍然都是插件,或者是建立在插件之上的组装机制。新增的区别是:由负责组装当前应用的 Profile 决定某个成员是必需还是可恢复。Core 只提供隔离和报告机制。 已执行的验证
有意推迟的工作这是一个概念验证,并不是说公开格式已经定型。目前还没有定义:
想请维护者讨论三个问题:
|
Uh oh!
There was an error while loading. Please reload this page.
While maintaining an out-of-tree plugin (Codex Connect), we encountered the worst failure mode after a DSH upgrade: an incompatible plugin could prevent the DSH Web application shell from mounting, which also removed the settings/plugin-management path needed to diagnose or remove that plugin.
I built a narrow local proof of concept against
deepseek-ai/deepseek-harness@b150a551b8d465e31e418e1b2eaf5e79bbb7d28ebefore proposing a Core change:Proposed ownership model
This should not be an official-vs-third-party distinction, and a plugin should not declare itself optional. The profile that assembles the application knows whether that deployment requires a bundle.
dsh.profile.bundlesremains the ordered layer list. An optionalrecoverableBundlessubset selects failure handling:dsh plugin add: records a newly installed out-of-tree bundle as recoverable;Host behavior in the PoC
Each bundle patch layer is applied as a separate root Include/Loader transaction.
The activation audit also contains a marked row that imports unsuccessfully, rejects activation, or remains pending. An unmarked row remains fatal.
Browser behavior in the PoC
The Host client-module graph projects only
failurePolicy: "recoverable"; absence means required. Browser boot records a marked import/apply/pending failure and continues to mount the requireduiRenderer. Required client failures keep the existing fatal boot page.If the same client package has multiple qualifying Host instances, any required instance wins, including when that instance appears later through lifecycle updates.
Why this still fits “everything is a plugin”
The distinction is not plugin versus core. The application shell, graph composer, UI renderer, and feature packages remain plugins or composition machinery over plugins. The new distinction is required versus recoverable membership selected by the profile that assembles one application. Core only provides the isolation and reporting mechanism.
Verification performed
verify-export-jsdocgate then passed;Deliberately deferred
This is a proof of concept, not a claim that the public format is finished. It does not yet define:
Questions for maintainers:
All reactions