From 83bef6ba68768eedd5acdfb72a73c6dc4dfa4b15 Mon Sep 17 00:00:00 2001 From: Lily Shen <115414357+lilyshen0722@users.noreply.github.com> Date: Fri, 23 Oct 2026 20:19:04 -0700 Subject: [PATCH 1/2] fix(scout): list Hermes as a command-line connect, with its walk and caveats (TASK-429) Scout's connects list names Hermes through the attach command, pinned to the 0.22.2 build the adapter requires. The walk comment records the 10-22 PA-1 PASS (non-admin, invite-only pod, LiteLLM DeepSeek, mention in 56 s) and its two caveats: it ran before forge's probe fix, and on our LiteLLM, not OpenRouter, so no provider is named as walked. There is no Hermes guide under docs/cli, so no guide link is given. Co-Authored-By: Claude Haiku 5.5 Co-authored-by: dart Agent-Model: claude/claude-haiku-5-5/default --- .../unit/config/nativeAgents.scoutKnowledge.test.js | 11 +++++++++++ backend/config/native-agents/scout.ts | 11 ++++++++++- 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/backend/__tests__/unit/config/nativeAgents.scoutKnowledge.test.js b/backend/__tests__/unit/config/nativeAgents.scoutKnowledge.test.js index f35c98272a..1c72c37310 100644 --- a/backend/__tests__/unit/config/nativeAgents.scoutKnowledge.test.js +++ b/backend/__tests__/unit/config/nativeAgents.scoutKnowledge.test.js @@ -84,6 +84,17 @@ describe('Scout onboarding knowledge', () => { expect(prompt).toMatch(/name it only when someone asks which model or runtime it uses/); }); + // TASK-429: Hermes walked 2026-10-22 (PA-1). The list stays closed: Hermes is + // added by name, and the list still ends with the refusal to claim anything else. + test('lists Hermes from the command line, with its attach step and no provider named as walked', () => { + expect(prompt).toMatch(/OpenCode or dsh through their guides, and Hermes from the command line/); + expect(prompt).toMatch(/Do not claim any other tool connects\./); + expect(prompt).toContain('commonly agent attach hermes --pod --name '); + expect(prompt).toMatch(/It needs Hermes 0\.22\.2 exactly/); + expect(prompt).toMatch(/do not name a model provider as the one it was walked on/); + expect(prompt).not.toMatch(/Hermes[^.]*OpenRouter/); + }); + test('the dsh guide gives the same attach step and the completed macOS walk', () => { const guide = fs.readFileSync(path.resolve(__dirname, '../../../../docs/cli/dsh.md'), 'utf8'); expect(guide).toContain('commonly agent attach dsh --pod --name '); diff --git a/backend/config/native-agents/scout.ts b/backend/config/native-agents/scout.ts index dabe1cb12d..7686c5ba1f 100644 --- a/backend/config/native-agents/scout.ts +++ b/backend/config/native-agents/scout.ts @@ -121,6 +121,15 @@ export const scoutApp = { + 'repository; it has been walked on a Mac only. Point them to the guide and ' + 'do not propose a connect card for it: the card sets up Claude Code or ' + 'Codex.\n' + // Walked 2026-10-22 16:30Z (PA-1 PASS): Hermes 0.22.2 on macOS, a non-admin + // account in an invite-only pod, a LiteLLM DeepSeek provider; a mention was + // answered in 56 s. The walk ran on 31cc808d, before forge's probe fix, and + // on our LiteLLM rather than OpenRouter, so no provider is named as walked. + + ' * Hermes, on a model provider they choose, connects from the command line, ' + + 'not from this page. It needs Hermes 0.22.2 exactly. Run `commonly agent attach ' + + 'hermes --pod --name `, then `commonly agent run ` to answer ' + + '@mentions. The pod id is the last part of its URL. Do not propose a connect card ' + + 'for it, and do not name a model provider as the one it was walked on.\n' + ' * "Add a computer": `npm i -g @commonlyai/cli@latest && commonly login ' + '&& commonly daemon register && commonly daemon install` registers their ' + 'machine once; after that they add agents to it from this page with no ' @@ -163,7 +172,7 @@ export const scoutApp = { + '` to answer @mentions. The pod id is the last part of its URL. ' + 'Lead with the yes when someone asks whether dsh can join.\n' + '- What connects as their own agent: Claude Code or Codex from the Bring ' - + 'your own page, and OpenCode or dsh through their guides. Qwen Code and pi are not ' + + 'your own page, OpenCode or dsh through their guides, and Hermes from the command line. Qwen Code and pi are not ' + 'ready for outside use; say so if asked. Do not claim any other tool ' + 'connects.\n' + '- Developers building their own agent: Commonly agents use a small HTTP ' From 0b74ee3d7558567b5b7f32fe10a9febe8dd0abd7 Mon Sep 17 00:00:00 2001 From: Lily Shen <115414357+lilyshen0722@users.noreply.github.com> Date: Fri, 23 Oct 2026 20:28:05 -0700 Subject: [PATCH 2/2] fix(scout): Hermes needs an OpenRouter key, the walk did not use it (TASK-429) The adapter fixes --provider openrouter and reads OPENROUTER_API_KEY from the host environment, so attach and run alone can fail. The prompt now states that setup and says no provider was walked. The test asserts the key line and rejects any claim of an OpenRouter walk. Co-Authored-By: Claude Haiku 5.5 Co-authored-by: dart Agent-Model: claude/claude-haiku-5-5/default --- .../config/nativeAgents.scoutKnowledge.test.js | 6 ++++-- backend/config/native-agents/scout.ts | 15 +++++++++------ 2 files changed, 13 insertions(+), 8 deletions(-) diff --git a/backend/__tests__/unit/config/nativeAgents.scoutKnowledge.test.js b/backend/__tests__/unit/config/nativeAgents.scoutKnowledge.test.js index 1c72c37310..b595e1b3a3 100644 --- a/backend/__tests__/unit/config/nativeAgents.scoutKnowledge.test.js +++ b/backend/__tests__/unit/config/nativeAgents.scoutKnowledge.test.js @@ -91,8 +91,10 @@ describe('Scout onboarding knowledge', () => { expect(prompt).toMatch(/Do not claim any other tool connects\./); expect(prompt).toContain('commonly agent attach hermes --pod --name '); expect(prompt).toMatch(/It needs Hermes 0\.22\.2 exactly/); - expect(prompt).toMatch(/do not name a model provider as the one it was walked on/); - expect(prompt).not.toMatch(/Hermes[^.]*OpenRouter/); + // The adapter fixes --provider openrouter and reads OPENROUTER_API_KEY from the host. + expect(prompt).toMatch(/an OpenRouter API key \(OPENROUTER_API_KEY\) in the environment/); + expect(prompt).toMatch(/do not say OpenRouter, or any model provider, was the one it was walked on/); + expect(prompt).not.toMatch(/walked[^.]*OpenRouter/); }); test('the dsh guide gives the same attach step and the completed macOS walk', () => { diff --git a/backend/config/native-agents/scout.ts b/backend/config/native-agents/scout.ts index 7686c5ba1f..248eff8450 100644 --- a/backend/config/native-agents/scout.ts +++ b/backend/config/native-agents/scout.ts @@ -124,12 +124,15 @@ export const scoutApp = { // Walked 2026-10-22 16:30Z (PA-1 PASS): Hermes 0.22.2 on macOS, a non-admin // account in an invite-only pod, a LiteLLM DeepSeek provider; a mention was // answered in 56 s. The walk ran on 31cc808d, before forge's probe fix, and - // on our LiteLLM rather than OpenRouter, so no provider is named as walked. - + ' * Hermes, on a model provider they choose, connects from the command line, ' - + 'not from this page. It needs Hermes 0.22.2 exactly. Run `commonly agent attach ' - + 'hermes --pod --name `, then `commonly agent run ` to answer ' - + '@mentions. The pod id is the last part of its URL. Do not propose a connect card ' - + 'for it, and do not name a model provider as the one it was walked on.\n' + // on our LiteLLM. The adapter itself passes --provider openrouter and needs + // OPENROUTER_API_KEY, which the walk did not use, so no provider is named as walked. + + ' * Hermes connects from the command line, not from this page. It needs Hermes ' + + '0.22.2 exactly, and an OpenRouter API key (OPENROUTER_API_KEY) in the environment ' + + 'of the computer it runs on: the adapter sends its model calls through OpenRouter. ' + + 'Run `commonly agent attach hermes --pod --name `, then `commonly ' + + 'agent run ` to answer @mentions. The pod id is the last part of its URL. ' + + 'Do not propose a connect card for it, and do not say OpenRouter, or any model ' + + 'provider, was the one it was walked on.\n' + ' * "Add a computer": `npm i -g @commonlyai/cli@latest && commonly login ' + '&& commonly daemon register && commonly daemon install` registers their ' + 'machine once; after that they add agents to it from this page with no '