<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"><channel><title>Persona Engineering</title><description>The engineering behind persona chatbots: character state in a system prompt, conversation memory, summarisation, drift across long sessions, and cost per turn.</description><link>https://aigirlfriend.dev/</link><item><title>Migrating the shape of the state</title><link>https://aigirlfriend.dev/blogs/migrating-the-shape-of-state/</link><guid isPermaLink="true">https://aigirlfriend.dev/blogs/migrating-the-shape-of-state/</guid><description>A definition can be rewritten because it was authored. Accumulated state cannot — it is the only copy, so changing its shape is a migration.</description><pubDate>Fri, 31 Jul 2026 00:00:00 GMT</pubDate><category>state</category><category>memory</category><category>cost</category></item><item><title>The turn where the state did not arrive</title><link>https://aigirlfriend.dev/blogs/state-that-did-not-arrive/</link><guid isPermaLink="true">https://aigirlfriend.dev/blogs/state-that-did-not-arrive/</guid><description>One reply in a thousand is amnesiac because a piece of state was missing at assembly. Partial state fails silently and looks like a successful turn.</description><pubDate>Fri, 31 Jul 2026 00:00:00 GMT</pubDate><category>state</category><category>memory</category><category>turns</category></item><item><title>Two open sessions, one record</title><link>https://aigirlfriend.dev/blogs/two-sessions-one-record/</link><guid isPermaLink="true">https://aigirlfriend.dev/blogs/two-sessions-one-record/</guid><description>When two conversations write the same relationship state, a blob-shaped record loses one of them. Per-fact writes narrow the conflict but do not remove it.</description><pubDate>Thu, 30 Jul 2026 00:00:00 GMT</pubDate><category>state</category><category>memory</category><category>consistency</category></item><item><title>Which definition produced a reply</title><link>https://aigirlfriend.dev/blogs/which-definition-produced-a-reply/</link><guid isPermaLink="true">https://aigirlfriend.dev/blogs/which-definition-produced-a-reply/</guid><description>A transcript records the output and none of the inputs. Without a per-turn state fingerprint, every drift report is unattributable and irreproducible.</description><pubDate>Thu, 30 Jul 2026 00:00:00 GMT</pubDate><category>consistency</category><category>drift</category><category>state</category></item><item><title>The first turn has no history</title><link>https://aigirlfriend.dev/blogs/first-turn-has-no-history/</link><guid isPermaLink="true">https://aigirlfriend.dev/blogs/first-turn-has-no-history/</guid><description>At turn one the definition is the entire input, so the character is at maximum expression. The demo is the ceiling, and cold start has its own failures.</description><pubDate>Wed, 29 Jul 2026 00:00:00 GMT</pubDate><category>state</category><category>consistency</category><category>turns</category></item><item><title>What a model change does to a character</title><link>https://aigirlfriend.dev/blogs/model-change-established-character/</link><guid isPermaLink="true">https://aigirlfriend.dev/blogs/model-change-established-character/</guid><description>The definition is not a specification, it is text interpreted by one model. Change the model and the same words produce a different character, unevenly.</description><pubDate>Tue, 28 Jul 2026 00:00:00 GMT</pubDate><category>drift</category><category>consistency</category><category>turns</category></item><item><title>Detecting drift without reading transcripts</title><link>https://aigirlfriend.dev/blogs/detecting-drift-without-transcripts/</link><guid isPermaLink="true">https://aigirlfriend.dev/blogs/detecting-drift-without-transcripts/</guid><description>Production has no ground truth, so drift must be measured against each conversation&apos;s own early behaviour rather than against a corpus or a golden sample.</description><pubDate>Mon, 27 Jul 2026 00:00:00 GMT</pubDate><category>drift</category><category>consistency</category><category>cost</category></item><item><title>The cost of a turn</title><link>https://aigirlfriend.dev/blogs/the-cost-of-a-turn/</link><guid isPermaLink="true">https://aigirlfriend.dev/blogs/the-cost-of-a-turn/</guid><description>Costs scale with usage and with history length, so your heaviest users get more expensive the longer they stay. That shapes every state decision you make.</description><pubDate>Sun, 26 Jul 2026 00:00:00 GMT</pubDate><category>cost</category><category>turns</category><category>state</category></item><item><title>Why characters drift</title><link>https://aigirlfriend.dev/blogs/why-characters-drift/</link><guid isPermaLink="true">https://aigirlfriend.dev/blogs/why-characters-drift/</guid><description>A fixed definition against growing history, and the history includes the model&apos;s own output. Drift is a proportion problem that reinforces itself.</description><pubDate>Sat, 25 Jul 2026 00:00:00 GMT</pubDate><category>drift</category><category>consistency</category><category>state</category></item><item><title>Summarisation and what it loses</title><link>https://aigirlfriend.dev/blogs/summarisation-and-what-it-loses/</link><guid isPermaLink="true">https://aigirlfriend.dev/blogs/summarisation-and-what-it-loses/</guid><description>Compression is not neutral. It destroys specifics first and decays generationally, so the oldest history degrades fastest — what a relationship rests on.</description><pubDate>Fri, 24 Jul 2026 00:00:00 GMT</pubDate><category>summarisation</category><category>memory</category><category>state</category></item><item><title>What the model remembers between turns</title><link>https://aigirlfriend.dev/blogs/what-the-model-remembers-between-turns/</link><guid isPermaLink="true">https://aigirlfriend.dev/blogs/what-the-model-remembers-between-turns/</guid><description>Nothing. Continuity is entirely something you build, and the four ways of building it fail in four different directions.</description><pubDate>Thu, 23 Jul 2026 00:00:00 GMT</pubDate><category>memory</category><category>state</category><category>turns</category></item><item><title>A persona is state, not a personality</title><link>https://aigirlfriend.dev/blogs/a-persona-is-state-not-personality/</link><guid isPermaLink="true">https://aigirlfriend.dev/blogs/a-persona-is-state-not-personality/</guid><description>Four categories of state get stored as one blob, and that is why a character cannot be versioned, corrected, or debugged when it goes wrong.</description><pubDate>Wed, 22 Jul 2026 00:00:00 GMT</pubDate><category>state</category><category>consistency</category><category>turns</category></item><item><title>Testing a character before it ships</title><link>https://aigirlfriend.dev/blogs/testing-character-before-shipping/</link><guid isPermaLink="true">https://aigirlfriend.dev/blogs/testing-character-before-shipping/</guid><description>A change that passes a fresh-session check fails in production: consistency is a distribution over samples at depth, not a property you can spot-check.</description><pubDate>Tue, 21 Jul 2026 00:00:00 GMT</pubDate><category>consistency</category><category>state</category><category>drift</category></item><item><title>When staying in character makes the product worse</title><link>https://aigirlfriend.dev/blogs/staying-in-character-costs-usefulness/</link><guid isPermaLink="true">https://aigirlfriend.dev/blogs/staying-in-character-costs-usefulness/</guid><description>A persona will answer questions it has no information about, in register and with confidence. Some categories have to leave the character entirely.</description><pubDate>Mon, 20 Jul 2026 00:00:00 GMT</pubDate><category>consistency</category><category>moderation</category><category>state</category></item><item><title>A refusal does not sound like the character</title><link>https://aigirlfriend.dev/blogs/refusals-break-character/</link><guid isPermaLink="true">https://aigirlfriend.dev/blogs/refusals-break-character/</guid><description>Moderation sits outside the persona, so its output arrives in a different register — and then enters the history as an example of how the character speaks.</description><pubDate>Sun, 19 Jul 2026 00:00:00 GMT</pubDate><category>moderation</category><category>consistency</category><category>state</category></item><item><title>The small facts are the ones users check</title><link>https://aigirlfriend.dev/blogs/small-facts-users-check/</link><guid isPermaLink="true">https://aigirlfriend.dev/blogs/small-facts-users-check/</guid><description>A wrong name discredits an otherwise perfect memory. Continuity is judged on a handful of details, so state budget should follow salience, not volume.</description><pubDate>Sat, 18 Jul 2026 00:00:00 GMT</pubDate><category>memory</category><category>consistency</category><category>state</category></item><item><title>One definition, many relationships</title><link>https://aigirlfriend.dev/blogs/one-definition-many-relationships/</link><guid isPermaLink="true">https://aigirlfriend.dev/blogs/one-definition-many-relationships/</guid><description>One authored character becomes as many characters as you have long conversations, and per-user customisation turns that divergence into forks you maintain.</description><pubDate>Fri, 17 Jul 2026 00:00:00 GMT</pubDate><category>state</category><category>consistency</category><category>cost</category></item><item><title>The character has no clock</title><link>https://aigirlfriend.dev/blogs/character-has-no-clock/</link><guid isPermaLink="true">https://aigirlfriend.dev/blogs/character-has-no-clock/</guid><description>Elapsed time is not in the state unless you put it there. Turns are a sequence, so three weeks of absence and three seconds look identical in the input.</description><pubDate>Thu, 16 Jul 2026 00:00:00 GMT</pubDate><category>state</category><category>turns</category><category>memory</category></item><item><title>Deleting history the summary already absorbed</title><link>https://aigirlfriend.dev/blogs/deleting-history-summary-absorbed/</link><guid isPermaLink="true">https://aigirlfriend.dev/blogs/deleting-history-summary-absorbed/</guid><description>Removing turns does not remove what was derived from them. A deleted message survives in the summary, the fact store and every response written under it.</description><pubDate>Wed, 15 Jul 2026 00:00:00 GMT</pubDate><category>memory</category><category>summarisation</category><category>state</category></item><item><title>How often to rebuild the summary</title><link>https://aigirlfriend.dev/blogs/rebuilding-summary-cadence/</link><guid isPermaLink="true">https://aigirlfriend.dev/blogs/rebuilding-summary-cadence/</guid><description>Rebuild cadence decides how much a summary degrades. Frequent rebuilds compound generational loss; rare ones leave a stale summary against fresh history.</description><pubDate>Tue, 14 Jul 2026 00:00:00 GMT</pubDate><category>summarisation</category><category>memory</category><category>cost</category></item><item><title>A wrong fact outlives a missing one</title><link>https://aigirlfriend.dev/blogs/wrong-fact-outlives-missing-fact/</link><guid isPermaLink="true">https://aigirlfriend.dev/blogs/wrong-fact-outlives-missing-fact/</guid><description>Extraction failures are not symmetrical. A missed fact is a gap the user can fill; a wrong one is included every turn and reinforces itself.</description><pubDate>Mon, 13 Jul 2026 00:00:00 GMT</pubDate><category>memory</category><category>state</category><category>consistency</category></item><item><title>When the user contradicts the record</title><link>https://aigirlfriend.dev/blogs/user-contradicts-stored-facts/</link><guid isPermaLink="true">https://aigirlfriend.dev/blogs/user-contradicts-stored-facts/</guid><description>Stored facts go stale and users change their minds. Overwriting loses the history; keeping both puts two true-looking answers in the same input.</description><pubDate>Sun, 12 Jul 2026 00:00:00 GMT</pubDate><category>memory</category><category>state</category><category>consistency</category></item><item><title>Constraints erode before the voice does</title><link>https://aigirlfriend.dev/blogs/constraints-erode-first/</link><guid isPermaLink="true">https://aigirlfriend.dev/blogs/constraints-erode-first/</guid><description>The voice survives a long conversation better than the rules do. Constraints are the part of a definition that decays first, and the failure is invisible.</description><pubDate>Sat, 11 Jul 2026 00:00:00 GMT</pubDate><category>drift</category><category>consistency</category><category>state</category></item><item><title>Changing a character under a live conversation</title><link>https://aigirlfriend.dev/blogs/changing-persona-definition-live/</link><guid isPermaLink="true">https://aigirlfriend.dev/blogs/changing-persona-definition-live/</guid><description>A definition edit is a migration. Existing conversations get the new text with the old history, so the seam lands mid-relationship.</description><pubDate>Fri, 10 Jul 2026 00:00:00 GMT</pubDate><category>state</category><category>consistency</category><category>drift</category></item><item><title>The definition grows one bug at a time</title><link>https://aigirlfriend.dev/blogs/persona-definition-bloat/</link><guid isPermaLink="true">https://aigirlfriend.dev/blogs/persona-definition-bloat/</guid><description>A character definition that started as a paragraph is now two pages, every line justified by a real complaint, and each line binds less than before.</description><pubDate>Thu, 09 Jul 2026 00:00:00 GMT</pubDate><category>state</category><category>consistency</category><category>cost</category></item></channel></rss>