Extract flat Scattermind guardrails
This commit is contained in:
@@ -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),
|
||||
};
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user