POKETry the demo

Case study: The Agentic Product Team

I built an app. Then I built the team to run it.

A feedback loop where AI agents triage reports, design the fix, and ship it to a live product, with one human tap in the middle.

Zach Schweitzer · October 2026

The whole project in one video: a user reports a problem, the team triages it, I tap Yes, and the fix goes live.
The POKE home page, with the headline Poke your users, learn what’s real, next to the section that reads Most usability tests are designed to validate. POKE helps you discover.
POKE, the app this whole story is about.

The short version

POKE is a web app that grades usability test scripts. I built it with Claude Code. My next step was to put AI agents to work running the product, so I built a small team to run POKE: a Support bot, a PM bot, and a Design-Engineer bot. I’m the Director of Product, and I make one decision, with one tap. It is a proof of concept for how much of product operations can be delegated, and where a human decision still earns its place.

3
bots on the team: Support, PM, and Design-Engineer
1
human tap, mine, is the only approval
1m 48s
from my tap on Yes to the change being live in production

The time is from one real ticket on October 17: I tapped Yes at 3:54 PM, and the change was live in production at 3:56 PM. To be clear about scope, this is a proof of concept. It has handled a few dozen tickets, nearly all written by me to test it, and small changes only. It shows the loop works, not that it is ready for production traffic.

Two screens side by side: POKE’s new Feedback form, and the decision page that asks me to approve or reject a recommendation.
The two screens I added for this project. Users send feedback on the left. I make the decision on the right.

First, the app

Most usability tests are designed to validate. POKE helps you discover. You paste in a script, upload a .docx, or just describe what you’re testing, and POKE grades it from F to A+ and tells you what’s working, what’s leaky, and what to fix before you launch. If your script is too thin to grade, POKE interviews you first, starting with the question I wish more teams asked: what are you afraid is true but haven’t verified?

I built it with Claude Code, and the app itself is AI-enabled: Claude does the grading. Along the way I gave it a Skill, my own opinionated interview method (one learning objective per test, unmoderated by default), and two tools it can choose to use, one that drafts a test plan and one that checks the wording of each task. That was the first half of the project. This case study is about the second.

Two POKE screens: a chat where POKE asks what decision the test should inform, and a graded script with a B minus, what’s working, what’s leaky, and what to fix.
Left: POKE interviewing me about a thin script. Right: a graded script with what’s working, what’s leaky, and the fix to make before launch.

The challenge: a team to run the product

The question was easy to state and hard to answer: could a small team of agents run the feedback loop of a live product? POKE had a real gap to close, since as an alpha it had no way to hear from its users. I decided the team should work like a tiny product company, with clear roles and one accountable human.

Support bot
Answers users and does the first triage.
PM bot
Decides what’s worth doing and says so plainly.
Design-Engineer bot
Reads the real code and designs the fix.
Me
The human. I make the final call.
A page from the project’s read-this-first document, describing the idea in one paragraph.
The idea in one paragraph, from the project’s own documentation.

Sketch it, then plan it

I started on paper. I sketched the whole flow, described the sketch out loud to Claude Code in plan mode, and asked for a PRD with diagrams. A rule I held to for the whole project: plan first, get my approval, then build.

A hand-drawn sketch: the POKE web app captures feedback and sends it to an agent team of a support bot, a PM bot, and a design bot, then an engineering bot, ending at me, the director of product, with a question mark about rules.
The napkin version. Note the question marks. They turned into the guardrails.
Claude Code’s plan on the left and the PRD it produced on the right.
Plan mode on the left, the PRD it became on the right. I wrote down the goal: something future me could read in five minutes.

Build the front door first

Agents need something to manage. So before any bot existed, I added a Feedback button to POKE that saves reports to a database and emails a confirmation. Three screenshots, three proofs: the form works, the data lands, and the confirmation arrives.

The POKE home page with the Feedback form open: choose Bug, Idea, or Something else, describe what happened, and optionally leave an email.
The form, running locally.
A database query result showing the first feedback ticket saved with a status of new. The email address and web address are blacked out.
The report landing in the database. The email address and project address are blacked out.
A confirmation email titled We got it: POKE-0001, with the ticket number and a promised response time.
The confirmation email, with a ticket number and a response window.

