Handle pasted Scattermind payload wrappers

This commit is contained in:
OpenClaw Bot
2026-05-27 20:36:51 +02:00
parent a66788e394
commit ce3885d406
2 changed files with 70 additions and 6 deletions
+36
View File
@@ -2153,6 +2153,42 @@ try {
assert.equal(stringifiedRankerInput.handoff.readiness.status, 'ready');
assert.deepEqual(stringifiedRankerInput.handoff.warnings, []);
const proseWrappedPayloadEnvelopeResponse = await fetch(`${base}/api/rank-feedback`, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
idea: `Here is the Scattermind handoff I copied from the reading page:\n\n${JSON.stringify({
payload: {
sourceName: 'Scattermind',
reference_code: 'SM-PROSE-PAYLOAD-NEXT-STEPS-1',
working_name: 'Prose-wrapped payload bridge',
ideaText: 'A tired user pasted a wrapper payload with next_steps instead of a pristine Ranker object.',
context: 'Manual proof first. Avoid saved workspace dashboards before one source-traced action works.',
next_steps: [
{ id: 'payload-next-step-active', action: 'Payload source-traced build-order active slice', why: 'Turn the payload-wrapped Scattermind handoff into one defended build order with provenance.', evidence_needed: 'Can a payload-wrapped next_steps export still produce one Do first action?', suggested_lane: 'do-first', source_item_id: 'payload-next-step-1', source_title: 'Payload next steps', ranker_hints: { value: 10, effort: 1, confidence: 9, urgency: 9, risk: 1 } },
{ id: 'payload-next-step-copy', action: 'Payload next-step copy brief', evidence_needed: 'Does the copied result keep source trace?', suggested_lane: 'validate-next', source_item_id: 'payload-next-step-2', source_title: 'Payload next steps' },
],
parking_lot: [
{ id: 'payload-next-step-dashboard', action: 'Payload next-step dashboard', evidence_needed: 'Not before proof.', source_item_id: 'payload-next-step-3', source_title: 'Payload next steps' },
],
},
})}`,
mode: 'mvp',
}),
});
assert.equal(proseWrappedPayloadEnvelopeResponse.status, 200);
const proseWrappedPayloadEnvelope = await proseWrappedPayloadEnvelopeResponse.json();
assert.equal(proseWrappedPayloadEnvelope.input.embeddedPayloadSource, 'idea');
assert.equal(proseWrappedPayloadEnvelope.input.provenance.artifactId, 'SM-PROSE-PAYLOAD-NEXT-STEPS-1');
assert.equal(proseWrappedPayloadEnvelope.input.provenance.snapshotTitle, 'Prose-wrapped payload bridge');
assert.equal(proseWrappedPayloadEnvelope.input.optionCount, 3);
assert.equal(proseWrappedPayloadEnvelope.ranked[0].id, 'payload-next-step-active');
assert.equal(proseWrappedPayloadEnvelope.ranked[0].provenance.sourceSection, 'nextActions');
assert.ok(['do', 'test'].includes(proseWrappedPayloadEnvelope.ranked.find(item => item.id === 'payload-next-step-copy').lane.id));
assert.equal(proseWrappedPayloadEnvelope.ranked.find(item => item.id === 'payload-next-step-dashboard').lane.id, 'park');
assert.equal(proseWrappedPayloadEnvelope.handoff.readiness.status, 'ready');
assert.deepEqual(proseWrappedPayloadEnvelope.handoff.warnings, []);
const gameRouteGuardrailResponse = await fetch(`${base}/api/rank-feedback`, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },