Dk0.Closure and Dk1.Closure are generated by the CommonsLang_OCaml.Dk.OpamLock.GenerateDriver dialog from the opam lock that Dk0.MlFrontSource carries (mlfront/dk.opam-lock.jsonc). Regenerate them rather than hand-editing whenever the lock changes or the per-package build rule version moves. There is no import partition here: CommonsBase_Dk builds every package in the closure as its own Dk0.Pkg/Dk1.Pkg object, so the driver passes no skiplocal/mergedprefix/implib arguments (unlike MlFront's TestDeps). <DRIVER_VER> is the GenerateDriver version from the pinned CommonsLang_OCaml import; the two invocations differ only in out, formid, pkgpath, and roots[]:
dk0 dialog CommonsLang_OCaml.Dk.OpamLock.GenerateDriver@<DRIVER_VER> lock=<dk-opam-lock.jsonc from Dk0.MlFrontSource> out=etc/dk/v/CommonsBase_Dk/Dk0.Closure.values.jsonc formid=CommonsBase_Dk.Dk0.Closure@2.4.2 pkgpath=CommonsBase_Dk.Dk0.Pkg version=2.4.2 rulefn=CommonsLang_OCaml.Dk.OpamBuild.F_BuildLockedPackage@1.0.15 localsrc=CommonsBase_Dk.Dk0.MlFrontSource@2.4.2 locksrcpath=./dk-opam-lock.jsonc roots[]=DkZero_Exec
dk0 dialog CommonsLang_OCaml.Dk.OpamLock.GenerateDriver@<DRIVER_VER> lock=<dk-opam-lock.jsonc from Dk0.MlFrontSource> out=etc/dk/v/CommonsBase_Dk/Dk1.Closure.values.jsonc formid=CommonsBase_Dk.Dk1.Closure@2.4.2 pkgpath=CommonsBase_Dk.Dk1.Pkg version=2.4.2 rulefn=CommonsLang_OCaml.Dk.OpamBuild.F_BuildLockedPackage@1.0.15 localsrc=CommonsBase_Dk.Dk0.MlFrontSource@2.4.2 locksrcpath=./dk-opam-lock.jsonc roots[]=DkOne_Exec
rulefn is the only field that moves when the per-package build rule is bumped (F_BuildLockedPackage@1.0.0 to @1.0.10 carried the Windows ocamlbuild fixes). For a rule-version-only bump the regenerated output differs from the committed driver in exactly that string, so a targeted rulefn replacement equals a full regeneration and avoids reformatting drift from a newer GenerateDriver.