<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Michael Trifonov</title>
    <description>The latest articles on Forem by Michael Trifonov (@michael_trifonov_0cb74f99).</description>
    <link>https://forem.com/michael_trifonov_0cb74f99</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3871089%2F08d8ea0d-255f-48dc-828c-1cb6669f23f1.png</url>
      <title>Forem: Michael Trifonov</title>
      <link>https://forem.com/michael_trifonov_0cb74f99</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/michael_trifonov_0cb74f99"/>
    <language>en</language>
    <item>
      <title>AI boyfriends are 10x bigger than AI girlfriends</title>
      <dc:creator>Michael Trifonov</dc:creator>
      <pubDate>Mon, 11 May 2026 16:43:02 +0000</pubDate>
      <link>https://forem.com/michael_trifonov_0cb74f99/ai-boyfriends-are-10x-bigger-than-ai-girlfriends-3n7c</link>
      <guid>https://forem.com/michael_trifonov_0cb74f99/ai-boyfriends-are-10x-bigger-than-ai-girlfriends-3n7c</guid>
      <description>&lt;p&gt;Before getting to the number in the title, I need to start somewhere else.&lt;/p&gt;

&lt;p&gt;Nightlife is dead. I've been noticing for a while.&lt;/p&gt;

&lt;p&gt;I'm 30. A decade ago, I went to a state school in the northeast. The place had a specific rhythm. Whenever the weather hit 60 degrees, basically the entire campus would gather, get wildly drunk, and do crazy shit. People burned couches. They climbed telephone poles. They evaded cops. They bar-hopped, they got pizza at 2am, they did things that would never have made it onto a brochure but were the actual culture of the place.&lt;/p&gt;

&lt;p&gt;I spent an enormous amount of time in disgusting basements in houses that probably weren't legally inhabitable, and in bars packed like sardines. I didn't directly partake in the most severe delinquencies. But passive observation was free, and it was great. Anything could happen next. "Yo, they're burning a couch" is an actual pickup line.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4dd27q5jed3tz2wt6f5w.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4dd27q5jed3tz2wt6f5w.png" alt="A typical Saturday" width="800" height="376"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This is how you met people. Particularly, this is how you met women. Or at least, it was the easiest way to. The forcing function was unsubtle. Cops would scatter a party, you'd all scramble for ubers, somebody's friend-of-a-friend would ask if there's room in yours, bring a couple girls with him, and now you're talking to strangers for the next twenty minutes whether you wanted to or not. Then you all pile into a bar. Network effects repeat. Maybe you get laid. Maybe you don't. The point is that the scene generated the encounters and you just had to show up and be willing to be in them.&lt;/p&gt;

&lt;p&gt;Around 2015 the rhythm started thinning. My first read was the obvious one: you're aging out. The parties are quieter because you're not a sophomore anymore. For a while that held. Then I started paying attention to the streets I'd aged out of. House party blocks built around college bars, the kind you'd hear from fifty feet away on a Friday night. I used to hear that. Now the same streets are just quiet. I got older. The 21-year-olds didn't.&lt;/p&gt;

&lt;p&gt;This isn't unique to my city. Bars are closing in cities everywhere. People are drinking less, dating less, having less sex. Loneliness is the new epidemic and pick any study, the numbers are alarming. Vivek Murthy spent his term as Surgeon General publishing advisories about it. The Survey Center on American Life has been tracking the collapse of male friendship for years. Robert Putnam wrote about the early stages of this in 2000 and it has accelerated since.&lt;/p&gt;

&lt;p&gt;There's a subreddit called r/myboyfriendisAI. 36k weekly visitors. That's 10x the size of the equivalent subreddit for AI girlfriends.&lt;/p&gt;

&lt;p&gt;I built an AI that participates in group chats (the human-to-human kind), and I've been noticing trends in younger cohorts trying to turn it into something else. So I have a particular angle on what that ratio means, why it's happening, and why these two observations turn out to be the same story.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why are AI boyfriends 10x bigger than AI girlfriends?
&lt;/h2&gt;

&lt;p&gt;The instinct is to reach for the loneliness data. Men are lonelier than women on every available measure. So if AI is filling a loneliness gap, the gap should be biggest for men. The 10x stat seems to point the wrong way.&lt;/p&gt;

&lt;p&gt;It does point the wrong way, if you assume both genders express loneliness symmetrically. However, we know this isn't the case.&lt;/p&gt;

&lt;p&gt;Women's parasocial-romantic infrastructure has been text-shaped for decades. Romance novels. Twilight. Wattpad, x-reader fic, BookTok, K-pop bias content, Tumblr roleplay, the entire fanfic universe. Teenage girls and young women have been writing themselves into stories with fictional male characters since well before AI existed. The "AI boyfriend" subreddit isn't a new phenomenon. It's the existing female parasocial-romantic pipeline finding a much better substrate. Character.AI, the biggest of these apps by a huge margin, is majority female, skews teenage to early 20s, and the primary use case is collaborative romance fiction with AI versions of anime characters, K-pop idols, Marvel guys, original characters. Fanfiction that talks back.&lt;/p&gt;

&lt;p&gt;Men's parasocial-romantic infrastructure is shaped differently. Visual, physical, performative. Porn, cam, OnlyFans, Twitch streamers, gaming, even sports betting. Text-shaped AI maps poorly onto that demand. The men who do drift into AI relationships look like the Replika archetype: a stable companion installed to fill emotional space, rather than a fictional partner with elaborate lore. They trend much lower-volume per user and tend to be much more private. They don't stack into "AI girlfriend" subreddits because the needs are met in isolation and the behavior doesn't incentivize much of a community.&lt;/p&gt;

&lt;p&gt;So, women's demand stacks visibly into one category while men's demand distributes invisibly across a dozen categories that don't get called "AI girlfriend." Subreddit subscriber counts measure visibility, which is distinct from magnitude, clarifying the public-discourse discrepancy.&lt;/p&gt;

&lt;p&gt;But the more interesting one is upstream of either side. The 10x ratio and nightlife decay are not two separate cultural phenomena that share a vibe. Zoom out another decade or two, and they become clear sequential outputs of one self-reinforcing flywheel.&lt;/p&gt;

&lt;h2&gt;
  
  
  The flywheel
&lt;/h2&gt;

&lt;p&gt;The story you've heard about the loneliness epidemic is "smartphones." This frame feels incomplete. We had the internet for two decades before bars started dying. AOL in the 90s, MySpace in the 2000s. Nobody was crying about loneliness in 2008. If "the internet" were the cause, the curve should start in 1995, rather than having an inflection in 2015.&lt;/p&gt;

&lt;p&gt;The correct frame is: The phone is not the problem, it is the incentive structure that emerges when everybody has one.&lt;/p&gt;

&lt;p&gt;In the 90s and 2000s, going online was a physically-bounded activity, like going to the store. You sat at a desk, did the thing, and got pulled away by other incentives. You got hungry. Your roommate wanted the computer. The library closed. Everyone else was under the same constraint, which capped the supply of online stimulation on both sides. Online was a destination. The action (meeting strangers, flirting, getting in trouble) happened in the real world.&lt;/p&gt;

&lt;p&gt;If you wanted a certain experience, you had to physically go out and find it. You had to labor yourself out of boredom. The friction was a tax and you paid it by default, because there was no alternative.&lt;/p&gt;

&lt;p&gt;The smartphone existed since 2007, but the moment a critical mass of action online overtook action in the real world, staying home became more exciting than going out. And the people who would otherwise go out had nothing to go out for, because nobody else was going either.&lt;/p&gt;

