diff --git a/components/reasoning-workspace.jsx b/components/reasoning-workspace.jsx index fe42985..c227b70 100644 --- a/components/reasoning-workspace.jsx +++ b/components/reasoning-workspace.jsx @@ -149,6 +149,20 @@ function FocusedQuestionBody({ // Without this guard, selecting a follow-up question would erase "Previously answered" + "Your response". const hasCompletedContext = processingStep !== "active" && Boolean(focused?.result); + // ── Source of completed context: latest canonical Contribution when follow-up is active ── + // After setFollowUpQuestion() mutates focused.question/answer, derive from the + // latest completed Contribution so the narrative remains correct. + const hasActiveFollowUp = hasCompletedContext && !hasAnswer + && (focused.result?.possibleFollowUpQuestions || []).some((q) => q === focused?.question); + const latestCompletedContrib = [...(focusedContributions || [])].reverse().find((c) => c?.question && c?.answer); + + const displayedCompletedQuestion = hasActiveFollowUp + ? (latestCompletedContrib?.question ?? focused?.question) + : focused?.question; + const displayedCompletedAnswer = hasActiveFollowUp + ? (latestCompletedContrib?.answer ?? focused?.answer ?? "") + : focused?.answer; + // ── Local correction state (FQB-owned, not propagated upward) ─ const [editingFindingId, setEditingFindingId] = useState(null); const [draft, setDraft] = useState(""); @@ -180,15 +194,15 @@ function FocusedQuestionBody({
{focused.question}
+{displayedCompletedQuestion}
{focused.answer}
+{displayedCompletedAnswer}
{formulateMsg}
) : null} - {focused?.question?.trim() && processingStep !== "active" && focused.status === "formulated" && !hasAnswer && ( + {focused?.question?.trim() && processingStep !== "active" && focused.status === "formulated" && !hasAnswer && !hasActiveFollowUp && (