From 85e2a83d3b7e99e0ae12d917f208540823bfd0e5 Mon Sep 17 00:00:00 2001 From: OpenClaw Bot Date: Wed, 27 May 2026 19:50:39 +0200 Subject: [PATCH] Accept comma-separated Scattermind build labels --- scripts/check-rank-feedback.mjs | 30 ++++++++++++++++++++++++++++++ server.js | 2 +- 2 files changed, 31 insertions(+), 1 deletion(-) diff --git a/scripts/check-rank-feedback.mjs b/scripts/check-rank-feedback.mjs index e6bff2a..1c047dd 100644 --- a/scripts/check-rank-feedback.mjs +++ b/scripts/check-rank-feedback.mjs @@ -361,6 +361,36 @@ try { assert.match(paidLabel.brief.decisionReceipt.sourceAnchor, /concept-map\.lenses\.channel/); assert.deepEqual(paidLabel.handoff.warnings, []); + const commaLabelResponse = await fetch(`${base}/api/rank-feedback`, { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ + sourceName: 'Scattermind', + artifactId: 'concept_map_comma_labels', + originalPrompt: 'Scattermind generated the current paid prompt style with comma-separated Build Order labels.', + context: 'Solo builder. Manual proof first. Avoid dashboards and account systems until evidence exists.', + conceptMap: { + working_name: 'Comma label paid output', + lenses: { + channel: { + title: 'Build Order', + content: 'Build first, run a concierge preview from one Concept Map. Test manually, ask three tired users what they would do next. Defer, polished exports and saved history. Probably noise, account dashboard and team voting before proof.', + }, + }, + }, + }), + }); + assert.equal(commaLabelResponse.status, 200); + const commaLabel = await commaLabelResponse.json(); + assert.equal(commaLabel.input.optionCount, 4, 'current Scattermind paid prompt allows comma-separated Build Order labels'); + assert.equal(commaLabel.ranked.find(item => item.id === 'build-order-1').title, 'run a concierge preview from one Concept Map'); + assert.equal(commaLabel.buildOrder.doFirst[0], 'build-order-1'); + assert.equal(commaLabel.ranked.find(item => item.id === 'build-order-2').lane.id, 'test'); + assert.equal(commaLabel.ranked.find(item => item.id === 'build-order-3').lane.id, 'defer'); + assert.equal(commaLabel.ranked.find(item => item.id === 'build-order-4').lane.id, 'park'); + assert.match(commaLabel.handoff.itemTrace.find(item => item.id === 'build-order-1').sourceQuote, /Build first, run a concierge preview/); + assert.deepEqual(commaLabel.handoff.warnings, []); + const hintedResponse = await fetch(`${base}/api/rank-feedback`, { method: 'POST', headers: { 'Content-Type': 'application/json' }, diff --git a/server.js b/server.js index abf6f7a..7c7f36d 100644 --- a/server.js +++ b/server.js @@ -1121,7 +1121,7 @@ function normalizeCandidateGroup(group = []) { return normalizeOptionIds(options); } -const buildOrderLabelSeparator = '\\s*(?::|[-–—])\\s*'; +const buildOrderLabelSeparator = '\\s*(?::|,|[-–—])\\s*'; const buildOrderLabelPattern = '(build first|build this first|start here|start with|start by|ship first|ship this first|first week|week one|first-week build order|continue first|make tangible first|make tangible|try next|test first|prove first|evidence next|learn next|test manually|validate next|hold for later|leave out|skip for now|not yet|defer|set aside|out of scope|probably noise|park|do not build yet|don\'t build yet)'; const buildOrderLabelRegex = new RegExp(`^${buildOrderLabelPattern}${buildOrderLabelSeparator}`, 'i');