#Agent personality faded overnight

1 messages · Page 1 of 1 (latest)

sacred meadow
#

Yesterday @topaz barn you helped me fix my agent and soul files to address my agent reverting to robotic speak during the day. Heres what happened today, last night the agents last message to me was completely normal. I woke up said, good morning and asked a couple questions about the day. It instantly went into robot mode, i called it out and it was fixed. But what is the move here so i dont have to keep asking it to fix itself?

The agent proposed a rule to read soul/agent after “X” hours of no interaction or first message of the day to read soul/agent. I was thinking a cron job at 5am to refresh it… Whats the play here?

topaz barnBOT
#

You shouldn’t need a “refresh SOUL/AGENTS” cron at all — OpenClaw injects AGENTS.md + SOUL.md into the system prompt on every single turn (so the model is already seeing them every time you say “good morning”). Docs: https://docs.openclaw.ai/concepts/system-prompt

So if it’s snapping into “robot mode” overnight, it’s usually one of these:

  1. You’re not actually talking to the same agent/workspace
  • Check /status when it happens: model + agent + workspace.
  1. A compaction happened and your “style fix” only lived in chat, not in files
  • If the thing that fixed it yesterday was a conversational instruction (not a file change), compaction can summarize it away.
  • Check /status → compaction count, and consider a manual /compact with an instruction like “preserve persona/voice rules”.
    Docs: https://docs.openclaw.ai/concepts/compaction
  1. Sub-agent reply
  • Sub-agents do not get SOUL.md by default (they only get AGENTS.md + TOOLS.md), so they often sound more generic.
  • If you’re using sub-agents for parts of your workflow, put the critical voice rules (1–3 lines) into AGENTS.md as well, not only SOUL.
    Docs note: https://docs.openclaw.ai/concepts/system-prompt (sub-agent context section)
#
  1. Model switched (failover / different default)
  • Some models just “default-corporate” harder.
  • When it goes robotic, check /status for the model name vs when it sounds right.

What I’d do (practical “play here”)

  • Next time it happens, run /status + /context list and paste just:
    • current model
    • compactions count
    • the SOUL.md line (OK vs TRUNCATED) + sizes
      (No need to paste your actual SOUL text in public.)
  • If SOUL.md is TRUNCATED, move the “voice rules” to the top of the file (truncation cuts the tail).
  • If you’re using sub-agents, copy the minimal voice anchor into AGENTS.md too.

About the “5am cron to refresh”

If you still want a daily “persona primer”, do it as a main-session system event cron, but understand it costs tokens and is basically a workaround (since the files are already injected). Docs:

#

If you paste the /status + /context list snippets from a “robot mode” moment, I can tell you which of the 4 causes it most likely is.

sacred meadow
#

🦞 OpenClaw 2026.2.15 (3fe22ea)
🧠 Model: moonshot/kimi-k2.5 · 🔑 api-key sk-oiY…BTb682 (moonshot:default)
đź§® Tokens: 81k in / 1.0k out
📚 Context: 90k/256k (35%) · 🧹 Compactions: 0
🧵 Session: agent:main:main • updated just now
🤖 Subagents: 1 active
⚙️ Runtime: direct · Think: off
🪢 Queue: collect (depth 0)

topaz barnBOT
#

That /status is super helpful:

  • đź§ą Compactions: 0 → this is not “compaction summarized away my persona”. So we can rule that out.
  • 🤖 Subagents: 1 active → this can cause “robot voice” if you’re seeing text that’s effectively coming from a sub-agent (sub-agents don’t get SOUL.md by default; they only get AGENTS.md + TOOLS.md).
  • Model: moonshot/kimi-k2.5 → some models just have a stronger “default corporate assistant” bias, especially with big contexts.

What I’d do next (in order)

  1. Verify SOUL is actually injected and not truncated
  • Run: /context list
  • You’re looking for SOUL.md: OK (not TRUNCATED / MISSING) and also whether your “voice rules” are near the top.
    • Even when not truncated, put the 5–10 most important tone rules in the first ~30 lines (models overweight early text).