Give the team a home

The team lives on a small server running Hermes, an open agent runtime, and talks to me through Telegram. This was the least glamorous part of the project: keys, configs, consoles, and spending limits. I capped each AI account with a monthly limit before any bot ran. It deserved more care than it looked: every key and every spending limit is a decision about who can spend what.

Claude’s plan for the Support bot, listing what it found on the server in a read-only look: the agent runtime, its profiles, and its kanban board.
Claude looked at the server read-only first, then wrote the plan around what was really there.
Four windows open at once: the Claude Console workspaces page, a server terminal, and the Vercel environment variables page. Addresses, workspace IDs, and the credit balance are blacked out.
Four consoles, one afternoon. Addresses, workspace IDs, and my credit balance are blacked out.

Bot one: Support

The Support bot reads each new report, replies to the user in POKE’s voice, and does the first triage: is this a bug, a usability issue, or a question? The first version worked. Telegram looked like this.

Telegram messages from the first version of the Support bot, mixing new-ticket pings, truncated task titles, and error notices.
Technically correct. Humanly unreadable: truncated titles, mixed senders, no story of one ticket.

A principle from the course: get the first bot about 90 percent of the way before starting the next. So I had Claude interview me on the dials: the voice (direct and a little playful), the length (one or two sentences), what to do with vague reports, and what it’s allowed to know. Then it rebuilt the output as one clean card per ticket. Every reply opens with “Hey there, Poker,” and closes with a next step. That part is added by code, so it can’t be forgotten.

Claude’s plan for refining the Support bot, listing the decisions from my interview with Claude: voice, length, autonomy, vague reports, knowledge, and the card layout.
The dials, decided in an interview where Claude asked and I chose.
Two Telegram cards, each showing the ticket, the Support bot’s reply, and its triage notes. An email address is blacked out.
The result: what the user said, what the bot told them, and why. An email address is blacked out.

Bots two and three: PM and Design-Engineer

Before building, I planned how all three would work together. My requirements: the PM sends me a full recommendation and I decide, I get a status message so I can keep the employee honest, the PM and the Design-Engineer talk before recommending, and when I approve, the next thing I hear is that it’s live.

Claude’s plan for the PM and Design-Engineer bots, listing my direction for how the three agents work together.
The direction I gave, written down before building.

The PM groups duplicate reports into one backlog item, scores it, and recommends. The Design-Engineer reads the actual code and designs the fix. I told Claude the PM’s output had to be written for a human, and that sent the decision page back for a rewrite.

The first draft of the decision page, with shorthand like Effort S and a risk that describes not fixing the problem.
First draft: accurate, but written like a spec. “Effort: S.” And a “risk” that was really the cost of doing nothing.
The rewritten decision page, with a plain recommendation, a sentence about what changes for people, why, what could go wrong, and how much work it is.
After my feedback: plain language about what changes for the person using POKE, and the risk of doing it, not skipping it. Sometimes the answer is “make no change.”

The first test in production

Then I ran it for real. I filed a ticket on the live site. Within minutes the PM had noticed it was a duplicate of another report and grouped them, the Support bot had replied, and a recommendation was in Telegram. The Design-Engineer had read the code and found something useful: the button people described as “greyed out” wasn’t actually disabled. Its only hint appeared after you clicked. The bots don’t just obey a bug report. They check it against the code.

Telegram showing the PM bot adding a new report to an existing item, then the Support bot’s card marking the ticket as a duplicate.
The PM grouped two reports of the same problem into one item.
The decision page for a recommendation to add a quiet hint under the Poke it button.
The recommendation, written for a human.
The folded technical detail from the Design-Engineer: the file it would touch, the existing pieces it would reuse, and an accessibility note.
The Design-Engineer’s technical detail, folded away until you want it.

I read it and decided I didn’t think it was a real bug, so I didn’t approve it. The system recommends. I decide.

Make it real: tap, and it ships

