there's nothing particularly magical and a lot the behaviors are actually similar to bazel, in ways. a version set is a directed acyclic dag of packages linked by dependencies. These edges comprise (more or less)
* normal deps
* compile/test deps (i.e. non-transitive)
* runtime deps
* tool deps (non-transitive, but also non impacting on the closure resolution algorithm)
version sets allow for multiple versions of the same package to exist in them (ex foobar-1.0 and foobar-1.1), which has some benefit but in practice is just painful.
dependencies are defined in a capital-c Config file. when you run brazil, it does a few things
* it resolves all of the tools and makes them available on your path
* it sets up some environment variables
* it invokes your a build command defined in the Config file
Config files can also declare outputs (there's also some canonical outputs), so you can use a query tool to ex.
* get all jars in the runtime closure
* generate a symlink farm of all client sdk configuration files
the results of your build go into a build directory, and when you want to generate the runtime for a particular package, it will symlink together the outputs of all packages in the deps + runtime closure, which you can do on demand.
version sets are updated by building new packages versions into them, which will rebuild the version set to make sure all builds pass. if they do, a new "commit" will be put onto the version set. you can also merge from one version set into another, where you can get packages and their associated dependencies merged in along with a full rebuild.