Exactly @Stephen
Before Flyte we shipped infrastructure related functionality through libraries.
At our scale (20k+ wfs and 1000+ repos) libraries create a whole set of issues, especially related to maintenance and backwards compatibility. It's difficult for developers to keep up with all the libraries and (latest) versions, and it's also difficult for us, as Platform providers because we need to replicate functionality between languages (python/java) and our systems need to be backwards compatible on multiple versions (among others).
With Flyte, we build common infrastructure functionality in tasks and/or launch plans and ship them to the users through references. Instead of shipping code in libraries, we ship a very thin reference to the project/task we published. This is sort of revolutionary for us. Our users repos shrank. Time spent on maintenance reduced and it's easier to keep everyone on the latest/greatest functionality. We don't need to worry about conflicts with pip/mvn/sbt, as long as the task works and the interface remains the same, our users can use it.
Examples include, interacting with various metadata services, reading or pushing data to buckets/tables, configuring test run etc.