Accept scalar Scattermind build order sections

This commit is contained in:
OpenClaw Bot
2026-05-27 20:44:53 +02:00
parent ce3885d406
commit 77b5395962
3 changed files with 47 additions and 3 deletions
+31 -1
View File
@@ -2189,6 +2189,36 @@ try {
assert.equal(proseWrappedPayloadEnvelope.handoff.readiness.status, 'ready');
assert.deepEqual(proseWrappedPayloadEnvelope.handoff.warnings, []);
const scalarBuildOrderSectionsResponse = await fetch(`${base}/api/rank-feedback`, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
sourceName: 'Scattermind',
referenceCode: 'SM-SCALAR-BUILD-ORDER-1',
working_name: 'Scalar Build Order Preview',
ideaText: 'Scattermind exported a reader-friendly build order where sections are strings and single objects, not arrays.',
context: 'Solo builder. Manual proof first. Avoid saved workspace dashboards before source-traced handoff proof.',
mode: 'mvp',
buildOrderPreview: {
continueFirst: 'Source-traced first-screen receipt',
evidenceNext: { id: 'scalar-evidence', action: 'Manual comprehension check', evidence_needed: 'Can one tired non-AI-native user explain why the first move wins?', source_item_id: 'scalar-evidence-1', source_title: 'Scalar Build Order Preview' },
holdForLater: { id: 'scalar-defer', action: 'Saved result workspace dashboard' },
setAside: { id: 'scalar-park', action: 'Billing and account admin before proof' },
},
}),
});
assert.equal(scalarBuildOrderSectionsResponse.status, 200);
const scalarBuildOrderSections = await scalarBuildOrderSectionsResponse.json();
assert.equal(scalarBuildOrderSections.input.optionCount, 4, 'string/object Build Order sections should normalize without Scattermind wrapping every section in arrays');
assert.equal(scalarBuildOrderSections.input.provenance.artifactId, 'SM-SCALAR-BUILD-ORDER-1');
assert.equal(scalarBuildOrderSections.ranked[0].id, 'feature-1');
assert.equal(scalarBuildOrderSections.ranked[0].provenance.sourceSection, 'buildOrderPreview.doFirst');
assert.equal(scalarBuildOrderSections.ranked.find(item => item.title === 'Manual comprehension check').lane.id, 'test');
assert.equal(scalarBuildOrderSections.ranked.find(item => item.title === 'Saved result workspace dashboard').lane.id, 'defer');
assert.equal(scalarBuildOrderSections.ranked.find(item => item.title === 'Billing and account admin before proof').lane.id, 'park');
assert.equal(scalarBuildOrderSections.handoff.readiness.status, 'needs-source-context');
assert.ok(scalarBuildOrderSections.handoff.warnings.includes('missing evidence needed for active item feature-1'));
const gameRouteGuardrailResponse = await fetch(`${base}/api/rank-feedback`, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
@@ -2223,7 +2253,7 @@ try {
assert.equal(gameRouteGuardrail.handoff.readiness.status, 'ready');
assert.deepEqual(gameRouteGuardrail.handoff.warnings, []);
console.log(JSON.stringify({ ok: true, top: data.ranked[0].id, hintedTop: hinted.ranked[0].id, actionTop: actions.ranked[0].id, nestedConceptTop: nestedConcept.ranked[0].id, nonGoalTop: nonGoal.ranked[0].id, structuredContextTop: structuredContext.ranked[0].id, lensOnlyTop: lensOnly.ranked[0].id, scattermindPaidShapeTop: scattermindPaidShape.ranked[0].id, mergedContextTop: mergedContext.ranked[0].id, embeddedJsonTop: embeddedJson.ranked[0].id, fencedJsonTop: fencedJson.ranked[0].id, embeddedSnapshotTop: embeddedSnapshot.ranked[0].id, sourceExcerptTop: sourceExcerpt.ranked[0].id, snakeCaseBridgeTop: snakeCaseBridge.ranked[0].id, nextStepsAliasTop: nextStepsAlias.ranked[0].id, summaryGuardrailTop: summaryGuardrail.ranked[0].id, bridgeEnvelopeTop: bridgeEnvelope.ranked[0].id, directEnvelopeSectionsTop: directEnvelopeSections.ranked[0].id, softDirectLaneAliasesTop: softDirectLaneAliases.ranked[0].id, threadsFallbackTop: threadsFallback.ranked[0].id, questionsFallbackTop: questionsFallback.ranked[0].id, freeSnapshotTop: freeSnapshot.ranked[0].id, storedScattermindRowTop: storedScattermindRow.ranked[0].id, candidateActionsAliasTop: candidateActionsAlias.ranked[0].id, rankReadyActionsEnvelopeTop: rankReadyActionsEnvelope.ranked[0].id, continuationEnvelopeTop: continuationEnvelope.ranked[0].id, buildOrderPreviewTop: buildOrderPreview.ranked[0].id, scattermindRoadmapLanguageTop: scattermindRoadmapLanguage.ranked[0].id, scattermindRoadmapLensOnlyTop: scattermindRoadmapLensOnly.ranked[0].id, stringifiedRankerInputTop: stringifiedRankerInput.ranked[0].id, gameRouteGuardrailTop: gameRouteGuardrail.ranked[0].id, duplicateIds: duplicateIds.ranked.map(item => item.id), readiness: data.handoff.readiness.status, provenance: data.input.provenance, buildOrder: data.buildOrder }, null, 2));
console.log(JSON.stringify({ ok: true, top: data.ranked[0].id, hintedTop: hinted.ranked[0].id, actionTop: actions.ranked[0].id, nestedConceptTop: nestedConcept.ranked[0].id, nonGoalTop: nonGoal.ranked[0].id, structuredContextTop: structuredContext.ranked[0].id, lensOnlyTop: lensOnly.ranked[0].id, scattermindPaidShapeTop: scattermindPaidShape.ranked[0].id, mergedContextTop: mergedContext.ranked[0].id, embeddedJsonTop: embeddedJson.ranked[0].id, fencedJsonTop: fencedJson.ranked[0].id, embeddedSnapshotTop: embeddedSnapshot.ranked[0].id, sourceExcerptTop: sourceExcerpt.ranked[0].id, snakeCaseBridgeTop: snakeCaseBridge.ranked[0].id, nextStepsAliasTop: nextStepsAlias.ranked[0].id, summaryGuardrailTop: summaryGuardrail.ranked[0].id, bridgeEnvelopeTop: bridgeEnvelope.ranked[0].id, directEnvelopeSectionsTop: directEnvelopeSections.ranked[0].id, softDirectLaneAliasesTop: softDirectLaneAliases.ranked[0].id, threadsFallbackTop: threadsFallback.ranked[0].id, questionsFallbackTop: questionsFallback.ranked[0].id, freeSnapshotTop: freeSnapshot.ranked[0].id, storedScattermindRowTop: storedScattermindRow.ranked[0].id, candidateActionsAliasTop: candidateActionsAlias.ranked[0].id, rankReadyActionsEnvelopeTop: rankReadyActionsEnvelope.ranked[0].id, continuationEnvelopeTop: continuationEnvelope.ranked[0].id, buildOrderPreviewTop: buildOrderPreview.ranked[0].id, scattermindRoadmapLanguageTop: scattermindRoadmapLanguage.ranked[0].id, scattermindRoadmapLensOnlyTop: scattermindRoadmapLensOnly.ranked[0].id, stringifiedRankerInputTop: stringifiedRankerInput.ranked[0].id, scalarBuildOrderSectionsTop: scalarBuildOrderSections.ranked[0].id, gameRouteGuardrailTop: gameRouteGuardrail.ranked[0].id, duplicateIds: duplicateIds.ranked.map(item => item.id), readiness: data.handoff.readiness.status, provenance: data.input.provenance, buildOrder: data.buildOrder }, null, 2));
} finally {
server.kill('SIGTERM');
}