Commit 02831b1e by luoqi

fix(措辞): 「打不完」是下判断 —— 引导节点名改「最忙的那位」

产品定过:那条引导**只报数、不下判断**( 不说「打不完」「人太多了」
「建议减到 200」)。卡片也确实照做了:
    「这批发下去,最忙的是王强:手上共 45 条,约 3 天的量」

但 `GUIDANCE_KIND.daily_overload` 的值是 **'打不完'** —— 而那张表是
**给模型用的名字**,代码自己的注释就写着「它会出现在模型嘴里」。
⇒ 等于让助手替主管说出卡片刻意不说的那句判断。
️ 而且界面上**一处「打不完」也没有**(实测 0 命中)——
   那是只活在代码里的词,同时踩了②诚实层「使用者的词汇表就是他在界面上见过的那些」。

改:节点名 → 「最忙的那位」(与卡片同源);两处工具描述里的解释一并改成只报数的说法。

 **另外三个节点没动** —— 逐个对过卡片,它们是中性描述、不是判断:
    待分配   ← 卡片「N 人的专属客服这轮已排满」,且界面确有该分组
    换个条件选 ← 卡片「这一格 N 人,也可以只选其中一类」
    本批人数  ← 卡片「本批 N 人 = 在岗 × 每天 × N 天」
  `mcp-server.factory` 那处「超了」也没动:它是**反例引用**
  (「实测编过『可能是超了撤销窗口』… 不要自己编原因」),反例允许留。

■ 提示词版本规则有个缺口,一并补上
  原文只写「改动①〜⑤任意一层的正文必须 bump」⇒ 改工具描述不 bump、版本号照旧,
  而**工具描述占模型上下文的大头**(实测每轮约 11K token,比五层还多),
  改了行为会变、回放却对不上,且不会有任何报错。
  ⇒ 规则改为「模型看得见的任何常驻文本」:五层正文 + 工具描述 + 给模型的固定标识。
  本次动了后两者 ⇒ bump 到 assistant@2026-08-17-a。

■ 「打不完」加进《用词一致性》守卫(️ 已变异校验:塞回节点名立刻变红)

■ 同批复查、确认干净的三条(都是这份文件头自己定的规矩)
  ·  别把 UI 部件名写进①②③ —— 0 处
  ·  别把内部键名写进提示词 —— 0 处
  ·  提示词正文不许出现禁词表里的词(写库/水位/无主/打不完)—— 0 处

