I'm sorry to say that you are.. ;)
The code that goes out hunting for symbol definitions is around the SAFE_APPLY_MASTER or safe_apply_handler in program.c. Mainly when it calls "resolv", but e.g. the "handle_inherit" and "get_default_module" calls are also interesting.
That can happen anytime during compilation, and it's not a problem for the compiler to be invoked recursively to compile other files.
The two passes are for lexing and parsing the file, construct the abstract syntax tree (or node tree as it's called in pike - see las.c), resolving types and inherits. You can say it's centered around the two calls to do_yyparse in program.c. Most of the code in program.c, language.yacc and las.c are about this.
The thing is that it's easy to construct cases using inherit where one class in a file has to be finished (i.e. gone through both passes) while another is only in the first pass.
There are also plenty of cases where incomplete types occur in the first pass which are corrected in the second pass, but in the meantime those incomplete types are propagated to other classes in pass two and won't get corrected there. This is hardly noticeable except that type checking isn't always as good as it should be.
Here I should be able to give you a bunch of clear cut examples of all this, but unfortunately I don't have any readily available. Some are disabled in the test suite, others have only been discussed on whiteboards, but many have never been properly extracted from the code they were discovered in since these problems tend to be hard to minimalize.