Added 18 hours and 50 minutes ago
There are only 16 possible message variations. The first 4 bits represent the message itself. The 5th bit is 0 if the number of 1s in the message is even (i.e., zero, two, or all 1s), and 1 if it's odd (one or three 1s). Therefore, if there's an error in the message itself or in the 5th bit, it's immediately apparent. There's no situation where there's an error, but it's not obvious. I've come up with what to do next, but it's clearly not quite right, although the underlying idea seems valid and might be useful. At the very least, if the first 5 bits match, the last 2 bits can be anything, including uncorrupted, and we can still read the message. And if there's an error here, we can hope to extract some benefit from the 6th and 7th bits, which will definitely be reliable if the error is visible in the first five. I tried a variation where the 6th bit checks the parity of 1s among bits 2-5, and the 7th bit checks the parity among bits 5-6. Perhaps it's worth trying something different, for example, parity among 1-2 and 3-4.
Added 18 minutes ago
For example, write a 1 in the 6th bit if the number of 1s among 1-2 and 5 is zero or one, and 0 if it's two or three. Similarly, write the number of 1s among bits 3-5 in the 7th bit.