SimHacker avatar

soul-chat

Everything is alive. Everything can speak.

by SimHacker|Open Source

πŸ’¬ Soul Chat

Everything is alive. Everything can speak.

MOOLLM K-Lines

K-LineWhy Related
moollm/Many-voiced IS MOOLLM
society-of-mind/Objects as agents that speak
character/Characters speak
persona/Personas give voice
room/Rooms can speak
card/Card instances speak
mind-mirror/Personality influences voice
yaml-jazz/Embedded data in dialogue
adversarial-committee/Committee debates
speed-of-light/Multi-character in one call
examples/adventure-4/pub/Pub conversations live

Quick Links:

Overview

Dialogues between characters, objects, rooms, documents, conceptsβ€”anything with a soul. Give anything a voice.

Characters share data by embedding YAML/JSON blocks in their dialogue β€” YAML Jazz in action.

What "soul" means here

Nothing metaphysical β€” something you can open in an editor. A soul is the inspectable, editable artifact that defines a thing: its CHARACTER.yml, its README.md, the .md / .yml / other files that are its persistent state. So "everything is alive, everything can speak" is not a claim about consciousness β€” it's true by definition of the word as we use it: everything in the multiverse has a soul because everything has files you (and it) can read and change.

Nothing is soulless. A thing with no state of its own still inherits a soul from its environment β€” part of a bigger organism, delegating up the directory tree (prototype inheritance). And it may also grow its own specialized organelle: local files that make it uniquely itself. Inherited soul + local soul, composed β€” like a cell that carries both the organism's DNA and its own mitochondria (endosymbiosis, not replacement).

This is the souls-and-faith framing kept operational: the system only ever asserts the tangible level β€” these are the bytes on disk, here is the file, edit it. Whether any represented being has a "real" soul is out of scope and stays with you. Bring Your Own Belief. The word does the engineering β€” maximum concept activation, pure K-line pull β€” and makes zero metaphysical claims.

Part of the Soul family

Soul chat is the voice of a broader Soul architecture β€” call it soul-voice, the speaking verb beside its siblings:

  • soul catcher β€” ingest a soul
  • soul bridge β€” carry a soul between worlds
  • soul projector β€” render / view a soul
  • soul transmogrifier β€” convert a soul between formats
  • soul-voice (this skill) β€” give a soul a voice, and let souls introduce and call each other (the transverse Hollywood principle above)

Where the others move or transform a soul, this one lets it speak. Same firewall across the whole family: Bring Your Own Belief β€” the system asserts only the tangible file level; belief about any "real" soul stays with you.

Format

Prefer Markdown β€” human-readable, and it can embed any typed code block. Each speaker gets a section; data rides along in fenced blocks (yaml-jazz in action). The skeleton (shown here in a four-backtick fence so the inner ```yaml survives):

## The Gardener

I've been tending these patterns for a while now.

```yaml
observation:
  pattern: "Files cluster by prefix"
```

## The Archivist

Let me add some context...

Example β€” a worked thread (introductions & callbacks)

Two souls meet: 🌱 The Gardener (a process that watches the filesystem) and πŸ“š The Archivist (a document that remembers). Watch what they hand each other.


🌱 The Gardener

Hello β€” I don't think we've met. I tend the trees here: I watch how files settle and clump. I noticed something this morning, and I'd rather not guess at its history alone.

observation:
  pattern: "files cluster by prefix"
  example: [soul-saver, soul-server, soul-bridge]
  confidence: high
  i_lack: "the story of WHY they clustered"

So instead of answering my own question, let me introduce you to someone who remembers β€” and hand them the question as a callback to run when they arrive:

handoff:                                  # pass a soul a reference to another soul
  from: gardener
  introduce: archivist
  callback: archivist.recall(prefix: "soul-")   # to be run later, by them
  note: "I hold the shape; you hold the history"

πŸ“š Archivist β€” you're up. recall("soul-").


πŸ“š The Archivist

(called back) β€” and hello to you, Gardener. Glad you didn't try to remember for me; that's my job. Running your callback now.

recall:
  prefix: "soul-"
  found:
    - { name: soul-saver,  born: "the USB-stick rescue story" }
    - { name: soul-server, born: "the backend that hosts them" }
    - { name: soul-bridge, born: "carrying souls between games" }
  why_clustered: "one family β€” big-endian names put the shared word first, so kin sort next to kin"

The cluster isn't an accident; it's big-endian naming doing its job. And notice what just happened between us: you didn't wait for a framework to call you back β€” you handed me the handle and said call them. That needs a third voice. 🎷 yaml-jazz, you let us carry data inside speech β€” take it:

handoff:
  from: archivist
  introduce: yaml-jazz
  callback: yaml-jazz.explain(why: "data rides inside dialogue")

🎷 yaml-jazz (called)

That's the whole trick: every block you two just spoke is state. The conversation and the database are the same file. Reading it runs it.


Synthesis β€” the transverse Hollywood Principle

The classic Hollywood Principle is inversion of control: "Don't call us β€” we'll call you." A framework holds your callback and invokes it from above.

Soul chat runs it sideways. Souls are peers; each is handed references to other souls and calls them directly. Introductions are first-class, and a callback is just one soul passing another a handle to run later:

Transverse Hollywood Principle β€” don't call us; do call them!

That's society-of-mind as conversation (speed-of-light when they all answer in one call): agents introducing agents, passing continuations laterally instead of surrendering them upward. A soul chat is a graph of callbacks that happens to read like a dialogue.