Skip to content

C4|Personality:只改说话方式,不改能力 ​

先别把语气开关当成另一种模型 ​

读完 C1–C3,下一件错事是把「Friendly / Pragmatic」理解成换模型、换工具集,或写进 AGENTS.md 当项目政策。再下一步是在 TUI 的 slash 列表里找 /personality,找不到就以为功能删了。

判断先说清楚:Personality 是模型指令里的语气段落,不是能力旋钮。 协议上仍有 None / Friendly / Pragmatic 三个值;当前 harness 里真正会改 prompt 的,几乎只剩 None:把 # Personality 整节剥掉。Friendly 和 Pragmatic 不再换成两套模板。工具、沙箱、模型 slug、Memories、Pets 都不走这条路径。


1. 三个值还在协议上,活着的控制是 opt-out ​

Personality 枚举(protocol/src/config_types.rs:331-335):

text
none | friendly | pragmatic

它出现在 thread / turn 设置上:TurnStartParams.personality 注释写的是「Override the personality for this turn and subsequent turns」(app-server-protocol/.../v2/turn.rs:250-252)。Config.personality 同样是 Option<Personality>(core/src/config/mod.rs:651-652)。Step 设置会记住所选值(step_settings.rs:116-117, 294-296),TurnContext 的 personality() 标明是 legacy:冻的是初始 turn,新代码应从 StepContext::settings 读(turn_context.rs:373-376)——寿命切分和 A2 的冻结/重算一致,但它冻的是语气,不是沙箱。

模型目录曾经用 和 personality_friendly / personality_pragmatic 拼指令。这段已经废了:get_model_instructions 忽略 personality 参数,原样返回 instructions_template(protocol/src/openai_models.rs:534-547)。测试钉死四种取值(含 Friendly / Pragmatic / None)得到同一字符串(:1292-1320)。instructions_variables 只为解码旧目录而留着(:551-554)。

当前默认语气写死在 fallback / 模型 prompt 的 # Personality 节,例如:

Your default personality and tone is concise, direct, and friendly. …(protocol/src/prompts/base_instructions/default.md:13-15)

models-manager 在 feature 开着且显式 Personality::None 时,调用 strip_personality_section:从恰好一行 # Personality 切到下一个 H1(model_info.rs:17, 63-71, 76-102)。Friendly / Pragmatic / 未设置都 保留 这一节(model_info_tests.rs:196-201)。TUI 往 turn/start 送 personality 时只转发 None:personality_opt_out_only(tui/src/app_server_session.rs:1828-1830),注释写明 Keep the explicit Bridge opt-out while retiring Friendly/Pragmatic selection。

所以历史上的「/personality:Friendly / Pragmatic / None」对应的是 协议和旧 UX。当前 TUI slash 表没有 Personality 项(slash_command.rs 有 /pet、/memories,没有 personality)。IDE / SDK 仍可传这三个值;Friendly、Pragmatic 被接受(turn_start_accepts_deprecated_personality_override_v2),但 不再换成另一套说话稿。要关掉烘好的语气,只能选 None。

Feature::Personality 默认 开,而且配置里写 features.personality = false 会校验失败(config_manager_service_tests.rs:1559-1561)。这不是「能力开关」,是「允许语气选择这条设置存在」;关不掉 feature,只表明它不是沙箱那种可关的权限。

没有「只剥一节、不换模型」会怎样?语气开关会去改 model 或 sandbox_mode;或者 Friendly/Pragmatic 继续拼进模板,cache 因整段 system 重写而 miss。现在默认稿烤在指令里,opt-out 是一次有界的字符串手术,符合 B4「少改已发出的上下文」。


2. 它碰不到工具、沙箱、模型能力 ​

Personality 进的是 模型 instructions 文本,不是 ToolRouter,不是 AskForApproval,不是 SandboxPolicy。

turn/start 上 personality 和 approval_policy、sandbox_policy、model、effort 是并列字段(v2/turn.rs)。改语气不会:

  • 增删 exec_command / apply_patch(B2)
  • 把 workspace-write 拧成 danger-full-access(B3)
  • 换模型 slug 或 provider(那是 /model)
  • 打开 Memories 或 Chronicle(C2 / C3)

Collaboration mode 的注释甚至写:mode 优先于 model、effort 和 developer instructions(turn.rs:258-259)。Personality 连这场优先级比赛都没上场。Guardian、ExecPolicy、未信任项目,都不读这个枚举。

没有这条边界会怎样?「Pragmatic」被理解成少问审批、「Friendly」被理解成更愿意 request_user_input。语气会污染同意旋钮。代码把它们放在不同的 struct 字段里,就是为了不让产品文案把两件事说成一件。


3. 和 Memories、Pets、AGENTS.md 的分工 ​

四样东西都像「让 Codex 更像我」,寿命和效力完全不同。

改什么不改什么住哪
Personality模型指令里 # Personality 是否出现工具、沙箱、记忆内容thread/turn 设置;默认烤在模型 prompt
Memories跨 thread 的本机笔记项目政策、语气模板$CODEX_HOME/memories/,feature 默关
Pets终端里一只状态灯模型可见世界/pet:「choose or hide the terminal pet」(slash_command.rs:61, 120);E8:不准进 ToolRouter
AGENTS.md仓库里的可执行政策你的口头禅git;未信任不加载

把「请简洁」写进 AGENTS.md:每个克隆仓库的人都会被这份口吻绑住。把「这个 repo 必须 just test」写进 Personality:语气段落里没有测试命令,模型当闲聊。把宠物皮肤当「更友好」:Pets 连 prompt 都不进。C2 已经说过,个人偏好进 Memories,项目约束进 AGENTS.md;说话方式既不是偏好笔记,也不是政策。

Pets 和 Personality 尤其容易混:都像「个性化」。Pets 是 TUI 装饰,E8 会写它甚至不该出现在工具列表。Personality 至少还进模型 instructions。一个给人看,一个给模型看,都 零副作用。


4. 写进 git 还是写进设置 ​

默认 friendly 语气来自模型 / fallback prompt,不是你仓库里的文件。要全局关掉,设 personality = "none"(用户 config.toml 或 thread 设置),让 strip_personality_section 干活。不要在 AGENTS.md 里复制一整段「请简洁友好」——那是在用项目政策模拟一条已经烤好的指令,还浪费 32 KiB 预算。

SDK / app-server 仍暴露 personality 参数(Python thread_start(..., personality=None))。传 friendly / pragmatic 目前是兼容字段,不要指望它再换成两套人设。传 none 才是文档化的 opt-out。


5. 结语:带走一句话 ​

Personality 是模型指令上的语气开关,不是能力开关——三个枚举值还在协议里,当前真正生效的几乎只有 None 把 # Personality 整节去掉;工具、沙箱、Memories 和那只宠物都不归它管。