Extensions resolver returns shop.extensions: [] for admin.order-details.block.render — same app renders fine at admin.product-details.block.render

Custom-distribution CLI app, installed on our production store and a development store in the same org. Scopes read_customers, write_customers, read_orders, unchanged since first install; the install/grant has been re-run on both stores with no change.

Two admin block extensions target admin.order-details.block.render. One of them is the unmodified shopify app generate extension scaffold with only the target line changed, the identical scaffold renders normally at admin.product-details.block.render on the same store and session.

On order pages: both extensions appear in the Blocks manager and in the “+ Block” picker, and can be added and pinned, but the extension worker never executes. No bundle request, no console errors, and an error boundary in our real extension never fires.

DevTools shows why: the admin’s extensions GraphQL query on the order details page returns data.shop.extensions: the server delivers zero extensions to render, so no code is ever fetched or run. The registration clearly exists (the picker lists both blocks); the render resolver excludes them.

We have swept api_version 2026-01, 2025-10, and 2026-04 (each with the matching @shopify/ui-extensions pin)… identical result on all three, in shopify app dev and across seven deployed app versions, on both the production store and the dev store. Protected customer data shouldn’t be the cause (custom app — PCD L1/L2 automatic per staff guidance in the “Enable Protected Customer Data access for a custom app created in the Dev Dashboard” thread). ANd it’s on a page that has the customer data anyway in the right column.

What condition causes the extensions resolver to return an empty set for admin.order-details.block.render for a custom-distribution app while listing the same blocks in the Blocks manager? Happy to share the app’s client ID, extension uids, and store domain privately with staff for lookup.

Solved, and it was mine. The extension had no tsconfig.json, so esbuild had no JSX factory configured and compiled the .tsx source to React.createElement. There’s no React in the admin sandbox, so the module threw on load and shop.extensions came back [], which looks exactly like Shopify failing to list the extension, but is really the extension failing to start. Adding a tsconfig.json with "jsx": "react-jsx" and "jsxImportSource": "preact" fixed it immediately. Worth checking if you hand-wrote a .tsx extension rather than using shopify app generate extension, the generated ones use .jsx and go through a path that gets this right.