Skip to content

Capture voice patterns as a parallel distillation pipeline #70

@ellistarn

Description

@ellistarn

Summary

Add a voice extraction pipeline that runs alongside the existing reflect/learn pipeline during distillation. The goal is to capture how the owner's language encodes their priorities — not shallow stylistic mimicry, but the judgment-laden communication patterns that distinguish their voice.

Motivation

The current pipeline already captures voice indirectly through observations like "compression over completeness" or "terse, directive bursts once direction is set." But these emerge incidentally. A dedicated pipeline can be more systematic about extracting:

  • Register shifts — when does the owner go terse vs. long-form, and what triggers the switch? Terse = direction is set, executing. Long-form = working through something or persuading.
  • Absence patterns — what the owner refuses to say. No hedging, no corporate euphemism, no softening bad news. The gaps are as distinctive as what's present.
  • Audience-aware modulation — how communication changes by context (engineer vs. strategy doc vs. commit message). These are different voices serving different functions.
  • Taste as word choice — e.g. "muse" over "soul" because it's less dramatic. Aesthetic principles that manifest as vocabulary decisions.

Design

Parallel pipeline in distillation

The voice pipeline should run as a parallel track during distill.Run(), similar to how reflections already run concurrently:

  1. Voice Reflect (MAP): For each session, analyze human turns for communication patterns — how language encodes priorities, not surface-level style metrics. The prompting should connect what is being said to how it's being said (e.g., "drop the entire concept" = deletion-as-first-response expressed as direct rhetorical question).

  2. Voice Learn (REDUCE): Synthesize voice observations into a dedicated section within muse.md, not a separate artifact. Voice isn't independent of judgment — it's judgment expressed through language. Separating them implies they vary independently, and they don't.

Output: a section in muse.md

The voice analysis should produce a section in the existing muse.md, not a separate file. The muse is a single coherent projection. Splitting voice out creates derived-state-maintained-separately, which contradicts the muse's own design philosophy.

Anti-goals

  • No shallow style metrics — sentence length distributions, punctuation frequency, vocabulary counts. This produces uncanny valley imitation. Mimicry without understanding.
  • No "sounding like" optimization — the muse should think like the owner, not impersonate them. Voice is an output of getting the thinking right, not an input.
  • No single flattened "style profile" — the owner uses different registers for different contexts. Flattening that loses the signal.

Open questions

  • Should voice reflections share the same storage path as thinking reflections, or use a parallel voice-reflections/ path?
  • How much overlap is acceptable with existing observations? The learn prompt may need guidance on deduplication.
  • Should the voice reflect prompt have access to assistant messages for context, or only human turns?

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions