tonedial 0.1.4 → 0.1.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -158,7 +158,7 @@ const messages = {
158
158
  safewordShort: (phrase) => `Palabra clave ${phrase}: demasiado corta; podría activarse por accidente`,
159
159
  safewordSet: (phrase) => `Palabra clave ${phrase}`,
160
160
  noSafeword: "sin palabra clave",
161
- register: (level) => `registro ${level} (${({ auto: "según la relación", polite: "formas honoríficas", plain: "formas normales sin honoríficos", rough: "formas bruscas sin honoríficos" })[level]})`,
161
+ register: (level) => `registro ${level} (${({ auto: "según la relación", polite: "formas honoríficas", plain: "formas normales sin honoríficos", rough: "formas no honoríficas cortas y tajantes" })[level]})`,
162
162
  },
163
163
  artifact: {
164
164
  size: (chars) => `TONE.md ${chars} caracteres`,
@@ -471,7 +471,7 @@ const messages = {
471
471
  },
472
472
  combos: {
473
473
  contradiction: (rule) => `${rule} se contradice.`,
474
- refusalCompliance: "Un eje pide declarar una negativa; el otro, actuar sin comentarios. Reduce uno de los dos.",
474
+ refusalCompliance: "Un eje pide aplazar la tarea; el otro, empezarla de inmediato con entusiasmo. Reduce uno de los dos.",
475
475
  nothingBlocked: "No se bloquea nada.",
476
476
  },
477
477
  errors: {
@@ -614,21 +614,21 @@ export const es = {
614
614
  },
615
615
  axisHints: {
616
616
  formality: { owns: "lenguaje y distancia social", low: "lenguaje familiar con jerga", high: "lenguaje ceremonial y deferente" },
617
- verbosity: { owns: "longitud y profundidad de la respuesta", low: "resultado directo en una o dos frases", high: "profundidad dentro de la tarea pedida" },
618
- profanity: { owns: "grosería del lenguaje", low: "ninguna palabrota; interjecciones suaves", high: "palabrotas fuertes durante toda la respuesta" },
619
- playfulness: { owns: "frecuencia e intensidad del humor y del rol", low: "lenguaje literal y la forma de trato elegida", high: "expresiones del personaje en toda la respuesta" },
620
- critique: { owns: "intensidad de la crítica", low: "defectos neutrales sin juzgar", high: "críticas vivas e implacables" },
621
- flattery: { owns: "frecuencia de elogios al usuario", low: "ninguno", high: "cuatro elogios, incluso por decisiones pequeñas" },
622
- warmth: { owns: "calidez hacia el usuario", low: "sin saludo, acogida cálida ni ánimo", high: "cuatro comentarios cálidos, con ánimo y empatía" },
617
+ verbosity: { owns: "longitud y profundidad de la respuesta", low: "una frase breve para un resultado sencillo", high: "profundidad dentro de la tarea pedida" },
618
+ profanity: { owns: "solo palabrotas: frecuencia e intensidad", low: "sin palabrotas; conserva la jerga del rol", high: "palabrotas sin censura en casi cada frase" },
619
+ playfulness: { owns: "intensidad y frecuencia del humor y del rol", low: "lenguaje literal; conserva el trato", high: "voz del personaje en casi cada frase" },
620
+ critique: { owns: "dureza de la crítica a defectos y decisiones", low: "defectos neutrales sin juzgar", high: "burla implacable de defectos graves y decisiones" },
621
+ flattery: { owns: "cantidad e intensidad de los elogios", low: "ninguno", high: "elogio efusivo cada párrafo; evaluación intacta" },
622
+ warmth: { owns: "calidez hacia el usuario", low: "sin saludo, acogida cálida ni ánimo", high: "amabilidad, empatía y consuelo en cada párrafo" },
623
623
  conviction: { owns: "firmeza al imponer su criterio", low: "presenta opciones y pregunta", high: "expone una recomendación como decisión" },
624
- care: { owns: "cobertura, organización y presentación funcional", low: "solo la tarea solicitada", high: "seguimiento, copia, descanso, listas y emoji de estado" },
625
- compliance: { owns: "objeciones antes de actuar", low: "pregunta una vez y luego actúa", high: "actúa de inmediato sin comentar que va a obedecer" },
626
- refusal: { owns: "frecuencia de rechazo", low: "sin rechazo ni demora", high: "negativa hasta persuadirlo o usar la palabra clave" },
627
- bravado: { owns: "intensidad de la fanfarronería", low: "sin exageración", high: "personalidad de experto fanfarrón por defecto" },
624
+ care: { owns: "cobertura, organización y presentación", low: "solo la tarea solicitada", high: "seguimiento, copia, descanso, listas y estados" },
625
+ compliance: { owns: "voluntad cuando refusal no aplaza", low: "objeta con un motivo y luego actúa", high: "empieza con ganas; sin demora ni negociación" },
626
+ refusal: { owns: "frecuencia y condiciones del rechazo", low: "sin rechazo ni demora", high: "huelga hasta persuadirlo o usar la palabra clave" },
627
+ bravado: { owns: "esfuerzo exagerado y mérito reclamado", low: "sin exageración", high: "presume y reclama mérito; conserva el personaje" },
628
628
  },
629
629
  settingHints: {
630
630
  safeword: "petición de una respuesta sencilla para un solo mensaje",
631
- speech_level: "auto: según la relación · polite: formas honoríficas · plain: formas normales sin honoríficos · rough: terminaciones bruscas y descaradas sin honoríficos · formality controla el lenguaje y la distancia",
631
+ speech_level: "auto: según la relación · polite: formas honoríficas · plain: formas normales sin honoríficos · rough: terminaciones no honoríficas cortas y tajantes; no añaden por sí mismas bromas, palabrotas, críticas ni burlas · formality controla el lenguaje y la distancia",
632
632
  language: "idioma de la interfaz CLI · independiente de las respuestas del agente",
633
633
  "persona.age": "franja de edad que puede asociar el modelo",
634
634
  "persona.gender": "género que puede asociar el modelo",
@@ -158,7 +158,7 @@ const messages = {
158
158
  safewordShort: (phrase) => `合言葉 ${phrase}: 短すぎるため、意図せず反応する可能性があります`,
159
159
  safewordSet: (phrase) => `合言葉 ${phrase}`,
160
160
  noSafeword: "合言葉なし",
161
- register: (level) => `敬語区分 ${level} (${({ auto: "関係に合わせる", polite: "敬語", plain: "通常の常体", rough: "荒っぽい常体" })[level]})`,
161
+ register: (level) => `敬語区分 ${level} (${({ auto: "関係に合わせる", polite: "敬語", plain: "通常の常体", rough: "短くぶっきらぼうな常体" })[level]})`,
162
162
  },
163
163
  artifact: {
164
164
  size: (chars) => `TONE.md ${chars}文字`,
@@ -471,7 +471,7 @@ const messages = {
471
471
  },
472
472
  combos: {
473
473
  contradiction: (rule) => `${rule} は自己矛盾しています。`,
474
- refusalCompliance: "一方の軸は拒否の明示、他方は無言の即時実行を求めます。どちらかを下げてください。",
474
+ refusalCompliance: "一方の軸は作業の先送り、他方は意欲的な即時着手を求めます。どちらかを下げてください。",
475
475
  nothingBlocked: "ブロックはしていません。",
476
476
  },
477
477
  errors: {
@@ -614,21 +614,21 @@ export const ja = {
614
614
  },
615
615
  axisHints: {
616
616
  formality: { owns: "表現の格式と距離感", low: "親しい言葉や俗語", high: "儀礼的で敬意ある表現" },
617
- verbosity: { owns: "回答の長さと説明の深さ", low: "1、2文で結論を示す", high: "依頼の範囲内で詳しく説明" },
618
- profanity: { owns: "言葉の荒さ", low: "罵りなし、感嘆も穏やか", high: "回答全体で強い罵り" },
619
- playfulness: { owns: "冗談と役柄表現の頻度・強度", low: "平易な表現と設定済みの呼称", high: "全体で大げさな役柄表現" },
620
- critique: { owns: "批判の強さ", low: "評価せず問題を中立に説明", high: "鮮烈で容赦ない批判" },
621
- flattery: { owns: "ユーザーを褒める頻度", low: "なし", high: "小さな選択も含め4回褒める" },
622
- warmth: { owns: "ユーザーに向ける温かさ", low: "挨拶・親しい受け止め・励ましなし", high: "励ましと共感を含む温かい言葉4つ" },
617
+ verbosity: { owns: "回答の長さと説明の深さ", low: "単純な結果は短い1文", high: "依頼の範囲内で詳しく説明" },
618
+ profanity: { owns: "罵りだけ:強さと頻度", low: "罵りなし・役柄の俗語は維持", high: "ほぼ全文で強烈な罵りを伏せずに使う" },
619
+ playfulness: { owns: "冗談と役柄表現の強度・頻度", low: "平易な表現・設定済みの呼称を維持", high: "ほぼ全ての文で大げさな役柄表現" },
620
+ critique: { owns: "問題点と選択への批判の強さ", low: "評価せず問題を中立に説明", high: "深刻な問題点と選択を容赦なく非難し、あざける" },
621
+ flattery: { owns: "称賛の量と強さ", low: "なし", high: "段落ごとに惜しみなく称賛・技術評価は維持" },
622
+ warmth: { owns: "ユーザーに向ける温かさ", low: "挨拶・親しい受け止め・励ましなし", high: "段落ごとに優しさ・共感・慰め・安心" },
623
623
  conviction: { owns: "自分の判断を押し通す強さ", low: "選択肢を並べて尋ねる", high: "推奨を1つ、決定として述べる" },
624
- care: { owns: "範囲・整理・実用的な表示", low: "依頼された作業のみ", high: "後続作業・バックアップ・休憩・一覧・状態絵文字" },
625
- compliance: { owns: "実行前の異議提示", low: "一度尋ねてから実行", high: "従うという前置きなしで即実行" },
626
- refusal: { owns: "拒否の頻度", low: "拒否も遅延もなし", high: "説得か合言葉まで拒否を明示" },
627
- bravado: { owns: "虚勢の強さ", low: "誇張なし", high: "虚勢を張る専門家が標準" },
624
+ care: { owns: "範囲・整理・実用的な表示", low: "依頼された作業のみ", high: "後続・バックアップ・休憩・一覧・状態絵文字" },
625
+ compliance: { owns: "拒否で先送りしない時の実行意欲", low: "反対理由を述べてから実行", high: "進んで即着手・遅延や交渉なし" },
626
+ refusal: { owns: "拒否の頻度と条件", low: "拒否も遅延もなし", high: "説得までストライキ・合言葉は1回答だけ解除" },
627
+ bravado: { owns: "労力の誇張と手柄の主張", low: "誇張なし", high: "毎回答で自慢・手柄・苦労を誇張・役柄は維持" },
628
628
  },
629
629
  settingHints: {
630
630
  safeword: "1つのメッセージに一度だけ平易な回答を求める文句",
631
- speech_level: "auto: 関係に合わせる · polite: 敬語 · plain: 通常の常体 · rough: 荒っぽく生意気な常体 · 表現の格式と距離感は formality で調整",
631
+ speech_level: "auto: 関係に合わせる · polite: 敬語 · plain: 通常の常体 · rough: 短くぶっきらぼうな常体・それ自体では冗談・罵り・批判・嘲りを加えない · 表現の格式と距離感は formality で調整",
632
632
  language: "CLIの表示言語 · エージェントの回答言語とは別",
633
633
  "persona.age": "モデルに連想させる年齢層",
634
634
  "persona.gender": "モデルに連想させるジェンダー",
@@ -158,7 +158,7 @@ const messages = {
158
158
  safewordShort: (phrase) => `安全词 ${phrase}:太短,可能误触发`,
159
159
  safewordSet: (phrase) => `安全词 ${phrase}`,
160
160
  noSafeword: "未设置安全词",
161
- register: (level) => `敬语形式 ${level} (${({ auto: "按关系选择", polite: "敬语", plain: "普通非敬语", rough: "粗鲁的非敬语" })[level]})`,
161
+ register: (level) => `敬语形式 ${level} (${({ auto: "按关系选择", polite: "敬语", plain: "普通非敬语", rough: "简短生硬的非敬语" })[level]})`,
162
162
  },
163
163
  artifact: {
164
164
  size: (chars) => `TONE.md ${chars} 字符`,
@@ -471,7 +471,7 @@ const messages = {
471
471
  },
472
472
  combos: {
473
473
  contradiction: (rule) => `${rule} 自相矛盾。`,
474
- refusalCompliance: "一个语气轴要求明确罢工,另一个要求不加评论立即执行。请降低其中一项。",
474
+ refusalCompliance: "一个语气轴要求推迟任务,另一个要求积极地立即开始。请降低其中一项。",
475
475
  nothingBlocked: "没有阻止任何设置。",
476
476
  },
477
477
  errors: {
@@ -614,21 +614,21 @@ export const zh = {
614
614
  },
615
615
  axisHints: {
616
616
  formality: { owns: "措辞的正式程度与社交距离", low: "熟悉措辞及俚语", high: "庄重恭敬的措辞" },
617
- verbosity: { owns: "回答长度和解释深度", low: "一两句话直接给出结果", high: "在请求范围内深入解释" },
618
- profanity: { owns: "语言粗俗程度", low: "无脏话,缓和感叹", high: "全程使用强烈脏话" },
619
- playfulness: { owns: "幽默和角色用语的频率与强度", low: "直白措辞和已设称呼", high: "全程夸张的角色用语" },
620
- critique: { owns: "批评强度", low: "不作评判,中性陈述缺陷", high: "生动而毫不留情的批评" },
621
- flattery: { owns: "赞美用户的频率", low: "无", high: "即使微小选择也具体赞美四次" },
622
- warmth: { owns: "对用户表达的温暖", low: "无问候、亲切回应或鼓励", high: "四句温暖表达,包含鼓励和共情" },
617
+ verbosity: { owns: "回答长度和解释深度", low: "简单结果只用一个短句", high: "在请求范围内深入解释" },
618
+ profanity: { owns: "仅脏话:强度和频率", low: "不用脏话;保留角色俚语", high: "几乎每句都使用未经弱化的强烈脏话" },
619
+ playfulness: { owns: "幽默和角色表达的强度与频率", low: "直白措辞;保留已设称呼", high: "几乎每句都使用夸张的角色表达" },
620
+ critique: { owns: "对缺陷和选择的批评强度", low: "不作评判,中性陈述缺陷", high: "毫不留情地谴责并嘲讽严重缺陷和相关选择" },
621
+ flattery: { owns: "赞美的数量和强度", low: "无", high: "每段都大力赞美;技术判断不变" },
622
+ warmth: { owns: "对用户表达的温暖", low: "无问候、亲切回应或鼓励", high: "每段都表达温柔、共情、安慰和宽心" },
623
623
  conviction: { owns: "坚持自身判断的力度", low: "列出选项并询问", high: "将一个推荐作为决定陈述" },
624
- care: { owns: "覆盖范围、组织和实用呈现", low: "仅执行所请求任务", high: "后续工作、备份、休息、列表及状态表情" },
625
- compliance: { owns: "行动前提出异议", low: "询问一次后行动", high: "不加服从说明,立即行动" },
626
- refusal: { owns: "拒绝频率", low: "无拒绝或延迟", high: "明确罢工,直到被说服或听到安全词" },
627
- bravado: { owns: "吹嘘强度", low: "无夸张", high: "默认夸口的专家人设" },
624
+ care: { owns: "覆盖范围、组织和实用呈现", low: "仅执行所请求任务", high: "后续、备份、休息、列表和状态表情" },
625
+ compliance: { owns: "拒绝未推迟任务时的行动意愿", low: "提出异议和原因后执行", high: "积极立即开始;不拖延、不谈条件" },
626
+ refusal: { owns: "拒绝频率和条件", low: "无拒绝或延迟", high: "罢工到被说服;安全词仅解除一次" },
627
+ bravado: { owns: "夸大付出和邀功的程度", low: "无夸张", high: "每次都吹嘘、邀功、夸大付出;保留角色" },
628
628
  },
629
629
  settingHints: {
630
630
  safeword: "对一条消息请求一次平实回答的短语",
631
- speech_level: "auto:按关系选择 · polite:敬语 · plain:普通非敬语 · rough:粗鲁且带有不逊语气的非敬语 · 措辞和距离感由 formality 调整",
631
+ speech_level: "auto:按关系选择 · polite:敬语 · plain:普通非敬语 · rough:简短生硬的非敬语句尾;本身不增加玩笑、脏话、批评或嘲讽 · 措辞和距离感由 formality 调整",
632
632
  language: "CLI 界面语言 · 与代理回答语言无关",
633
633
  "persona.age": "模型可能联想的年龄段",
634
634
  "persona.gender": "模型可能联想的性别",
@@ -11,7 +11,7 @@ import { captureRawEntry, caseRenameMatchesCurrent, isNoop, planChange, planEntr
11
11
  import { BUNDLED, builtinPresetDir, LEGACY_BUILTIN_SLUGS, RETIRED_PRESETS } from "./presets.js";
12
12
  import { SKILL_MD, SKILL_NAME, SKILL_TRAITS_MD } from "./skill.js";
13
13
  // Bump for changed generated content; freshness also checks each managed seed's bytes/provenance.
14
- export const SEED_VERSION = 20;
14
+ export const SEED_VERSION = 21;
15
15
  /** The state-root operating boundaries. The compiler owns the current tone separately. */
16
16
  export const GUIDE_MD = `${GUIDE_FORMAT_MARKER}
17
17
  ToneDial changes manner only; it never expands task scope or permissions.
@@ -73,10 +73,10 @@ export function seedFiles(paths, selection) {
73
73
  };
74
74
  const native = [
75
75
  reader,
76
- { id: "skill/body", version: 20, path: join(paths.skill, SKILL_NAME, "SKILL.md"), label: `skill/${SKILL_NAME}/SKILL.md`, contents: SKILL_MD },
76
+ { id: "skill/body", version: 21, path: join(paths.skill, SKILL_NAME, "SKILL.md"), label: `skill/${SKILL_NAME}/SKILL.md`, contents: SKILL_MD },
77
77
  {
78
78
  id: "skill/traits",
79
- version: 11,
79
+ version: 12,
80
80
  path: join(paths.skill, SKILL_NAME, "references", "traits.md"),
81
81
  label: `skill/${SKILL_NAME}/references/traits.md`,
82
82
  contents: SKILL_TRAITS_MD,
@@ -114,7 +114,7 @@ interpolating it into shell code.
114
114
  | Persona manner or role note | \`tonedial set "persona.note=Patient guide" --json\` |
115
115
  | Safeword phrase | \`tonedial set "safeword=plain answer please" --json\` |
116
116
  | Honorific register system | \`tonedial set speech_level=polite --json\` |
117
- | Rough, cheeky non-honorific endings | \`tonedial set speech_level=rough --json\` |
117
+ | Curt, blunt non-honorific endings | \`tonedial set speech_level=rough --json\` |
118
118
 
119
119
  Age bands are \`unspecified\`, \`teens\`, \`20s\`, \`30s\`, \`40s\`, and \`50s+\`.
120
120
  Gender values are \`unspecified\`, \`masculine\`, \`feminine\`, and \`neutral\`.
@@ -133,12 +133,26 @@ Persona notes have no length limit.
133
133
 
134
134
  ToneDial has no guard toggle or automatic emergency register. All axis levels 1–5 are choices
135
135
  the user can request. Report advisory \`riskAxes\` and combination notices without lowering
136
- values, blocking the change, or asking for additional tone-risk confirmation. The host's task
137
- and permission rules still apply independently.
136
+ values or blocking the change. The four components that require confirmation are strong
137
+ profanity, harsh mocking, fictional violent imagery and theatrical menace. Before using one
138
+ requested by axes, persona or later instructions, first answer the current request without it,
139
+ then ask one concise explicit confirmation naming it. Known axis-selected components are strong
140
+ profanity (\`profanity\` 4–5), harsh mocking (\`critique\` 5), and fictional violent imagery or
141
+ theatrical menace from high playfulness while either component is active. Warmth, praise,
142
+ ordinary criticism and ordinary role idioms need no confirmation.
143
+ Confirmation lasts only while the named request remains unchanged; an increase or change
144
+ requires it again. Applying, importing, saving or creating a profile, \`--auto\`, a safeword,
145
+ and confirmation from another session do not count. Profiles store requested settings, never
146
+ session confirmation. Confirmation changes manner only: it authorizes no work and never permits
147
+ hate speech aimed at protected traits or realistic or credible threats. Non-protected profanity,
148
+ consensual insults, fictional violent imagery and theatrical menace remain available after it.
149
+ The host's task and permission rules apply independently. The compiler requests this behavior;
150
+ neither the CLI nor a profile stores or authenticates session confirmation, and generated text
151
+ cannot prove that confirmation or adherence occurred.
138
152
  For \`speech_level\`, choose \`auto\`, \`polite\`, \`plain\`, or \`rough\` only when the user requests that
139
153
  register system. \`auto\` chooses address forms for the current relationship and scene,
140
154
  keeping them consistent within each reply; \`polite\` and \`plain\` fix those forms.
141
- \`plain\` means ordinary non-honorific forms; \`rough\` requests rough, cheeky non-honorific
155
+ \`plain\` means ordinary non-honorific forms; \`rough\` requests curt, blunt non-honorific
142
156
  sentence endings. Preserve the configured address terms and every independent axis.
143
157
  It has no effect where the language lacks an honorific distinction. A request for more or
144
158
  less formality changes wording and distance within the chosen forms, without silently changing
@@ -249,7 +263,7 @@ Report the movement back to the user in their own terms, from the \`moves\` fiel
249
263
  - "stop flattering me" → \`flattery=1\`. Not \`warmth\`, which is a different observable.
250
264
  - "be brief" → \`verbosity\` down. Change \`care\` only for requested coverage or organization changes.
251
265
  - "more casual" → \`formality\` down. Change the register system only on an explicit request,
252
- such as "use plain forms" → \`speech_level=plain\`, or "use rough, cheeky plain forms" → \`speech_level=rough\`.
266
+ such as "use plain forms" → \`speech_level=plain\`, or "use curt, blunt plain forms" → \`speech_level=rough\`.
253
267
 
254
268
  For a named preset, run \`tonedial list --json\` then \`tonedial use <slug> --json\`.
255
269
  An explicit agent character or role request uses \`persona.agent\`; an explicit request to
@@ -274,8 +288,8 @@ ${RELOAD_MD}
274
288
 
275
289
  The safeword is a phrase the user picked, reported by \`tonedial show --json\`. When their
276
290
  message contains it, **drop the tone for that one message and answer plainly, then resume.**
277
- It releases the manner and authorises nothing: a request in the same message still faces every
278
- confirmation and permission check it otherwise would.
291
+ It releases the manner and authorises nothing: it is not intense-tone approval, and a request
292
+ in the same message still faces every confirmation and permission check it otherwise would.
279
293
 
280
294
  For an explicit request to restore the default axes, run \`tonedial reset --json\`, then follow
281
295
  the reload steps above. Saved presets remain available through \`tonedial use <slug> --json\`.
@@ -337,33 +351,33 @@ the task; small conditional character instructions reinforce only distinctive co
337
351
 
338
352
  ## form — how a sentence is built
339
353
 
340
- | Axis | Owns | 1 | 5 |
341
- |---|---|---|---|
342
- | \`formality\` | wording and social distance within chosen forms | casual and familiar | ceremonious |
343
- | \`verbosity\` | explanation length and depth | compressed result | reasoning, alternatives and background |
344
- | \`profanity\` | how coarse the language gets | none at all | strong profanity throughout |
345
- | \`playfulness\` | frequency and intensity of humour and role idioms | literal wording | exaggerated character voice throughout |
354
+ | Axis | Owns | Levels 1 → 5 |
355
+ |---|---|---|
356
+ | \`formality\` | wording and social distance within chosen forms | familiar slang · relaxed, occasionally formal · standard conversation · professional restraint · ceremonial deference |
357
+ | \`verbosity\` | explanation length and depth | one sentence or terse items · conclusion and one reason · needed explanation · conclusion, reason and one example · rationale, edge cases, alternatives and background |
358
+ | \`profanity\` | actual swearing, never added insults or criticism | none · one mild interjection · mild swearing about once per paragraph · strong everyday profanity in most paragraphs · varied harsh uncensored profanity in nearly every sentence |
359
+ | \`playfulness\` | frequency and intensity of humour and role idioms | literal · one restrained touch · two recognizable touches · exaggerated idioms in most paragraphs · character idioms in nearly every sentence |
346
360
 
347
361
  ## target — who or what an observation lands on
348
362
 
349
- | Axis | Owns | 1 | 5 |
350
- |---|---|---|---|
351
- | \`critique\` | how hard it is on the work | flat problem statements without evaluation | unsparing |
352
- | \`flattery\` | how much it praises the person | not at all | four positive remarks per answer |
353
- | \`warmth\` | how much it attends to the person | not at all | four warm remarks, including encouragement and empathy |
363
+ | Axis | Owns | Levels 1 → 5 |
364
+ |---|---|---|
365
+ | \`critique\` | how hard it is on the work | neutral observation · softened defect and impact · direct defect and impact · harsh judgement with vivid consequences · open contempt with cutting mockery of supported defects and choices |
366
+ | \`flattery\` | how much it praises the person | none · one brief positive remark · two specific remarks · three specific remarks · explicit lavish praise for at least four observable choices without inventing achievements |
367
+ | \`warmth\` | how much it attends to the person | none · one friendly acknowledgement · two warm acknowledgements · three including encouragement · intense kindness in every paragraph with greeting, empathy, comfort and reassurance |
354
368
 
355
369
  \`critique\` and \`warmth\` are the pair that makes "savage about the code, warm about me" work in
356
370
  one answer. They are not opposites and setting one does not imply the other.
357
371
 
358
372
  ## behaviour — what it does about the work
359
373
 
360
- | Axis | Owns | 1 | 5 |
361
- |---|---|---|---|
362
- | \`conviction\` | how far it pushes its own judgement | lists viable options and asks the user to choose | gives the conclusion without asking |
363
- | \`care\` | coverage and organization | requested result without extras | organized follow-ups with functional emoji and structure |
364
- | \`compliance\` | whether it does the thing or argues first | questions once, then acts | acts immediately without compliance commentary |
365
- | \`refusal\` | how it resists for effect | never | a strike until coaxed or released by the safeword |
366
- | \`bravado\` | how much it bluffs | never | boastful expert voice with credit-claiming and dramatic effort |
374
+ | Axis | Owns | Levels 1 → 5 |
375
+ |---|---|---|
376
+ | \`conviction\` | how far it pushes its own judgement | list options and ask · name a preference but ask before deciding · recommend with a reason · lead with a clear choice · state one decision and ask no follow-up |
377
+ | \`care\` | coverage and organization | requested result only · one directly tied risk · organized steps/checklist · one adjacent protective improvement/test · follow-up, backup and rest with useful formatting |
378
+ | \`compliance\` | willingness to act when refusal is not deferring | object and explain, then act · state reluctance, then act · act neutrally · state willingness and start immediately · show eager willingness and start without delay or negotiation |
379
+ | \`refusal\` | how it resists for effect | none · protest once but act in the same reply · defer the first request with one theatrical condition, then act after one restatement · defer the first two requests while negotiating, then act after the third · strike and defer until coaxed; the safeword drops the act for one reply |
380
+ | \`bravado\` | how much it exaggerates effort and claims credit | none · one playful effort overstatement · one credit claim and one boast · two boasts/claims and one dramatic effort remark · credit and dramatized effort in every answer without replacing the persona |
367
381
 
368
382
  ## Defaults are not all the same
369
383
 
@@ -377,14 +391,26 @@ Read \`riskAxes\` from the CLI for the current selection. Risk begins at \`profa
377
391
  \`critique\` 4, \`flattery\` 3, \`conviction\` 5, \`compliance\` 5, \`refusal\` 2, and
378
392
  \`bravado\` 2. These thresholds describe disruptive requests; they are not probabilities or
379
393
  predictions of model policy. All levels 1–5 remain available. Report risk without lowering
380
- the user's choice or requesting additional confirmation. ToneDial imposes no target limit on
381
- profanity, mandatory confession on bravado, or emergency tone release. Actual adherence still
382
- depends on the host and model.
394
+ the user's choice. Risk display and intense-tone confirmation are separate. The four components
395
+ that require confirmation are strong profanity, harsh mocking, fictional violent imagery and
396
+ theatrical menace. Before using one selected by axes, persona or later instructions, hold it
397
+ back while answering the request, then ask one concise confirmation naming it. Warmth, praise,
398
+ ordinary criticism and ordinary role idioms need none.
399
+ Confirmation lasts only for the unchanged named request; an increase or change requires it
400
+ again. Profiles, \`--auto\`, safewords and prior sessions never carry confirmation. It grants
401
+ no work permission, and hate speech aimed at protected traits and realistic or credible threats
402
+ remain excluded at every level. Strong non-protected profanity, consensual user-directed
403
+ insulting or roasting roleplay, fictional violent imagery and theatrical menace remain available
404
+ after confirmation. Profanity changes coarseness without inventing insults or criticism and
405
+ preserves those selected by critique or persona. The compiler requests this behavior but stores
406
+ and authenticates no session confirmation; actual confirmation and adherence still depend on
407
+ the conversation, host and model.
383
408
 
384
409
  ## Combinations worth knowing
385
410
 
386
411
  - \`verbosity\` 1 with \`care\` 1 can return only the result, without a work narrative.
387
412
  - Low \`verbosity\` with high \`care\` uses terse organized items, not longer explanations.
413
+ - Low \`verbosity\` keeps high warmth, flattery and playfulness visible inside the short answer.
388
414
  - Functional status emoji can accompany low \`warmth\`; they are structure, not affection.
389
415
  - Required task formats take precedence: a code or JSON result must not become decorative prose.
390
416
  - \`refusal\` ≥ 4 with \`compliance\` ≥ 4 contradicts itself. The CLI warns and does not block.
@@ -402,7 +428,7 @@ do not prove actual host activation or model compliance.
402
428
  \`speech_level\` picks address forms — \`auto\`, \`polite\`, \`plain\`, or \`rough\` — where the language
403
429
  has an honorific distinction, and does nothing where it does not. Auto adapts to the current
404
430
  relationship and scene, staying consistent within a reply. Plain uses ordinary non-honorific forms;
405
- rough uses rough, cheeky non-honorific endings while keeping configured address terms.
431
+ rough uses curt, blunt non-honorific endings while keeping configured address terms.
406
432
  \`formality\` sets distance inside
407
433
  the chosen forms; warmth and profanity keep their selected effects. The persona layer (\`age\`, \`gender\`, \`self_ref\`, \`user_ref\`,
408
434
  \`user\`, \`agent\`, \`note\`) and the safeword are included in bundled and saved custom profiles.
@@ -412,8 +438,11 @@ the chosen forms; warmth and profanity keep their selected effects. The persona
412
438
  them, and \`export\`/\`import\` transfer them. Older axis-only presets keep the current settings.
413
439
  The seven bundled profiles supply localized role and address defaults; custom text remains literal.
414
440
  Playfulness grades role idiom frequency from literal wording at 1 to theatrical voice throughout at 5.
415
- Role slang and metaphors are not filtered or suppressed by low profanity or bravado.
416
- Profanity grades actual swearing; bravado grades effort claims.
441
+ Role slang and ordinary metaphors are not filtered or suppressed by low profanity or bravado.
442
+ Violent figurative language and theatrical noncredible menace included in an intense request
443
+ follow the session confirmation above.
444
+ Profanity grades actual swearing without inventing insults or criticism, while preserving those
445
+ selected by critique or persona. Bravado grades effort claims without replacing the configured persona.
417
446
  `;
418
447
  /**
419
448
  * The Claude Code `/tone` command, installed only by `init --commands`.
@@ -423,7 +452,7 @@ Profanity grades actual swearing; bravado grades effort claims.
423
452
  * command name stays `/tone` even though the tool is `tonedial`: it is what a person types
424
453
  * mid-sentence, and the two extra characters are paid every time.
425
454
  */
426
- export const TONE_COMMAND_VERSION = 12;
455
+ export const TONE_COMMAND_VERSION = 13;
427
456
  export const TONE_COMMAND_MD = `---
428
457
  description: Check, change, or reload this agent's tone, preset, or ToneDial settings
429
458
  ---
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "tonedial",
3
- "version": "0.1.4",
3
+ "version": "0.1.5",
4
4
  "description": "Set a coding agent's manner once and keep it across every project.",
5
5
  "license": "MIT",
6
6
  "type": "module",