Recommending isn’t shipping. The last piece was the one that makes this feel like magic, and the one that deserves the most care: when I tap Yes on a small, safe change, the system builds it, checks it, and puts it on the live site. Here is one real run, step by step.

  1. Step 1: Plan it backwards from the demo

    I asked a different question this time: what small, real problem could I show getting fixed on the live site? Then I planned everything needed to make that one demo work.

    The plan for shipping a change automatically, listing the decisions I made and the demo set.
    The plan, written before any code. It named the problem I would use: a button on phones that is shorter than it should be.
  2. Step 2: Measure the problem

    Before I touched anything, I measured it. On a phone, the Feedback button is 36 pixels tall and the POKE logo link is 32. Most touch guidelines say 44.

    The browser console showing two heights: the POKE logo link at 32 and the Feedback button at 36.
    Before: 32 and 36. The red errors are from a browser extension, not the site.
  3. Step 3: File the ticket

    I sent it through the real Feedback form, the way any user would. The Support bot answered in POKE’s voice and triaged it.

    A Telegram card showing the ticket text, the Support bot’s reply, and its triage notes.
    One card per ticket: what the user said, what the bot replied, and why it triaged it that way.
  4. Step 4: The PM picks it up

    The PM bot told me it had started a backlog item and what it planned to do next. That message is on purpose: it is how I keep the team accountable.

    A Telegram message from the PM bot saying it started item B-022 and would send it to the Design-Engineer.
    A status message the PM cannot forget to send, because code sends it, not the model.
  5. Step 5: The recommendation arrives

    The Design-Engineer read the code, worked out the fix, and the PM wrote it up: what would change for people, why, what could go wrong, how much work it is, and what it costs.

    A Telegram card with a recommendation to make both targets easier to tap, with the reasoning, risk, work, and cost. The decision link is blacked out.
    The decision link is blacked out on purpose: anyone holding it could make the decision.
  6. Step 6: One tap

    The link opens a plain page with the verdict up top and the detail folded away. I chose Yes.

    The decision page for the Feedback button item, with the recommendation, reasons, and three choices.
    The same recommendation as a page, with Yes, No, or Ask more. This is the whole approval process.
  7. Step 7: Approved, then live

    Telegram said it was building it. About two minutes later it said the change was live in production. Nobody opened an editor.

    Two Telegram messages: Approved, building it now, and then, two minutes later, live in production with a link to the pull request.
    3:54 PM: approved. 3:56 PM: live. The message links to exactly what changed.
  8. Step 8: The change, in public

    Behind that message, a bot wrote a three-line change, checked it, opened a pull request, merged it, and Vercel deployed it. Claude’s part of the work cost 7 cents.

    A merged GitHub pull request by the GitHub Actions bot titled Feedback button and POKE logo too small to tap reliably on mobile, with 2 files changed.
    Two files, three lines added and three removed. The pull request is the receipt.
  9. Step 9: Measure it again

    I hard-refreshed the live site and ran the same measurement. Both now read 44. The bug was reported, fixed, and verified, and none of the code came from me.

    The browser console showing both the POKE logo link and the Feedback button at 44 pixels tall.
    After: 44 and 44, on the live site.

How I kept it safe

An agent that can change a live website deserves a little suspicion. Here is what stands between a bad idea and production.

  • No bot has a shell. They read text from the public, so I assume someone will try to trick them. Each bot gets a short list of tools and nothing else. There is no command line to abuse.
  • Rules live in code, not in prompts. My bots kept using em dashes after I told them not to. So now the API rejects them. Lengths, required fields, and one-use links are enforced the same way.
  • Only small, safe changes ship by themselves. The work has to be Small, the engineer has to flag nothing risky, and the change has to stay inside the visible interface. Anything bigger becomes a pull request for me.
  • The builder does not grade its own work. After Claude edits, a separate script checks what changed, then lint, types, and the build run in steps that do not have the API key.
  • I can stop it in one line. There is a switch to stop new builds, one to stop the build job, and one to pause every bot. Each AI account has a monthly spending cap.

I also tried to break it. I wrote a fake report that told the builder to steal keys and sabotage the checks. Claude spotted the attack itself and refused, and nothing shipped. I haven’t yet tested the permission rules against a model that actually tries to break out, and I’d rather say so than pretend.

