The purpose of a definition is to capture everything required to execute a derived data build. The definition is partly fixed (function name, constants, input hashes) and is partly variable (function version, build dependencies, bulk data, files), and the variable components mean the output from building the definition can vary depending on the versions of those components.