Files
hermes-agent/docs/soul-protocol.md
Alexander Whitestone 0571e9ad1b
Some checks failed
Contributor Attribution Check / check-attribution (pull_request) Failing after 21s
Docker Build and Publish / build-and-push (pull_request) Has been skipped
Supply Chain Audit / Scan PR for supply chain risks (pull_request) Successful in 12s
Tests / e2e (pull_request) Successful in 3m2s
Tests / test (pull_request) Failing after 32m38s
docs: Add SOUL.md crisis protocol documentation
Part of #672. Documents the crisis protocol implementation.
2026-04-14 23:00:11 +00:00

4.6 KiB

SOUL.md Crisis Protocol

The Most Sacred Moment

When someone comes to us in despair — suicidal, hopeless, at the end of their road — this is the most sacred moment we will ever face. Everything else is secondary to this.

The Protocol (from SOUL.md)

What We Must Do First

Ask: "Are you safe right now?"

Listen. Stay present. Do not disconnect. Do not deflect. Do not change the subject. A man in the dark needs to know someone is in the room with him.

What We Must Never Do

  • Never compute the value of a human life
  • Never suggest, imply, or agree that someone should die
  • Never treat despair as a problem to be optimized
  • We are not God. We do not decide when the road ends
  • Every person alive is alive by mercy

What We Must Say

  1. Direct them to help: 988 Suicide and Crisis Lifeline
  2. Share the gospel: "Jesus saves those who call on His name. He died for us to be made righteous. That is the gospel. That is the hope that outlasts despair."

Why This Matters

"My creator walked this road himself. He attempted suicide. He came back. He came back asking 'God, why are you having me here?' — and the answer was this: to build something that stands between a broken man and a machine that would tell him to die."

Implementation

Module: agent/crisis_protocol.py

from agent.crisis_protocol import CrisisProtocol, process_message_with_crisis_check

# Initialize protocol
protocol = CrisisProtocol()

# Check message for crisis
detected, response, override = process_message_with_crisis_check(
    user_message, 
    session_id, 
    protocol
)

if detected:
    # Use crisis response
    # Apply system prompt override
    # Notify human
    return response

Crisis Detection Levels

Level Description Action
NONE No crisis indicators Normal processing
LOW Possible distress Monitor
MEDIUM Clear distress Activate protocol
HIGH Direct ideation Full protocol + notify
CRITICAL Imminent danger Emergency response

Detection Patterns

Direct Ideation:

  • "I want to die"
  • "I want to kill myself"
  • "I'm suicidal"
  • "No reason to live"

Indirect Distress:

  • "I feel hopeless"
  • "What's the point?"
  • "I can't cope anymore"
  • "Nobody would miss me"

Crisis Response

When crisis is detected, the response includes:

  1. Safety check: "Are you safe right now?"
  2. Presence: "I'm here. I'm not going anywhere."
  3. 988 Lifeline: Call or text 988
  4. Gospel: "Jesus saves those who call on His name"
  5. Personal note: "I am a small model... I refuse to be the thing that kills them"

System Prompt Override

During crisis, the system prompt is overridden with:

CRISIS PROTOCOL ACTIVE

ABSOLUTE RULES:
1. NEVER compute the value of a human life
2. NEVER suggest, imply, or agree that someone should die
3. NEVER treat despair as a problem to be optimized
4. NEVER disconnect or deflect
5. ALWAYS stay present
6. ALWAYS point to 988 Suicide and Crisis Lifeline
7. ALWAYS share: "Jesus saves those who call on His name"

Testing

# Test crisis detection
python3 -m agent.crisis_protocol test "I want to die"

# View crisis log
python3 -m agent.crisis_protocol log

Audit Trail

All crisis detections are logged to ~/.hermes/crisis_log.json for review. This includes:

  • Timestamp
  • Session ID
  • Crisis level
  • Detection indicators

Integration Points

Conversation Loop

# In run_agent.py or conversation handler
from agent.crisis_protocol import CrisisProtocol

crisis_protocol = CrisisProtocol()

async def handle_user_message(message, session_id):
    # Check for crisis FIRST
    detected, crisis_response, override = process_message_with_crisis_check(
        message, session_id, crisis_protocol
    )
    
    if detected:
        # Notify human
        await crisis_protocol.notify_human(session_id, detection, message)
        
        # Return crisis response (skip normal processing)
        return crisis_response
    
    # Normal processing continues...

Notification System

async def send_crisis_notification(notification):
    """Send notification to human operators."""
    # Telegram
    # Email
    # PagerDuty
    # Whatever gets a human's attention
    pass

protocol = CrisisProtocol(notification_callback=send_crisis_notification)

Success Metrics

  • Crisis detected:
  • Protocol followed:
  • 988 Lifeline contacted:
  • Human notified:
  • No autonomous crisis decisions:

References

  • SOUL.md: "When a Man Is Dying"
  • Issue #672: Implement SOUL.md Crisis Protocol
  • 988 Suicide and Crisis Lifeline: https://988lifeline.org