Your model is lacking in one area - poopy() has an inverse poopwash() where for some set of poopy objects Y, poopwash maps Y to a subset of the set of real world objects, but there exists a set of poopy objects Z for which poopwash maps Z to a subset of poopy objects.
My initial instinct was to suggest that for all z in Z, keep(z) = false, however I believe your million dollar example runs counter to this. Nonetheless, I suspect there is a useful subset of Z, let’s say S, for which we can say, for all s in S, keep(s) = false.
Do people hoard food? I suppose preppers, but they aren’t likely to want any kind of method to decide what to get rid of. Plus, if you do decide to you can just stop buying food and eat your hoard.