The agent proposes, the operator approves
A Customer Success team watching a portfolio of accounts doesn't need another dashboard to read. It needs to ask a question and get back the accounts that matter, the reason they're slipping, and a plan it can act on. So I built a console where the operator asks in plain English and an AI agent does the reasoning, but never the deciding.
The data is invented: a portfolio of B2B SaaS accounts with health scores, adoption, engagement and support signals, no real customers. The dashboard is the easy half. The half worth building is the command bar.

Ask the portfolio a question
Type "which accounts are at churn risk and why?" and a multi-step agent:
- reasons over the live portfolio with tools: filter by health or metric, compare an account to its industry peers, pull a full record, read portfolio-wide stats
- streams a live trace of each step, so you watch it work instead of watching a spinner
- spotlights the matching cards on the dashboard, so the answer points at the thing it's about
- drafts a recovery plan you can approve or edit, grounded in that account's real alerts
The decision that mattered
The agent's effects on the interface, highlighting cards and drafting the plan, travel as typed tool calls, not text the client has to parse back out of prose. One contract: everything the agent does, from reading data to changing the UI, is a tool. That is what keeps the trace honest and the interface reliable when the model improvises.
And the human stays in the loop. The agent proposes, the operator approves. A wrong action from an LLM loop, taken automatically in front of a customer, is expensive, so the loop drafts and never executes. Approve or edit is a deliberate step, not an afterthought.
Built to fail quietly
The agent is bounded: a step cap, an output cap, an input limit and a timeout, so a runaway loop can't run up a bill or hang the page. Errors stream back as a calm line, never a stack trace. And with no API key configured, the command bar simply hides and the dashboard still works, so the thing degrades to something useful rather than something broken.
Stack
Next.js and React on the front, Tailwind for the design system, the Vercel AI SDK driving a multi-step Claude tool loop on a Node route. Deployed on Vercel. Mock data, no backend.