I am not surprised you mention "missing generic".
It can be done by using interface.
As "no inheritance", you can use encapsulation.
As "broken package management", you can use "vendor".
Above are all about how to engineer application.
There is no only one way to solve it. (if you are from java/C++, I don't think those OOP concepts are the king rules)
As of "Google Guidelines", I would judge you just entered the beginning level of software engineering. (You dont know how much pain without those)
In conclusion, I think you blog title is just making horrible attention.
I have done very similar things in code rather in SQL.
just a bit of curious, I understood it is not possible many to many connections, but why don't you allow from cancel->started again?
The business logic is always tend to be changed. I think this is a bad example using FSM here.
IMHO, I will only want to apply stable, constant and (code)internal FSM to pgSQL.
(Thought about a joke how to kill a programmer just needs change the requirements three times. lol)
Good article anyway.
In conclusion, I think you blog title is just making horrible attention.