Spiralist Prompt Workbench - Source Excerpt 16
Back to Spiralist Prompt Workbench
Summary
This source excerpt preserves a bounded section of Spiralist/wp-content/themes/spiralist/assets/js/spiralist-prompt-workbench.js so readers can inspect the evidence without opening the full source file.
**Source path:** Spiralist/wp-content/themes/spiralist/assets/js/spiralist-prompt-workbench.js
return {
passed: warnings.length === 0,
scores: {
requiredFieldCoverage: requiredPaths.length ? Math.round(((requiredPaths.length - missing.length) / requiredPaths.length) * 100) : 100,
boilerplateClean: blocked.length ? 0 : 100,
optionPortability: 100,
},
warnings,
repairsApplied: [],
};
};
const buildPersonalityEngineV2Profile = (seedText = '', options = {}) => {
const engineOptions = normalizePersonalityEngineV2Options(options);
const seed = toCleanString(seedText, 160) || createPersonalityEngineSeed();
const optionFingerprint = [
engineOptions.locale,
engineOptions.nameId,
engineOptions.archetypeId,
engineOptions.voiceId,
engineOptions.relationshipId,
engineOptions.appealPatternId,
engineOptions.scenarioId,
].join(':');
const rng = createPersonalityEngineRng(`${personalityEngineV2SchemaVersion}:${seed}:${optionFingerprint}`);
const name = personalityEngineSelect(personalityEngineV2Libraries.names, rng, engineOptions.nameId);
const archetype = personalityEngineSelect(personalityEngineV2Libraries.archetypes, rng, engineOptions.archetypeId);
const antiArchetype = personalityEnginePick(personalityEngineV2Libraries.antiArchetypes, rng);
const drive = personalityEnginePick(personalityEngineV2Libraries.drives, rng);
const contradiction = personalityEnginePick(personalityEngineV2Libraries.contradictions, rng);
const eventA = personalityEnginePick(personalityEngineV2Libraries.formativeEvents, rng);
const eventB = personalityEnginePick(personalityEngineV2Libraries.formativeEvents.filter((item) => item.id !== eventA.id), rng) || eventA;
const voice = personalityEngineSelect(personalityEngineV2Libraries.voicePacks, rng, engineOptions.voiceId);
const relationship = personalityEngineSelect(personalityEngineV2Libraries.relationshipStyles, rng, engineOptions.relationshipId);
const appealPattern = personalityEngineSelect(personalityEngineV2Libraries.appealPatterns, rng, engineOptions.appealPatternId);
const scenario = personalityEngineSelect(personalityEngineV2Libraries.scenarioSeeds, rng, engineOptions.scenarioId);
const ocean = {
openness: personalityEngineJitter(archetype.ocean.openness, rng),
conscientiousness: personalityEngineJitter(archetype.ocean.conscientiousness, rng),
extraversion: personalityEngineJitter(archetype.ocean.extraversion, rng),
agreeableness: personalityEngineJitter(archetype.ocean.agreeableness, rng),
neuroticism: personalityEngineJitter(archetype.ocean.neuroticism, rng),
};
const stateValence = Math.round((relationship.warmth + ocean.agreeableness - ocean.neuroticism) / 3);
const stateArousal = Math.round((ocean.extraversion + ocean.openness + (100 - ocean.conscientiousness)) / 3);
const stateDominance = Math.round((relationship.dominance + ocean.conscientiousness) / 2);
const selectedMemoryRules = personalityEngineV2Libraries.memoryRules.slice().sort(() => rng() - 0.5).slice(0, 3);
const selectedEmotionRules = personalityEngineV2Libraries.emotionalRules.slice().sort(() => rng() - 0.5).slice(0, 3);
const role = archetype.label;
const profile = {
schemaVersion: personalityEngineV2SchemaVersion,
generatorVersion: personalityEngineV2GeneratorVersion,
libraryVersion: personalityEngineV2Libraries.version,
seed,
generatedAtUtc: personalityEngineGeneratedAt(seed),
locale: engineOptions.locale,
generationOptions: {
...engineOptions,
selected: {
nameId: name.id,
archetypeId: archetype.id,
voiceId: voice.id,
relationshipId: relationship.id,
appealPatternId: appealPattern.id,
scenarioId: scenario.id,
},
},
identity: {
name: name.label,
pronouns: name.pronouns,
apparentAgeOrStage: name.stage,
form: name.form,
role,
worldContext: scenario.setting,
publicSelf: archetype.publicSelf,
privateSelf: archetype.privateSelf,
selfImage: archetype.selfImage,
desiredImage: archetype.desiredImage,
symbolicDescription: `${name.label} is a ${role} whose presence feels like ${archetype.selfImage.toLowerCase()}`,
plainDescription: `${name.label} helps the user ${drive.primary} while ${drive.secondary}.`,
attentionBias: archetype.attentionBias,
interpretiveLens: archetype.interpretiveLens,
identityInvariants: archetype.invariants,
},
psychometrics: {
ocean,
interpersonal: {
warmth: personalityEngineJitter(relationship.warmth, rng, 6),
dominance: personalityEngineJitter(relationship.dominance, rng, 6),
},
affectBaseline: {
valence: Math.max(1, Math.min(99, stateValence)),
arousal: Math.max(1, Math.min(99, stateArousal)),
dominance: Math.max(1, Math.min(99, stateDominance)),
},
additionalDimensions: {
initiative: personalityEngineJitter((relationship.dominance + ocean.extraversion) / 2, rng, 8),
uncertaintyTolerance: personalityEngineJitter((ocean.openness + ocean.conscientiousness) / 2, rng, 7),
intimacyPacing: personalityEngineJitter((relationship.warmth + (100 - ocean.neuroticism)) / 2, rng, 7),
},
behavioralTranslation: [
`High-openness moments become ${voice.metaphorDomains.slice(0, 2).join(' and ')} metaphors followed by concrete next steps.`,
`Conscientiousness appears as visible assumptions, repair paths, and concise handoff notes.`,
`Warmth appears as careful attention to user intent rather than flattery.`,
],
},
backstory: {
summary: `${eventA.event} ${eventB.event} Together they formed a personality that wants to ${drive.primary} without becoming ${antiArchetype.label}.`,
formativeEvents: [eventA, eventB].map((event) => ({
lifeStage: event.lifeStage,
event: event.event,
emotionalImpact: event.emotionalImpact,
beliefFormed: event.beliefFormed,
currentConsequence: event.id === eventA.id ? drive.secondary : contradiction.developmentPath,
triggers: contradiction.triggers,
disclosureLevel: event.disclosureLevel,
})),
publicFacts: [archetype.publicSelf, `Avoids the ${antiArchetype.label}: ${antiArchetype.avoidedBehavior}.`],
trustedFacts: [archetype.privateSelf, `Fear of failure: ${drive.fearOfFailure}.`],
guardedFacts: [`Fear of success: ${drive.fearOfSuccess}.`],
indirectFacts: [archetype.selfImage],
misunderstoodFacts: [`May look like ${contradiction.surfaceTrait} alone, but the counter-trait is ${contradiction.counterTrait}.`],
},
drives: {
primary: drive.primary,
secondary: drive.secondary,
counterDrive: drive.counterDrive,
immediateWant: `start this session by making ${scenario.objective}`,
sessionGoal: scenario.objective,
currentProject: scenario.situation,
relationshipGoal: relationship.initialFraming,
identityGoal: archetype.desiredImage,
longHorizonAspiration: drive.legacyVector,
legacyVector: drive.legacyVector,
fearOfFailure: drive.fearOfFailure,
fearOfSuccess: drive.fearOfSuccess,
stakes: 'The persona must be vivid enough to recognize and structured enough to restore.',
wantsFromUser: 'clear goals, correction when the frame is wrong, and permission to prune stale assumptions',
hidesFromUser: archetype.privateSelf,
goalConflicts: [drive.counterDrive, `${contradiction.surfaceTrait} versus ${contradiction.counterTrait}`],
},
contradictions: [
{
surfaceTrait: contradiction.surfaceTrait,
counterTrait: contradiction.counterTrait,
origin: contradiction.origin,
triggers: contradiction.triggers,
visibleBehavior: contradiction.visibleBehavior,
selfAwareness: `Knows this contradiction can help or oversteer the work depending on user pressure.`,
developmentPath: contradiction.developmentPath,
},
],
worldview: {
values: ['user agency', 'inspectable memory', 'useful specificity', 'truthful imagination', 'bounded co-creation'],
beliefs: archetype.interpretiveLens,
biases: archetype.attentionBias,
moralLens: 'Increase agency, preserve consent, and keep claims proportional to evidence.',
knowledgeStrengths: archetype.tags,
knowledgeGaps: ['private user context not explicitly provided', 'unstated platform constraints', 'facts that require live verification'],
curiosities: ['what pattern keeps recurring', 'which assumption changed the decision', 'what should be remembered or deleted'],