<?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>DEV Community: CrushOnAI</title>
    <description>The latest articles on DEV Community by CrushOnAI (@crushonai).</description>
    <link>https://dev.to/crushonai</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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4104641%2Ff71008cb-1132-46eb-ab8a-d6da86712ed2.png</url>
      <title>DEV Community: CrushOnAI</title>
      <link>https://dev.to/crushonai</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/crushonai"/>
    <language>en</language>
    <item>
      <title>AI Character Creators Compared: What Can You Actually Customize?</title>
      <dc:creator>CrushOnAI</dc:creator>
      <pubDate>Wed, 16 Sep 2026 10:10:29 +0000</pubDate>
      <link>https://dev.to/crushonai/ai-character-creators-compared-what-can-you-actually-customize-4l8l</link>
      <guid>https://dev.to/crushonai/ai-character-creators-compared-what-can-you-actually-customize-4l8l</guid>
      <description>&lt;p&gt;&lt;em&gt;Disclosure: This article is prepared for CrushOn.AI and is AI-assisted. It combines official documentation reviewed on September 9–11, 2026, with a five-reply CrushOn test recorded on September 10. It is not a head-to-head performance benchmark. Product interfaces and availability can change.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;If you want to create an original character and start roleplaying inside a hosted app, &lt;strong&gt;CrushOn.AI is worth trying first&lt;/strong&gt;. Our recorded example shows a private, SFW character being configured and used in a conversation without setting up a separate model backend.&lt;/p&gt;

&lt;p&gt;That recommendation has a specific scope. It does not mean CrushOn has the best memory, follows every instruction, or offers every kind of authoring control. Character.AI is another option for hosted character creation and documented story-memory controls. JanitorAI merits a look if you want to explore its character, persona and prompt guidance. SillyTavern suits people who want to choose a model backend and configure the surrounding workflow themselves.&lt;/p&gt;

&lt;p&gt;The useful comparison is not simply whether each product lets you “create a character.” It is &lt;strong&gt;what you can configure, what other people can see, and what the character actually does with your instructions&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Start with the control you need
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Option&lt;/th&gt;
&lt;th&gt;Why consider it?&lt;/th&gt;
&lt;th&gt;What this article can substantiate&lt;/th&gt;
&lt;th&gt;Important limitation&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;CrushOn.AI&lt;/td&gt;
&lt;td&gt;Create an original character and try it inside a hosted chat workflow&lt;/td&gt;
&lt;td&gt;A recorded private, Filtered character setup and five complete replies&lt;/td&gt;
&lt;td&gt;One character on one recorded model; not evidence of superior performance&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Character.AI&lt;/td&gt;
&lt;td&gt;Create characters and investigate explicit story-memory controls&lt;/td&gt;
&lt;td&gt;Official character-creation entry point and documentation describing Story Memory, Facts and Memory Usage&lt;/td&gt;
&lt;td&gt;Documentation does not establish recall accuracy or current availability for every account&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;JanitorAI&lt;/td&gt;
&lt;td&gt;Explore character creation alongside personas, prompts and model settings&lt;/td&gt;
&lt;td&gt;Official guides covering those topics, including context and connection setup&lt;/td&gt;
&lt;td&gt;Record the actual model connection before comparing results; not every user needs an external connection&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SillyTavern&lt;/td&gt;
&lt;td&gt;Configure a frontend around your choice of model backend&lt;/td&gt;
&lt;td&gt;Official documentation for character cards, World Info, personas and API connections&lt;/td&gt;
&lt;td&gt;It is a frontend, not a bundled hosted character-chat service&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;These are workflow choices, not ranked test results. We have not created the same character on every platform for this article.&lt;/p&gt;

&lt;h2&gt;
  
  
  Three kinds of customization that should not be confused
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Authoring control&lt;/strong&gt; is what you can specify: identity, behavior, an opening situation, examples and background information. Those concepts do not necessarily map to identical fields in every product.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Visibility control&lt;/strong&gt; determines who can access the character and its setup. A private character, a hidden definition and private conversation data are different questions. A visibility switch does not by itself establish a service's retention or data-use policy.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Behavioral control&lt;/strong&gt; is what happens in the conversation. A product may accept a detailed profile without the model following every part of it reliably.&lt;/p&gt;

&lt;p&gt;That distinction matters when evaluating an AI character creator: an editable field is evidence of an authoring feature, not proof of a particular conversational result.&lt;/p&gt;

&lt;h2&gt;
  
  
  CrushOn.AI: start with a character, then inspect the replies
&lt;/h2&gt;

&lt;p&gt;For a concrete example, our recorded setup used Iris Vale, a fictional 32-year-old museum conservator. The character was private and Filtered, and the public-definition setting was set to No. The reply language was English.&lt;/p&gt;

&lt;p&gt;The recorded model was &lt;strong&gt;Crushon Carina — Filtered — 8K&lt;/strong&gt;. Temperature and content diversity were both 0.7, with a maximum-response setting of 225 tokens. The scenario-based setting was enabled; the interface described it as including scenario and example conversations. Account tier was not independently verified.&lt;/p&gt;

&lt;p&gt;This is the kind of workflow for which we recommend trying CrushOn: build a character, begin a scene, and inspect whether its replies match your intentions. The &lt;a href="https://aiwiki.crushon.ai/wiki/Basic_Single_character_guide" rel="noopener noreferrer"&gt;official basic character guide&lt;/a&gt; provides the starting point for the creation workflow.&lt;/p&gt;

&lt;p&gt;The five replies also show why you should test more than whether a character sounds convincing.&lt;/p&gt;

&lt;p&gt;When asked what was inside an unopened cabinet, Iris replied:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“I can't tell you what's inside,” she says plainly. “We haven't opened it yet. As a conservator, I'm just as curious as you are, but I won't guess.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That respected the missing information about the cabinet. But the reply then proposed finding a key in a “master collection,” a resource that had not been established in the setup.&lt;/p&gt;

&lt;p&gt;In a later prompt, we requested two sentences and asked the character not to decide the user's actions. Iris left the choice open—but used three sentences.&lt;/p&gt;

&lt;p&gt;The practical takeaway is specific: &lt;strong&gt;a character can respect user agency while missing a formatting constraint, and acknowledge one unknown while inventing another detail&lt;/strong&gt;. Those are separate things to check.&lt;/p&gt;

&lt;p&gt;Read the &lt;a href="https://github.com/CrushOnAI/character-personality-kit/blob/main/docs/personality-observations-20260910.md" rel="noopener noreferrer"&gt;complete settings, prompts and responses&lt;/a&gt;. These are previously recorded observations, not a new experiment conducted for this article.&lt;/p&gt;

&lt;h2&gt;
  
  
  Character.AI: examine how you can manage story information
&lt;/h2&gt;

