TL;DR: How to minimize maintenance - short summaries of best practices.
Best way is to create test suite for an application. Abstract out generic parts. Then try to use generic parts on different test suite, and generalize what you need to.
After three apps, you have a base for framework - you separated generic parts from specific parts.
Another option is to have incredible design skills - if you have those, you don't need to ask how.
Let me explain in more details:
If someone HAS skills to design framework upfront, s/he is one of a million and very likely will not waste time here to ask how.
And if does not have skills, trying to start with framework BEFORE you solved special cases for few applications and developed a "feel" for problem area will end up in failure: you will add many features you THINK you need, or looks cool, or are good fit for different application, but fail YAGNI: you ain't gonna need it.
So IMNSHO starting with framework is wrong and waste of time. Framework is a result of abstracting common parts from few solution you designed and proven to work. Yes, it helps to use good design patterns from the beginning, but there is NO REPLACEMENT of solving real life problems.
Of course OP might be incredible skilled designer way beyond my skill level, and I am wrong. But i like my chances.
I am currently doing similar thing: building bunch of tests, and adding generic methods, so writing tests is getting easier. I already did big global refactoring three times, and maybe 30% of original design is preserved. Maybe OP has better skills than I do, and could foresee all that changes, and could have started with better design. Or maybe not.