fix(confidence-engine): preserve investigation activity across turns

ThreadContributionsBadge, PriorContributionsSummary, and
SecondaryPreviousLearning all filtered contributions via
c.targetNodeId === nodeId. Multi-turn follow-up Contributions carry a
different immediate targetNodeId while the canonical origin remains on
Findings (originatingTargetNodeId).

Repaired: all contribution filters now match on EITHER
c.targetNodeId === nodeId || c.originatingTargetNodeId === nodeId.
handleDeconstructSubmit carries originatingTargetNodeId from
focusedPresentationItemId as provenance for cold-return recovery.
This commit is contained in:
2026-08-28 11:56:31 +01:00
parent b9a54589f0
commit 10cbcbdd05
3 changed files with 162 additions and 5 deletions
+11 -4
View File
@@ -471,7 +471,9 @@ function EvidenceLimitCard({ summary }) {
// ── Prior contribution summary (embedded within FocusedQuestionBody) ───
function PriorContributionsSummary({ nodeId, contributions }) {
const threadContribs = contributions.filter((c) => c.targetNodeId === nodeId);
const threadContribs = (contributions || []).filter(
(c) => c.targetNodeId === nodeId || c.originatingTargetNodeId === nodeId,
);
if (!threadContribs.length) return null;
// Exclude the most recent contribution — it is already shown as the current result above.
@@ -519,7 +521,9 @@ function PriorContributionsSummary({ nodeId, contributions }) {
// ── Standalone previous learning block (for two-column secondary placement) ───
function SecondaryPreviousLearning({ nodeId, contributions }) {
const threadContribs = contributions.filter((c) => c.targetNodeId === nodeId);
const threadContribs = (contributions || []).filter(
(c) => c.targetNodeId === nodeId || c.originatingTargetNodeId === nodeId,
);
if (!threadContribs.length) return null;
// Exclude the most recent contribution — it is already shown as the current result above.
@@ -567,7 +571,9 @@ function SecondaryPreviousLearning({ nodeId, contributions }) {
// ── Thread contributions badge (standalone — used outside focused body) ───
function ThreadContributionsBadge({ nodeId, contributions }) {
const threadContribs = contributions.filter((c) => c.targetNodeId === nodeId);
const threadContribs = (contributions || []).filter(
(c) => c.targetNodeId === nodeId || c.originatingTargetNodeId === nodeId,
);
if (!threadContribs.length) return null;
// Show most recent contribution summary inline
@@ -1401,7 +1407,7 @@ export default function ReasoningWorkspace({
if (!target) return;
const priorContribs = (focusedContributions || []).filter(
(c) => c.targetNodeId === target,
(c) => c.targetNodeId === target || c.originatingTargetNodeId === target,
);
setFocusedPresentationItemId(target);
@@ -1511,6 +1517,7 @@ export default function ReasoningWorkspace({
// Persist contribution to case-level owner (ScenarioForm)
onFocusedContribution?.({
targetNodeId,
originatingTargetNodeId: focusedPresentationItemId,
targetLabel: targetNode?.label || "",
targetDescription: targetNode?.description || "",
question: focused.question,