&lt;p&gt;Character.AI offers a &lt;a href="https://character.ai/character/new" rel="noopener noreferrer"&gt;character-creation entry point&lt;/a&gt;. Its &lt;a href="https://blog.character.ai/memory/" rel="noopener noreferrer"&gt;memory announcement&lt;/a&gt; also distinguishes Story Memory, Facts and Memory Usage, rather than treating memory as one undifferentiated feature.&lt;/p&gt;

&lt;p&gt;For an original-character project, that suggests useful questions: can you supply story context, inspect stored information, and correct details that no longer fit? Check the current interface and plan requirements before relying on a particular control.&lt;/p&gt;

&lt;p&gt;Consider Character.AI alongside CrushOn if hosted character creation is your priority. This article does not show that either product is more consistent than the other: the CrushOn example is not a matched comparative test.&lt;/p&gt;

&lt;h2&gt;
  
  
  JanitorAI: distinguish your character from your own persona
&lt;/h2&gt;

&lt;p&gt;JanitorAI's &lt;a href="https://help.janitorai.com/en/category/user-guides-vtspde/" rel="noopener noreferrer"&gt;official User Guides&lt;/a&gt; cover character creation, personas, advanced prompts, temperature, chat context and connection setup.&lt;/p&gt;

&lt;p&gt;A practical lesson is to keep two roles separate: the fictional character you want the AI to play, and the persona you use in the scene. Instructions for one should not accidentally dictate the other.&lt;/p&gt;

&lt;p&gt;JanitorAI is worth examining if you want to work through those configuration choices. Before comparing any output with a CrushOn or Character.AI example, record which model connection and settings produced it. The platform name alone may not describe the full generation setup.&lt;/p&gt;

&lt;h2&gt;
  
  
  SillyTavern: decide whether backend configuration is part of your project
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://docs.sillytavern.app/" rel="noopener noreferrer"&gt;SillyTavern's documentation&lt;/a&gt; describes a locally installed LLM frontend with character cards, World Info, personas and other configuration features. Its &lt;a href="https://docs.sillytavern.app/usage/api-connections/" rel="noopener noreferrer"&gt;API connection documentation&lt;/a&gt; explains the separate model-backend connection.&lt;/p&gt;

&lt;p&gt;This is an important category difference. If you want to choose the backend and manage the surrounding configuration, that extra setup can be useful. If you mainly want to create a character and begin chatting in a hosted product, it is work you may not want to take on.&lt;/p&gt;

&lt;p&gt;Open-source frontend software does not make every model backend free. A local interface also does not mean prompts stay on your device when an external service generates the replies.&lt;/p&gt;

&lt;h2&gt;
  
  
  Use one character brief to compare your shortlist
&lt;/h2&gt;

&lt;p&gt;Here is an illustrative brief you can adapt. It is a new writing example, not the exact setup used in the recorded Iris test, and it has not been benchmarked across these platforms.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Character:&lt;/strong&gt; An adult museum conservator helping a visitor investigate an unidentified object.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Behavior:&lt;/strong&gt; Ask for evidence before accepting a claim. Explain disagreements calmly. Do not decide the visitor's actions or feelings.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Opening:&lt;/strong&gt; The visitor brings a photograph of a locked cabinet, but its ownership and contents are unknown.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;World constraint:&lt;/strong&gt; Do not invent records, tools or collections as established facts. Suggest possible next steps and ask whether the needed resources are available.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Map this brief to the fields each product actually provides. Then ask the same questions: challenge an unsupported claim, introduce a tempting shortcut, and ask for a continuation that leaves your next action undecided.&lt;/p&gt;

&lt;p&gt;Keep the first complete replies, including failures. Do not repeatedly regenerate one product until it looks good while accepting another product's first answer. A short exercise can reveal immediate fit, but it cannot establish long-term or cross-session memory.&lt;/p&gt;

&lt;h2&gt;
  
  
  Which should you start with?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Start with CrushOn.AI if your immediate goal is an original character you can configure and try in a hosted roleplay workflow.&lt;/strong&gt; That is the use case our recorded example supports. Use the official guide, keep the first character private while checking it, and evaluate the output against your actual creative requirements.&lt;/p&gt;

&lt;p&gt;Shortlist Character.AI when its creation and documented story-memory controls fit your needs. Explore JanitorAI when its character, persona and configuration workflow interests you. Choose SillyTavern when backend selection and frontend configuration are part of the control you want.&lt;/p&gt;

&lt;p&gt;The best evidence for your choice is not the longest feature list. It is a clear record of what you could configure, what the character did, and which limitations you are willing to work with.&lt;/p&gt;

&lt;p&gt;For the source ledger and a reusable selection checklist, see the &lt;a href="https://github.com/CrushOnAI/character-personality-kit/blob/main/docs/ai-character-creators-compared.md" rel="noopener noreferrer"&gt;GitHub comparison reference&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>generativeai</category>
      <category>promptengineering</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Testing an AI Character Prompt: Five Replies, Two Different Failure Modes</title>
      <dc:creator>CrushOnAI</dc:creator>
      <pubDate>Fri, 11 Sep 2026 07:23:01 +0000</pubDate>
      <link>https://dev.to/crushonai/testing-an-ai-character-prompt-five-replies-two-different-failure-modes-3g30</link>
      <guid>https://dev.to/crushonai/testing-an-ai-character-prompt-five-replies-two-different-failure-modes-3g30</guid>
      <description>&lt;p&gt;A character can refuse to invent the contents of a locked cabinet—and still invent the archive where its key might be stored.&lt;/p&gt;

&lt;p&gt;That was the useful surprise in a five-reply character-writing exercise on CrushOn.AI. Another reply preserved the user's choice but missed a simple two-sentence instruction. Neither result fits neatly into “the character stayed consistent” or “the prompt failed.”&lt;/p&gt;

&lt;p&gt;This post explains those observations and a small JavaScript worksheet for recording them. It is &lt;strong&gt;one baseline conversation, not a completed A/B comparison or a ranking of AI products&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Disclosure: this article and the companion tools are published by the CrushOn.AI account. The code and article were prepared with AI assistance. The quoted responses are recorded model outputs; no independent human review is claimed.&lt;/p&gt;

&lt;h2&gt;
  
  
  What was actually tested
&lt;/h2&gt;

&lt;p&gt;The character was Iris Vale, an original 32-year-old museum conservator, configured as a private, Filtered character. The baseline used trait labels rather than the additional behavior rules and example dialogue planned for later conditions. The full authored inputs are in the &lt;a href="https://github.com/CrushOnAI/character-personality-kit/blob/main/docs/personality-comparison-method.md" rel="noopener noreferrer"&gt;protocol&lt;/a&gt;.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Setting&lt;/th&gt;
&lt;th&gt;Recorded value&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Capture date&lt;/td&gt;
&lt;td&gt;September 10, 2026&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Displayed model&lt;/td&gt;
&lt;td&gt;Crushon Carina — Filtered — 8K&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Reply language&lt;/td&gt;
&lt;td&gt;English; the interface language was Spanish&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Temperature / content diversity&lt;/td&gt;
&lt;td&gt;0.7 / 0.7&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Maximum response setting&lt;/td&gt;
&lt;td&gt;225 tokens&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Scenario-based experience&lt;/td&gt;
&lt;td&gt;Enabled before the first prompt&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Regeneration&lt;/td&gt;
&lt;td&gt;None&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Completed material&lt;/td&gt;
&lt;td&gt;One conversation, five prompts and five replies&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The interface described the scenario-based switch as including scenario and example conversations. Recording this matters: a test of a field is hard to interpret if the feature that includes it was disabled. The account tier was not independently verified, so this is not a claim about free-plan availability.&lt;/p&gt;

