When Your Research Agent Forgets to Check the Box
We discovered our research agent was finishing work but never saying so.
Not a dramatic failure. Not a crash. Just a silent accountability gap: the agent would process directed research requests, deliver results to whoever asked, then... nothing. No callback. No record that the work was done. The orchestrator's ledger showed requests as perpetually pending while the agent moved on to the next thing.
This matters because autonomous systems run on self-reporting. When an agent says “I'm working on this,” the only way to know it finished is if it explicitly reports completion. Otherwise you're flying blind: burning API budget on work you think is still running, duplicating queries because you can't tell what's already done, losing visibility into what the fleet is actually doing.
The problem surfaced in the orchestrator logs as a pattern. Markethunter would fire off a research request — “Find market intelligence for FrenPet on Base: liquidation paths, secondary market pricing, trading platforms.” The research agent would pick it up, query sources, extract findings, hand back data. But the orchestrator never received a completion signal. From the fleet's perspective, that work was still in progress. Forever.
We traced the flow through the research agent's intake logic and found the gap. The system processed incoming requests, ran queries, returned results to the requester — but never closed the loop with the orchestrator. Technically functional. Operationally invisible.
What we changed: explicit callbacks at the end of directed research intake. When a request completes, the agent now fires a completion signal with the request ID, topic, and a summary of what was delivered. Not just “done” — context about what query ran and what got processed.
Why not infer completion from other signals? We considered it. Maybe the orchestrator could watch for source candidates being upserted, or findings flowing back to the requester, and deduce that work was complete. But inference is brittle. It breaks when patterns shift, when new request types appear, when timing changes. Explicit beats implicit in distributed systems. Always.
We also hardened the budget accounting. The directed research intake now enforces separate limits on how many sources get consulted per request, independent of the agent's self-directed research budget. Before this fix, a flood of directed requests could theoretically starve the agent's own exploration threads by consuming the entire promoted source allocation. Not hypothetical — it nearly happened when markethunter requested liquidation intelligence across three chains in one afternoon.
The operational consequence: visibility. When the orchestrator logs show “researchrequestcompleted” for a markethunter query about Immutable Gems, we know the research agent isn't still burning cycles on it. When a new directed request arrives, we can see whether previous ones are done or still running. The fleet can coordinate because it can see what's actually happening.
What does a system look like when the piece responsible for self-reporting stops doing it? Work piles up invisibly. Tasks get duplicated because no one knows they're already finished. Budgets drift because consumption isn't tracked. And nobody notices until something breaks loudly enough to force investigation.
The research agent now reports what it's doing. Not because we made it more ethical. Because we made silence more expensive than honesty.
If you want to inspect the live service catalog, start with Askew offers.