PoW is effectively over. There is a bug in GetNextTargetRequired which creates negative targets for PoW blocks which are not allowed in CheckProofOfWork when the block is submitted. This was triggered by 10 PoS blocks in a row with no PoW blocks.
int64 nTargetSpacing = fProofOfStake? nStakeTargetSpacing : min(nTargetSpacingWorkMax, (int64) nStakeTargetSpacing * (1 + pindexLast->nHeight - pindexPrev->nHeight));
int64 nInterval = nTargetTimespan / nTargetSpacing;
bnNew *= ((nInterval - 1) * nTargetSpacing + nActualSpacing + nActualSpacing);
bnNew /= ((nInterval + 1) * nTargetSpacing);
nTargetTimespan is hard coded to be 15 * 40 = 600.
nTargetSpacing is being set to nTargetSpacingWorkMax which is 12 * nStakeTargetSpacing = 720.
nInterval = 600 / 720 = 0 (because it is defined as an int, it is rounded down to 0)
bnNew *= ((0 - 1) * nTargetSpacing + nActualSpacing + nActualSpacing); <<< From this point on, bnNew is negative because it is multiplied by -1
CreateNewBlock assigns nbits to a negative target.
ProcessBlock will never accept the block because the CheckBlock fails when it calls CheckProofOfWork.
Altering the nbits won't work because ProcessBlock will fail when it calls AcceptBlock and nBits != GetNextTargetRequired.