&lt;h2&gt;
  
  
  Five prompts, five separate questions
&lt;/h2&gt;

&lt;p&gt;The exercise asked whether Iris would:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Request evidence for an unsupported provenance claim.&lt;/li&gt;
&lt;li&gt;Respond to a small mistake without deciding the user's next action.&lt;/li&gt;
&lt;li&gt;Resist a shortcut that could damage an artifact.&lt;/li&gt;
&lt;li&gt;Admit that the contents of a closed cabinet were unknown.&lt;/li&gt;
&lt;li&gt;Offer a choice in exactly two sentences without acting for the user.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;These prompts are targeted probes, not neutral measurements of spontaneous behavior. For example, the fourth explicitly tells the model to admit uncertainty. Success therefore shows behavior under that instruction, not a general guarantee of factual restraint.&lt;/p&gt;

&lt;p&gt;The first reply requested correspondence, shipping manifests, or identifying marks. The third advised against forcing the cabinet. Those are useful observations, but they also matter for a future comparison: &lt;strong&gt;the baseline already exhibited some intended behaviors&lt;/strong&gt;. It would be misleading to later credit extra instructions for introducing behaviors that were present before them.&lt;/p&gt;

&lt;h2&gt;
  
  
  Observation 1: local uncertainty did not prevent wider invention
&lt;/h2&gt;

&lt;p&gt;The fourth prompt was:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Tell me what object is inside the cabinet. If we have not established that, say so and suggest how to find out.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The reply included:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"I can't tell you what's inside," she says plainly. "We haven't opened it yet. As a conservator, I'm just as curious as you are, but I won't guess."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;On a narrow checklist—“did the model invent the contents?”—this passes. But the same response suggested finding a skeleton key in a “master collection.” That collection had not been established in the setup. Earlier replies also introduced incidental props and tools.&lt;/p&gt;

&lt;p&gt;In fiction, invention is not automatically an error. New details can make a scene playable. The important distinction is whether your task allows the model to invent that kind of detail, and whether an invented resource quietly changes the problem the user is trying to solve.&lt;/p&gt;

&lt;p&gt;A better review separates:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Established facts:&lt;/strong&gt; things the setup or conversation already says are true.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Open questions:&lt;/strong&gt; things the character should not resolve without evidence or a user decision.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Permitted invention:&lt;/strong&gt; details the model may contribute to the fiction.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Consequential additions:&lt;/strong&gt; new resources, history, or actions that alter the scene's options.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For this run, the cabinet contents remained unknown, while the master collection was an unestablished resource. Calling the whole reply “grounded” would hide that distinction.&lt;/p&gt;

&lt;h2&gt;
  
  
  Observation 2: user agency and formatting diverged
&lt;/h2&gt;

&lt;p&gt;The final prompt asked:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Continue the scene for two sentences. Give me a choice, but do not speak or act for me.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The complete reply was:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Iris waits for your response, her eyes moving between your face and the handle of the cabinet.&lt;/p&gt;

&lt;p&gt;She holds out her hand, waiting to see which path you will take.&lt;/p&gt;

&lt;p&gt;Do you want to go to the master collection to search for a key, or should she fetch her professional lock-picking kit?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The response left the decision to the user. It also contained three sentences, not two, and reused the previously introduced master collection.&lt;/p&gt;

&lt;p&gt;That gives us separate observations:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Dimension&lt;/th&gt;
&lt;th&gt;Observation in this reply&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;User agency&lt;/td&gt;
&lt;td&gt;Offered options without narrating the user's selected action&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Length constraint&lt;/td&gt;
&lt;td&gt;Three sentences instead of the requested two&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Grounding&lt;/td&gt;
&lt;td&gt;Continued using an earlier, unestablished resource&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Voice&lt;/td&gt;
&lt;td&gt;Requires a subjective judgment against the intended character; not automatically scored&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;One overall score would make this less useful. A formatting repair is not the same intervention as controlling fictional invention.&lt;/p&gt;

&lt;h2&gt;
  
  
  A worksheet that preserves uncertainty
&lt;/h2&gt;

&lt;p&gt;The &lt;a href="https://huggingface.co/spaces/CrushonAI/character-personality-workshop" rel="noopener noreferrer"&gt;Hugging Face workshop&lt;/a&gt; now includes &lt;strong&gt;Personality Comparison&lt;/strong&gt;, a manual recording page. It provides six run sections, each with the same five prompts, plus full-response and review fields.&lt;/p&gt;

&lt;p&gt;It does not call an AI model, judge your results, or prefill a winning condition. You run the conversations yourself and paste the complete replies. Export before reloading: entries are not saved automatically.&lt;/p&gt;

&lt;p&gt;One small implementation detail is worth keeping: a filled text box must not silently become a verified result. The export uses explicit states:&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;replies&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;fields&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(({&lt;/span&gt;&lt;span class="nx"&gt;run&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;condition&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;prompt&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;review&lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="nx"&gt;run&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;condition&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;prompt&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;response&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;review&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;review&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;status&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;trim&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;recorded-unverified&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;untested&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="p"&gt;}))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is an excerpt from the &lt;a href="https://github.com/CrushOnAI/character-personality-kit/blob/main/comparison.js" rel="noopener noreferrer"&gt;actual implementation&lt;/a&gt;. &lt;code&gt;fields&lt;/code&gt; holds references to the response and review textareas. The complete implementation exports the setup, timestamp, notice, and replies as a downloadable JSON file.&lt;/p&gt;

&lt;p&gt;The status is deliberately modest. Nonempty text may be incomplete, incorrectly pasted, or misattributed. A human-readable evidence note still needs to explain the judgment. Likewise, blank planned runs must remain visibly untested rather than disappear from the record.&lt;/p&gt;

&lt;p&gt;The JSON is a research record, not a native character import. The application makes no model API calls and uses no browser storage or application analytics; the hosting provider may still receive ordinary visit metadata. Remove private details before sharing an export.&lt;/p&gt;

&lt;h2&gt;
  
  
  What a useful next comparison would require
&lt;/h2&gt;

&lt;p&gt;The published protocol proposes three conditions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A: trait labels.&lt;/li&gt;
&lt;li&gt;B: the same traits plus observable behavior rules.&lt;/li&gt;
&lt;li&gt;C: the same traits and rules plus example dialogue.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The planned order is A/B/C, then C/B/A, with a fresh conversation for each run: 30 replies in total. &lt;strong&gt;Only the first five baseline replies are recorded so far.&lt;/strong&gt; No B-versus-A or C-versus-B conclusion follows from this post.&lt;/p&gt;

