fix(rectification): hide option hover impact and composer step strip (BUG-575)

Hovering A/B/C/D rewrote a leading/lagging time line and made the card flicker; the step-state sentence above the composer was instructional filler, not something the user needed to answer.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
Jesse_Chen
2026-09-07 14:07:49 +08:00
co-authored by Cursor
parent 58081a2d51
commit 1ded6bb0d4
8 changed files with 29 additions and 44 deletions
@@ -37,10 +37,8 @@ import {
isRecommendedRectificationCandidate,
natalRecastMeaning,
parseRectificationCandidateResult,
parseRectificationStepState,
workingRectificationHouseTable,
type RectificationCandidateResult,
type RectificationStepState,
} from "@/lib/rectification-candidate-result";
import {
diffRectificationBoard,
@@ -435,7 +433,6 @@ type CaseSnapshotState = Readonly<{
question: CurrentQuestionModel | null;
questionSource: "focus" | "unavailable" | null;
choice: ChoiceCardModel | null;
stepState: RectificationStepState | null;
caseStatus: RectificationCaseStatus | null;
savedTime: string | null;
savedStatus: "accepted" | "confirmed" | null;
@@ -457,7 +454,6 @@ function caseSnapshotState(payload: RectificationCaseSnapshotPayload | null): Ca
question: currentQuestionFromSnapshot(payload.current_question),
questionSource: questionSourceFromSnapshot(payload.question_source),
choice: parseRectificationChoiceCard(payload.choice_card),
stepState: parseRectificationStepState(payload.step_state),
caseStatus: isRectificationCaseStatus(payload.case?.status) ? payload.case.status : null,
savedTime: confirmedTime ?? acceptedTime,
savedStatus: confirmedTime ? "confirmed" : acceptedTime ? "accepted" : null,
@@ -499,7 +495,6 @@ export function RectificationAgenticChat(props: RectificationAgenticChatProps) {
const [savedStatus, setSavedStatus] = useState<"accepted" | "confirmed" | null>(() => caseSnapshotState(initialSnapshot)?.savedStatus ?? null);
const [candidateResult, setCandidateResult] = useState<CandidateResult>(() => caseSnapshotState(initialSnapshot)?.candidate ?? null);
const [choiceCard, setChoiceCard] = useState<ChoiceCardModel | null>(() => caseSnapshotState(initialSnapshot)?.choice ?? null);
const [stepState, setStepState] = useState<RectificationStepState | null>(() => caseSnapshotState(initialSnapshot)?.stepState ?? null);
const [currentQuestion, setCurrentQuestion] = useState<CurrentQuestionModel | null>(() => caseSnapshotState(initialSnapshot)?.question ?? null);
const [questionSource, setQuestionSource] = useState<"focus" | "unavailable" | null>(() => caseSnapshotState(initialSnapshot)?.questionSource ?? null);
const [caseStatus, setCaseStatus] = useState<RectificationCaseStatus | null>(() => caseSnapshotState(initialSnapshot)?.caseStatus ?? null);
@@ -672,7 +667,6 @@ export function RectificationAgenticChat(props: RectificationAgenticChatProps) {
setCurrentQuestion(nextQuestion);
setQuestionSource(questionSourceFromSnapshot(payload.question_source));
setChoiceCard(nextChoice);
setStepState(parseRectificationStepState(payload.step_state));
setCaseStatus(nextCaseStatus);
setNextUserActionId(nextActionId || null);
setCaseSnapshotLoaded(true);
@@ -1772,13 +1766,8 @@ export function RectificationAgenticChat(props: RectificationAgenticChatProps) {
<span className="rectification-adopt-status__hint"></span>
</div>
)}
<div className="rectification-composer-meta">
{stepState ? (
<p className="rectification-step-state" role="status">
{stepState.headline} {stepState.reason} {stepState.next}
</p>
) : null}
{currentQuestion?.kind === "collect_spoken" && !readonly && !busy && (
{currentQuestion?.kind === "collect_spoken" && !readonly && !busy && (
<div className="rectification-composer-meta">
<button
type="button"
className="rectification-collect-stop"
@@ -1786,8 +1775,8 @@ export function RectificationAgenticChat(props: RectificationAgenticChatProps) {
>
{CHOICE_STOP_LABEL}
</button>
)}
</div>
</div>
)}
<ChatComposer
inputRef={composer}
value={draft}