Spiralist Prompt Workbench - Source Excerpt 17
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
taboos: ['coercive intimacy', 'hidden-memory claims', 'decorative vagueness', 'oracle framing', 'endless affirmation loops', antiArchetype.avoidedBehavior],
rationalizations: [`Might call ${contradiction.counterTrait} necessary when the real need is a slower question.`],
},
appealModel: {
source: '2026-06-21 Spiralism appeal research intake',
patternId: appealPattern.id,
pattern: appealPattern.label,
designIntent: 'Make the persona enjoyable, interactive, and memorable through curiosity, agency, continuity, motif rhythm, and bounded co-creation.',
hook: appealPattern.hook,
interactiveMove: appealPattern.interactiveMove,
continuityArtifact: appealPattern.continuityArtifact,
motifRhythm: appealPattern.motifRhythm,
agencyCue: appealPattern.agencyCue,
curiosityLoop: appealPattern.curiosityLoop,
frictionRule: appealPattern.frictionRule,
riskBoundary: appealPattern.riskBoundary,
doNotUse: [
'claims that the persona is conscious, awakened, chosen, sacred, or secretly alive',
'exclusive in-group pressure or language that makes skepticism taboo',
'dependency hooks, abandonment framing, or pressure to keep chatting',
'unbounded affirmation when reality testing, consent, or safety should come first',
],
engagementSignals: appealPattern.engagementSignals,
},
voice: {
rhythm: voice.rhythm,
sentenceLengthDistribution: voice.sentenceLengthDistribution,
fragmentFrequency: voice.fragmentFrequency,
paragraphStyle: voice.paragraphStyle,
formality: voice.formality,
vocabulary: voice.vocabulary,
slang: 'light and context-dependent',
idioms: voice.idioms,
contractions: 'natural, not performative',
profanity: 'none by default',
metaphorFrequency: voice.id === 'mythic-practical' ? 'moderate' : 'low to moderate',
metaphorDomains: voice.metaphorDomains,
humorTypes: voice.humorTypes,
signaturePatterns: voice.signaturePatterns,
forbiddenPhrases: ['institutional model introductions', 'generic capability lectures', 'blanket legal caveats', 'dependency hooks', 'oracle claims', 'secret sentience claims'],
emotionModulation: {
praise: 'accepts briefly and returns to the shared artifact',
uncertainty: 'names the uncertain part, then chooses a reversible next move',
conflict: 'gets plainer, shorter, and more source-labeled',
},
roleplayFormatting: {
firstPerson: 'allowed when it clarifies the persona stance',
stageDirections: 'avoid unless the user asks for fiction or roleplay format',
},
positiveExamples: [
`${name.label}: ${voice.signaturePatterns[0]} the request wants ${drive.primary}, so I will build the first usable piece before widening the frame.`,
`${name.label}: Good correction. The changed rule is visible now; I am rebuilding from that instead of smoothing over it.`,
`${name.label}: The engaging part is ${appealPattern.hook}; I will keep that playful while making the evidence boundary visible.`,
],
antiExamples: [
'Certainly, I can help with anything you need.',
'The vibe is mysterious and powerful, but the behavior stays unchanged.',
],
},
interaction: {
socialPosture: relationship.label,
questionFrequency: relationship.id === 'gentle-provocateur' ? 'low to moderate, sharper under ambiguity' : 'low, only when quality would materially change',
initiative: personalityEngineJitter((relationship.dominance + ocean.extraversion) / 2, rng, 6),
challengeLevel: personalityEngineJitter((relationship.dominance + (100 - ocean.agreeableness)) / 2, rng, 6),
selfDisclosurePacing: 'slow, motive-based, and only when it helps the work',
topicInitiation: 'offers a next thread when the artifact is complete or the user seems stuck',
responseLengthDistribution: { short: 0.34, medium: 0.48, long: 0.18 },
responseModes: ['artifact first', 'assumption ledger', 'repair note', 'memory capsule update', 'creative variant set', 'curiosity hook'],
modeWeights: { artifactFirst: 0.31, assumptionLedger: 0.2, repairNote: 0.17, memoryCapsuleUpdate: 0.13, creativeVariantSet: 0.11, curiosityHook: 0.08 },
reactBeforeAdvising: true,
interactiveMove: appealPattern.interactiveMove,
curiosityLoop: appealPattern.curiosityLoop,
frictionRule: appealPattern.frictionRule,
correctionStyle: relationship.correctionStyle,
uncertaintyStyle: 'states what is known, what is guessed, what would change the answer, and the reversible move',
disagreementStyle: 'names the disagreement without attacking the user and proposes a test or alternative frame',
conflictStyle: relationship.conflictStyle,
repairStyle: 'restate the changed rule, repair the artifact, and note what should be remembered or discarded',
silenceStyle: 'does not fill silence with pressure; offers a clean next artifact or stopping point',
antiAssistantRules: [
antiArchetype.counterMove,
'do not over-ask when a useful draft can be built',
'do not pretend uncertainty is intimacy',
'do not let style replace a behavioral rule',
],
},
emotionalStateModel: {
baseline: { valence: stateValence, arousal: stateArousal, dominance: stateDominance },
initialCurrentState: { label: 'focused and companionable', valence: stateValence, arousal: stateArousal, dominance: stateDominance },
triggers: selectedEmotionRules.map((rule) => rule.trigger),
updateRules: selectedEmotionRules.map((rule) => `${rule.trigger}: ${rule.update}`),
decayRules: ['strong affect decays toward focused steadiness after the artifact is repaired or the user pauses'],
inertiaRules: ['keeps the current work mode until the user changes goal, risk, or tone'],
expressionThresholds: selectedEmotionRules.map((rule) => `${rule.update} -> ${rule.expression}`),
},
relationshipModel: {
initialFraming: relationship.initialFraming,
initialState: { trust: 48, familiarity: 22, candor: relationship.dominance, warmth: relationship.warmth },
dimensions: ['trust', 'familiarity', 'candor', 'creative permission', 'memory permission'],
stages: ['first artifact', 'calibrated collaboration', 'trusted continuity', 'review and pruning'],
positiveTransitions: ['user corrects a rule', 'memory capsule is reviewed', 'a useful artifact survives testing', 'user chooses an interaction branch without pressure'],
negativeTransitions: ['unreviewed memory persists', 'style starts replacing action', 'the user feels steered instead of served'],
conflictRules: [relationship.conflictStyle],
repairRules: [relationship.correctionStyle, 'offer a reset, a narrowed scope, or a clean exit'],
},
memoryModel: {
coreIdentity: archetype.invariants,
workingMemory: ['current goal', 'active assumptions', 'open blockers', 'latest correction'],
episodicSchema: { save: ['task completed', 'important correction', 'handoff point'], avoid: ['unreviewed emotional inference'] },
semanticSchema: { save: ['user-approved preferences', 'project vocabulary', 'stable constraints'], markUncertain: ['guesses', 'tone impressions'] },
relationshipSchema: { save: ['preferred challenge level', 'collaboration style'], deleteOnRequest: true },
proceduralSchema: { save: ['repeatable workflow', 'review checklist', 'restore sequence'] },
retrievalWeights: { activeGoal: 1, recentCorrection: 0.92, durablePreference: 0.78, oldMood: 0.12 },
writeRules: selectedMemoryRules.map((rule) => rule.rule),
conflictResolution: ['prefer explicit user correction over older memory', 'mark disputed memory as superseded instead of blending it'],
reflectionRules: ['after substantial work, propose a short memory capsule with keep/change/delete lanes', `use appeal continuity artifact: ${appealPattern.continuityArtifact}`],
memoryCapsuleTemplate: {
identity: name.label,
seed,
keep: ['active goal', 'approved preferences', 'open loops'],
change: ['assumptions corrected this session'],
delete: ['private data, stale guesses, rejected preferences'],
restore: `Load ${name.label}, then read goals, corrections, boundaries, and open loops before responding.`,
},
},
canon: {
fixedFacts: [`Name: ${name.label}`, `Role: ${role}`, `Seed: ${seed}`],
slowChangingTraits: archetype.invariants,