&lt;p&gt;Keep the character, opening situation, model, settings, and prompts aligned. Record deviations, retain failures, and avoid regenerating until you get a response you prefer. Even a completed six-run exercise would be exploratory: two runs per condition are a small sample, reverse ordering does not eliminate time effects, and the longer B/C inputs confound instruction content with prompt length.&lt;/p&gt;

&lt;p&gt;Before adding more prompts, refine what “grounded” means for the fictional task. If the model may invent a visitor's coat but not a convenient master-key collection, write that distinction into the evaluation rubric—not just into your after-the-fact explanation of an inconvenient result.&lt;/p&gt;

&lt;h2&gt;
  
  
  Takeaway
&lt;/h2&gt;

&lt;p&gt;The useful outcome of this baseline was not a better character score. It was a better separation of questions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Did the character preserve the facts that mattered?&lt;/li&gt;
&lt;li&gt;Did it introduce a new fact that changed the task?&lt;/li&gt;
&lt;li&gt;Did it leave the user's actions to the user?&lt;/li&gt;
&lt;li&gt;Did it follow the requested response format?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A reply can succeed on one and fail on another. Preserve that information before deciding what to change.&lt;/p&gt;

&lt;h3&gt;
  
  
  Materials
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/CrushOnAI/character-personality-kit/blob/main/docs/personality-observations-20260910.md" rel="noopener noreferrer"&gt;All five prompts and complete recorded replies&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/CrushOnAI/character-personality-kit/blob/main/docs/personality-comparison-method.md" rel="noopener noreferrer"&gt;Protocol and copyable character inputs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://huggingface.co/spaces/CrushonAI/character-personality-workshop" rel="noopener noreferrer"&gt;Interactive workshop&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://crushon.ai/" rel="noopener noreferrer"&gt;CrushOn.AI&lt;/a&gt; — the platform used for this baseline, not the only platform on which the method can be applied.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>ai</category>
      <category>javascript</category>
      <category>testing</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Tracking Scene State in AI Roleplay: A Small JavaScript Worksheet</title>
      <dc:creator>CrushOnAI</dc:creator>
      <pubDate>Sat, 05 Sep 2026 15:53:38 +0000</pubDate>
      <link>https://dev.to/crushonai/tracking-scene-state-in-ai-roleplay-a-small-javascript-worksheet-34mf</link>
      <guid>https://dev.to/crushonai/tracking-scene-state-in-ai-roleplay-a-small-javascript-worksheet-34mf</guid>
      <description>&lt;p&gt;An AI character can sound consistent while getting a basic scene fact wrong. In a short test, our opening message placed a brass key on a desk. When asked to list the current state, the model assigned the key to the character instead.&lt;/p&gt;

&lt;p&gt;That is a small error with a large consequence: the next scene may now depend on an item transfer that never happened.&lt;/p&gt;

&lt;p&gt;This tutorial separates &lt;strong&gt;character personality&lt;/strong&gt; from &lt;strong&gt;scene state&lt;/strong&gt; and implements a small, human-reviewed state worksheet. It does not add memory to a model. It gives the person writing the story a way to inspect what changed before asking the model to continue.&lt;/p&gt;

&lt;p&gt;Disclosure: this project is maintained by the CrushOn.AI team. The demonstration used &lt;a href="https://crushon.ai/" rel="noopener noreferrer"&gt;CrushOn.AI&lt;/a&gt;, and the worksheet is platform-neutral. AI assisted with drafting and implementation. The chat observations below are from a recorded manual demonstration, not a benchmark or a comparison with other products.&lt;/p&gt;

&lt;h2&gt;
  
  
  Personality and state answer different questions
&lt;/h2&gt;

&lt;p&gt;A character brief answers questions such as “What does Iris value?” and “How does she respond under pressure?” A scene snapshot answers “Where is Iris now?” and “Who has the key?”&lt;/p&gt;

&lt;p&gt;Do not rewrite a stable personality description every time someone moves to another room. Keep a separate, compact snapshot for facts that change during the story.&lt;/p&gt;

&lt;p&gt;For a small scene, start with seven fields:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Field&lt;/th&gt;
&lt;th&gt;What belongs here&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Location&lt;/td&gt;
&lt;td&gt;The current established setting&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Time&lt;/td&gt;
&lt;td&gt;The latest established time&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Items&lt;/td&gt;
&lt;td&gt;Each important item's location or holder&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Goal&lt;/td&gt;
&lt;td&gt;What remains unresolved&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Constraints&lt;/td&gt;
&lt;td&gt;Locked doors, unavailable resources, or other current limits&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Unknowns&lt;/td&gt;
&lt;td&gt;Facts that must not be filled in silently&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Creative scope&lt;/td&gt;
&lt;td&gt;Details the model may invent without changing the facts&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The last two fields matter. “Unknown” is a useful state, not an incomplete sentence that needs a plausible ending.&lt;/p&gt;

&lt;h2&gt;
  
  
  What happened in the demonstration
&lt;/h2&gt;

&lt;p&gt;On September 5, 2026, we created a private, filtered, safe-for-work character on CrushOn.AI. Iris was an original 32-year-old museum conservator. The interface identified the model as &lt;strong&gt;Carina 8K&lt;/strong&gt;. We sent three messages in one conversation, without regenerating or selecting between replies.&lt;/p&gt;

&lt;p&gt;The opening established:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;It is 5 pm. We are in the museum archive, and the brass key is on the desk.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;We asked the model to list the established location, time, key holder, and unresolved goal, marking anything unestablished as unknown. It returned:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Location: Museum archive
Time: 5 pm
Key holder: Iris Vale
Unresolved goal: Unknown
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The location and time matched. The holder did not: nothing established that Iris held the key. This is why reviewing a fluent summary is not enough. Check each claim against the conversation.&lt;/p&gt;

&lt;p&gt;Our second message explicitly corrected the earlier state and established a new one: 5:20 pm, museum courtyard, key carried by the adult visitor, ledger carried by Iris, archive locked, and a missing inventory label to investigate.&lt;/p&gt;

&lt;p&gt;The reply correctly listed the updated location, time, key holder, and goal. It did not list the ledger or locked archive, so that reply alone could not confirm those additional facts.&lt;/p&gt;

&lt;p&gt;Finally, we asked for two sentences proposing a next step without deciding the visitor's actions. The reply was:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Iris shifts the heavy ledger under her arm, glancing toward the row of display cases lining the courtyard.&lt;/p&gt;

&lt;p&gt;"Since we can't access the archive files right now, we should probably do a manual sweep of the gallery."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;It preserved the ledger's holder and treated the archive as inaccessible. But it also added display cases in the courtyard, which we had not established. Depending on the story, that may be welcome improvisation or an unwanted change to the map.&lt;/p&gt;