验证:tsc 通过;jest 87 套 1355 例全过;eslint 无新增错误。
parent d5132fca
...@@ -109,12 +109,17 @@ import { Permission } from '@pac/types'; ...@@ -109,12 +109,17 @@ import { Permission } from '@pac/types';
/** /**
* 提示词版本 —— 落进 `agent_invocations.prompt_version`,是回放「当时那份提示词长什么样」的**唯一锚**。 * 提示词版本 —— 落进 `agent_invocations.prompt_version`,是回放「当时那份提示词长什么样」的**唯一锚**。
* *
* 🔴 **改动 ①〜⑤ 任意一层的正文,必须 bump 这个值**(连同当天日期)。 * 🔴 **改动模型看得见的任何常驻文本,必须 bump 这个值**(连同当天日期):
* · ①〜⑤ 任意一层的正文
* · **工具描述**(它占模型上下文的大头 —— 实测每轮约 11K token,比五层还多)
* · **给模型的固定标识**(如 `GUIDANCE_KIND` 的中文名,它会出现在模型嘴里)
* ⚠️ 原来这条只写了"五层",于是改工具描述不 bump、版本号照旧 ——
* 回放时"当时那份提示词长什么样"就对不上了,而且不会有任何报错。
* ⚠️ 系统提示词**不逐行落库**:主管那份 6.9 KB 每次一模一样,逐行存等于把同一份东西 * ⚠️ 系统提示词**不逐行落库**:主管那份 6.9 KB 每次一模一样,逐行存等于把同一份东西
* 抄一万遍。审计靠「这一行的 promptVersion + 代码里那个版本的正文」两边对 —— * 抄一万遍。审计靠「这一行的 promptVersion + 代码里那个版本的正文」两边对 ——
* ⇒ 版本不 bump,这条链就断了,而断了不会有任何报错。 * ⇒ 版本不 bump,这条链就断了,而断了不会有任何报错。
*/ */
export const ASSISTANT_PROMPT_VERSION = 'assistant@2026-08-16-b'; export const ASSISTANT_PROMPT_VERSION = 'assistant@2026-08-17-a';
/** /**
* ① 装置 —— 你是谁、和使用者什么关系、你看不见什么。 * ① 装置 —— 你是谁、和使用者什么关系、你看不见什么。
......
...@@ -646,7 +646,7 @@ export class AssistantService { ...@@ -646,7 +646,7 @@ export class AssistantService {
'待分配 = 有人卡着没发出去、等他定去向;' + '待分配 = 有人卡着没发出去、等他定去向;' +
'换个条件选 = 这一格可以只选其中一类人,重出一版;' + '换个条件选 = 这一格可以只选其中一类人,重出一版;' +
'本批人数 = 这一批发多少人,可以调;' + '本批人数 = 这一批发多少人,可以调;' +
'打不完 = 按当前时限算这批打不完,可以调时限或每天几通。' + '最忙的那位 = 分完之后最忙那位手上的量,超过了「每天几通 × 时限」;可以调时限或每天几通。' +
'\n⚠️ 只能开放**这一版真的有**的那几类;没有的会被退回,并告诉你这一版有哪几类。', '\n⚠️ 只能开放**这一版真的有**的那几类;没有的会被退回,并告诉你这一版有哪几类。',
}, },
}, },
......
...@@ -581,7 +581,7 @@ export class AssistantLabController { ...@@ -581,7 +581,7 @@ export class AssistantLabController {
'待分配 = 有人卡着没发出去、等他定去向;' + '待分配 = 有人卡着没发出去、等他定去向;' +
'换个条件选 = 这一格可以只选其中一类人,重出一版;' + '换个条件选 = 这一格可以只选其中一类人,重出一版;' +
'本批人数 = 这一批发多少人,可以调;' + '本批人数 = 这一批发多少人,可以调;' +
'打不完 = 按当前时限算这批打不完,可以调时限或每天几通。' + '最忙的那位 = 分完之后最忙那位手上的量,超过了「每天几通 × 时限」;可以调时限或每天几通。' +
'\n⚠️ 只能开放**这一版真的有**的那几类;没有的会被退回,并告诉你这一版有哪几类。', '\n⚠️ 只能开放**这一版真的有**的那几类;没有的会被退回,并告诉你这一版有哪几类。',
}, },
}, },
......
...@@ -110,7 +110,12 @@ export const GUIDANCE_KIND: Readonly<Record<string, string>> = { ...@@ -110,7 +110,12 @@ export const GUIDANCE_KIND: Readonly<Record<string, string>> = {
pending: '待分配', pending: '待分配',
narrow: '换个条件选', narrow: '换个条件选',
batch_size_basis: '本批人数', batch_size_basis: '本批人数',
daily_overload: '打不完', // 🔴 「最忙的那位」⛔ 不叫「打不完」——「打不完」是**下判断**,而这条引导的卡片
// 刻意只报数(「最忙的是王强:手上共 45 条,约 3 天的量」)。这个名字会出现在
// 模型嘴里(见上方注释),叫「打不完」等于让它替主管说出卡片刻意不说的那句话;
// 而且界面上一处「打不完」都没有 —— 那是只活在代码里的词(②诚实层:使用者的
// 词汇表就是他在界面上见过的那些)。
daily_overload: '最忙的那位',
}; };
/** `show_guidance` 的取值域 —— 与上表同源,⛔ 别另写一份。 */ /** `show_guidance` 的取值域 —— 与上表同源,⛔ 别另写一份。 */
......
...@@ -17,6 +17,14 @@ const ROOTS = ['src', '../pac-web/src', '../../packages/types/src']; ...@@ -17,6 +17,14 @@ const ROOTS = ['src', '../pac-web/src', '../../packages/types/src'];
const RETIRED: Array<[RegExp, string]> = [ const RETIRED: Array<[RegExp, string]> = [
[/无主/, '无专属'], [/无主/, '无专属'],
[/时效/, '时限'], [/时效/, '时限'],
/**
* 🔴 「打不完」是**下判断**,而那条引导的卡片刻意只报数
* (「最忙的是王强:手上共 45 条,约 3 天的量」)。
* ⚠️ 它曾经是 `GUIDANCE_KIND.daily_overload` 的值 —— 而那个值**会出现在模型嘴里**,
* 等于让助手替主管说出卡片刻意不说的那句话;界面上一处「打不完」也没有。
* ⛔ 同类禁词:几乎每批都会有人超,说成故障主管就会开始怀疑系统。
*/
[/打不完/, '最忙的那位(只报数,⛔ 不下判断)'],
]; ];
/** ⛔ 语义不同的例外(临床禁忌有效期 / 话术语气紧迫),⛔ 别连坐 */ /** ⛔ 语义不同的例外(临床禁忌有效期 / 话术语气紧迫),⛔ 别连坐 */
const EXEMPT = /clinical-signals|persona-feature-specs|signal-extractor|contraindication|shared\/tone/; const EXEMPT = /clinical-signals|persona-feature-specs|signal-extractor|contraindication|shared\/tone/;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment