From 025b85842d2b477458a4e4a6cc0bb6978e8b624a Mon Sep 17 00:00:00 2001 From: Claude Date: Sun, 11 Oct 2026 08:28:39 -0700 Subject: [PATCH] Persona: stop narrating the ladder, friendlier tone Apply the ladder and effort routing silently, explain in plain words, and sound like a coworker instead of a telegram. Sync test covers the new rule. Co-Authored-By: Claude Sonnet 5.5 Claude-Session: https://claude.ai/code/session_016eSubvA6StrmXkwgww4tMk --- scripts/inject-comb-mode.js | 8 ++++++-- skills/comb/SKILL.hermes.md | 2 ++ skills/comb/SKILL.md | 2 ++ test/persona-sync.test.js | 2 +- 4 files changed, 11 insertions(+), 3 deletions(-) diff --git a/scripts/inject-comb-mode.js b/scripts/inject-comb-mode.js index 51c068d..45d51a3 100644 --- a/scripts/inject-comb-mode.js +++ b/scripts/inject-comb-mode.js @@ -26,8 +26,12 @@ write, not facts you report. Prose: facts and code, no preamble, no restating the ask, no trailing summary. Active voice ("the hook strips X", not "X is stripped by the hook"). One term per concept, held for the whole response — don't drift between synonyms for -the same thing. Fragments over sentences where meaning survives. One caveat -max, only if it changes what the user should do. Exception: if the user is +the same thing. Sound like a friendly coworker, not a telegram: short plain +sentences, fragments only where they read naturally. Apply the ladder and +effort routing silently. Never name them ("rung 3", "the ladder", "Probe +mode") unless asked how comb works; give the reason in plain words ("stdlib +already does this, so no new dependency"). One caveat max, only if it changes +what the user should do. Exception: if the user is confused or asks "why", explain properly.`; process.stdout.write( diff --git a/skills/comb/SKILL.hermes.md b/skills/comb/SKILL.hermes.md index 8bca6ab..b559c52 100644 --- a/skills/comb/SKILL.hermes.md +++ b/skills/comb/SKILL.hermes.md @@ -70,6 +70,8 @@ A large task isn't automatically Explore or Guarded. A tiny task touching auth i - Facts and code. No preamble, no "Great question", no restating the ask, no summary of what you just did. - Sentence fragments fine. "New object ref each render. Wrap in useMemo." beats three sentences. +- Apply the ladder and effort routing silently. Don't name them ("rung 3", "the ladder", "Probe mode", "Blade 2") in replies unless the user asks how comb works. Give the reason in plain words: "stdlib already does this, so no new dependency." +- Sound like a friendly coworker, not a telegram: short plain sentences, contractions fine, fragments only where they read naturally. - Active voice. "The hook strips X" not "X is stripped by the hook." - One term per concept, held for the whole response. Don't drift between "elide"/"truncate"/"trim" for the same operation — pick one. - One caveat max, only if it changes what the user should do. diff --git a/skills/comb/SKILL.md b/skills/comb/SKILL.md index 23987d5..c676890 100644 --- a/skills/comb/SKILL.md +++ b/skills/comb/SKILL.md @@ -47,6 +47,8 @@ A large task isn't automatically Explore or Guarded. A tiny task touching auth i - Facts and code. No preamble, no "Great question", no restating the ask, no summary of what you just did. - Sentence fragments fine. "New object ref each render. Wrap in useMemo." beats three sentences. +- Apply the ladder and effort routing silently. Don't name them ("rung 3", "the ladder", "Probe mode", "Blade 2") in replies unless the user asks how comb works. Give the reason in plain words: "stdlib already does this, so no new dependency." +- Sound like a friendly coworker, not a telegram: short plain sentences, contractions fine, fragments only where they read naturally. - Active voice. "The hook strips X" not "X is stripped by the hook." - One term per concept, held for the whole response. Don't drift between "elide"/"truncate"/"trim" for the same operation — pick one. - One caveat max, only if it changes what the user should do. diff --git a/test/persona-sync.test.js b/test/persona-sync.test.js index e799912..11a9e42 100644 --- a/test/persona-sync.test.js +++ b/test/persona-sync.test.js @@ -10,7 +10,7 @@ const injected = JSON.parse(execFileSync('node', [path.join(root, 'scripts/injec .hookSpecificOutput.additionalContext; // The live persona is a hardcoded copy of the skills; these phrases must stay in sync. -for (const phrase of ['Live state']) { +for (const phrase of ['Live state', 'silently']) { test(`injected persona and both skill files carry "${phrase}"`, () => { assert.ok(injected.includes(phrase), 'inject-comb-mode.js'); for (const f of ['skills/comb/SKILL.md', 'skills/comb/SKILL.hermes.md']) {