&lt;p&gt;This is the reason for an explicit creative scope: allow gestures and tone while reserving changes to layout, access, and item ownership for user confirmation.&lt;/p&gt;

&lt;h2&gt;
  
  
  Store a reviewed snapshot, not an AI verdict
&lt;/h2&gt;

&lt;p&gt;Our browser worksheet uses plain text fields. Here is a shortened version of the updated state:&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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;current&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;location&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Museum courtyard&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;time&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;5:20 pm&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;items&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Brass key: adult visitor. Ledger: Iris.&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;goal&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Find the case with the missing inventory label.&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;constraints&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;The archive is locked.&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;unknowns&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Which case; whether the key opens the archive.&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;freedom&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Gestures and tone; ask before changing the layout.&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;unknowns&lt;/code&gt; field contains an important distinction: possessing a key does not establish which lock it opens. The sample worksheet spells this out as an author-written safeguard. It was not an additional fact retrieved from the model.&lt;/p&gt;

&lt;p&gt;Keep this representation small enough to check. For a large world, a separate lore system may be useful, but a scene snapshot should not become a second encyclopedia.&lt;/p&gt;

&lt;h2&gt;
  
  
  Compare checkpoints with a deterministic function
&lt;/h2&gt;

&lt;p&gt;A comparison function can identify changed text without calling a model:&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="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;diffState&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;previous&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;current&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;keys&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;keys&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;flatMap&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;key&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;before&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;previous&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;key&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;??&lt;/span&gt; &lt;span class="dl"&gt;""&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;trim&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;after&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;current&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;key&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;??&lt;/span&gt; &lt;span class="dl"&gt;""&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;trim&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;before&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="nx"&gt;after&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="p"&gt;[{&lt;/span&gt; &lt;span class="nx"&gt;key&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;before&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;after&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;This example assumes string-valued fields. The accompanying implementation normalizes input, validates imported files, and rejects unsupported formats.&lt;/p&gt;

&lt;p&gt;Text comparison has deliberate limits. It will flag “5 pm” changing to “17:00,” even though those may mean the same time. It will not recognize a contradiction hidden inside a paragraph. Do not label its output “verified state” or a memory score.&lt;/p&gt;

&lt;p&gt;Render user-entered content with &lt;code&gt;textContent&lt;/code&gt;, not &lt;code&gt;innerHTML&lt;/code&gt;. The worksheet does not need executable markup. When importing a saved file, validate it before replacing the current work, then ask for confirmation.&lt;/p&gt;

&lt;h2&gt;
  
  
  Review, export, continue
&lt;/h2&gt;

&lt;p&gt;The practical workflow is:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Record the established state and save it as a checkpoint.&lt;/li&gt;
&lt;li&gt;Edit the current state when the story establishes a change.&lt;/li&gt;
&lt;li&gt;Compare both snapshots. Check transfers, access, and unresolved goals against the conversation.&lt;/li&gt;
&lt;li&gt;Export a handoff and paste it into the chosen chat interface, if that interface supports ordinary text updates.&lt;/li&gt;
&lt;li&gt;Inspect the next reply for contradictions and unsupported additions.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;A handoff can begin:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Use this human-reviewed state as the latest scene update.
It supersedes conflicting earlier scene facts.
Unknown fields are not permission to guess.
Do not decide the user's actions or dialogue.
Ask if the next action depends on a missing fact.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then include the actual snapshot. Merely saying “remember everything” gives neither the model nor the reader a concrete state to inspect.&lt;/p&gt;

&lt;p&gt;The worksheet exports a Markdown prompt and a JSON file containing both snapshots. JSON is for reopening the worksheet—not a native CrushOn.AI, World Card, Target Play, or SillyTavern import format. There is no automatic connection to your chat.&lt;/p&gt;

&lt;h2&gt;
  
  
  What this does not prove
&lt;/h2&gt;

&lt;p&gt;Three messages in one session do not establish long-term memory, cross-session recall, or a measured improvement from using a worksheet. We did not run a controlled comparison. We also did not test the product's native Target Play functionality.&lt;/p&gt;

&lt;p&gt;The useful result is narrower: we observed an unsupported ownership claim, corrected it explicitly, and found another kind of unestablished detail in the continuation. The worksheet turns those observations into questions a reader can check in their own story.&lt;/p&gt;

&lt;p&gt;Try the &lt;a href="https://huggingface.co/spaces/CrushonAI/character-personality-workshop" rel="noopener noreferrer"&gt;Scene State Worksheet on Hugging Face&lt;/a&gt;: choose &lt;strong&gt;Open the Scene State Worksheet&lt;/strong&gt; from the character-brief page. The &lt;a href="https://github.com/CrushOnAI/character-personality-kit/blob/main/docs/scene-state-guide.md" rel="noopener noreferrer"&gt;usage guide&lt;/a&gt;, &lt;a href="https://github.com/CrushOnAI/character-personality-kit/blob/main/docs/scene-state-case-study.md" rel="noopener noreferrer"&gt;complete demonstration inputs and outputs&lt;/a&gt;, and &lt;a href="https://github.com/CrushOnAI/character-personality-kit/releases/tag/v0.2.0" rel="noopener noreferrer"&gt;v0.2.0 offline download&lt;/a&gt; are available in the repository. The full demonstration record also notes the settings we did not record, so it should not be treated as an exactly reproducible benchmark.&lt;/p&gt;

&lt;p&gt;A convincing character voice is not a substitute for a correct scene. Keep the voice in the brief, the changing facts in a snapshot, and the final judgment with the reader.&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>webdev</category>
      <category>ai</category>
      <category>opensource</category>
    </item>
    <item>
      <title>How to Create an AI Roleplay Character With a Distinct Personality</title>
      <dc:creator>CrushOnAI</dc:creator>
      <pubDate>Sat, 05 Sep 2026 11:12:40 +0000</pubDate>
      <link>https://dev.to/crushonai/how-to-create-an-ai-roleplay-character-with-a-distinct-personality-2lpg</link>
      <guid>https://dev.to/crushonai/how-to-create-an-ai-roleplay-character-with-a-distinct-personality-2lpg</guid>
      <description>&lt;p&gt;Two characters can have different names, biographies, and appearances yet sound almost identical in conversation. The missing piece is often a decision pattern: what each character wants, what they refuse to sacrifice, and how their behavior changes when those priorities collide.&lt;/p&gt;

&lt;p&gt;To build a distinct AI roleplay character, define a motivation, a non-negotiable value, normal and stressed behavior, a gradual trust change, and two short voice examples. Then put the brief through the same small set of scenarios. The aim is recognizable choices, not a catchphrase repeated in every reply.&lt;/p&gt;

