From 549e37b9952e76bb9b26f32c1426eaa6adfe7475 Mon Sep 17 00:00:00 2001 From: jesse-ux Date: Tue, 20 Oct 2026 07:36:32 +0800 Subject: [PATCH] fix(synastry): check the dasha sentences the report actually writes MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit A shifted antardasha or English mahadasha was passing because the checker only recognized 大运 and 子运. Co-authored-by: Cursor --- .../PROGRESS-synastry-report-chat-20261018.md | 13 +++++ docs/tasks/README.md | 2 +- frontend/docs/VOICE.md | 2 +- frontend/src/lib/synastry-chat-fact-check.ts | 2 +- .../birth-time-consultation-consent.test.ts | 5 +- frontend/tests/synastry-report-chat.test.ts | 50 +++++++++++++++++++ 6 files changed, 70 insertions(+), 4 deletions(-) diff --git a/docs/tasks/PROGRESS-synastry-report-chat-20261018.md b/docs/tasks/PROGRESS-synastry-report-chat-20261018.md index 80cca3a5..c9429927 100644 --- a/docs/tasks/PROGRESS-synastry-report-chat-20261018.md +++ b/docs/tasks/PROGRESS-synastry-report-chat-20261018.md @@ -42,6 +42,7 @@ Turbopack 不能用这个工作树里的 `node_modules` 联接(联接指向工 | 会话详情列合同 | 人物字段后是 `created_at` | 中间加上这三列 | 详情和容量合同跟着列走 | | 输入框禁用 | `subjectDeleted` 开头 | `synastryClosed` 开头,合盘追问不看查看者资料是否齐全 | 报告删除后只读;追问不要求查看者出生资料 | | 称呼按钮 | 资料停在称呼步时按钮是「确认称呼」 | 合盘追问仍是「发送」,也不再被出生资料表单挡住 | 预填问题要能发出;查看者自己的资料没填完也能问 | +| 引导表单 | `const onboardingFormActive = !profileComplete && onboardingStep !== "name"` | 前面加上 `!synastryChat &&` | 合盘追问跳过引导表单;普通对话仍按原条件收起输入框 | ## 验收(2026-10-20) @@ -65,3 +66,15 @@ Turbopack 不能用这个工作树里的 `node_modules` 联接(联接指向工 | 模型 / 浏览器 | 环境缺口 | 无模型凭据、无登录态。功能未进 staging,真人清单先不跑 | 普通单人对话的提示、证据卡和工具不在这次 diff 里。`scripts/jyotish_api_server.py` 和 `.gitea/` 没改。 + +## 修复(2026-10-20) + +核对改去认时间线实际写下的句子:中文「大运」「小运」,英文 `mahadasha`、`antardasha`,中间是 `to`。材料用 `buildTimelineSegments` 生成的 `basis`。原样引用通过;年份改一年失败;两稿都对不上仍是「这一点在这份合盘里没有算到,我不能确定」。名人三条仍是通过、失败、失败。时间线生成器的用词没改。 + +预填文案只留「合盘报告里「节名」这一段,在我们两人的盘里依据是什么?」英文说明留一句。 + +| 项 | 结果 | +| --- | --- | +| `tsc --noEmit` | 0 错 | +| `npm run lint` | 0 error,122 warning | +| `tests/synastry-report-chat.test.ts`、`tests/birth-time-consultation-consent.test.ts` | 21 通过,0 失败 | diff --git a/docs/tasks/README.md b/docs/tasks/README.md index 6686bf56..da052dc3 100644 --- a/docs/tasks/README.md +++ b/docs/tasks/README.md @@ -508,4 +508,4 @@ | `TASK-niryaana-shoola-pvr-20261018.md` | `PROGRESS-niryaana-shoola-pvr-20261018.md` | #84 Niryaana Shoola 改 PVR 口径(我们的表与 Shoola 逐行相同;推翻 BUG-1283 所选 profile;占星师 7a773d13) | 待验收 | `codex/niryaana-shoola-pvr-20261018` | | `TASK-synastry-full-report-20261018.md` | #82 | 婚恋合盘:选人页 + 完整合盘报告(关系画像九节:结论+折叠的分析逻辑+关系时间线+技术依据摘要;英文按需;计费键 synastry.full) | 排队(等 #78、#79、#81) | `codex/synastry-full-report-20261018`;动表 | | `TASK-synastry-report-chat-20261018.md` | `PROGRESS-synastry-report-chat-20261018.md` | 从合盘报告某一节进入对话问依据(绑定报告与节、对话里可用术语、只依据已存计算结果并逐条核对、计费照普通对话) | 验收未通过 | `codex/synastry-report-chat-20261018` @ `3956519f3`;动表 | -| `TASK-synastry-report-chat-fix-20261020.md` | #83 | 大运核对要认报告里的「小运」和英文 mahadasha / antardasha;预填文案只留一句 | 待执行 | 同一分支继续 | +| `TASK-synastry-report-chat-fix-20261020.md` | `PROGRESS-synastry-report-chat-20261018.md` | 大运核对要认报告里的「小运」和英文 mahadasha / antardasha;预填文案只留一句 | 待验收 | 同一分支继续 | diff --git a/frontend/docs/VOICE.md b/frontend/docs/VOICE.md index cd8685f2..dc428a2f 100644 --- a/frontend/docs/VOICE.md +++ b/frontend/docs/VOICE.md @@ -34,7 +34,7 @@ Jyotisha 的可见文案是产品的一部分。正确性红线(真实性、 - 吵完之后,怎样递出台阶才不会变成认输? - 过日子的安排里,哪一件需要现在就说清楚? -报告末尾「对哪一段想再问清楚?」列出前八节(含关系时间线,不含共同练习)。点进去是一条新对话,输入框预先写好这句,用户自己发送。中文报告用「合盘报告里「这一段」这一段,在我们两人的盘里依据是什么?」;英文报告用英文。中文预填是「合盘报告里「节名」这一段,在我们两人的盘里依据是什么?」英文报告用英文问同一件事。对话里可以说星曜、宫位、九分盘、大运,但只能引用这份报告已经写下的计算。材料里没有的,说「这份合盘没算到」。对不上的盘面,说「这一点在这份合盘里没有算到,我不能确定」。报告删了之后,输入框写「这份合盘已删除」,不能再发送。英文还没写好时只说「英文版即将提供」。选人页按钮是「开始合盘」。点数从配置读,没有配置时说「计费配置不可用」。产品关着时说「合盘服务暂未开放」。英文次数用尽时说「英文版暂时无法再试」。等待时分别说「正在排两人的星盘」「正在写关系画像」「正在核对表述」。 +报告末尾「对哪一段想再问清楚?」列出前八节(含关系时间线,不含共同练习)。点进去是一条新对话,输入框预先写好这句,用户自己发送。中文预填是「合盘报告里「节名」这一段,在我们两人的盘里依据是什么?」英文报告用英文问同一件事。对话里可以说星曜、宫位、九分盘、大运,但只能引用这份报告已经写下的计算。材料里没有的,说「这份合盘没算到」。对不上的盘面,说「这一点在这份合盘里没有算到,我不能确定」。报告删了之后,输入框写「这份合盘已删除」,不能再发送。英文还没写好时只说「英文版即将提供」。选人页按钮是「开始合盘」。点数从配置读,没有配置时说「计费配置不可用」。产品关着时说「合盘服务暂未开放」。英文次数用尽时说「英文版暂时无法再试」。等待时分别说「正在排两人的星盘」「正在写关系画像」「正在核对表述」。 ## 生时校正从对话进入(2026-10-07,BUG-1247~1251;2026-10-12,BUG-1306) diff --git a/frontend/src/lib/synastry-chat-fact-check.ts b/frontend/src/lib/synastry-chat-fact-check.ts index e0043a3c..609ccca4 100644 --- a/frontend/src/lib/synastry-chat-fact-check.ts +++ b/frontend/src/lib/synastry-chat-fact-check.ts @@ -110,7 +110,7 @@ export function extractSynastryClaims(text: string): Set { "giu", ); const dashaPattern = new RegExp( - `(${planetAlt})(?:大运|子运)\\s*(\\d{4})\\s*[-/.年]\\s*(\\d{1,2})(?:\\s*[-/.月]\\s*\\d{1,2})?\\s*(?:至|到|—|–|-)\\s*(\\d{4})\\s*[-/.年]\\s*(\\d{1,2})`, + `(${planetAlt})\\s*(?:大运|子运|小运|mahadasha|antardasha)\\s*(\\d{4})\\s*[-/.年]\\s*(\\d{1,2})(?:\\s*[-/.月]\\s*\\d{1,2})?\\s*(?:至|到|—|–|-|\\bto\\b)\\s*(\\d{4})\\s*[-/.年]\\s*(\\d{1,2})`, "giu", ); diff --git a/frontend/tests/birth-time-consultation-consent.test.ts b/frontend/tests/birth-time-consultation-consent.test.ts index 429e6880..da19bc2c 100644 --- a/frontend/tests/birth-time-consultation-consent.test.ts +++ b/frontend/tests/birth-time-consultation-consent.test.ts @@ -243,7 +243,10 @@ test("onboarding form steps hide the dead composer and keep source choices in a const page = homeSurface; const css = readFileSync(new URL("../src/app/globals.css", import.meta.url), "utf8"); - assert.match(page, /const onboardingFormActive = !profileComplete && onboardingStep !== "name"/); + // 原值: const onboardingFormActive = !profileComplete && onboardingStep !== "name" + // 新值: const onboardingFormActive = !synastryChat && !profileComplete && onboardingStep !== "name" + // 原因: 合盘追问可以跳过引导表单。普通对话仍是资料未完成、且不在称呼步时才收起输入框。 + assert.match(page, /const onboardingFormActive = !synastryChat && !profileComplete && onboardingStep !== "name"/); assert.match(page, /!rectificationSurfaceOpen && !onboardingFormActive &&
segment.basis).join("\n"); +} + +function shiftFirstYear(sentence: string): string { + return sentence.replace(/(\d{4})/, (year) => String(Number(year) + 1)); +} + +test("timeline basis lines reject a shifted antardasha or English mahadasha", () => { + const zh = timelineBasis("zh"); + const minor = zh.match(/金星小运 \d{4}-\d{2} 至 \d{4}-\d{2}/u)?.[0]; + assert.ok(minor, zh); + assert.equal(auditSynastryAnswer(minor, { basis: zh }).ok, true); + assert.equal(auditSynastryAnswer(shiftFirstYear(minor), { basis: zh }).ok, false); + + const en = timelineBasis("en"); + const major = en.match(/Saturn mahadasha \d{4}-\d{2} to \d{4}-\d{2}/u)?.[0]; + assert.ok(major, en); + assert.equal(auditSynastryAnswer(major, { basis: en }).ok, true); + assert.equal(auditSynastryAnswer(shiftFirstYear(major), { basis: en }).ok, false); + const antardasha = en.match(/Venus antardasha \d{4}-\d{2} to \d{4}-\d{2}/u)?.[0]; + assert.ok(antardasha, en); + assert.equal(auditSynastryAnswer(shiftFirstYear(antardasha), { basis: en }).ok, false); + + const shifted = settleSynastryDrafts({ + toolCalled: true, + material: { basis: zh }, + first: shiftFirstYear(minor), + second: shiftFirstYear(minor).replace(/至 (\d{4})/u, (_match, year: string) => `至 ${Number(year) + 1}`), + }); + assert.equal(shifted.outcome, "fixed"); + assert.equal(shifted.text, SYNASTRY_FIXED_REPLY); +});