fix(rectification): fold D24 into education refine and score family D3

Window scan now drives d5_refine when D24 changes, family events use D3, and pada/Hora/Ghati are display-only. New cases bind Skill 10.0.7 without unique-minute confirmation.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
Jesse_Chen
2026-08-20 11:04:55 +08:00
co-authored by Cursor
parent 9a5cf67209
commit 70efb56926
35 changed files with 894 additions and 72 deletions
@@ -89,4 +89,4 @@ export function evidenceWritesAllowed(
export const MAX_RESUMABLE_CASES_PER_USER = 1;
export const RECTIFICATION_SKILL_NAME = "jyotish-birth-time-rectification";
export const RECTIFICATION_SKILL_VERSION = "10.0.6";
export const RECTIFICATION_SKILL_VERSION = "10.0.7";
@@ -339,7 +339,7 @@ export function buildMethodFollowupPlan(input: {
ask_theme: "education_style",
domain: "education",
kind_hint: "education_milestone",
user_prompt_hint: "成就盘仍会换升。可以再补一件记得大概时间的学业、考试或被委以责任的变化;同一件事会对照本命五宫和 D5,不要贴类型标签。",
user_prompt_hint: "成就盘或学业盘仍会换升。可以再补一件记得大概时间的学业、考试或被委以责任的变化;同一件事会对照本命五宫、D5 和 D24,不要贴类型标签。",
source: "precision_stage",
});
} else if (!relationshipCovered && !declined.has("relationship")) {
@@ -369,7 +369,7 @@ export function buildMethodFollowupPlan(input: {
ask_theme: "family_event",
domain: "family",
kind_hint: "family_event",
user_prompt_hint: "可以先说一段记得大概时间的家人相关变化。同一件事会对照 D12 父母盘D7 子女盘。",
user_prompt_hint: "可以先说一段记得大概时间的家人相关变化。同一件事会对照 D12 父母盘D7 子女盘和 D3 兄弟盘。",
source: "method_coverage",
});
} else if (!appearanceCovered && !declined.has("appearance")) {
@@ -436,7 +436,7 @@ export function buildMethodFollowupPlan(input: {
ask_theme: "education_style",
domain: "education",
kind_hint: "education_milestone",
user_prompt_hint: "当前候选在学业或成就主题上仍分不开,可以再补一件记得大概时间的学业、考试或被委以责任的变化;不要贴类型标签。",
user_prompt_hint: "当前候选在学业或成就主题上仍分不开,可以再补一件记得大概时间的学业、考试或被委以责任的变化;不要贴类型标签。同一件事会对照 D5 和 D24。",
source: "varga_observation",
});
} else if ((d12?.candidates_differ || d7?.candidates_differ) && !declined.has("family")) {
@@ -446,7 +446,7 @@ export function buildMethodFollowupPlan(input: {
ask_theme: "family_event",
domain: "family",
kind_hint: "family_event",
user_prompt_hint: "当前候选在家人主题上仍分不开,可以再补一件记得大概时间的家人变化。同一件事会对照 D12 和 D7。",
user_prompt_hint: "当前候选在家人主题上仍分不开,可以再补一件记得大概时间的家人变化。同一件事会对照 D12、D7 和 D3。",
source: "varga_observation",
});
} else if (input.nakshatraBoundary?.near_boundary) {
@@ -52,6 +52,7 @@ export type PublicRectificationTool =
export const PUBLIC_RECTIFICATION_METHODS = [
"d1-rashi",
"d2-hora",
"d3-drekkana",
"d4-chaturthamsha",
"d5-panchamsha",
"d7-saptamsha",
@@ -16,9 +16,13 @@ const LAYER_LABEL: Record<WindowScanLayer, string> = {
d5: "D5",
d7: "D7",
d12: "D12",
d24: "D24",
pada: "Nakshatra pada",
hora: "Hora Lagna",
ghati: "Ghati Lagna",
};
export type WindowScanLayer = "d1" | "d9" | "d10" | "d4" | "d5" | "d7" | "d12";
export type WindowScanLayer = "d1" | "d9" | "d10" | "d4" | "d5" | "d7" | "d12" | "d24" | "pada" | "hora" | "ghati";
export type WindowScanTransition = Readonly<{
layer: WindowScanLayer;
@@ -117,7 +121,19 @@ export function parseWindowScanTransitions(value: unknown): readonly WindowScanT
const at = asTime(row?.at);
if (
!row
|| (layer !== "d1" && layer !== "d9" && layer !== "d10" && layer !== "d4" && layer !== "d5" && layer !== "d7" && layer !== "d12")
|| (
layer !== "d1"
&& layer !== "d9"
&& layer !== "d10"
&& layer !== "d4"
&& layer !== "d5"
&& layer !== "d7"
&& layer !== "d12"
&& layer !== "d24"
&& layer !== "pada"
&& layer !== "hora"
&& layer !== "ghati"
)
|| !at
) continue;
const key = `${layer}:${at}`;
@@ -22,6 +22,7 @@ export type WindowScan = Readonly<{
d5_lagna_count: number;
d7_lagna_count: number;
d12_lagna_count: number;
d24_lagna_count: number;
d1_candidates_differ: boolean;
d9_candidates_differ: boolean;
d10_candidates_differ: boolean;
@@ -29,6 +30,7 @@ export type WindowScan = Readonly<{
d5_candidates_differ: boolean;
d7_candidates_differ: boolean;
d12_candidates_differ: boolean;
d24_candidates_differ: boolean;
transitions: readonly WindowScanTransition[];
}>;
@@ -72,6 +74,7 @@ export function parseWindowScan(value: unknown): WindowScan | null {
const d5Count = optionalCount(row.d5_lagna_count);
const d7Count = optionalCount(row.d7_lagna_count);
const d12Count = optionalCount(row.d12_lagna_count);
const d24Count = optionalCount(row.d24_lagna_count);
const d9Differ = row.d9_candidates_differ === true || d9Count > 1;
const d10Differ = row.d10_candidates_differ === true || d10Count > 1;
const d1Differ = row.d1_candidates_differ === true || d1Count > 1;
@@ -79,6 +82,7 @@ export function parseWindowScan(value: unknown): WindowScan | null {
const d5Differ = row.d5_candidates_differ === true || d5Count > 1;
const d7Differ = row.d7_candidates_differ === true || d7Count > 1;
const d12Differ = row.d12_candidates_differ === true || d12Count > 1;
const d24Differ = row.d24_candidates_differ === true || d24Count > 1;
return {
scanned: true,
confirmation_allowed: false,
@@ -90,6 +94,7 @@ export function parseWindowScan(value: unknown): WindowScan | null {
d5_lagna_count: d5Count,
d7_lagna_count: d7Count,
d12_lagna_count: d12Count,
d24_lagna_count: d24Count,
d1_candidates_differ: d1Differ,
d9_candidates_differ: d9Differ,
d10_candidates_differ: d10Differ,
@@ -97,6 +102,7 @@ export function parseWindowScan(value: unknown): WindowScan | null {
d5_candidates_differ: d5Differ,
d7_candidates_differ: d7Differ,
d12_candidates_differ: d12Differ,
d24_candidates_differ: d24Differ,
transitions: parseWindowScanTransitions(row.transitions),
};
}
@@ -129,8 +135,8 @@ export function internalObservationsFromWindowScan(
},
{
layer: "d5",
candidates_differ: scan.d5_candidates_differ,
ask_theme: scan.d5_candidates_differ ? "education_style" : null,
candidates_differ: scan.d5_candidates_differ || scan.d24_candidates_differ,
ask_theme: scan.d5_candidates_differ || scan.d24_candidates_differ ? "education_style" : null,
},
{
layer: "d7",
@@ -3,6 +3,7 @@ import type { PublicRectificationMethod } from "./rectification-agentic/v9/publi
export const PUBLIC_RECTIFICATION_METHOD_LABELS: Readonly<Record<PublicRectificationMethod, string>> = {
"d1-rashi": "D1 本命盘",
"d2-hora": "D2 财帛分盘",
"d3-drekkana": "D3 兄弟分盘",
"d4-chaturthamsha": "D4 迁移分盘",
"d5-panchamsha": "D5 成就分盘",
"d7-saptamsha": "D7 子女分盘",