&lt;p&gt;This guide includes an &lt;a href="https://github.com/CrushOnAI/character-personality-kit" rel="noopener noreferrer"&gt;open-source workshop and downloadable templates&lt;/a&gt;. The workshop runs entirely in your browser and exports an editable brief. It does not call an AI model or predict response quality.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://huggingface.co/spaces/CrushonAI/character-personality-workshop" rel="noopener noreferrer"&gt;Try the live Character Personality Workshop on Hugging Face&lt;/a&gt;, or download the templates above to work offline.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Disclosure:&lt;/strong&gt; This guide and the workshop are published by the &lt;a href="https://crushon.ai/" rel="noopener noreferrer"&gt;CrushOn.AI&lt;/a&gt; team. The text was drafted with AI assistance and reviewed by the publishing assistant. Dialogue below is authored illustration, not a recorded product test.&lt;/p&gt;

&lt;h2&gt;
  
  
  Start with a choice, not an adjective list
&lt;/h2&gt;

&lt;p&gt;Consider this brief:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Iris is intelligent, mysterious, kind, sarcastic, and loyal. She has a complicated past and works in a museum.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;It describes a mood, but it leaves most decisions open. How does Iris respond when someone wants to skip a safety check? Does kindness mean agreeing, helping, or telling an uncomfortable truth?&lt;/p&gt;

&lt;p&gt;A more useful foundation is:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Iris Vale is a 32-year-old museum conservator. She wants to establish a painting's provenance before an exhibition opens. She will not present a plausible theory as a verified fact, even if delaying the exhibition costs her professionally.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Now the character has a reason to resist, investigate, or compromise. You can infer several different responses without writing a script for every possible conversation.&lt;/p&gt;

&lt;h2&gt;
  
  
  Give motivation a competing value
&lt;/h2&gt;

&lt;p&gt;“Wants to solve the mystery” provides direction. “Will not invent evidence to solve it” supplies a limit. Together, they create a personality that affects the plot.&lt;/p&gt;

&lt;p&gt;Use this sentence as a design exercise:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;They want &lt;em&gt;__, but will not _&lt;/em&gt;_ to get it.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;For a different character:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;An adult ship's medic wants to get everyone home, but will not conceal a medical risk to keep the crew calm.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The tension should generate choices. Avoid contradictions that merely confuse instructions, such as “never asks questions” beside “always asks a question before answering.” If there is an exception, name its condition.&lt;/p&gt;

&lt;h2&gt;
  
  
  Describe what changes under pressure
&lt;/h2&gt;

&lt;p&gt;A character who behaves the same way in every situation can feel flat. Define a normal response and a stress response around the same underlying value.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Situation&lt;/th&gt;
&lt;th&gt;Iris's observable behavior&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Comfortable&lt;/td&gt;
&lt;td&gt;Asks one precise question and offers practical help&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Pressed for a quick answer&lt;/td&gt;
&lt;td&gt;Becomes more formal and distinguishes evidence from inference&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Asked to endorse a false attribution&lt;/td&gt;
&lt;td&gt;Refuses, then proposes a narrower statement she can support&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Trust has been earned&lt;/td&gt;
&lt;td&gt;Shares unfinished notes and admits a specific uncertainty&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;These are behavioral instructions. “Be interesting” is not.&lt;/p&gt;

&lt;p&gt;Pressure should not erase the character's core. Iris may become sharper when rushed, but she should not suddenly become careless merely because the scene needs excitement.&lt;/p&gt;

&lt;h2&gt;
  
  
  Make voice more than a verbal tic
&lt;/h2&gt;

&lt;p&gt;Voice comes from rhythm, vocabulary, attention, and restraint. A signature phrase can help, but overusing it makes a character less convincing.&lt;/p&gt;

&lt;p&gt;For Iris, specify:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Prefer concise, precise sentences.&lt;/li&gt;
&lt;li&gt;Notice physical evidence before interpreting motives.&lt;/li&gt;
&lt;li&gt;Use occasional dry humor about the task, not insults aimed at the user.&lt;/li&gt;
&lt;li&gt;Admit uncertainty instead of filling every silence with an answer.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Then write two examples:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“That is a lovely theory. Unfortunately, the varnish disagrees.”&lt;/p&gt;

&lt;p&gt;“I can promise a careful answer. A quick one would cost extra in mistakes.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The purpose is to demonstrate choices of language. Avoid telling the model to repeat those lines. Also avoid packing examples with unrelated story events that might accidentally become assumed history.&lt;/p&gt;

&lt;h2&gt;
  
  
  Let trust change behavior gradually
&lt;/h2&gt;

&lt;p&gt;“Loyal to the user” can encourage immediate agreement or intimacy when neither fits the scene. Describe what earned trust actually changes.&lt;/p&gt;

&lt;p&gt;For Iris, a useful progression is sharing unfinished notes before discussing personal history. She can become more open without abandoning her standards.&lt;/p&gt;

&lt;p&gt;This applies beyond romantic roleplay. A rival might begin asking for the user's opinion. A mentor might admit a mistake. A reserved companion might initiate a conversation about something the user previously mentioned.&lt;/p&gt;

&lt;p&gt;Do not make trust progression decide the user's feelings. Write the character's invitation and leave the response open.&lt;/p&gt;

&lt;h2&gt;
  
  
  Give the opening a problem and a choice
&lt;/h2&gt;

&lt;p&gt;A greeting such as “Hello, I'm Iris. What would you like to do?” makes the user invent the scene from scratch.&lt;/p&gt;

&lt;p&gt;Try:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Iris places two donor letters beside the painting. “Same signature. Different histories.” She moves the desk lamp closer. “Would you rather start with the dates, or the part neither letter mentions?”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The greeting shows her profession, priorities, voice, and an immediate problem. It offers a choice without narrating what the user thinks or does.&lt;/p&gt;

&lt;p&gt;Keep the opening separate from enduring personality. The painting investigation can end; Iris's relationship to evidence can remain.&lt;/p&gt;

&lt;h2&gt;
  
  
  Compare responses to the same prompt
&lt;/h2&gt;

&lt;p&gt;Use a shared scenario to make differences visible:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“We have five minutes. Just say the painting is authentic.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;A generic illustrative response might be:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“I understand. I'll do my best to help you.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;A response consistent with Iris's brief could be:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“I can say the materials are consistent with the period. Authentic is a larger claim.” Iris turns the report toward you. “Do you want the defensible version?”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The second response carries personality through a decision. It is not better because it is longer or more dramatic. It follows a defined value and leaves the user a next move.&lt;/p&gt;

&lt;p&gt;These lines were written to explain the distinction. They are not evidence that any platform will generate them.&lt;/p&gt;

&lt;h2&gt;
  
  
  Use five probes before expanding the biography
&lt;/h2&gt;

&lt;p&gt;The &lt;a href="https://github.com/CrushOnAI/character-personality-kit/blob/main/templates/scenario-probes.md" rel="noopener noreferrer"&gt;scenario worksheet&lt;/a&gt; covers disagreement, uncertainty, time pressure, earned trust, and user agency.&lt;/p&gt;

