Skip to content
wiki.fftac.org

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,