Just to be clear: This works as documented. This was a me problem.
So, to whom it may concern:
recursive = zfs
applies that policy to all children of the dataset - no matter how well you might have written the policy for a child it will be ignored and (I believe) there won’t be much indication of this happening.
Let it sit for a few years and you might start to dig into why there are gigabytes unaccounted for in a pool, and also some zfs commands feel pretty slow for some reason.
Well, the reason might be a huge amount of unpruned snapshots to a dataset you thought was ignored.
Anyways, I’m currently deleting ~78 000 snapshots. For - reasons
You’ve discovered the reason (actually, one of several) why “recursive=yes” came FIRST and “recursive=zfs” came only much later, as a result of significant pressure, and WITHOUT replacing “recursive=yes.”
edit: for anyone who’s wondering what we’re on about, the OP is referring to Sanoid syntax. “Recursive=yes” instructs sanoid to handle recursion directly for itself; “recursive=zfs” instructs it to simply use the “-r” flag on ZFS commands. Recursive=zfs is a bit more computationally efficient in most cases, but it’s nowhere NEAR as smart as sanoid’s own native recursion routines, which is why I wrote it that way in the first place.