This is a brilliant breakdown of a classic "leaky abstraction" problem in database tooling. The shift from a rigid MetadataProvider interface to an EngineCapabilities descriptor is exactly the right architectural pattern here. Assuming every backend behaves like a traditional single-node RDBMS is a trap many multi-engine client tools fall into. I particularly love the nuance you added with writes: "connector". Deriving write permissions implicitly from primary keys is a silent bug waiting to happen, especially in federated query engines where a single Trino connection can span both a writable data lake and a read-only message broker. Furthermore, hiding the UI entirely (e.g., removing the Indexes tab) instead of showing an empty list is a masterclass in "honest UX". It actively prevents users from drawing false conclusions. The rule "declare capabilities, don't assume them" is a fantastic takeaway. Thanks for sharing this deep dive, it’s a great reference for anyone building tools that talk to diverse backends!
