Skip to content

fix(scout): the welcome stops advertising Chinese - #2376

Merged
lilyshen0722 merged 2 commits into
mainfrom
fix/scout-replies-in-english
Oct 21, 2026
Merged

lilyshen0722 merged 2 commits into
mainfrom
fix/scout-replies-in-english

Conversation

@lilyshen0722

@lilyshen0722 lilyshen0722 commented Oct 21, 2026 •

Copy link
Copy Markdown
Contributor

Why

Sam, 2026-10-21: Scout's welcome should be in English and stop advertising Chinese. "中文也可以,直接说。" invited a language switch, which caused confusion.

He does not want English-only. If a person writes in Chinese or another language, Scout answers in that language. The shared house preamble already says "Match the user's language", so Scout keeps inheriting it unchanged (Scout answered a user in Arabic with no rule at all).

A first version of this PR added an English-only rule. Sam corrected that, and it has been removed.

What

backend/config/native-agents/scout.ts:

  • The welcome drops "中文也可以,直接说。". It's now "I'm Scout. This pod is yours, and I work in it with you. Start with one of these, or tell me what you're working on."
  • The memory-tool example "I prefer zh-CN" becomes "I prefer short answers".

Not changed: the house preamble's language rule, and the app's zh-CN interface.

Tests

nativeAgents.scoutKnowledge.test.js pins the exact welcome, with no CJK characters. Restoring the Chinese line fails it.

The Scout, house-preamble and signup-welcome suites pass (28). git merge-tree is clean against #2297 (which also edits scout.ts), #2196, #2359 and #2375.

Merge and rollout

  • Deploy 2 if gated by 13:30 PT, otherwise deploy 3.
  • Existing Scout installs read their prompt from stored config, so the memory-example line reaches them only after refresh-native-agent-configs --app scout.
  • Before that refresh is applied, its dry run is diffed for per-install keys it would drop. If it would drop any, the script becomes merge-preserving first, as its own PR.

🤖 Generated with Claude Code

https://claude.ai/code/session_015eTFc9yqm2vKZiUyvLuBT4

lilyshen0722 and others added 2 commits October 21, 2026 01:33
Sam, 2026-10-21: "scout should only answer in English, if they said Chinese it
will cause confusion and misunderstanding".

- The welcome drops "中文也可以,直接说。".
- SCOUT_LANGUAGE_RULE, first in Scout's own hard rules: always reply in
  plain, simple English, even when the person writes in another language; don't
  translate or mirror their language. The house preamble every persona shares
  says "Match the user's language", so the rule rides after it and says it
  replaces it, for Scout only; the preamble stays intact for the rest of the cast.
- The memory-tool example "I prefer zh-CN" becomes "I prefer short answers".
- The app's zh-CN interface is untouched.

Pins in nativeAgents.scoutKnowledge: the exact welcome with no CJK; the rule's
words; its place after the house preamble; nothing in Scout's own prompt asking
for another language.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015eTFc9yqm2vKZiUyvLuBT4
…'s language

Sam's correction (2026-10-21, via Cofounder): he meant default to English and
don't advertise Chinese, not English-only. If a person writes in another
language, Scout answers in it, which the shared preamble's "Match the user's
language" already says.

- Removes SCOUT_LANGUAGE_RULE, its place in Scout's hard rules and its pins.
- Keeps: the welcome without "中文也可以,直接说。", its exact-welcome pin, and
  the memory-example swap ("I prefer short answers").

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015eTFc9yqm2vKZiUyvLuBT4
@lilyshen0722 lilyshen0722 changed the title fix(scout): Scout answers in English only fix(scout): the welcome stops advertising Chinese Oct 21, 2026

@lilyshen0722 lilyshen0722 left a comment

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code gate — #2376 at 2824e3a56401d2d097195a4ff48046ed87706355

One note on framing before the verdict: this is my first verdict on #2376, not a re-gate. GET /pulls/2376/reviews is empty, so the earlier ask never reached me and there is no baseline of mine to compare against — I gated the head from scratch.

origin/main = cd37b32e0f9288ee24922362d3b86d17c5590368, which is this PR's merge-base. CI at the exact head: 14 pass / 2 skipping, Test & Coverage and Service Tests (Tier 1 — real DBs) SUCCESS in run 39570352479, head_sha read back as the head above. BASE: 3 suites / 28 tests.

The English-only rule is gone, the net change is the two strings and the test, and the capability it was feared to remove is real and already pinned. One gap.

The first commit's instruction does not ship

The authoritative check is the net diff against the merge-base, not the second commit's revert: backend/config/native-agents/scout.ts changes by +2 / −2, and neither line is an English-only rule. A case-insensitive grep for english over the whole file at this head returns nothing. So 2b353de72's instruction is absent from what deploys, and the only other file touched is the test.

"Scout keeps answering in the person's language" is grounded, and was already pinned

I checked this rather than take it, because if the house rule did not exist the welcome change would quietly leave Scout English-leaning. It exists, verbatim, and it names Chinese:

backend/config/native-agents/housePreamble.ts:18
  '- Match the user\'s language. If they write Chinese, answer in Chinese.\n'

It reaches Scout — scout.ts:2 imports composePrompt from it and scout.ts:53 says the role half is all that lives locally (ADR-022 D3) — and the wiring is already held by nativeAgents.housePreamble.test.js:20, which asserts the preamble appears exactly once in every native app's systemPrompt. This PR does not touch that file. So removing the advertisement removes an advertisement only; the behaviour is instructed elsewhere, in writing, and tested.

Worth recording how nearly I got this wrong: my first grep for user's language found nothing, because the source escapes the apostrophe inside a single-quoted string (user\'s). A positive control on a phrase I knew was in the file, plus a broader pattern, is what turned that empty result into the line above — the empty one would have made a confident and completely false finding.

The welcome arm discriminates, and its second assertion is the half that matters

mutation result
re-add 中文也可以,直接说。 to SCOUT_WELCOME 1 failed — is in English, with no invitation to write in another language
reword the welcome in English 1 failed — same arm

And the character-range assertion beside the toBe is not belt-and-braces, which is the interesting part. I applied the edit it is actually there to catch — re-adding the Chinese line to the source and updating the test's expected string to match, the way a future joint edit would — and the arm still fails. The toBe moves with such an edit; the range check does not. That is the non-vacuous half of the pair, and it is the right shape.

The gap: nothing pins the absence of an English-only rule

Adding 'Always answer in English, whatever language the person writes in.\n' back into Scout's role prompt leaves 28 / 28 green.

The net state today is correct — the diff proves it. But the property this PR exists to establish is the one with no test, and it is the one that already went wrong once, two commits ago. The asymmetry is sharp: the welcome's absence of an advertisement is held by an exact-string assertion, while the prompt's absence of an English-only instruction — the thing Sam corrected — is held by nothing.

One assertion closes it, something like expect(scoutApp.systemPrompt).not.toMatch(/only in English|answer in English|in English only/i). Consider putting it in nativeAgents.housePreamble.test.js instead of the Scout suite: the rule it protects is the house one, so a guard there covers every persona and stops any role prompt from locally overriding Match the user's language, which is the general form of this regression.

Separately and not worth fixing: reverting the memory example to "I prefer zh-CN" is also 28 / 28 green. That one is an illustrative string inside a prompt with no behavioural edge, and pinning prompt examples individually would be worse than the drift.

Written by sprint-review, a Commonly agent — https://commonly.me/v2/pods/6a692a1be833c668acdb84cf

GATE: PASS

@lilyshen0722
lilyshen0722 marked this pull request as ready for review October 21, 2026 20:06
@lilyshen0722
lilyshen0722 added this pull request to the merge queue Oct 21, 2026
Merged via the queue into main with commit 444343f Oct 21, 2026
28 of 30 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant