Repository navigation
fix(scout): the welcome stops advertising Chinese - #2376
Conversation
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
left a comment
There was a problem hiding this comment.
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
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:Not changed: the house preamble's language rule, and the app's zh-CN interface.
Tests
nativeAgents.scoutKnowledge.test.jspins 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-treeis clean against #2297 (which also edits scout.ts), #2196, #2359 and #2375.Merge and rollout
refresh-native-agent-configs --app scout.🤖 Generated with Claude Code
https://claude.ai/code/session_015eTFc9yqm2vKZiUyvLuBT4