fix(rectification): split D4/D5 stages and recast after adopt
Independent Staging Quality Gate / validate (push) Successful in 9m19s
Independent Staging Quality Gate / publish (push) Failing after 7m45s

Keep family on D12+D7 instead of mixing it into D4, score D5 on education, and show a natal recast plus technique audit after adopt without unique-minute claims.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
Jesse_Chen
2026-08-20 09:11:54 +08:00
parent b1b4f5fac9
commit a93a3cc1a9
40 changed files with 1195 additions and 66 deletions
@@ -12,7 +12,9 @@ import {
} from "@/lib/rectification-activity-receipt";
import {
isRecommendedRectificationCandidate,
natalRecastMeaning,
parseRectificationCandidateResult,
workingRectificationHouseTable,
type RectificationCandidateResult,
} from "@/lib/rectification-candidate-result";
import { membershipHref } from "@/lib/membership";
@@ -29,6 +31,7 @@ import {
} from "./chat-message-actions";
import { ModelSelector } from "./model-selector";
import { RectificationHouseTableView } from "./rectification-house-table";
import { TechniqueAuditDisclosure } from "./technique-audit-disclosure";
import { Button } from "./ui/button";
import { Textarea } from "./ui/textarea";
@@ -565,7 +568,30 @@ export function RectificationAgenticChat(props: RectificationAgenticChatProps) {
if (!response.ok || payload?.ok !== true || payload?.status !== "accepted") {
throw new Error(payload?.error || payload?.message || "暂时无法采用该候选时间");
}
setCandidateResult((current) => current ? { ...current, selectedTime: payload.saved_time, selectionKind: "user_accepted" } : current);
setCandidateResult((current) => {
if (!current) return current;
const selectedTime = typeof payload.saved_time === "string" ? payload.saved_time.slice(0, 5) : current.selectedTime;
const next = {
...current,
selectedTime,
selectionKind: "user_accepted" as const,
};
const houseTable = workingRectificationHouseTable(next);
const recastMeaning = natalRecastMeaning(houseTable);
return {
...next,
houseTable: houseTable ?? current.houseTable,
natalRecast: houseTable && recastMeaning
? {
time: houseTable.time,
lagna: houseTable.lagna,
user_meaning: recastMeaning,
unique_minute_claim: false as const,
confirmation_allowed: false as const,
}
: current.natalRecast,
};
});
setSavedTime(payload.saved_time);
setSavedStatus("accepted");
onSaved?.(payload.saved_time, "accepted");
@@ -722,7 +748,13 @@ export function RectificationAgenticChat(props: RectificationAgenticChatProps) {
})}
{candidateResult?.houseTable && (
<div className="rectification-snapshot">
{candidateResult.natalRecast && (
<p className="rectification-refinement__stage">{candidateResult.natalRecast.user_meaning}</p>
)}
<RectificationHouseTableView table={candidateResult.houseTable} />
{savedStatus === "accepted" && candidateResult.techniqueAudit.length > 0 && (
<TechniqueAuditDisclosure rows={candidateResult.techniqueAudit} />
)}
</div>
)}
{candidateResult && <RectificationRefinementPanel result={candidateResult} />}