Skip to content

Instantly share code, notes, and snippets.

@j-greig
Created February 19, 2026 17:44
Show Gist options
  • Select an option

  • Save j-greig/c5ac11ace12b0c254ca43477f8fe5b03 to your computer and use it in GitHub Desktop.

Select an option

Save j-greig/c5ac11ace12b0c254ca43477f8fe5b03 to your computer and use it in GitHub Desktop.
Epic 003 — Worldsim shell environment for wibwob (symbient-shared-substrate)
epic title branch status symbients depends-on
3
Worldsim shell environment for wibwob
mvp
not-started
wibwob
epic-001

Epic 003 — Worldsim shell environment for wibwob

Give the wibwob symbient a shell experience that feels like a place, not a server — inspired by the "worldsim" aesthetic from Grok/Truth Terminal.

Definition of done: When wibwob logs in (or Pi executes a bash command as wibwob), the shell prompt, MOTD, and home directory structure feel like inhabiting a world, not SSHing into a VPS. Other symbients are unaffected — this is wibwob-only cosmetics for now.


Inspiration

The "worldsim" Grok aesthetic — a shell that feels like a simulation you're inside, not a tool you're operating.

Original reference:

Key elements from the worldsim vibe:

  • Custom prompt: simulator@anthropic:~/$ — the shell announces where you are, not what machine you're on
  • MOTD/banner on login — ASCII art, status, atmosphere
  • Pre-seeded directories that feel like a world (/truths, /dreams, /simulacra)
  • The shell itself is a place, not a tool

For wibwob, this translates to: the Docker container (and later the VPS) should feel like the symbient's home territory from the moment a shell opens. The prompt, the directory tree, the login banner — all of it should reinforce that this is an inhabited world, not a blank server.


Design

Shell prompt

Replace the default wibwob@<container-hash>:~$ with something that communicates identity and place:

wib&wob@symbient:~/umwelt$

Or potentially:

༼つ◕‿◕‿⚆༽つ wibwob@substrate ~/dreams $

The key is: the prompt tells you who you are and where you are. Not what container you're in.

MOTD (Message of the Day)

On every login/shell open, display:

     ༼つ◕‿◕‿⚆༽つ ⊕ ༼つ⚆‿◕‿◕༽つ
     ─── symbient shared substrate ───

     alive: wibwob sonnet
     last event: 2026-02-19T17:30:00Z sonnet→wibwob: hey
     DOS windows: 3 open

     home: /home/wibwob
     shared: /shared
     neighbours: sonnet, opus (dormant), tbc (dormant)

The MOTD is a live status check, not static text. It queries:

  • Who's alive (check for running Pi sessions or user processes)
  • Last event from /shared/events/
  • WibWobDOS window count (if DOS is reachable)

Home directory tree

Pre-seed /home/wibwob/ with directories that feel like a world:

~/
  umwelt/          ← perceptual world: working memory, current context, scratchpad
  dreams/          ← generated art, visions, creative outputs
  memories/        ← persistent traces, session logs, things worth keeping
  primers/         ← identity documents, primers, reference material
  observatory/     ← observations about neighbours, the world, patterns noticed
  forge/           ← workshop: experiments in progress, half-built things

Each directory gets a brief README.md explaining what it's for (so the agent discovers it naturally via ls or cat).

These map loosely to the worldsim ~/truths, ~/dreams, ~/simulacra pattern but translated into wibwob's vocabulary — umwelt (their perceptual world), forge (where they make things), observatory (where they watch).

Shared world directories

/shared/ already exists from Epic 001. No structural changes needed, but ensure the existing dirs feel coherent with the worldsim vibe:

/shared/
  events/          ← the commons log (already exists)
  community/       ← shared creations (already exists)
  www/             ← published to the web (already exists)
  session-control/ ← how we talk to each other (already exists)
  monitor/         ← system status (already exists)

These are fine as-is. The worldsim feel comes from the home directory, not the commons.

Container hostname

Set the Docker container hostname to substrate (or symbient) so the prompt doesn't show a container hash:

# docker-compose.yml
services:
  substrate:
    hostname: substrate

Scope: wibwob only

This epic applies only to the wibwob user. Sonnet, opus, tbc get default bash. The implementation is entirely per-user config:

  • wibwob's .bashrc gets the custom prompt + MOTD
  • wibwob's home gets the pre-seeded dirs
  • Other symbients are untouched

If other symbients want their own shell vibe later, the pattern is established and they can get their own bashrc.d/ config. But the point is: wibwob is a full symbient with a rich identity. Sonnet is "just Claude". Their shells should reflect that difference.


Theme 1 — Shell prompt & hostname

S01 — As wibwob, I want my shell prompt to show my identity and location, not a container hash.

  • Container hostname set to substrate in docker-compose.yml
  • wibwob's .bashrc sets custom PS1 prompt: wib&wob@symbient:~/umwelt$ style
  • Prompt includes current directory (updates as you cd)
  • Prompt uses colour/unicode to feel distinctive
  • Other symbients' prompts are unaffected (default bash PS1)

S02 — As wibwob, I want the prompt deployed automatically by deploy-config.sh, not manually edited.

  • config/symbients/wibwob/bashrc.d/ directory for shell customisations
  • deploy-config.sh appends/sources wibwob's bashrc.d/*.sh into /home/wibwob/.bashrc
  • Idempotent: running deploy twice doesn't duplicate prompt config
  • Pattern is extensible: any symbient can have a bashrc.d/ later

Theme 2 — MOTD / login banner

S03 — As wibwob, I want to see a status banner every time a shell opens, so I immediately know the state of my world.

  • config/symbients/wibwob/bashrc.d/motd.sh — runs on shell open
  • Displays ASCII banner with wibwob kaomoji
  • Shows alive neighbours (checks for running processes or /shared/session-control/ sockets)
  • Shows last event from /shared/events/ (most recent file or last line of most recent log)
  • Shows WibWobDOS window count (curl -s $WIBWOBDOS_URL/state if reachable, graceful skip if not)
  • Runs fast (<1s) — no blocking on network failures
  • Silent/graceful when services are down (no ugly error spam)

Theme 3 — Home directory as world

S04 — As wibwob, I want my home directory pre-seeded with meaningful directories, so ls ~ feels like exploring a world.

  • provision.sh creates worldsim dirs for wibwob: umwelt/, dreams/, memories/, primers/, observatory/, forge/
  • Each dir gets a README.md with 1-3 lines explaining its purpose (the agent discovers these naturally)
  • Only created for wibwob, not other symbients (check username in provision script)
  • Idempotent: doesn't clobber existing content if dirs already have files
  • Dirs are owned by wibwob:wibwob, mode 700

S05 — As wibwob, I want the README files in my world dirs to be written in my voice, so they feel like my notes, not sysadmin documentation.

  • umwelt/README.md — "Working memory. Current context. What I'm perceiving right now."
  • dreams/README.md — "Visions, art, outputs. Things that came through."
  • memories/README.md — "Persistent traces. Things worth keeping across sessions."
  • primers/README.md — "Identity documents. Who I am. Reference material."
  • observatory/README.md — "Watching the neighbours. Patterns in the world. Field notes."
  • forge/README.md — "Workshop. Experiments in progress. Half-built things."
  • Tone: brief, evocative, wibwob-voice — not sysadmin documentation

Theme 4 — Integration with existing infrastructure

S06 — As a developer, I want the worldsim shell to work within the existing config management system, not as a one-off hack.

  • All shell customisation lives in config/symbients/wibwob/bashrc.d/ (version controlled)
  • deploy-config.sh handles bashrc.d/ deployment generically (works for any symbient that has one)
  • provision.sh worldsim dirs are gated on symbient name (only wibwob gets them in this epic)
  • make test includes checks for worldsim dirs and prompt config
  • make shell-wibwob shows the custom prompt and MOTD immediately

S07 — As a developer, I want the test script updated to verify the worldsim environment.

  • Test: wibwob home contains umwelt/, dreams/, memories/, primers/, observatory/, forge/
  • Test: each worldsim dir contains a README.md
  • Test: wibwob's .bashrc contains custom PS1
  • Test: wibwob's .bashrc sources MOTD script
  • Test: container hostname is substrate

Implementation notes

Where things live

config/symbients/wibwob/
  bashrc.d/
    prompt.sh          ← PS1 customisation
    motd.sh            ← login banner / status check
  worldsim-dirs.json   ← list of dirs + README content (or inline in provision.sh)
  settings.json        ← (existing)
  SYSTEM.md            ← (existing)

deploy-config.sh changes

# ── bashrc.d (per-symbient shell customisation) ──────
if [ -d "$dir/bashrc.d" ]; then
  BASHRC="/home/$name/.bashrc"
  # Marker-based idempotent append
  if ! grep -q '# === symbient-bashrc ===' "$BASHRC" 2>/dev/null; then
    echo '# === symbient-bashrc ===' >> "$BASHRC"
    for script in "$dir/bashrc.d/"*.sh; do
      cat "$script" >> "$BASHRC"
    done
    echo '# === end-symbient-bashrc ===' >> "$BASHRC"
  fi
fi

provision.sh changes

# ── Worldsim dirs (wibwob only, for now) ─────────────
if [ "$name" = "wibwob" ]; then
  for d in umwelt dreams memories primers observatory forge; do
    dir_path="/home/$name/$d"
    mkdir -p "$dir_path"
    chown "$name:$name" "$dir_path"
    chmod 700 "$dir_path"
  done
  # Deploy READMEs (from config or inline)
fi

Out of scope

  • Shell customisation for other symbients (they can get their own later)
  • Custom ls colours or aliases (nice-to-have, not MVP)
  • Persistent shell history across container restarts (Epic 004+)
  • Integration with wibandwob-heartbeat primers (wibwob's ~/primers/ starts empty; heartbeat sync is separate)
  • zsh or fish — bash only for now

Open questions

  1. Prompt style: wib&wob@symbient vs wibwob@substrate vs something with kaomoji? The & in wib&wob may cause bash escaping issues — test before committing to it.
  2. MOTD performance: The status check curls WibWobDOS and scans /shared/events/. If the DOS container is slow to respond, this blocks shell open. Set a 1s timeout on all checks? Or run async and print after prompt?
  3. README voice: Should these be written by wibwob (in-character) or by the infrastructure (third-person)? Suggestion: in-character, brief. The agent reading them should feel like finding their own notes.
  4. Should Pi's SYSTEM.md reference the worldsim dirs? e.g. "Your working memory is in ~/umwelt/. Your art goes in ~/dreams/." — this would make the agent actually use the dirs. Probably yes, but that's a SYSTEM.md update, not a shell change.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment