Repository navigation
fix(APP-1165): hide plugins with an interface type the app has no plugin for - #1436
Merged
Merged
Conversation
…gin for The backend now registers a Safe holding EXECUTE as a `safe` process. The app accepted it as a governance target, so the process picker called a create-proposal builder that was never registered and crashed into the global error page, which showed translation keys. - isSupportedPlugin requires a PluginInterfaceType this build ships a plugin for - useSimulateProposalCreation reports a failure when no builder is registered - setupBodyDialog resolves external bodies through getDaoPlugins - DialogRoot wraps each dialog in an ErrorBoundary with a close action - ErrorFeedback falls back to bundled English strings without a provider
|
🚀 Preview Deployment: View Here |
|
E2E results (preview) Smoke
|
tyhonchik
requested review from
Fabricevladimir,
harryburger,
milosh86 and
thekidnamedkd
September 30, 2026 18:05
thekidnamedkd
approved these changes
Sep 30, 2026
| } | ||
|
|
||
| // Interface types this build ships a plugin for. A backend may classify a plugin | ||
| // with a type the app has no plugin for yet (e.g. `safe`, APP-1165). |
Contributor
There was a problem hiding this comment.
nit: the set is the enum, so "the app ships a plugin for this type" is really "someone remembered to add the enum entry and the plugin in the same PR". holds today, all eight have a registerPlugin. a test asserting every non-UNKNOWN member resolves to a registered plugin would make the next safe impossible to get wrong, though the picker's failure path and the dialog boundary already stop it being a crash either way.
This branch was successfully deployed
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.
Description
The backend now registers a Safe holding EXECUTE on a DAO as a
safeprocess plugin (aragon/app-backend#1588, APP-1165). The app only treatedinterfaceType: 'unknown'andisSupported: falseas unsupported, so the Safe row passed as a governance target: the process picker ran the create-proposal simulation for it, called a builder that was never registered and crashed into Next'sglobal-error, which rendered translation keys because noTranslationsProviderexists above the root layout. Dev is affected today; staging and production follow with the next backend release that carries #1588.daoUtils.isSupportedPluginalso requires the interface type to be aPluginInterfaceTypethis build ships a plugin for. A type the backend adds before the app does stays hidden until the enum entry and the plugin land together. The permissions and contract-version views keep it throughincludeUnsupported.useSimulateProposalCreationreportsfailurewithout simulating when no builder is registered;publishProposalDialogUtils.buildTransactionasserts with a readable message instead of!.setupBodyDialogresolves an external body throughgetDaoPluginsinstead ofdao.plugins.find, which otherwise turned an external Safe body into anEXISTINGplugin body.DialogRootwraps each dialog in anErrorBoundarywith a Close action, so a throwing dialog no longer unmounts the whole app.ErrorFeedbackfalls back to bundled English strings when rendered without a provider (global-error); a test keeps them in sync withen.json.Rule-skills
plugin-visibilityanddialog-conventionsare updated. No frontend Safe plugin is added here: #1397 registersexternal-safeas an SPP body and does not cover a top-levelsafeprocess.Type of Change
Developer Checklist:
Review Checklist:
Verification
pnpm lint:check,pnpm type-check,pnpm validate:changesets: passed.pnpm --filter @aragon/app test: 411 suites, 2752 tests passed.ethereum-sepolia/0x8ABcE1e66B5b7E15594f8Bb0e6Da9955c75a42B0: the proposals page with?proposals=0xD311…-saferenders the Anyone create / Test / LTV / Admin tabs and no Safe tab; Settings lists no Safe process; Permissions still lists the Safe;create/0xD311…/proposalshows the not-found state.Follow-ups
IDaoPlugin.release/buildare typedstringbut arrive asnullfor the Safe row ("Safe vnull.null" in contract versions); pre-existing on dev.updateDaoContractsstill readsdao.pluginsdirectly (behindosxUpdates).🤖 Generated with Claude Code