request carries the caller's criteria exactly as search() takes them,
so the trace explains the same resolution routes reports.
Optionalamount?: EligibilityAmount | nullChecks the picked route's quote math, as resolve() does.
OptionalbankId?: stringNarrows the pick to one bank's routes, as resolve() does.
OptionaldecimalPlaces?: number
Answers "can this entity use this product, and if not, why not" with the reads
ProductQuoteService.estimate()makes, gate by gate, and never writes: no audit row, no usage read, no cache fill.