Accept laned Scattermind build order objects

This commit is contained in:
OpenClaw Bot
2026-05-27 00:24:02 +02:00
parent 4b3fb9e7d9
commit 428e9c337f
3 changed files with 76 additions and 14 deletions
+45
View File
@@ -506,6 +506,51 @@ try {
assert.equal(mergedContext.ranked.find(item => item.id === 'workspace-dashboard').lane.source, 'source-non-goal');
assert.deepEqual(mergedContext.handoff.warnings, []);
const objectBuildOrderResponse = await fetch(`${base}/api/rank-feedback`, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
sourceName: 'Scattermind',
artifactId: 'concept_map_object_build_order',
originalPrompt: 'Scattermind exported a Build Order object instead of nextActions arrays.',
idea: 'Ranker should accept an already-laned Build Order object and preserve lane provenance.',
mode: 'mvp',
conceptMap: {
snapshotTitle: 'Object Build Order bridge',
context: {
targetAudience: 'Tired local service seller',
constraints: ['Copyable output before accounts'],
nonGoals: ['Avoid saved workspace dashboard'],
},
buildOrder: {
doFirst: [
{ id: 'manual-offer-proof', move: 'Manual offer proof', why: 'Send one copyable offer to three real prospects.', questionToAnswer: 'Will one prospect ask for the next step?' },
],
validateNext: [
'Copyable follow-up script',
],
deferred: [
{ id: 'visual-refresh', title: 'Visual refresh after proof', evidenceQuestion: 'Does the rough brief work first?' },
],
parkingLot: [
{ id: 'workspace-dashboard', title: 'Saved workspace dashboard', description: 'Accounts, auth, and saved projects for every offer.', evidenceNeeded: 'No proof yet' },
],
},
},
}),
});
assert.equal(objectBuildOrderResponse.status, 200);
const objectBuildOrder = await objectBuildOrderResponse.json();
assert.equal(objectBuildOrder.input.optionCount, 4);
assert.equal(objectBuildOrder.ranked[0].id, 'manual-offer-proof');
assert.equal(objectBuildOrder.ranked[0].factors.evidenceNeeded, 'Will one prospect ask for the next step?');
assert.equal(objectBuildOrder.ranked.find(item => item.id === 'feature-1').title, 'Copyable follow-up script');
assert.equal(objectBuildOrder.ranked.find(item => item.id === 'feature-1').lane.id, 'test');
assert.equal(objectBuildOrder.handoff.itemTrace.find(item => item.id === 'feature-1').sourceSection, 'concept-map.buildOrder.validateNext');
assert.equal(objectBuildOrder.ranked.find(item => item.id === 'workspace-dashboard').lane.id, 'park');
assert.equal(objectBuildOrder.ranked.find(item => item.id === 'workspace-dashboard').lane.source, 'hint');
assert.ok(objectBuildOrder.handoff.warnings.includes('missing evidence needed for active item feature-1'));
const embeddedJsonResponse = await fetch(`${base}/api/rank-feedback`, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },