31 calls, every one scoped to account_id=acme-eu, drifted from March renewal addendum to ACME EU renewal rider to contract amendment Q1 without ever leaving the March 2026 attachment slot.
The first repeated miss in the run log was:
tool=policy_doc_search status=200 account_id=acme-eu q="March renewal addendum" hits=[]
From the agent’s point of view, an empty array was still an observation. It did not carry the meaning “the searched scope has been exhausted.” The next plan step therefore chose a familiar retrieval move: rename the thing and try again. By call 17, the agent had searched for renewal rider, signed addendum, March contract amendment, Q1 commercial terms, and ACME EU uplift letter; all were aimed at the same account and the same March 2026 attachment slot.
The missing document was not in Meilisearch. Salesforce had renewal_addendum_id=0688c00000Jx91QAAR, but the ingestion job skipped that attachment after a MIME-type filter rejected application/pdf; charset=binary. Once the index returned zero hits for the scoped search, more synonyms could not change the answer. The loop existed because the agent state had counters for failed calls but none for successful misses.
The repair made “nothing found” a typed outcome. Three empty searches against the same (tool, account_id, month) scope now route to a not-found branch, and the final message says the agent searched policy_docs for acme-eu March 2026 but the addendum is absent from the index. The ingestion monitor fixed the upstream gap; the agent fix prevents the next missing file from turning into 31 polite searches.