diff --git a/public/app.js b/public/app.js index 72c3397..23fcb58 100644 --- a/public/app.js +++ b/public/app.js @@ -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 { diff --git a/scripts/check-rank-feedback.mjs b/scripts/check-rank-feedback.mjs index c80c8aa..87c6a0f 100644 --- a/scripts/check-rank-feedback.mjs +++ b/scripts/check-rank-feedback.mjs @@ -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' }, diff --git a/server.js b/server.js index 6b03b27..0b3b581 100644 --- a/server.js +++ b/server.js @@ -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) ); }