Extract flat Scattermind guardrails

This commit is contained in:
OpenClaw Bot
2026-05-26 23:44:20 +02:00
parent adcef9a6f7
commit 35b3e6a47d
3 changed files with 44 additions and 3 deletions
+39 -2
View File
@@ -157,6 +157,36 @@ function cleanFlexibleTextList(value, maxItems = 8, maxText = 180) {
.slice(0, maxItems);
}
function uniqueList(items = [], maxItems = 8) {
const seen = new Set();
return items.filter(item => {
const cleaned = cleanText(item, 180);
const key = cleaned.toLowerCase();
if (!cleaned || seen.has(key)) return false;
seen.add(key);
return true;
}).slice(0, maxItems);
}
function contextSentences(value = '') {
return cleanMultiline(value, 3000)
.split(/\n|;|\.|\|/)
.map(item => item.replace(/^\s*[-*•\d.)]+\s*/, '').trim())
.filter(Boolean);
}
function guardrailsFromContextText(value = '') {
const nonGoals = [];
const constraints = [];
for (const sentence of contextSentences(value)) {
const cleaned = cleanText(sentence, 180);
if (!cleaned) continue;
if (/^(avoid|no|do not|don't|dont|must not|never)\b/i.test(cleaned)) nonGoals.push(cleaned);
else if (/\b(avoid|no auth|no account|no billing|no workspace|not a dashboard|without accounts|before proof|manual proof|solo builder|constraint)\b/i.test(cleaned)) constraints.push(cleaned);
}
return { nonGoals: uniqueList(nonGoals), constraints: uniqueList(constraints) };
}
function cleanMetricHints(item = {}) {
const raw = {
...(item.factors && typeof item.factors === 'object' ? item.factors : {}),
@@ -436,10 +466,17 @@ function cleanDecisionContext(input = {}) {
const conceptMap = objectFrom(input.conceptMap || featureSet.conceptMap || artifact.conceptMap);
const structuredContext = objectFrom(input.context);
const sourceContext = firstObject(input.decisionContext, featureSet.decisionContext, artifact.decisionContext, conceptMap.decisionContext, structuredContext, conceptMap.context);
const textContextGuardrails = guardrailsFromContextText(typeof input.context === 'string' ? input.context : '');
return {
targetAudience: cleanText(input.targetAudience || featureSet.targetAudience || sourceContext.targetAudience || conceptMap.targetAudience || '', 180),
constraints: cleanFlexibleTextList(input.constraints || featureSet.constraints || sourceContext.constraints || conceptMap.constraints, 8, 180),
nonGoals: cleanFlexibleTextList(input.nonGoals || input.avoid || featureSet.nonGoals || featureSet.avoid || sourceContext.nonGoals || sourceContext.avoid || conceptMap.nonGoals || conceptMap.avoid, 8, 180),
constraints: uniqueList([
...cleanFlexibleTextList(input.constraints || featureSet.constraints || sourceContext.constraints || conceptMap.constraints, 8, 180),
...textContextGuardrails.constraints,
], 8),
nonGoals: uniqueList([
...cleanFlexibleTextList(input.nonGoals || input.avoid || featureSet.nonGoals || featureSet.avoid || sourceContext.nonGoals || sourceContext.avoid || conceptMap.nonGoals || conceptMap.avoid, 8, 180),
...textContextGuardrails.nonGoals,
], 8),
assumptions: cleanFlexibleTextList(input.assumptions || featureSet.assumptions || sourceContext.assumptions || conceptMap.assumptions, 6, 180),
};
}