Challenge 3: The Missing pub on the Outer Module — Possible Solution ==================================================================== mod a { pub mod b { pub fn f() {} } } — here, module a itself is declared with plain `mod a`, NOT `pub mod a`. This means a is private to whatever scope it's defined in (e.g. private to the crate root, or to whatever module directly contains it). WHY a::b::f() STILL FAILS FROM OUTSIDE THE CRATE, DESPITE b AND f BOTH BEING pub: reaching f from outside requires walking the ENTIRE path a::b::f — and the very FIRST segment of that path, a itself, is not visible from outside at all, since a was never marked pub. Code outside the crate can't even NAME a, let alone reach past it to b or f — it's blocked at the very first step of the path, before b's or f's own pub markers become relevant at all. This is exactly this chapter's "pub all the way up" rule stated concretely: pub on b and pub on f only control visibility ONE LEVEL AT A TIME, relative to their own immediate parent — b's pub makes it visible to code that can already see a, and f's pub makes it visible to code that can already see b. Neither of those pub markers does anything to fix the fact that a ITSELF is invisible from outside in the first place. The fix is simply changing the outer declaration to `pub mod a { ... }`, making every segment of the path public, consistent all the way from the crate boundary down to f.