Skip to content
wiki.fftac.org

Spiralist Prompt Workbench - Source Excerpt 42

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 filtered.join('\n').trim();
    };
    const getPersonaLabSettings = (button) => {
      const panel = button ? button.closest('[data-persona-lab-tuning]') : document.querySelector('[data-persona-lab-tuning]');
      const mode = getMode(selectedMode);
      const frameworkId = getPersonaLabField(panel, '[data-persona-lab-framework]', 'traits-first');
      const socialDynamicsId = getPersonaLabField(panel, '[data-persona-lab-social-dynamics]', 'none');
      const selectedRuntimeFitId = getPersonaLabField(panel, '[data-persona-lab-runtime]', 'universal');
      const runtimeFitId = personaLabRuntimeFits[selectedRuntimeFitId] ? selectedRuntimeFitId : 'universal';
      const selectedEngagementPatternId = getPersonaLabField(panel, '[data-persona-lab-engagement]', 'curiosity-ladder');
      const engagementPatternId = personaLabEngagementPatterns[selectedEngagementPatternId] ? selectedEngagementPatternId : 'curiosity-ladder';
      const framework = getPersonaLabFramework(frameworkId);
      const socialDynamics = getPersonaLabSocialDynamics(socialDynamicsId);
      const runtimeFit = getPersonaLabRuntimeFit(runtimeFitId);
      const engagementPattern = getPersonaLabEngagementPattern(engagementPatternId);

      return {
        mode: selectedMode,
        modeTitle: toCleanString(mode.title || mode.name, 160) || 'Portable Spiralist Prompt',
        warmth: getPersonaLabField(panel, '[data-persona-lab-warmth]', 'balanced'),
        directness: getPersonaLabScale(panel, '[data-persona-lab-directness]', 4),
        symbolicDensity: getPersonaLabScale(panel, '[data-persona-lab-symbolic]', 3),
        boundaryStrength: getPersonaLabScale(panel, '[data-persona-lab-boundary]', 5),
        memoryPolicy: getPersonaLabField(panel, '[data-persona-lab-memory]', 'explicit user-provided memory only'),
        outputContract: getPersonaLabField(panel, '[data-persona-lab-output]', 'role, scope, boundaries, response contract, first message'),
        engagementPatternId,
        engagementPatternLabel: engagementPattern.label,
        engagementPatternContext: engagementPattern.context,
        engagementPatternGuardrails: engagementPattern.guardrails,
        engagementPatternPackageNote: engagementPattern.packageNote,
        engagementPatternHook: engagementPattern.hook,
        engagementPatternInteractiveMove: engagementPattern.interactiveMove,
        engagementPatternContinuityArtifact: engagementPattern.continuityArtifact,
        engagementPatternMotifRhythm: engagementPattern.motifRhythm,
        engagementPatternAgencyCue: engagementPattern.agencyCue,
        engagementPatternCuriosityLoop: engagementPattern.curiosityLoop,
        engagementPatternFrictionRule: engagementPattern.frictionRule,
        engagementPatternRiskBoundary: engagementPattern.riskBoundary,
        engagementPatternSignals: engagementPattern.engagementSignals,
        frameworkId,
        frameworkLabel: framework.label,
        frameworkContext: framework.context,
        frameworkGuardrails: framework.guardrails,
        frameworkPackageNote: framework.packageNote,
        socialDynamicsId,
        socialDynamicsLabel: socialDynamics.label,
        socialDynamicsContext: socialDynamics.context,
        socialDynamicsGuardrails: socialDynamics.guardrails,
        socialDynamicsPackageNote: socialDynamics.packageNote,
        runtimeFitId,
        runtimeFitLabel: runtimeFit.label,
        runtimeFitContext: runtimeFit.context,
        runtimeFitGuardrails: runtimeFit.guardrails,
        runtimeFitPackageNote: runtimeFit.packageNote,
      };
    };
    const getPersonaLabExportFormat = (button) => {
      const panel = button ? button.closest('[data-persona-lab-tuning]') : document.querySelector('[data-persona-lab-tuning]');
      const format = getPersonaLabField(panel, '[data-persona-lab-export-format]', 'uaix').toLowerCase();
      return ['uaix', 'zip', 'txt', 'md'].includes(format) ? format : 'uaix';
    };
    const getPersonaLabStressSuiteId = (button) => {
      const panel = button ? button.closest('[data-persona-lab-tuning]') : document.querySelector('[data-persona-lab-tuning]');
      const suiteId = getPersonaLabField(panel, '[data-persona-lab-stress-select]', 'core');
      return getPersonaLabStressPreset(suiteId).id;
    };
    const getPersonaLabTranscriptSample = (node = null) => {
      const panel = node ? node.closest('[data-persona-lab-tuning]') : document.querySelector('[data-persona-lab-tuning]');
      const field = panel ? panel.querySelector('[data-persona-lab-transcript]') : null;
      return toCleanString(field instanceof HTMLTextAreaElement ? field.value : '', 24000);
    };
    const getPersonaLabPromptLineValue = (prompt, labels = [], fallback = '', maxLength = 260) => {
      const labelList = (Array.isArray(labels) ? labels : [labels])
        .map((label) => toCleanString(label, 80).toLowerCase())
        .filter(Boolean);
      const lines = toCleanString(prompt, 50000).split(/\r?\n/);

      for (const line of lines) {
        const normalized = toCleanString(line, 1200).replace(/^[-*]\s*/, '').trim();
        const separatorIndex = normalized.indexOf(':');
        if (separatorIndex <= 0) {
          continue;
        }

        const key = normalized.slice(0, separatorIndex).trim().toLowerCase();
        const value = normalized.slice(separatorIndex + 1).trim();
        if (labelList.includes(key) && value) {
          return toCleanString(value, maxLength);
        }
      }

      return toCleanString(fallback, maxLength);
    };
    const buildPersonaLabCompactHandoff = (prompt, settings = {}) => {
      const cleanPrompt = toCleanString(prompt, 50000);
      const title = extractPromptTitle(cleanPrompt, 'Spiralist AI Compact Persona Handoff');
      const state = getPromptState();
      const framework = getPersonaLabFramework(settings.frameworkId);
      const socialDynamics = getPersonaLabSocialDynamics(settings.socialDynamicsId);
      const engagement = getPersonaLabEngagementPattern(settings.engagementPatternId);
      const runtime = getPersonaLabRuntimeFit(settings.runtimeFitId);
      const frameworkLabel = toCleanString(settings.frameworkLabel, 180) || framework.label;
      const socialLabel = toCleanString(settings.socialDynamicsLabel, 180) || socialDynamics.label;
      const engagementLabel = toCleanString(settings.engagementPatternLabel, 180) || engagement.label;
      const runtimeLabel = toCleanString(settings.runtimeFitLabel, 180) || runtime.label;
      const memoryPolicy = getPersonaLabPromptLineValue(
        cleanPrompt,
        ['Memory policy'],
        settings.memoryPolicy || 'explicit user-provided memory only',
        260
      );
      const outputContract = getPersonaLabPromptLineValue(
        cleanPrompt,
        ['Use this output contract', 'Output contract'],
        settings.outputContract || 'role, scope, boundaries, response contract, first message',
        300
      );
      const purpose = getPersonaLabPromptLineValue(
        cleanPrompt,
        ['User goal', 'Purpose', 'Task'],
        toCleanString(state.task, 360) || 'help with a bounded, reviewable persona interaction',
        360
      );
      const tone = getPersonaLabPromptLineValue(
        cleanPrompt,
        ['Tone', 'Voice summary'],
        toCleanString(state.tone, 260) || 'clear, useful, bounded, and easy to revise',
        260
      );
      const efficiency = getPersonaLabEfficiencyState(cleanPrompt);