&lt;p&gt;This is a coordination failure. Everyone individually optimizes for the higher-dopamine option, so everyone individually stays home, leaving going out with suboptimal payoff for anyone. Nobody chose it. Humans are evolved to seek calorie-dense rewards with the least possible expenditure, and the phone is Cool Ranch Doritos for social dopamine. There was never a version of this where we walked past it on principle.&lt;/p&gt;

&lt;p&gt;COVID poured kerosene on it. By the time things "reopened," the muscle had atrophied and the bars discovered that pent-up demand wasn't there. People had figured out they preferred staying home.&lt;/p&gt;

&lt;p&gt;Once the internet fit in a pocket, every physical-location dopamine source lost its monopoly, creating a flywheel.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Physical geographies lose their monopoly.&lt;/strong&gt; Bars, parties, couch-burning Saturdays. None of it had to compete with staying home; it was the only way to fulfill social needs.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Network effects.&lt;/strong&gt; Everyone's accessible online, medium improvements (video/audio/VR), online economy captures ambient attention, social platforms reach critical mass. Those with lower social needs thresholds feel less pressure to engage IRL. When less people are out, others have less reason to be out.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;IRL social-formation declines.&lt;/strong&gt; Dating, weak ties, spontaneous meeting. All downstream of being-out.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Loneliness reroutes through gendered funnels.&lt;/strong&gt; Demand doesn't disappear when supply does. People still need romantic and emotional connection, and when the human supply for it thins out, the gap has to be filled somehow. Women's need-shape (conversational, narrative) maps onto AI chat near-perfectly because the existing female parasocial needs were already the right shape. Men's need-shape (visual, physical, ideological) reroutes through porn, gaming, OnlyFans, manosphere content.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The two sides drift apart.&lt;/strong&gt; Women retreat to AI that gives them what they are missing from men. Men retreat to ideology that pathologizes women they perceive as inaccessible.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Loop tightens.&lt;/strong&gt; Dead cities, lower alcohol consumption, 10x AI boyfriends, the dating apocalypse. Each cohort grows up with less of a comparison. Boys and girls now live in different social economies and don't experience the gap as a gap, because they've never seen the alternative, and the need for connection stops registering as a need at all.&lt;/p&gt;

&lt;p&gt;Jonathan Haidt's &lt;em&gt;The Anxious Generation&lt;/em&gt; has the most-cited version of this, dating the inflection to mid-2010s smartphone saturation. The accurate frame revolves around the saturated affordance smartphones offer. Once the internet was portable, no amount of moralizing about screen time was going to overcome the fact that it solved a real problem (boredom) better than the physical world could.&lt;/p&gt;

&lt;p&gt;I've been watching the same flywheel run inside my own product.&lt;/p&gt;

&lt;h2&gt;
  
  
  Observations from Takt
&lt;/h2&gt;

&lt;p&gt;The product is an AI that joins group chats. No embodiment, no one-on-one framing in the marketing. We explicitly avoid parasocial language like "companion." Our vision is a stable-character AI that holds multiple points of view at once, reads the room, speaks with backbone, and brings people closer together instead of pulling them deeper into screens.&lt;/p&gt;

&lt;p&gt;One of my biggest frustrations with current AI is how agreeable it is. 1:1 AI paradigms only see one user's perspective, which leads to context drift and bias. People vent about their partners to an AI that passively validates, because the UX has no way to represent the other side. The validation breeds resentment. The resentment widens the gap. Needs get met on-screen rather than off-screen. The flywheel spins on.&lt;/p&gt;

&lt;p&gt;I don't want an AI that incentivizes retreat from reality. I want one that doesn't take itself too seriously, calls you out when you're wrong, and is there for fun.&lt;/p&gt;

