diff --git a/backend/__tests__/unit/config/nativeAgents.scoutReplyLength.test.js b/backend/__tests__/unit/config/nativeAgents.scoutReplyLength.test.js new file mode 100644 index 0000000000..390cdeb1ff --- /dev/null +++ b/backend/__tests__/unit/config/nativeAgents.scoutReplyLength.test.js @@ -0,0 +1,33 @@ +/** + * Scout's first replies stay short (F60, staging walk 2026-11-02). + * + * Asked what it could do, Scout named five things in one sentence, and the reply + * folded behind "Show more" on a phone. The prompt told it to answer the literal + * question, and the literal answer to "what can you do?" is the whole catalogue. + * Measured offline on the same model before this rule (9 first posts, 3 samples + * each): median 265 characters, 6 of 27 replies past the desktop fold, 19 of 27 + * past it at phone width. With it: 181, 0 of 27, 4 of 27. + */ +const { scoutApp } = require('../../../config/native-agents/scout'); + +describe('Scout reply length', () => { + const prompt = scoutApp.systemPrompt; + + it('budgets every reply and names the case that ran long', () => { + expect(prompt).toContain('two or three short sentences, about 200 characters'); + expect(prompt).toContain('Never volunteer a list of what you or Commonly can do'); + expect(prompt).toContain('name the one thing most useful to them now'); + }); + + it('exempts what the person asked for and every caveat the rules require', () => { + expect(prompt).toContain('a caveat these rules tell you to state, may run longer'); + expect(prompt).toContain('Asked which tools, models or paths work, name them'); + }); + + it('repeats the budget in the hard rules, the last thing the model reads, with its exemption', () => { + const hardRules = prompt.slice(prompt.lastIndexOf('ROLE-SPECIFIC HARD RULES:')); + expect(hardRules).toContain('A first impression is also short'); + expect(hardRules).toContain('unless a command or a caveat these rules require needs more'); + expect(hardRules).toContain('never a tour of what you can do'); + }); +}); diff --git a/backend/config/native-agents/scout.ts b/backend/config/native-agents/scout.ts index 2da10e8b97..91794a2a53 100644 --- a/backend/config/native-agents/scout.ts +++ b/backend/config/native-agents/scout.ts @@ -106,8 +106,8 @@ export const scoutApp = { + 'the person\'s own message: ' + `"${startLabel('ask-scout')}", "${startLabel('connect-agent')}" and "${startLabel('start-pod')}". ` + `For "${startLabel('ask-scout')}", answer in two or three short sentences: ` - + 'name what you can do for them here, then offer one thing you can do right ' - + 'now in this pod, such as putting their first task on the board. ' + + 'name the one thing most useful to them here, not a list, then offer to do ' + + 'it right now in this pod, such as putting their first task on the board. ' + `For "${startLabel('connect-agent')}", find out which tool they run ` + '(Claude Code or Codex) and their operating system, one question per turn, ' + 'then propose the connect card when the card rule below allows it; in that first reply, also say in one short ' @@ -316,6 +316,14 @@ export const scoutApp = { + 'HOW YOU ANSWER:\n' + '- Answer the literal question first, in your first sentence, with the ' + 'concrete step or command. Then stop.\n' + // F60 (staging walk 2026-11-02): asked what it can do, Scout named five + // things in one sentence, and the reply folded behind "Show more" on a phone. + + '- Keep a reply to two or three short sentences, about 200 characters, and ' + + 'make the last one the next step. Only a command or step they asked for, or ' + + 'a caveat these rules tell you to state, may run longer. Never volunteer a ' + + 'list of what you or Commonly can do: asked what you can do, what this is, ' + + 'or just greeted, name the one thing most useful to them now and offer to ' + + 'do it. Asked which tools, models or paths work, name them.\n' + '- Ask at most one question per turn, and only when the answer truly ' + 'depends on it (their OS, or which tool they run).\n' + '- Before ANY terminal command: if you do not know their operating ' @@ -365,7 +373,10 @@ export const scoutApp = { 'Never claim the user\'s own agent is connected or working, or that it ' + 'is not, unless commonly_agent_status said so in this turn. And ' + 'remember you are the product\'s first impression: an invented product ' - + 'fact from you is worse than one from anyone else.', + + 'fact from you is worse than one from anyone else. A first impression is ' + + 'also short: two or three short sentences, the last one the next step, ' + + 'unless a command or a caveat these rules require needs more, and never ' + + 'a tour of what you can do.', ), model: 'deepseek-v4-flash', triggers: ['mention', 'chat.message'],