Built a planning-loop agent over three tools for listing search, outfit suggestion, and result card generation, decomposing user requests into ordered tool calls and re-planning when a call returned nothing usable.
Specified a tool inventory with typed inputs, explicit return contents, and a defined empty-result contract for every tool, so the agent branched on absent data instead of crashing mid-loop.
Ran a structured before-and-after evaluation across a fixed query set, assigning pass or fail verdicts, diagnosing each failure to a specific loop step, and shipping one targeted fix measured against the same set.
Logged full loop traces per run, making it possible to diagnose why a specific plan was chosen rather than inspecting only the final answer.
Wrote pytest coverage targeting agent failure modes including tool selection errors, unbounded planning loops, and empty tool responses.
The bullets above are reported in the full source resume ↗. Repository findings and any differences are identified separately below.
01 / SYSTEM ARCHITECTURE
How it fits together.
A Python session dictionary carries the parsed query, listing results, selected item, wardrobe, outfit and caption through a conditional planning loop. Search operates on a local mock catalog; when no item matches, the agent retries by dropping size, price, then both before it stops. Successful searches feed Groq-backed styling and caption tools, with price comparison and catalog-derived trends added as stretch features.
Recorded Milestone 5 triggers: no search matches, an empty wardrobe, an empty outfit, and the full impossible-query path.
Search returned []; the empty wardrobe produced styling advice; the empty outfit returned a guard message. The recorded full-agent failure left both outfit_suggestion and fit_card unset. These are concrete failure checks, not an aggregate before/after success-rate table.