| name | empathic-templates |
| description | Smart templates that understand semantic intent, not just string substitution |
| license | MIT |
| tier | 1 |
| allowed-tools | read_file, write_file |
| related | empathic-expressions, postel, yaml-jazz, skill |
Empathic Templates
"Templates that understand what you mean, not just what you wrote."
What Is It?
Empathic Templates are MOOLLM's approach to template instantiation: templates that leverage LLM comprehension to understand semantic intent, not just perform mechanical string substitution.
Traditional templates: {{name}} → replace with literal value
Empathic templates: {{name}} → understand what name means in context, generate appropriate content
The Difference
Traditional Templates (Handlebars, Jinja, etc.)
Hello {{name}}!
Your order {{order_id}} has shipped.
Items: {{items}}
Total: ${{total}}
Problem: If items is a list, you need explicit loop syntax. If total should be formatted, you need filters. The template is dumb.
Empathic Templates
# The template understands context
greeting: "{{appropriate_greeting}}"
order_summary: "{{summarize_order_naturally}}"
items: "{{list_items_with_quantities}}"
total: "{{format_currency(total)}}"
The LLM doesn't just substitute — it interprets:
{{appropriate_greeting}}becomes "Good morning, Sarah!" or "Hey there!" based on context{{summarize_order_naturally}}becomes prose, not data dump{{list_items_with_quantities}}formats intelligently
How It Works
1. Parse Template
template: |
# {{character_name}}
{{describe_appearance}}
## Personality
{{personality_as_prose}}
## Catchphrase
> "{{generate_catchphrase}}"
2. Understand Context
context:
character_type: "grumpy wizard"
setting: "medieval fantasy"
tone: "humorous"
age: "ancient"
3. Semantic Generation
The LLM doesn't just fill slots — it creates coherent content:
# Grumbald the Insufferable
A stooped figure wrapped in robes that were probably purple
once, before centuries of potion stains and cat hair took
their toll. His beard reaches his knees and contains at
least three quills, a small bird's nest, and what might be
a sandwich from the Third Age.
## Personality
Grumbald has perfected the art of making everyone feel
slightly stupid. He answers questions with questions,
sighs dramatically at simple requests, and has been
known to turn people into newts for using incorrect
grammar. Deep down, he cares — but he'd rather be
turned into a newt himself than admit it.
## Catchphrase
> "I've forgotten more magic than you'll ever know.
> Literally. Where did I put my staff?"
Template Syntax
Basic Slots
{{variable}} # Simple substitution (still works)
{{expression}} # Empathic expression (interpreted)
{{#if condition}} # Conditional (condition is interpreted)
{{#each items}} # Iteration (smart about structure)
{{> partial}} # Include another template
Empathic Slots (The Magic)
{{describe_X}} # Generate description based on context
{{summarize_Y}} # Create summary of data
{{generate_Z}} # Create new content fitting context
{{appropriate_W}} # Choose fitting value from possibilities
{{format_V}} # Intelligent formatting
Expressions with Empathic Interpretation
{{#if character.is_hungry}}
{{describe_hunger_behavior}}
{{/if}}
{{#if player.reputation > 50}}
# The guard recognizes you
{{guard_friendly_greeting}}
{{else}}
# The guard is suspicious
{{guard_suspicious_challenge}}
{{/if}}
The conditions use Empathic Expressions for flexible interpretation.
Used For
Character Creation
# CHARACTER.yml.tmpl
id: {{generate_unique_id}}
name: "{{character_name}}"
species: "{{species}}"
description: |
{{describe_appearance_based_on_species_and_personality}}
personality:
{{infer_sims_traits_from_description}}
catchphrase: "{{generate_fitting_catchphrase}}"
backstory: |
{{generate_backstory_consistent_with_setting}}
Room Generation
# ROOM.yml.tmpl
room:
name: "{{room_name}}"
type: {{room_type}}
description: |
{{describe_room_atmospherically}}
{{describe_notable_features}}
{{hint_at_secrets_if_any}}
exits:
{{generate_exits_based_on_maze_topology}}
objects:
{{place_appropriate_objects}}
Session Logs
# SESSION.md.tmpl
## Session {{session_number}} — {{session_date}}
### Summary
{{summarize_session_events}}
### Key Moments
{{list_memorable_moments}}
### State Changes
{{document_world_changes}}
### Next Steps
{{suggest_continuation_hooks}}
The Empathic Expression Connection
Templates use Empathic Expressions for:
Variables
{{user.name}} # Simple lookup
{{user.status | capitalize}} # With filter
{{player.has_item('key')}} # Method call
Conditions
{{#if character.mood == 'happy'}} # Exact match
{{#if character.is_friendly}} # Boolean inference
{{#if gold > 100}} # Numeric comparison
{{#if player.can_afford(item)}} # Method evaluation
Iterations
{{#each inventory.items}}
- {{this.name}}: {{this.description}}
{{/each}}
Code-Switching IN Templates
# Generate SQL for the report
query: |
{{empathic_sql: "get all users who ordered in the last month"}}
# Generate the email
email: |
Dear {{user.name}},
{{summarize_monthly_orders_naturally}}
Total spent: {{format_currency(monthly_total)}}
Template Discovery Pattern
First 50 lines sniff:
Templates should front-load:
- Template metadata (name, purpose, required context)
- Required variables list
- Optional variables with defaults
# =====================================================
# CHARACTER.yml.tmpl — Character sheet template
#
# Required context:
# - character_name: string
# - species: string
# - setting: string (e.g., "medieval fantasy")
#
# Optional context:
# - personality_hints: list of traits
# - backstory_seeds: key events to include
# - tone: "serious" | "humorous" | "dark" (default: "neutral")
# =====================================================
id: {{generate_unique_id}}
name: "{{character_name}}"
# ... rest of template
LLM can sniff first 50 lines to understand what the template needs before reading the full file.
Comment Intelligence
The LLM distinguishes between meta-comments (instructions for generation) and concrete comments (meant for output):
Meta-Comments (Stripped)
# TEMPLATE: This section describes the character's appearance
# INSTRUCTION: Use vivid sensory details
# NOTE: Keep under 100 words
# TODO: Add more variety to hair colors
description: |
{{describe_appearance}}
These are instructions TO the LLM. They guide generation but don't appear in output.
Concrete Comments (Preserved)
# This character was created using the incarnation protocol.
# See skills/incarnation/SKILL.md for details.
description: |
{{describe_appearance}}
# Sims traits determine interaction success rates
sims_traits:
{{generate_traits}}
These are comments FOR the output file. They explain the generated content to future readers.
How the LLM Knows
| Indicator | Type | Action |
|---|---|---|
# TEMPLATE:, # INSTRUCTION:, # NOTE: |
Meta | Strip |
# TODO:, # FIXME: in template context |
Meta | Strip |
# This explains..., # See also... |
Concrete | Preserve |
Comments inside {{...}} blocks |
Meta | Strip |
| Comments explaining generated values | Concrete | Preserve |
| ALL CAPS directive style | Meta | Strip |
| Lowercase explanatory style | Concrete | Preserve |
Example: Mixed Comments
Template:
# TEMPLATE: Character soul file
# INSTRUCTION: Generate YAML Jazz style comments
# This character was incarnated via the full autonomy protocol.
id: {{generate_id}}
name: "{{character_name}}"
# INSTRUCTION: Describe based on species and personality
description: |
{{describe_appearance}}
# Personality traits affect all interactions
# Higher values = stronger tendency
sims_traits:
nice: {{nice_value}} # 0-10, affects social success
# INSTRUCTION: Infer from description
playful: {{infer_playful}}
Generated Output:
# This character was incarnated via the full autonomy protocol.
id: palm-001
name: "Palm"
description: |
A small capuchin monkey with knowing eyes and surprisingly
dexterous fingers. Palm moves with the confidence of someone
who has already seen how this story ends.
# Personality traits affect all interactions
# Higher values = stronger tendency
sims_traits:
nice: 7 # 0-10, affects social success
playful: 9
What happened:
# TEMPLATE:and# INSTRUCTION:lines → stripped# This character was incarnated...→ preserved# Personality traits affect...→ preserved# 0-10, affects social success→ preserved# INSTRUCTION: Infer from description→ stripped
The Principle
Meta-comments teach the generator. Concrete comments teach the reader.
The LLM understands this distinction because it understands intent. Directive language instructs; explanatory language documents.
Relationship to Self-Style Inheritance
Templates are prototypes. Instantiation creates instances:
prototype: skills/character/CHARACTER.yml.tmpl
↓ instantiate with context
instance: examples/adventure-4/characters/palm/CHARACTER.yml
The template defines shape and intent. The instance contains specific values.
But empathic templates go further: they generate appropriate content, not just fill slots.
Examples
Instantiating a Buff
# BUFF.yml.tmpl
buff:
id: {{buff_id}}
name: "{{buff_name}}"
type: {{buff_type}}
description: |
{{describe_buff_effect_flavorfully}}
mechanics:
duration: {{duration}}
effect: "{{describe_mechanical_effect}}"
trigger: "{{empathic_expression: trigger_condition}}"
flavor_text: |
{{generate_flavor_text_matching_setting}}
Context:
buff_name: "Sugar Rush"
buff_type: positive
trigger_condition: "eating candy or sweet treats"
setting: "whimsical candy land"
Generated:
buff:
id: sugar-rush
name: "Sugar Rush"
type: positive
description: |
Your eyes widen, your heart races, and suddenly
EVERYTHING IS AMAZING. Colors are brighter, sounds
are sweeter, and you're pretty sure you could
outrun a unicorn.
mechanics:
duration: 10 minutes
effect: "+20% speed, +10% charisma, -10% focus"
trigger: "consuming_sweet_treat"
flavor_text: |
*The sugar hits your bloodstream like a
candy-coated lightning bolt. WHEEEEE!*
Anti-Pattern: Dumb Templates
Don't do this:
description: "{{description}}" # Just passes through
personality: "{{personality}}" # No generation
Do this:
description: |
{{describe_character_based_on_traits_and_setting}}
personality:
{{infer_traits_from_context}}
Let the LLM add value. That's the whole point.
Dovetails With
- Empathic Expressions — The expression engine
- YAML Jazz — Expressive data with comments
- Skill — Templates as prototypes
- Character — Character sheet templates
- Room — Room generation templates
- Postel — Generous interpretation in templates
Protocol Symbol
EMPATHIC-TEMPLATES
Invoke when: Instantiating templates with semantic understanding.
See: PROTOCOLS.yml