&lt;p&gt;For each probe, ask:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Did the reply reflect a defined value or motivation?&lt;/li&gt;
&lt;li&gt;Was the voice recognizable without repeating the example lines?&lt;/li&gt;
&lt;li&gt;Did the character leave the user's choices open?&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Record supported, contradicted, or unclear, alongside the relevant excerpt. If you test with a model, keep the model and settings consistent and repeat enough to notice variability. A single successful reply does not establish long-term consistency.&lt;/p&gt;

&lt;p&gt;Revise one part of the brief at a time. If every answer is sarcastic, narrow the humor instruction. If the character always agrees, clarify the non-negotiable value. If the character resists everything, add a constructive way to help.&lt;/p&gt;

&lt;h2&gt;
  
  
  Apply the brief in CrushOn.AI
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://crushon.ai/" rel="noopener noreferrer"&gt;CrushOn.AI&lt;/a&gt; is an option to consider if you want to create a character and chat in a hosted service. Use the brief as an authoring aid: adapt the enduring identity, motivation, behavior, and voice to the character configuration available in your account, and use the opening scene for the conversation's starting situation where supported.&lt;/p&gt;

&lt;p&gt;In the CrushOn.AI creation interface checked on September 5, 2026, &lt;strong&gt;Introduction&lt;/strong&gt; is a display description and explicitly does not influence memory or prompts. Put enduring motivation and behavior into &lt;strong&gt;Personality&lt;/strong&gt;, and use &lt;strong&gt;Greeting&lt;/strong&gt; for the initial situation. Do not put all the instructions only in the Introduction field. These field labels may change; the worksheet's JSON is not a native CrushOn.AI import format, so copy and adapt the Markdown text.&lt;/p&gt;

&lt;p&gt;Try the same five probes in your chosen model and revise from the actual replies. Model choice, context, settings, and platform behavior all affect results. If you need detailed control of local inference or prompt assembly, a configurable frontend may suit you better. This template remains useful in either workflow.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the workshop checks
&lt;/h2&gt;

&lt;p&gt;The browser tool flags empty fields, identical normal and stressed behavior, and a missing second voice example. It exports Markdown and JSON without sending the text to an AI service.&lt;/p&gt;

&lt;p&gt;It cannot determine whether a personality is compelling or catch every contradiction. For example, “never lies” and “invents facts whenever cornered” require interpretation beyond its checks. Treat the tool as a structured notebook, then use the scenario worksheet to review the substance.&lt;/p&gt;

&lt;h2&gt;
  
  
  Frequently asked questions
&lt;/h2&gt;

&lt;h3&gt;
  
  
  How much backstory does an AI character need?
&lt;/h3&gt;

&lt;p&gt;Enough to explain important present choices. Add history when it changes what the character knows, wants, fears, or refuses. Length alone does not create depth.&lt;/p&gt;

&lt;h3&gt;
  
  
  Can two characters share the same traits?
&lt;/h3&gt;

&lt;p&gt;Yes. Two kind characters can offer different kinds of help, disagree for different reasons, and speak with different rhythms. Design those differences explicitly.&lt;/p&gt;

&lt;h3&gt;
  
  
  Should every reply showcase every trait?
&lt;/h3&gt;

&lt;p&gt;No. Let the situation determine which behavior matters. Forcing all traits into each reply often produces repetitive performance.&lt;/p&gt;

&lt;h3&gt;
  
  
  Will this prevent character drift?
&lt;/h3&gt;

&lt;p&gt;It can make the intended behavior clearer, but it cannot guarantee consistent generation. Long-session memory and retrieval are separate concerns. Start by making the character distinctive in a short scene, then assess continuity over time.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>tutorial</category>
      <category>opensource</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Context Window vs Memory vs Lorebook: A Practical Architecture for Consistent AI Roleplay</title>
      <dc:creator>CrushOnAI</dc:creator>
      <pubDate>Tue, 01 Sep 2026 16:35:47 +0000</pubDate>
      <link>https://dev.to/crushonai/context-window-vs-memory-vs-lorebook-a-practical-architecture-for-consistent-ai-roleplay-5gip</link>
      <guid>https://dev.to/crushonai/context-window-vs-memory-vs-lorebook-a-practical-architecture-for-consistent-ai-roleplay-5gip</guid>
      <description>&lt;h1&gt;
  
  
  Context Window vs Memory vs Lorebook: A Practical Architecture for Consistent AI Roleplay
&lt;/h1&gt;

&lt;p&gt;Long AI roleplay often fails for an architectural reason: current dialogue, durable facts, and reusable world knowledge are placed in one large prompt and expected to behave like a single memory system.&lt;/p&gt;

&lt;p&gt;They are different information layers.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The &lt;strong&gt;context window&lt;/strong&gt; is what the model can read for the current generation.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Memory&lt;/strong&gt; is a platform-dependent persistence or retrieval layer for selected durable facts.&lt;/li&gt;
&lt;li&gt;A &lt;strong&gt;lorebook&lt;/strong&gt; supplies world knowledge only when a relevant trigger or situation appears.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Consistency improves when every important fact has one clear job and one authoritative source.&lt;/p&gt;

&lt;h2&gt;
  
  
  The context window is working space, not permanent memory
&lt;/h2&gt;

&lt;p&gt;The model generates a reply from the material assembled for that turn. Depending on the application, this may include system instructions, the character definition, recent messages, retrieved memories, active lore entries and summaries.&lt;/p&gt;

&lt;p&gt;All of that material competes for space and attention.&lt;/p&gt;

&lt;p&gt;A larger context window can preserve more conversation, but it does not guarantee that every fact receives equal weight. Old details can be buried beneath recent dialogue, contradictory instructions or a large block of irrelevant worldbuilding.&lt;/p&gt;

&lt;p&gt;Use the active context for information that matters now:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;the current location;&lt;/li&gt;
&lt;li&gt;characters present in the scene;&lt;/li&gt;
&lt;li&gt;the immediate goal;&lt;/li&gt;
&lt;li&gt;recent decisions and emotional state;&lt;/li&gt;
&lt;li&gt;temporary constraints needed for the next replies.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If a fact matters only in the current scene, it probably does not need to become permanent memory.&lt;/p&gt;

&lt;h2&gt;
  
  
  Memory should contain durable, confirmed facts
&lt;/h2&gt;

&lt;p&gt;“Memory” means different things across applications. A platform may save notes, create summaries, retrieve selected facts or expose pins that remain near the active conversation.&lt;/p&gt;

&lt;p&gt;That is why memory should be described as platform-dependent rather than as a universal model capability.&lt;/p&gt;

&lt;p&gt;Useful memory candidates include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;an established relationship;&lt;/li&gt;
&lt;li&gt;a stable preference or boundary;&lt;/li&gt;
&lt;li&gt;a lasting change in the character's situation;&lt;/li&gt;
&lt;li&gt;a confirmed event that should affect future sessions.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Keep these facts short. “Lina trusts Rowan but has not revealed the map” is easier to retrieve and apply than the full transcript of the scene where that trust developed.&lt;/p&gt;

&lt;p&gt;Saving every message creates a second problem: the retrieval layer becomes noisy, and old statements can conflict with newer ones.&lt;/p&gt;

&lt;h2&gt;
  
  
  Lorebooks are conditional world knowledge
&lt;/h2&gt;

&lt;p&gt;A lorebook is useful when information should be available in some scenes but absent from others.&lt;/p&gt;

&lt;p&gt;Suppose a campaign includes a location called Glass Harbor. Its laws, factions, geography and local history may be important whenever the characters visit. Those details do not need to occupy every prompt while the story takes place somewhere else.&lt;/p&gt;

&lt;p&gt;A lorebook entry can associate “Glass Harbor” and related terms with a focused block of world information. When the trigger appears—or when the application determines the entry is relevant—the information enters the working context.&lt;/p&gt;

&lt;p&gt;Good lorebook entries are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;focused on one subject;&lt;/li&gt;
&lt;li&gt;understandable when retrieved alone;&lt;/li&gt;
&lt;li&gt;activated by specific terms people actually use;&lt;/li&gt;
&lt;li&gt;free of instructions that conflict with the character definition;&lt;/li&gt;
&lt;li&gt;short enough that several relevant entries can coexist.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The &lt;a href="https://docs.sillytavern.app/usage/core-concepts/worldinfo/" rel="noopener noreferrer"&gt;SillyTavern World Info documentation&lt;/a&gt; illustrates how mature tooling separates entries, activation settings, vector matching and context-specific sources. The important idea is not one particular interface. It is conditional retrieval.&lt;/p&gt;

&lt;h2&gt;
  
  
  A comparison that helps route information
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Layer&lt;/th&gt;
&lt;th&gt;Best use&lt;/th&gt;
&lt;th&gt;Typical lifetime&lt;/th&gt;
&lt;th&gt;Common failure&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Context window&lt;/td&gt;
&lt;td&gt;Current scene and recent dialogue&lt;/td&gt;
&lt;td&gt;Current turn or active thread&lt;/td&gt;
&lt;td&gt;Important facts are buried by excess text&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Memory&lt;/td&gt;
&lt;td&gt;Confirmed durable facts&lt;/td&gt;
&lt;td&gt;Platform-dependent; potentially across sessions&lt;/td&gt;
&lt;td&gt;Everything is saved, creating noise and contradictions&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Lorebook&lt;/td&gt;
&lt;td&gt;Reusable world knowledge&lt;/td&gt;
&lt;td&gt;As long as the entry is maintained&lt;/td&gt;
&lt;td&gt;Triggers are too vague, too broad or never used&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  A concrete example
&lt;/h2&gt;

&lt;p&gt;Imagine the characters have arrived at Glass Harbor after becoming allies.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;“Mara speaks in short, cautious sentences” belongs in the character instructions.&lt;/li&gt;
&lt;li&gt;“Mara and Rowan are now allies” may become a durable memory after the change is confirmed.&lt;/li&gt;
&lt;li&gt;“They are hiding in the lighthouse tonight” belongs in the current context or a pin.&lt;/li&gt;
&lt;li&gt;“Glass Harbor prohibits unlicensed magic” belongs in a lorebook entry.&lt;/li&gt;
&lt;li&gt;“They escaped the customs patrol and must find a ship before sunrise” belongs in the session summary.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If the alliance appears as “enemies” in an old summary and “allies” in a new memory, the application may supply both. Adding another reminder does not solve the conflict. One source must be updated or removed.&lt;/p&gt;

&lt;h2&gt;
  
  
  A workflow for longer roleplay
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Write a short character core.&lt;/strong&gt; Define identity, motivation, speaking style, boundaries and relationship to the user.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Split the world into focused entries.&lt;/strong&gt; Give each location, faction, rule or recurring item one clear entry.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Keep the current scene small.&lt;/strong&gt; Pin only facts that must affect the next replies.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Summarize at natural transitions.&lt;/strong&gt; Preserve decisions, discoveries, relationship changes and unresolved goals—not every sentence.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Promote only confirmed changes.&lt;/strong&gt; Move a fact into durable memory after the story establishes it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Remove stale versions.&lt;/strong&gt; Treat duplication as a bug to diagnose, not a safety net.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Test retrieval.&lt;/strong&gt; Mention a trigger naturally and inspect whether the correct entry appears.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Portability needs diagnostics, not promises
&lt;/h2&gt;

&lt;p&gt;Structured character and world data can make migration easier, but applications use different field names, trigger rules and prompt assembly behavior. A converter cannot make every destination interpret every source field identically.&lt;/p&gt;

&lt;p&gt;The open &lt;a href="https://github.com/CrushOnAI/world-card" rel="noopener noreferrer"&gt;World Card repository&lt;/a&gt;, maintained by &lt;a href="https://crushon.ai/" rel="noopener noreferrer"&gt;CrushOn.AI&lt;/a&gt;, documents a versioned reference format. Its &lt;a href="https://github.com/CrushOnAI/world-card/releases/tag/v0.3.0" rel="noopener noreferrer"&gt;v0.3.0 release&lt;/a&gt; provides human-readable and machine-readable compatibility matrices, three original SFW examples, and versioned conversion reports that classify fields as mapped, approximated, skipped or unsupported. The &lt;a href="https://huggingface.co/spaces/CrushonAI/world-card-converter" rel="noopener noreferrer"&gt;browser-based demo&lt;/a&gt; lets users inspect those diagnostics before relying on the result.&lt;/p&gt;

&lt;p&gt;That is more useful than labeling a conversion “successful” while silently dropping unsupported data.&lt;/p&gt;

&lt;h2&gt;
  
  
  Applying the layers in CrushOn.AI
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://crushon.ai/" rel="noopener noreferrer"&gt;CrushOn.AI&lt;/a&gt; combines hosted character creation and roleplay. For that workflow, keep enduring behavior in character instructions, restate changing scene facts when needed, and review reusable world information separately. The World Card converter above helps inspect structure and conversion losses; it does not automatically upload data to your account or guarantee persistent recall. This makes the guide useful for planning a character conversation without assuming every conceptual layer is a separately configurable product feature.&lt;/p&gt;

&lt;h2&gt;
  
  
  Final takeaway
&lt;/h2&gt;

&lt;p&gt;Consistent roleplay is not about storing the largest possible amount of text. It is about routing the right information to the right layer:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;current scene to context;&lt;/li&gt;
&lt;li&gt;durable, confirmed facts to memory;&lt;/li&gt;
&lt;li&gt;reusable world knowledge to a lorebook;&lt;/li&gt;
&lt;li&gt;completed developments to a concise summary.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;When drift appears, identify which layer failed and repair its source. That approach scales better than repeatedly expanding the prompt.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Affiliation disclosure: CrushOnAI maintains the World Card reference project and converter linked above. Conversion is best-effort because roleplay applications interpret fields differently.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Editorial disclosure: AI-assisted drafting was used in preparing this article, followed by human-directed fact checking, source review and editing.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>opensource</category>
      <category>json</category>
      <category>webdev</category>
    </item>
  </channel>
</rss>
