Hi @abcoathup,
I’m trying to achieve the same thing, however I can’t really make it work with truffle-upgrades version 1.4.0.
My example is like this:
abstract contract Base1 is Initializable, OwnableUpgradeable {
  uint256 public blockNumber;
  function __Base_init() internal initializer {
    __Ownable_init();
    blockNumber = block.number;
  }
  uint256[50] private ______gap;
} 
contract Child is Initializable, Base1, Base2, Base3, Base4 {
  address public val1;
  address public val2;
} 
And this is the updated version
abstract contract Base1Mock is Initializable, OwnableUpgradeable {
  uint256 public blockNumber;
  // New fields added
  uint256 public newBaseVal;
  bool public baseUpgraded;
  function __Base_init() internal initializer {
    __Ownable_init();
    blockNumber = block.number;
  }
  function __Base_upgrade(uint256 val) public {
    require(!baseUpgraded);
    baseUpgraded = true;
    newBaseVal = val;
  }
  // size modified
  uint256[48] private ______gap;
} 
contract ChildMock is Initializable, Base1, Base2, Base3, Base4 {
  address public val1;
  address public val2;
  // new fields added
  uint256 public newVal;
  bool private upgraded;
  function upgrade(uint256 val) public {
    require(!upgraded);
    upgraded = true;
    newVal = val;
  }
} 
I’m getting the following errors
mocks/BaseMock.sol: Inserted variable `newBaseVal`
    Only insert variables at the end of the most derived contract
mocks/BaseMock.sol: Inserted variable `baseUpgraded`
    Only insert variables at the end of the most derived contract
mocks/BaseMock.sol: Type of variable `______gap` was changed
 .
.
