I only skimmed, but the immediate problem with anything that looks or smells like enum inheritance is slicing or up-converting. In your case, how do you convert automatically from a StateInternal value to a public State value? That's especially important in your example, since hypothetically you want to store the internal value and just provide an accessor to the public value.
I might suggest here that you actually don't _need_ the enums to be the same. Your accessor can do this for you.
enum class State { Pending, Completed };
enum class StateInternal { Pending, Processing, Garbage, etc. };
State getState() const { return (state == StateInternal::Pending || _state == StateInternal::Procising) ? State::Pending : Stte::Completed; }
Alternatively, this is also the kind of thing that sum types (aka std::variant) are good for:
struct PendingStates { enum { Pending, Processing } state; };
struct CompletedStates { enum { Completed, Garbage, Error } state; };
using State = std::variant<PendingStates, CompletedStates>;
Public consumers can query the variant to see when the item is pending or completed, and can decompose the variant to get any internal state.
That of course looks an awful lot prettier in languages with native support for sum types, so I personally would go for the first solution. :)