Edited to add: I think I've found the problem. When creating the canvas app, I'd changed the name to match the prefix used by my solution publisher, thinking it would change the unique name that the app was published with. It didn't, so the Model Driven App isn't finding the app by that name. I'll correct the name when I next publish my solution.

Thanks for the pointer, @Adoms0
Could you describe how you changed from using id to app name? When I go into the properties of the Canvas App component in the form, App ID is a required field.

I've worked around it by going to the table in the target environment and changing the ID, but this feels like it's going to create issues when deploying updated versions. I could use the "bind to table column" and set the ID in a flow, but that seems inelegant to say the least (every record in the table would have to store the same app ID).