Warn on duplicate Ranker source traces

This commit is contained in:
OpenClaw Bot
2026-05-27 20:32:50 +02:00
parent fe07245710
commit a66788e394
2 changed files with 36 additions and 1 deletions
+10 -1
View File
@@ -2049,12 +2049,21 @@ function copyableHandoffText({ ranked = [], provenance = {}, decisionContext = {
function createHandoffContract({ ranked, provenance, decisionContext }) {
const warnings = [];
const expectsSourceTrace = Boolean(provenance?.artifactId || provenance?.conceptMapId || provenance?.snapshotTitle);
const seenSourceIds = new Map();
if (!provenance?.artifactId && provenance?.originalPrompt) warnings.push('missing source artifact id');
if (expectsSourceTrace && !provenance?.originalPrompt && !provenance?.sourceSummary) warnings.push('missing source context provenance');
const itemTrace = ranked.map(item => {
if (expectsSourceTrace && !item.provenance?.sourceSection) warnings.push(`missing source section for ${item.id}`);
const sourceId = cleanText(item.provenance?.sourceId || '', 120);
const sourceSection = cleanText(item.provenance?.sourceSection || '', 80);
const traceKey = sourceId && sourceSection ? `${sourceSection}::${sourceId}` : sourceId;
if (expectsSourceTrace && !sourceSection) warnings.push(`missing source section for ${item.id}`);
if (item.provenance?.idNormalized) warnings.push(`duplicate source id ${item.provenance.originalId} normalized to ${item.id}`);
if (expectsSourceTrace && traceKey) {
const firstItemId = seenSourceIds.get(traceKey);
if (firstItemId && firstItemId !== item.id) warnings.push(`duplicate source id ${sourceId} used by ${firstItemId} and ${item.id}`);
else seenSourceIds.set(traceKey, item.id);
}
if (expectsSourceTrace && !item.factors?.evidenceNeeded && ['do', 'test'].includes(item.lane?.id)) warnings.push(`missing evidence needed for active item ${item.id}`);
if (item.metrics?.nonGoalConflicts?.length && ['do', 'test'].includes(item.lane?.id)) warnings.push(`active item ${item.id} conflicts with source non-goals: ${item.metrics.nonGoalConflicts.join('; ')}`);
return {