fix(rectification): 有题就接着问,题问完才出卡;引导窗口不再硬贴领域

出卡时机只看题源有没有空:撤回「门槛达标就短路采集线」的写法,同时
按 D2 保住「题源全空就按现行规则出卡」——门槛只在还有题可问时挡住
出卡,precision_gate_met 改成只上报(新挂在决策与公开投影上),不再
单独决定时机。引导窗口题在无领域轨道上改问开放题,一个时间窗只问一
次;录入卡提交的是「YYYY 年 M 月,<领域>方面有一件事」,不再是题干
的三选一列表。记忆化 golden 只补一个新键并冻结墙钟。离线回放改成注
入真值方向的边界事件,另跑一组反方向对照。Skill 10.0.28。

BUG-747~752

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JUei7K13cYxLHE3Axe4A45
This commit is contained in:
Jesse_Chen
2026-09-16 12:16:55 +00:00
co-authored by Claude Fable 5.1
parent a396bbe076
commit dc732825d8
61 changed files with 6251 additions and 2053 deletions
@@ -6,8 +6,9 @@ import { EventDatePicker, type EventDateValue } from "@/components/event-date-pi
import { Button } from "@/components/ui/button";
import {
COLLECT_KIND_ORDER,
KIND_ORAL,
GUIDED_ANY_DOMAIN,
type CollectKind,
type GuidedWindowDomain,
} from "@/lib/rectification-agentic/v9/collection-question-pool";
import { RANGE_DELIVERY_DOMAIN_LABEL } from "@/lib/rectification-agentic/user-copy";
@@ -18,11 +19,17 @@ export type EventDateEntrySubmit = Readonly<{
day: number | null;
}>;
/**
* BUG-750: the card already knows the date and the domain the user picked, so
* it states the one fact. The old text pasted the question's option list
* ("开始认真关系、分手或结婚"), which the ledger then stored as the summary.
*/
export function formatEventDateEntryMessage(input: EventDateEntrySubmit): string {
const when = input.day
? `${input.year} 年 ${input.month} 月 ${input.day} 日`
: `${input.year} 年 ${input.month} 月`;
return `${when},${KIND_ORAL[input.domain]}`;
const label = RANGE_DELIVERY_DOMAIN_LABEL[input.domain] ?? input.domain;
return `${when},${label}方面有一件事`;
}
export function eventDateYearRange(
@@ -36,8 +43,17 @@ export function eventDateYearRange(
return { minYear: Math.max(1900, maxYear - 80), maxYear };
}
export function resolveEntryDomain(
domain: GuidedWindowDomain,
openDomains: readonly CollectKind[] = COLLECT_KIND_ORDER,
): CollectKind {
if (domain !== GUIDED_ANY_DOMAIN) return domain;
return openDomains[0] ?? COLLECT_KIND_ORDER[0];
}
export function EventDateEntryCard({
defaultDomain,
openDomains,
defaultYear,
defaultMonth,
minYear,
@@ -45,7 +61,8 @@ export function EventDateEntryCard({
disabled = false,
onSubmit,
}: {
readonly defaultDomain: CollectKind;
readonly defaultDomain: GuidedWindowDomain;
readonly openDomains?: readonly CollectKind[];
readonly defaultYear?: number;
readonly defaultMonth?: number;
readonly minYear: number;
@@ -53,7 +70,9 @@ export function EventDateEntryCard({
readonly disabled?: boolean;
readonly onSubmit: (value: EventDateEntrySubmit) => void;
}) {
const [domain, setDomain] = useState<CollectKind>(defaultDomain);
const [domain, setDomain] = useState<CollectKind>(
resolveEntryDomain(defaultDomain, openDomains),
);
const initial = useMemo<EventDateValue | null>(() => {
if (!defaultYear || defaultYear < minYear || defaultYear > maxYear) return null;
const month = defaultMonth && defaultMonth >= 1 && defaultMonth <= 12 ? defaultMonth : 1;