fix(core): attribute deferred skill plugin failures - #46967
Open
kitlangton wants to merge 1 commit into
Open
Conversation
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.
Why
A plugin can finish setup successfully and then throw when its skill transform is replayed. Listing skills returns an empty HTTP 500, so clients report
UnexpectedStatuswithout identifying the plugin or failed operation.What Changes
Before: a deferred callback throws an unattributed defect;
GET /api/skillhas no declared failure payload.After: the callback retains its registering plugin ID and operation. The endpoint logs the original exception and returns a declared HTTP 500:
{ "_tag": "PluginCallbackError", "pluginID": "broken-skills", "operation": "skill.transform", "message": "Plugin \"broken-skills\" failed during skill.transform. Check server logs for details." }Both generated Promise and Effect clients preserve that error. The payload contains no exception text, stack, source path, or plugin configuration. Plugin IDs are the existing public inventory identifiers.
The Core callback still fails as a defect. HTTP translates only this recognized boundary failure into its declared error. Unrelated defects remain defects; server interruption retains the HTTP runtime's empty 503 response. Reads continue to fail until the broken registration is explicitly changed—no transform is skipped, disabled, or partially published.
Scope
One reporting slice: deferred skill transforms and
skill.list. This does not change plugin inventory health, setup-error reporting, other callback domains, or TUI presentation. In particular it does not infer that a directory is absent or recommend moving it. Pre-model presentation and safe isolation are separate work; this does not overlap the RPC handler changes in #46946 or the location/catalog UI changes in #46961.Verification
UnexpectedStatus/ClientError.panic(main thread): Segmentation fault), with no assertion failure reported. The unchanged rerun passed, including compiled service lifecycle and Node build checks.