Okay, so you've definitely verified that the _task_hash
that's generated for an incoming example is the same task hash that's already present in your dataset?
Setting 'exclude': [dataset]
in your recipe shouldn't be necessary, since this is the default behaviour.
Also, another thing I noticed in your code: input_keys=("id")
should be input_keys=("id",)
or input_keys=["id"]
– otherwise, the argument will be interpreted as a string instead of a list of keys.