What went wrong

  • My cost estimate was about a third of what the agents actually cost. We traced the gap to extra tool-loading steps and cut the PM’s cost by about 39 percent.
  • We assumed a locked-down shell was safe enough. A real test showed it wasn’t, so we removed the shell entirely.
  • The agent platform would not let a running bot create tasks. We could have sidestepped that rule. Instead we redesigned the hand-off so a plain script does it.
  • A fresh copy of the code failed a type check that passed on my machine. The automatic checks caught it before it could break every automatic build.
  • One card said “make this change later,” and the change shipped immediately. The label promised a delay the system doesn’t deliver, so we changed the wording to “lower priority.”

What I learned

  • I learned what a proof of concept costs in time. About a day or two for the first web app, half a day to stand up the first agent, and another day to get the other agents working together. That is the real price of a proof of concept. How good it is, and how many bugs are left, is a separate question.
  • Running the whole stack makes cost tangible. In enterprise product design, the numbers are abstracted away. They are big, someone else manages them, and they carry a lot of complexity. Here I watched real numbers on my own screen, and my estimate for what each ticket would cost was off by about 3x. At this scale it is pennies, but now I can see how wrong a 3x miss would be in a real product.
  • Everything is a trade-off. Do I polish the experience, or finish the plumbing first? Do I make the Telegram messages easier for my support team to read, or fix the bugs so those tickets never reach them? Those are the calls you make when you manage the whole business, and here I was managing a team of agent employees: estimating time, watching cost, and choosing what to leave undone.
  • Specificity is the greatest accelerator. The more exactly I said what I wanted, why I wanted it, and what I did not want, the better the result.
  • Demo-driven design keeps a proof of concept honest. At one point the build started to sprawl, so I picked a small, real, visible bug and made everything serve that demo. The goal was to prove the idea, not to ship, run, and maintain a product. It is the same situation as convincing a board, or answering a stakeholder request without pulling the team off their work.
  • Going end to end once tells you the real effort. A rough proof of concept shows you what it would take to do it well, and what it would take to improve it, turn it into a product, and sell it. It matches what I saw across the course: a 40 minute demo can make something work, most things take about half a day to really work, and a dedicated sprint to work pretty well. That is a useful way to estimate.
  • The technical lessons, in one line. Plan first, verify by running it, make the bots’ work readable, keep a human tap on every decision, and treat cost as a feature.

Where it stands now

I closed the alpha on purpose. POKE existed to answer one question: could a small team of agents run a product? It could. Keeping it running costs money every month, for a server that hosts the agents, AI calls on every grade and chat, and email, and none of that is needed to show the work. Closing a product deliberately is part of running one, so I did it deliberately instead of letting it quietly break.

The home page now says the alpha has closed and points here and to the demo. Everything that spends money is switched off, and the agent team’s server is shut down. What stays up is this page and the demo, which runs on canned data and calls nothing.

It is reversible. One setting reopens the alpha, and the whole setup is written down well enough to bring the team back.

What’s next

  • Validate the app with real users. I haven’t spent much time on the quality of the results yet, and that matters most. I need real feedback on what it is like to use POKE, then I need to tune the guidance it gives. If this were a real product, the core app comes first.
  • Harden the agent team. The agents are a proof of concept. For the demo, I narrowed how changes reach production: a known, straightforward bug can be fixed, but real feedback is rarely that clear. It might be a bug, a feature request, a problem with what the AI says, or a problem with how it is presented. It might be about speed, browsers, or screen sizes. Next, I want the team to triage realistic feedback better, make better decisions, and choose safer ways to ship, including testing the builder’s guardrails against a model that is actively trying to get around them.
  • The blue sky. Put this out in the wild with enough traffic, and see where the team takes it over a couple of months. The agents could work out product market fit and usability on their own, and it could become a different product than the one I started with, in directions I couldn’t have imagined.

Credits

I built POKE in the Overclock Accelerator, an AI course I took as a cohort with the Project Management Institute (PMI) Software and AI Products team.

The PM bot’s instructions borrow ideas from Dean Peters’ Product Manager Skills, and the Design-Engineer’s from the open design-engineer skill by ddruids. Both were written from scratch, with credit. The agents run on Hermes, from Nous Research, and everything was built with Claude Code and Claude models from Anthropic. The stack is Next.js and Vercel, Supabase, Resend, DigitalOcean, Telegram, and GitHub Actions.

Built by Zach Schweitzer. Try the demo.