fix(synastry): check the dasha sentences the report actually writes
A shifted antardasha or English mahadasha was passing because the checker only recognized 大运 and 子运. Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -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 失败 |
|
||||
|
||||
@@ -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;预填文案只留一句 | 待验收 | 同一分支继续 |
|
||||
|
||||
@@ -34,7 +34,7 @@ Jyotisha 的可见文案是产品的一部分。正确性红线(真实性、
|
||||
- 吵完之后,怎样递出台阶才不会变成认输?
|
||||
- 过日子的安排里,哪一件需要现在就说清楚?
|
||||
|
||||
报告末尾「对哪一段想再问清楚?」列出前八节(含关系时间线,不含共同练习)。点进去是一条新对话,输入框预先写好这句,用户自己发送。中文报告用「合盘报告里「这一段」这一段,在我们两人的盘里依据是什么?」;英文报告用英文。中文预填是「合盘报告里「节名」这一段,在我们两人的盘里依据是什么?」英文报告用英文问同一件事。对话里可以说星曜、宫位、九分盘、大运,但只能引用这份报告已经写下的计算。材料里没有的,说「这份合盘没算到」。对不上的盘面,说「这一点在这份合盘里没有算到,我不能确定」。报告删了之后,输入框写「这份合盘已删除」,不能再发送。英文还没写好时只说「英文版即将提供」。选人页按钮是「开始合盘」。点数从配置读,没有配置时说「计费配置不可用」。产品关着时说「合盘服务暂未开放」。英文次数用尽时说「英文版暂时无法再试」。等待时分别说「正在排两人的星盘」「正在写关系画像」「正在核对表述」。
|
||||
报告末尾「对哪一段想再问清楚?」列出前八节(含关系时间线,不含共同练习)。点进去是一条新对话,输入框预先写好这句,用户自己发送。中文预填是「合盘报告里「节名」这一段,在我们两人的盘里依据是什么?」英文报告用英文问同一件事。对话里可以说星曜、宫位、九分盘、大运,但只能引用这份报告已经写下的计算。材料里没有的,说「这份合盘没算到」。对不上的盘面,说「这一点在这份合盘里没有算到,我不能确定」。报告删了之后,输入框写「这份合盘已删除」,不能再发送。英文还没写好时只说「英文版即将提供」。选人页按钮是「开始合盘」。点数从配置读,没有配置时说「计费配置不可用」。产品关着时说「合盘服务暂未开放」。英文次数用尽时说「英文版暂时无法再试」。等待时分别说「正在排两人的星盘」「正在写关系画像」「正在核对表述」。
|
||||
|
||||
## 生时校正从对话进入(2026-10-07,BUG-1247~1251;2026-10-12,BUG-1306)
|
||||
|
||||
|
||||
@@ -110,7 +110,7 @@ export function extractSynastryClaims(text: string): Set<string> {
|
||||
"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",
|
||||
);
|
||||
|
||||
|
||||
@@ -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 && <div className=\{`composer-wrap/);
|
||||
assert.match(page, /birthTimeDraftReadyHint\(profileDraft\)/);
|
||||
assert.match(css, /\.birth-time-source-list \{ grid-template-columns: 1fr/);
|
||||
|
||||
@@ -23,6 +23,7 @@ import {
|
||||
import { beginSynastrySectionChat } from "../src/lib/synastry-report-chat-client.ts";
|
||||
import { authoritativeSynastrySession, synastrySectionQuestion } from "../src/lib/synastry-report-session.ts";
|
||||
import { runSynastryReportTurn, synastryMissingCoverage } from "../src/lib/synastry-report-turn.ts";
|
||||
import { buildTimelineSegments, type TimingPeriod } from "../src/lib/synastry-full-timeline.ts";
|
||||
import { isListedSidebarSession } from "../src/lib/session-list-filter.ts";
|
||||
import { synastryReportClosed } from "../src/lib/rectification-session-composer-guard.ts";
|
||||
import type { ChatSession } from "../src/lib/home-types.ts";
|
||||
@@ -275,3 +276,52 @@ test("sidebar keeps an empty synastry chat for either person and locks the pair"
|
||||
assert.equal(synastryReportClosed(session({ synastryReportId: null })), true);
|
||||
assert.equal(synastryReportClosed(row), false);
|
||||
});
|
||||
|
||||
function timelineBasis(language: "zh" | "en"): string {
|
||||
const periodsA: TimingPeriod[] = [
|
||||
{ level: "md", lord: "Saturn", lordCn: "土星", start: "1903-01-01", end: "1922-01-01" },
|
||||
{ level: "ad", lord: "Venus", lordCn: "金星", start: "1905-03-01", end: "1907-11-01" },
|
||||
];
|
||||
const periodsB: TimingPeriod[] = [
|
||||
{ level: "md", lord: "Jupiter", lordCn: "木星", start: "1900-01-01", end: "1916-01-01" },
|
||||
{ level: "ad", lord: "Moon", lordCn: "月亮", start: "1905-01-01", end: "1906-06-01" },
|
||||
];
|
||||
return buildTimelineSegments({
|
||||
nameA: "Albert",
|
||||
nameB: "Mileva",
|
||||
periodsA,
|
||||
periodsB,
|
||||
from: "1905-06-01",
|
||||
language,
|
||||
}).map((segment) => 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);
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user