It has been a long time coming, but I finally made time to attempt to get dockutil working better with cfprefsd.
I decided to use defaults rather than PyObjC. Although in hindsight it probably doesn’t matter. They both have quirks when running as root.
But defaults actually does handle paths correctly, and dockutil has always used paths to the dock plist, so that fits well.
At some point we will likely need to change dockutil to take users or domains rather than paths so it works better with CFPreferences.
But for now we can stay with paths to preserve compatibility with existing scripts using dockutil.
I expect some bugs, so please test and report them on github.