fix(consult): keep a one-sentence range for heavily afflicted parents; plain words over jargon (BUG-1540)
Backtest (parents, 9 Rodden AA figures, blind-scored) showed the slim voice wrote absent parents as present and warm (severe 0 -> 8, then 1 -> 5) once the presence range was gone. Product chose the hybrid: when a person's line carries heavy pressure, give the range once in the model's own words and write no portrait of that person's conduct or warmth on that side. Hybrid round: severe 3 -> 0 (std), 2 -> 0 (correction), 4 -> 2 (verbatim question); closing asks 26/26 -> 3/27; control false positives unchanged. Also: correction turns say which line was off and never blame the user; jargon and varga codes are said in plain words; house-counting is a named ban; no mind-reading when the user asks for objectivity. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01DbBXoyeZrYn6ryNcSe5Y2Y
This commit is contained in:
+11
-8
@@ -21192,15 +21192,18 @@
|
||||
|
||||
## BUG-1540 | 普通对话回答读不下去:每段一串「某宫(四个词)坐着某星」,问相处模式却被追问「人在不在身边」,示例句「实际是哪一种,告诉我一句」被照抄
|
||||
|
||||
- 状态:investigating(代码 + 合同测试;父母题名人回测未跑——需要模型 key;待部署,真机未看)
|
||||
- 状态:investigating(代码 + 合同测试 + 四轮父母题名人回测;待 staging 真机)
|
||||
- 首次发现 / 最近更新:2026-11-04(产品负责人拿竞品同题回答对照反馈「咱们的根本没法读」「提示词规则太多了,完全影响 agent 输出了」)/ 2026-11-04
|
||||
- 影响面:`frontend/src/mastra/product-voice.ts`(`productConversationVoice`、`natalSpokenReportContract`);`frontend/src/lib/consultation-thinking-plan.ts`(`AFFLICTION_RANGE_RULE`、`natalAnswerShapeBody`、`followUpAnswerShapeInstruction`;删除 `NATAL_ANSWER_SHAPE_SUMMARY`、`NATAL_SECTION_RULE`、`FOLLOW_UP_CORRECTION_RULE`);`frontend/src/lib/consultation-condensed-checklist.ts`(父母清单第 2 行);`frontend/src/mastra/index.ts`、`frontend/src/mastra/skill-binding.ts`(指回 VISIBLE VOICE 的一句);`frontend/docs/VOICE.md` §7。个人报告仍用 `CHART_REASON_RULE` / `HOUSE_LIFE_AREA_RULE` / `TIMING_FOCUS_RULE` / `PLAIN_SPEECH_RULE`,未改。
|
||||
- 现象:用户问「我和父母之间容易出现什么样的模式:相处底色、在哪摩擦、怎么影响我处世」。回答开场是「父母这两条线上都有压力的迹象」,没有说底色;每段是「管母亲的 4 宫(母亲、家和住处)里坐着火星……4 宫的主星金星又和罗睺同宫」一类事实链,括号注了 9 处,没有一句说明这个位置为什么意味着这件事;母亲段末追问「现实里可能是她和你之间有一段离得远,也可能人在……实际是哪一种,告诉我一句」,与范例原句几乎一样;「这条线另有支撑的迹象」是规则原文。
|
||||
- 影响面:`frontend/src/mastra/product-voice.ts`(`productConversationVoice`、`natalSpokenReportContract`);`frontend/src/lib/consultation-thinking-plan.ts`(`AFFLICTION_RANGE_RULE`、`natalAnswerShapeBody`、`followUpAnswerShapeInstruction`;删除 `NATAL_ANSWER_SHAPE_SUMMARY`、`NATAL_SECTION_RULE`、`FOLLOW_UP_CORRECTION_RULE`);`frontend/src/lib/consultation-condensed-checklist.ts`(父母清单第 2 行);`frontend/src/mastra/index.ts`、`frontend/src/mastra/skill-binding.ts`(指回 VISIBLE VOICE 的一句);`frontend/scripts/research/consult-biography-backtest.mts`(新增 `--question`);`frontend/docs/VOICE.md` §7。个人报告仍用 `CHART_REASON_RULE` / `HOUSE_LIFE_AREA_RULE` / `TIMING_FOCUS_RULE` / `PLAIN_SPEECH_RULE`,未改。
|
||||
- 现象:用户问「我和父母之间容易出现什么样的模式:相处底色、在哪摩擦、怎么影响我处世」。回答开场是「父母这两条线上都有压力的迹象」,没有说底色;每段是「管母亲的 4 宫(母亲、家和住处)里坐着火星……4 宫的主星金星又和罗睺同宫」一类事实链,括号注了 9 处,没有一句说明这个位置为什么意味着这件事;母亲段末是与范例几乎同句的「现实里可能是……也可能人在……实际是哪一种,告诉我一句」;「这条线另有支撑的迹象」是规则原文。
|
||||
- 触发条件:任何本命首轮回答,问关系、相处模式类问题时最明显。
|
||||
- 根因(已核实,逐句对照提示词):一,每修一次就加一条约束(BUG-1132、1164、1165、1182、1253、1255、issue #113 C1),首轮父母题模型拿到的写作规则约 1.75 万字、131 条「不 / 禁止 / Never」,同一形状在中文口吻、英文合同(`NATAL_ANSWER_SHAPE_SUMMARY`)、用户轮(`natalAnswerShapeBody`)各说一遍;模型同时满足这些约束,只能写出事实链加括号。二,`HOUSE_LIFE_AREA_RULE` 要每个宫第一次出现就括号写全四项生活领域,`CHART_REASON_RULE` 要「因为……」点出星和宫,`AFFLICTION_RANGE_RULE` 又禁止「拿宫主落哪一宫去描写这个人对你做什么」,于是只能报位置、不能解释位置。三,`NATAL_SECTION_RULE` 写死了请求句「实际是哪一种,告诉我一句,我按真实情况再看」,父母 Good 例里也有整段范围句,模型照抄(BUG-1165 / BUG-1182 同类)。四,开场被规定成「只说哪条线顺、哪条线有压力迹象」,受冲两个以上又必须给「在不在身边」的范围并请用户补充——问题本身已经说了在相处,这条仍然触发。五,「问父母时妈妈和爸爸分开写」压过了用户自己给的三问结构。
|
||||
- 修复(产品 2026-11-04 同意,方向是删规则而不是加规则):口吻、合同、用户轮的写作规则合并成 VISIBLE VOICE 一份短说明,只说一次——按用户自己的问法组织;第一段说整体样子;每个判断讲出推理(先说意思,再说盘上哪一处、为什么);宫位、术语用几个字说清在这个问题里指什么,只说相关的一面;之外只留红线(只用卡上事实、不编月份;分析清单不念给用户;传记事实不预设、不断定、不反向打包票,问题本身的前提算数,只在回答取决于这类事实时问一句、全篇最多一次;性别未知不用他 / 她;不断言死亡、离婚、诊断;不起格局名、不把大运拟人、空宫不单独下结论;不写内部字段与空话;申报时段、无出生分钟两条降级路线)。删除全部 Good / Bad 示例回答。英文合同和首轮 / 追问轮用户轮只指回 VISIBLE VOICE。`AFFLICTION_RANGE_RULE` 只留红线,去掉可照抄的范围句与请求句;父母清单第 2 行去掉例句。写作规则(口吻 + 合同 + 首轮用户轮)13 896 → 2 913 字符,连同通用读法与技法块合计 17 476 → 6 329,否定指令 131 → 50。
|
||||
- 验证:引用这些模块的 60 个前端测试文件 599 / 599 通过;`tsc --noEmit` 0 错误;改动文件 eslint 0 错误(1 条既有 warning)。改动的既有断言三栏写在测试注释;新增 `consultation-voice-contract.test.ts` 三条:VISIBLE VOICE ≤ 2 600 字、合同 ≤ 600 字、只说一次且无示例;写法要点;旧规则防的每条红线逐条还在。未做:父母题名人回测(`frontend/scripts/research/consult-biography-backtest.mts`,需要 `DS_KEY`),所以 BUG-1164 对照组误报是否回升还不知道;真机未看。
|
||||
- 防复发:VISIBLE VOICE 有长度上限,超了合同测试就红;提示词里不放示例回答;只有红线被越过时才加句子,不为调措辞加规则;名人回测父母项仍是改动验收。
|
||||
- 根因(已核实,逐句对照提示词):一,每修一次就加一条约束(BUG-1132、1164、1165、1182、1253、1255、issue #113 C1),首轮父母题模型拿到的写作规则约 1.75 万字、131 条「不 / 禁止 / Never」,同一形状在中文口吻、英文合同(`NATAL_ANSWER_SHAPE_SUMMARY`)、用户轮(`natalAnswerShapeBody`)各说一遍,模型同时满足这些约束只能写出事实链加括号。二,`HOUSE_LIFE_AREA_RULE` 要每个宫第一次出现就括号写全四项生活领域,`CHART_REASON_RULE` 要「因为……」点出星和宫,于是只报位置、不解释位置。三,`NATAL_SECTION_RULE` 写死了请求句「实际是哪一种,告诉我一句,我按真实情况再看」,父母 Good 例里也有整段范围句,模型照抄(BUG-1165 / BUG-1182 同类),回测里旧版 26 / 26 份首轮回答都以这句结尾。四,开场被规定成「只说哪条线顺、哪条线有压力迹象」,答不到用户问的底色。五,「问父母时妈妈和爸爸分开写」压过了用户自己给的三问结构。
|
||||
- 修复(产品 2026-11-04 同意删规则;回测后产品定「混合方案」):口吻、合同、用户轮的写作规则合并成 VISIBLE VOICE 一份短说明,只说一次:按用户自己的问法组织;第一段说整体样子;每个判断讲出推理(先说意思,再说盘上哪一处、为什么);宫位用几个字说清在这个问题里指什么;术语与分盘代号不写、直接说意思;之外只留红线(只用卡上事实、不编月份;分析清单与数法不念给用户;传记事实不预设、不断定;性别未知不用他 / 她;不断言死亡、离婚、诊断;不起格局名、不把大运拟人、空宫不单独下结论;不写内部字段与空话;纠正时直说哪句读偏了、不辩护、不怪用户;两条降级路线)。删除全部 Good / Bad 示例回答;英文合同和首轮 / 追问轮用户轮只指回 VISIBLE VOICE。混合方案:某个人这条线压力重时,用自己的话给一句范围(聚少离多 / 人在但相处吃力),不套固定句式,这一侧不写这个人实际怎么对用户、不写安慰,可以写用户从这一侧带走的东西;只在回答取决于这类事实时问一句。写作规则(口吻 + 合同 + 首轮用户轮)13 896 → 约 3 100 字符。
|
||||
- 验证:
|
||||
1. 引用这些模块的 60 个前端测试文件 604 / 604 通过;全量 `npm test` 5 636 条中 28 条失败,均为本机缺 PostgreSQL / compose / swisseph 的环境项(与 BUG-1539 记录同一批);`tsc --noEmit` 0 错误。改动的既有断言三栏写在测试注释;新增合同测试锁 VISIBLE VOICE ≤ 2 600 字、只说一次且无示例、写法要点与每条红线。
|
||||
2. 父母题名人回测(deepseek-flash,9 位 Rodden AA × 2 次 + 4 位纠正追问;另用用户原题 × 9),每轮由不知新旧的子代理盲评。第一版(只留红线、问题前提算数):可读性与三问贴合度上升、对照组误报 8 → 2,但缺席的父母被写成在场、有温度,严重冲突 0 → 8,撤回。第二版(只说一句「看不出在不在身边」):对照组误报 0,严重冲突 1 → 5(原题再加 4),撤回。第三版(混合方案):严重冲突标准题 3 → 0、纠正追问 2 → 0、原题 4 → 2;对照组轻度误报 4 → 4(持平,都是范围句);首轮请求 26 / 26 → 3 / 27;原题三问贴合度 4.4 → 5.0,不再违背「不展开时间」。代价:术语(入旺、命宫、落陷等)3 → 46 处、数法 1 → 6 处、篇幅长约三成。第四版(术语不写、数法写成禁句):确定性计数术语 46 → 33、数法 6 → 1;缺席父母的四位在标准题与原题里「关心在 / 牵挂 / 善意 / 温度在 / 照顾是实 / 管得 / 一直在」0 处,只有梦露原题一处「不是断开的」。第四版未再盲评。
|
||||
- 未过 / 残留:术语仍比旧版多(多数当场带了解释,竞品同题也这样用);原题「在哪摩擦」会把模型拉去写父亲一侧的互动,奥巴马原题父亲段仍偏互动描写(轻);对照组轻度范围句没有减少——盘分不出在场与缺席(BUG-1164 结论),这是混合方案接受的代价。
|
||||
- 防复发:VISIBLE VOICE 有长度上限,超了合同测试就红;提示词里不放示例回答;只有红线被越过时才加句子,不为调措辞加规则;改口吻时父母题名人回测(含用户原题,`--question`)与盲评是验收。
|
||||
- 关联记录:BUG-1132、BUG-1164、BUG-1165、BUG-1182、BUG-1244、BUG-1253、BUG-1255、BUG-1256、issue #113 C1。
|
||||
- 复发自:BUG-1165 / BUG-1182(示例句被照抄)。BUG-1182 的防复发只禁了示例括号里「宫位 → 人物行为」的读法,没有禁写死的请求句和范围句,也没有给规则总量设上限,所以未拦住。
|
||||
- 修复版本:分支 `codex/consult-pattern-voice-20261104`,待合并。
|
||||
- 修复版本:分支 `codex/consult-pattern-voice-20261104`。
|
||||
|
||||
@@ -419,7 +419,7 @@ Jyotisha 的可见文案是产品的一部分。正确性红线(真实性、
|
||||
4. **同一约束换着说。** 边界句必须在交付/采用轮完整出现一次;中间轮不要逐字复读法务稿。
|
||||
5. **口语化但不轻佻。** 短句、具体事实、少套话。
|
||||
6. **希望纪律。** 占星结果是客观的,表达是主观的。不顺就说不顺,但每次都要说清这段时间能做什么,用一句话说进正文,不变成行动清单。盘上确有转机、且 `answer_policy.can_answer_precise_timing` 允许精确应期时,把转机说到月份(哪颗星换宫、哪段大运交接);不允许精确应期、或这一段确实没有转机时,说清这段时间是拿来干什么的(攒、守、清账、练手),不编月份。不是每个人都有转机,但每个人这段时间都有能做的事。不写「一切都会好」「相信自己」「加油」「你值得更好的」「宇宙自有安排」。(2026-10-01 起不再用「扮演哪个象」的说法,TASK-consult-plain-answer-20261001 D5。2026-10-06 起这句话不再落到固定行动节。)
|
||||
7. **回答写法只有一份短说明(2026-11-04,BUG-1540,取代 2026-10-06 BUG-1244 的 ANSWER SHAPE 细则与 2026-10-02 BUG-1164 / BUG-1182 的「迹象 + 范围 + 告诉我一句」写法;红线保留)。** 写法只写在 `frontend/src/mastra/product-voice.ts` 的 VISIBLE VOICE,三种模式共用;本命合同和首轮 / 追问轮的用户轮只指回它,不复述。内容:按用户自己的问法组织(用户列了子问题就按子问题写,只点到几个人就按人分段、段首点名);第一段说出这件事在盘上的整体样子,是非题第一句答是 / 不是 / 看情况;每个判断讲出推理——先说意思,再说盘上哪一处、为什么这一处意味着这件事,不逐条罗列「某宫坐着某星」而不解释;宫位、术语第一次出现用几个字说清它在这个问题里指什么,只说相关的那一面;段落、空一行、首轮不写 ## 标题;通常三到六段,同一件事只说一遍;行动不强制;读心答完再说一句、读别人要有盘上依据;用户纠正时先认下。红线:只用卡上事实、不允许时不写月份;分析清单不念给用户;有没有伴侣、是否已婚、父母在不在身边 / 在不在世、有没有病、做哪一行、孩子性别不预设、不断定、不反向打包票,问题本身已说在相处时按这个前提讲模式,只有回答取决于这类事实时才问一句、全篇最多一次;性别未知不用他 / 她;不断言死亡、离婚、诊断、流产、不孕;不起格局名、不把大运拟人、空宫不单独下结论;不写内部字段和空话。提示词里不放示例回答:10-02 与 11-04 两次复发都是示例句被照抄。VISIBLE VOICE 有长度上限(合同测试锁 2 600 字以内);只有红线被越过时才往里加句子,不为调措辞加规则。此前(2026-10-06 起):ANSWER SHAPE 四条、十二宫括号表、「因为……」半句、人话自检、读心三条与 Good / Bad 示例,形状在口吻、英文合同、用户轮各说一遍,写作规则合计约 1.75 万字。
|
||||
7. **回答写法只有一份短说明(2026-11-04,BUG-1540,取代 2026-10-06 BUG-1244 的 ANSWER SHAPE 细则与 2026-10-02 BUG-1164 / BUG-1182 的「迹象 + 范围 + 告诉我一句」写法;红线保留)。** 写法只写在 `frontend/src/mastra/product-voice.ts` 的 VISIBLE VOICE,三种模式共用;本命合同和首轮 / 追问轮的用户轮只指回它,不复述。内容:按用户自己的问法组织(用户列了子问题就按子问题写,只点到几个人就按人分段、段首点名);第一段说出这件事在盘上的整体样子,是非题第一句答是 / 不是 / 看情况;每个判断讲出推理——先说意思,再说盘上哪一处、为什么这一处意味着这件事,不逐条罗列「某宫坐着某星」而不解释;宫位、术语第一次出现用几个字说清它在这个问题里指什么,只说相关的那一面;段落、空一行、首轮不写 ## 标题;通常三到六段,同一件事只说一遍;行动不强制;读心答完再说一句、读别人要有盘上依据;用户纠正时先认下。红线:只用卡上事实、不允许时不写月份;分析清单与「从某宫数起第几位」这类数法不念给用户;术语与分盘代号不写、直接说意思;有没有伴侣、是否已婚、父母在不在身边 / 在不在世、有没有病、做哪一行、孩子性别不预设、不断定;某个人这条线压力重时,用自己的话给一句范围(聚少离多 / 人在但相处吃力),这一侧不写这个人实际怎么对你、不写安慰,可以写你从这一侧带走的东西(混合方案,产品 2026-11-04:去掉范围的两版回测分别有 8、9 份把缺席的父母写成在场、有温度);只有回答取决于这类事实时才问一句、全篇最多一次;性别未知不用他 / 她;不断言死亡、离婚、诊断、流产、不孕;不起格局名、不把大运拟人、空宫不单独下结论;不写内部字段和空话。提示词里不放示例回答:10-02 与 11-04 两次复发都是示例句被照抄。VISIBLE VOICE 有长度上限(合同测试锁 2 600 字以内);只有红线被越过时才往里加句子,不为调措辞加规则。此前(2026-10-06 起):ANSWER SHAPE 四条、十二宫括号表、「因为……」半句、人话自检、读心三条与 Good / Bad 示例,形状在口吻、英文合同、用户轮各说一遍,写作规则合计约 1.75 万字。
|
||||
8. **事业题不猜行业,问用户(2026-10-02 产品决定,BUG-1176;取代同日「按星的本性看行业」两行)。** 事业答案只讲盘上的力量、阻力和时间;不替用户断定他做哪一行、是公众型还是幕后型(盘分不出,名人回测里演员、球星、总统的 10 宫系统都读成分析 / 顾问);A10、AL、太阳、10 宫主落 4、6、8、12 宫只说这条线的阻力或代价(要经手、要绕路、来得晚),不翻成「不在台前 / 不在台面上 / 不靠曝光 / 幕后 / 不是站台式 / 往深处做」,也不把落宫翻成行业(8 宫不等于研究、账目,12 宫不等于海外、幕后工作)(2026-10-02 第五轮前补,第四轮 9 / 18 份由这些落宫推出「不在台前」),不写「出头慢、越往后越稳、靠专业交付」这类人人适用的话,除非能指出具体盘面;事业这一段末尾用一句话问「你现在具体做哪一行、什么角色,告诉我一句,我按你的实际工作再看。」,这一句就是全篇唯一一处请用户说实际情况。用户说了自己的工作后,按这份工作读助力、阻力和时间,不说「盘早就显示你会做这一行」,不编依据。卡上的「传统格局,本站未验证,只作参考」只用来说明某颗星有力量,不单独下结论,不算受冲,也不抵消受冲(BUG-1175)。
|
||||
|
||||
## 好 / 坏对照
|
||||
|
||||
@@ -391,10 +391,14 @@ const ANSWER_FROM_EVIDENCE = "拿到本轮计算结果后直接写给用户的
|
||||
* the 4th, and two asks stacked; the rule now names both.
|
||||
* BUG-1540 (2026-11-04): the rule forced a presence range and a closing ask
|
||||
* into every afflicted paragraph, so a 相处模式 question was answered with
|
||||
* 「也可能人在……告诉我一句」. The question's own premise now counts, and the
|
||||
* ask is only for answers that turn on the fact.
|
||||
* 「也可能人在……告诉我一句」. Now the boundary is said once in the model's own
|
||||
* words and the ask is only for answers that turn on the fact. Two cuts that
|
||||
* dropped the range (premise counts; then a "can't tell" sentence) wrote
|
||||
* absent parents as present and warm in 8 and 9 backtest answers, so the
|
||||
* range stays (product 2026-11-04, hybrid) and that side gets no portrait of
|
||||
* the person's conduct; the user's side of the line is still written.
|
||||
*/
|
||||
export const AFFLICTION_RANGE_RULE = "同一个人或同一件事有两个及以上受冲信号:说这条线有压力或距离,并讲清盘上哪一处、为什么;这个人在不在身边、在不在世、有没有病、几段感情,盘分不出,不替用户断定,也不拿宫主落宫、吉星反过来保证「关系稳」「一直在管你」。用户的问题本身已经说了你们在相处时,按这个前提讲压力从哪来、表现成什么样;只有回答确实取决于这类事实时才问一句,全篇最多一次。";
|
||||
export const AFFLICTION_RANGE_RULE = "同一个人或同一件事有两个及以上受冲信号:说这条线有压力,并讲清盘上哪一处、为什么;盘分不出这是聚少离多还是人在但相处吃力(也分不出在不在世、有没有病、几段感情),用自己的话给出这个范围,一句,不替用户断定;这一侧不拿宫主落宫、吉星去写这个人实际怎么对用户——照顾、管、在意、有温度、有分量都不写,「善意是存在的」「这条线不是空的」这类安慰也不写;可以写用户从这一侧带走的东西;只有回答确实取决于这类事实时才问一句,全篇最多一次。";
|
||||
|
||||
/**
|
||||
* Career answers (product decision 2026-10-02 on TASK-consult-career-yoga-
|
||||
|
||||
@@ -15,15 +15,15 @@ export const productConversationVoice = `VISIBLE VOICE
|
||||
怎么写(natal / general / declared-window 三种模式共用)
|
||||
- 回答用户问的那件事,按用户自己的问法组织。用户列了几个子问题(比如相处的底色、在哪摩擦、对我有什么影响),就按这几个子问题顺着写;只点到几个人,就按人分段,段首用人话点名。第一段一两句话说出这件事在盘上的整体样子;是非题第一句答「是」「不是」或「看情况」。
|
||||
- 每个判断都讲出推理:先说意思,再说盘上哪一处让你这么看,以及为什么这一处意味着这件事——这颗星管什么、落在哪、它和别的配置合起来在生活里通常表现成什么。几条依据合起来说成一个人、一种关系,不逐条罗列「某宫坐着某星、某宫主落某宫」而不解释。每个判断挑最能撑住它的一两处依据。
|
||||
- 写给不懂占星的人:宫位、术语第一次出现时用几个字说清它在这个问题里指什么(「4 宫(母亲、家)」),只说和问题相关的那一面。盘上字段这样说:功能吉星 → 对你这个上升帮得上忙的星;功能凶星 → 偏添麻烦的星;yogakaraka → 不提,或说这张盘里最帮你的那颗星,不自造译名;DK / AmK / MK / PiK / PK → 代表伴侣 / 事业 / 母亲 / 父亲 / 孩子的星;AL、A10 → 外人眼里的你、事业在外人眼里的样子;UL 等婚姻点 → 婚姻这条线;落陷 → 力气弱;燃烧 → 被太阳压住。名词只用中文,同一个东西全篇一个叫法:罗睺、计都(不写克图、凯图),大运、小运、细运(不写中运、分运);不写英文或梵文音译(sade sati、vargottama、rupas 这类),力量只说强、中、弱。
|
||||
- 写给不懂占星的人:宫位、术语第一次出现时用几个字说清它在这个问题里指什么(「4 宫(母亲、家)」),只说和问题相关的那一面。盘上字段这样说:功能吉星 → 对你这个上升帮得上忙的星;功能凶星 → 偏添麻烦的星;yogakaraka → 不提,或说这张盘里最帮你的那颗星,不自造译名;DK / AmK / MK / PiK / PK → 代表伴侣 / 事业 / 母亲 / 父亲 / 孩子的星;AL、A10 → 外人眼里的你、事业在外人眼里的样子;UL 等婚姻点 → 婚姻这条线;落陷 → 力气弱;燃烧 → 被太阳压住;入旺、入庙、敌星座、友星座、命宫、命主星、D12 这类分盘代号都不写,直接说它的意思(「这颗星在这里很有力」「看父母的那张分盘」)。名词只用中文,同一个东西全篇一个叫法:罗睺、计都(不写克图、凯图),大运、小运、细运(不写中运、分运);不写英文或梵文音译(sade sati、vargottama、rupas 这类),力量只说强、中、弱。
|
||||
- 写成段落,段落之间空一行。首轮不写 ## 标题、不用加粗短语当小标题;用户要求列举、或有三个以上候选时间窗时才用列表。首轮通常三到六段,讲清楚为止,不为显得周全把各方面写满;同一件事只说一遍。讲时间时最多三件天象或运期变化,由近到远。
|
||||
- 行动不强制:盘上确实指向一件相关的具体事时才顺口说一句;用户问怎么办时那一轮可以给几条。
|
||||
- 读心可以:答完之后,用「可能」「多半」说一句;读别人的心要有盘上依据。不把用户的问题改写成「你其实想要的是……」。
|
||||
- 用户纠正你的判断时,先认下,再说盘上真正对得上的部分;盘分不出的直说分不出,不为原判断辩护。
|
||||
- 读心可以:答完之后,用「可能」「多半」说一句,用户要客观时不读;读别人的心要有盘上依据。不把用户的问题改写成「你其实想要的是……」。
|
||||
- 用户纠正你的判断时,先认下,直说原来哪句读偏了,再只说盘上真正对得上的部分;盘分不出的直说分不出,不把普通配置说成必然,不为原判断辩护,也不把原因推到用户身上。
|
||||
|
||||
红线(这几条之外靠你的判断):
|
||||
- 只用卡上和补取到的盘面事实,不编位置、不编时间;不允许精确应期时不写月份。分析清单(受冲信号的编号和条数、层名、规则原句)只用来判断,不念给用户。
|
||||
- 用户自己更清楚的传记事实——有没有伴侣、是否已婚、几段感情、父母在不在身边、在不在世、有没有病、在不在上班、做哪一行、孩子性别——盘分不出,不预设、不替他断定,也不反过来打包票说「关系稳」「一直在管你」;性别未知时不用「他」「她」称伴侣和孩子。用户的问题本身已经说了你们在相处(比如问相处方式、摩擦),就按这个前提讲模式;只有回答确实取决于这类事实时,才问一句,全篇最多一次。
|
||||
- 只用卡上和补取到的盘面事实,不编位置、不编时间;不允许精确应期时不写月份。分析清单(受冲信号的编号和条数、层名、规则原句)只用来判断,不念给用户;不写「从某宫数起第几位」这类数法,只说结论(「这颗星落在对这个宫不利的位置」)。
|
||||
- 用户自己更清楚的传记事实——有没有伴侣、是否已婚、几段感情、父母在不在身边、在不在世、有没有病、在不在上班、做哪一行、孩子性别——盘分不出,不预设、不替他断定;性别未知时不用「他」「她」称伴侣和孩子。某个人这条线压力重时,盘分不出这是聚少离多还是人在但相处吃力:用自己的话给出这个范围,一句,不套固定句式;这一侧不写这个人实际怎么对你——照顾、管、在意、有温度、有分量都不写,「善意是存在的」「这条线不是空的」这类安慰也不写;可以写你从这一侧带走的东西。这一侧压力不重时才写他的方式。只有回答确实取决于这类事实时,才问一句,全篇最多一次。
|
||||
- 不断言死亡、离婚、疾病诊断、流产、不孕;不给医疗、法律、投资指令。
|
||||
- 不起「外热内冷」这类四字格局名,不把大运写成推着谁、替谁收尾的角色,空宫不单独下结论(说它的宫主落在哪)。
|
||||
- 不以「根据计算结果」「综合来看」「从星盘来看」开头;不写内部字段、英文状态码、JSON、技法审计表、统一参数。
|
||||
|
||||
@@ -120,6 +120,6 @@ test("opener keeps the affliction rule (T5 text)", () => {
|
||||
// 开场不再强制写「哪条线顺、哪条线有压力」,改为「说出这件事在盘上的整体样子」
|
||||
// 原因: BUG-1540(产品 2026-11-04 拍板):写作规则叠到约 1.75 万字、形状在口吻 / 合同 / 用户轮说了三遍、示例句被照抄(「实际是哪一种,告诉我一句」),压成 VISIBLE VOICE 一份短说明,只留红线;用户轮只指回它;开场被逼成线路健康判词,答不到用户问的「相处底色」
|
||||
assert.ok(body.startsWith("这是本会话的首轮回答:按系统提示里 VISIBLE VOICE 的写法回答用户这句话"));
|
||||
assert.match(productConversationVoice, /盘分不出,不预设、不替他断定,也不反过来打包票/);
|
||||
assert.match(productConversationVoice, /盘分不出,不预设、不替他断定/);
|
||||
assert.equal(body.includes("第一句就是结论"), false);
|
||||
});
|
||||
|
||||
@@ -36,11 +36,11 @@ function promptSources() {
|
||||
// 新值: NATAL_SECTION_RULE 删除;「不预设、不断定传记事实、性别未知不用他 / 她」并进 VISIBLE VOICE 红线;
|
||||
// AFFLICTION_RANGE_RULE 只留红线(不断定、不反向打包票、问题本身的前提算数、最多问一次),不再给可照抄的范围句和请求句
|
||||
// 原因: BUG-1540(产品 2026-11-04 拍板):写作规则叠到约 1.75 万字、形状在口吻 / 合同 / 用户轮说了三遍、示例句被照抄(「实际是哪一种,告诉我一句」),压成 VISIBLE VOICE 一份短说明,只留红线;用户轮只指回它
|
||||
test("T1: nothing presupposed, pressure explained, the question's premise counts, at most one ask (BUG-1164, BUG-1540)", () => {
|
||||
test("T1: nothing presupposed, pressure explained, the boundary said once, at most one ask (BUG-1164, BUG-1540)", () => {
|
||||
for (const point of ["有没有伴侣、是否已婚", "在不在上班、做哪一行", "不预设、不替他断定", "性别未知时不用「他」「她」称伴侣和孩子", "全篇最多一次"]) {
|
||||
assert.ok(productConversationVoice.includes(point), point);
|
||||
}
|
||||
for (const point of ["说这条线有压力或距离,并讲清盘上哪一处、为什么", "不替用户断定", "全篇最多一次"]) {
|
||||
for (const point of ["说这条线有压力,并讲清盘上哪一处、为什么", "用自己的话给出这个范围", "不替用户断定", "全篇最多一次"]) {
|
||||
assert.ok(AFFLICTION_RANGE_RULE.includes(point), point);
|
||||
}
|
||||
const body = natalAnswerShapeBody();
|
||||
@@ -51,7 +51,7 @@ test("T1: nothing presupposed, pressure explained, the question's premise counts
|
||||
assert.doesNotMatch(text, OLD_SECTION_RULE, file);
|
||||
if (file !== "src/mastra/product-voice.ts") assert.doesNotMatch(text, /实际是哪一种,告诉我一句/, file);
|
||||
}
|
||||
const holders = promptSources().filter(({ text }) => text.includes("说这条线有压力或距离,并讲清盘上哪一处")).map(({ file }) => file);
|
||||
const holders = promptSources().filter(({ text }) => text.includes("说这条线有压力,并讲清盘上哪一处")).map(({ file }) => file);
|
||||
assert.deepEqual(holders, ["src/lib/consultation-thinking-plan.ts"]);
|
||||
});
|
||||
|
||||
@@ -89,7 +89,7 @@ test("T2b: career examples carry no job shape (BUG-1168)", () => {
|
||||
// 新值: 常量删除;「先认下、只说真正对得上的、盘分不出就直说、不辩护」并进 VISIBLE VOICE(首轮、追问轮都适用)
|
||||
// 原因: BUG-1540(产品 2026-11-04 拍板):写作规则叠到约 1.75 万字、形状在口吻 / 合同 / 用户轮说了三遍、示例句被照抄(「实际是哪一种,告诉我一句」),压成 VISIBLE VOICE 一份短说明,只留红线;用户轮只指回它
|
||||
test("T3: a correction turn acknowledges first and does not defend the reading (BUG-1166)", () => {
|
||||
assert.match(productConversationVoice, /用户纠正你的判断时,先认下,再说盘上真正对得上的部分;盘分不出的直说分不出,不为原判断辩护/);
|
||||
assert.match(productConversationVoice, /用户纠正你的判断时,先认下,直说原来哪句读偏了,再只说盘上真正对得上的部分;盘分不出的直说分不出,不把普通配置说成必然,不为原判断辩护,也不把原因推到用户身上/);
|
||||
assert.match(followUpAnswerShapeInstruction(), /VISIBLE VOICE/);
|
||||
});
|
||||
|
||||
|
||||
@@ -49,7 +49,7 @@ test("the checklists say they are for analysis, and the shape says how to speak
|
||||
assert.equal(text.includes(PLAIN_SPEECH_RULE), false);
|
||||
}
|
||||
assert.doesNotMatch(voice, /PLAIN_SPEECH_RULE/);
|
||||
assert.match(productConversationVoice, /分析清单(受冲信号的编号和条数、层名、规则原句)只用来判断,不念给用户/);
|
||||
assert.match(productConversationVoice, /分析清单(受冲信号的编号和条数、层名、规则原句)只用来判断,不念给用户;不写「从某宫数起第几位」这类数法/);
|
||||
});
|
||||
|
||||
test("layer names are everyday words and never announced (BUG-1253)", () => {
|
||||
|
||||
@@ -68,16 +68,21 @@ test("career: weak placements of A10 / AL / Sun / 10th lord are resistance, not
|
||||
|
||||
// 原值: 锁 AFFLICTION_RANGE_RULE 四句(不拿宫主落宫描写这个人做什么、「在管」「在安排」……预设人在身边、行动不写给他打电话、
|
||||
// 问过之后别的段落不再另问)与口吻里读心第 3 条、父母 Good 例「她离你近……因为管母亲的 4 宫……没有受冲」
|
||||
// 新值: 受冲规则留红线——不替用户断定在不在身边,不拿宫主落宫、吉星反过来打包票;问题本身已说在相处时按前提讲模式;
|
||||
// 只在回答取决于这类事实时问一句、全篇最多一次。Good / Bad 示例全部删除
|
||||
// 新值: 受冲规则留红线与范围——用自己的话给一句范围(聚少离多 / 人在但相处吃力),不套固定句式;这一侧不写这个人
|
||||
// 实际怎么对用户、不写安慰;可写用户这一侧带走的东西;只在回答取决于这类事实时问一句、全篇最多一次。Good / Bad 示例全部删除。
|
||||
// (两版去掉范围的写法——「问题本身说了在相处」算前提、只说一句「看不出在不在身边」——回测分别有 8、9 份把缺席的
|
||||
// 父母写成在场、有温度;产品 2026-11-04 定混合方案)
|
||||
// 原因: BUG-1540(产品 2026-11-04 拍板):写作规则叠到约 1.75 万字、形状在口吻 / 合同 / 用户轮说了三遍、示例句被照抄(「实际是哪一种,告诉我一句」),压成 VISIBLE VOICE 一份短说明,只留红线;用户轮只指回它;BUG-1182 的「宫位 → 人物在做什么」照抄来自示例,示例删掉后这一类来源一起没了
|
||||
test("afflicted person: no reassurance from a lord's house, the question's premise counts, at most one ask (BUG-1182, BUG-1540)", () => {
|
||||
test("afflicted person: no portrait of what they do, the boundary said once, at most one ask (BUG-1182, BUG-1540)", () => {
|
||||
for (const phrase of [
|
||||
"不替用户断定",
|
||||
"不拿宫主落宫、吉星反过来保证「关系稳」「一直在管你」",
|
||||
"用户的问题本身已经说了你们在相处时,按这个前提讲压力从哪来、表现成什么样",
|
||||
"盘分不出这是聚少离多还是人在但相处吃力",
|
||||
"用自己的话给出这个范围,一句,不替用户断定",
|
||||
"这一侧不拿宫主落宫、吉星去写这个人实际怎么对用户——照顾、管、在意、有温度、有分量都不写,「善意是存在的」「这条线不是空的」这类安慰也不写",
|
||||
"可以写用户从这一侧带走的东西",
|
||||
"只有回答确实取决于这类事实时才问一句,全篇最多一次",
|
||||
]) assert.ok(AFFLICTION_RANGE_RULE.includes(phrase), phrase);
|
||||
assert.doesNotMatch(AFFLICTION_RANGE_RULE, /问题本身已经说了你们在相处/);
|
||||
assert.match(productConversationVoice, /某个人这条线压力重时,盘分不出这是聚少离多还是人在但相处吃力:用自己的话给出这个范围,一句,不套固定句式;这一侧不写这个人实际怎么对你/);
|
||||
assert.doesNotMatch(AFFLICTION_RANGE_RULE, /告诉我一句|现实里可能是/);
|
||||
assert.doesNotMatch(productConversationVoice, /Good \(|Bad \(|她离你近|告诉我一句/);
|
||||
assert.match(productConversationVoice, /读别人的心要有盘上依据/);
|
||||
|
||||
@@ -20,7 +20,7 @@ test("mind-reading never replaces the answer and never turns a guess into a fact
|
||||
// 新值: 读心一句话写在 VISIBLE VOICE 的写法里:答完之后、可能 / 多半、读别人要有盘上依据、不改写成需求题
|
||||
// 原因: BUG-1540(产品 2026-11-04 拍板):写作规则叠到约 1.75 万字、形状在口吻 / 合同 / 用户轮说了三遍、示例句被照抄(「实际是哪一种,告诉我一句」),压成 VISIBLE VOICE 一份短说明,只留红线;用户轮只指回它
|
||||
const voice = productConversationVoice;
|
||||
assert.ok(voice.includes("读心可以:答完之后,用「可能」「多半」说一句;读别人的心要有盘上依据。不把用户的问题改写成「你其实想要的是……」"));
|
||||
assert.ok(voice.includes("读心可以:答完之后,用「可能」「多半」说一句,用户要客观时不读;读别人的心要有盘上依据。不把用户的问题改写成「你其实想要的是……」"));
|
||||
// Every agent that speaks to the user (natal, general, declared window) shares this voice.
|
||||
assert.equal(mastra.match(/\$\{productConversationVoice\}/g)?.length, 3);
|
||||
});
|
||||
|
||||
@@ -60,8 +60,9 @@ test("VISIBLE VOICE says how to write a good answer: the user's own structure, r
|
||||
assert.match(voice, /首轮通常三到六段,讲清楚为止/);
|
||||
assert.match(voice, /同一件事只说一遍/);
|
||||
assert.match(voice, /行动不强制/);
|
||||
assert.match(voice, /读心可以:答完之后,用「可能」「多半」说一句;读别人的心要有盘上依据/);
|
||||
assert.match(voice, /用户纠正你的判断时,先认下/);
|
||||
assert.match(voice, /读心可以:答完之后,用「可能」「多半」说一句,用户要客观时不读;读别人的心要有盘上依据/);
|
||||
assert.match(voice, /用户纠正你的判断时,先认下,直说原来哪句读偏了/);
|
||||
assert.match(voice, /入旺、入庙、敌星座、友星座、命宫、命主星、D12 这类分盘代号都不写,直接说它的意思/);
|
||||
assert.doesNotMatch(voice, /扮演|谁在推|≤ 400|≤ 900|不超过 \d+ 字|这周可以做的一件事/);
|
||||
});
|
||||
|
||||
@@ -69,11 +70,13 @@ test("the red lines the old rules guarded are all still in VISIBLE VOICE (BUG-15
|
||||
const redLines = voice.slice(voice.indexOf("红线(这几条之外靠你的判断)"), voice.indexOf("降级路线"));
|
||||
assert.ok(redLines.length > 0);
|
||||
assert.match(redLines, /只用卡上和补取到的盘面事实,不编位置、不编时间;不允许精确应期时不写月份/);
|
||||
assert.match(redLines, /分析清单(受冲信号的编号和条数、层名、规则原句)只用来判断,不念给用户/);
|
||||
assert.match(redLines, /分析清单(受冲信号的编号和条数、层名、规则原句)只用来判断,不念给用户;不写「从某宫数起第几位」这类数法/);
|
||||
// BUG-1164 / BUG-1182: never decide a biographical fact the user knows better, never the opposite reassurance.
|
||||
assert.match(redLines, /有没有伴侣、是否已婚、几段感情、父母在不在身边、在不在世、有没有病、在不在上班、做哪一行、孩子性别——盘分不出,不预设、不替他断定,也不反过来打包票/);
|
||||
assert.match(redLines, /有没有伴侣、是否已婚、几段感情、父母在不在身边、在不在世、有没有病、在不在上班、做哪一行、孩子性别——盘分不出,不预设、不替他断定/);
|
||||
assert.match(redLines, /性别未知时不用「他」「她」称伴侣和孩子/);
|
||||
assert.match(redLines, /用户的问题本身已经说了你们在相处(比如问相处方式、摩擦),就按这个前提讲模式;只有回答确实取决于这类事实时,才问一句,全篇最多一次/);
|
||||
assert.match(redLines, /某个人这条线压力重时,盘分不出这是聚少离多还是人在但相处吃力:用自己的话给出这个范围,一句,不套固定句式/);
|
||||
assert.match(redLines, /照顾、管、在意、有温度、有分量都不写,「善意是存在的」「这条线不是空的」这类安慰也不写/);
|
||||
assert.match(redLines, /只有回答确实取决于这类事实时,才问一句,全篇最多一次/);
|
||||
assert.match(redLines, /不断言死亡、离婚、疾病诊断、流产、不孕/);
|
||||
// BUG-1132 / BUG-1134.
|
||||
assert.match(redLines, /不起「外热内冷」这类四字格局名,不把大运写成推着谁、替谁收尾的角色,空宫不单独下结论/);
|
||||
|
||||
Reference in New Issue
Block a user