Accept soft Scattermind action fields

This commit is contained in:
OpenClaw Bot
2026-05-27 20:02:51 +02:00
parent 9c35af237f
commit 46846cada7
3 changed files with 64 additions and 12 deletions
+42
View File
@@ -238,6 +238,48 @@ try {
assert.equal(snakeDecisionContext.buildOrder.doFirst[0], 'copyable-slice');
assert.equal(snakeDecisionContext.handoff.readiness.status, 'ready');
const softActionObjectResponse = await fetch(`${base}/api/rank-feedback`, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
rankerBridge: {
sourceName: 'Scattermind',
artifactId: 'concept_map_soft_action_objects',
snapshotTitle: 'Soft action object handoff',
originalPrompt: 'Clarify a practical continuation without forcing software-feature field names.',
context: 'Solo builder. Avoid account dashboards before manual proof.',
nextActions: [
{
id: 'manual-proof-text-item',
text: 'Run one manual paid-style teardown from the Concept Map',
why_it_matters: 'This proves the continuation value before any app surface.',
evidence_to_collect: 'Will one tired builder act from the teardown without another explanation?',
first_proof_step: 'Send the teardown to one real builder and ask what they would do first.',
green_flag: 'They can name the next move and why it wins.',
red_flag: 'They ask for a dashboard instead of acting on the decision.',
},
{
id: 'saved-account-dashboard',
content: 'Saved account dashboard for every Concept Map',
evidence_to_collect: 'Would users want this later?',
ranker_hints: { value: 10, effort: 1, confidence: 9, urgency: 9, risk: 1 },
},
],
},
}),
});
assert.equal(softActionObjectResponse.status, 200);
const softActionObject = await softActionObjectResponse.json();
assert.equal(softActionObject.input.provenance.artifactId, 'concept_map_soft_action_objects');
assert.equal(softActionObject.buildOrder.doFirst[0], 'manual-proof-text-item');
assert.equal(softActionObject.ranked.find(item => item.id === 'manual-proof-text-item').title, 'Run one manual paid-style teardown from the Concept Map');
assert.match(softActionObject.ranked.find(item => item.id === 'manual-proof-text-item').factors.evidenceNeeded, /tired builder/);
assert.match(softActionObject.handoff.activeSlice.proof.nextStep, /Send the teardown/);
assert.match(softActionObject.handoff.activeSlice.proof.successSignal, /next move/);
assert.match(softActionObject.handoff.activeSlice.proof.killSignal, /dashboard/);
assert.equal(softActionObject.ranked.find(item => item.id === 'saved-account-dashboard').lane.source, 'source-non-goal');
assert.equal(softActionObject.handoff.readiness.status, 'ready');
const threadGuardrailResponse = await fetch(`${base}/api/rank-feedback`, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },