Skip to main content
Start the build now, before you read any further. This is the biggest download in the course, and almost none of it is your code: Bazelisk downloads Bazel 9.3.0 first (about 70 MB, pinned in .bazelversion), then Bazel fetches rules_go, gazelle and the Go SDK 1.25.1 (about 58 MB), one after another.
aspect test //... works too. Expect roughly 70 seconds the first time on a machine that has never built this — most of it fetching rules_go and the Go SDK, not compiling your code. Once those are cached it is about 25 seconds from clean, and under a second when nothing has changed. The bulk of the cold compile is rules_go building the Go standard library: one large action that never runs again, and you’ll see it by name later when you ask the build what it spent its time on. If it is still running when you reach the next section, that is fine — nothing before aspect changed needs the build finished.

What arrived

A Go monorepo with 55 libraries, 55 tests and 3 binaries:
The layering is the part that matters, and it is deliberate. lib/clock, lib/codec, lib/schema and lib/validate are stdlib-only and sit at the bottom. lib/log is above them and nearly everything is above it. Of the 39 domain packages, 18 are pure models that never touch logging, and 21 are wired into lib/log, lib/metrics and lib/store. That shape exists so that the questions you ask in the next few sections have non-obvious answers. A repository where everything depends on everything teaches nothing about dependency queries.
There is a deliberately flaky test in internal/domain/forecast. It fails about one run in three, it is marked as intentional in the source, and it is there for a later section about catching flakes. If bazel test //... goes red on forecast_test, that is the course working as designed — run it again.
Next: the first command.