Challenge 3: The Parallel With assembly1-9's Two-Pass Assembler — Possible Solution ==================================================================== THE STRUCTURALLY SIMILAR STEP ------------------------------ Per this chapter's own tip-box, the shared step is: BUILD A COMPLETE PICTURE OF EVERYTHING FIRST, BEFORE GENERATING ANY REAL OUTPUT. - assembly1-9's own two-pass assembler: Pass 1 scans the ENTIRE source file from top to bottom, without generating any machine code yet, specifically to build a complete symbol table recording every label's real address. - This chapter's own bundler: it follows every import from the entry point, recursively, to discover the ENTIRE dependency graph, before generating any real bundled output. Both processes deliberately separate "figure out everything that exists and how it all relates" from "actually produce the final result," as two distinct phases rather than doing both at once. WHY EACH ONE NEEDS THAT STEP TO HAPPEN FIRST ------------------------------ Per assembly1-9's own explanation, Pass 1 exists specifically to solve FORWARD REFERENCES — a label used before its own definition appears later in the file. Without scanning the whole file first, Pass 2 would have no way to know a forward-referenced label's real address at the moment it's needed. The bundler faces a directly analogous problem: this chapter's own example showed utils.js reachable from TWO different places (directly from app.js, and indirectly through api.js). Without first discovering the ENTIRE graph, the bundler would have no way to know, at the moment it processes app.js's own import of utils.js, whether some OTHER file elsewhere in the project also depends on that same module — information it needs in order to correctly deduplicate shared dependencies (Challenge 1's own topic) rather than accidentally bundling the same file twice. WHY THIS WORKS AS AN ANSWER ------------------------------ It names the shared underlying step precisely (build a complete picture before generating output) rather than just saying "they're both two-step processes," and explains WHY each one specifically needs that step — resolving forward references for the assembler, correctly discovering all reachable dependencies (including shared ones) for the bundler — rather than treating the parallel as superficial.