Accept snake-case Scattermind bridge exports
This commit is contained in:
@@ -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');
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user