Harden pasted Scattermind thread handoffs
This commit is contained in:
@@ -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.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.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.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;
|
return looksLikeBridgePayload ? parsed : null;
|
||||||
} catch {
|
} catch {
|
||||||
|
|||||||
@@ -1254,6 +1254,33 @@ try {
|
|||||||
assert.equal(threadsFallback.handoff.readiness.status, 'ready');
|
assert.equal(threadsFallback.handoff.readiness.status, 'ready');
|
||||||
assert.deepEqual(threadsFallback.handoff.warnings, []);
|
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`, {
|
const questionsFallbackResponse = await fetch(`${base}/api/rank-feedback`, {
|
||||||
method: 'POST',
|
method: 'POST',
|
||||||
headers: { 'Content-Type': 'application/json' },
|
headers: { 'Content-Type': 'application/json' },
|
||||||
|
|||||||
@@ -539,6 +539,7 @@ function looksLikeRankPayload(value = {}) {
|
|||||||
|| value.ranker_handoff
|
|| value.ranker_handoff
|
||||||
|| value.rankReady
|
|| value.rankReady
|
||||||
|| value.rank_ready
|
|| value.rank_ready
|
||||||
|
|| value.bridge
|
||||||
|| value.bridgePayload
|
|| value.bridgePayload
|
||||||
|| value.bridge_payload
|
|| value.bridge_payload
|
||||||
|| value.snapshot
|
|| value.snapshot
|
||||||
@@ -556,6 +557,10 @@ function looksLikeRankPayload(value = {}) {
|
|||||||
|| value.snapshot_title
|
|| value.snapshot_title
|
||||||
|| value.originalPrompt
|
|| value.originalPrompt
|
||||||
|| value.original_prompt
|
|| value.original_prompt
|
||||||
|
|| value.sourceSummary
|
||||||
|
|| value.source_summary
|
||||||
|
|| value.opening_reflection
|
||||||
|
|| value.restated_idea
|
||||||
|| value.ideaText
|
|| value.ideaText
|
||||||
|| value.idea_text
|
|| value.idea_text
|
||||||
|| Array.isArray(value.features)
|
|| Array.isArray(value.features)
|
||||||
@@ -588,6 +593,14 @@ function looksLikeRankPayload(value = {}) {
|
|||||||
|| Array.isArray(value.parking_lot)
|
|| Array.isArray(value.parking_lot)
|
||||||
|| Array.isArray(value.setAside)
|
|| Array.isArray(value.setAside)
|
||||||
|| Array.isArray(value.set_aside)
|
|| 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)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user