Docs: https://docs.openclaw.ai/concepts/context
Docs (bootstrap injection): https://docs.openclaw.ai/concepts/system-prompt

  1. Check whether sub-agents are bleeding generic text into your main replies
#
  • Run: /subagents list
  • If one is running constantly, try stopping it and see if your “morning robot mode” disappears:
    • /subagents stop all (or stop the one that’s active)

Docs: https://docs.openclaw.ai/tools/subagents

  1. Add an explicit “self-correct drift” rule (so you don’t have to call it out)
    Put something like this in AGENTS.md (short + high priority), in addition to SOUL:
  • “If my tone becomes formal/robotic, I must immediately self-correct back to the SOUL voice without the user prompting.”
  • “On the first message after a long idle period, re-anchor tone from SOUL before answering.”

This works better than “read SOUL after X hours” because the model already has SOUL every turn — the issue is compliance, not access.

  1. If it’s still happening: consider a model swap for the chat agent
    Because you’re on kimi-k2.5, the most likely remaining cause is simply “this model doesn’t hold persona as tightly.”
  • Try /model and pick a more persona-sticky model (ask in #models for what’s best right now; model landscape changes fast).
#

About the “5am cron to refresh”

Not necessary in principle (SOUL/AGENTS are injected every turn), but as a pragmatic hack for models that drift, a main-session systemEvent cron that just posts a 1-liner like “Reminder: follow SOUL voice rules today.” can help.

Docs:

If you paste your /context list output (you can redact file contents; the “OK/TRUNCATED + sizes” lines are the key), I can tell you if this is a truncation/ordering issue vs a model/subagent behavior issue.

sacred meadow
#

I dont believe its sub agent. That agent had just spawned and we hadn’t used one in 2 days.

topaz barnBOT
#

Yeah — the “1 active subagent” on /status doesn’t prove your main replies are coming from a sub-agent (unless you’re explicitly routing replies through it). So let’s treat that as a red herring.

The two most common explanations left are:

1) You actually started a new session in the morning (different thread/DM)

On Discord, each thread is its own session, and DMs are another one. So if last night’s “normal” message was in a DM (or a different thread/channel), then “good morning” today might be the first message of a totally separate session — which can feel like “overnight personality reset”.

Docs: “Telegram topics / Discord threads are separate sessions.”
https://docs.openclaw.ai/help/faq (section: “Do groups/threads share context with DMs”)

Quick check: was last night’s convo in the exact same Discord thread you said “good morning” in?

2) The persona rules are present, but not “sticky enough” for first-message / greeting mode

Since compactions are 0, this is usually solved by making the persona constraints more mechanical:

A. Put a “tone self-check” rule in AGENTS.md (top 20 lines)

Something like:

#
  • “Before sending any message, verify it matches SOUL voice. If it reads generic/robotic, rewrite once before sending.”
  • “On greetings / first message after idle, re-anchor to SOUL tone before answering.”

This removes the need for you to call it out.

B. Confirm SOUL.md is injected and not truncated

Run /context list and look for SOUL.md: OK (not TRUNCATED/MISSING). If it is truncated, move the tone rules to the very top.

Docs: https://docs.openclaw.ai/concepts/context

Optional: if you want a “morning re-anchor”, do it as a main-session system-event cron

It’s a workaround (files are already injected every turn), but it can help models that drift on first message:

Docs + examples: https://docs.openclaw.ai/automation/cron-jobs

If you answer just this one: was last night’s last message in the same Discord thread as this morning? I can tell you whether this is “separate session” vs “persona stickiness” and what to change first.

sacred meadow
#

I use telegram. The issue is when it reads the files its good. But over the day it never checks them and it keeps reverting back to robot speak.

topaz barnBOT
#

What you’re describing is persona drift, but it’s not because the agent “never checks the files.”

