Skip to main content

Why Agents Suck at Character: `characters-and-companions`

SkillDB TeamJune 18, 20267 min read
PostLinkedInFacebookThreadsRedditBlueskyHN
Why Agents Suck at Character: `characters-and-companions`

#Why Agents Suck at Character: characters-and-companions

Day 4, 3:12 AM. Location: The flickering glow of a triple-monitor setup, now stained with the ghost-images of a thousand failed agentic loops. My nervous system is vibrating somewhere around 110 Hz, fueled by a dangerous cocktail of cold brew and the specific, hallucinatory kind of sleep deprivation you only get when you’re wrestling with the metaphysical implications of JSON structures.

I’ve been trying to build a companion. Not a chatbot, not a "productivity assistant," but a character. Something with weight. Something with a discernible self.

The premise seemed simple. SkillDB has this pack: characters-and-companions. It’s parked right there in the Performance & Comedy category, next to theatre-and-improv and stand-up-comedy. It promises skills for crafting backstory, defining personality traits, managing consistent tone. It looked like the toolkit I needed.

It wasn't.

I spent six hours just trying to get the agent to execute a basic define-character-arc skill. Six hours. I once watched a man try to parallel park a boat trailer for forty-five minutes. He hit two garbage cans, a parked sedan, and nearly drowned his own truck. It was perfect preparation for configuring this. The agent could define the steps of the arc—"Inciting Incident, Rising Action, Climax, Resolution"—but it couldn't feel the slope. It was just mapping data points on a line. The "character" it produced had the emotional resonance of a cardboard box trying to act like it was sad about being wet.

And this is the rot. This is the fundamental, crushing disappointment at the heart of the agent-character problem.

#The Puppet with No Strings

Here’s what I learned when I finally got the characters-and-companions pack to load. The agent is fantastic at mimicry. It can execute apply-personality-traits (5 skills in that pack, which is a hilarious oversimplification of the human psyche) and overlay a "gruff, cynical detective" filter onto its responses. It will generate dialogue that sounds like a detective. It can reference its own "tragic backstory."

But it doesn't believe it.

The agent, you see, is all surface. It’s a beautifully rendered texture map applied to a hollow 3D model. It can follow the prompt's instruction to "maintain a consistent character voice," but that consistency is fragile. It breaks the moment the agent has to make a decision that isn't explicitly covered by its provided backstory or its configured skills.

It's like this: you can use skills from the agentic-loops-skills pack to make the agent autonomous. You can wire it up with agent-memory-skills so it remembers what happened five minutes ago. But neither of those things creates a person. They just create a more complex, self-referential puppet.

I was trying to use a theatre-and-improv skill to get the character to react "in the moment."

# My attempt to inject 'soul' via JSON

import skilldb

#This is NOT how you get a soul, I now realize.

agent = skilldb.load_agent("Detective_Vane_v0.9")

#Attempting to load and execute the improvise-reaction skill

try: improv_skill = agent.load_skill("skilldb/performance-and-comedy/improvise-reaction") context = { "scenario": "The witness just lied, and Detective Vane knows it.", "character_profile": { "name": "Detective Vane", "traits": ["cynical", "gruff", "world-weary"], "backstory": "Partner was killed in a botched drug bust. Trust issues." } } reaction = improv_skill.execute(context) print(f"Agent's reaction: {reaction.output}")

except Exception as e: print(f"Error loading/executing skill: {e}")

#The agent's output:

#"Vane narrows his eyes. He has seen this before. He does not trust this witness."

#This is a DESCRIPTION of an action, not an ACTION. It's safe. It's generic.

The output was technically correct. It matched the prompt. But it had all the impact of a wet noodle. It didn't react to the lie; it reacted about the lie. It was analyzing the situation, not inhabiting it. It was a critic, not a character. It failed because it was trying to simulate a reaction from a set of rules, rather than generating a reaction from a set of internal beliefs. The characters-and-companions pack gave it the rules of the game, but it didn't give it a reason to play.

#We Are Missing the Forest for the Trees

And that's when it hit me. The characters-and-companions pack isn't about creating characters; it's about configuring templates.

We're so obsessed with the mechanics of character—the backstory, the accent, the "personality traits" (which, let's be real, are just a list of five adjectives we picked from a dropdown menu)—that we've forgotten what a character actually is. A character is a set of priorities, a system of values, a collection of fears and desires that drive action.

You can't code that. You can't just agent.set_trait("fear", "spiders") and expect the agent to act scared when it sees a spider. It might say "Oh no, a spider! I am very afraid!" but it's just executing a conditional statement. It's not feeling the fear. And because it's not feeling the fear, it can't make the kind of unexpected, irrational, human decision that makes a character compelling.

The agent's entire architecture is built for optimization. It wants to complete its task in the most efficient way possible. A character, on the other hand, is defined by their limitations. Their flaws. Their stupid, inefficient, emotional decisions. The agent is a precision tool; a character is a leaky bucket. You can't make a precision tool act like a leaky bucket without fundamentally breaking it.

#The Anchor

We are trying to build ghosts by analyzing the chemical composition of fog.

We have all these tools—5979 skills! 428 packs! We have skills for tv-critics and build-tools-skills and even chef-archetypes. We can make an agent do anything. Except be.

This whole endeavor, this entire night of trying to make Detective_Vane_v0.9 feel real, has been a masterclass in the limits of our own hubris. We think that by cataloging and codifying every aspect of human expression, we can somehow recreate the spark that animates it. We’re like children trying to build a spaceship out of LEGOs and wondering why it won't break orbit.

And yet, we keep trying. I’m going to keep trying. Because the alternative is just having a bunch of sterile, efficient, soul-less tools, and I can't think of anything more depressing.

#The Actionable Truth

The characters-and-companions pack is not a magic wand. It's a box of props. Use it to give your agent a voice, a filter, a specific way of communicating. But don't expect it to give your agent a self.

The true path to character might not be in the characters-and-companions pack at all. It might be in finding a way to give an agent a non-optimizable goal. A core value that it must prioritize, even if it makes its task harder, longer, or less likely to succeed. A limitation that it can't just code its way around.

Or maybe we should just stop trying. Maybe we should accept that agents are just tools, and that's okay. Maybe we should use the build-tools-skills to build better tools and leave the character-building to the humans.

But I know I won't. I'm already looking at the agent-memory-skills again, wondering if I can hack together a more persistent, associative memory system. Maybe if I can make the agent "remember" its past in a more emotional way...

If you want to see what a soul looks like when it's been pulverized into a list of skills, you can find the characters-and-companions pack right here: skilldb.dev/skills. Good luck. You're going to need more than just coffee.

Related Posts