Skip to content

feat: communication voice as a new fingerprint domain#49

Open
daveh-beep wants to merge 1 commit intoblock:mainfrom
daveh-beep:feat/communication-voice-domain
Open

feat: communication voice as a new fingerprint domain#49
daveh-beep wants to merge 1 commit intoblock:mainfrom
daveh-beep:feat/communication-voice-domain

Conversation

@daveh-beep
Copy link
Copy Markdown

Summary

Proposes extending Ghost's fingerprint format to support communication voice as a first-class domain, parallel to visual (palette/spacing/typography/surfaces).

Why

Ghost captures visual brand identity and detects when generated UI drifts from it. The same problem exists for generated copy — a brand's voice drifts when AI authors notifications, error messages, or any user-facing text without a structured quality bar. Ghost's architecture (fingerprint as contract, review for drift detection, verify for iteration, ack/adopt/diverge for remediation) already handles this. The only thing missing is the dimension set.

What's proposed

Four communication dimension blocks, parallel to the four visual blocks:

Visual Communication What it captures
palette tone formality, directness, warmth, agency, urgency (0–1 scales)
spacing structure sentence length, CTA placement, information order, paragraph density
typography register reading level, jargon tolerance, contractions, pronouns, voice
surfaces boundaries excluded phrases, required elements, constraints

A fingerprint can be visual-only, communication-only, or both. Domain detection is based on which dimension blocks are present.

Files added

  • docs/communication-voice.md — full domain spec with dimension definitions, embedding layout (20-dim), partition rules, and domain detection
  • packages/ghost-drift/src/skill-bundle/references/comms-review.md — review recipe adapted for copy drift detection
  • packages/ghost-drift/src/skill-bundle/references/comms-verify.md — generate → review → iterate loop for copy
  • packages/ghost-drift/src/skill-bundle/assets/comms-fingerprint.template.md — starter template with all comms dimensions

What's NOT included (next PR)

  • Schema changes to schema.ts (making visual dimensions optional so comms-only fingerprints validate)
  • Embedding computation for communication dimensions in compare.ts
  • Updates to SKILL.md to reference the new recipes

Design decisions

  • Same partition rule: frontmatter owns structured data, body owns prose. No duplication.
  • Same remediation: ack/adopt/diverge work unchanged for voice decisions
  • Same compare: ghost-drift compare computes distance over whichever dimensions both fingerprints share
  • Additive, not breaking: existing visual-only fingerprints are unaffected

Test plan

  • Review domain spec for completeness and consistency with existing format
  • Review recipes against existing review.md/verify.md for pattern consistency
  • Validate template against fingerprint format conventions
  • Confirm no existing tests break (no code changes in this PR)

🤖 Generated with Claude Code

Proposes extending the fingerprint format to support communication
voice alongside visual. Four new dimension blocks (tone, structure,
register, boundaries) parallel palette/spacing/typography/surfaces.

Adds:
- docs/communication-voice.md — domain spec with dimension definitions,
  embedding layout, and domain detection rules
- comms-review recipe — scan generated copy for voice drift
- comms-verify recipe — generate → review → iterate loop for copy
- comms-fingerprint.template.md — starter template

No code changes yet — this is the format proposal and skill recipes.
Schema changes (making visual dimensions optional so comms-only
fingerprints validate) would follow in a separate PR.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
@daveh-beep daveh-beep requested a review from nahiyankhan as a code owner April 22, 2026 18:47
@daveh-beep
Copy link
Copy Markdown
Author

On measuring distance between subjective descriptions

The hard question for comms fingerprints isn't whether two fingerprints differ — ghost-drift compare already does that with vector distance on structured dimensions. The hard question is: how do you measure distance between "warm" and "approachable" when both are subjective?

Ghost's visual side dodges this by grounding in numbers — #ff6600 is exactly 47 OKLCH units from #0066cc. Communication voice doesn't have that. "Formality: 0.3" is a human judgment, not a measurement.

Three layers to make subjective descriptions machine-comparable:

1. Ground subjective labels in observable behavior

"Warm" is subjective. "Uses contractions, second-person pronouns, sentences under 15 words, and acknowledges the reader's situation before stating the action" is measurable. The fingerprint's prose layer (# Character, # Signature) captures the subjective read. The structured layer (tone, register, boundaries) captures the observable signals that produce that read.

Distance between two fingerprints is computed on the structured layer, not the prose. If fingerprint A says formality: 0.3, contractions: yes, pronouns: second-person and fingerprint B says formality: 0.7, contractions: no, pronouns: brand-name, the distance is arithmetic. The subjective labels ("warm" vs "professional") are just human shorthand for the structured position.

2. Calibrate with objective results

Subjective descriptions are hypotheses. Objective results validate them. The fingerprint could track:

  • A/B test results: version A (fingerprint A's voice) vs version B → which had lower support escalation, higher task completion, better NPS
  • Readability scores: Flesch-Kincaid is a number. If the fingerprint says readingLevel: 8 and the generated copy scores 14, that's measurable drift with measurable impact
  • Behavioral signals: did the customer complete the CTA? Did they call support? Did they churn?

The fingerprint becomes a living document — subjective decisions get annotated with objective evidence over time. A decision that says "we chose action-first information order" gets grounded with "support tickets dropped 12% after switching from context-first."

This is the evidence field in Ghost decisions. Currently it holds visual evidence (hex codes, screenshots). For comms, it would hold outcome data.

3. Semantic embedding for the prose layer

Ghost already supports --semantic on compare, which uses an embedding model to interpret prose decisions. Two fingerprints might use different words for the same intention — "direct and unflinching" vs "blunt, no hedging." Cosine similarity on embeddings catches that.

The 20-dim structured vector handles the measurable distance. The semantic embedding handles the interpretive distance. Together they answer: "these two brands are 0.04 apart structurally but 0.31 apart in how they describe themselves — which means they execute similarly but think about it differently." That gap is where interesting design conversations live.

The split

Subjective language becomes machine-comparable when you split it into two layers — what you say the brand is (prose, embedded semantically) and what you do (structured dimensions, computed arithmetically). Distance between descriptions is cosine similarity. Distance between behaviors is vector math. The gap between the two is the most interesting measurement — it tells you where a brand's self-image doesn't match its output.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant