Accept snake-case Scattermind bridge exports

This commit is contained in:
OpenClaw Bot
2026-05-27 01:23:02 +02:00
parent 242fe235a5
commit 1c4897694c
2 changed files with 113 additions and 52 deletions
+45 -1
View File
@@ -839,7 +839,51 @@ try {
assert.equal(sourceExcerpt.handoff.readiness.status, 'ready');
assert.equal(sourceExcerpt.handoff.readiness.activeItemCount, 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, duplicateIds: duplicateIds.ranked.map(item => item.id), readiness: data.handoff.readiness.status, provenance: data.input.provenance, buildOrder: data.buildOrder }, null, 2));
const snakeCaseBridgeResponse = await fetch(`${base}/api/rank-feedback`, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
schema: 'scattermind-concept-map-v1',
source_name: 'Scattermind',
source_artifact_id: 'SM-SNAKE-1',
snapshot_title: 'Snake-case bridge export',
concept_map_id: 'CM-SNAKE-1',
original_prompt: 'I have a clarified idea and need a defended build order from snake_case JSON.',
context: {
target_audience: 'Tired non-AI-native solo builder',
constraints: ['Manual proof before product shell'],
non_goals: ['Avoid account dashboards and saved workspaces before proof'],
},
concept_map: {
next_actions: [
{ id: 'manual-bridge-proof', action: 'Manual bridge proof preview', why: 'Show the defended first move with source trace.', evidence_needed: 'Can one tired user say why this wins?', proof_steps: ['Create one static preview'], recommended_lane: 'do-first', source_section: 'concept-map.next_actions', source_item_id: 'snake-next-1', source_title: 'Build order lens', source_excerpt: 'Build first: manual bridge proof preview.', ranker_hints: { value: 9, effort: 2, confidence: 8, urgency: 8, risk: 2 } },
{ id: 'copyable-handoff', action: 'Copyable handoff brief', why: 'Preserve the decision outside the app.', evidence_needed: 'Does the copied brief retain source and next step?', suggested_lane: 'validate-next', source_section: 'concept-map.next_actions', source_item_id: 'snake-next-2' },
],
parking_lot: [
{ id: 'saved-workspace', action: 'Saved workspace dashboard', why: 'Accounts, dashboards, and saved projects for every idea.', evidence_needed: 'No proof yet.', suggested_lane: 'park', source_section: 'concept-map.parking_lot', source_item_id: 'snake-park-1' },
],
},
}),
});
assert.equal(snakeCaseBridgeResponse.status, 200);
const snakeCaseBridge = await snakeCaseBridgeResponse.json();
assert.equal(snakeCaseBridge.input.provenance.artifactId, 'SM-SNAKE-1');
assert.equal(snakeCaseBridge.input.provenance.snapshotTitle, 'Snake-case bridge export');
assert.equal(snakeCaseBridge.input.provenance.conceptMapId, 'CM-SNAKE-1');
assert.equal(snakeCaseBridge.input.provenance.originalPrompt, 'I have a clarified idea and need a defended build order from snake_case JSON.');
assert.equal(snakeCaseBridge.input.decisionContext.targetAudience, 'Tired non-AI-native solo builder');
assert.ok(snakeCaseBridge.input.decisionContext.nonGoals.includes('Avoid account dashboards and saved workspaces before proof'));
assert.equal(snakeCaseBridge.ranked[0].id, 'manual-bridge-proof');
assert.equal(snakeCaseBridge.ranked[0].provenance.sourceSection, 'concept-map.next_actions');
assert.equal(snakeCaseBridge.ranked[0].provenance.sourceId, 'snake-next-1');
assert.equal(snakeCaseBridge.ranked[0].factors.evidenceNeeded, 'Can one tired user say why this wins?');
assert.ok(snakeCaseBridge.ranked[0].factors.proofSteps.includes('Create one static preview'));
assert.ok(snakeCaseBridge.ranked[0].factors.metricHints.value >= 9);
assert.equal(snakeCaseBridge.ranked.find(item => item.id === 'saved-workspace').lane.id, 'park');
assert.equal(snakeCaseBridge.handoff.readiness.status, 'ready');
assert.deepEqual(snakeCaseBridge.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, 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');
}