Harden pasted Scattermind thread handoffs

This commit is contained in:
OpenClaw Bot
2026-05-27 16:38:12 +02:00
parent 6a34916697
commit 2459d253e1
3 changed files with 42 additions and 0 deletions
+2
View File
@@ -73,6 +73,8 @@ function parsePastedJsonPayload(value) {
|| Array.isArray(parsed.validateNext) || Array.isArray(parsed.validate_next) || Array.isArray(parsed.evidenceNext) || Array.isArray(parsed.evidence_next) || Array.isArray(parsed.tryNext) || Array.isArray(parsed.try_next)
|| Array.isArray(parsed.deferred) || Array.isArray(parsed.holdForLater) || Array.isArray(parsed.hold_for_later)
|| Array.isArray(parsed.parkingLot) || Array.isArray(parsed.parking_lot) || Array.isArray(parsed.setAside) || Array.isArray(parsed.set_aside)
|| Array.isArray(parsed.threads_to_hold) || Array.isArray(parsed.threadsToHold) || Array.isArray(parsed.actionThreads) || Array.isArray(parsed.action_threads)
|| Array.isArray(parsed.questions_to_sit_with) || Array.isArray(parsed.questionsToSitWith) || Array.isArray(parsed.openQuestions) || Array.isArray(parsed.open_questions)
);
return looksLikeBridgePayload ? parsed : null;
} catch {
+27
View File
@@ -1254,6 +1254,33 @@ try {
assert.equal(threadsFallback.handoff.readiness.status, 'ready');
assert.deepEqual(threadsFallback.handoff.warnings, []);
const pastedThreadOnlyResponse = await fetch(`${base}/api/rank-feedback`, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
idea: `Scattermind export:\n\n\`\`\`json\n${JSON.stringify({
sourceSummary: 'A source-summary-only Concept Map paste with action threads and no explicit reference code.',
actionThreads: [
'Start with a manual source-summary proof for one tired user.',
'Validate whether the copied handoff tells the user what to do next.',
'Hold for later: polished export styling after comprehension proof.',
'Set aside: account dashboard with saved workspaces before proof.',
],
})}\n\`\`\``,
context: 'Avoid account dashboards and saved workspaces before manual proof.',
mode: 'mvp',
}),
});
assert.equal(pastedThreadOnlyResponse.status, 200);
const pastedThreadOnly = await pastedThreadOnlyResponse.json();
assert.equal(pastedThreadOnly.input.embeddedPayloadSource, 'idea');
assert.match(pastedThreadOnly.input.provenance.sourceSummary, /source-summary-only Concept Map/);
assert.equal(pastedThreadOnly.input.optionCount, 4);
assert.equal(pastedThreadOnly.ranked[0].id, 'action-thread-1');
assert.equal(pastedThreadOnly.ranked.find(item => item.id === 'action-thread-4').lane.id, 'park');
assert.equal(pastedThreadOnly.handoff.readiness.status, 'ready');
assert.deepEqual(pastedThreadOnly.handoff.warnings, []);
const questionsFallbackResponse = await fetch(`${base}/api/rank-feedback`, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
+13
View File
@@ -539,6 +539,7 @@ function looksLikeRankPayload(value = {}) {
|| value.ranker_handoff
|| value.rankReady
|| value.rank_ready
|| value.bridge
|| value.bridgePayload
|| value.bridge_payload
|| value.snapshot
@@ -556,6 +557,10 @@ function looksLikeRankPayload(value = {}) {
|| value.snapshot_title
|| value.originalPrompt
|| value.original_prompt
|| value.sourceSummary
|| value.source_summary
|| value.opening_reflection
|| value.restated_idea
|| value.ideaText
|| value.idea_text
|| Array.isArray(value.features)
@@ -588,6 +593,14 @@ function looksLikeRankPayload(value = {}) {
|| Array.isArray(value.parking_lot)
|| Array.isArray(value.setAside)
|| Array.isArray(value.set_aside)
|| Array.isArray(value.threads_to_hold)
|| Array.isArray(value.threadsToHold)
|| Array.isArray(value.actionThreads)
|| Array.isArray(value.action_threads)
|| Array.isArray(value.questions_to_sit_with)
|| Array.isArray(value.questionsToSitWith)
|| Array.isArray(value.openQuestions)
|| Array.isArray(value.open_questions)
);
}