Add rank feedback handoff contract

This commit is contained in:
OpenClaw Bot
2026-05-26 22:40:21 +02:00
parent 962fb3a46f
commit c6b3f2340d
3 changed files with 49 additions and 7 deletions
+37 -1
View File
@@ -571,6 +571,39 @@ function createDecisionBrief({ idea, context, mode, ranked, provenance }) {
};
}
function createHandoffContract({ ranked, provenance }) {
const warnings = [];
if (!provenance?.artifactId) warnings.push('missing source artifact id');
if (!provenance?.originalPrompt) warnings.push('missing original prompt provenance');
const itemTrace = ranked.map(item => {
if (!item.provenance?.sourceSection) warnings.push(`missing source section for ${item.id}`);
if (!item.factors?.evidenceNeeded && ['do', 'test'].includes(item.lane?.id)) warnings.push(`missing evidence needed for active item ${item.id}`);
return {
id: item.id,
title: item.title,
lane: item.lane?.id || 'defer',
sourceSection: item.provenance?.sourceSection || '',
sourceId: item.provenance?.sourceId || '',
evidenceNeeded: item.factors?.evidenceNeeded || '',
};
});
return {
schema: 'rank-feedback-result-v1',
source: {
schema: provenance?.schema || '',
source: provenance?.source || '',
artifactId: provenance?.artifactId || '',
snapshotTitle: provenance?.snapshotTitle || '',
conceptMapId: provenance?.conceptMapId || '',
hasOriginalPrompt: Boolean(provenance?.originalPrompt),
},
itemTrace,
warnings: [...new Set(warnings)],
};
}
app.post('/api/rank-feedback', (req, res) => {
const idea = cleanMultiline(req.body?.idea || '', 3000);
const context = cleanMultiline(req.body?.context || '', 3000);
@@ -591,12 +624,15 @@ app.post('/api/rank-feedback', (req, res) => {
concern: concernFor(rankedOption),
};
});
const brief = createDecisionBrief({ idea, context, mode, ranked: options, provenance });
const handoff = createHandoffContract({ ranked: options, provenance });
res.json({
ok: true,
mode: { id: modeId in judgementModes ? modeId : 'progress', label: mode.label },
input: { idea, context, optionCount: options.length, provenance },
ranked: options,
brief: createDecisionBrief({ idea, context, mode, ranked: options, provenance }),
brief,
handoff,
buildOrder: {
doFirst: options.filter(item => item.lane.id === 'do').map(item => item.id),
validateNext: options.filter(item => item.lane.id === 'test').map(item => item.id),