Bjarne Stroustrup published a new paper titled How to design good concepts and use them well. Most of the guidelines discussed in Chapter 5 apply almost 1:1 to (some kind of) Traits as well (traits are used for way more things than concepts). The rest is probably too C++ specific, but keeping in mind that C++ concepts are not supposed to solve the same problem as Rust traits, I still found the paper a very interesting read.
From the paper on good “final” concept design:
We often try to specify the requirements of an algorithm to be the absolute minimum. This is not what we do to design the most useful concepts. […] In this direction lies chaos. Thus, the ideal is not “minimal requirements” but “requirements expressed in terms of fundamental and complete concepts.” This puts a burden on the designers of types (to match concepts), but that leads to better types and to more flexible code. […] To design good concepts and to use concepts well, we must remember that an implementation isn’t a specification – someday, someone is likely to want to improve the implementation and ideally that is done without affecting the interface. Often, we cannot change an interface because doing so would break user code. To write maintainable and widely usable code we aim for semantic coherence, rather than minimalism for each concept and algorithm in isolation.
and on “incomplete concepts”:
The view of concepts described here is somewhat idealistic and aimed at producing “final” concepts to be used by application builders in mature application domains. However, incomplete concepts can be very useful, especially during earlier stages of development. […] Concepts that are too simple for general use and/or lack a clear semantics can also be used as building blocks for more complete concepts.