From 76d62d28622f2c46f79f874989dd077ca3ebe7ff Mon Sep 17 00:00:00 2001 From: OpenClaw Bot Date: Thu, 28 May 2026 17:05:12 +0200 Subject: [PATCH] Warm up first-screen proof script and headline for non-AI-native users MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - proofScriptFor: use plain language when no source artifact is present (no 'Scattermind' name-dropping for raw paste users). Source-aware script is preserved when artifact context exists. - firstScreen.headline: 'One thing now: [title]' replaces 'Build only this first: [title]' — simpler declarative for tired users. - proof script fallback now includes a 'what happens next' sentence so the user knows evidence changes the decision. - Updated check-rank-feedback.mjs headline assertion to match. --- scripts/check-rank-feedback.mjs | 2 +- server.js | 14 ++++++++------ 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/scripts/check-rank-feedback.mjs b/scripts/check-rank-feedback.mjs index 44b2629..c37ab84 100644 --- a/scripts/check-rank-feedback.mjs +++ b/scripts/check-rank-feedback.mjs @@ -81,7 +81,7 @@ try { assert.ok(data.ranked.find(item => item.id === 'bridge-contract').factors.metricHints.value === undefined); assert.equal(data.brief.source.artifactId, 'snapshot_123'); assert.equal(data.brief.decisionReceipt.activeMove, data.brief.quickGlance.topPick); - assert.match(data.brief.firstScreen.headline, /Build only this first/); + assert.match(data.brief.firstScreen.headline, /One thing now/); assert.equal(data.brief.firstScreen.primaryAction, data.brief.decisionReceipt.firstProofStep); assert.equal(data.brief.firstScreen.proofQuestion, data.brief.decisionReceipt.evidenceQuestion); assert.equal(data.brief.firstScreen.proofScript, data.brief.decisionReceipt.proofScript); diff --git a/server.js b/server.js index 3e42006..890a711 100644 --- a/server.js +++ b/server.js @@ -1860,14 +1860,16 @@ function evidenceQuestionFor(option) { function proofScriptFor(option, provenance = {}) { if (!option) return ''; - const sourceName = cleanText(provenance?.source || 'Scattermind', 60); + const sourceName = cleanText(provenance?.source || '', 60); const sourceLabel = cleanText(provenance?.snapshotTitle || provenance?.artifactId || '', 120); const evidence = evidenceQuestionFor(option); const next = nextStepFor(option); - const setup = sourceLabel - ? `I have a ${sourceName} build-order recommendation for “${sourceLabel}”.` - : 'I am checking the next build move before adding more scope.'; - return cleanText(`${setup} The proposed first move is “${option.title}”. ${next} The thing I need to learn is: ${evidence}`, 520); + const hasSource = Boolean(sourceLabel && sourceName); + if (hasSource) { + const setup = `I have a ${sourceName} build-order recommendation for "${sourceLabel}".`; + return cleanText(`${setup} The proposed first move is "${option.title}". ${next} The thing I need to learn is: ${evidence}`, 520); + } + return cleanText(`The first move I want to test is "${option.title}". ${next} The thing I need to learn is: ${evidence}. If that produces a clear signal, the next move changes. If not, I need a different first step.`, 520); } function nextStepFor(option) { @@ -1962,7 +1964,7 @@ function createDecisionBrief({ idea, context, mode, ranked, provenance, decision const activeSuccessSignal = carriedProofSignalFor(top, ranked, 'successSignal'); const activeKillSignal = carriedProofSignalFor(top, ranked, 'killSignal'); const firstScreen = top ? { - headline: `Build only this first: ${top.title}`, + headline: `One thing now: ${top.title}`, primaryAction: nextStepFor(top), proofQuestion: evidenceQuestionFor(top), proofScript: activeProofScript,