If we had the full change history you would see that it is written in B. New features were added and changes were iteratively made along the way, but it is the same codebase. Nowadays we'd pick some change point and call it B v2, but back then they named that point C.
That's not quite correct. See my comment here: https://news.ycombinator.com/item?id=43465698
B was bootstrapped in BCPL, then rewritten in B to be self-hosting. But the transition from B to NB (New B) to C was continuous evolution. Thompson or Richie would add a feature to the compiler, compile a new compiler, then change the compiler source to use the new feature. If you did not have a sufficiently new enough B/NB/C compiler you could not compile the compiler and there was no path maintained to deal with that. You went down the hall and asked someone else to give you the newer compiler.
There also wasn't a definitive point where NB became C... they just decided it had changed enough and called it C.
What's not quite correct?
I apologize, I meant to reply to the parent!
I was refuting the idea that they sat down and wrote the C compiler in B, then rewrote the compiler in C and compiled it with the B-compiled C compiler. You and the parent might not have meant it that way but I wanted to clarify because in modern terms that is what many people will assume.