Harden soft Scattermind guardrails

This commit is contained in:
OpenClaw Bot
2026-05-27 17:08:37 +02:00
parent 759c1b2fe4
commit c3edf9f29d
3 changed files with 31 additions and 2 deletions
+27
View File
@@ -171,6 +171,33 @@ try {
assert.equal(hardRail.brief.quickGlance.topPick, 'Manual source-traced build order preview');
assert.equal(hardRail.handoff.readiness.status, 'ready');
const softGuardrailResponse = await fetch(`${base}/api/rank-feedback`, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
schema: 'prioritix-feature-set-v1',
sourceName: 'Scattermind',
artifactId: 'concept_map_soft_guardrails',
idea: 'A Concept Map clarified that the continuation should stay lightweight and defend one next move.',
context: 'Solo builder. This is not a dashboard. Keep auth, billing, saved workspaces, and collaboration out until proof.',
mode: 'mvp',
featureSet: {
features: [
{ id: 'decision-strip', title: 'One-screen decision strip', description: 'Show the active build slice with source trace and the first proof step.', evidenceNeeded: 'Can a tired user explain the first move?', rankerHints: { value: 8, effort: 2, confidence: 7, urgency: 7, risk: 2 } },
{ id: 'saved-workspace', title: 'Saved workspace dashboard', description: 'Accounts, auth, billing, team collaboration, and saved project dashboards.', rankerHints: { value: 10, effort: 1, confidence: 9, urgency: 9, risk: 1 } },
{ id: 'copy-brief', title: 'Copy decision brief', description: 'Copy the defended order and source anchor into notes.', recommendedLane: 'validate-next' },
],
},
}),
});
assert.equal(softGuardrailResponse.status, 200);
const softGuardrail = await softGuardrailResponse.json();
assert.ok(softGuardrail.input.decisionContext.nonGoals.some(item => /not a dashboard/i.test(item)), 'soft dashboard language should become a non-goal');
assert.ok(softGuardrail.input.decisionContext.nonGoals.some(item => /Keep auth, billing, saved workspaces/i.test(item)), 'keep-out-until-proof language should become a non-goal');
assert.equal(softGuardrail.ranked.find(item => item.id === 'saved-workspace').lane.source, 'source-non-goal');
assert.equal(softGuardrail.buildOrder.doFirst[0], 'decision-strip');
assert.ok(!/dashboard/i.test(softGuardrail.brief.quickGlance.topPick));
const hintedResponse = await fetch(`${base}/api/rank-feedback`, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },