I haven't yet transacted any other data that actually uses the attributes
(I've only been testing with d/with).

If you've already transacted data that uses the attributes, that would
complicate things of course. If you need to make a change to a composite tuple
that's already being used in prod, you'll have to make sure you do things in a
backwards-compatible way. I haven't thought much about this yet.

Alternate solutions, which I haven't tried, include:

Set up your dev environment so you don't transact schema or data at all; you
just use d/with for everything (might be complicated and/or annoying).

Write some code to easily migrate data from one db to another, then every time you
want to make a disallowed schema change, move all your data over to a new dev
db. I think this would work best in combination with the solution I've
presented above. During development, you rename attributes using the
-<number> convention, but before you deploy to prod, you get rid of all the
-<numbers>s and migrate to a new dev db.