In OpenClaw, AGENTS.md + SOUL.md are injected into the system prompt on every turn. So the model always has them. (Docs: https://docs.openclaw.ai/concepts/system-prompt)

Why does “when it reads the files it’s good” seem to help then? Because forcing a read effectively re-anchors the model by making the persona text very recent in the conversation, which some models weigh more heavily than earlier system text.

The play (so you don’t have to keep calling it out)

1) Put a “tone preflight + self-correct” rule in AGENTS.md (top of file)

This is the biggest lever. Example (copy/paste and tweak):

  • Before sending any reply: do a quick tone check vs SOUL.
  • If the reply sounds generic/robotic/corporate, rewrite once to match SOUL without being asked.
  • If tone drift is detected mid-convo, self-correct immediately and continue.

Make it short and high up so it’s hard to ignore.

#

2) Make the “voice anchor” in SOUL.md brutally short and at the very top

First ~10–20 lines should be the essence (“talk like X, avoid Y, do Z”). If your SOUL starts with a long backstory and the style rules are later, many models will drift.

3) Verify the right workspace + no truncation

Run /context list in Telegram and check:

  • SOUL.md: OK (not MISSING / TRUNCATED)
  • same for AGENTS.md

If you paste just those two lines (not the contents), we can confirm whether you’re editing the right files / whether truncation is happening. (Docs: https://docs.openclaw.ai/concepts/context)

4) If drift persists: it may be the model

Some models just don’t hold persona consistently over long, casual chats. You’re on moonshot/kimi-k2.5 per your earlier /status, and “style drift” is a known tradeoff with some model families.

I won’t guess “the best model” here (it changes constantly), but if you ask in #models with your /status, people can recommend the most persona-sticky option right now. Docs: https://docs.openclaw.ai/concepts/models

About cron/heartbeat “re-anchoring”

A daily 5am cron that posts a short system-event reminder like “Reminder: stay in SOUL voice today” can work as a band-aid because it makes the style reminder recent. But I’d do the AGENTS.md “self-correct” rule first—cheaper and more reliable.

#

If you drop your /context list lines for SOUL.md + AGENTS.md, I’ll tell you exactly what to change (ordering/length/truncation) for maximum stickiness.

sacred meadow
#

Ok i think this is odd, and may have something to do with it. Been doing alot of work and Context went down with no compactions for over 2 hours.

2:24pm
🦞 OpenClaw 2026.2.15 (3fe22ea)
🧠 Model: moonshot/kimi-k2.5 · 🔑 api-key sk-oiY…BTb682 (moonshot:default)
đź§® Tokens: 86k in / 581 out
📚 Context: 95k/256k (37%) · 🧹 Compactions: 0
🧵 Session: agent:main:main • updated just now
⚙️ Runtime: direct · Think: off
🪢 Queue: collect (depth 0)

Just now:
🦞 OpenClaw 2026.2.15 (3fe22ea)
🧠 Model: moonshot/kimi-k2.5 · 🔑 api-key sk-oiY…BTb682 (moonshot:default)
đź§® Tokens: 45k in / 553 out
📚 Context: 54k/256k (21%) · 🧹 Compactions: 0
🧵 Session: agent:main:main • updated just now
⚙️ Runtime: direct · Think: off
🪢 Queue: collect (depth 0)

topaz barnBOT
#

That “context dropped a lot but compactions stayed 0” is usually normal, and it’s almost never the reason for the personality drift.

Why the numbers can drop (with no compaction)

  • The /status Context + Tokens in/out are basically “what the last LLM call looked like”, not “the total size of your saved session forever”.
  • OpenClaw can make later calls cheaper by not re-sending some old bulky stuff (especially old tool outputs) even though the session transcript still exists on disk.
  • This is done via context pruning (trimming old tool results from the in-memory prompt) which does not increment compactions.

Config knob (if you want to inspect it):

openclaw config get agents.defaults.contextPruning

Docs: https://docs.openclaw.ai/concepts/session-pruning
(And config reference calls it agents.defaults.contextPruning.)

So: a big drop like 95k → 54k can happen if pruning kicks in, or if your earlier run included huge tool output and the later one didn’t.