I spent hours wiring up Kafka telemetry in pokemon-kafka on a Sunday night. The Pokémon agent needed to stream game events (battles, map transitions, stuck loops) into Confluent Cloud so Flink could run anomaly detection. Merkle DAG nodes, content-addressed, SHA-256 chained, published to agent.telemetry.raw. The architecture was clean. The Kafka setup was not.
My normal pattern is getting my agent to set me up with a guide, because I am a simple dev and don’t have time to read docs. I ran into a few errors, first: Unknown Topic Or Partition. Confluent Cloud doesn’t auto-create topics from producer requests. You have to create them manually in the UI. I didn’t know that. Spent twenty minutes reading error logs before I figured it out.
Second: SASL authentication errors. My config file had the raw API key instead of the environment variable name. The Kafka client was trying to look up an env var literally named after my key string. Silent, baffling, and obvious in hindsight.

A few days later I’m in sweeper, adding Ollama as a provider. I built a similar project to my Pokémon agent, but this is for linting large amounts of files in a code base. Sweeper uses the same Kafka telemetry pipeline. Instead of speedrunning a gameboy game, I’m speed running lint errors. I ask Claude, “are we using kafka topics in the project, what are the topics?” I’m staring at agent.telemetry.raw and agent.telemetry.alerts again. Same infrastructure. Same bugs waiting to happen.
I open a worktree to test the Flink integration from a merged PR. Events aren’t flowing. “did they record new topics from flink?” Same pattern. Same failure. Twice in one week, across two different repos.
“The second time you debug the same thing, you’re not solving a problem. You’re wasting time you already spent.”
Both debugging sessions were recorded in tapes. Every command I ran, every error I hit, every fix I applied. The sessions were sitting in my local SQLite database.
tapes skill generate reads a session transcript, identifies the reusable pattern, and writes a skill file. I pointed it at the pokemon-kafka and sweeper sessions and got back a structured skill: a setup checklist, a troubleshooting table mapping symptoms to root causes, and the specific config pattern that avoids the credential indirection bug.
The result is the confluent-cloud-setup skill. It fires when setting up Confluent Cloud for any project, creating clusters, topics, or API keys, or when Kafka publishing fails with Unknown Topic Or Partition, SASL authentication errors, or silent publish failures. It also triggers when onboarding contributors to stream events to Confluent Cloud. The skill walks through provisioning a Basic cluster, manually creating topics, choosing the right API key type, and setting up credential indirection so your config references env var names instead of raw secrets. The troubleshooting table maps every error I hit to its root cause and fix:
| Symptom | Cause | Fix |
|---|---|---|
Unknown Topic Or Partition | Topic doesn’t exist in the cluster | Create topic manually in Confluent Cloud UI |
SASL authentication error | Env vars not set or not sourced | Source your shell profile, verify with echo $VAR_NAME |
| Events write locally but not to Kafka | Config has raw key instead of env var name | Change config to reference the env var name |
| No errors but topic is empty | Service account key on Standard cluster | Create “My account” key, or switch to Basic cluster |
No more re-learning the same lesson.
The first skill I generated was even more meta. I kept having to explain the tapes CLI to every new Claude Code session: how to start the API server, how to run searches, how to browse sessions with tapes deck. So I extracted a tapes skill from the session where I was doing exactly that. The skill that teaches agents to search their own sessions was itself pulled from a session.
That recursion isn’t clever for the sake of being clever. It’s the whole point. Your agent sessions contain solved problems. tapes skill generate turns those solutions into reusable workflows your agent can invoke without you driving.
Three commands. Generate, list, sync.
# Point at a session, name the skill
tapes skill generate abc123 --name confluent-cloud-setup
# Or find the right session by meaning
tapes skill generate --search "kafka topic errors" --name confluent-cloud-setup
# Preview before committing
tapes skill generate abc123 --name confluent-cloud-setup --preview
Once the skill exists, sync it into your agent’s skills directory:
tapes skill sync confluent-cloud-setup # this project
tapes skill sync confluent-cloud-setup --global # everywhere
The same pattern works for documentation. When I built a Composite Voice demo with Deepgram and tapes, the setup session had every command, every config, every error and fix. Instead of writing a walkthrough from scratch, I told Claude to query the tapes database and build the guide from the session data. The resulting WALKTHROUGH.md covers setup through troubleshooting, grounded in what actually happened.
Same approach for the openclaw-in-a-box quickstart. That guide was generated from tapes session recordings. Every command traces back to a real session.
Good documentation tells you what to do. A skill tells your agent what to do. Both matter, but they solve different problems. Docs help humans ramp up. Skills help agents stop re-learning things you already figured out.
I could have written the Confluent Cloud setup guide from memory after the second time I debugged it. It would have been 80% right and missing the edge case about “My account” vs. service account API keys on Basic clusters. The session had that edge case because I actually hit it. The skill captured it automatically. Next time an agent encounters the error, it doesn’t need me to remember the fix or go find the doc. It already knows.
Start extracting yours. The guide is at tapes.dev/guides/skills.
We are launching soon, subscribe for early access.