Attached is a patch to ASDF's documentation that describes what I plan to implement to allow ASDF to have both customizable version specifiers and more expressive version constraints. I would appreciate concrete feedback on this proposal.
Additionally, this diff exists on MR !169 if you would prefer to give feedback that way. If you do, please mostly ignore the non-documentation changes. The other changes were made quite a while ago and don't take into account some of the recent feedback I've received.
Some notes:
To support extensible version specifiers, I started with Didier's approach (first discussed at https://mailman.common-lisp.net/pipermail/asdf-devel/2015-June/004698.html, I believe). However, that approach required a non-standard system class if you wanted to extend the version specifier. That seemed rather heavy-handed, so I moved to an approach where you can specify a :version-class in your defsystem. This should also make it composable with custom classes. However, if you foresee issues with that, we can change it back.
One of the version classes provided by UIOP is called semantic-version. It implements only the semver grammar and ordering relationships. It does not implement any sort of constraint on major versions matching or the like (note that such a thing is not even required by the semver spec!). However, I realize that "semantic version" can be a loaded term, so I'm happy to discuss changing the name of the class if anyone has a workable idea.
The other version class is called default-version. Currently it's a subclass of semantic-version. However, given Robert's recent suggestion to limit the pre-release segment to alpha/beta/rc and an optional integer, that could be changed. In fact, we could implement Didier's preferred grammar as well, where X.Y.ZaW would be equivalent to X.Y.Z-alpha.W and the same with b/beta and rc/rc. The attractive thing about that is it means ASDF's defaults would likely cover the vast majority of version grammars developers would want to use.
I'm particularly interested in feedback on the :compatible-versions argument to defsystem. I don't think any other build tool I have experience with provides such a thing. However, it seems like an elegant way to address the common complaint that more expressive version constraints encourage a system consumer to block versions of their dependencies that haven't even been released yet.
-Eric