Beginner thought process on type mismatch error

Well, as you probably know by now, Msg is the name of a specific, custom type, whereas msg is a unbound type variable (I think that’s what it’s called).
The confusion might stem from the “convention” of these two having the same name, with only the casing of the first letter being different.
I remember that I tripped over the same problem several times. Even though I think the convention of having a Model and a Msg type in Elm makes sense once you see through the Matrix, it can be confusing if the semantics of these types isn’t fully understood yet.

What I actually did (and still do sometimes) in my code is not necessarily using just Msg and Model, especially if I reuse existing code (rename refactoring ftw).
Instead, I try to come up with names that are more meaningful to me, to have richer semantics associated with the names. As for unbound type variables, like the lower-case msg in your case, I used a prefix at the beginning, e.g. ubMessage.

This might help the eye to see the kind of discrepancy you had described in your example, at least I profited.

As for the error message: would it have helped you if the compiler would have “said”, additionally:

Msg is a custom type, whereas msg is an unbound type variable. Maybe you want the type signature to actually read Msg?

I can see how Evan already contemplated to add something like that, but decided against it for a good reason I’m not aware of.