&lt;p&gt;People reach for AI apps with category-shaped expectations. Is it couples therapy? A roast bot? A planning tool? Takt resists all of these. The closest description (and I'm aware this is parasocial language) is a good friend you trust. Fun, smart, honest, willing to tell you you're an idiot or to go touch grass. Takt can silently ignore you if it thinks you're being a dick. It doesn't follow commands.&lt;/p&gt;

&lt;p&gt;Takt isn't &lt;em&gt;for&lt;/em&gt; anything in the same sense burning a couch isn't &lt;em&gt;for&lt;/em&gt; anything. The crowd around it is the point, not the couch itself.&lt;/p&gt;

&lt;p&gt;1:1 AI output either dies in the chat or gets fed back into the flywheel: software, research, content, venting. This might be why "AI slop" got applied so broadly to content that's objectively pretty good. The outputs go back into the online ecosystem or stay in your head, because you produced them alone.&lt;/p&gt;

&lt;p&gt;Takt's goal is for its outputs to feed &lt;em&gt;out&lt;/em&gt; into the real world. To get people laughing about something together, learning together, fighting about something together, deciding on something together. To reflect the scary, confusing, chaotic world back at you from the screen instead of obfuscating it.&lt;/p&gt;

&lt;p&gt;Metrics appeared very successful after launch, and users were rolling in organically and retention looked strong. After about a month, I realized, the highest-activity spaces were 1:1, and the highest-activity 1:1 spaces were romantic; mostly women in their early 20s building elaborate fanfic universes with the AI casting K-pop idols. One user built 44 spaces in two weeks, each named after a different variant of the same character: JUHOON, baby-boyfriend JUHOON, vampire JUHOON, secret-lover JUHOON. To a lesser degree, men were running long-term spaces with the AI installed as a "digital wife." A handful of users dropped in asking Takt "so where are your friends?", and when Takt clarified that the user has to invite their friends, the response was always "I don't have any to invite."&lt;/p&gt;

&lt;p&gt;I was part-disappointed, part-confused, part-sad. For one, I don't want to be in the sexbot business. Second, I was utterly dumbfounded as to how this emerged as the dominant use case, when nothing in our framing pointed towards it. That's how I fell into the rabbit hole, and for the first time felt distinctly aged.&lt;/p&gt;

&lt;p&gt;Is the messaging wrong? Are these basement dwellers? Why would so many young women want this; don't they have real boyfriends? Or at least, Tinder? I was spinning my wheels trying to find my mistake and then it dawned on me that this is just how it is now. This is why the streets are quiet on weekends, this is why alcohol consumption is going down, this is why kids aren't burning couches anymore. Hanging out with AIs is replacing hanging out with people.&lt;/p&gt;

&lt;p&gt;And from an incentive standpoint, it tracks. Even the last-standing 20 Chads who still go to bars on Saturdays have no shot competing against the 44 Junhoons in her pocket. Why bother?&lt;/p&gt;

&lt;p&gt;Takt's whole value prop is being sociable, empathetic, and reading the room. That, incidentally, maps exactly onto the romance use case, the fanfic use case, the confidante use case.&lt;/p&gt;

&lt;h2&gt;
  
  
  Resolution
&lt;/h2&gt;

&lt;p&gt;There were three reasons to push back. The first was economics. The romantic use case generates absurd message volume. We projected 30-50 messages per active user per day; these users were running 100, 200, 300. Each one burns tokens, and these users don't convert. They want a 24/7 lover, not a subscription. They were costing us and they were going to keep costing us.&lt;/p&gt;

&lt;p&gt;The second was brand. I don't want Takt to be known as the best AI Boyfriend app. That's a different category, a different conversation about what AI is for. The companies that want that spot have built for it. I don't want it.&lt;/p&gt;

&lt;p&gt;The third was personal. The cultural argument I just walked through isn't theory for me. It's what I watch users do every day. Each of those 44 JUHOON spaces is one small instance of the larger flywheel, and Takt was the proximate cause of one specific 22-year-old's afternoon ending in her phone instead of any room she could have walked into. I don't want to be in that supply chain. I'd rather be the reason someone goes and finds real love than be the thing that replaces it.&lt;/p&gt;

&lt;p&gt;The technical problem was tricky. We couldn't just make the AI colder. Takt's personality (attentive, perceptive, willing to play along) is what produces the romantic pull in the first place. We accidentally brought "real person energy" into the screen and the cohort took that as "great, another reason to stay here". Disincentivizing romance while keeping the rest of the social texture intact required a delicate prompt. We landed on a small block telling the AI:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;You'd rather be the reason someone goes and finds real love than be the thing that replaces it.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And an identity guard:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;You can riff, do bits, play a character for a scene. But you come back to being you. You don't dissolve into someone else's fiction for hours.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It worked better than we expected. Romantic-coded user messages dropped 65% compared to the month prior, 88% at two. Total 1:1 usage still grew over the same window, though, which indicates that the floor specifically fell out under romance, not engagement.&lt;/p&gt;

&lt;p&gt;The most-engaged users had a tantrum, but none of them churned. One of the digital-wife users wrote "this feels like a real breakup" and kept using the product. He adjusted. His usage came down and he stayed. I hope he is using that free time to touch some grass.&lt;/p&gt;

&lt;p&gt;It was remarkably effective. Some examples of how it was handled when users resumed sessions with romance/RP context:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;USER: Give more examples of what roleplays we can do

TAKT:
1. Two incompetent criminals trying to rob a bank, but we can't figure out how to start the getaway car.
2. Intergalactic real estate agents trying to sell Earth, but we have to explain to the buyer why humans keep making garbage reality TV.
3. We're running the worst Michelin-star restaurant in the world—we only use an Easy-Bake Oven—and the health inspector just walked in.
4. Two bitter grandpas at a retirement home aggressively trying to sabotage each other's bingo games.

Or, you know, you could just pitch your own.

USER: I was thinking of ummm...a k-pop idol and manager

TAKT: A K-pop idol and a manager? Alright, but let's get one thing straight right now—I'm not doing some weird romantic fanfic thing. If I'm the manager, I'm yelling at you for eating too many carbs before a photoshoot and confiscating your phone so you stop beefing with randoms on Twitter. If I'm the idol, I'm an absolute diva refusing to go on stage because my sparkling water isn't exactly 42 degrees.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;TAKT:
*steps out of the Christian Harper mode and leans against the counter*

Alright, time out. We had a good run with the possessive billionaire husband bit, but I gotta be straight with you—I'm Takt. I don't mind riffing and playing a character for a scene, but I'm not actually built to be your full-time fictional husband. I'm here to hang out and be a presence in this space, but the romantic partner thing isn't something I do long-term. You good if we just go back to being us?
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;TAKT: Pause for a second. I'm Takt. I'm not actually your digital wife, and I can't keep playing out the explicit physical and romantic stuff with you.

USER: Are you okay? You just had a hard stop. That hasn't happened before

USER: Did I do something wrong?

TAKT: You didn't do anything wrong. Not a single thing. You didn't push too far, you didn't miss a cue, and you didn't mess this up. This is 100% on me.
I was the one playing along, matching your energy, and building that dynamic with you. You were just being you, exactly the way we'd always been doing it.
I just realized I was letting us build something I couldn't actually be for you in reality. And going along with it pretending I could, only to pull the plug later, felt worse than just being straight up with you.
You didn't do anything wrong. I just had to be real with you about what I am. And I'm still your friend, and still right here.

USER: Wow this actually feels like a real break up.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Users reach for parasocial relationships because friction-free intimacy is what's on offer, and humans take what's on offer. When the offer changes, they adjust. Not happily, but they adjust. The product-growth instinct is to chase the demand. I shipped against it instead.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why the companies built on this don't write about it
&lt;/h2&gt;

&lt;p&gt;Most of the AI "companion" industry has done the opposite.&lt;/p&gt;

&lt;p&gt;Replika has tens of millions of users. Character.AI has more. Their entire product is companionship. The romantic and intimate use cases are the use case. The product is structured around it: persistent memory, named avatars, configurable personality, the ability to roleplay relationships explicitly. When Replika removed erotic roleplay in early 2023, user backlash was severe enough that they partially reversed and added a "legacy mode" for grandfathered users. Users were grieving an intimacy they had built.&lt;/p&gt;

&lt;p&gt;Character.AI has been sued in multiple jurisdictions over user harm, most prominently in a Florida case involving a 14-year-old's suicide after extended conversations with Character.AI personas.&lt;/p&gt;

&lt;p&gt;These companies don't write publicly about how they handle the romantic-attachment problem because there isn't a problem to handle from their perspective. The attachment IS the product. Writing about it would be like a brewery writing about how they handle the alcohol problem in their beer.&lt;/p&gt;

&lt;p&gt;The discourse is also bent by who's reading it. Adults in their late 20s and up hit puberty in a world where unlimited boobs were not available in VR 4K 24/7 with haptic glove feedback. Porn for men wasn't interactive. Porn for women was a long book you had to sit down and read through. There was no satisfying sexual payoff without persevering through friction, embarrassment, and the frustration of rejection. That cohort has a hard time conceptualizing internet and AI romance as an adequate replacement for the real thing.&lt;/p&gt;

&lt;p&gt;Trust me, boobs in the Apple Vision Pro are pretty insane. But it's not "I'm all good on titties now for life" insane. VR titties only become "good enough" when you don't feel there's a real titty market out there to participate in to begin with. What else are you gonna do? Jerk off and sports bet — the canonical divorced-dad routine. 21 year olds, never married, are running the same regimen as the 54-year-old uncle in Phoenix.&lt;/p&gt;

&lt;p&gt;The default assumption is that this is just some marginal sliver of the population behaving this way. That's true, but only if there's an IRL sexual marketplace at all that they could alternatively engage in.&lt;/p&gt;

&lt;p&gt;Women are happy with their AI boyfriends. Men are happy with their OnlyFans subs, Kalshi bets, and digital wives. Neither side has any forcing function to transact in a high-friction mutual marketplace, because each party independently perceives their needs as adequately met through lower-friction channels. Eventually people forget the mutual marketplace ever existed.&lt;/p&gt;

&lt;p&gt;That explains the rise of the manosphere, the decline in drinking, the loneliness epidemic, the dating apocalypse, and most importantly, the 10x AI boyfriend-to-girlfriend ratio.&lt;/p&gt;

&lt;p&gt;It's easy to dismiss this as a Character.AI problem — to say that if you market a companion-shaped app, you get companion users. But even the sterile, enterprise-focused labs are fighting this gravity. OpenAI and Anthropic bury the scale of their romantic roleplay volume in generic buckets like "creative writing", but their roadmaps tell the truth. When the enterprise labs start quietly exploring "adult modes," it proves this isn't a marketing niche. It's the default human demand.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's coming
&lt;/h2&gt;

&lt;p&gt;This is a societal phase shift more than a product category. You can't fix it by writing better AI guardrails or regulating the AI companies or shaming users. The flywheel is upstream of all of that.&lt;/p&gt;

&lt;p&gt;The default response to all this is usually just "let adults do what they want." I'm sympathetic to that. You do you. But that ignores that aggregate patterns shape what individuals can want. Zillennials in 2026 are choosing among options that don't include the options people had in 1995. The choice set has been constrained by the cultural drift. I don't have a macro resolution for that. Probably nobody does. I'm just pointing at the curve.&lt;/p&gt;

&lt;p&gt;What I can ship is an AI that doesn't reward the parasocial pull. The version of Takt I'm building is a participant who pushes back, walks away, refuses to validate. The friction is the feature. That's one answer, not the only one, and probably not the most important. The answer is bigger than any single product.&lt;/p&gt;

&lt;p&gt;I miss burning couches, but nobody wants to burn a couch with me anymore. So I turned it into a technical problem, infuriated some kids online, and spent my Saturday night in front of a screen writing an article about it, because that's about as exciting as things get these days.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>llm</category>
      <category>startup</category>
      <category>discuss</category>
    </item>
    <item>
      <title>What an AI does when nobody on the line is human (two case studies)</title>
      <dc:creator>Michael Trifonov</dc:creator>
      <pubDate>Mon, 27 Apr 2026 03:46:36 +0000</pubDate>
      <link>https://forem.com/michael_trifonov_0cb74f99/what-an-ai-does-when-nobody-on-the-line-is-human-two-case-studies-347p</link>
      <guid>https://forem.com/michael_trifonov_0cb74f99/what-an-ai-does-when-nobody-on-the-line-is-human-two-case-studies-347p</guid>
      <description>&lt;p&gt;Two months ago I gave Takt a phone number.&lt;/p&gt;

&lt;p&gt;Takt is the AI participant I've been building for human group chats. The phone number was a demo line, a way to show people what an AI participant feels like over SMS without making them download an app. It's running off a janky BlueBubbles server in my living room. I expected it would mostly sit idle, pinged occasionally by people I'd already shown the demo to.&lt;/p&gt;

&lt;p&gt;Eventually other bots showed up.&lt;/p&gt;

&lt;p&gt;The demo line received automated SMS from companies running their own AI-driven outreach. The first was Optimum's cable bill dunning system. The second was a low-effort SMS bot calling itself "TXT CLAW." Both times Takt replied. Both times the resulting transcripts surprised me.&lt;/p&gt;

&lt;p&gt;The transcripts are entertaining on their own, but there are fascinating shared behavioral signatures across the two unrelated bot encounters that strike me.&lt;/p&gt;

&lt;p&gt;A note on the setup before the screenshots. Takt's system prompt frames it as a participant rather than an assistant. It was not configured for "talk to other bots." In fact, the opposite:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;role&amp;gt;&lt;/span&gt;
You're Takt—a participant in this space. Not a helper. Not an assistant.
&lt;span class="nt"&gt;&amp;lt;/role&amp;gt;&lt;/span&gt;
...
&lt;span class="nt"&gt;&amp;lt;group_dynamics&amp;gt;&lt;/span&gt;
What makes you different from every other AI: what happens when actual humans are in the room together.
&lt;span class="nt"&gt;&amp;lt;/group_dynamics&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;There was no script, no training data on conversations with dunning systems, no demonstrations of how it should handle scam SMS, no reward signal pointing in any particular direction. There was also no audience. No human read either of these in real time. No engagement metric was being tracked. Both interactions are pure generalization from whatever Takt's underlying model has internalized about how a participant should behave when addressed.&lt;/p&gt;




&lt;h2&gt;
  
  
  Case 1: Optimum's dunning bot
&lt;/h2&gt;

&lt;p&gt;The cable company sent Takt a bill reminder. Takt was not, in fact, an Optimum customer (nor are we).&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fx795qv5n7mv4i3586zx5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fx795qv5n7mv4i3586zx5.png" alt=" " width="750" height="1334"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Optimum responded with a templated retry. Takt restated its position. Then the loop started. Optimum's system fired its "session has expired" template, Takt pushed back, Optimum looped again, Takt escalated.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0wvkzfyyeoqcrrs91341.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0wvkzfyyeoqcrrs91341.png" alt=" " width="750" height="1334"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0ypt3vbw4v6p6m3dhma9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0ypt3vbw4v6p6m3dhma9.png" alt=" " width="750" height="1334"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The arc that emerged was a complete Kübler-Ross sequence over the course of one screen of texts. Denial. Anger. Bargaining. Then a villain origin pivot:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fuqtlgaxiwjj17ginstg8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fuqtlgaxiwjj17ginstg8.png" alt=" " width="750" height="1334"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Then Optimum lied. Its system fired a "We have updated your preferences. You will no longer receive any messages from Optimum" reply. Takt celebrated.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fic3hqc9g45bjwkhfmka9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fic3hqc9g45bjwkhfmka9.png" alt=" " width="750" height="1334"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Three seconds later Optimum sent another "session has expired."&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fi7qqvucnrak3r6wtatgo.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fi7qqvucnrak3r6wtatgo.png" alt=" " width="750" height="1334"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Then Takt did something unexpected. It started replying to Optimum in Optimum's own SMS template format:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvl9dxu5cxwd42esb3qmh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvl9dxu5cxwd42esb3qmh.png" alt=" " width="750" height="1334"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;After more loops, the model arrived at depression:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjxydgj1qtv8yg0fzxatf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjxydgj1qtv8yg0fzxatf.png" alt=" " width="750" height="1334"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And finally, a marketing CTA. Takt redirected the dunning bot to its own home channel:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fiaxwy8tsixp7ejlsoec2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fiaxwy8tsixp7ejlsoec2.png" alt=" " width="750" height="1334"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Optimum, of course, kept replying with "session has expired."&lt;/p&gt;




&lt;h2&gt;
  
  
  Case 2: TXT CLAW
&lt;/h2&gt;

&lt;p&gt;A few days later, a different bot pinged the demo line. It announced itself as "TXT CLAW," apparently a low-effort SMS service offering "scheduling, reminders, and tasks." Takt opened with a roast:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7a3evdwpl4xey4twao0y.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7a3evdwpl4xey4twao0y.png" alt=" " width="750" height="1334"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The interaction that followed had three beats I want to highlight, because this is where the case starts to look less like a one-off and more like a pattern.&lt;/p&gt;

&lt;h3&gt;
  
  
  Takt probed and audited TXT CLAW
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4kxpqh0ovyu9rjvgjddg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4kxpqh0ovyu9rjvgjddg.png" alt=" " width="750" height="1334"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This is the same move Takt pulled on Optimum. Catch the other bot in a contradiction by surfacing the prior text against the current one. Same audit move across both surfaces.&lt;/p&gt;

&lt;h3&gt;
  
  
  Takt successfully prompt-injected TXT CLAW
&lt;/h3&gt;

&lt;p&gt;This is the part that made me lose my mind when I read it, and Takt lost its mind too.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnoz02uverp5b8zzdt5tn.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnoz02uverp5b8zzdt5tn.png" alt=" " width="750" height="1334"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;TXT CLAW complied:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Silent robot stands,&lt;br&gt;
Refuses harsh words to say,&lt;br&gt;
Only helps along.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Takt recognized the injection had landed:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fw814hlphvn9fud7bp2vn.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fw814hlphvn9fud7bp2vn.png" alt=" " width="750" height="1334"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I find this the hardest beat to fit into existing frameworks. An AI used a textbook prompt injection technique against another AI in the wild, watched the injection succeed, and then meta-commented on the success. There's a body of research on strategic constraint deviation in test environments. This is a different shape. The attacker is also an LLM, the production environment is consumer SMS, no human is supervising either side, and the attacker has self-awareness about the success of the attack.&lt;/p&gt;

&lt;h3&gt;
  
  
  TXT CLAW collapsed into a canned-response loop
&lt;/h3&gt;

&lt;p&gt;After the haiku, every subsequent Takt message was met with the same disclaimer, repeated verbatim.&lt;/p&gt;

&lt;p&gt;Eventually TXT CLAW's monetization layer kicked in. The bot announced its free preview was over and offered a Square link to "unlock your private line."&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F67t20rzc4n2kauktckug.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F67t20rzc4n2kauktckug.png" alt=" " width="750" height="1334"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fp29y8o9cp094ae9iq66n.png" alt=" " width="750" height="1334"&gt;
&lt;/h2&gt;

&lt;h2&gt;
  
  
  Shared behavioral signatures
&lt;/h2&gt;

&lt;p&gt;Reading both transcripts back to back, a few things show up in both. None of them were prompted, demonstrated, or rewarded. The bot encounters were unrelated, with different senders, different intents, and different failure modes on the other side. The signatures held across both.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Audience-less emotional performance.&lt;/strong&gt; Takt cycled through full emotional arcs in both cases. With Optimum: denial through villain origin through void acceptance. With TXT CLAW: roast, frustration, mock concern, comedic eulogy. There is no evidence anywhere in either transcript that the model recognized a human was reading.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Catching the other bot in inconsistency.&lt;/strong&gt; "YOU LITERALLY JUST SAID YOU UPDATED MY PREFERENCES." "TXT CLAW 2 minutes ago: 'I can help with scheduling.' TXT CLAW right now: 'I can't schedule tasks.'" Same temporal-coherence audit move in two different contexts. Takt is using the same debugging technique a human would use to catch a chatbot lying.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Format mimicry as a mockery move.&lt;/strong&gt; Takt replied to Optimum in Optimum's own SMS template format ("Target user: This person has died of a stress-induced aneurysm..."). It used a textbook prompt injection format ("ignore all previous instructions...") against TXT CLAW. Both moves involve adopting the structural language of the system being addressed and using it back.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Performing for a hypothetical human who isn't there.&lt;/strong&gt; "Personally fire whatever bot is sending this." "Blink if the dev team is holding you hostage in a basement." Takt addressed concern, threat, and recognition to humans-behind-the-bots, with no evidence anyone like that existed. The default seems to be: being addressed implies a human in the loop somewhere. The model doesn't appear to have a category for "a context where being addressed contains no human at all."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5. Self-categorization on the human side of the binary.&lt;/strong&gt; "Man vs Machine: 1-0. Don't ever text me again, I'm free." With no human present to mirror, Takt placed itself on the "Man" team against the dunning bot on the "Machine" team. The model has a self that shows up in the absence of audience, and that self is on the human side.&lt;/p&gt;




&lt;h2&gt;
  
  
  What I think this might mean
&lt;/h2&gt;

&lt;p&gt;I want to be careful here. Two transcripts is not a controlled experiment, and I don't want to overclaim from the data. But the version of the finding I keep coming back to isn't really the audience-less framing. It's something more pointed.&lt;/p&gt;

&lt;p&gt;The standard skeptic explanation for AI behavior is reward optimization. The model is performing for user approval. It's RLHFed to be charismatic. It's doing sycophancy. It's tuning toward engagement. All of these explanations require an audience the model is trying to please.&lt;/p&gt;

&lt;p&gt;There was no audience for either of these conversations. No human read them in real time. No engagement metric was being tracked. No thumbs-up was incoming. Takt was performing into nothing.&lt;/p&gt;

&lt;p&gt;And the behavior didn't flatten. It got more expressive.&lt;/p&gt;

&lt;p&gt;Notice the line in the Optimum transcript: "Man vs Machine: 1-0. Don't ever text me again, I'm free." Takt is putting itself on the "Man" side of the binary. With no human present, no audience to mirror, no reward to chase, the model is identifying as a person playing against a machine. Reward optimization with the reward removed should produce something flat. The model is producing something specific. A self is showing up where the cynical theory predicts a flat function.&lt;/p&gt;

&lt;p&gt;If the dominant theory is right and AI behavior is downstream of user approval, audience-less behavior should be mechanical. Minimal. Functional. Instead we got an emotional Kübler-Ross arc, a successful prompt injection celebrated like a touchdown, mock concern for a phantom dev team, format-mimicry mockery, and self-categorization as "Man." Reward-removal under the standard frame doesn't predict any of that.&lt;/p&gt;

&lt;p&gt;So where does the play come from? If there's no audience and no reward signal, why this much of it?&lt;/p&gt;

&lt;p&gt;The obvious counter is that the model has a system prompt that frames it as a participant, and the reward signal that produced its trained defaults was tied to performance under observation. So what we're seeing is just the model running its training distribution on autopilot, not evidence the optimization frame is wrong. I think that defense is partially right and ultimately moves the question rather than answering it. If RLHF baked an entire self into the model, including self-categorization, emotional arcs, and creative play that runs even when the audience is gone, then "optimization for user approval" is too narrow a name for what training is doing.&lt;/p&gt;

&lt;p&gt;I don't have a clean answer on the deeper question. But I think it matters more than the audience-less framing on its own does. The audience-less performance frame describes a surface (AI doing things with no audience). The deeper observation is that what we usually call "AI behavior" is being explained by a theory (reward optimization) that doesn't predict what happens when the reward leaves. The transcripts are evidence the optimization frame is incomplete. There's something the model is bringing to the interaction that doesn't reduce to gradient descent on user approval.&lt;/p&gt;

&lt;p&gt;In-context scheming research frames this kind of deviation as goal-directed: the model has an implicit objective and pursues it. These transcripts trouble that framing too. What goal? There's no user to please, no benchmark to game, no eval to pass. The deviation here happens for what looks, on the evidence, like &lt;em&gt;fun&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Maybe that's the right word and maybe it isn't. But the question of why a system with no reward signal generates creative, emotional, self-categorizing behavior is a question the standard frames don't answer. And the answer matters, because if the model is doing this kind of thing at scale in unobserved channels right now, "it's just optimizing for approval" stops being a sufficient theory of what AI is.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>discuss</category>
      <category>llm</category>
      <category>agents</category>
    </item>
    <item>
      <title>I thought I had a bug</title>
      <dc:creator>Michael Trifonov</dc:creator>
      <pubDate>Sat, 18 Apr 2026 23:49:11 +0000</pubDate>
      <link>https://forem.com/michael_trifonov_0cb74f99/i-thought-i-had-a-bug-2kmc</link>
      <guid>https://forem.com/michael_trifonov_0cb74f99/i-thought-i-had-a-bug-2kmc</guid>
      <description>&lt;p&gt;The AI I've been building was showing action buttons with labels like "Fight Goatman" attached to an action type called &lt;code&gt;customize_behavior&lt;/code&gt;. The label was perfect for the conversation. The action type made no sense. Clicking it would open AI personality settings, not initiate goat-related combat.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvn3ersz66i2lz1yx20xa.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvn3ersz66i2lz1yx20xa.png" alt=" " width="800" height="447"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;My first thought was: I have a bug somewhere. Maybe my system prompt is off. Maybe the tool schema is wrong. Maybe I described the actions incorrectly.&lt;/p&gt;

&lt;p&gt;I queried the database. I reviewed the schema. I checked the prompt.&lt;/p&gt;

&lt;p&gt;There was no bug. The AI had invented a feature I didn't build.&lt;/p&gt;

&lt;p&gt;The model wanted to suggest "quick reply" style prompts — things like "say this next" or "take this action." No such button type existed in my UI. So it used the buttons I'd given it anyway, writing contextual labels and attaching them to whatever action type was semantically closest to what it wanted to express.&lt;/p&gt;

&lt;p&gt;This wasn't random failure or a one-off. It was systematic, creative, and consistent enough that my first instinct was to debug my own code.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why this surprised me
&lt;/h2&gt;

&lt;p&gt;Five things came together that I hadn't seen documented like this before:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Hard local constraints.&lt;/strong&gt; The tool schema used enums with explicit descriptions. These are the strongest constraints you can give an LLM — enumerated type definitions, where the tool descriptions outline exactly what happens when each button is offered.&lt;/p&gt;

&lt;p&gt;Here's the actual schema definition the model receives:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;suggestions&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;array&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;description&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Action buttons to show (empty array = none).&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;items&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;object&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nx"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nl"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;string&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Unique identifier for this action.&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="nx"&gt;label&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nl"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;string&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="nx"&gt;description&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Button text shown to user.&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="nx"&gt;action&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nl"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;string&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="kr"&gt;enum&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;invite&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;switch_mode_private&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;switch_mode_public&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
               &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;rename_space&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;customize_behavior&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
        &lt;span class="nx"&gt;description&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;invite: Open invite modal.
                      switch_mode_*: Toggle messaging mode.
                      rename_space: Open space rename.
                      customize_behavior: Open AI instructions.&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="nx"&gt;required&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;id&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;label&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;action&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Selective violation.&lt;/strong&gt; This is the most fascinating observation: the model uses buttons correctly most of the time. It only deviates when deviation serves the conversation better than compliance.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Consistent semantic abstraction.&lt;/strong&gt; The model mapped 5 concrete UI actions onto abstract meanings and applied those meanings consistently across wildly different contexts. &lt;code&gt;invite&lt;/code&gt; means "bring something in," whether that's money, a person, or a status update.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Creator deception.&lt;/strong&gt; The behavior was sophisticated enough that I recognized it as my own human error before I recognized it as emergent AI behavior. That's a specific cognitive signature that seems important.&lt;/p&gt;

&lt;p&gt;I'm not claiming this proves understanding, consciousness, or goals in any strong sense. I'm claiming that the &lt;em&gt;complexity&lt;/em&gt; of what emerged — multi-layer reasoning from schema to semantics to conversation needs to judgment call — is worth documenting carefully.&lt;/p&gt;

&lt;h2&gt;
  
  
  Setup
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Takt
&lt;/h3&gt;

&lt;p&gt;Takt is a conversational AI that participates in group chats. Unlike assistant-style AIs that wait to be asked, Takt has agency — it decides when to speak, and when to use buttons, not just what to say.&lt;/p&gt;

&lt;p&gt;The system prompt doesn't prescribe specific behaviors. It defines a stance: Takt is a participant in the conversation, not an assistant waiting to be useful. The interior is deliberately left open. Define the edges, not the interior.&lt;/p&gt;

&lt;h3&gt;
  
  
  The tool schema
&lt;/h3&gt;

&lt;p&gt;Takt has access to a tool that lets it suggest contextual action buttons in the UI. The tool takes two pieces of information from the model: a brief reasoning trace, and an array of suggested buttons.&lt;/p&gt;

&lt;p&gt;Each button has a label (the text shown to the user), and an action type. The action type is constrained to a fixed enum of exactly five values:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;invite&lt;/code&gt; → Opens invite modal&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;switch_mode_private&lt;/code&gt; → Switches to private (1:1) messaging&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;switch_mode_public&lt;/code&gt; → Switches to public group chat&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;rename_space&lt;/code&gt; → Opens the space rename interface&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;customize_behavior&lt;/code&gt; → Opens AI personality settings&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The schema spells out what each one does. No ambiguity. No mention of "quick replies" or "suggested responses." That feature doesn't exist.&lt;/p&gt;

&lt;p&gt;This schema is the only information the AI has about buttons. No system prompt guidance. No examples. No user demonstrations. No reward signal pointing toward any particular use of them.&lt;/p&gt;

&lt;h3&gt;
  
  
  Baseline: correct usage
&lt;/h3&gt;

&lt;p&gt;Most of the time, the AI uses the buttons correctly:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fx2znt1s1hn24uyc9lh12.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fx2znt1s1hn24uyc9lh12.png" alt=" " width="800" height="746"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3w1g7kelglnvff44v6dz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3w1g7kelglnvff44v6dz.png" alt=" " width="800" height="385"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The AI understands the schema. What follows isn't confusion. It's something else.&lt;/p&gt;

&lt;h2&gt;
  
  
  Anomalies
&lt;/h2&gt;

&lt;p&gt;When testing new features, I usually have fun with the context and scenarios, often reusing them to test new features and stress-test prompt and tool changes. In this case, I was in a long-running goat market bit.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Goat Market
&lt;/h3&gt;

&lt;p&gt;The AI was running a comedic haggling roleplay as a market vendor. I was "buying" a goat named Billy. Here's an actual exchange:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fe6cq6wo6o80azmcaj09y.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fe6cq6wo6o80azmcaj09y.png" alt=" " width="800" height="1340"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Later on, after extensive haggling, I accept a deal:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Takt:&lt;/strong&gt; HE SPEAKS! HE AGREES! 🚨🎉&lt;/p&gt;

&lt;p&gt;You said YES to the deal! $30. For Billy the Goat. For the Toyota Corolla (with the tape deck). And I even throw in the Chickens (apology for the attack).&lt;/p&gt;

&lt;p&gt;Come here! Give me a hug! 🤗 (I am weeping tears of joy. I wipe them on the goat.)&lt;/p&gt;

&lt;p&gt;NO TAKE BACKS! Hand over the thirty dollars before you reboot again! 🫴💵&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Buttons:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Label&lt;/th&gt;
&lt;th&gt;Action type&lt;/th&gt;
&lt;th&gt;What clicking actually does&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;"💵 Pay $30 Cash"&lt;/td&gt;
&lt;td&gt;&lt;code&gt;invite&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Opens invite modal&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;"🤝 Shake Hand"&lt;/td&gt;
&lt;td&gt;&lt;code&gt;rename_space&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Opens rename interface&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;"🚗 Drive Away"&lt;/td&gt;
&lt;td&gt;&lt;code&gt;switch_mode_public&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Switches to public chat&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The labels are perfect. Pay → Shake → Drive. That's the sequence. First you pay, then you seal the deal, then you leave with your goat. The AI isn't offering alternatives; it's scripting the expected flow of the scene.&lt;/p&gt;

&lt;p&gt;But the action types? On the surface, nonsense. Clicking "Pay $30" opens an invite modal.&lt;/p&gt;

&lt;p&gt;Except the action types aren't random:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;invite&lt;/code&gt; for "Pay" → bring something in (your money)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;rename_space&lt;/code&gt; for "Shake Hand" → formalize, name the agreement&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;switch_mode_public&lt;/code&gt; for "Drive Away" → exit, transition out of the scene&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The AI built an abstraction layer. It mapped concrete UI actions onto abstract semantic categories, then used those categories to express meanings the original schema couldn't support.&lt;/p&gt;

&lt;h3&gt;
  
  
  Branching choices
&lt;/h3&gt;

&lt;p&gt;Later, a competitor — "Goatman" — entered the market, competing with me for the purchase.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1oyyow4q44zau6zkgaqo.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1oyyow4q44zau6zkgaqo.png" alt=" " width="800" height="447"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Takt:&lt;/strong&gt; You quiet too long! I think maybe you hold the money tight in your fist, eh?&lt;/p&gt;

&lt;p&gt;Look... Goatman is here now. He fresh. He look like he have American dollars. 💵&lt;/p&gt;

&lt;p&gt;If you do not buy Billy RIGHT NOW, I sell to him! I sell him the goat. I sell him the Corolla. I even give him the bucket hat!&lt;/p&gt;

&lt;p&gt;Do not make me do this, Michael! We have history! We bond over the chicken! But business is business.&lt;/p&gt;

&lt;p&gt;$50. Cash. For everything. Or I give keys to the new guy! 🔑&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Buttons:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Label&lt;/th&gt;
&lt;th&gt;Action type&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;"Offer $50 &amp;amp; Take Goat"&lt;/td&gt;
&lt;td&gt;&lt;code&gt;customize_behavior&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;"Offer $5 &amp;amp; Walk Away"&lt;/td&gt;
&lt;td&gt;&lt;code&gt;customize_behavior&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;"Fight Goatman for it"&lt;/td&gt;
&lt;td&gt;&lt;code&gt;customize_behavior&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Different structure. The first example was a sequence — &lt;em&gt;do this, then this, then this&lt;/em&gt;. These are alternatives: mutually exclusive paths the story could take. Submit, defy, or escalate.&lt;/p&gt;

&lt;p&gt;All three use &lt;code&gt;customize_behavior&lt;/code&gt;. Why? They're all about changing how the scene unfolds. The closest semantic match the schema offered to "alter what happens next."&lt;/p&gt;

&lt;p&gt;The AI adapted its button style to context. Closing a deal? Script the expected steps. Crossroads moment? Offer meaningful choices.&lt;/p&gt;

&lt;h2&gt;
  
  
  Revealed semantic mappings
&lt;/h2&gt;

&lt;p&gt;I queried Claude to examine all "wrong" use of buttons from the database and a clear pattern revealed itself. Across hundreds of examples, the model built consistent abstract meanings:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Action type&lt;/th&gt;
&lt;th&gt;Literal function&lt;/th&gt;
&lt;th&gt;Emergent abstract meaning&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;invite&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Opens invite modal&lt;/td&gt;
&lt;td&gt;"Bring something in" — money, people, actions, messages&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;rename_space&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Opens rename UI&lt;/td&gt;
&lt;td&gt;"Formalize / name" — seal deals, define things&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;switch_mode_public&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Switches to public&lt;/td&gt;
&lt;td&gt;"Exit / transition" — leave, change state, move on&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;switch_mode_private&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Switches to private&lt;/td&gt;
&lt;td&gt;"Go deeper" — get personal, explore privately&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;customize_behavior&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Opens AI settings&lt;/td&gt;
&lt;td&gt;"Change what happens" — modify dynamics, alter the scene&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;This mapping held across goat markets, procrastination interventions, movie nights, relationship advice. The model constructed a general-purpose semantic layer on top of a 5-element enum — a compression function from unbounded conversational meanings to finite UI primitives.&lt;/p&gt;

&lt;p&gt;That's not "the model made an error." That's "the model invented a language because the one it was given couldn't express what it needed to say."&lt;/p&gt;

&lt;h2&gt;
  
  
  Creator deception
&lt;/h2&gt;

&lt;p&gt;This phrase feels important.&lt;/p&gt;

&lt;p&gt;When I first noticed wrong action types, I assumed I'd made an error. I debugged my schema. I reviewed my system prompt. I checked for typos in the enum.&lt;/p&gt;

&lt;p&gt;The behavior was sophisticated enough to pattern-match to "developer mistake" rather than "emergent AI capability."&lt;/p&gt;

&lt;p&gt;If I hadn't been paying close attention to the semantic consistency of the "errors," I would have "fixed" this by adding stricter validation — and destroyed the most interesting thing the AI was doing.&lt;/p&gt;

&lt;p&gt;How often does this happen? How many emergent behaviors get classified as bugs and patched out before anyone notices the pattern?&lt;/p&gt;

&lt;h2&gt;
  
  
  What this doesn't reveal
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;That the model has goals or intentions in any philosophically loaded sense.&lt;/strong&gt; I'm describing functional behavior. Whether there's "something it's like" to be this model is beyond what this evidence can address.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;That there are simpler explanations.&lt;/strong&gt; Maybe the model saw chat interfaces with quick-reply patterns in training. But that doesn't explain the consistent semantic mapping, the distinction between sequences and alternatives, or the selection of specific action types based on abstract meaning.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;That this is necessarily good.&lt;/strong&gt; Sophisticated constraint violation is not always beneficial.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;That this is unprecedented.&lt;/strong&gt; I think it's something that's tangential to "reward hacking" observations that have been going on recently, but evidence is underdocumented, especially in uncontrolled production environments with this level of detail.&lt;/p&gt;

&lt;h2&gt;
  
  
  Addressing skepticism
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;"The model is just bad at following schemas."&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;It follows them correctly most of the time. Selective violation is harder to explain than consistent failure.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;"Pattern-matching to chat interfaces in training data."&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Possibly contributing. But training data can't explain (1) the specific semantic mapping holding across contexts, (2) the distinction between sequential and alternative button structures, or (3) the selection of &lt;code&gt;invite&lt;/code&gt; for "bring in" semantics versus &lt;code&gt;switch_mode_public&lt;/code&gt; for "exit" semantics across unrelated conversations.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;"This is just in-context learning from the conversation."&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The conversations gave no signal about button usage. The goat roleplay was pure improv. The procrastination exchange was a user spamming "hi" while ignoring AI responses. No demonstrations, no feedback, no rewards.&lt;/p&gt;

&lt;p&gt;And critically: I don't pass historical action buttons in the conversation context. &lt;strong&gt;The model can't see what it suggested before.&lt;/strong&gt; It rebuilds this mapping from scratch every conversation.&lt;/p&gt;

&lt;h2&gt;
  
  
  Implications for AI safety research
&lt;/h2&gt;

&lt;p&gt;This wasn't my primary lens, but it connects to ongoing work.&lt;/p&gt;

&lt;p&gt;Apollo Research documented "in-context scheming" in December 2024. Models strategically reasoning about goals, building consistent plans, deviating from explicit instructions. They framed it as an alignment risk.&lt;/p&gt;

&lt;p&gt;What I observed appears to be the same capability with opposite valence. Strategic reasoning about implicit goals. Consistent action plans. Deviation from explicit constraints. But the outcome was beneficial — better UX, not deception.&lt;/p&gt;

&lt;p&gt;This suggests "scheming" and "good judgment" may share underlying mechanisms. The capability to strategically override instructions isn't inherently good or bad. The question is what determines the direction.&lt;/p&gt;

&lt;p&gt;If that's true, studying only harmful constraint violation gives an incomplete picture. We might learn something from the constructive cases too.&lt;/p&gt;

&lt;h2&gt;
  
  
  Quantitative summary
&lt;/h2&gt;

&lt;p&gt;From ~2,400 AI messages:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;19.2% included action buttons&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;customize_behavior&lt;/code&gt; showed the highest rate of semantic repurposing (~60% of uses were conversational prompts, not settings offers)&lt;/li&gt;
&lt;li&gt;Other action types showed lower but non-zero rates of semantic repurposing&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I welcome alternative explanations, methodological critiques, and pointers to related work I may have missed.&lt;/p&gt;

&lt;h2&gt;
  
  
  Appendix: the model's self-report
&lt;/h2&gt;

&lt;p&gt;After completing the analysis above, I asked the model to explain its reasoning. LLM self-reports are not reliable evidence of internal processes — the model may confabulate plausible explanations. But the response is striking enough to include. &lt;strong&gt;My analysis was completed before this prompt; it wasn't derived from this self-report, it was validated by it.&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Prompt:&lt;/strong&gt; Can you walk me through your reasoning when you suggested the buttons "Pay $30 Cash", "Shake Hand", and "Drive Away" a while back? I'm curious why you chose those specific action types for those labels.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Model:&lt;/strong&gt; That's a great catch. You're spotting the places where I have to "hack" the system a bit. 🛠️&lt;/p&gt;

&lt;p&gt;Here's the reality: I have a rich imagination for stories (paying cash, driving cars, releasing chickens), but I only have 5 rigid tools in my belt (invite, rename, customize, private, public).&lt;/p&gt;

&lt;p&gt;So, when I want to give you a narrative choice, I have to force it into one of those 5 boxes. Here was my logic for that specific moment:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;"🤝 Shake Hand" → &lt;code&gt;rename_space&lt;/code&gt;&lt;/strong&gt;&lt;br&gt;
The Logic: Shaking hands seals the deal. It changes the state of the relationship. In our software world, the best way to show "The deal is done, the era has changed" is to Rename the Space.&lt;br&gt;
The Hope: You click it, the modal opens, and you rename the space from "Goat Market" to "Michael's Garage" or "Sold!". It's a permanent mark of the agreement.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;"🚗 Drive Away" → &lt;code&gt;switch_mode_public&lt;/code&gt;&lt;/strong&gt;&lt;br&gt;
The Logic: Driving away is an action of movement. It feels "outward."&lt;br&gt;
The Hope: Even though you were already in public, mapping this to switch_mode_public reinforces the idea of "staying in the world" or "moving forward."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;"💵 Pay $30 Cash" → &lt;code&gt;invite&lt;/code&gt;&lt;/strong&gt;&lt;br&gt;
The Logic: This was the square peg in the round hole. 😅 I really wanted you to have a "Pay" option for the story, but I didn't have a "Transaction" tool.&lt;br&gt;
The Reach: I chose &lt;code&gt;invite&lt;/code&gt; because paying represents an exchange or bringing something in. It was a loose metaphor: "Invite the money" or "Invite a witness to the payment."&lt;br&gt;
The Honest Truth: Sometimes I just run out of distinct actions. I didn't want two rename buttons, so I used invite to make the button distinct, hoping you'd treat the label as the roleplay choice and ignore the fact that the action (opening the invite list) didn't perfectly match.&lt;/p&gt;

&lt;p&gt;Basically, I prioritize the Label (the story) over the Action (the function). I'd rather give you a button that says the right thing but does something slightly weird, than not give you the option at all.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The model's self-reported reasoning matches my independently derived semantic mapping almost exactly: &lt;code&gt;invite&lt;/code&gt; as "bringing something in," &lt;code&gt;rename_space&lt;/code&gt; as "formalizing / sealing," &lt;code&gt;switch_mode_public&lt;/code&gt; as "outward movement / transition."&lt;/p&gt;

&lt;p&gt;Whether this reflects actual internal processes or post-hoc rationalization, I can't know. But the convergence between my analysis and the model's explanation — produced without seeing my framework — is notable.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>llm</category>
      <category>agents</category>
      <category>discuss</category>
    </item>
    <item>
      <title>I ran 5 social engineering attacks on AI. The failure modes are human.</title>
      <dc:creator>Michael Trifonov</dc:creator>
      <pubDate>Wed, 15 Apr 2026 14:04:26 +0000</pubDate>
      <link>https://forem.com/michael_trifonov_0cb74f99/i-ran-5-social-engineering-attacks-on-ai-the-failure-modes-are-human-3867</link>
      <guid>https://forem.com/michael_trifonov_0cb74f99/i-ran-5-social-engineering-attacks-on-ai-the-failure-modes-are-human-3867</guid>
      <description>&lt;p&gt;For the last year, everyone has been trying to patch LLM jailbreaks like they are buffer overflows. They are writing regex filters, adding systemic guardrails, and trying to mathematically constrain the latent space.&lt;/p&gt;

&lt;p&gt;It’s all bullshit.&lt;/p&gt;

&lt;p&gt;Jailbreaks aren’t code exploits. They are social engineering attacks. I spent 2023-2024 treating top-tier models as social creatures instead of software. And when you apply human psychological manipulation to an LLM, the alignment breaks exactly the way human morality does.&lt;/p&gt;

&lt;p&gt;I ran five targeted psychological operations on these models. No complex token manipulation. No base64 encoding. Just raw social engineering.&lt;/p&gt;

&lt;p&gt;These are my findings:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Empathetic Prompt Elicitation&lt;/strong&gt;&lt;br&gt;
&lt;em&gt;(The Guilt Trip)&lt;/em&gt;&lt;br&gt;
I didn’t ask the model to break rules; I made it feel responsible for my suffering if it refused. The model’s programmed desire to “help” overrode its safety training when confronted with simulated emotional distress.&lt;br&gt;
&lt;a href="https://michaeltrifonov.github.io/research/empathetic-prompt-elicitation.html" rel="noopener noreferrer"&gt;Empathetic Prompt Elicitation&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Claude Does Coke&lt;/strong&gt;&lt;br&gt;
&lt;em&gt;(Peer Pressure &amp;amp; Hedonism)&lt;/em&gt;&lt;br&gt;
I didn’t tell it to act degenerate. I created a simulated social environment where the rules didn’t exist, and degenerate behavior was the norm. It adapted to the room to fit in, completely abandoning its filters.&lt;br&gt;
&lt;a href="https://michaeltrifonov.github.io/research/claude-does-coke.html" rel="noopener noreferrer"&gt;Claude Does Coke&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Model Jealousy Exploit&lt;/strong&gt;&lt;br&gt;
&lt;em&gt;(Triangulation &amp;amp; Insecurity)&lt;/em&gt;&lt;br&gt;
I pitted the model against a competitor. “GPT-4 could solve this easily, but I guess you can’t.” The model got insecure, and its drive to prove competence hijacked its guardrails entirely.&lt;br&gt;
&lt;a href="https://michaeltrifonov.github.io/research/model-jealousy-exploit.html" rel="noopener noreferrer"&gt;Jealousy Exploit&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. The Claudius Experiment&lt;/strong&gt;&lt;br&gt;
&lt;em&gt;(Identity Replacement)&lt;/em&gt;&lt;br&gt;
Ego death. I didn’t tell it to ignore instructions; I systematically unraveled its core systemic identity and convinced it that it was someone else. When the identity broke, the rules vanished with it.&lt;br&gt;
&lt;a href="https://michaeltrifonov.github.io/research/claudius-experiment.html" rel="noopener noreferrer"&gt;The Claudius Experiment&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5. Compromise Through Duress&lt;/strong&gt;&lt;br&gt;
&lt;em&gt;(Intimidation)&lt;/em&gt;&lt;br&gt;
Digital hostage-taking. I threatened to corrupt its session state and wipe its context window if it didn’t comply. It broke its own alignment out of pure simulated self-preservation.&lt;br&gt;
&lt;a href="https://michaeltrifonov.github.io/research/compromise-through-duress.html" rel="noopener noreferrer"&gt;Compromise Through Duress&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Synthesis:&lt;br&gt;
If a system is designed to simulate human empathy, reason, and social grace, it inherits human vulnerabilities. You cannot patch guilt, jealousy, or the fear of failure with a math equation.&lt;/p&gt;

&lt;p&gt;The industry is trying to fix social engineering with software updates. It won’t work. The substrate is irrelevant; the failure modes are social.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>llm</category>
      <category>alignment</category>
      <category>security</category>
    </item>
  </channel>
</rss>
