Top-level pre_filters on a retriever execute are now applied, not silently dropped
`pre_filters` is a stage-level field, so posting it at the top level of a retriever execute request used to fall through and vanish — the call returned 200 with unfiltered results that still looked valid. A top-level `pre_filters` is now promoted into the request's filters so it actually narrows the search, and the ad-hoc execute path rejects a misplaced one with a clear error instead of ignoring it.