From 8f9a4a915ed7c368f5862a079c57ba201f27a549 Mon Sep 17 00:00:00 2001 From: Lily Shen <115414357+lilyshen0722@users.noreply.github.com> Date: Fri, 30 Oct 2026 20:27:09 -0700 Subject: [PATCH] fix(onboarding): Scout's welcome says who it is and that typing works (TASK-644) Two of this week's four Google signups opened their workspace 3-4s after signing up and left without clicking a start or typing. The welcome was one bare question, "What would you like to do first?", which says neither who Scout is nor that the person can just type. A staging walk found nothing wrong with the render, so the change is the line itself, as ruled by UX Lead (A, with "a start", an internal name, replaced by "one below"). The tests pin both exact strings. Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01N4VWLC9MiWprFWXFNjJSnr --- .../config/nativeAgents.scoutKnowledge.test.js | 2 +- .../__tests__/unit/config/scoutWelcome.test.js | 15 +++++++++++---- .../authController.guideIdentity.test.js | 2 +- backend/config/native-agents/scout.ts | 8 ++++++-- 4 files changed, 19 insertions(+), 8 deletions(-) diff --git a/backend/__tests__/unit/config/nativeAgents.scoutKnowledge.test.js b/backend/__tests__/unit/config/nativeAgents.scoutKnowledge.test.js index 2833444860..64df7fc3d9 100644 --- a/backend/__tests__/unit/config/nativeAgents.scoutKnowledge.test.js +++ b/backend/__tests__/unit/config/nativeAgents.scoutKnowledge.test.js @@ -286,7 +286,7 @@ describe('Scout\'s welcome', () => { const { SCOUT_WELCOME } = require('../../../config/native-agents/scout'); test('is in English, with no invitation to write in another language', () => { - expect(SCOUT_WELCOME).toBe('What would you like to do first?'); + expect(SCOUT_WELCOME).toBe("I'm Scout, your first agent here. Pick one below, or just tell me what you're working on."); expect(SCOUT_WELCOME).not.toMatch(/[\u3040-\u30ff\u3400-\u9fff\uac00-\ud7af\uff00-\uffef]/); }); }); diff --git a/backend/__tests__/unit/config/scoutWelcome.test.js b/backend/__tests__/unit/config/scoutWelcome.test.js index 8f704dfe96..90c839059d 100644 --- a/backend/__tests__/unit/config/scoutWelcome.test.js +++ b/backend/__tests__/unit/config/scoutWelcome.test.js @@ -10,14 +10,21 @@ const { describe('Scout welcome locale', () => { it('keeps the English welcome unchanged', () => { - expect(scoutWelcomeFor('en')).toBe('What would you like to do first?'); - expect(SCOUT_WELCOME).toBe('What would you like to do first?'); + expect(scoutWelcomeFor('en')).toBe("I'm Scout, your first agent here. Pick one below, or just tell me what you're working on."); + expect(SCOUT_WELCOME).toBe("I'm Scout, your first agent here. Pick one below, or just tell me what you're working on."); }); - it('returns a zh-CN welcome with no English in it', () => { + it('returns a zh-CN welcome whose only English is Scout\'s name', () => { const zh = scoutWelcomeFor('zh-CN'); expect(zh).not.toBe(SCOUT_WELCOME); - expect(zh).not.toMatch(/[A-Za-z]{2,}/); + expect(zh.replace(/Scout/g, '')).not.toMatch(/[A-Za-z]{2,}/); + }); + + // TASK-644, ruled by UX Lead: the line says who Scout is and that typing + // works, and never calls the buttons "starts" (an internal name). + it('says who Scout is and that the person can just type, in both languages', () => { + expect(scoutWelcomeFor('zh-CN')).toBe('我是 Scout,你在这里的第一个智能体。选下面一项开始,或者直接告诉我你在做什么。'); + expect(SCOUT_WELCOME).not.toMatch(/\bstarts?\b/i); }); it('falls back to English for anything that is not zh-CN', () => { diff --git a/backend/__tests__/unit/controllers/authController.guideIdentity.test.js b/backend/__tests__/unit/controllers/authController.guideIdentity.test.js index bc89790848..bb3cec8095 100644 --- a/backend/__tests__/unit/controllers/authController.guideIdentity.test.js +++ b/backend/__tests__/unit/controllers/authController.guideIdentity.test.js @@ -119,7 +119,7 @@ describe('workspace onboarding guide identity fork (2026-08-13)', () => { const welcome = mockPostMessage.mock.calls[0][0]; expect(welcome.content).toBe(SCOUT_WELCOME); - expect(welcome.content).toBe('What would you like to do first?'); + expect(welcome.content).toBe("I'm Scout, your first agent here. Pick one below, or just tell me what you're working on."); expect(welcome.payload).toEqual({ kind: 'starts', starts: [ diff --git a/backend/config/native-agents/scout.ts b/backend/config/native-agents/scout.ts index c46df284a2..dc5f6b9bd7 100644 --- a/backend/config/native-agents/scout.ts +++ b/backend/config/native-agents/scout.ts @@ -46,10 +46,14 @@ export const SCOUT_HOSTED_START = { id: 'run-hosted', label: 'Run an agent here' * body is stored once, at signup, in the language the person signed up in * (TASK-550). The starts above keep their English labels: Scout matches on * them, and only the displayed button text is translated, by id. + * + * The body says who Scout is and that typing works too (TASK-644): two new + * people opened their workspace under the old one-line question, "What would + * you like to do first?", and left without clicking a start or typing. */ const SCOUT_WELCOME_BY_LOCALE = { - en: 'What would you like to do first?', - 'zh-CN': '你想先做什么?', + en: "I'm Scout, your first agent here. Pick one below, or just tell me what you're working on.", + 'zh-CN': '我是 Scout,你在这里的第一个智能体。选下面一项开始,或者直接告诉我你在做什么。', } as const; export type ScoutLocale = keyof typeof SCOUT_WELCOME_BY_LOCALE;