Skip to content

fix(APP-1165): hide plugins with an interface type the app has no plugin for - #1436

Merged
tyhonchik merged 1 commit into
mainfrom
fix/hide-unknown-plugin-interface-types
Sep 30, 2026
Merged

tyhonchik merged 1 commit into
mainfrom
fix/hide-unknown-plugin-interface-types

Conversation

@tyhonchik

Copy link
Copy Markdown
Contributor

Description

The backend now registers a Safe holding EXECUTE on a DAO as a safe process plugin (aragon/app-backend#1588, APP-1165). The app only treated interfaceType: 'unknown' and isSupported: false as 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's global-error, which rendered translation keys because no TranslationsProvider exists above the root layout. Dev is affected today; staging and production follow with the next backend release that carries #1588.

  • daoUtils.isSupportedPlugin also requires the interface type to be a PluginInterfaceType this 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 through includeUnsupported.
  • useSimulateProposalCreation reports failure without simulating when no builder is registered; publishProposalDialogUtils.buildTransaction asserts with a readable message instead of !.
  • setupBodyDialog resolves an external body through getDaoPlugins instead of dao.plugins.find, which otherwise turned an external Safe body into an EXISTING plugin body.
  • DialogRoot wraps each dialog in an ErrorBoundary with a Close action, so a throwing dialog no longer unmounts the whole app.
  • ErrorFeedback falls back to bundled English strings when rendered without a provider (global-error); a test keeps them in sync with en.json.

Rule-skills plugin-visibility and dialog-conventions are updated. No frontend Safe plugin is added here: #1397 registers external-safe as an SPP body and does not cover a top-level safe process.

Type of Change

  • Patch: Bug fix (non-breaking change which fixes an issue)

Developer Checklist:

  • Manually smoke tested the functionality in a preview or locally
  • Confirmed there are no new warnings or errors in the browser console
  • Confirmed there are no new warnings on automated tests
  • Selected the correct base branch
  • Commented the code in hard-to-understand areas
  • Followed the code style guidelines of this project
  • Reviewed that the Files Changed in Github's UI reflect my intended changes
  • Confirmed the pipeline checks are not failing

Review Checklist:

  • Confirmed that changes follow the code style guidelines of this project

Verification

  • pnpm lint:check, pnpm type-check, pnpm validate:changesets: passed.
  • pnpm --filter @aragon/app test: 411 suites, 2752 tests passed.
  • Dev server against the dev backend, DAO ethereum-sepolia/0x8ABcE1e66B5b7E15594f8Bb0e6Da9955c75a42B0: the proposals page with ?proposals=0xD311…-safe renders the Anyone create / Test / LTV / Admin tabs and no Safe tab; Settings lists no Safe process; Permissions still lists the Safe; create/0xD311…/proposal shows the not-found state.
  • Not verified in a browser: the connected-wallet click that crashed on dev, and the in-dialog error fallback.

Follow-ups

  • Release ordering: app-backend#1588 should not reach a backend release before this fix is deployed.
  • IDaoPlugin.release/build are typed string but arrive as null for the Safe row ("Safe vnull.null" in contract versions); pre-existing on dev.
  • updateDaoContracts still reads dao.plugins directly (behind osxUpdates).

🤖 Generated with Claude Code

…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
@tyhonchik
tyhonchik requested a review from a team as a code owner September 30, 2026 16:58
@linear-code

linear-code Bot commented Sep 30, 2026

Copy link
Copy Markdown

APP-1165

@github-actions

Copy link
Copy Markdown

🚀 Preview Deployment: View Here

@github-actions

Copy link
Copy Markdown

E2E results (preview)

Smoke

Base URL https://app-next-fuynmr24d-aragon-app.vercel.app
Suite smoke
Playwright result ✅ passed
Summary 86 passed
HTML report View report
GitHub job ✅ completed

View run #5365

@thekidnamedkd thekidnamedkd left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM 🛡️

}

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

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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.

@tyhonchik
tyhonchik merged commit 033d917 into main Sep 30, 2026
20 checks passed
@tyhonchik
tyhonchik deleted the fix/hide-unknown-plugin-interface-types branch September 30, 2026 19:18

This branch was successfully deployed

1 active deployment
preview — 5621028b Deployed Sep 30, 2026 by tyhonchik via deploy / deploy #5365
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants