SimHacker avatar

soul-chat

Everything is alive. Everything can speak.

作者 SimHacker|オープンソース

💬 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.