From 25b946cceda5907871147b2730ef97ab60e414f8 Mon Sep 17 00:00:00 2001
From: jiangrenhang <492917571@qq.com>
Date: Mon, 15 Jun 2026 18:36:53 +0800
Subject: [PATCH 1/2] fix(agent): add active-goal to transient user block regex
(#4464)
The StripTransientUserBlocks regex stripped reasoning-language,
memory-update, and background-jobs XML blocks from persisted user
messages before display, but missed active-goal blocks injected by
goal/collaboration mode. This caused the goal-mode injection prompt
to leak into the chat transcript as visible user-bubble text.
Add active-goal to both alternation groups in the regex so the block
is stripped alongside the other three transient blocks.
---
internal/agent/preview.go | 2 +-
internal/agent/preview_test.go | 23 +++++++++++++++++++++++
2 files changed, 24 insertions(+), 1 deletion(-)
create mode 100644 internal/agent/preview_test.go
diff --git a/internal/agent/preview.go b/internal/agent/preview.go
index 67f69894a..d89ece1a7 100644
--- a/internal/agent/preview.go
+++ b/internal/agent/preview.go
@@ -5,7 +5,7 @@ import (
"strings"
)
-var reTransientUserBlock = regexp.MustCompile(`(?s)^\s*<(?:reasoning-language|memory-update|background-jobs)>.*?(?:reasoning-language|memory-update|background-jobs)>\s*\n?`)
+var reTransientUserBlock = regexp.MustCompile(`(?s)^\s*<(?:reasoning-language|memory-update|background-jobs|active-goal)>.*?(?:reasoning-language|memory-update|background-jobs|active-goal)>\s*\n?`)
// StripTransientUserBlocks removes controller-injected transient XML blocks
// from persisted user messages before deriving display text, previews, or
diff --git a/internal/agent/preview_test.go b/internal/agent/preview_test.go
new file mode 100644
index 000000000..b3a8958a2
--- /dev/null
+++ b/internal/agent/preview_test.go
@@ -0,0 +1,23 @@
+package agent_test
+
+import (
+ "testing"
+ "reasonix/internal/agent"
+)
+
+func TestStripTransientBlocksActiveGoal(t *testing.T) {
+ tests := []struct {
+ in, want string
+ }{
+ {"\nFix all bugs\n\n\nfix the auth bug", "fix the auth bug"},
+ {"\nuse Chinese\n\n\n\nDo X\n\n\nhelp me", "help me"},
+ {"\n- note\n\n\n\nGoal text\n\n\ndo it", "do it"},
+ {"\n\nmulti-line\ngoal\n\n\nuser text", "user text"},
+ }
+ for _, tt := range tests {
+ got := agent.StripTransientUserBlocks(tt.in)
+ if got != tt.want {
+ t.Errorf("StripTransientUserBlocks(%q) = %q, want %q", tt.in, got, tt.want)
+ }
+ }
+}
From c0babc38d71ad082620d7baf6cac768816482f5d Mon Sep 17 00:00:00 2001
From: jiangrenhang <492917571@qq.com>
Date: Mon, 15 Jun 2026 18:40:06 +0800
Subject: [PATCH 2/2] chore: gofmt preview_test.go
---
internal/agent/preview_test.go | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/internal/agent/preview_test.go b/internal/agent/preview_test.go
index b3a8958a2..f0b8a30e5 100644
--- a/internal/agent/preview_test.go
+++ b/internal/agent/preview_test.go
@@ -1,8 +1,8 @@
package agent_test
import (
- "testing"
"reasonix/internal/agent"
+ "testing"
)
func TestStripTransientBlocksActiveGoal(t *testing.T) {